{"route":"/en-US-v0.14.1/reference/visualize/stroke/","title":"Stroke","description":"Documentation for the Stroke type.","part":null,"outline":[{"id":"summary","name":"Summary","children":[]},{"id":"example","name":"Example","children":[]},{"id":"simple-strokes","name":"Simple strokes","children":[]},{"id":"fields","name":"Fields","children":[]},{"id":"constructor","name":"Constructor","children":[{"id":"constructor-paint","name":"paint","children":[]},{"id":"constructor-thickness","name":"thickness","children":[]},{"id":"constructor-cap","name":"cap","children":[]},{"id":"constructor-join","name":"join","children":[]},{"id":"constructor-dash","name":"dash","children":[]},{"id":"constructor-miter-limit","name":"miter-limit","children":[]}]}],"body":{"kind":"type","content":{"name":"stroke","title":"Stroke","keywords":[],"oneliner":"Defines how to draw a line.","details":"<p>Defines how to draw a line.</p>\n<p>A stroke has a <em>paint</em> (a solid color or gradient), a <em>thickness,</em> a line\n<em>cap,</em> a line <em>join,</em> a <em>miter limit,</em> and a <em>dash</em> pattern. All of these\nvalues are optional and have sensible defaults.</p>\n<h2 id=\"example\">Example</h2>\n<div class=\"previewed-code\"><pre><code><span class=\"typ-key\">#</span><span class=\"typ-key\">set</span> <span class=\"typ-func\">line</span><span class=\"typ-punct\">(</span>length<span class=\"typ-punct\">:</span> <span class=\"typ-num\">100%</span><span class=\"typ-punct\">)</span>\n<span class=\"typ-func\">#</span><span class=\"typ-func\">stack</span><span class=\"typ-punct\">(</span>\n  spacing<span class=\"typ-punct\">:</span> <span class=\"typ-num\">1em</span><span class=\"typ-punct\">,</span>\n  <span class=\"typ-func\">line</span><span class=\"typ-punct\">(</span>stroke<span class=\"typ-punct\">:</span> <span class=\"typ-num\">2pt</span> <span class=\"typ-op\">+</span> red<span class=\"typ-punct\">)</span><span class=\"typ-punct\">,</span>\n  <span class=\"typ-func\">line</span><span class=\"typ-punct\">(</span>stroke<span class=\"typ-punct\">:</span> <span class=\"typ-punct\">(</span>paint<span class=\"typ-punct\">:</span> blue<span class=\"typ-punct\">,</span> thickness<span class=\"typ-punct\">:</span> <span class=\"typ-num\">4pt</span><span class=\"typ-punct\">,</span> cap<span class=\"typ-punct\">:</span> <span class=\"typ-str\">&quot;round&quot;</span><span class=\"typ-punct\">)</span><span class=\"typ-punct\">)</span><span class=\"typ-punct\">,</span>\n  <span class=\"typ-func\">line</span><span class=\"typ-punct\">(</span>stroke<span class=\"typ-punct\">:</span> <span class=\"typ-punct\">(</span>paint<span class=\"typ-punct\">:</span> blue<span class=\"typ-punct\">,</span> thickness<span class=\"typ-punct\">:</span> <span class=\"typ-num\">1pt</span><span class=\"typ-punct\">,</span> dash<span class=\"typ-punct\">:</span> <span class=\"typ-str\">&quot;dashed&quot;</span><span class=\"typ-punct\">)</span><span class=\"typ-punct\">)</span><span class=\"typ-punct\">,</span>\n  <span class=\"typ-func\">line</span><span class=\"typ-punct\">(</span>stroke<span class=\"typ-punct\">:</span> <span class=\"typ-num\">2pt</span> <span class=\"typ-op\">+</span> gradient<span class=\"typ-punct\">.</span><span class=\"typ-func\">linear</span><span class=\"typ-punct\">(</span><span class=\"typ-op\">..</span>color<span class=\"typ-punct\">.</span>map<span class=\"typ-punct\">.</span>rainbow<span class=\"typ-punct\">)</span><span class=\"typ-punct\">)</span><span class=\"typ-punct\">,</span>\n<span class=\"typ-punct\">)</span>\n</code></pre><div class=\"preview\"><img src=\"/en-US-v0.14.1/assets/dcda1fb9b6f022596876c15ac2535df3.png\" alt=\"Preview\"></div></div>\n<h2 id=\"simple-strokes\">Simple strokes</h2>\n<p>You can create a simple solid stroke from a color, a thickness, or a\ncombination of the two. Specifically, wherever a stroke is expected you can\npass any of the following values:</p>\n<ul>\n<li>A length specifying the stroke's thickness. The color is inherited,\ndefaulting to black.</li>\n<li>A color to use for the stroke. The thickness is inherited, defaulting to\n<code><span class=\"typ-num\">1pt</span></code>.</li>\n<li>A stroke combined from color and thickness using the <code>+</code> operator as in\n<code><span class=\"typ-num\">2pt</span> <span class=\"typ-op\">+</span> red</code>.</li>\n</ul>\n<p>For full control, you can also provide a <a href=\"/en-US-v0.14.1/reference/foundations/dictionary/\" title=\"dictionary\">dictionary</a> or a <code>stroke</code> object\nto any function that expects a stroke. The dictionary's keys may include any\nof the parameters for the constructor function, shown below.</p>\n<h2 id=\"fields\">Fields</h2>\n<p>On a stroke object, you can access any of the fields listed in the\nconstructor function. For example, <code><span class=\"typ-punct\">(</span><span class=\"typ-num\">2pt</span> <span class=\"typ-op\">+</span> blue<span class=\"typ-punct\">)</span><span class=\"typ-punct\">.</span>thickness</code> is <code><span class=\"typ-num\">2pt</span></code>.\nMeanwhile, <code><span class=\"typ-func\">stroke</span><span class=\"typ-punct\">(</span>red<span class=\"typ-punct\">)</span><span class=\"typ-punct\">.</span>cap</code> is <code><span class=\"typ-key\">auto</span></code> because it's unspecified. Fields\nset to <code><span class=\"typ-key\">auto</span></code> are inherited.</p>","constructor":{"path":[],"name":"stroke","title":"Construct","keywords":[],"oneliner":"Converts a value to a stroke or constructs a stroke with the given parameters.","element":false,"contextual":false,"deprecationMessage":null,"deprecationUntil":null,"details":[{"kind":"html","content":"<p>Converts a value to a stroke or constructs a stroke with the given\nparameters.</p>\n<p>Note that in most cases you do not need to convert values to strokes in\norder to use them, as they will be converted automatically. However,\nthis constructor can be useful to ensure a value has all the fields of a\nstroke.</p>"},{"kind":"example","content":{"body":"<div class=\"previewed-code\"><pre><code><span class=\"typ-key\">#</span><span class=\"typ-key\">let</span> <span class=\"typ-func\">my-func</span><span class=\"typ-punct\">(</span>x<span class=\"typ-punct\">)</span> <span class=\"typ-op\">=</span> <span class=\"typ-punct\">{</span>\n    x <span class=\"typ-op\">=</span> <span class=\"typ-func\">stroke</span><span class=\"typ-punct\">(</span>x<span class=\"typ-punct\">)</span> <span class=\"typ-comment\">// Convert to a stroke</span>\n    <span class=\"typ-punct\">[</span>Stroke has thickness <span class=\"typ-pol\">#</span><span class=\"typ-pol\">x</span><span class=\"typ-punct\">.</span><span class=\"typ-pol\">thickness</span>.<span class=\"typ-punct\">]</span>\n<span class=\"typ-punct\">}</span>\n<span class=\"typ-func\">#</span><span class=\"typ-func\">my-func</span><span class=\"typ-punct\">(</span><span class=\"typ-num\">3pt</span><span class=\"typ-punct\">)</span> <span class=\"typ-escape\">\\</span>\n<span class=\"typ-func\">#</span><span class=\"typ-func\">my-func</span><span class=\"typ-punct\">(</span>red<span class=\"typ-punct\">)</span> <span class=\"typ-escape\">\\</span>\n<span class=\"typ-func\">#</span><span class=\"typ-func\">my-func</span><span class=\"typ-punct\">(</span><span class=\"typ-func\">stroke</span><span class=\"typ-punct\">(</span>cap<span class=\"typ-punct\">:</span> <span class=\"typ-str\">&quot;round&quot;</span><span class=\"typ-punct\">,</span> thickness<span class=\"typ-punct\">:</span> <span class=\"typ-num\">1pt</span><span class=\"typ-punct\">)</span><span class=\"typ-punct\">)</span>\n</code></pre><div class=\"preview\"><img src=\"/en-US-v0.14.1/assets/a2e95c5c335ca6e9c24b156f08f5cc25.png\" alt=\"Preview\"></div></div>","title":null}}],"self":false,"params":[{"name":"paint","details":[{"kind":"html","content":"<p>The color or gradient to use for the stroke.</p>\n<p>If set to <code><span class=\"typ-key\">auto</span></code>, the value is inherited, defaulting to <code>black</code>.</p>"}],"types":["auto","color","gradient","tiling"],"strings":[],"default":null,"positional":true,"named":false,"required":true,"variadic":false,"settable":false},{"name":"thickness","details":[{"kind":"html","content":"<p>The stroke's thickness.</p>\n<p>If set to <code><span class=\"typ-key\">auto</span></code>, the value is inherited, defaulting to <code><span class=\"typ-num\">1pt</span></code>.</p>"}],"types":["auto","length"],"strings":[],"default":null,"positional":true,"named":false,"required":true,"variadic":false,"settable":false},{"name":"cap","details":[{"kind":"html","content":"<p>How the ends of the stroke are rendered.</p>\n<p>If set to <code><span class=\"typ-key\">auto</span></code>, the value is inherited, defaulting to <code><span class=\"typ-str\">&quot;butt&quot;</span></code>.</p>"}],"types":["auto","str"],"strings":[{"string":"butt","details":"<p>Square stroke cap with the edge at the stroke's end point.</p>"},{"string":"round","details":"<p>Circular stroke cap centered at the stroke's end point.</p>"},{"string":"square","details":"<p>Square stroke cap centered at the stroke's end point.</p>"}],"default":null,"positional":true,"named":false,"required":true,"variadic":false,"settable":false},{"name":"join","details":[{"kind":"html","content":"<p>How sharp turns are rendered.</p>\n<p>If set to <code><span class=\"typ-key\">auto</span></code>, the value is inherited, defaulting to <code><span class=\"typ-str\">&quot;miter&quot;</span></code>.</p>"}],"types":["auto","str"],"strings":[{"string":"miter","details":"<p>Segments are joined with sharp edges. Sharp bends exceeding the miter\nlimit are bevelled instead.</p>"},{"string":"round","details":"<p>Segments are joined with circular corners.</p>"},{"string":"bevel","details":"<p>Segments are joined with a bevel (a straight edge connecting the butts\nof the joined segments).</p>"}],"default":null,"positional":true,"named":false,"required":true,"variadic":false,"settable":false},{"name":"dash","details":[{"kind":"html","content":"<p>The dash pattern to use. This can be:</p>\n<ul>\n<li>One of the predefined patterns:\n<ul>\n<li><code><span class=\"typ-str\">&quot;solid&quot;</span></code> or <code><span class=\"typ-key\">none</span></code></li>\n<li><code><span class=\"typ-str\">&quot;dotted&quot;</span></code></li>\n<li><code><span class=\"typ-str\">&quot;densely-dotted&quot;</span></code></li>\n<li><code><span class=\"typ-str\">&quot;loosely-dotted&quot;</span></code></li>\n<li><code><span class=\"typ-str\">&quot;dashed&quot;</span></code></li>\n<li><code><span class=\"typ-str\">&quot;densely-dashed&quot;</span></code></li>\n<li><code><span class=\"typ-str\">&quot;loosely-dashed&quot;</span></code></li>\n<li><code><span class=\"typ-str\">&quot;dash-dotted&quot;</span></code></li>\n<li><code><span class=\"typ-str\">&quot;densely-dash-dotted&quot;</span></code></li>\n<li><code><span class=\"typ-str\">&quot;loosely-dash-dotted&quot;</span></code></li>\n</ul>\n</li>\n<li>An <a href=\"/en-US-v0.14.1/reference/foundations/array/\" title=\"array\">array</a> with alternating lengths for dashes and gaps. You can\nalso use the string <code><span class=\"typ-str\">&quot;dot&quot;</span></code> for a length equal to the line\nthickness.</li>\n<li>A <a href=\"/en-US-v0.14.1/reference/foundations/dictionary/\" title=\"dictionary\">dictionary</a> with the keys <code>array</code> (same as the array above),\nand <code>phase</code> (of type <a href=\"/en-US-v0.14.1/reference/layout/length/\" title=\"length\">length</a>), which defines where in the pattern\nto start drawing.</li>\n</ul>\n<p>If set to <code><span class=\"typ-key\">auto</span></code>, the value is inherited, defaulting to <code><span class=\"typ-key\">none</span></code>.</p>"},{"kind":"example","content":{"body":"<div class=\"previewed-code\"><pre><code><span class=\"typ-key\">#</span><span class=\"typ-key\">set</span> <span class=\"typ-func\">line</span><span class=\"typ-punct\">(</span>length<span class=\"typ-punct\">:</span> <span class=\"typ-num\">100%</span><span class=\"typ-punct\">,</span> stroke<span class=\"typ-punct\">:</span> <span class=\"typ-num\">2pt</span><span class=\"typ-punct\">)</span>\n<span class=\"typ-func\">#</span><span class=\"typ-func\">stack</span><span class=\"typ-punct\">(</span>\n  spacing<span class=\"typ-punct\">:</span> <span class=\"typ-num\">1em</span><span class=\"typ-punct\">,</span>\n  <span class=\"typ-func\">line</span><span class=\"typ-punct\">(</span>stroke<span class=\"typ-punct\">:</span> <span class=\"typ-punct\">(</span>dash<span class=\"typ-punct\">:</span> <span class=\"typ-str\">&quot;dashed&quot;</span><span class=\"typ-punct\">)</span><span class=\"typ-punct\">)</span><span class=\"typ-punct\">,</span>\n  <span class=\"typ-func\">line</span><span class=\"typ-punct\">(</span>stroke<span class=\"typ-punct\">:</span> <span class=\"typ-punct\">(</span>dash<span class=\"typ-punct\">:</span> <span class=\"typ-punct\">(</span><span class=\"typ-num\">10pt</span><span class=\"typ-punct\">,</span> <span class=\"typ-num\">5pt</span><span class=\"typ-punct\">,</span> <span class=\"typ-str\">&quot;dot&quot;</span><span class=\"typ-punct\">,</span> <span class=\"typ-num\">5pt</span><span class=\"typ-punct\">)</span><span class=\"typ-punct\">)</span><span class=\"typ-punct\">)</span><span class=\"typ-punct\">,</span>\n  <span class=\"typ-func\">line</span><span class=\"typ-punct\">(</span>stroke<span class=\"typ-punct\">:</span> <span class=\"typ-punct\">(</span>dash<span class=\"typ-punct\">:</span> <span class=\"typ-punct\">(</span>array<span class=\"typ-punct\">:</span> <span class=\"typ-punct\">(</span><span class=\"typ-num\">10pt</span><span class=\"typ-punct\">,</span> <span class=\"typ-num\">5pt</span><span class=\"typ-punct\">,</span> <span class=\"typ-str\">&quot;dot&quot;</span><span class=\"typ-punct\">,</span> <span class=\"typ-num\">5pt</span><span class=\"typ-punct\">)</span><span class=\"typ-punct\">,</span> phase<span class=\"typ-punct\">:</span> <span class=\"typ-num\">10pt</span><span class=\"typ-punct\">)</span><span class=\"typ-punct\">)</span><span class=\"typ-punct\">)</span><span class=\"typ-punct\">,</span>\n<span class=\"typ-punct\">)</span>\n</code></pre><div class=\"preview\"><img src=\"/en-US-v0.14.1/assets/3f7f20165b8a65cc3ae1675947ce671e.png\" alt=\"Preview\"></div></div>","title":null}}],"types":["none","auto","str","array","dictionary"],"strings":[{"string":"solid","details":""},{"string":"dotted","details":""},{"string":"densely-dotted","details":""},{"string":"loosely-dotted","details":""},{"string":"dashed","details":""},{"string":"densely-dashed","details":""},{"string":"loosely-dashed","details":""},{"string":"dash-dotted","details":""},{"string":"densely-dash-dotted","details":""},{"string":"loosely-dash-dotted","details":""}],"default":null,"positional":true,"named":false,"required":true,"variadic":false,"settable":false},{"name":"miter-limit","details":[{"kind":"html","content":"<p>Number at which protruding sharp bends are rendered with a bevel\ninstead or a miter join. The higher the number, the sharper an angle\ncan be before it is bevelled. Only applicable if <code>join</code> is\n<code><span class=\"typ-str\">&quot;miter&quot;</span></code>.</p>\n<p>Specifically, the miter limit is the maximum ratio between the\ncorner's protrusion length and the stroke's thickness.</p>\n<p>If set to <code><span class=\"typ-key\">auto</span></code>, the value is inherited, defaulting to <code><span class=\"typ-num\">4.0</span></code>.</p>"},{"kind":"example","content":{"body":"<div class=\"previewed-code\"><pre><code><span class=\"typ-key\">#</span><span class=\"typ-key\">let</span> items <span class=\"typ-op\">=</span> <span class=\"typ-punct\">(</span>\n  curve<span class=\"typ-punct\">.</span><span class=\"typ-func\">move</span><span class=\"typ-punct\">(</span><span class=\"typ-punct\">(</span><span class=\"typ-num\">15pt</span><span class=\"typ-punct\">,</span> <span class=\"typ-num\">0pt</span><span class=\"typ-punct\">)</span><span class=\"typ-punct\">)</span><span class=\"typ-punct\">,</span>\n  curve<span class=\"typ-punct\">.</span><span class=\"typ-func\">line</span><span class=\"typ-punct\">(</span><span class=\"typ-punct\">(</span><span class=\"typ-num\">0pt</span><span class=\"typ-punct\">,</span> <span class=\"typ-num\">30pt</span><span class=\"typ-punct\">)</span><span class=\"typ-punct\">)</span><span class=\"typ-punct\">,</span>\n  curve<span class=\"typ-punct\">.</span><span class=\"typ-func\">line</span><span class=\"typ-punct\">(</span><span class=\"typ-punct\">(</span><span class=\"typ-num\">30pt</span><span class=\"typ-punct\">,</span> <span class=\"typ-num\">30pt</span><span class=\"typ-punct\">)</span><span class=\"typ-punct\">)</span><span class=\"typ-punct\">,</span>\n  curve<span class=\"typ-punct\">.</span><span class=\"typ-func\">line</span><span class=\"typ-punct\">(</span><span class=\"typ-punct\">(</span><span class=\"typ-num\">10pt</span><span class=\"typ-punct\">,</span> <span class=\"typ-num\">20pt</span><span class=\"typ-punct\">)</span><span class=\"typ-punct\">)</span><span class=\"typ-punct\">,</span>\n<span class=\"typ-punct\">)</span>\n\n<span class=\"typ-key\">#</span><span class=\"typ-key\">set</span> <span class=\"typ-func\">curve</span><span class=\"typ-punct\">(</span>stroke<span class=\"typ-punct\">:</span> <span class=\"typ-num\">6pt</span> <span class=\"typ-op\">+</span> blue<span class=\"typ-punct\">)</span>\n<span class=\"typ-func\">#</span><span class=\"typ-func\">stack</span><span class=\"typ-punct\">(</span>\n  dir<span class=\"typ-punct\">:</span> ltr<span class=\"typ-punct\">,</span>\n  spacing<span class=\"typ-punct\">:</span> <span class=\"typ-num\">1cm</span><span class=\"typ-punct\">,</span>\n  <span class=\"typ-func\">curve</span><span class=\"typ-punct\">(</span>stroke<span class=\"typ-punct\">:</span> <span class=\"typ-punct\">(</span>miter-limit<span class=\"typ-punct\">:</span> <span class=\"typ-num\">1</span><span class=\"typ-punct\">)</span><span class=\"typ-punct\">,</span> <span class=\"typ-op\">..</span>items<span class=\"typ-punct\">)</span><span class=\"typ-punct\">,</span>\n  <span class=\"typ-func\">curve</span><span class=\"typ-punct\">(</span>stroke<span class=\"typ-punct\">:</span> <span class=\"typ-punct\">(</span>miter-limit<span class=\"typ-punct\">:</span> <span class=\"typ-num\">4</span><span class=\"typ-punct\">)</span><span class=\"typ-punct\">,</span> <span class=\"typ-op\">..</span>items<span class=\"typ-punct\">)</span><span class=\"typ-punct\">,</span>\n  <span class=\"typ-func\">curve</span><span class=\"typ-punct\">(</span>stroke<span class=\"typ-punct\">:</span> <span class=\"typ-punct\">(</span>miter-limit<span class=\"typ-punct\">:</span> <span class=\"typ-num\">5</span><span class=\"typ-punct\">)</span><span class=\"typ-punct\">,</span> <span class=\"typ-op\">..</span>items<span class=\"typ-punct\">)</span><span class=\"typ-punct\">,</span>\n<span class=\"typ-punct\">)</span>\n</code></pre><div class=\"preview\"><img src=\"/en-US-v0.14.1/assets/33818a9431604770d2115dd8e445c269.png\" alt=\"Preview\"></div></div>","title":null}}],"types":["auto","float"],"strings":[],"default":null,"positional":true,"named":false,"required":true,"variadic":false,"settable":false}],"returns":["stroke"],"scope":[]},"scope":[]}}}