GET /api/blocks emits a synthesized negative-id "(none)" row per empty block group; the block picker was including it as a selectable option. Filter to b.id > 0, mirroring the backend's real block ids. Also mirror ReplaceTemplateItemsHandler's new end-of-day validation on the client: flag an item whose start time + block duration crosses midnight and disable Save, same as the existing overlap-warning path. Adds coverage: block picker excludes negative-id rows; validate() flags a midnight-crossing item.