-
Notifications
You must be signed in to change notification settings - Fork 32
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #165 from mhkeller/axes
Improved Axes components + AxisTop and AxisRight
- Loading branch information
Showing
49 changed files
with
2,066 additions
and
471 deletions.
There are no files selected for viewing
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,131 @@ | ||
<!-- | ||
@component | ||
Generates an HTML x-axis, useful for server-side rendered charts. This component is also configured to detect if your x-scale is an ordinal scale. If so, it will place the markers in the middle of the bandwidth. | ||
--> | ||
<script> | ||
import { getContext } from 'svelte'; | ||
const { width, height, xScale, yRange } = getContext('LayerCake'); | ||
/** @type {Boolean} [tickMarks=false] - Show a vertical mark for each tick. */ | ||
export let tickMarks = false; | ||
/** @type {Boolean} [gridlines=true] - Show gridlines extending into the chart area. */ | ||
export let gridlines = true; | ||
/** @type {Number} [tickMarkLength=6] - The length of the tick mark. */ | ||
export let tickMarkLength = 6; | ||
/** @type {Boolean} [baseline=false] – Show a solid line at the bottom. */ | ||
export let baseline = false; | ||
/** @type {Boolean} [snapLabels=false] - Instead of centering the text labels on the first and the last items, align them to the edges of the chart. */ | ||
export let snapLabels = false; | ||
/** @type {Function} [format=d => d] - A function that passes the current tick value and expects a nicely formatted value in return. */ | ||
export let format = d => d; | ||
/** @type {Number|Array|Function} [ticks] - If this is a number, it passes that along to the [d3Scale.ticks](https://github.com/d3/d3-scale) function. If this is an array, hardcodes the ticks to those values. If it's a function, passes along the default tick values and expects an array of tick values in return. If nothing, it uses the default ticks supplied by the D3 function. */ | ||
export let ticks = undefined; | ||
/** @type {Number} [tickGutter=0] - The amount of whitespace between the start of the tick and the chart drawing area (the yRange min). */ | ||
export let tickGutter = 0; | ||
/** @type {Number} [dx=0] - Any optional value passed to the `dx` attribute on the text label. */ | ||
export let dx = 0; | ||
/** @type {Number} [dy=0] - Any optional value passed to the `dy` attribute on the text label. */ | ||
export let dy = 1; | ||
$: tickLen = tickMarks === true | ||
? tickMarkLength ?? 6 | ||
: 0; | ||
$: isBandwidth = typeof $xScale.bandwidth === 'function'; | ||
$: tickVals = Array.isArray(ticks) ? ticks : | ||
isBandwidth ? | ||
$xScale.domain() : | ||
typeof ticks === 'function' ? | ||
ticks($xScale.ticks()) : | ||
$xScale.ticks(ticks); | ||
$: halfBand = isBandwidth ? $xScale.bandwidth() / 2 : 0 | ||
</script> | ||
|
||
<div class='axis x-axis' class:snapLabels> | ||
{#each tickVals as tick, i (tick)} | ||
{@const tickValPx = $xScale(tick)} | ||
|
||
{#if baseline === true} | ||
<div class="baseline" style='top:100%; width:100%;'></div> | ||
{/if} | ||
|
||
{#if gridlines === true} | ||
<div | ||
class="gridline" | ||
style:left='{tickValPx}%' | ||
style='top:0; bottom:0;'></div> | ||
{/if} | ||
{#if tickMarks === true} | ||
<div | ||
class="tick-mark" | ||
style:left='{tickValPx + halfBand}%' | ||
style:height='{tickLen}px' | ||
style:bottom='{-tickLen - tickGutter}px' | ||
></div> | ||
{/if} | ||
<div | ||
class='tick tick-{i}' | ||
style:left='{tickValPx + halfBand}%' | ||
style='top:calc(100% + {tickGutter}px);'> | ||
<div | ||
class="text" | ||
style:top='{tickLen}px' | ||
style:transform='translate(calc(-50% + {dx}px), {dy}px)' | ||
>{format(tick)}</div> | ||
</div> | ||
{/each} | ||
</div> | ||
|
||
<style> | ||
.axis, | ||
.tick, | ||
.tick-mark, | ||
.gridline, | ||
.baseline { | ||
position: absolute; | ||
} | ||
.axis { | ||
width: 100%; | ||
height: 100%; | ||
} | ||
.tick { | ||
font-size: 11px; | ||
} | ||
.gridline { | ||
border-left: 1px dashed #aaa; | ||
} | ||
.tick-mark { | ||
border-left: 1px solid #aaa; | ||
} | ||
.baseline { | ||
border-top: 1px solid #aaa; | ||
} | ||
.tick .text { | ||
color: #666; | ||
position: relative; | ||
white-space: nowrap; | ||
transform: translateX(-50%); | ||
} | ||
/* This looks a little better at 40 percent than 50 */ | ||
.axis.snapLabels .tick:last-child { | ||
transform: translateX(-40%); | ||
} | ||
.axis.snapLabels .tick.tick-0 { | ||
transform: translateX(40%); | ||
} | ||
</style> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.