85 lines
3.7 KiB
Swift
85 lines
3.7 KiB
Swift
import SwiftUI
|
|
|
|
struct ChatBubbleTailShape: Shape {
|
|
let isOutgoing: Bool
|
|
func path(in rect: CGRect) -> Path {
|
|
let radius: CGFloat = 18
|
|
let tailWidth: CGFloat = 8
|
|
let tailHeight: CGFloat = 7
|
|
var path = Path()
|
|
if isOutgoing {
|
|
// Top-left
|
|
path.move(to: CGPoint(x: rect.minX + radius, y: rect.minY))
|
|
// Top edge
|
|
path.addLine(to: CGPoint(x: rect.maxX - radius, y: rect.minY))
|
|
// Top-right corner
|
|
path.addQuadCurve(
|
|
to: CGPoint(x: rect.maxX, y: rect.minY + radius),
|
|
control: CGPoint(x: rect.maxX, y: rect.minY))
|
|
// Right edge
|
|
path.addLine(to: CGPoint(x: rect.maxX, y: rect.maxY - radius))
|
|
// Bottom-right corner
|
|
path.addQuadCurve(
|
|
to: CGPoint(x: rect.maxX - radius, y: rect.maxY),
|
|
control: CGPoint(x: rect.maxX, y: rect.maxY))
|
|
// Bottom edge before tail
|
|
path.addLine(to: CGPoint(x: rect.maxX - tailWidth, y: rect.maxY))
|
|
// Tail
|
|
path.addQuadCurve(
|
|
to: CGPoint(x: rect.maxX - 2, y: rect.maxY + tailHeight),
|
|
control: CGPoint(x: rect.maxX - tailWidth, y: rect.maxY + 2))
|
|
path.addQuadCurve(
|
|
to: CGPoint(x: rect.maxX - 6, y: rect.maxY - 2),
|
|
control: CGPoint(x: rect.maxX - 4, y: rect.maxY + 1))
|
|
// Bottom-left
|
|
path.addLine(to: CGPoint(x: rect.minX + radius, y: rect.maxY))
|
|
path.addQuadCurve(
|
|
to: CGPoint(x: rect.minX, y: rect.maxY - radius),
|
|
control: CGPoint(x: rect.minX, y: rect.maxY))
|
|
// Left edge
|
|
path.addLine(to: CGPoint(x: rect.minX, y: rect.minY + radius))
|
|
// Top-left corner
|
|
path.addQuadCurve(
|
|
to: CGPoint(x: rect.minX + radius, y: rect.minY),
|
|
control: CGPoint(x: rect.minX, y: rect.minY))
|
|
} else {
|
|
// Incoming — mirror of outgoing
|
|
// Top-right
|
|
path.move(to: CGPoint(x: rect.maxX - radius, y: rect.minY))
|
|
// Top edge
|
|
path.addLine(to: CGPoint(x: rect.minX + radius, y: rect.minY))
|
|
// Top-left corner
|
|
path.addQuadCurve(
|
|
to: CGPoint(x: rect.minX, y: rect.minY + radius),
|
|
control: CGPoint(x: rect.minX, y: rect.minY))
|
|
// Left edge
|
|
path.addLine(to: CGPoint(x: rect.minX, y: rect.maxY - radius))
|
|
// Bottom-left corner
|
|
path.addQuadCurve(
|
|
to: CGPoint(x: rect.minX + radius, y: rect.maxY),
|
|
control: CGPoint(x: rect.minX, y: rect.maxY))
|
|
// Bottom edge before tail
|
|
path.addLine(to: CGPoint(x: rect.minX + tailWidth, y: rect.maxY))
|
|
// Tail
|
|
path.addQuadCurve(
|
|
to: CGPoint(x: rect.minX + 2, y: rect.maxY + tailHeight),
|
|
control: CGPoint(x: rect.minX + tailWidth, y: rect.maxY + 2))
|
|
path.addQuadCurve(
|
|
to: CGPoint(x: rect.minX + 6, y: rect.maxY - 2),
|
|
control: CGPoint(x: rect.minX + 4, y: rect.maxY + 1))
|
|
// Bottom-right
|
|
path.addLine(to: CGPoint(x: rect.maxX - radius, y: rect.maxY))
|
|
path.addQuadCurve(
|
|
to: CGPoint(x: rect.maxX, y: rect.maxY - radius),
|
|
control: CGPoint(x: rect.maxX, y: rect.maxY))
|
|
// Right edge
|
|
path.addLine(to: CGPoint(x: rect.maxX, y: rect.minY + radius))
|
|
// Top-right corner
|
|
path.addQuadCurve(
|
|
to: CGPoint(x: rect.maxX - radius, y: rect.minY),
|
|
control: CGPoint(x: rect.maxX, y: rect.minY))
|
|
}
|
|
return path
|
|
}
|
|
}
|