"""More SVG path fragments, continued from :mod:`_glyph_art`. Split off purely to keep both modules under the 250-line cap; the division between the two files carries no meaning beyond that. :mod:`glyphs` imports from both, so no caller or test needs to know which file a glyph lives in. """ from __future__ import annotations # Three rising bars with a plotted point above the tallest -- a day-by-day log # that adds up to a trend, which is what a life tracker is. The bars are # strokes rather than filled rects so the glyph keeps one stroke weight # throughout; at a 168px pitch the 72px strokes leave 96px gaps, well above # MIN_NEGATIVE_SPACE. The marker sits on its own row clear of the bar caps, # and is hollow so it reads as a data point rather than a full stop. _TRACK_BARS = """\ """ # A note whose stem drops past the head onto a flat baseline foot, so one # vertical stroke reads as both a music stem and a letterform ascender sitting # on a text line -- lyricanki turns songs into words. Filled, not stroked, for # the nib/anvil reason: at 72px weight an outlined note-head's interior is # under MIN_NEGATIVE_SPACE and fills in solid at 48dp. # # Geometry, all inside SAFE_BOX (x=232..792, y=232..792): # stem x=520..592, y=272..584 (72 wide, the family stroke weight) # head ellipse (501,580) rx=118 ry=90 rot -20deg: y=486..674, x=386..616, # overlapping the stem's end, so the stem stops at y=584 # flags two stacked wedges off the stem top, reaching x=756 and x=736 # foot x=232..792, y=724..776 (52 tall, reads as the baseline) # # The head's lowest point is y=674: a rotated ellipse reaches # sqrt((rx*sin t)^2 + (ry*cos t)^2) below its centre, NOT ry. That leaves 50px # above the foot, clear of MIN_NEGATIVE_SPACE=36. A first draft used ry=104 at # cy=672 and recorded "40px clearance" without doing that sum -- the head # overlapped the foot by 40px and rendered as a mailbox. Recompute, never eyeball. # # Rejected: a bare note says nothing about words; a speech bubble around one # has nested outlines that vanish at 48dp. _NOTE_ASCENDER = """\ """ # A closed padlock: shackle down, body filled, keyhole punched out of it in the # field colour. For the Device Owner enforcer -- the app that locks the device # down -- where the literal reading is the right one. # # Geometry, computed rather than eyeballed (see the _NOTE_ASCENDER note above # for why that distinction earned its own comment): # body x=292..732, y=520..792 (440x272, rounded r=40) # shackle semicircular arc, centreline r=132 about (512,520), stroke 72, # so its outer top is 520-132-36 = 352, inside the 232 safe edge, # and its legs land at x=380 and x=644, well inside the body. # keyhole circle r=40 at (512,620) + tapered stem down to y=716. # 60px of body above the circle and 76px below the stem, both # clear of MIN_NEGATIVE_SPACE=36, so it stays a hole at 48dp # instead of merging into the body edge. # # The shackle is stroked (inheriting the group's round caps) while the body is # filled: a fully stroked padlock loses its keyhole at launcher size, and a # fully filled one loses the shackle's opening. _PADLOCK_CLOSED = """\ """ # Punch card: a time card with a clipped top-left corner and a row of punched # holes down one side, the way a real card is read by a column of sensors. # # An earlier version put two holes above two wide slots, which read as a face # (eyes over teeth) at every size. Four holes in a vertical column with three # short ruled lines beside them reads as a card instead. # # Geometry, all inside SAFE_BOX (232..792) and clear of MIN_NEGATIVE_SPACE=36: # card x=292..732, y=232..792, top-left corner clipped 104px. # holes r=34 at x=392, y=376/476/576/676. Centres 100 apart, so 32 of gap # between edges... too tight, hence r=30 and 100 spacing -> 40 gap. # lines three 46-tall bars from x=488 to x=652, aligned to the hole rows. _PUNCH_CARD = """\ """