{"id":"c3bc7475-fd7f-4947-9d42-a2f76a73915c","shortId":"ZW3fs3","kind":"skill","title":"swift-charts","tagline":"Implement, review, or improve data visualizations using Swift Charts. Use when building bar, line, area, point, pie, or donut charts; when adding chart selection, scrolling, or annotations; when plotting functions with vectorized BarPlot, LinePlot, AreaPlot, or PointPlot; when cu","description":"# Swift Charts\n\nBuild data visualizations with Swift Charts targeting iOS 26+. Compose marks\ninside a `Chart` container, configure axes and scales with view modifiers, and\nuse vectorized plots for large datasets.\n\nSee [references/charts-patterns.md](references/charts-patterns.md) for extended patterns, accessibility, and\ntheming guidance.\n\n## Contents\n\n- [Workflow](#workflow)\n- [Chart Container](#chart-container)\n- [Mark Types](#mark-types)\n- [Axis Customization](#axis-customization)\n- [Scale Configuration](#scale-configuration)\n- [Foreground Style and Encoding](#foreground-style-and-encoding)\n- [Selection (iOS 17+)](#selection-ios-17)\n- [Scrollable Charts (iOS 17+)](#scrollable-charts-ios-17)\n- [Annotations](#annotations)\n- [Legend](#legend)\n- [Vectorized Plots (iOS 18+)](#vectorized-plots-ios-18)\n- [Common Mistakes](#common-mistakes)\n- [Review Checklist](#review-checklist)\n- [References](#references)\n\n## Workflow\n\n### 1. Build a new chart\n\n1. Define data as an `Identifiable` struct or use `id:` key path.\n2. Choose mark type(s): `BarMark`, `LineMark`, `PointMark`, `AreaMark`,\n   `RuleMark`, `RectangleMark`, or `SectorMark`.\n3. Wrap marks in a `Chart` container.\n4. Encode visual channels: `.foregroundStyle(by:)`, `.symbol(by:)`, `.lineStyle(by:)`.\n5. Configure axes with `.chartXAxis` / `.chartYAxis`.\n6. Set scale domains with `.chartXScale(domain:)` / `.chartYScale(domain:)`.\n7. Add selection, scrolling, or annotations as needed.\n8. For 1000+ data points, use vectorized plots (`BarPlot`, `LinePlot`, etc.).\n\n### 2. Review existing chart code\n\nRun through the Review Checklist at the end of this file.\n\n## Chart Container\n\n```swift\n// Data-driven init (single-series)\nChart(sales) { item in\n    BarMark(x: .value(\"Month\", item.month), y: .value(\"Revenue\", item.revenue))\n}\n\n// Content closure init (multi-series, mixed marks)\nChart {\n    ForEach(seriesA) { item in\n        LineMark(x: .value(\"Date\", item.date), y: .value(\"Value\", item.value))\n            .foregroundStyle(.blue)\n    }\n    RuleMark(y: .value(\"Target\", 500))\n        .foregroundStyle(.red)\n}\n\n// Custom ID key path\nChart(data, id: \\.category) { item in\n    BarMark(x: .value(\"Category\", item.category), y: .value(\"Count\", item.count))\n}\n```\n\n## Mark Types\n\n### BarMark (iOS 16+)\n\n```swift\n// Vertical bar\nBarMark(x: .value(\"Month\", item.month), y: .value(\"Sales\", item.sales))\n\n// Stacked by category (automatic when same x maps to multiple bars)\nBarMark(x: .value(\"Month\", item.month), y: .value(\"Sales\", item.sales))\n    .foregroundStyle(by: .value(\"Product\", item.product))\n\n// Horizontal bar\nBarMark(x: .value(\"Sales\", item.sales), y: .value(\"Month\", item.month))\n\n// Interval bar (Gantt chart)\nBarMark(\n    xStart: .value(\"Start\", item.start),\n    xEnd: .value(\"End\", item.end),\n    y: .value(\"Task\", item.task)\n)\n```\n\n### LineMark (iOS 16+)\n\n```swift\n// Single line\nLineMark(x: .value(\"Date\", item.date), y: .value(\"Price\", item.price))\n\n// Multi-series via foregroundStyle encoding\nLineMark(x: .value(\"Date\", item.date), y: .value(\"Temp\", item.temp))\n    .foregroundStyle(by: .value(\"City\", item.city))\n    .interpolationMethod(.catmullRom)\n\n// Multi-series with explicit series parameter\nLineMark(\n    x: .value(\"Date\", item.date),\n    y: .value(\"Price\", item.price),\n    series: .value(\"Ticker\", item.ticker)\n)\n```\n\n### PointMark (iOS 16+)\n\n```swift\nPointMark(x: .value(\"Height\", item.height), y: .value(\"Weight\", item.weight))\n    .foregroundStyle(by: .value(\"Species\", item.species))\n    .symbol(by: .value(\"Species\", item.species))\n    .symbolSize(100)\n```\n\n### AreaMark (iOS 16+)\n\n```swift\n// Stacked area\nAreaMark(x: .value(\"Date\", item.date), y: .value(\"Sales\", item.sales))\n    .foregroundStyle(by: .value(\"Category\", item.category))\n\n// Range band\nAreaMark(\n    x: .value(\"Date\", item.date),\n    yStart: .value(\"Min\", item.min),\n    yEnd: .value(\"Max\", item.max)\n)\n.opacity(0.3)\n```\n\n### RuleMark (iOS 16+)\n\n```swift\nRuleMark(y: .value(\"Target\", 9000))\n    .foregroundStyle(.red)\n    .lineStyle(StrokeStyle(dash: [5, 3]))\n    .annotation(position: .top, alignment: .leading) {\n        Text(\"Target\").font(.caption).foregroundStyle(.red)\n    }\n```\n\n### RectangleMark (iOS 16+)\n\n```swift\nRectangleMark(x: .value(\"Hour\", item.hour), y: .value(\"Day\", item.day))\n    .foregroundStyle(by: .value(\"Intensity\", item.intensity))\n```\n\n### SectorMark (iOS 17+)\n\n```swift\n// Pie chart\nChart(data, id: \\.name) { item in\n    SectorMark(angle: .value(\"Sales\", item.sales))\n        .foregroundStyle(by: .value(\"Category\", item.name))\n}\n\n// Donut chart\nChart(data, id: \\.name) { item in\n    SectorMark(\n        angle: .value(\"Sales\", item.sales),\n        innerRadius: .ratio(0.618),\n        outerRadius: .inset(10),\n        angularInset: 1\n    )\n    .cornerRadius(4)\n    .foregroundStyle(by: .value(\"Category\", item.name))\n}\n```\n\n## Axis Customization\n\n```swift\n// Hide axes\n.chartXAxis(.hidden)\n.chartYAxis(.hidden)\n\n// Custom axis content\n.chartXAxis {\n    AxisMarks(values: .stride(by: .month)) { value in\n        AxisGridLine()\n        AxisTick()\n        AxisValueLabel(format: .dateTime.month(.abbreviated))\n    }\n}\n\n// Multiple AxisMarks compositions (different intervals for grid vs. labels)\n.chartXAxis {\n    AxisMarks(values: .stride(by: .day)) { _ in AxisGridLine() }\n    AxisMarks(values: .stride(by: .week)) { _ in\n        AxisTick()\n        AxisValueLabel(format: .dateTime.week())\n    }\n}\n\n// Axis labels (titles)\n.chartXAxisLabel(\"Time\", position: .bottom, alignment: .center)\n.chartYAxisLabel(\"Revenue ($)\", position: .leading, alignment: .center)\n```\n\n## Scale Configuration\n\n```swift\n.chartYScale(domain: 0...100)                          // Explicit numeric domain\n.chartYScale(domain: .automatic(includesZero: true))   // Include zero\n.chartYScale(domain: 1...10000, type: .log)            // Logarithmic scale\n.chartXScale(domain: [\"Mon\", \"Tue\", \"Wed\", \"Thu\"])     // Categorical ordering\n```\n\n## Foreground Style and Encoding\n\n```swift\nBarMark(...).foregroundStyle(.blue)                                    // Static color\nBarMark(...).foregroundStyle(by: .value(\"Category\", item.category))   // Data encoding\nAreaMark(...).foregroundStyle(                                         // Gradient\n    .linearGradient(colors: [.blue, .cyan], startPoint: .bottom, endPoint: .top)\n)\n```\n\n## Selection (iOS 17+)\n\n```swift\n@State private var selectedDate: Date?\n@State private var selectedRange: ClosedRange<Date>?\n@State private var selectedAngle: String?\n\n// Point selection\nChart(data) { item in\n    LineMark(x: .value(\"Date\", item.date), y: .value(\"Value\", item.value))\n}\n.chartXSelection(value: $selectedDate)\n\n// Range selection\n.chartXSelection(range: $selectedRange)\n\n// Angular selection (pie/donut)\n.chartAngleSelection(value: $selectedAngle)\n```\n\n## Scrollable Charts (iOS 17+)\n\n```swift\nChart(dailyData) { item in\n    BarMark(x: .value(\"Date\", item.date, unit: .day), y: .value(\"Steps\", item.steps))\n}\n.chartScrollableAxes(.horizontal)\n.chartXVisibleDomain(length: 3600 * 24 * 7) // 7 days visible\n.chartScrollPosition(initialX: latestDate)\n.chartScrollTargetBehavior(\n    .valueAligned(matching: DateComponents(hour: 0), majorAlignment: .page)\n)\n```\n\n## Annotations\n\n```swift\nBarMark(x: .value(\"Month\", item.month), y: .value(\"Sales\", item.sales))\n    .annotation(position: .top, alignment: .center, spacing: 4) {\n        Text(\"\\(item.sales, format: .number)\").font(.caption2)\n    }\n\n// Overflow resolution\n.annotation(\n    position: .top,\n    overflowResolution: .init(x: .fit(to: .chart), y: .padScale)\n) { Text(\"Label\") }\n```\n\n## Legend\n\n```swift\n.chartLegend(.hidden)                                           // Hide\n.chartLegend(position: .bottom, alignment: .center, spacing: 10) // Position\n.chartLegend(position: .bottom) {                                // Custom\n    HStack {\n        ForEach(categories, id: \\.self) { cat in\n            Label(cat, systemImage: \"circle.fill\").font(.caption)\n        }\n    }\n}\n```\n\n## Vectorized Plots (iOS 18+)\n\nUse for large datasets (1000+ points). Accept entire collections or functions.\n\n```swift\n// Data-driven\nChart {\n    BarPlot(sales, x: .value(\"Month\", \\.month), y: .value(\"Revenue\", \\.revenue))\n        .foregroundStyle(\\.barColor)\n}\n\n// Function plotting: y = f(x)\nChart {\n    LinePlot(x: \"x\", y: \"y\", domain: -5...5) { x in sin(x) }\n}\n\n// Parametric: (x, y) = f(t)\nChart {\n    LinePlot(x: \"x\", y: \"y\", t: \"t\", domain: 0...(2 * .pi)) { t in\n        (x: cos(t), y: sin(t))\n    }\n}\n```\n\nApply KeyPath-based modifiers before simple-value modifiers:\n\n```swift\nBarPlot(data, x: .value(\"X\", \\.x), y: .value(\"Y\", \\.y))\n    .foregroundStyle(\\.color)    // KeyPath first\n    .opacity(0.8)                // Value modifier second\n```\n\n## Common Mistakes\n\n### 1. Using ObservableObject instead of @Observable\n\n```swift\n// WRONG\nclass ChartModel: ObservableObject {\n    @Published var data: [Sale] = []\n}\nstruct ChartView: View {\n    @StateObject private var model = ChartModel()\n}\n\n// CORRECT\n@Observable class ChartModel {\n    var data: [Sale] = []\n}\nstruct ChartView: View {\n    @State private var model = ChartModel()\n}\n```\n\n### 2. Missing series parameter for multi-line charts\n\n```swift\n// WRONG -- all points connect into one line\nChart {\n    ForEach(allCities) { item in\n        LineMark(x: .value(\"Date\", item.date), y: .value(\"Temp\", item.temp))\n    }\n}\n\n// CORRECT -- separate lines per city\nChart {\n    ForEach(allCities) { item in\n        LineMark(x: .value(\"Date\", item.date), y: .value(\"Temp\", item.temp))\n            .foregroundStyle(by: .value(\"City\", item.city))\n    }\n}\n```\n\n### 3. Too many SectorMark slices\n\n```swift\n// WRONG -- 20 tiny sectors are unreadable\nChart(twentyCategories, id: \\.name) { item in\n    SectorMark(angle: .value(\"Value\", item.value))\n}\n\n// CORRECT -- group into top 5 + \"Other\"\nChart(groupedData, id: \\.name) { item in\n    SectorMark(angle: .value(\"Value\", item.value))\n        .foregroundStyle(by: .value(\"Category\", item.name))\n}\n```\n\n### 4. Missing scale domain when zero-baseline matters\n\n```swift\n// WRONG -- axis starts at ~95; small changes look dramatic\nChart(data) {\n    LineMark(x: .value(\"Day\", $0.day), y: .value(\"Score\", $0.score))\n}\n\n// CORRECT -- explicit domain for honest representation\nChart(data) {\n    LineMark(x: .value(\"Day\", $0.day), y: .value(\"Score\", $0.score))\n}\n.chartYScale(domain: 0...100)\n```\n\n### 5. Static foregroundStyle overriding data encoding\n\n```swift\n// WRONG -- static color overrides by-value encoding\nBarMark(x: .value(\"X\", item.x), y: .value(\"Y\", item.y))\n    .foregroundStyle(by: .value(\"Category\", item.category))\n    .foregroundStyle(.blue)\n\n// CORRECT -- use only the data encoding\nBarMark(x: .value(\"X\", item.x), y: .value(\"Y\", item.y))\n    .foregroundStyle(by: .value(\"Category\", item.category))\n```\n\n### 6. Individual marks for 10,000+ data points\n\n```swift\n// WRONG -- creates 10,000 mark views; slow\nChart(largeDataset) { item in\n    PointMark(x: .value(\"X\", item.x), y: .value(\"Y\", item.y))\n}\n\n// CORRECT -- vectorized plot (iOS 18+)\nChart {\n    PointPlot(largeDataset, x: .value(\"X\", \\.x), y: .value(\"Y\", \\.y))\n}\n```\n\n### 7. Fixed chart height breaking Dynamic Type\n\n```swift\n// WRONG -- clips axis labels at large text sizes\nChart(data) { ... }\n    .frame(height: 200)\n\n// CORRECT -- adaptive sizing\nChart(data) { ... }\n    .frame(minHeight: 200, maxHeight: 400)\n```\n\n### 8. KeyPath modifier after value modifier on vectorized plots\n\n```swift\n// WRONG -- compiler error\nBarPlot(data, x: .value(\"X\", \\.x), y: .value(\"Y\", \\.y))\n    .opacity(0.8)\n    .foregroundStyle(\\.color)\n\n// CORRECT -- KeyPath modifiers first\nBarPlot(data, x: .value(\"X\", \\.x), y: .value(\"Y\", \\.y))\n    .foregroundStyle(\\.color)\n    .opacity(0.8)\n```\n\n### 9. Missing accessibility labels\n\n```swift\n// WRONG -- VoiceOver users get no context\nChart(data) {\n    BarMark(x: .value(\"Month\", $0.month), y: .value(\"Sales\", $0.sales))\n}\n\n// CORRECT -- add per-mark accessibility\nChart(data) { item in\n    BarMark(x: .value(\"Month\", item.month), y: .value(\"Sales\", item.sales))\n        .accessibilityLabel(\"\\(item.month)\")\n        .accessibilityValue(\"\\(item.sales) units sold\")\n}\n```\n\n## Review Checklist\n\n- [ ] Data model uses `Identifiable` or chart uses `id:` key path\n- [ ] Model uses `@Observable` with `@State`, not `ObservableObject`\n- [ ] Mark type matches goal (bar=comparison, line=trend, sector=proportion)\n- [ ] Multi-series lines use `series:` parameter or `.foregroundStyle(by:)`\n- [ ] Axes configured with appropriate labels, ticks, and grid lines\n- [ ] Scale domain set explicitly when zero-baseline matters\n- [ ] Pie/donut limited to 5-7 sectors; small values grouped into \"Other\"\n- [ ] Selection binding type matches axis data type (`Date?` for date axis)\n- [ ] Scrollable charts set `.chartXVisibleDomain(length:)` for viewport\n- [ ] Vectorized plots used for datasets exceeding 1000 points\n- [ ] KeyPath modifiers applied before value modifiers on vectorized plots\n- [ ] Accessibility labels added to marks for VoiceOver\n- [ ] Chart tested with Dynamic Type and Dark Mode\n- [ ] Legend visible and positioned, or intentionally hidden\n- [ ] Ensure chart data model types are Sendable; update chart data on @MainActor\n\n## References\n\n- Extended patterns: [references/charts-patterns.md](references/charts-patterns.md)\n- Apple docs: [Swift Charts](https://sosumi.ai/documentation/charts)\n- Apple docs: [Creating a chart using Swift Charts](https://sosumi.ai/documentation/charts/Creating-a-chart-using-Swift-Charts)","tags":["swift","charts","ios","skills","dpearson2699","accessibility","agent-skills","ai-coding","apple","claude-code","codex-skills","cursor-skills"],"capabilities":["skill","source-dpearson2699","skill-swift-charts","topic-accessibility","topic-agent-skills","topic-ai-coding","topic-apple","topic-claude-code","topic-codex-skills","topic-cursor-skills","topic-ios","topic-ios-development","topic-liquid-glass","topic-localization","topic-mapkit"],"categories":["swift-ios-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/dpearson2699/swift-ios-skills/swift-charts","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add dpearson2699/swift-ios-skills","source_repo":"https://github.com/dpearson2699/swift-ios-skills","install_from":"skills.sh"}},"qualityScore":"0.700","qualityRationale":"deterministic score 0.70 from registry signals: · indexed on github topic:agent-skills · 599 github stars · SKILL.md body (13,450 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-18T18:53:44.696Z","embedding":null,"createdAt":"2026-04-18T20:33:36.527Z","updatedAt":"2026-05-18T18:53:44.696Z","lastSeenAt":"2026-05-18T18:53:44.696Z","tsv":"'-5':944 '-7':1476 '/documentation/charts)':1563 '/documentation/charts/creating-a-chart-using-swift-charts)':1574 '0':685,828,964,1194 '0.3':516 '0.618':599 '0.8':1001,1347,1367 '0.day':1170,1187 '0.month':1385 '0.sales':1389 '0.score':1174,1191 '000':1252,1259 '1':158,163,604,699,1007 '10':602,881,1251,1258 '100':479,686,1195 '1000':230,908,1507 '10000':700 '16':332,400,457,482,519,546 '17':118,122,126,131,564,744,793 '18':139,144,903,1280 '2':175,239,965,1045 '20':1107 '200':1312,1320 '24':815 '26':53 '3':188,532,1100 '3600':814 '4':195,606,848,1145 '400':1322 '5':205,531,945,1127,1196,1475 '500':306 '6':211,1247 '7':220,816,817,1292 '8':228,1323 '9':1368 '9000':525 '95':1159 'abbrevi':637 'accept':910 'access':80,1370,1395,1518 'accessibilitylabel':1409 'accessibilityvalu':1411 'ad':25,1520 'adapt':1314 'add':221,1391 'align':536,672,678,845,878 'allciti':1064,1083 'angl':575,593,1119,1136 'angular':784 'angularinset':603 'annot':30,132,133,225,533,831,842,857 'appl':1557,1564 'appli':975,1511 'appropri':1457 'area':18,485 'areamark':183,480,486,502,731 'areaplot':38 'automat':348,692 'axe':61,207,616,1454 'axi':97,100,612,622,665,1156,1302,1487,1493 'axis-custom':99 'axisgridlin':632,654 'axismark':625,639,648,655 'axistick':633,661 'axisvaluelabel':634,662 'band':501 'bar':16,335,355,371,382,1438 'barcolor':931 'barmark':180,269,319,330,336,356,372,385,718,723,799,833,1211,1233,1381,1400 'barplot':36,236,920,986,1336,1354 'base':978 'baselin':1152,1470 'bind':1484 'blue':301,720,736,1226 'bottom':671,739,877,885 'break':1296 'build':15,45,159 'by-valu':1207 'caption':541,899 'caption2':854 'cat':892,895 'categor':711 'categori':316,322,347,498,582,610,727,889,1143,1223,1245 'catmullrom':434 'center':673,679,846,879 'chang':1161 'channel':198 'chart':3,12,23,26,44,50,58,87,90,124,129,162,193,242,255,265,286,313,384,567,568,585,586,763,791,795,865,919,937,955,1053,1062,1081,1112,1129,1164,1181,1263,1281,1294,1308,1316,1379,1396,1422,1495,1525,1541,1548,1560,1568,1571 'chart-contain':89 'chartangleselect':787 'chartlegend':872,875,883 'chartmodel':1016,1029,1033,1044 'chartscrollableax':810 'chartscrollposit':820 'chartscrolltargetbehavior':823 'chartview':1023,1038 'chartxaxi':209,617,624,647 'chartxaxislabel':668 'chartxscal':216,705 'chartxselect':776,781 'chartxvisibledomain':812,1497 'chartyaxi':210,619 'chartyaxislabel':674 'chartyscal':218,683,690,697,1192 'checklist':151,154,248,1416 'choos':176 'circle.fill':897 'citi':431,1080,1098 'class':1015,1032 'clip':1301 'closedrang':755 'closur':279 'code':243 'collect':912 'color':722,735,997,1205,1349,1365 'common':145,148,1005 'common-mistak':147 'comparison':1439 'compil':1334 'compos':54 'composit':640 'configur':60,103,106,206,681,1455 'connect':1058 'contain':59,88,91,194,256 'content':84,278,623 'context':1378 'cornerradius':605 'correct':1030,1076,1123,1175,1227,1276,1313,1350,1390 'cos':970 'count':326 'creat':1257,1566 'cu':42 'custom':98,101,309,613,621,886 'cyan':737 'dailydata':796 'dark':1531 'dash':530 'data':8,46,165,231,259,314,569,587,729,764,917,987,1020,1035,1165,1182,1200,1231,1253,1309,1317,1337,1355,1380,1397,1417,1488,1542,1549 'data-driven':258,916 'dataset':73,907,1505 'date':294,407,422,445,489,505,750,770,802,1070,1089,1490,1492 'datecompon':826 'datetime.month':636 'datetime.week':664 'day':555,652,805,818,1169,1186 'defin':164 'differ':641 'doc':1558,1565 'domain':214,217,219,684,689,691,698,706,943,963,1148,1177,1193,1464 'donut':22,584 'dramat':1163 'driven':260,918 'dynam':1297,1528 'encod':110,115,196,418,716,730,1201,1210,1232 'end':251,392 'endpoint':740 'ensur':1540 'entir':911 'error':1335 'etc':238 'exceed':1506 'exist':241 'explicit':439,687,1176,1466 'extend':78,1553 'f':935,953 'file':254 'first':999,1353 'fit':863 'fix':1293 'font':540,853,898 'foreach':287,888,1063,1082 'foreground':107,112,713 'foreground-style-and-encod':111 'foregroundstyl':199,300,307,365,417,428,468,495,526,542,557,579,607,719,724,732,930,996,1095,1140,1198,1220,1225,1242,1348,1364,1452 'format':635,663,851 'frame':1310,1318 'function':33,914,932 'gantt':383 'get':1376 'goal':1437 'gradient':733 'grid':644,1461 'group':1124,1480 'groupeddata':1130 'guidanc':83 'height':462,1295,1311 'hidden':618,620,873,1539 'hide':615,874 'honest':1179 'horizont':370,811 'hour':551,827 'hstack':887 'id':172,310,315,570,588,890,1114,1131,1424 'identifi':168,1420 'implement':4 'improv':7 'includ':695 'includeszero':693 'individu':1248 'init':261,280,861 'initialx':821 'innerradius':597 'inset':601 'insid':56 'instead':1010 'intens':560 'intent':1538 'interpolationmethod':433 'interv':381,642 'io':52,117,121,125,130,138,143,331,399,456,481,518,545,563,743,792,902,1279 'item':267,289,317,572,590,765,797,1065,1084,1116,1133,1265,1398 'item.category':323,499,728,1224,1246 'item.city':432,1099 'item.count':327 'item.date':295,408,423,446,490,506,771,803,1071,1090 'item.day':556 'item.end':393 'item.height':463 'item.hour':552 'item.intensity':561 'item.max':514 'item.min':510 'item.month':273,340,360,380,837,1404,1410 'item.name':583,611,1144 'item.price':412,450 'item.product':369 'item.revenue':277 'item.sales':344,364,376,494,578,596,841,850,1408,1412 'item.species':472,477 'item.start':389 'item.steps':809 'item.task':397 'item.temp':427,1075,1094 'item.ticker':454 'item.value':299,775,1122,1139 'item.weight':467 'item.x':1215,1237,1271 'item.y':1219,1241,1275 'key':173,311,1425 'keypath':977,998,1324,1351,1509 'keypath-bas':976 'label':646,666,869,894,1303,1371,1458,1519 'larg':72,906,1305 'largedataset':1264,1283 'latestd':822 'lead':537,677 'legend':134,135,870,1533 'length':813,1498 'limit':1473 'line':17,403,1052,1061,1078,1440,1447,1462 'lineargradi':734 'linemark':181,291,398,404,419,442,767,1067,1086,1166,1183 'lineplot':37,237,938,956 'linestyl':203,528 'log':702 'logarithm':703 'look':1162 'mainactor':1551 'majoralign':829 'mani':1102 'map':352 'mark':55,92,95,177,190,285,328,1249,1260,1394,1434,1522 'mark-typ':94 'match':825,1436,1486 'matter':1153,1471 'max':513 'maxheight':1321 'min':509 'minheight':1319 'miss':1046,1146,1369 'mistak':146,149,1006 'mix':284 'mode':1532 'model':1028,1043,1418,1427,1543 'modifi':66,979,984,1003,1325,1328,1352,1510,1514 'mon':707 'month':272,339,359,379,629,836,924,925,1384,1403 'multi':282,414,436,1051,1445 'multi-lin':1050 'multi-seri':281,413,435,1444 'multipl':354,638 'name':571,589,1115,1132 'need':227 'new':161 'number':852 'numer':688 'observ':1012,1031,1429 'observableobject':1009,1017,1433 'one':1060 'opac':515,1000,1346,1366 'order':712 'outerradius':600 'overflow':855 'overflowresolut':860 'overrid':1199,1206 'padscal':867 'page':830 'paramet':441,1048,1450 'parametr':950 'path':174,312,1426 'pattern':79,1554 'per':1079,1393 'per-mark':1392 'pi':966 'pie':20,566 'pie/donut':786,1472 'plot':32,70,137,142,235,901,933,1278,1331,1502,1517 'point':19,232,761,909,1057,1254,1508 'pointmark':182,455,459,1267 'pointplot':40,1282 'posit':534,670,676,843,858,876,882,884,1536 'price':411,449 'privat':747,752,757,1026,1041 'product':368 'proport':1443 'publish':1018 'rang':500,779,782 'ratio':598 'rectanglemark':185,544,548 'red':308,527,543 'refer':155,156,1552 'references/charts-patterns.md':75,76,1555,1556 'represent':1180 'resolut':856 'revenu':276,675,928,929 'review':5,150,153,240,247,1415 'review-checklist':152 'rulemark':184,302,517,521 'run':244 'sale':266,343,363,375,493,577,595,840,921,1021,1036,1388,1407 'scale':63,102,105,213,680,704,1147,1463 'scale-configur':104 'score':1173,1190 'scroll':28,223 'scrollabl':123,128,790,1494 'scrollable-charts-io':127 'second':1004 'sector':1109,1442,1477 'sectormark':187,562,574,592,1103,1118,1135 'see':74 'select':27,116,120,222,742,762,780,785,1483 'selectedangl':759,789 'selectedd':749,778 'selectedrang':754,783 'selection-io':119 'self':891 'sendabl':1546 'separ':1077 'seri':264,283,415,437,440,451,1047,1446,1449 'seriesa':288 'set':212,1465,1496 'simpl':982 'simple-valu':981 'sin':948,973 'singl':263,402 'single-seri':262 'size':1307,1315 'skill' 'skill-swift-charts' 'slice':1104 'slow':1262 'small':1160,1478 'sold':1414 'sosumi.ai':1562,1573 'sosumi.ai/documentation/charts)':1561 'sosumi.ai/documentation/charts/creating-a-chart-using-swift-charts)':1572 'source-dpearson2699' 'space':847,880 'speci':471,476 'stack':345,484 'start':388,1157 'startpoint':738 'state':746,751,756,1040,1431 'stateobject':1025 'static':721,1197,1204 'step':808 'stride':627,650,657 'string':760 'strokestyl':529 'struct':169,1022,1037 'style':108,113,714 'swift':2,11,43,49,257,333,401,458,483,520,547,565,614,682,717,745,794,832,871,915,985,1013,1054,1105,1154,1202,1255,1299,1332,1372,1559,1570 'swift-chart':1 'symbol':201,473 'symbols':478 'systemimag':896 'target':51,305,524,539 'task':396 'temp':426,1074,1093 'test':1526 'text':538,849,868,1306 'theme':82 'thu':710 'tick':1459 'ticker':453 'time':669 'tini':1108 'titl':667 'top':535,741,844,859,1126 'topic-accessibility' 'topic-agent-skills' 'topic-ai-coding' 'topic-apple' 'topic-claude-code' 'topic-codex-skills' 'topic-cursor-skills' 'topic-ios' 'topic-ios-development' 'topic-liquid-glass' 'topic-localization' 'topic-mapkit' 'trend':1441 'true':694 'tue':708 'twentycategori':1113 'type':93,96,178,329,701,1298,1435,1485,1489,1529,1544 'unit':804,1413 'unread':1111 'updat':1547 'use':10,13,68,171,233,904,1008,1228,1419,1423,1428,1448,1503,1569 'user':1375 'valu':271,275,293,297,298,304,321,325,338,342,358,362,367,374,378,387,391,395,406,410,421,425,430,444,448,452,461,465,470,475,488,492,497,504,508,512,523,550,554,559,576,581,594,609,626,630,649,656,726,769,773,774,777,788,801,807,835,839,923,927,983,989,993,1002,1069,1073,1088,1092,1097,1120,1121,1137,1138,1142,1168,1172,1185,1189,1209,1213,1217,1222,1235,1239,1244,1269,1273,1285,1289,1327,1339,1343,1357,1361,1383,1387,1402,1406,1479,1513 'valuealign':824 'var':748,753,758,1019,1027,1034,1042 'vector':35,69,136,141,234,900,1277,1330,1501,1516 'vectorized-plots-io':140 'vertic':334 'via':416 'view':65,1024,1039,1261 'viewport':1500 'visibl':819,1534 'visual':9,47,197 'voiceov':1374,1524 'vs':645 'wed':709 'week':659 'weight':466 'workflow':85,86,157 'wrap':189 'wrong':1014,1055,1106,1155,1203,1256,1300,1333,1373 'x':270,292,320,337,351,357,373,405,420,443,460,487,503,549,768,800,834,862,922,936,939,940,946,949,951,957,958,969,988,990,991,1068,1087,1167,1184,1212,1214,1234,1236,1268,1270,1284,1286,1287,1338,1340,1341,1356,1358,1359,1382,1401 'xend':390 'xstart':386 'y':274,296,303,324,341,361,377,394,409,424,447,464,491,522,553,772,806,838,866,926,934,941,942,952,959,960,972,992,994,995,1072,1091,1171,1188,1216,1218,1238,1240,1272,1274,1288,1290,1291,1342,1344,1345,1360,1362,1363,1386,1405 'yend':511 'ystart':507 'zero':696,1151,1469 'zero-baselin':1150,1468","prices":[{"id":"e403b206-5083-42aa-8786-813602e12e40","listingId":"c3bc7475-fd7f-4947-9d42-a2f76a73915c","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"dpearson2699","category":"swift-ios-skills","install_from":"skills.sh"},"createdAt":"2026-04-18T20:33:36.527Z"}],"sources":[{"listingId":"c3bc7475-fd7f-4947-9d42-a2f76a73915c","source":"github","sourceId":"dpearson2699/swift-ios-skills/swift-charts","sourceUrl":"https://github.com/dpearson2699/swift-ios-skills/tree/main/skills/swift-charts","isPrimary":false,"firstSeenAt":"2026-04-18T22:01:19.167Z","lastSeenAt":"2026-05-18T18:53:44.696Z"},{"listingId":"c3bc7475-fd7f-4947-9d42-a2f76a73915c","source":"skills_sh","sourceId":"dpearson2699/swift-ios-skills/swift-charts","sourceUrl":"https://skills.sh/dpearson2699/swift-ios-skills/swift-charts","isPrimary":true,"firstSeenAt":"2026-04-18T20:33:36.527Z","lastSeenAt":"2026-05-07T22:40:32.654Z"}],"details":{"listingId":"c3bc7475-fd7f-4947-9d42-a2f76a73915c","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"dpearson2699","slug":"swift-charts","github":{"repo":"dpearson2699/swift-ios-skills","stars":599,"topics":["accessibility","agent-skills","ai-coding","apple","claude-code","codex-skills","cursor-skills","ios","ios-development","liquid-glass","localization","mapkit","networking","storekit","swift","swift-concurrency","swiftdata","swiftui","widgetkit","xcode"],"license":"other","html_url":"https://github.com/dpearson2699/swift-ios-skills","pushed_at":"2026-04-26T21:04:17Z","description":"Agent Skills for iOS 26+, Swift 6.3, SwiftUI, and modern Apple frameworks","skill_md_sha":"f16e1f8993d4bd70f7cfeda1045c098fb1aa717f","skill_md_path":"skills/swift-charts/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/dpearson2699/swift-ios-skills/tree/main/skills/swift-charts"},"layout":"multi","source":"github","category":"swift-ios-skills","frontmatter":{"name":"swift-charts","description":"Implement, review, or improve data visualizations using Swift Charts. Use when building bar, line, area, point, pie, or donut charts; when adding chart selection, scrolling, or annotations; when plotting functions with vectorized BarPlot, LinePlot, AreaPlot, or PointPlot; when customizing axes, scales, legends, or foregroundStyle grouping; or when creating specialized visualizations like heat maps, Gantt charts, stacked/grouped bars, sparklines, or threshold lines."},"skills_sh_url":"https://skills.sh/dpearson2699/swift-ios-skills/swift-charts"},"updatedAt":"2026-05-18T18:53:44.696Z"}}