Files
Luma/Sources/Shared/UI/Components/ChatBubbleTailShape.swift
T
wt b37c71720b
iOS CI / Build and Test SwiftUI App (push) Canceled after 0s
Build Unsigned iOS and macOS Apps / Build Unsigned iOS IPA (push) Canceled after 0s
Build Unsigned iOS and macOS Apps / Build macOS ZIP (push) Canceled after 0s
added bubble tails
2026-09-14 18:05:13 +07:00

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
}
}