/**
 * An arrow mixin for Stylus, based on @shojberg's "cssarrowplease.com"
 * @param {Position} position
 * @param {size, color} arrow
 * @param {size, color} border (optional)
 */
arrow(position, arrow, border = 0 white)
    // Resolve arguments
    $arrowSize = arrow[0]
    $arrowColor = arrow[1]
    $borderWidth = border[0]
    $borderColor = border[1]

    $oppositePosition = opposite-position(position)

    // Base CSS
    position: relative
    background: $arrowColor

    // Selector generation
    $selectors = "&:after"
    if $borderWidth > 0
        $selectors = $selectors + ", &:before"

    // Arrow position
    {$selectors}
        {$oppositePosition}: 100%

        // Offset
        if position in (top bottom)
            left: 50%
        else
            top: 50%

        border: solid transparent
        content: " "
        height: 0
        width: 0
        position: absolute
        pointer-events: none

    // The arrow itself
    &:after
        border-color: rgba(white, 0) // transparent
        border-{$oppositePosition}-color: $arrowColor
        border-width: $arrowSize

        if position in (top bottom)
            margin-left: (- @border-width)
        else
            margin-top: (- @border-width)

    // The border
    if $borderWidth > 0
        &:before
            border-color: rgba(white, 0) // transparent
            border-{$oppositePosition}-color: $borderColor
            border-width: $arrowSize + $borderWidth

            if position in (top bottom)
                margin-left: (- @border-width)
            else
                margin-top: (- @border-width)
