` markup. */ function openstation_recycle_bin_icon_svg( $full = false ) { // The lid and the handle travel together. In the full state the // pair is knocked askew, which is the whole difference at the top // of the mark. $lid_transform = $full ? ' transform="translate(0 -2.5) rotate(8 32 21.5)"' : ''; $svg = '' . '' // The handle, outlined so it reads as a loop rather than a tab. . '' // The lid: the one solid element, and the widest, so it anchors // the mark at small sizes. . '' . '' // The body, tapered towards the base the way a real bin is, which // is also what separates it from a plain bucket. // // 27 units tall, narrowing to 71% of its top width. It was 24 // tall at 59%, which drew a shallower, more conical tub than a // bin actually is, and left an interior too cramped to hold // anything. Taken further, to a bottom much past 75%, the walls // go vertical and the mark reads as a bucket; this sits at the // edge of that. . ''; if ( $full ) { // Three crumpled balls, one path with three subpaths so the // mark stays at four elements rather than six. // // Each is a seven-point polygon on a radius jittered between // 0.81 and 1.0, with a same-colour round-joined stroke that // turns the corners into creases instead of points. Seven // points rather than nine because a ball this small needs // deeper, fewer facets to keep any texture at all. // // The layout is staggered deliberately. Two balls at the same // height with a third centred under them reads as a face, and // it cannot be unseen once noticed, so no two share a y (the // top pair are 4.2 units apart) and the third sits below-left // rather than on the centreline. Every gap in the mark clears // 2 units: 5.1 to the left wall, 4.4 to the right, 2.8 to the // rim, 2.5 to the base, and 2.5 to 4.2 between the balls. Those // last three decide how far down the size ladder they stay // three things instead of one. $svg .= ''; } return $svg . ''; } /** * Both bin states as base64 data URIs, ready for `renderIcon()`. * * The client swaps between these as the count crosses zero, so both * have to reach the page on the first paint. Cheap: two string * builds and two base64 encodes, no queries. * * @return array{empty:string,full:string} */ function openstation_recycle_bin_icon_uris() { return array( 'empty' => 'data:image/svg+xml;base64,' . base64_encode( openstation_recycle_bin_icon_svg( false ) ), 'full' => 'data:image/svg+xml;base64,' . base64_encode( openstation_recycle_bin_icon_svg( true ) ), ); } /** * Echoes the recycle bin window's template body. * * The shell wraps this in `