Tabler Core JavaScript
tabler/tabler
Guidance for changing the Tabler framework's own JavaScript in core/js: the tabler.js and tabler-theme.js bundles, the Bootstrap port and their tests.
Rules for calling JavaScript from Jaspr web apps in Dart: which interop libraries to import in server, static and client modes, and how to wrap functions, objects and libraries.
$ npx skills add rodydavis/signals.dart --skill jaspr-js-interop -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install rodydavis/signals.dart jaspr-js-interop --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/rodydavis/signals.dart.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/jaspr-js-interop .claude/skills/jaspr-js-interop && rm -rf skills-srcUse ~/.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/
Install the "jaspr-js-interop" agent skill from https://github.com/rodydavis/signals.dart/tree/main/.agents/skills/jaspr-js-interop into .claude/skills/jaspr-js-interop/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "jaspr-js-interop", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/rodydavis/signals.dart/tree/main/.agents/skills/jaspr-js-interopType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add rodydavis/signals.dart --skill jaspr-js-interop -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install rodydavis/signals.dart jaspr-js-interop --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/rodydavis/signals.dart.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/jaspr-js-interop .agents/skills/jaspr-js-interop && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "jaspr-js-interop" agent skill from https://github.com/rodydavis/signals.dart/tree/main/.agents/skills/jaspr-js-interop into .agents/skills/jaspr-js-interop/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "jaspr-js-interop", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add rodydavis/signals.dart --skill jaspr-js-interop -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install rodydavis/signals.dart jaspr-js-interop --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/rodydavis/signals.dart.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/jaspr-js-interop .cursor/skills/jaspr-js-interop && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "jaspr-js-interop" agent skill from https://github.com/rodydavis/signals.dart/tree/main/.agents/skills/jaspr-js-interop into .cursor/skills/jaspr-js-interop/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "jaspr-js-interop", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/rodydavis/signals.dart.git --path .agents/skills/jaspr-js-interop--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add rodydavis/signals.dart --skill jaspr-js-interop -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install rodydavis/signals.dart jaspr-js-interop --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/rodydavis/signals.dart.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/jaspr-js-interop .gemini/skills/jaspr-js-interop && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "jaspr-js-interop" agent skill from https://github.com/rodydavis/signals.dart/tree/main/.agents/skills/jaspr-js-interop into .gemini/skills/jaspr-js-interop/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "jaspr-js-interop", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install rodydavis/signals.dart jaspr-js-interopInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add rodydavis/signals.dart --skill jaspr-js-interop -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/rodydavis/signals.dart.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/jaspr-js-interop .github/skills/jaspr-js-interop && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "jaspr-js-interop" agent skill from https://github.com/rodydavis/signals.dart/tree/main/.agents/skills/jaspr-js-interop into .github/skills/jaspr-js-interop/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "jaspr-js-interop", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add rodydavis/signals.dart --skill jaspr-js-interop -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install rodydavis/signals.dart jaspr-js-interop --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/rodydavis/signals.dart.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/jaspr-js-interop .opencode/skills/jaspr-js-interop && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "jaspr-js-interop" agent skill from https://github.com/rodydavis/signals.dart/tree/main/.agents/skills/jaspr-js-interop into .opencode/skills/jaspr-js-interop/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "jaspr-js-interop", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
jaspr-js-interopRules for calling JavaScript from Jaspr web apps in Dart: which interop libraries to import in server, static and client modes, and how to wrap functions, objects and libraries.
Jaspr apps can compile to JavaScript or WebAssembly, so reaching raw JS needs Dart's explicit `js_interop`. The import rules depend on the mode. In server or static mode the code must always import `package:universal_web/js_interop.dart`, a stub that keeps server-side compilation working, and must wrap any interop call in an `if (kIsWeb)` check so pre-rendering does not throw. In client mode `dart:js_interop` can be imported directly. For standard browser APIs such as the window, document and DOM nodes, the skill points to `universal_web/web.dart`, or `package:web/web.dart` in client mode, instead of hand-written wrappers.
Usage examples show three patterns. A top-level global JS function is bound with `@JS()` and an external declaration. A third-party JS library is wrapped by an extension type over `JSObject`, with external methods for each call. A plain JS object literal, such as a chart configuration, is modeled as an `@anonymous` extension type.
Read from SKILL.md and the folder at commit 81d64e8. It shows what the files ask for, not the result of running them.
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.
No scripts in the folder and no shell commands in SKILL.md (its code samples are dart).
From the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Jaspr JS Interop loads about 823 tokens when it runs. Until then it costs about 55 tokens; SKILL.md has 197 words of instructions outside code blocks.
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.
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.
The full file from rodydavis/signals.dart at commit 81d64e8, republished under its Apache-2.0 licence (© rodydavis). 197 words, ~823 tokens.
.claude/skills/jaspr-js-interop/SKILL.md (or your agent's skills folder).Dart makes accessing JavaScript simple using modern js_interop. Since Jaspr applications can be compiled to JavaScript or WebAssembly, utilizing Dart's explicit js_interop mechanism is required when you need to interface with raw JS variables, functions, or libraries.
package:universal_web/js_interop.dart. It acts as a safe stub during server-side processing without breaking compilation.if (kIsWeb) { ... } block to avoid throwing exceptions on the server during pre-rendering.dart:js_interop.window.innerHeight, document, DOM nodes), use package:universal_web/web.dart (or package:web/web.dart in client mode) instead of manually creating js_interop wrappers.Top Level Functions
To bind directly to a globally available JS function or object, use @JS():
@JS()
external void alert(JSString message);
void showAlert() {
if (kIsWeb) {
// Make sure to convert Dart String types using .toJS
alert('Hello from Dart!'.toJS);
}
}Wrapping Third-Party JS Libraries
To interact with specific Javascript Objects from external libraries, map an extension type wrapping JSObject.
// Suppose there is a JS library available via `window.Analytics`
extension type Analytics._(JSObject _) implements JSObject {
external void trackPage(JSString pageName);
external JSNumber getVisitCount();
}
@JS('Analytics')
external Analytics get analytics;
void logCurrentPage() {
if (kIsWeb) {
analytics.trackPage('Home'.toJS);
// Convert Javascript primitives back to Dart types using `.toDart`
int visits = analytics.getVisitCount().toDartInt;
print('Total visits: $visits');
}
}Anonymous JS Objects
If you need to pass a configuration object (a plain JS object literal {}) into a JS function, or receive one from JavaScript, define an @anonymous extension type.
@JS()
@anonymous
extension type ChartConfig._(JSObject _) implements JSObject {
external factory ChartConfig({
JSString title,
JSBoolean showLegend,
JSArray<JSNumber> data,
});
external JSString get title;
external JSArray<JSNumber> get data;
}
@JS()
external void renderChart(ChartConfig config);
void setupChart() {
if (kIsWeb) {
// Creating an anonymous JS object to pass into a JS function
final config = ChartConfig(
title: 'Monthly Sales'.toJS,
showLegend: true.toJS,
data: [10.toJS, 20.toJS, 30.toJS].toJS,
);
renderChart(config);
// Reading properties from a JS object back to Dart types
String title = config.title.toDart;
List<double> rawData = config.data.toDart.map((e) => e.toDartDouble).toList();
}
}© rodydavis, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in .agents/skills/jaspr-js-interop of rodydavis/signals.dart.
Open the folder on GitHubat commit 81d64e8
Jaspr JS Interop 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.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Jaspr JS Interop this skillrodydavis/signals.dart | 819 | — | ~823 | Automated safety check: Pass | Apache-2.0 | |
| Tabler Core JavaScripttabler/tabler | 42k | — | ~1.4k | Automated safety check: Pass | MIT | |
| @pierre/diffs Code Renderingpierrecomputer/pierre | 6.3k | 2 repos | ~803 | Automated safety check: Pass | Apache-2.0 | |
| Tabler Astro Component Scriptstabler/tabler | 42k | — | ~2.1k | Automated safety check: Pass | MIT | |
| Tabler Bootstrap Component Rulestabler/tabler | 42k | — | ~2.2k | Automated safety check: Pass | MIT | |
| Pierre Trees File Treepierrecomputer/pierre | 6.3k | — | ~473 | Automated safety check: Pass | Apache-2.0 |
tabler/tabler
Guidance for changing the Tabler framework's own JavaScript in core/js: the tabler.js and tabler-theme.js bundles, the Bootstrap port and their tests.
pierrecomputer/pierre
Guides an agent through using @pierre/diffs to render syntax-highlighted files and diffs, and to build editing and review surfaces in React or plain JavaScript.
tabler/tabler
Rules for adding or fixing client-side scripts in Tabler's Astro components so the copied preview HTML stays readable, self-contained and runs in the right order.
tabler/tabler
Sets the file structure, typing and Data API pattern for writing a new Bootstrap-style JavaScript component class in Tabler's vendored port of Bootstrap's JS.
pierrecomputer/pierre
Use when an app uses @pierre/trees to render or control a file tree, including React, vanilla JavaScript, SSR, web components, selection, search, rename, drag…
TokenRhythm/opensquilla
Guides semantic, accessible HTML work: pages, forms, media and HTML5 APIs, plus how to deliver a runnable webpage project with a preview.
rodydavis/signals.dart
Teaches the agent Jaspr's Flutter-like component model and typed HTML elements, with strict rules on build methods and helper syntax.
rodydavis/signals.dart
Guides styling of Jaspr web components with the type-safe Styles API in Dart, covering @css annotations, inline styles and global stylesheets.
rodydavis/signals.dart
Sets the rules for static or server mode Jaspr apps in Dart, covering dual entrypoints, the client annotation and data hydration.
rodydavis/signals.dart
Upgrades every package under ./examples to the repository's latest signals version, runs pub upgrade on third-party dependencies, and fixes the resulting analysis problems.
rodydavis/signals.dart
Use when you need to convert / rewrite existing HTML (from a file or url) into Jaspr code.
rodydavis/signals.dart
Runs, merges, and analyzes Dart and Flutter test coverage across a Melos monorepo, then targets the exact uncovered lines.
Works with
Categories
Rules for calling JavaScript from Jaspr web apps in Dart: which interop libraries to import in server, static and client modes, and how to wrap functions, objects and libraries. Jaspr apps can compile to JavaScript or WebAssembly, so reaching raw JS needs Dart's explicit `js_interop`. The import rules depend on the mode.
Jaspr JS Interop fits situations like: wrapping an existing JavaScript library in a Jaspr web app; calling browser-native APIs from Dart code that is also pre-rendered on the server; passing a configuration object into a JS function from Dart.
Run `npx skills add rodydavis/signals.dart --skill jaspr-js-interop -a claude-code`. Or copy the skill folder (.agents/skills/jaspr-js-interop in rodydavis/signals.dart) into .claude/skills/jaspr-js-interop in your project. Claude Code loads it when a task matches its description.
Run `npx skills add rodydavis/signals.dart --skill jaspr-js-interop -a codex`. Or copy the skill folder (.agents/skills/jaspr-js-interop in rodydavis/signals.dart) into .agents/skills/jaspr-js-interop in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add rodydavis/signals.dart --skill jaspr-js-interop -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/jaspr-js-interop, .gemini/skills/jaspr-js-interop, .github/skills/jaspr-js-interop and .opencode/skills/jaspr-js-interop in your project.
SKILL.md names no scripts, command-line tools or credentials: Jaspr JS Interop is instructions for the agent only. Our summary lists: A Jaspr project written in Dart.
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.
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.
Jaspr JS Interop is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 823 tokens (SKILL.md is roughly 3.3k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Jaspr JS Interop: Tabler Core JavaScript (tabler/tabler, 42k stars), @pierre/diffs Code Rendering (pierrecomputer/pierre, 6.3k stars), Tabler Astro Component Scripts (tabler/tabler, 42k stars) and Tabler Bootstrap Component Rules (tabler/tabler, 42k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
rodydavis (a GitHub user) maintains it in rodydavis/signals.dart, which has 819 GitHub stars. The repository holds 15 skills in this directory. The repository was last updated on September 14, 2026.
Source: rodydavis/signals.dart on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.