@@ -1631,3 +1631,128 @@ RCT_EXPORT_MODULE(MacOSAnimatedImage)
16311631RCT_EXPORT_VIEW_PROPERTY(source, NSString)
16321632RCT_EXPORT_VIEW_PROPERTY(animating, BOOL)
16331633@end
1634+
1635+// ── Section 22: Pattern Background ──────────────────────────────────────────
1636+// A tiled pattern background using Core Graphics — Telegram-style chat wallpaper
1637+
1638+@interface RCTPatternBackgroundView : NSView
1639+@property (nonatomic, copy) NSString *patternColor;
1640+@property (nonatomic, copy) NSString *backgroundColor2;
1641+@property (nonatomic, assign) CGFloat patternOpacity;
1642+@property (nonatomic, assign) CGFloat patternScale;
1643+@end
1644+
1645+@implementation RCTPatternBackgroundView
1646+
1647+- (instancetype)initWithFrame:(NSRect)frame {
1648+ if (self = [super initWithFrame:frame]) {
1649+ _patternColor = @"#FFFFFF";
1650+ _backgroundColor2 = @"#17212B";
1651+ _patternOpacity = 0.06;
1652+ _patternScale = 1.0;
1653+ }
1654+ return self;
1655+}
1656+
1657+- (NSSize)intrinsicContentSize {
1658+ return NSMakeSize(NSViewNoIntrinsicMetric, NSViewNoIntrinsicMetric);
1659+}
1660+
1661+- (void)setPatternColor:(NSString *)patternColor {
1662+ _patternColor = patternColor;
1663+ [self setNeedsDisplay:YES];
1664+}
1665+
1666+- (void)setBackgroundColor2:(NSString *)backgroundColor2 {
1667+ _backgroundColor2 = backgroundColor2;
1668+ [self setNeedsDisplay:YES];
1669+}
1670+
1671+- (void)setPatternOpacity:(CGFloat)patternOpacity {
1672+ _patternOpacity = patternOpacity;
1673+ [self setNeedsDisplay:YES];
1674+}
1675+
1676+- (void)setPatternScale:(CGFloat)patternScale {
1677+ _patternScale = patternScale;
1678+ [self setNeedsDisplay:YES];
1679+}
1680+
1681+- (NSColor *)colorFromHex:(NSString *)hex {
1682+ hex = [hex stringByReplacingOccurrencesOfString:@"#" withString:@""];
1683+ unsigned int val = 0;
1684+ [[NSScanner scannerWithString:hex] scanHexInt:&val];
1685+ return [NSColor colorWithRed:((val >> 16) & 0xFF) / 255.0
1686+ green:((val >> 8) & 0xFF) / 255.0
1687+ blue:(val & 0xFF) / 255.0
1688+ alpha:1.0];
1689+}
1690+
1691+- (BOOL)isFlipped { return YES; }
1692+
1693+- (void)drawRect:(NSRect)dirtyRect {
1694+ NSColor *bgColor = [self colorFromHex:_backgroundColor2];
1695+ [bgColor setFill];
1696+ NSRectFill(dirtyRect);
1697+
1698+ NSColor *pColor = [[self colorFromHex:_patternColor] colorWithAlphaComponent:_patternOpacity];
1699+ CGFloat s = _patternScale;
1700+ CGFloat tile = 24.0 * s;
1701+
1702+ [pColor setStroke];
1703+
1704+ // Draw a subtle geometric pattern — diagonal crosses on a grid
1705+ CGFloat startX = floor(dirtyRect.origin.x / tile) * tile;
1706+ CGFloat startY = floor(dirtyRect.origin.y / tile) * tile;
1707+ CGFloat endX = NSMaxX(dirtyRect);
1708+ CGFloat endY = NSMaxY(dirtyRect);
1709+
1710+ NSBezierPath *path = [NSBezierPath bezierPath];
1711+ [path setLineWidth:0.5 * s];
1712+
1713+ for (CGFloat x = startX; x < endX; x += tile) {
1714+ for (CGFloat y = startY; y < endY; y += tile) {
1715+ CGFloat cx = x + tile / 2.0;
1716+ CGFloat cy = y + tile / 2.0;
1717+ CGFloat arm = 3.0 * s;
1718+
1719+ // Small cross
1720+ [path moveToPoint:NSMakePoint(cx - arm, cy)];
1721+ [path lineToPoint:NSMakePoint(cx + arm, cy)];
1722+ [path moveToPoint:NSMakePoint(cx, cy - arm)];
1723+ [path lineToPoint:NSMakePoint(cx, cy + arm)];
1724+
1725+ // Small diamond at offset
1726+ CGFloat dx = x + tile * 0.15;
1727+ CGFloat dy = y + tile * 0.65;
1728+ CGFloat dm = 1.5 * s;
1729+ [path moveToPoint:NSMakePoint(dx, dy - dm)];
1730+ [path lineToPoint:NSMakePoint(dx + dm, dy)];
1731+ [path lineToPoint:NSMakePoint(dx, dy + dm)];
1732+ [path lineToPoint:NSMakePoint(dx - dm, dy)];
1733+ [path closePath];
1734+ }
1735+ }
1736+ [path stroke];
1737+}
1738+
1739+- (void)insertReactSubview:(NSView *)subview atIndex:(NSInteger)atIndex {
1740+ [super insertReactSubview:subview atIndex:atIndex];
1741+}
1742+
1743+- (void)layout {
1744+ [super layout];
1745+ [self setNeedsDisplay:YES];
1746+}
1747+
1748+@end
1749+
1750+@interface RCTPatternBackgroundViewManager : RCTViewManager @end
1751+@implementation RCTPatternBackgroundViewManager
1752+RCT_EXPORT_MODULE(MacOSPatternBackground)
1753+- (NSView *)view { return [[RCTPatternBackgroundView alloc] initWithFrame:CGRectZero]; }
1754+RCT_EXPORT_VIEW_PROPERTY(patternColor, NSString)
1755+RCT_EXPORT_VIEW_PROPERTY(backgroundColor2, NSString)
1756+RCT_EXPORT_VIEW_PROPERTY(patternOpacity, CGFloat)
1757+RCT_EXPORT_VIEW_PROPERTY(patternScale, CGFloat)
1758+@end