text: export default function (part) {
    let {
      store,
      sa,
      Point,
      points,
      Path,
      paths,
      options,
      complete,
      paperless,
      macro,
      measurements,
      snippets,
      Snippet,
      absoluteOptions,
    } = part.shorthand()
    // band tie
    if (!options.ties) {
      if (!options.crossBackTies) {
        part.render = false
      }
    }
    let bandTieLength
    if (options.crossBackTies)
      bandTieLength = (measurements.underbust * options.bandLength) / 2 + options.neckTieWidth * 2
    else bandTieLength = (measurements.underbust + measurements.underbust * options.bandTieLength) / 2
    let bandTieWidth
    if (options.crossBackTies) bandTieWidth = absoluteOptions.bandTieWidth * 2
    else bandTieWidth = absoluteOptions.bandTieWidth
    points.topLeft = new Point(0, 0)
    points.topRight = new Point(bandTieWidth * 2, points.topLeft.y)
    points.bottomLeft = new Point(points.topLeft.x, bandTieLength)
    points.bottomRight = new Point(points.topRight.x, bandTieLength)
    if (!options.crossBackTies) {
      switch (options.bandTieEnds) {
        case 'straight':
          points.topMiddle = new Point(bandTieWidth, points.topLeft.y)
          break
        case 'pointed':
          points.topMiddle = new Point(bandTieWidth, points.topLeft.y - bandTieWidth)
      }
    } else points.topMiddle = new Point(bandTieWidth, points.topLeft.y)
  
    points.bottomMiddle = new Point(points.topMiddle.x, bandTieLength)
  
    switch (options.bandTieColours) {
      case 'one':
        paths.seam = new Path()
          .move(points.bottomRight)
          .line(points.topRight)
          .line(points.topMiddle)
          .line(points.topLeft)
          .line(points.bottomLeft)
          .close()
        break
      case 'two':
        paths.seam = new Path()
          .move(points.bottomMiddle)
          .line(points.topMiddle)
          .line(points.topLeft)
          .line(points.bottomLeft)
          .close()
    }
  
    if (complete) {
      points.cofLeft = points.bottomLeft.shift(0, bandTieWidth * (1 / 8))
      points.grainlineLeft = points.topLeft.translate(bandTieWidth * (1 / 8), bandTieLength * (3 / 4))
      points.title = points.topLeft.translate(bandTieWidth * (1 / 8), bandTieLength * (1 / 4))
      if (!options.crossBackTies) {
        macro('title', {
          at: points.title,
          nr: 3,
          title: 'band tie',
          scale: 0.2,
        })
      } else
        macro('title', {
          at: points.title,
          nr: 3,
          title: 'band',
          scale: 0.5,
        })
  
      switch (options.bandTieColours) {
        case 'one':
          points.cofRight = points.bottomLeft.shift(0, bandTieWidth * (15 / 8))
          points.grainlineRight = points.grainlineLeft.shift(0, bandTieWidth * (14 / 8))
          paths.foldline = new Path()
            .move(points.topMiddle)
            .line(points.bottomMiddle)
            .attr('data-text', 'Fold-line')
            .attr('data-text-class', 'center')
            .attr('class', 'various')
          break
        case 'two':
          points.cofRight = points.bottomLeft.shift(0, bandTieWidth * (7 / 8))
          points.grainlineRight = points.grainlineLeft.shift(0, bandTieWidth * (7 / 8))
      }
      macro('grainline', {
        from: points.grainlineLeft,
        to: points.grainlineRight,
      })
      macro('cutonfold', {
        from: points.cofLeft,
        to: points.cofRight,
        grainline: true,
      })
      if (options.crossBackTies) {
        let gatherLength = store.get('gatherLength')
        snippets.centreNotch = new Snippet('notch', points.bottomRight)
        points.sideNotch = points.bottomRight.shift(90, gatherLength)
        snippets.sideNotch = new Snippet('notch', points.sideNotch)
        paths.casingFold = new Path()
          .move(points.topLeft.shift(-90, options.neckTieWidth))
          .line(points.topRight.shift(-90, options.neckTieWidth))
          .attr('class', 'various')
          .attr('data-text', 'Fold-line')
          .attr('data-text-class', 'center')
      }
      if (sa) {
        paths.sa = paths.seam.offset(sa).attr('class', 'fabric sa')
      }
      if (paperless) {
        macro('vd', {
          from: points.bottomLeft,
          to: points.topLeft,
          x: points.topLeft.x - sa - 20,
        })
        macro('hd', {
          from: points.topLeft,
          to: points.topMiddle,
          y: points.topLeft.x - sa - 20,
        })
        switch (options.bandTieColours) {
          case 'one':
            macro('hd', {
              from: points.topLeft,
              to: points.topRight,
              y: points.topLeft.x - sa - 30,
            })
            break
          case 'two':
        }
        if (!options.crossBackTies) {
          switch (options.bandTieEnds) {
            case 'straight':
              macro('hd', {
                from: points.topLeft,
                to: points.topMiddle,
                y: points.topLeft.x - sa - 20,
              })
              break
            case 'pointed':
              macro('vd', {
                from: points.topLeft,
                to: points.topMiddle,
                x: points.topLeft.x - sa - 20,
              })
              macro('vd', {
                from: points.bottomLeft,
                to: points.topMiddle,
                x: points.topLeft.x - sa - 30,
              })
          }
        } else
          macro('hd', {
            from: points.topLeft,
            to: points.topMiddle,
            y: points.topLeft.x - sa - 20,
          })
        if (options.crossBackTies) {
          macro('vd', {
            from: points.sideNotch,
            to: points.bottomRight,
            x: points.topRight.x + sa + 20,
          })
        }
      }
    }
  
    return part
  }
  