gabriel / musehub public
repo_card_enriched.html html
149 lines 6.2 KB
Raw
sha256:34035d72cef530c1ab9d6a6f53be18d803dde705fc3157617d70352a96d0747b Merge branch 'fix/wire-push-external-parent-manifest' into dev Human 9 days ago
1 {#
2 Enriched repo card partial — domain detail page grid.
3
4 Expects:
5 repo — dict with repo_id, owner, slug, description, tags, pushed_at, created_at
6 enc — RepoCardEnrichment dataclass instance (or None for safe fallback)
7 #}
8 {% set _enc = enc if enc is not none else none %}
9 {% set _health = _enc.health_status if _enc else "clean" %}
10 {% if _health == "risk" %}
11 {% set _score = 15 %}{% set _tier = "critical" %}
12 {% elif _health == "warn" %}
13 {% set _score = 50 %}{% set _tier = "fair" %}
14 {% else %}
15 {% set _score = 100 %}{% set _tier = "excellent" %}
16 {% endif %}
17 {%- set _r = 38 -%}
18 {%- set _circ = 238.76 -%}
19 {%- set _arc = (_score / 100) * _circ -%}
20 <a class="rc-card" href="/{{ repo.owner }}/{{ repo.slug }}">
21
22 {# ── Header: name + health gauge ──────────────────────────────────────── #}
23 <div class="rc-card__header">
24 <span class="rc-card__name">{{ repo.owner }}/{{ repo.slug }}</span>
25 <svg class="rc-gauge" viewBox="0 0 100 100" aria-label="{{ _health }}" role="img">
26 <circle class="intel-health-track" cx="50" cy="50" r="{{ _r }}"/>
27 <circle class="intel-health-fill intel-health-fill--{{ _tier }}"
28 cx="50" cy="50" r="{{ _r }}"
29 stroke-dasharray="{{ _arc | round(2) }} {{ _circ }}"
30 stroke-dashoffset="{{ (_circ * 0.25) | round(2) }}"
31 transform="rotate(-90 50 50)"/>
32 </svg>
33 </div>
34
35 {# ── Description ───────────────────────────────────────────────────────── #}
36 {% if repo.description %}
37 <p class="rc-card__desc">{{ repo.description | truncate(90) }}</p>
38 {% endif %}
39
40 {# ── Pulse sparkline + label ──────────────────────────────────────────── #}
41 {% if _enc and _enc.pulse_buckets %}
42 {% set _buckets = _enc.pulse_buckets %}
43 {% set _n = _buckets | length %}
44 {% set _bar_w = 3 %}
45 {% set _gap = 1 %}
46 {% set _total_w = _n * (_bar_w + _gap) - _gap %}
47 {% set _h = 24 %}
48 <div class="rc-pulse">
49 <span class="rc-pulse__label">Pulse (30d)</span>
50 <svg class="rc-sparkline"
51 viewBox="0 0 {{ _total_w }} {{ _h }}"
52 preserveAspectRatio="none"
53 aria-label="Commit activity"
54 role="img">
55 {% for b in _buckets %}
56 {% set _x = loop.index0 * (_bar_w + _gap) %}
57 {% set _bar_h = b.h if b.h > 0 else 1 %}
58 <rect x="{{ _x }}" y="{{ _h - _bar_h }}" width="{{ _bar_w }}" height="{{ _bar_h }}"
59 fill="{{ b.color }}" opacity="{{ b.opacity }}" rx="0.5"/>
60 {% endfor %}
61 </svg>
62 </div>
63 {% endif %}
64
65 {# ── Autonomy bar ──────────────────────────────────────────────────────── #}
66 {% if _enc %}
67 {% set _apct = _enc.autonomy_pct %}
68 <div class="rc-autonomy">
69 <div class="rc-autonomy__header">
70 <span class="rc-autonomy__label">
71 <span class="rc-autonomy__icon">{{ icon("bot", 10) }}</span>
72 Autonomy
73 </span>
74 <span class="rc-autonomy__pct">{{ _apct }}%</span>
75 </div>
76 <div class="rc-autonomy__track">
77 <div class="rc-autonomy__fill" style="width:{{ _apct }}%"></div>
78 </div>
79 </div>
80 {% endif %}
81
82 {# ── Symbol intel: hottest · blast · counts ───────────────────────────── #}
83 {% if _enc and (_enc.hottest_symbol or _enc.blast_leader or _enc.dead_count > 0 or _enc.error_count > 0 or _enc.warning_count > 0) %}
84 <div class="rc-intel">
85
86 {% if _enc.hottest_symbol %}
87 <div class="rc-intel__row">
88 <span class="rc-intel__label">
89 <span class="rc-intel__icon rc-intel__icon--flame">{{ icon("flame", 10) }}</span>
90 hottest
91 </span>
92 <span class="rc-intel__val" title="{{ _enc.hottest_symbol.address }}">
93 {{ _enc.hottest_symbol.address | truncate(36, true, '…') }}<span class="rc-intel__meta"> ·{{ _enc.hottest_symbol.churn_30d | fmtnum }}×</span>
94 </span>
95 </div>
96 {% endif %}
97
98 {% if _enc.blast_leader %}
99 <div class="rc-intel__row">
100 <span class="rc-intel__label">
101 <span class="rc-intel__icon rc-intel__icon--blast">{{ icon("explosion", 10) }}</span>
102 blast
103 </span>
104 <span class="rc-intel__val" title="{{ _enc.blast_leader.address }}">
105 {{ _enc.blast_leader.address | truncate(36, true, '…') }}<span class="rc-intel__meta"> ·{{ _enc.blast_leader.blast | fmtnum }}</span>
106 </span>
107 </div>
108 {% endif %}
109
110 {# Always render 3 fixed-width slots so spacing is consistent #}
111 <div class="rc-intel__counts">
112 <span class="rc-count {% if _enc.dead_count > 0 %}rc-count--dead{% endif %}">
113 {% if _enc.dead_count > 0 %}
114 <span class="rc-count__icon">{{ icon("skull", 10) }}</span>
115 {{ _enc.dead_count | fmtnum }} dead
116 {% endif %}
117 </span>
118 <span class="rc-count {% if _enc.error_count > 0 %}rc-count--error{% endif %}">
119 {% if _enc.error_count > 0 %}
120 <span class="rc-count__icon">{{ icon("alert-circle", 10) }}</span>
121 {{ _enc.error_count | fmtnum }} errors
122 {% endif %}
123 </span>
124 <span class="rc-count {% if _enc.warning_count > 0 %}rc-count--warn{% endif %}">
125 {% if _enc.warning_count > 0 %}
126 <span class="rc-count__icon">{{ icon("alert-triangle", 10) }}</span>
127 {{ _enc.warning_count | fmtnum }} warns
128 {% endif %}
129 </span>
130 </div>
131
132 </div>
133 {% endif %}
134
135 {# ── Footer: tags + time ───────────────────────────────────────────────── #}
136 <div class="rc-card__footer">
137 <div class="rc-card__tags">
138 {% for tag in (repo.tags or [])[:3] %}
139 <span class="rc-card__tag">{{ tag }}</span>
140 {% endfor %}
141 </div>
142 {% if repo.pushed_at %}
143 <span class="rc-card__time" title="{{ repo.pushed_at }}">{{ repo.pushed_at | fmtrelative }}</span>
144 {% elif repo.created_at %}
145 <span class="rc-card__time" title="{{ repo.created_at }}">{{ repo.created_at | fmtrelative }}</span>
146 {% endif %}
147 </div>
148
149 </a>
File History 14 commits
sha256:34035d72cef530c1ab9d6a6f53be18d803dde705fc3157617d70352a96d0747b Merge branch 'fix/wire-push-external-parent-manifest' into dev Human 9 days ago
sha256:fc04e4cae9e1774d6a21b65c45daeed0e6787eb581d13aa1b03bfe9384a34226 Merge branch 'fix/two-column-scroll-layout' into dev Human 9 days ago
sha256:408916fc5973ba59c6e4eebaa80ebdcc801c0a63205651e25009d11548f79454 chore: bump version to 0.2.0.dev2 — nightly.2, matching muse Sonnet 4.6 patch 12 days ago
sha256:d035733f21ccff27735fddebfbbe0ed24565a32a22db8de5885402262671ecd2 chore: bump version to 0.2.0rc15 for musehub#113 fix release Sonnet 4.6 patch 15 days ago
sha256:0032d6cfa33bc3c8367436ad768e7dd0e339b4332153160247da8266cb5fa352 Merge branch 'task/version-tags-phase3-server' into dev Human 17 days ago
sha256:4669620efda9ff41c55bdefd1f7bfe1c239d468428744c84ead9957e5a003a53 merge: rescue snapshot-recovery hardening (c00aa21d) into d… Opus 4.8 minor 30 days ago
sha256:a59da49c4611b970fc4b6ae48678ce4943261c213a07ddbd73ce9201df869b4a fix: remove false-positive proposal_comments index drop fro… Sonnet 4.6 patch 34 days ago
sha256:0a240d6dbff234f07d98a28a4a9a68db702f3f9ff9260196f24219bdb1c0b6f3 feat: render markdown mists as HTML with heading anchor links Sonnet 4.6 patch 34 days ago
sha256:24a7d47486ebc4ebd1832830580e177ec6f877b48dced8c000e198cdec4ce9d6 Merge 'task/bump-version-rc12' into 'dev' — proposal: Bump … Human 36 days ago
sha256:b9ff931d147e0114a1f17060f415b89ed551c170a91ff226c70437aa5c85f9ee Merge 'task/bump-version-rc12' into 'dev' — proposal: Bump … Human 36 days ago
sha256:d1122d21e73471879b460037b22c0b50fded7c423444a176f248428f75dac39c Merge 'task/fix-issue-pagination-cursor' into 'dev' — propo… Human 36 days ago
sha256:01e18975e73d2b3cd5b6db7929c895bef9aa6e0d4391dc5b2adfc548b41318dd Merge 'feat/adding-debug-logs-to-staging' into 'dev' — prop… Human 36 days ago
sha256:6b1949fc2797ca4c1936a637a4cbfec828ef56cf52398a2e74ca3c4f494e728f fix: use wire_bytes not mpack_bytes_raw in compute_object_b… Sonnet 4.6 patch 48 days ago
sha256:b99f2455dc346966d040133f5203297e6e3ef5803a93728a2c30568d0a0f7583 rename: delta_add → delta_upsert across wire format, models… Sonnet 4.6 patch 50 days ago