Choose sx, sx, and composeSx when authoring or reviewing Tonic UI Box-based components, including wrappers and headless-library prop getters.

MITAuto-check passedFrontend & Design

Install Tonic UI Sx

skills CLI
$ npx skills add trendmicro-frontend/tonic-ui --skill tonic-ui-sx -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install trendmicro-frontend/tonic-ui tonic-ui-sx --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/trendmicro-frontend/tonic-ui.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/tonic-ui-sx .claude/skills/tonic-ui-sx && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
tonic-ui-sx
GitHub stars
133
Token cost
~4k tokens
SKILL.md length
1,798 words
Files
3 (incl. references)
Skills in repo
5
Repo updated
First seen
Licence
MIT

At a glance

Choose sx, sx, and composeSx when authoring or reviewing Tonic UI Box-based components, including wrappers and headless-library prop getters.

  • Style precedence
  • SKILL.md covers When to Use, Current Integration Status, The one rule that governs… and The four channels of Box, plus 9 more sections
  • Instructions only: no scripts, shell commands, URLs or credentials in SKILL.md
  • Consumer overrides that do not apply

What it does

Tonic UI Sx is an agent skill from trendmicro-frontend/tonic-ui. Choose sx, sx, and composeSx when authoring or reviewing Tonic UI Box-based components, including wrappers and headless-library prop getters. Use for base styles, style precedence, consumer overrides that do not apply, or incoming sx overrides that are dropped.

Its SKILL.md is about 4k tokens, which your agent loads only when the skill is triggered. The skill folder holds 4 other files, including reference files (for example `evals/evals.json` and `references/composition-and-verification.md`).

It sits in Frontend & Design. It works with React. The repository describes itself as: Tonic UI is a UI component library for React, built with Emotion and Styled System. It is designed to be easy to use and easy to customize. The licence is MIT.

When your agent uses it

  • Style precedence
  • Consumer overrides that do not apply
  • Incoming sx overrides that are dropped

Example prompts

  • “/tonic-ui-sx”

What it can do on your machine

Read from SKILL.md and the folder at commit 7e7181f. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    No scripts in the folder and no shell commands in SKILL.md (its code samples are javascript).

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Tonic UI Sx loads about 4k tokens when it runs, and up to ~6.9k if it reads all its reference files. Until then it costs about 69 tokens; SKILL.md has 1,798 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~69
When it runs · the whole SKILL.md, loaded when a task matches
~4k
With references · SKILL.md plus every file in references/, read only if the agent opens them
~6.9k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from trendmicro-frontend/tonic-ui at commit 7e7181f, republished under its MIT licence (© trendmicro-frontend). 1,798 words, ~4,032 tokens.

Download SKILL.mdSave it as .claude/skills/tonic-ui-sx/SKILL.md (or your agent's skills folder). This skill also uses 2 other files; get the full folder from GitHub.
name
tonic-ui-sx
description
Choose sx, __sx, and composeSx when authoring or reviewing Tonic UI Box-based components, including wrappers and headless-library prop getters. Use for base styles, style precedence, consumer overrides that do not apply, or incoming __sx overrides that are dropped.

Tonic UI: sx vs __sx

All docs/ and packages/ paths are relative to the repository root. Component paths such as button/Button.js are relative to packages/react/src/. Read composition and verification when implementing a wrapper, transition, multi-feature prop getter, or regression check. Its worked examples and verification cases supplement the core rules below.

When to Use

Use this skill for component base styles, useXxxStyle() hooks, Box style routing, incoming __sx folds, wrappers overriding children, and headless-library prop getters such as react-table's getRowProps() / getHeaderProps(). It applies to any package rendering Tonic UI Box-based components, including external data-grid integrations. Also use it to investigate dropped wrapper styles or consumer overrides that lose.

Current Integration Status

Full __sx integration is not complete in this Tonic UI checkout. The helper, Box channel, and useSlot composition exist, and some components use them; the examples below describe the target styling convention, not proof that every component already follows it. Inspect the affected implementation before relying on it, and do not expand a task into full styling integration without a user request.

The one rule that governs everything: precedence-by-origin

A component's base styling always loses to a consumer override, regardless of which CSS property each touches. A wrapper's child-override beats the child's base but still loses to the end consumer. To make that true structurally (not by convention), Tonic UI routes who wrote the style to a fixed channel — and the channel decides precedence.

So the question is never "what does this style do?" but "who is writing it?"

  • You are the component author, styling your own Box → __sx (lowest tier).
  • You are a wrapper, overriding a child component you render → also __sx (folded into the child's incoming __sx).
  • You are the consumer (app developer) → sx (highest tier), or style props / pseudo props.

A component never writes its own styling to sx. sx is the consumer's escape hatch.

"Writing it" isn't limited to a component's own render body. A higher-order component wrapping a child, or a headless-library plugin contributing props via a getter function (e.g. react-table's getRowProps()/getHeaderProps(), composed across features by a shallow merge), is just as much "the component author" for this purpose as a render body is — the same hand-built-style-object, hand-merged-via-ensureArray-or-object-spread failure shows up there too, just one layer removed from JSX.

The four channels of Box

Box concatenates four ordered channels into one Emotion class. For declarations of the same property at the same selector specificity, a later channel wins.

ChannelWho writes itTierNotes
__sx (base sx)Library / component internals0 — lowestA component's own base styling. Full sx-object format. Internal: not in public BoxProps, never forwarded to the DOM.
Style props (px, bg, color, …)Consumer1Flat layout/appearance props, resolved by the system transform.
Pseudo props (_hover, _active, _focusVisible, …)Consumer3Each a single prop carrying a style object.
sxConsumer4 — highestThe consumer's arbitrary-style escape hatch.

__sx and sx accept the identical authoring format: flat declarations, nested selectors ('& svg', '&:hover'), pseudo shortcuts (_hover), theme => … functions, design tokens, responsive arrays. They differ only in tier (who they belong to), not in what they can express.

Why __sx exists (the problem it solves)

Before __sx, base styling was authored as style props (tier 1) + pseudo props (tier 3). That made precedence a function of which kind of prop a value is — not who wrote it. Two failures followed:

  • A component that needed nested selectors or pseudo-elements (which flat style props can't express) had to author base styling via sx — but then the component's sx outranked the consumer's style props and sx (single shared slot), so the consumer could no longer override. Backwards.
  • Wrappers overriding a child had to squat on the consumer's sx channel and hand-merge the consumer's sx back on top (sx={[ownSx, ...ensureArray(sx)]}) — done inconsistently across the codebase, silently dropping overrides when an author forgot the spread.

__sx is a dedicated lowest-priority channel that reuses the sx transform. Base styling goes there; consumer style props and sx sit above it and override it. Precedence-by-kind becomes precedence-by-origin, with no per-author merge bets.

How to author base styling: the uniform fold

Every base-styling component follows the same call site. You cannot predict which components a future wrapper will inject __sx into, so apply this uniformly — don't pick and choose:

js
import { composeSx } from '@tonic-ui/utils/internal';

const MyComponent = forwardRef((inProps, ref) => {
  const {
    // ...component props...
    __sx: __sxProp,                 // destructure incoming __sx OUT of rest
    ...rest
  } = useDefaultProps({ props: inProps, name: 'MyComponent' });

  const styleProps = useMyComponentStyle(/* state */); // the COMPLETE base: flat + pseudo + nested

  return (
    <Box
      ref={ref}
      {...rest}
      __sx={composeSx(styleProps, __sxProp)}   // own base first, incoming __sx folded last
    />
  );
});

Why each part matters:

  • __sx is destructured out of rest so it is not applied twice (once via the spread, once via the explicit prop).
  • composeSx(styleProps, __sxProp) is placed after {...rest} so the explicit __sx wins the spread, and the incoming __sx (already folded) lands after the component's own base → an injected override beats the component's base, while the consumer's sx (tier 4) still beats everything.
  • useXxxStyle() returns the component's complete base — flat layout, pseudo rules, and nested selectors in one value (an object, or an array when conditional/order-sensitive parts must compose). There is no separate get*Sx function; it was folded into useXxxStyle.

Destructure __sx: __sxProp (and ...rest) directly from useDefaultProps — in one line. Do not capture the whole bag as const props = useDefaultProps(...). You need two things the opaque bag can't give you cleanly: the incoming __sx pulled out (so it isn't applied twice) and a ...rest that no longer contains it (so the explicit __sx={composeSx(...)} after the spread wins). The one-line destructure is the canonical form:

js
// ✅ canonical — destructure inline
const { __sx: __sxProp, ...rest } = useDefaultProps({ props: inProps, name: 'X' });
const styleProps = useXxxStyle(...);
return <Child {...rest} __sx={composeSx(styleProps, __sxProp)} />;

// ❌ opaque bag — can't fold cleanly; `{...props}` carries an unfolded `__sx`,
//    and adding `__sx={...}` alongside it double-applies or collides
const props = useDefaultProps({ props: inProps, name: 'X' });
return <Child {...props} __sx={composeSx(styleProps, props.__sx)} />;

// ❌ two-step — works, but re-destructuring from a captured bag is noise; inline it
const props = useDefaultProps({ props: inProps, name: 'X' });
const { __sx: __sxProp, ...rest } = props;

composeSx: array composition, never object merge

js
const composeSx = (...values) => values.flatMap((value) => ensureArray(value));
// import { composeSx } from '@tonic-ui/utils/internal';   (internal — not the public barrel)

composeSx is variadic — pass any number of sx-values (composeSx(base, a, b)); arrays are flattened and undefined is skipped. It returns an array for the __sx/sx prop. Do not spread it as props.

If you author the element through useSlot, you don't fold __sx yourself. useSlot composes both ref (via useMergeRefs) and __sx (via composeSx) across props and slotProps internally — put the base in props.__sx, pass the consumer's slot props as slotProps, and the base stays below the slot's __sx. Do not strip __sx out of the slot props or hand-merge it; that's the hook's job (mirrors how it merges ref):

js
const [Slot, slotProps] = useSlot({
  props: { ref: combinedRef, __sx: baseStyle },  // base — useSlot keeps it below slotProps.__sx
  slot: slots.x ?? Default,
  slotProps: resolvedSlotProps,                   // consumer ref + __sx merged by useSlot
});

This is the single most important pitfall. Combining two sx-objects must use array composition ([a, b]), not object merge ({...a, ...b}):

  • Array → both objects are emitted; source order resolves conflicts per declaration. An incoming &:hover partially overrides the base &:hover (changes color, keeps the base background).
  • Object merge → a nested key like &:hover from b replaces a's &:hover entirely. The base hover styling is discarded. This is the wrong behavior and a common bug.

When there is no incoming value to fold (e.g. a sub-element whose style has no consumer __sx slot), pass the style object directly — composeSx adds nothing:

js
// Folding an incoming __sx → use composeSx:
<Box {...rest} __sx={composeSx(styleProps, __sxProp)} />

// No incoming __sx → pass directly:
return { ref, onMouseDown, __sx: trackStyleProps };
Show full SKILL.md (719 more words)Show less

Transition and Prop-Getter Invariants

  • Animation state derived from an enum and static configuration belongs in __sx. Fold incoming __sx last in both Box and function-child render paths.
  • Function children must spread the handoff onto a Box-based element. Keep the caller's style separate and explicitly destructured as an animation input.
  • DOM-measured values belong in inline style; conditionally include measured keys so an undefined measurement does not erase the caller's value.
  • Each prop-getter composition layer must fold multiple contributors' __sx via composeSx, not shallow object spread.
  • Extract base styling into styles.js / use<Component>Style(), including static values. Read the linked reference for the worked examples.

Consumer usage — sx

App developers override component styling with sx (highest tier), or with style props / pseudo props. They never touch __sx (it's internal and off the public type):

jsx
<Button sx={{ bg: 'blue:50', _hover: { bg: 'blue:60' } }}>Save</Button>
<Button bg="blue:50">Save</Button>   {/* style prop, tier 1 — also beats base __sx */}

Both remain fully functional, coequal tiers — this doesn't change. Going forward, sx is the preferred authoring convention for new/migrated consumer JSX, including on the layout primitives (Box/Flex/Grid/Stack/StackItem/Space). The style-props-to-sx codemod (packages/codemod/src/style-props-to-sx) mechanically migrates existing flat-prop usage to sx.

The specificity boundary (read before promising "consumers can override anything")

Channel order resolves ties only at equal selector specificity. Specificity still applies:

  • A flat base declaration in __sx (e.g. { color }) is overridable by a consumer flat style prop or sx.
  • A nested/pseudo base rule in __sx (e.g. { '&:hover': { color } }, { '& svg': {…} }) has higher specificity than a consumer's flat style prop, so a flat style prop will not override it — only a consumer rule of equal-or-higher specificity (a matching sx / _hover) will. This is inherent to CSS, not a quirk of __sx. Don't tell a consumer a flat color prop will override a base &:hover color.

Naming conventions

  • Hook: use<Component>Style (e.g. useButtonStyle); for a multi-part component, the root is use<Component>RootStyle (e.g. useScrollbarRootStyle, useCircularProgressRootStyle).
  • Local variable holding the hook result: <...>StyleProps (e.g. styleProps, rootStyleProps, circularProgressRootStyleProps).
  • Incoming consumer __sx: destructured as __sx: __sxProp (mirrors the sx: sxProp convention).
  • Incoming consumer style, when it needs merging with another style source (a colliding <...>StyleProps hook result, a transition handoff's transitionStyle, a measured value): see the merge pattern in the linked composition reference for the canonical shape (const style = { ...styleProp, ...(condition && { key: value }) };) and the naming-collision caveat — rename the destructure to styleProp only when a colliding styleProps exists in the same scope, never rename the hook result to make room for it.
  • The helper is composeSx — named for what it does, matching the rule below: array composition, never object merge.

Red flags when writing or reviewing

  • A component writing its own styling to sx= → should be __sx. (sx is consumer-only.)
  • __sx={{...a, ...b}} or sx={{...ownSx, ...props.sx}} (object merge of sx-objects) → use composeSx(a, b) (array). Object-merging discards whole nested keys like &:hover.
  • composeSx(...) spread as props (<Box {...composeSx(...)} />) → it returns an array for the __sx/sx prop, not a props object.
  • Incoming __sx not destructured out of rest, or composeSx(...) placed before {...rest} → the fold is wrong; an injected override is double-applied or silently dropped.
  • const props = useDefaultProps(...) capturing the whole bag, then {...props} onto the child → the incoming __sx rides along unfolded; destructure const { __sx: __sxProp, ...rest } = useDefaultProps(...) inline instead (don't capture props then re-destructure either).
  • A wrapper overriding a child via sx={[ownSx, ...sx]} (hand-merge) → migrate to __sx; the child folds it natively, no hand-merge.
  • composeSx(styleProps) with a single arg where there's genuinely no incoming __sx → just pass __sx={styleProps} directly.
  • "Consumer's flat style prop should override the base hover" → check specificity; a nested base rule isn't beaten by a flat prop.
  • A transition component spreading its animation state (opacity/transform/transition derived from the state enum) as flat Box props, or handing it to a function child inside style → both belong in __sx (see the transition section above).
  • A DOM-measured value (content height, auto-computed duration) serialized through __sx/sx → inline style; each distinct measurement would mint an uncollectable stylesheet class.

Sources of truth (in this repo)

  • docs/adr/2026-06-24-box-internal-sx-base-channel.md — why __sx was introduced and the specificity boundary.
  • docs/adr/2026-06-29-scrollbar-scrollview-slot-and-useslot-sx-composition.md — __sx composition through useSlot for a slotted default component (Scrollbar/ScrollView).
  • docs/adr/2026-07-03-transition-style-through-sx-channel.md — the transition convention: animation state through __sx in both render modes; the function-child handoff carries __sx and requires a Box-based child; DOM-measured values stay on inline style.
  • packages/react-base/src/box/Box.js — the four-channel compose chain.
  • packages/utils/src/internal/composeSx.js — the helper.
  • docs/plans/2026-07-02-sx-internals-migration.md — the migration plan covering both @tonic-ui/react and the confirmed @tonic-ui/react-data-grid instances (e.g. DataGridResizeHandle.js, DataGridScrollbar.js, RowReorder.js's getRowProps() contribution); a live worked example of every pattern above outside a component render body.

© trendmicro-frontend, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 2 other files (references) in .agents/skills/tonic-ui-sx of trendmicro-frontend/tonic-ui.

  • SKILL.md
  • evals/evals.json
  • references/composition-and-verification.md

Open the folder on GitHubat commit 7e7181f

Compare with similar skills

Tonic UI Sx next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Tonic UI Sx compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Tonic UI Sx this skilltrendmicro-frontend/tonic-ui133—~4kAutomated safety check: PassMIT
Web Artifacts Builderanthropics/skills180k40 repos~769Automated safety check: PassApache-2.0
React Doctormakeplane/plane61k12 repos~657Automated safety check: PassAGPL-3.0
React Router Developmentremix-run/react-router57k1 repos~1.5kAutomated safety check: PassMIT
React UI State PatternsChrisWiles/claude-code-showcase6.1k8 repos~1.6kAutomated safety check: PassNone
GSAP Core Animationgreensock/gsap-skills16k3 repos~3.7kAutomated safety check: PassMIT

Similar skills

  • Web Artifacts Builder

    anthropics/skills

    Official

    Builds multi-component claude.ai HTML artifacts as a small React, TypeScript and Tailwind project, then bundles it into one shareable HTML file.

    180k GitHub starsUsed in 40 repos~769 tokens
    Frontend & DesignAuto-check passed
  • React Doctor

    makeplane/plane

    Scans React code for lint, accessibility, bundle size and architecture issues, reports a health score and checks that changes do not lower it.

    61k GitHub starsUsed in 12 repos~657 tokens
    Frontend & DesignAuto-check passed
  • React Router Development

    remix-run/react-router

    Guides work on React Router apps by first identifying whether the app uses Framework, Data or Declarative mode, then loading the matching reference and the installed package docs.

    57k GitHub starsUsed in 1 repo~1.5k tokens
    Frontend & DesignAuto-check passed
  • React UI State Patterns

    ChrisWiles/claude-code-showcase

    Sets patterns for React interfaces: when to show loading spinners or skeletons, how to surface errors, how to disable buttons during async work and how to handle empty lists.

    6.1k GitHub starsUsed in 8 repos~1.6k tokens
    Frontend & DesignAuto-check passed
  • GSAP Core Animation

    greensock/gsap-skills

    Covers the GSAP core API for tweens, easing, staggers, defaults and matchMedia, and when to choose GSAP over CSS animations or other JavaScript animation libraries.

    16k GitHub starsUsed in 3 repos~3.7k tokens
    Frontend & DesignAuto-check passed
  • Builds single-file interactive HTML prototypes rendered with the real LobeHub UI components and written as production-style React, so they can later be split into files.

    83k GitHub stars~1.6k tokensUpdated today
    Frontend & DesignAuto-check passed

More from trendmicro-frontend/tonic-ui

  • Tonic UI Patterns

    trendmicro-frontend/tonic-ui

    Apply Tonic UI repository conventions when creating or reviewing components, hooks, exports, and commit messages.

    133 GitHub stars~1.8k tokensUpdated 2 days ago
    Auto-check passed
  • Tonic UI PR

    trendmicro-frontend/tonic-ui

    Generate PR descriptions and changeset entries. An agent skill from trendmicro-frontend/tonic-ui.

    133 GitHub stars~2.9k tokensUpdated 2 days ago
    Auto-check passed
  • Tonic UI Types

    trendmicro-frontend/tonic-ui

    A skill your agent uses when adding JSDoc type definitions to React components in Tonic UI.

    133 GitHub stars~1.9k tokensUpdated 2 days ago
    Auto-check passed
  • Tonic UI Slots

    trendmicro-frontend/tonic-ui

    Author and migrate the slots / slotProps API (the useSlot hook) in this design system's React components — the architecture where slots.x replaces an internal part and slotProps.x merges props into…

    133 GitHub stars~1.3k tokensUpdated 2 days ago
    Auto-check passed

Works with

Questions about Tonic UI Sx

What does Tonic UI Sx do?

Choose sx, sx, and composeSx when authoring or reviewing Tonic UI Box-based components, including wrappers and headless-library prop getters. Tonic UI Sx is an agent skill from trendmicro-frontend/tonic-ui. Choose sx, sx, and composeSx when authoring or reviewing Tonic UI Box-based components, including wrappers and headless-library prop getters.

When should I use Tonic UI Sx?

Tonic UI Sx fits situations like: style precedence; consumer overrides that do not apply; incoming sx overrides that are dropped.

How do I install Tonic UI Sx in Claude Code?

Run `npx skills add trendmicro-frontend/tonic-ui --skill tonic-ui-sx -a claude-code`. Or copy the skill folder (.agents/skills/tonic-ui-sx in trendmicro-frontend/tonic-ui) into .claude/skills/tonic-ui-sx in your project. Claude Code loads it when a task matches its description.

How do I install Tonic UI Sx in Codex?

Run `npx skills add trendmicro-frontend/tonic-ui --skill tonic-ui-sx -a codex`. Or copy the skill folder (.agents/skills/tonic-ui-sx in trendmicro-frontend/tonic-ui) into .agents/skills/tonic-ui-sx in your project. Codex loads it when a task matches its description.

Can I use Tonic UI Sx in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add trendmicro-frontend/tonic-ui --skill tonic-ui-sx -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/tonic-ui-sx, .gemini/skills/tonic-ui-sx, .github/skills/tonic-ui-sx and .opencode/skills/tonic-ui-sx in your project.

What does Tonic UI Sx need to run?

SKILL.md names no scripts, command-line tools or credentials: Tonic UI Sx is instructions for the agent only.

Does Tonic UI Sx access the network?

SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.

Is Tonic UI Sx safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Tonic UI Sx use?

Tonic UI Sx is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Tonic UI Sx use?

About 4k tokens (SKILL.md is roughly 16k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 2.9k tokens, read only when the agent opens those files.

What are the alternatives to Tonic UI Sx?

Skills that share tags, products or a category with Tonic UI Sx: Web Artifacts Builder (anthropics/skills, 180k stars), React Doctor (makeplane/plane, 61k stars), React Router Development (remix-run/react-router, 57k stars) and React UI State Patterns (ChrisWiles/claude-code-showcase, 6.1k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Tonic UI Sx?

trendmicro-frontend (a GitHub organization) maintains it in trendmicro-frontend/tonic-ui, which has 133 GitHub stars. The repository holds 5 skills in this directory. The repository was last updated on October 8, 2026.

Source: trendmicro-frontend/tonic-ui on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.