skills/.system/jwebmp-agcharts/SKILL.md
Enterprise-grade charting library integration for JWebMP with Angular 20. Provides CRTP-based fluent Java API for AG Charts 13.1.0 with TypeScript type generation, reactive data binding, and server-side chart configuration. Supports line, bar, area, scatter, bubble, pie, donut, histogram charts with advanced axes, theming, tooltips, legends, zoom, and navigator components. Use when working with AG Charts, creating data visualizations, configuring chart options, building dashboards, or implementing charting features in JWebMP applications.
npx skillsauth add guicedee/ai-rules jwebmp-agchartsInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Enterprise-grade charting library integration for JWebMP with AG Charts 13.1.0 and Angular 20.
@NgComponent
public class LineChartComponent implements INgComponent<LineChartComponent> {
@Override
public String render() {
AgChartOptions<LineChartComponent> options = new AgChartOptions<>(this)
.setData("""
[
{ month: 'Jan', sales: 100 },
{ month: 'Feb', sales: 150 },
{ month: 'Mar', sales: 130 }
]
""")
.setSeries(List.of(
new AgLineSeriesOptions<>()
.setXKey("month")
.setYKey("sales")
.setYName("Sales")
))
.setAxes(List.of(
new AgCategoryAxisOptions<>()
.setType("category")
.setPosition(AgCartesianAxisPosition.BOTTOM),
new AgNumberAxisOptions<>()
.setType("number")
.setPosition(AgCartesianAxisPosition.LEFT)
));
return """
<ag-charts-angular [options]="chartOptions">
</ag-charts-angular>
""";
}
}
new AgLineSeriesOptions<>()
.setXKey("date")
.setYKey("value")
.setStroke("blue")
.setStrokeWidth(2)
.setMarker(new AgSeriesMarkerOptions<>()
.setEnabled(true)
.setShape(AgMarkerShape.CIRCLE));
new AgBarSeriesOptions<>()
.setXKey("category")
.setYKey("amount")
.setFill("steelblue")
.setStroke("navy")
.setStrokeWidth(1);
new AgAreaSeriesOptions<>()
.setXKey("x")
.setYKey("y")
.setFill("rgba(0, 150, 136, 0.5)")
.setStroke("rgb(0, 150, 136)")
.setFillOpacity(0.7);
new AgScatterSeriesOptions<>()
.setXKey("weight")
.setYKey("height")
.setMarker(new AgSeriesMarkerOptions<>()
.setShape(AgMarkerShape.CIRCLE)
.setSize(8)
.setFill("red"));
new AgBubbleSeriesOptions<>()
.setXKey("x")
.setYKey("y")
.setSizeKey("size")
.setColorKey("category")
.setMarker(new AgSeriesMarkerOptions<>()
.setMaxSize(30));
new AgPieSeriesOptions<>()
.setAngleKey("value")
.setCalloutLabelKey("label")
.setSectorLabelKey("value")
.setInnerRadiusOffset(0);
new AgDonutSeriesOptions<>()
.setAngleKey("value")
.setCalloutLabelKey("category")
.setInnerRadiusRatio(0.7)
.setInnerLabels(List.of(
new AgDonutInnerLabel<>()
.setText("Total")
.setFontSize(24)
.setFontWeight("bold")
))
.setInnerCircle(new AgDonutInnerCircle<>()
.setFill("white"));
new AgNumberAxisOptions<>()
.setType("number")
.setPosition(AgCartesianAxisPosition.LEFT)
.setTitle(new AgAxisCaptionOptions<>()
.setText("Revenue ($)")
.setEnabled(true))
.setLabel(new AgAxisLabelOptions<>()
.setFormat(",.0f"))
.setMin(0)
.setMax(1000);
new AgCategoryAxisOptions<>()
.setType("category")
.setPosition(AgCartesianAxisPosition.BOTTOM)
.setTitle(new AgAxisCaptionOptions<>()
.setText("Quarter")
.setFontSize(14));
new AgTimeAxisOptions<>()
.setType("time")
.setPosition(AgCartesianAxisPosition.BOTTOM)
.setInterval(new AgAxisTimeIntervalOptions<>()
.setTimeUnit(AgTimeIntervalUnit.MONTH)
.setStep(1))
.setLabel(new AgAxisLabelOptions<>()
.setFormat("%b %Y"));
new AgLogAxisOptions<>()
.setType("log")
.setPosition(AgCartesianAxisPosition.LEFT)
.setBase(10)
.setMin(1)
.setMax(10000);
new AgGroupedCategoryAxisOptions<>()
.setType("grouped-category")
.setPosition(AgCartesianAxisPosition.BOTTOM);
new AgChartLegendOptions<>()
.setEnabled(true)
.setPosition(new AgChartLegendPositionOptions<>()
.setPosition("bottom"))
.setSpacing(20)
.setItem(new AgChartLegendItemOptions<>()
.setMarker(new AgChartLegendItemMarkerOptions<>()
.setShape(AgMarkerShape.CIRCLE)
.setSize(12))
.setLabel(new AgChartLegendItemLabelOptions<>()
.setFontSize(12)))
.setPagination(new AgChartLegendPaginationOptions<>()
.setMarker(new AgChartLegendPaginationButtonOptions<>()
.setSize(15)));
new AgChartTooltipOptions<>()
.setEnabled(true)
.setMode(AgTooltipMode.GROUPED)
.setPosition(new AgTooltipPositionOptions<>()
.setType("pointer")
.setXOffset(10)
.setYOffset(10))
.setInteraction(new AgTooltipInteractionOptions<>()
.setEnabled(true))
.setDelay(0);
options.setTheme(AgChartThemeName.AG_MATERIAL);
// Or: AG_POLYCHROME, AG_VIVID, AG_SOLAR, AG_DEFAULT
AgChartTheme theme = new AgChartTheme()
.setPalette(new AgChartThemePalette()
.setFills(List.of("#5470C6", "#91CC75", "#FAC858"))
.setStrokes(List.of("#5470C6", "#91CC75", "#FAC858")))
.setOverrides(new AgChartThemeParams()
.setCommon(new AgChartThemeCommonOptions()
.setBackground(new AgChartBackground()
.setFill("#FFFFFF"))));
options.setTheme(theme);
options.setAnimation(new AgAnimationOptions()
.setEnabled(true)
.setDuration(1000));
options.setZoom(new AgZoomOptions()
.setEnabled(true)
.setEnableAxisDragging(true)
.setEnableScrolling(true)
.setEnableSelecting(true));
Mini-chart for large datasets:
options.setNavigator(new AgNavigatorOptions()
.setEnabled(true)
.setHeight(30)
.setMin(0.2)
.setMax(0.8));
For heatmaps and continuous scales:
options.setGradientLegend(new AgGradientLegendOptions()
.setEnabled(true)
.setPosition("right")
.setGradient(new AgGradientLegendGradientOptions()
.setPreferredLength(200)));
options.setContextMenu(new AgContextMenuOptions()
.setEnabled(true));
AgChartOptions<MyComponent> options = new AgChartOptions<>(this)
.setTitle(new AgChartCaptionOptions<>()
.setText("Quarterly Sales by Region")
.setEnabled(true))
.setData(salesData)
.setSeries(List.of(
new AgBarSeriesOptions<>()
.setXKey("quarter")
.setYKey("north")
.setYName("North Region")
.setFill("#4285F4"),
new AgBarSeriesOptions<>()
.setXKey("quarter")
.setYKey("south")
.setYName("South Region")
.setFill("#34A853"),
new AgLineSeriesOptions<>()
.setXKey("quarter")
.setYKey("average")
.setYName("Average")
.setStroke("#EA4335")
.setStrokeWidth(3)
))
.setAxes(List.of(
new AgCategoryAxisOptions<>()
.setType("category")
.setPosition(AgCartesianAxisPosition.BOTTOM),
new AgNumberAxisOptions<>()
.setType("number")
.setPosition(AgCartesianAxisPosition.LEFT)
.setTitle(new AgAxisCaptionOptions<>().setText("Sales ($)"))
))
.setLegend(new AgChartLegendOptions<>()
.setEnabled(true)
.setPosition(new AgChartLegendPositionOptions<>()
.setPosition("bottom")));
All options classes use CRTP for type-safe fluent builders:
public class AgChartOptions<J extends AgChartOptions<J>>
extends ChartOptionsBase<J> {
public J setTitle(AgChartCaptionOptions<?> title) {
this.title = title;
return (J) this;
}
public J setSeries(List<AgSeriesBaseOptions<?>> series) {
this.series = series;
return (J) this;
}
}
Method chaining returns correct type:
AgChartOptions<MyComponent> options = new AgChartOptions<>(this)
.setTitle(title) // Returns AgChartOptions<MyComponent>
.setSeries(series) // Still AgChartOptions<MyComponent>
.setLegend(legend); // Type-safe throughout
axes, series, legend, tooltip, themelocale, background, seriesArea, overlays, navigatorgradientLegend, width, height, minWidth, minHeightpadding, title, subtitle, footnotehighlight, animation, zoom, ranges, synccontextMenu, dataSource, keyboard, touch, listenersformatter, container, data, annotations, initialStatemisc{
"dependencies": {
"ag-charts-angular": "^13.1.0",
"ag-charts-community": "^13.1.0"
}
}
@NgDataService
public class ChartDataService implements INgDataService<ChartDataService> {
@Override
public Object getData(AjaxCall<?> call, AjaxResponse<?> response) {
return repository.getChartData();
}
}
options
.setWidth(null) // Auto-width
.setHeight(400)
.setMinWidth(300)
.setMinHeight(200);
Use Angular event bindings in template:
<ag-charts-angular
[options]="chartOptions"
(chartReady)="onChartReady($event)"
(seriesNodeClick)="onNodeClick($event)">
</ag-charts-angular>
module com.jwebmp.plugins.agcharts {
requires transitive com.jwebmp.core;
requires transitive com.jwebmp.core.angular;
requires com.fasterxml.jackson.annotation;
exports com.jwebmp.plugins.agcharts;
exports com.jwebmp.plugins.agcharts.options;
exports com.jwebmp.plugins.agcharts.options.axes;
exports com.jwebmp.plugins.agcharts.options.series;
exports com.jwebmp.plugins.agcharts.options.legend;
exports com.jwebmp.plugins.agcharts.options.tooltip;
exports com.jwebmp.plugins.agcharts.options.theme;
}
<dependency>
<groupId>com.jwebmp.plugins</groupId>
<artifactId>agcharts</artifactId>
</dependency>
com.jwebmp.plugins.agcharts — Core plugincom.jwebmp.plugins.agcharts.options — Main optionscom.jwebmp.plugins.agcharts.options.axes — Axis configurationcom.jwebmp.plugins.agcharts.options.series — Series typescom.jwebmp.plugins.agcharts.options.legend — Legend configurationcom.jwebmp.plugins.agcharts.options.tooltip — Tooltip configurationcom.jwebmp.plugins.agcharts.options.theme — Theme supportcom.jwebmp.plugins.agcharts.options.navigator — Navigator componentcom.jwebmp.plugins.agcharts.options.animation — Animation controlcom.jwebmp.plugins.agcharts.options.zoom — Zoom/pan control<J extends YourClass<J>>type, xKey, yKey for seriescom.jwebmp.plugins.agchartsdevelopment
Install Codex skills into $CODEX_HOME/skills from a curated list or a GitHub repo path. Use when a user asks to list installable skills, install a curated skill, or install a skill from another repo (including private repos).
tools
Guide for creating effective skills. This skill should be used when users want to create a new skill (or update an existing skill) that extends Codex's capabilities with specialized knowledge, workflows, or tool integrations.
development
WebAwesome icon integration for JWebMP — modern, open-source icon library. Provides 1,500+ icons with solid/regular styles, sizing, rotation, animation, and CSS utilities. Drop-in FontAwesome alternative with fresh designs. Use when working with WebAwesome icons, modern icon designs, or as FontAwesome alternative in JWebMP applications.
development
WebAwesome Pro integration for JWebMP with premium icons and features. Extends jwebmp-webawesome with additional styles, premium icons, and advanced features. Use when working with WebAwesome Pro icons or premium WebAwesome features in JWebMP applications.