1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
//! Pre-composed block templates built from primitives.
//!
//! Blocks are opinionated, production-ready compositions you drop into
//! real apps — authentication screens, dashboards, settings pages,
//! marketing sections. Each block is a single `render(Props) -> Markup`
//! function that delegates to `primitives::*`.
//!
//! Blocks are meant to be **copied and customized**, not treated as
//! black boxes. Read the source of the one closest to what you need,
//! paste it into your own module, and edit. The Props are a convenient
//! API for the common case, but the real value is the structure shown
//! in the render body.
//!
//! Block naming convention:
//! - Slug: `category-name` (e.g., `auth-login`, `dashboard-stats`)
//! - Module: `category::name` (e.g., `blocks::auth::login`)
//!
//! See `BLOCK_NAMES` below for the canonical registry — anything listed
//! there has a showcase page at `/blocks/{slug}`.
/// Canonical slug registry. Mirrors the showcase routes.
///
/// A block name here MUST have:
/// 1. A module at `blocks::{category}::{name}`
/// 2. A `render(Props) -> Markup` consumer API
/// 3. A `preview() -> Markup` for the showcase page
/// 4. A matching arm in `showcase::block_content()`
pub const BLOCK_NAMES: & = &;
/// Convert a block slug into a human-readable name.
/// "auth-login" → "Auth — Login"