Files
Emre Emir 8bbc9dbff2 Initial commit: DLS - Dental Lab System
- Flutter + PocketBase dental lab management system
- Clinic & lab dashboards, job tracking, patient management
- Product catalog, finance tracking, multi-language support
- AI assistant integration, realtime notifications
- Windows installer (Inno Setup) included
- Developed by kovakyazilim.com
2026-06-11 15:57:31 +03:00

105 lines
3.1 KiB
Dart
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import 'package:flutter/material.dart';
/// Renders the DLS brand logo — navy tooth + cyan chevrons.
///
/// [color] null → brand colors (#00397C tooth + #57B8CE chevrons).
/// Pass a color (e.g. Colors.white) for monochrome override on dark backgrounds.
class ToothLogo extends StatelessWidget {
const ToothLogo({
super.key,
required this.size,
this.color,
});
final double size;
final Color? color;
@override
Widget build(BuildContext context) {
return SizedBox(
width: size * 1.9,
height: size,
child: CustomPaint(
painter: _DlsLogoPainter(color: color),
),
);
}
}
class _DlsLogoPainter extends CustomPainter {
const _DlsLogoPainter({this.color});
final Color? color;
static const _navy = Color(0xFF00397C);
static const _cyan = Color(0xFF57B8CE);
@override
void paint(Canvas canvas, Size size) {
final toothColor = color ?? _navy;
final chevronColor = color ?? _cyan;
// Content bounding box in SVG 200×200 space: x=[42.5..157.5], y=[72..133]
// Width=115, Height=61 → aspect ~1.885 ≈ widget aspect 1.9
const svgLeft = 42.5, svgTop = 72.0, svgWidth = 115.0, svgHeight = 61.0;
final s = size.height / svgHeight;
final dx = (size.width - svgWidth * s) / 2.0 - svgLeft * s;
final dy = (size.height - svgHeight * s) / 2.0 - svgTop * s;
canvas.translate(dx, dy);
canvas.scale(s);
_drawTooth(canvas, toothColor);
_drawChevrons(canvas, chevronColor);
}
static void _drawTooth(Canvas canvas, Color color) {
// SVG path with scale(0.58) + translate(100,100) applied inline.
const cx = 100.0, cy = 100.0, sc = 0.58;
double px(double v) => cx + v * sc;
double py(double v) => cy + v * sc;
final path = Path()
..moveTo(px(0), py(-46))
..cubicTo(px(-22), py(-50), px(-44), py(-38), px(-44), py(-12))
..cubicTo(px(-44), py(8), px(-34), py(32), px(-26), py(46))
..cubicTo(px(-20), py(57), px(-11), py(53), px(-8), py(33))
..cubicTo(px(-6), py(19), px(-2), py(17), px(0), py(17))
..cubicTo(px(2), py(17), px(6), py(19), px(8), py(33))
..cubicTo(px(11), py(53), px(20), py(57), px(26), py(46))
..cubicTo(px(34), py(32), px(44), py(8), px(44), py(-12))
..cubicTo(px(44), py(-38), px(22), py(-50), px(0), py(-46))
..close();
canvas.drawPath(path, Paint()..color = color..style = PaintingStyle.fill);
}
static void _drawChevrons(Canvas canvas, Color color) {
final paint = Paint()
..color = color
..style = PaintingStyle.stroke
..strokeWidth = 11.0
..strokeCap = StrokeCap.round
..strokeJoin = StrokeJoin.round;
// Polyline points + translate(100,100). Left: (-52,-22)→(-34,0)→(-52,22)
canvas.drawPath(
Path()
..moveTo(48, 78)
..lineTo(66, 100)
..lineTo(48, 122),
paint,
);
// Right: (52,-22)→(34,0)→(52,22)
canvas.drawPath(
Path()
..moveTo(152, 78)
..lineTo(134, 100)
..lineTo(152, 122),
paint,
);
}
@override
bool shouldRepaint(_DlsLogoPainter old) => old.color != color;
}