Agent skill

Sap Sac Custom Widget

by secondsky in secondsky/sap-skills

SAP Analytics Cloud (SAC) Custom Widget development. An agent skill from secondsky/sap-skills.

GPL-3.0Auto-check: notesBusiness, Finance & HR

Install Sap Sac Custom Widget

skills CLI
$ npx skills add secondsky/sap-skills --skill sap-sac-custom-widget -a claude-code

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

GitHub CLI
$ gh skill install secondsky/sap-skills sap-sac-custom-widget --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/secondsky/sap-skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/plugins/sap-sac-custom-widget/skills/sap-sac-custom-widget .claude/skills/sap-sac-custom-widget && 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
sap-sac-custom-widget
GitHub stars
462
Token cost
~8.3k tokens
SKILL.md length
3,069 words
Files
39 (incl. references)
Skills in repo
41
Repo updated
First seen
Licence
GPL-3.0

At a glance

SAP Analytics Cloud (SAC) Custom Widget development. An agent skill from secondsky/sap-skills.

  • Works in 4 steps: Open Chrome DevTools (F12) → Sources tab: Find widget.js, set… → Console tab: View console.log output → …
  • Building custom visualizations
  • SKILL.md covers Related Skills, Table of Contents, Overview and When to Use This Skill, plus 16 more sections
  • Calls node and openssl; reaches username.github.io

What it does

Sap Sac Custom Widget is an agent skill from secondsky/sap-skills. SAP Analytics Cloud (SAC) Custom Widget development. Use when building custom visualizations, extending SAC with Web Components, or creating Widget Add-Ons. Covers JSON metadata, JavaScript Web Components, lifecycle functions, data binding with feeds, styling/builder panels, property/event/method definitions, third-party library integration, hosting, security, performance, and debugging. Includes Widget Add-On feature (QRC Q4 2023+) and templates for widgets, charts, and KPI cards.

Its SKILL.md is about 8.3k tokens, which your agent loads only when the skill is triggered. The skill folder holds 40 other files, including reference files (for example `README.md`, `agents/openai.yaml` and `references/advanced-topics.md`).

It sits in Business, Finance & HR, covering OKRs and executive reporting. It works with JavaScript. The repository describes itself as: Production-ready plugins for SAP development with AI coding assistants — BTP, CAP, Fiori, ABAP, HANA, Analytics Cloud, Datasphere, and more. The licence is GPL-3.0.

When your agent uses it

  • Building custom visualizations
  • Extending SAC with Web Components
  • Creating Widget Add-Ons

Example prompts

  • “/sap-sac-custom-widget”

Requirements

  • Pre-approved tools (allowed-tools): Read, Bash, WebFetch

Workflow steps

4 steps, taken from the first numbered list in SKILL.md.

  1. Open Chrome DevTools (F12)
  2. Sources tab: Find widget.js, set breakpoints
  3. Console tab: View console.log output
  4. Network tab: Check if files load (200 status)

What it can do on your machine

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

  • Tool permissions

    Pre-approves these tools, so the agent can use them without asking each time:

    • Read
    • Bash
    • WebFetch

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • node
    • openssl

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

  • Network

    Hosts in commands or code, which the agent is likely to contact:

    • username.github.io

    Also links to:

    • github.com
    • help.sap.com
    • custom-widgets.de

    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

Sap Sac Custom Widget loads about 8.3k tokens when it runs, and up to ~69k if it reads all its reference files. Until then it costs about 127 tokens; SKILL.md has 3,069 words of instructions outside code blocks.

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

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: notes

The automated check noted patterns worth knowing about, such as sudo or a known installer.

  • NotePre-approves every shell command (allowed-tools: Bash)SKILL.md
    allowed-tools: Read, Bash, WebFetch

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 secondsky/sap-skills at commit 652a861, republished under its GPL-3.0 licence (© secondsky). 3,069 words, ~8,279 tokens.

Download SKILL.mdSave it as .claude/skills/sap-sac-custom-widget/SKILL.md (or your agent's skills folder). This skill also uses 38 other files; get the full folder from GitHub.
name
sap-sac-custom-widget
description
SAP Analytics Cloud (SAC) Custom Widget development. Use when building custom visualizations, extending SAC with Web Components, or creating Widget Add-Ons. Covers JSON metadata, JavaScript Web Components, lifecycle functions, data binding with feeds, styling/builder panels, property/event/method definitions, third-party library integration, hosting, security, performance, and debugging. Includes Widget Add-On feature (QRC Q4 2023+) and templates for widgets, charts, and KPI cards.
allowed-tools
Read, Bash, WebFetch
license
GPL-3.0
metadata.maintainer
Eduard Jiglau
metadata.maintainer_email
hello@sap-ai-skills.com
metadata.website
https://sap-ai-skills.com
metadata.version
2.4.1
metadata.last_verified
2026-06-12
metadata.sac_version
2026.8
metadata.errors_prevented
40+
metadata.official_docs
https://help.sap.com/docs/SAP_ANALYTICS_CLOUD/0ac8c6754ff84605a4372468d002f2bf/75311f67527c41638ceb89af9cd8af3e.html…
metadata.samples_repo
https://github.com/SAP-samples/analytics-cloud-datasphere-community-content/tree/main/SAC_Custom_Widgets

SAP Analytics Cloud Custom Widget Development

  • sap-sac-scripting: Use when custom widgets interact with SAC scripting, widgets, or story/application APIs
  • sap-sac-planning: Use when widgets participate in planning workflows or planning table interactions
  • sapui5: Use for Web Component/UI5 frontend implementation patterns and browser-side quality
  • sap-dependency-security: Use when adding third-party charting or build dependencies to widget projects

Table of Contents

Overview

This skill enables development of custom widgets for SAP Analytics Cloud (SAC). Custom widgets are Web Components that extend SAC stories and applications with custom visualizations, interactive elements, and specialized functionality.

When to Use This Skill

Use this skill when:

  • Building custom visualizations not available in standard SAC
  • Generating prompt-driven widget ideas, branded widget packages, or composite-ready widget designs
  • Integrating third-party charting libraries (ECharts, D3.js, Chart.js)
  • Creating interactive input components for SAC applications
  • Implementing specialized data displays or KPI widgets
  • Extending Analytics Designer applications with custom functionality
  • Troubleshooting custom widget loading or data binding issues

Requirements:

  • SAC tenant with Optimized Story Experience or Analytics Designer
  • JavaScript/Web Components knowledge
  • External hosting (GitHub Pages, AWS S3, Azure) OR SAC-hosted resources (QRC Q2 2023+)

AI-Assisted Generation

For prompt-driven widget creation, first classify the widget role and data-source mode, then suggest 2-3 role-aware options before generating the selected complete package. Keep AI-generated code SAC-compatible, preserve data-binding order when used, and validate/repair before import. See references/ai-assisted-composite-generation.md for output contracts, RAG context patterns, brand styling, and composite caveats.


Widget Discovery and Evidence Intake

Before generating a table, chart, KPI, menu, sidebar, filter, or hybrid control, select both its widget role and data-source mode. Request dimensions, measures/key figures, dates, versions, filters, and feed order only for SAC-bound widgets. For pure UI controls, collect interaction, navigation, state, method/event, accessibility, and responsive-layout requirements instead. Accept user-provided screenshots, PDFs, images, brand guides, and sanitized data as evidence, but confirm technical IDs, feed mappings, asset rights, and licenses before code generation. See references/widget-discovery-intake.md for the Widget Brief, evidence boundaries, and hosted-tool safeguards.


Local Custom Widget Builder

For enterprise or locked-down local environments, offer templates/local-builder/ as the standard no-install scaffold builder. It runs as static HTML/CSS/vanilla JavaScript, avoids public CDNs and external packages, and exports SAC upload artifacts as two separate downloads: widget.json and a Resource-ZIP containing only root-level component JavaScript files. Use Node's server.mjs fallback when direct file:// use is blocked. When a user explicitly permits public-web use for a non-sensitive desktop prototype, optionally suggest the Custom Widget Builder or live demo; never send tenant material or trust its exports without local validation. See references/local-builder-workflow.md for builder boundaries, export rules, hosted-tool safeguards, and validation checks.


SAP Sample Widget Lessons

Before generating a chart, KPI, hierarchy, input utility, Widget Add-On, or build-based widget, consult references/sap-sample-widget-lessons.md. It audits every SAP sample folder and distills reusable lessons for Data Binding-first scaffolds, root-relative Resource-ZIP URLs, styling/builder panel separation, support flags, custom types, script methods/events, add-on extensions[], and build-based app caveats. Use the lessons for structure and risk checks only; do not copy SAP sample code or assets into generated packages.


Browser Design Runtime

Generated widget packages should include templates/design-runtime/ as a no-build, file-first browser preview scaffold. Use it after generation to mock custom-widget essentials outside SAP, adjust properties/design tokens/sample data/viewports, compare multiple widgets, and export an agent iteration payload. See references/browser-design-runtime.md for runtime boundaries and configuration/export contracts. Use templates/local-builder/ for scaffold generation/export; use templates/design-runtime/ for preview and iteration.


CSS and Styling Compliance

Style custom widgets inside their Web Component/Shadow DOM boundary. Do not rely on SAC optimized story theme CSS, SAP shell selectors, or global story CSS to style widget internals. For generated packages, confirm the hosting mode before splitting CSS/HTML into separate files, because SAC ZIP upload packages support component JavaScript and PNG/JPG icons only. See references/css-and-styling-compliance.md for SAP Help-backed allowed/restricted styling rules.


SAC Import and Packaging

Decide the delivery mode before generating widget.json: SAC Resource-ZIP upload and external HTTPS hosting use different URL rules. For SAC Resource-ZIP upload, deliver widget.json separately, upload it first, and only then upload a Resource-ZIP containing root-level component JavaScript files such as widget.js, builder.js, and styling.js. Do not include widget.json, subfolders, tests, README files, CSS, or HTML in that Resource-ZIP.

For Resource-ZIP manifests, use root-relative component URLs such as "/widget.js"; for external hosting, use complete HTTPS URLs. Keep local-preview paths like "widget.js" in preview-only configs unless the target SAC flow explicitly documents that resolution mode. Model simple configurable colors as string properties with hex defaults such as "#f4f7fa"; use the Color type only after the exact SAC tenant and target panel flow accepts it. Browser preview and Node tests are useful, but they are not proof of SAC importability. For widgets with builder/styling panels, preserve focus and collapse state during text edits, keep component JS self-contained, and validate final outputs/ artifacts rather than source-only previews. When the widget is done, the final chat response must offer both completed upload artifacts for download: the widget.json manifest and the Resource-ZIP. See references/sac-import-packaging-lessons.md for upload sequence, ZIP content checks, final-artifact tests, builder/tree rules, final download handoff, and SAC error triage.


Production Audit Lessons

When a widget is rejected by SAC despite passing local tests, consult references/production-widget-lessons.md. It covers raw control characters in bundles, Analytics Designer method-body limits, required integrity states, client-side-only manifest validation, icon and font isolation, user and language boundaries, bookmark risk, opaque-error bisection, behavioral preflight guards, and browser-preview limits. Treat its evidence labels as part of the guidance: tenant observations, SAP-documented behavior, and unconfirmed hypotheses must not be presented as equivalent.

Property Lifecycle

Treat SAC properties as an external state stream. SAC may deliver properties one at a time, echo values written by the widget, and change their representation. Merge updates, normalize through one read path, and render from the merged state. Do not assume property order or consume builder initialization flags on an empty first render. Manifest method bodies are Analytics Designer script: they may read or write declared properties, but they cannot call private component methods.

Builder and styling panels are stateful editors. Keep text edits targeted so focus, caret, selection, search, and collapse state survive. Preserve unknown configuration keys when two editors share a document, and keep one user action to one property dispatch and one undo step. For structured import or export, preserve stable ids, deep-copy nested templates, use null-prototype maps for user-authored names, and test every language slot. See references/property-lifecycle.md.

Verification and Artifact Discipline

Validate the built component files and final Resource-ZIP, not only source helpers or a browser preview. Generate all outputs first, validate them, then write them. Test the final bundles standalone, verify exact SRI bytes, scan for raw control characters, and use a real browser for layout, focus, font, pointer, and lifecycle behavior that DOM emulation cannot represent. See references/verification-and-artifacts.md.


Plugin Components

This plugin provides specialized agents, commands, and validation hooks for comprehensive widget development support.

Agents
AgentColorPurposeTrigger Examples
widget-architectBlueDesign widget structure, metadata, and integration patterns"design custom widget", "plan widget architecture"
widget-debuggerYellowTroubleshoot loading, data binding, CORS, and runtime issues"widget won't load", "CORS error", "data not binding"
widget-api-assistantGreenWrite JavaScript widget code, lifecycle functions, API integrations"write widget code", "implement lifecycle functions"
Commands
CommandUsageDescription
/widget-validate/widget-validate [file]Validate widget.json schema and widget.js structure
/widget-generate/widget-generateInteractively generate widget scaffold with JSON, JS, local builder, and browser design runtime
/widget-lint/widget-lint [file]Performance, security, and best practices analysis
Validation Hooks

Automatic quality checks triggered on Write/Edit operations:

  • widget.json: Required fields, tag naming, property types, data binding config
  • widget.js: Lifecycle functions, Shadow DOM, propertiesChanged dispatch
  • Performance: Resize debouncing, chart disposal, XSS prevention
  • Context Reminders: Template suggestions, command recommendations
Templates

Ready-to-use scaffolds in templates/ directory:

  • basic-widget.js - Minimal Web Component with all lifecycle functions
  • data-bound-chart.js - ECharts widget with data binding
  • styling-panel.js - Runtime customization panel
  • builder-panel.js - Design-time configuration panel
  • local-builder/ - Static local scaffold builder and SAC artifact exporter
  • design-runtime/ - Browser preview and design iteration runtime
  • widget.json-minimal - Bare-minimum metadata
  • widget.json-complete - Full-featured metadata with all options

Quick Start

Minimal Custom Widget Structure

A custom widget requires two files:

1. widget.json (Metadata)

json
{
  "id": "com.company.mywidget",
  "version": "1.0.0",
  "name": "My Custom Widget",
  "description": "A simple custom widget",
  "vendor": "Company Name",
  "license": "MIT",
  "icon": "",
  "webcomponents": [
    {
      "kind": "main",
      "tag": "my-custom-widget",
      "url": "https://your-host.com/widget.js",
      "integrity": "",
      "ignoreIntegrity": true
    }
  ],
  "properties": {
    "title": {
      "type": "string",
      "default": "My Widget"
    }
  },
  "methods": {},
  "events": {}
}

2. widget.js (Web Component)

javascript
(function() {
  const template = document.createElement("template");
  template.innerHTML = `
    <style>
      :host {
        display: block;
        width: 100%;
        height: 100%;
      }
      .container {
        padding: 16px;
        font-family: Arial, sans-serif;
      }
    </style>
    <div class="container">
      <h3 id="title">My Widget</h3>
      <div id="content"></div>
    </div>
  `;

  class MyCustomWidget extends HTMLElement {
    constructor() {
      super();
      this._shadowRoot = this.attachShadow({ mode: "open" });
      this._shadowRoot.appendChild(template.content.cloneNode(true));
      this._props = {};
    }

    connectedCallback() {
      // Called when element is added to DOM
    }

    onCustomWidgetBeforeUpdate(changedProperties) {
      // Called BEFORE properties are updated
      this._props = { ...this._props, ...changedProperties };
    }

    onCustomWidgetAfterUpdate(changedProperties) {
      // Called AFTER properties are updated - render here
      if (changedProperties.title !== undefined) {
        this._shadowRoot.getElementById("title").textContent = changedProperties.title;
      }
    }

    onCustomWidgetResize() {
      // Called when widget is resized
    }

    onCustomWidgetDestroy() {
      // Cleanup when widget is removed
    }

    // Property getter/setter (required for SAC framework)
    get title() {
      return this._props.title;
    }
    set title(value) {
      this._props.title = value;
      this.dispatchEvent(new CustomEvent("propertiesChanged", {
        detail: { properties: { title: value } }
      }));
    }
  }

  customElements.define("my-custom-widget", MyCustomWidget);
})();

⚠️ Production Note: The ignoreIntegrity: true setting above is development only. For production deployments, generate a SHA256 integrity hash and set ignoreIntegrity: false.


Community Sample Widgets

SAP provides a community sample repository with 17 custom widget sample folders:

Repository: SAP-samples/SAC_Custom_Widgets

CategoryWidgets
ChartsFunnel, Pareto, Sankey, Sunburst, Tree, Line, UI5 Gantt
KPI/GaugeKPI Ring, Gauge Grade, Half Donut, Nested Pie, Custom Pie
UtilitiesFile Upload, Word Cloud, Bar Gradient, Widget Add-on Sample

Requirements: Most samples assume Data Binding and Optimized View Mode (OVM) or Optimized and Unified Story Experience.

Note: Check third-party library licenses before production use, adjust hosted component paths when moving samples, and treat live SAC import/runtime validation as tenant-specific. See references/sap-sample-widget-lessons.md for the per-sample audit and creation lessons.


Key Concepts

Lifecycle Functions

Essential functions called by SAC framework:

  • onCustomWidgetBeforeUpdate(changedProperties) - Pre-update hook
  • onCustomWidgetAfterUpdate(changedProperties) - Post-update (render here)
  • onCustomWidgetResize() - Handle resize events
  • onCustomWidgetDestroy() - Cleanup resources
Data Binding

Configure in widget.json to receive SAC model data:

json
{
  "dataBindings": {
    "myDataBinding": {
      "feeds": [
        {
          "id": "dimensions",
          "description": "Dimensions",
          "type": "dimension"
        },
        {
          "id": "measures",
          "description": "Measures",
          "type": "mainStructureMember"
        }
      ]
    }
  }
}

Access data in JavaScript:

javascript
// Get data binding
const dataBinding = this.dataBindings.getDataBinding("myDataBinding");

// Access result set
const data = this.myDataBinding.data;
const metadata = this.myDataBinding.metadata;

// Iterate over rows
for (let i = 0; i < this.myDataBinding.data.length; i++) {
  const row = this.myDataBinding.data[i];
  const dimensionValue = row.dimensions_0 ? row.dimensions_0.label : "";
  const measureValue = row.measures_0 ? row.measures_0.raw : 0;
}
Hosting Options

1. SAC-Hosted (Recommended, QRC Q2 2023+)

  • Upload files directly to SAC > Files > Public Files
  • For Resource-ZIP upload flows, upload widget.json first, then upload a separate Resource-ZIP when SAC enables the Resource File button
  • For Resource-ZIP upload flows, use root-relative URLs such as "/widget.js"; do not use local Windows backslashes or bare local preview paths in the production manifest
  • Set "integrity": "" and "ignoreIntegrity": true

2. GitHub Pages

  • Create repository with widget files
  • Enable GitHub Pages in Settings
  • Use URL: https://username.github.io/repo/widget.js

3. External Web Server

  • AWS S3, Azure Blob, or any HTTPS server
  • Must include CORS headers: Access-Control-Allow-Origin: *
Security: Integrity Hash

For production, generate a SHA256 integrity value with Node.js for Windows/macOS/Linux:

bash
# Generate integrity hash for widget.js
node -e "const fs=require('node:fs');const crypto=require('node:crypto');const file=process.argv[1]||'widget.js';console.log('sha256-'+crypto.createHash('sha256').update(fs.readFileSync(file)).digest('base64'));" widget.js

# Update JSON
"integrity": "sha256-abc123...",
"ignoreIntegrity": false

On macOS/Linux or Git Bash, OpenSSL is also acceptable; prefix the output with sha256- before adding it to the manifest:

bash
openssl dgst -sha256 -binary widget.js | openssl base64 -A

Show full SKILL.md (1,401 more words)Show less

Common Errors & Solutions

ErrorCauseSolution
"The system couldn't load the custom widget"Incorrect URL or hosting issueVerify URL is accessible, check CORS
"Integrity check failed"Hash mismatchRegenerate hash after JS changes
Widget not appearingMissing connectedCallback renderCall render in onCustomWidgetAfterUpdate
Properties not updatingMissing propertiesChanged dispatchUse dispatchEvent with propertiesChanged
Data not displayingData binding misconfiguredVerify feeds in JSON match usage
CUSTOM_WIDGET_SERVICE_EXCEPTION or opaque HTTP 500Raw control or ambiguous code point, malformed method body, manifest/ZIP pair, or another upload constraintScan source and bundles for control code points, BOM, zero-width characters, and line separators, then use one-variable JSON and ZIP probes
Method body rejected with unknown function or type errorsBody calls component internals instead of using declared propertiesDeclare the state as a property and have the body read or write that property
Manifest rejected for missing integritywebcomponents[] omitted the required fieldAdd integrity and use either development "" plus ignoreIntegrity: true or a real sha256-... digest plus false
Icons render blankIcon name is not bundled or was guessedGenerate and search a committed icon map; do not depend on IconPool inside the widget
Widget has the wrong fontForm controls use their UA font or panel CSS overrides SACInherit the font on controls and avoid custom font stacks in design-time panels
Personal or language value is empty or wrongWidget tried to discover user or SAC locale contextPass it through a declared property from story script
"Color" is not a valid type or default expected as ColorTenant/import flow rejected simple color propertiesUse string plus hex defaults for simple configurable colors
Main component could not be loadedResource URL, ZIP content, or JS syntax problemCheck root-relative webcomponents[].url, Resource-ZIP root contents, then node --check
Resource File upload is disabledwidget.json has not validated yetUpload and validate widget.json first, then upload the Resource-ZIP
Resource-ZIP imports/later load failsZIP contains manifest, folders, CSS/HTML, or unrelated filesKeep only root-level JS component files and optional PNG/JPG icons
Builder input loses focus or collapse stateText edits trigger full renderUpdate field/row/JSON text directly; reserve full render for structural changes
Preview works but SAC component fails standalonePreview depends on a shared source helper not present in bundled JSTest final widget.js, builder.js, and styling.js without preview-only helper scripts
Duplicate menu items collideSubtree duplicate rewrote only root IDRewrite descendant IDs and test uniqueness across the whole tree
Panel shows a value that runtime ignoresProperty is stored or exported but never read by the runtimeAdd a runtime-use check and a behavior test for every manifest property
Valid zero becomes a defaultNumeric coercion uses `Number(value)
Builder loses typed text or search stateEvery update rebuilds the panelPatch fields in place and restore focus, selection, and caret when structural rendering is required
Rename or duplicate leaves stale stateIdentity is positional or a shallow copy aliases nested dataPreserve stable ids, deep-copy templates, and enumerate every reference holder
Layout passes DOM tests but fails in SACTest environment has no layout or font metricsVerify geometry and font-dependent behavior in a real browser
A user-authored name behaves inconsistently by caseMembership checks use exact comparisons in multiple sitesCentralize the matching rule and test a case-only rename

Debugging

Browser DevTools
  1. Open Chrome DevTools (F12)
  2. Sources tab: Find widget.js, set breakpoints
  3. Console tab: View console.log output
  4. Network tab: Check if files load (200 status)
Debug Pattern
javascript
onCustomWidgetAfterUpdate(changedProperties) {
  console.log("Widget updated:", changedProperties);
  console.log("Current props:", this._props);
  console.log("Data binding:", this.myDataBinding && this.myDataBinding.data);
  this._render();
}

Widget Add-Ons (QRC Q4 2023+)

Widget Add-Ons extend built-in SAC widgets without building from scratch.

Use Cases:

  • Customize chart tooltips
  • Add visual elements to plot areas
  • Override built-in styling

Supported Charts: Bar/Column, Stacked Bar/Column, Line, Stacked Area, Numeric Point

Key Differences:

  • Only main and builder components (no styling)
  • Must specify extension target (tooltip, plotArea, numericPoint)
  • SAC provides chart context data via methods

See references/widget-addon-guide.md for complete implementation.


Bundled Resources

Templates (Ready-to-Use Code)
  • templates/basic-widget.js - Minimal Web Component scaffold (~60 lines)
  • templates/data-bound-chart.js - ECharts widget with SAC data binding (~120 lines)
  • templates/styling-panel.js - Styling panel for runtime customization (~150 lines)
  • templates/builder-panel.js - Builder panel for design-time configuration
  • templates/local-builder/ - No-install local builder for metadata, feeds, properties, methods, events, and SAC two-file export
  • templates/design-runtime/ - No-build browser preview, design-token controls, scenario switching, and agent iteration export
  • templates/widget.json-minimal - Bare-minimum metadata (~25 lines)
  • templates/widget.json-complete - Full-featured metadata (~100 lines)
Reference Documentation
  1. references/json-schema-reference.md - Complete JSON schema documentation
  2. references/widget-templates.md - Additional widget template patterns (6 templates)
  3. references/echarts-integration.md - ECharts library integration guide
  4. references/widget-addon-guide.md - Widget Add-On development (QRC Q4 2023+)
  5. references/best-practices-guide.md - Performance, security, and development guidelines
  6. references/advanced-topics.md - Custom types, script API types, installation
  7. references/integration-and-migration.md - Script integration, content transport
  8. references/script-api-reference.md - DataSource, Selection, MemberInfo APIs
  9. references/ai-assisted-composite-generation.md - Prompt-driven generation, RAG, brand styling, validation, and composite-ready output guidance
  10. references/local-builder-workflow.md - Enterprise-safe local builder workflow, export contract, and validation checklist
  11. references/sap-sample-widget-lessons.md - SAP sample widget audit matrix, reusable generation lessons, and add-on/build-based routing caveats
  12. references/browser-design-runtime.md - Non-SAP browser preview runtime, sidecar config, and agent iteration export
  13. references/css-and-styling-compliance.md - SAP Help-backed CSS, theme, Shadow DOM, and packaging guidance for generated widgets
  14. references/sac-import-packaging-lessons.md - SAC-hosted Resource-ZIP upload sequence, URL rules, ZIP hygiene, builder/tree state rules, self-contained component checks, final-artifact tests, and SAC error triage
  15. references/widget-discovery-intake.md - Widget role/data-source selection, attachment intake, Widget Brief, and hosted-tool safeguards
  16. references/production-widget-lessons.md - Tenant-observed upload failures, script method limits, integrity, isolation, bisection, and preflight guards
  17. references/property-lifecycle.md - SAC property normalization, script method boundaries, stateful editors, persistence, and structured data rules
  18. references/verification-and-artifacts.md - Built-bundle verification, test blind spots, mutation evidence, upload triage, and deterministic artifact checks

Primary References (for skill updates):

Sample Widgets:


Version History

Unreleased

  • Added property lifecycle and artifact verification guidance from the consolidated custom-widget lessons, including canonical coercion, stateful panel editing, runtime-use checks, real-browser boundaries, and deterministic final-package checks
  • Clarified hosting-mode URL validation, dangerous Unicode/control-code-point scanning, declared-locale handling, and missing-tool verification outcomes
  • Added production audit lessons for control-character upload failures, property-only Analytics Designer method bodies, required integrity states, opaque-error bisection, isolated icons/fonts, bookmark risks, and behavioral preflight checks
  • Corrected JSON method guidance so manifest method bodies do not call web component internals
  • Added an enterprise-safe templates/local-builder/ scaffold for local widget metadata, property/feed configuration, and SAC two-file artifact export
  • Added templates/builder-panel.js so builder panel generation has a bundled self-contained template
  • Added local builder validation coverage without advancing last_verified; live SAC upload/runtime validation remains pending
  • Added SAP sample-widget lessons and local-builder pattern hints for data-bound charts, KPI/gauge widgets, flow/hierarchy widgets, input utilities, Widget Add-ons, and build-based apps without copying upstream sample code

v2.3.2 (2026-07-06)

  • Added SAC Resource-ZIP import lessons from the Configurable Menu Navigation project
  • Clarified separate widget.json and Resource-ZIP upload flow, root-relative SAC-hosted URLs, Resource-ZIP content hygiene, and simple color property portability
  • Added hook warnings for bare Resource-ZIP component URLs and risky Color property usage
  • Expanded Configurable Menu Navigation lessons for builder focus/collapse state, tree duplicate ID rewrites, self-contained component JS, preview parity, stale panel cleanup, layout/styling property sync, safe output cleanup, and artifact naming
  • Required final chat handoff to offer both the widget.json manifest and Resource-ZIP as separate downloadable artifacts

v2.1.0 (2026-06-12)

  • Refreshed to SAC Q2 2026 (version 2026.8)
  • No custom-widget framework changes in QRC1/QRC2 2026; lifecycle functions and JSON schema unchanged
  • Documented previously missing root-level properties: eula, imports, supportsMobile, supportsExport, supportsLinkedAnalysisFilterOnSelection, supportsViewportLoading, supportsBookmark, types
  • Documented webcomponent type property for ES module loading
  • Documented includeInBookmarks per-property flag, boolean[]/integer[] types
  • Added serializeCustomWidgetToImage() and customWidgetRenderComplete to advanced topics
  • Confirmed: all four lifecycle functions unchanged, feed types unchanged, templates valid

v2.0.0 (2025-12-27)

  • Added 3 specialized agents: widget-architect, widget-debugger, widget-api-assistant
  • Added 3 slash commands: /widget-validate, /widget-generate, /widget-lint
  • Added validation hooks for automatic quality checks on Write/Edit
  • Added 5 docs-audited templates in templates/ directory
  • Enhanced plugin structure to match comprehensive plugin pattern
  • Updated last verified date

v1.2.0 (2025-11-26)

  • Updated SAC version reference to 2025.21
  • Optimized SKILL.md length from 563 to ~200 lines
  • Added Table of Contents to all 8 reference files
  • Improved progressive disclosure architecture

v1.1.0 (2025-11-22)

  • Added Widget Add-On feature documentation (QRC Q4 2023+)
  • Added best practices guide (performance, security, development)
  • Added advanced topics (custom types, script API types, installation)
  • Enhanced description with additional keywords
  • Increased error prevention coverage to 25+

v1.0.0 (2025-11-22)

  • Initial release
  • Complete JSON metadata reference
  • Lifecycle functions documentation
  • Data binding guide
  • Styling panel implementation
  • Hosting options (SAC-hosted, GitHub, external)
  • Security (integrity hash, CORS)
  • Common errors and debugging

SAC Version: 2026.8

© secondsky, GPL-3.0. 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 38 other files (references) in plugins/sap-sac-custom-widget/skills/sap-sac-custom-widget of secondsky/sap-skills.

  • SKILL.md
  • README.md
  • agents/openai.yaml
  • references/advanced-topics.md
  • references/ai-assisted-composite-generation.md
  • references/best-practices-guide.md
  • references/browser-design-runtime.md
  • references/css-and-styling-compliance.md
  • references/echarts-integration.md
  • references/integration-and-migration.md
  • references/json-schema-reference.md
  • references/local-builder-workflow.md
  • references/production-widget-lessons.md
  • references/property-lifecycle.md
  • references/sac-import-packaging-lessons.md
  • references/sap-sample-widget-lessons.md
  • references/script-api-reference.md
  • references/verification-and-artifacts.md
  • references/widget-addon-guide.md
  • … and 20 more

Open the folder on GitHubat commit 652a861

Compare with similar skills

Sap Sac Custom Widget 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.

Sap Sac Custom Widget compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Sap Sac Custom Widget this skillsecondsky/sap-skills462—~8.3kAutomated safety check: NotesGPL-3.0
Aliyun Arms Querycinience/alicloud-skills397—~1.6kAutomated safety check: PassMIT
Doca Flow TuneNVIDIA/skills3.5k—~4.8kAutomated safety check: PassApache-2.0
Matlab Simulate Bluetooth Networkmatlab/matlab-agentic-toolkit1.1k—~1.2kAutomated safety check: PassCustom licence
Kpi Dashboard Patternsrevfactory/harness-1001.3k—~1kAutomated safety check: PassApache-2.0
Pine BacktesterTradersPost/pinescript-agents1701 repos~3.9kAutomated safety check: PassNone

Similar skills

  • Aliyun Arms Query

    cinience/alicloud-skills

    A skill your agent uses when querying distributed traces or application metrics in Alibaba Cloud ARMS (Application Real-Time Monitoring Service).

    397 GitHub stars~1.6k tokensUpdated 1 mo ago
    Business, Finance & HRAuto-check passed
  • Doca Flow Tune

    NVIDIA/skills

    Official

    A skill your agent uses when the user is tuning a live or captured doca-flow pipeline with docaflowtune — snapshotting pipe / counter / KPI state, picking a tuning axis (rule placement, resource…

    3.5k GitHub stars~4.8k tokensUpdated today
    Business, Finance & HRAuto-check passed
  • Matlab Simulate Bluetooth Network

    matlab/matlab-agentic-toolkit

    Simulate Bluetooth system-level networks using the Bluetooth Toolbox.

    1.1k GitHub stars~1.2k tokensUpdated yesterday
    Business, Finance & HRAuto-check passed
  • Kpi Dashboard Patterns

    revfactory/harness-100

    KPI dashboard design pattern. An agent skill from revfactory/harness-100.

    1.3k GitHub stars~1k tokensUpdated 6 mo ago
    Business, Finance & HRAuto-check passed
  • Pine Backtester

    TradersPost/pinescript-agents

    Implements comprehensive backtesting and performance metrics.

    170 GitHub starsUsed in 1 repo~3.9k tokens
    Business, Finance & HRAuto-check passed
  • Openscript

    marketcalls/openalgo

    Write an OpenScript study or strategy for OpenAlgo, and install it into strategies/openscript/ only after it compiles.

    2.8k GitHub stars~2.3k tokensUpdated today
    Business, Finance & HRAuto-check: notes

More from secondsky/sap-skills

All 41 skills in this repo
  • Sap Rpt1

    secondsky/sap-skills

    SAP-RPT-1-OSS local tabular prediction workflows for FI/CO prototype datasets.

    462 GitHub stars~1.8k tokensUpdated 4 days ago
    Auto-check: notes
  • Dependency Upgrade

    secondsky/sap-skills

    Secure dependency upgrades with supply chain protection, cooldowns, and staged rollout.

    462 GitHub stars~4.8k tokensUpdated 4 days ago
    Auto-check: warnings
  • Sap Abap

    secondsky/sap-skills

    Comprehensive ABAP development skill for SAP systems. An agent skill from secondsky/sap-skills.

    462 GitHub stars~3.9k tokensUpdated 4 days ago
    Auto-check passed
  • Sap Dependency Security

    secondsky/sap-skills

    SAP dependency security and MCP executable trust policy with secure upgrades, cooldowns, staged rollout, and supply-chain protection.

    462 GitHub stars~5.9k tokensUpdated 4 days ago
    Auto-check: warnings
  • Sap Abap Cds

    secondsky/sap-skills

    Comprehensive SAP ABAP CDS (Core Data Services) reference for data modeling, view development, and semantic enrichment.

    462 GitHub stars~4.2k tokensUpdated 4 days ago
    Auto-check passed
  • Sap AI Core

    secondsky/sap-skills

    Guides development with SAP AI Core and SAP AI Launchpad for enterprise AI/ML workloads on SAP BTP.

    462 GitHub stars~3.3k tokensUpdated 4 days ago
    Auto-check passed

Works with

Questions about Sap Sac Custom Widget

What does Sap Sac Custom Widget do?

SAP Analytics Cloud (SAC) Custom Widget development. An agent skill from secondsky/sap-skills. Sap Sac Custom Widget is an agent skill from secondsky/sap-skills. SAP Analytics Cloud (SAC) Custom Widget development.

When should I use Sap Sac Custom Widget?

Sap Sac Custom Widget fits situations like: building custom visualizations; extending SAC with Web Components; creating Widget Add-Ons.

How do I install Sap Sac Custom Widget in Claude Code?

Run `npx skills add secondsky/sap-skills --skill sap-sac-custom-widget -a claude-code`. Or copy the skill folder (plugins/sap-sac-custom-widget/skills/sap-sac-custom-widget in secondsky/sap-skills) into .claude/skills/sap-sac-custom-widget in your project. Claude Code loads it when a task matches its description.

How do I install Sap Sac Custom Widget in Codex?

Run `npx skills add secondsky/sap-skills --skill sap-sac-custom-widget -a codex`. Or copy the skill folder (plugins/sap-sac-custom-widget/skills/sap-sac-custom-widget in secondsky/sap-skills) into .agents/skills/sap-sac-custom-widget in your project. Codex loads it when a task matches its description.

Can I use Sap Sac Custom Widget 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 secondsky/sap-skills --skill sap-sac-custom-widget -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/sap-sac-custom-widget, .gemini/skills/sap-sac-custom-widget, .github/skills/sap-sac-custom-widget and .opencode/skills/sap-sac-custom-widget in your project.

What does Sap Sac Custom Widget need to run?

Going by SKILL.md and its folder, Sap Sac Custom Widget needs the command-line tools its instructions call (node and openssl). Its frontmatter pre-approves these tools: Read, Bash, WebFetch.

Does Sap Sac Custom Widget access the network?

SKILL.md names 4 domains. In commands or code: username.github.io; the agent is likely to contact it when it follows the instructions. As links in the text: github.com, help.sap.com and custom-widgets.de. This is read from the text; nothing was executed.

Is Sap Sac Custom Widget safe to install?

Our automated static check of SKILL.md found notes only (pre-approves every shell command (allowed-tools: bash)), nothing it rates as a warning. It is not a guarantee. Review the folder before installing.

What licence does Sap Sac Custom Widget use?

Sap Sac Custom Widget is published under the GPL-3.0 licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Sap Sac Custom Widget use?

About 8.3k tokens (SKILL.md is roughly 33k 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 61k tokens, read only when the agent opens those files.

What are the alternatives to Sap Sac Custom Widget?

Skills that share tags, products or a category with Sap Sac Custom Widget: Aliyun Arms Query (cinience/alicloud-skills, 397 stars), Doca Flow Tune (NVIDIA/skills, 3.5k stars), Matlab Simulate Bluetooth Network (matlab/matlab-agentic-toolkit, 1.1k stars) and Kpi Dashboard Patterns (revfactory/harness-100, 1.3k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Sap Sac Custom Widget?

secondsky (a GitHub user) maintains it in secondsky/sap-skills, which has 462 GitHub stars. The repository holds 41 skills in this directory. The repository was last updated on October 5, 2026.

Source: secondsky/sap-skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.