@dirsigler/techradar 1.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,112 @@
1
+ ---
2
+ import { getCollection, render, type CollectionEntry } from 'astro:content';
3
+ import Base from '../../layouts/Base.astro';
4
+ import RingBadge from '../../components/RingBadge.astro';
5
+ import MovedIndicator from '../../components/MovedIndicator.astro';
6
+ import config from 'virtual:techradar/config';
7
+ import type { GetStaticPaths } from 'astro';
8
+
9
+ const base = import.meta.env.BASE_URL.endsWith('/') ? import.meta.env.BASE_URL : import.meta.env.BASE_URL + '/';
10
+
11
+ export const getStaticPaths: GetStaticPaths = async () => {
12
+ const entries = await getCollection('technologies');
13
+ return entries.map((entry) => ({
14
+ params: { slug: entry.id },
15
+ props: { entry },
16
+ }));
17
+ };
18
+
19
+ const { entry } = Astro.props as { entry: CollectionEntry<'technologies'> };
20
+ const { Content } = await render(entry);
21
+
22
+ // Extract segment slug from entry id (e.g., "cloud/aws" → "cloud")
23
+ const parts = entry.id.split('/');
24
+ const segmentSlug = parts.slice(0, -1).join('/');
25
+
26
+ // Look up segment info for breadcrumb
27
+ const segmentEntries = await getCollection('segments');
28
+ const segmentEntry = segmentEntries.find((s) => {
29
+ const sSlug = s.id.replace(/\/index$/, '').replace(/^index$/, s.id);
30
+ return sSlug === segmentSlug;
31
+ });
32
+ const segmentTitle = segmentEntry?.data.title ?? segmentSlug;
33
+ const segmentColor = segmentEntry?.data.color ?? '#6c7086';
34
+
35
+ // Build "Edit on GitHub" URL from the entry's file path
36
+ const techFileName = entry.id.split('/').pop();
37
+ const editUrl = config.editBaseUrl
38
+ ? `${config.editBaseUrl}/${segmentSlug}/${techFileName}.md`
39
+ : null;
40
+ ---
41
+
42
+ <Base title={`${entry.data.title} — Tech Radar`}>
43
+ <nav class="mb-6 text-sm" style="color: var(--radar-text-faint);">
44
+ <a href={base} class="breadcrumb-link">Tech Radar</a>
45
+ <span class="mx-2">/</span>
46
+ <a href={`${base}segments/${segmentSlug}/`} class="breadcrumb-link">
47
+ {segmentTitle}
48
+ </a>
49
+ <span class="mx-2">/</span>
50
+ <span style="color: var(--radar-text-secondary);">{entry.data.title}</span>
51
+ </nav>
52
+
53
+ <article>
54
+ <header class="mb-8">
55
+ <h1 class="text-3xl font-bold flex items-center gap-3" style="color: var(--radar-text);">
56
+ {entry.data.title}
57
+ <MovedIndicator moved={entry.data.moved} />
58
+ </h1>
59
+ <div class="mt-3 flex items-center gap-3">
60
+ <RingBadge ring={entry.data.ring} />
61
+ <span class="flex items-center gap-1.5 text-sm" style="color: var(--radar-text-muted);">
62
+ <span class="inline-block h-2.5 w-2.5 rounded-full" style={`background-color: ${segmentColor}`}></span>
63
+ {segmentTitle}
64
+ </span>
65
+ </div>
66
+ </header>
67
+
68
+ <div class="prose max-w-none">
69
+ <Content />
70
+ </div>
71
+
72
+ {editUrl && (
73
+ <div class="mt-8 pt-6" style="border-top: 1px solid var(--radar-border);">
74
+ <a
75
+ href={editUrl}
76
+ target="_blank"
77
+ rel="noopener noreferrer"
78
+ class="edit-link"
79
+ >
80
+ <svg viewBox="0 0 24 24" class="h-4 w-4" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
81
+ <path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7" />
82
+ <path d="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z" />
83
+ </svg>
84
+ Edit this page
85
+ </a>
86
+ </div>
87
+ )}
88
+ </article>
89
+ </Base>
90
+
91
+ <style>
92
+ .breadcrumb-link {
93
+ color: var(--radar-text-faint);
94
+ transition: color 0.15s;
95
+ }
96
+ .breadcrumb-link:hover {
97
+ color: var(--radar-text-secondary);
98
+ }
99
+
100
+ .edit-link {
101
+ display: inline-flex;
102
+ align-items: center;
103
+ gap: 0.5rem;
104
+ font-size: 0.875rem;
105
+ color: var(--radar-text-muted);
106
+ text-decoration: none;
107
+ transition: color 0.15s;
108
+ }
109
+ .edit-link:hover {
110
+ color: var(--radar-link);
111
+ }
112
+ </style>
@@ -0,0 +1,37 @@
1
+ @import "tailwindcss";
2
+ @source "../**/*.astro";
3
+ @plugin "@tailwindcss/typography";
4
+
5
+ body {
6
+ background-color: var(--radar-bg);
7
+ color: var(--radar-text);
8
+ }
9
+
10
+ /* Prose overrides using semantic tokens — use direct properties to beat plugin defaults */
11
+ .prose {
12
+ color: var(--radar-prose-body) !important;
13
+ }
14
+
15
+ .prose :where(h1, h2, h3, h4, h5, h6) {
16
+ color: var(--radar-prose-headings);
17
+ }
18
+
19
+ .prose :where(a) {
20
+ color: var(--radar-prose-links);
21
+ }
22
+
23
+ .prose :where(strong, b) {
24
+ color: var(--radar-prose-bold);
25
+ }
26
+
27
+ .prose :where(code) {
28
+ color: var(--radar-prose-code);
29
+ }
30
+
31
+ .prose :where(blockquote) {
32
+ color: var(--radar-prose-quotes);
33
+ }
34
+
35
+ .prose :where(hr) {
36
+ border-color: var(--radar-prose-hr);
37
+ }
@@ -0,0 +1,55 @@
1
+ /* Catppuccin Mocha — dark-only theme */
2
+ :root {
3
+ /* Layout */
4
+ --radar-bg: #1e1e2e;
5
+ --radar-bg-secondary: #181825;
6
+ --radar-text: #cdd6f4;
7
+ --radar-text-secondary: #bac2de;
8
+ --radar-text-muted: #a6adc8;
9
+ --radar-text-faint: #9399b2;
10
+ --radar-border: #313244;
11
+ --radar-border-subtle: #45475a;
12
+
13
+ /* Interactive */
14
+ --radar-hover-bg: #313244;
15
+ --radar-link: #89b4fa;
16
+ --radar-active-bg: #89b4fa;
17
+ --radar-active-text: #11111b;
18
+
19
+ /* Radar SVG */
20
+ --radar-chart-center: #313244;
21
+ --radar-chart-mid: #181825;
22
+ --radar-chart-edge: #11111b;
23
+ --radar-chart-ring: #45475a;
24
+ --radar-chart-divider: #45475a;
25
+ --radar-chart-label: #7f849c;
26
+ --radar-chart-band: 205, 214, 244;
27
+ --radar-dot-stroke: #11111b;
28
+
29
+ /* Ring status */
30
+ --radar-ring-adopt: #a6e3a1;
31
+ --radar-ring-adopt-bg: rgba(166, 227, 161, 0.15);
32
+ --radar-ring-adopt-border: rgba(166, 227, 161, 0.3);
33
+ --radar-ring-trial: #89b4fa;
34
+ --radar-ring-trial-bg: rgba(137, 180, 250, 0.15);
35
+ --radar-ring-trial-border: rgba(137, 180, 250, 0.3);
36
+ --radar-ring-assess: #f9e2af;
37
+ --radar-ring-assess-bg: rgba(249, 226, 175, 0.15);
38
+ --radar-ring-assess-border: rgba(249, 226, 175, 0.3);
39
+ --radar-ring-hold: #f38ba8;
40
+ --radar-ring-hold-bg: rgba(243, 139, 168, 0.15);
41
+ --radar-ring-hold-border: rgba(243, 139, 168, 0.3);
42
+
43
+ /* Signals */
44
+ --radar-moved-in: #a6e3a1;
45
+ --radar-moved-out: #f38ba8;
46
+
47
+ /* Prose */
48
+ --radar-prose-body: #bac2de;
49
+ --radar-prose-headings: #cdd6f4;
50
+ --radar-prose-links: #89b4fa;
51
+ --radar-prose-bold: #cdd6f4;
52
+ --radar-prose-code: #cba6f7;
53
+ --radar-prose-quotes: #a6adc8;
54
+ --radar-prose-hr: #45475a;
55
+ }
@@ -0,0 +1,171 @@
1
+ /* Default theme — light and dark mode */
2
+
3
+ /* Light mode (default) */
4
+ :root {
5
+ /* Layout */
6
+ --radar-bg: #ffffff;
7
+ --radar-bg-secondary: #f8fafc;
8
+ --radar-text: #0f172a;
9
+ --radar-text-secondary: #334155;
10
+ --radar-text-muted: #64748b;
11
+ --radar-text-faint: #94a3b8;
12
+ --radar-border: #e2e8f0;
13
+ --radar-border-subtle: #cbd5e1;
14
+
15
+ /* Interactive */
16
+ --radar-hover-bg: #f1f5f9;
17
+ --radar-link: #2563eb;
18
+ --radar-active-bg: #2563eb;
19
+ --radar-active-text: #ffffff;
20
+
21
+ /* Radar SVG */
22
+ --radar-chart-center: #e2e8f0;
23
+ --radar-chart-mid: #f1f5f9;
24
+ --radar-chart-edge: #f8fafc;
25
+ --radar-chart-ring: #cbd5e1;
26
+ --radar-chart-divider: #cbd5e1;
27
+ --radar-chart-label: #64748b;
28
+ --radar-chart-band: 15, 23, 42;
29
+ --radar-dot-stroke: #ffffff;
30
+
31
+ /* Ring status */
32
+ --radar-ring-adopt: #16a34a;
33
+ --radar-ring-adopt-bg: rgba(22, 163, 74, 0.1);
34
+ --radar-ring-adopt-border: rgba(22, 163, 74, 0.25);
35
+ --radar-ring-trial: #2563eb;
36
+ --radar-ring-trial-bg: rgba(37, 99, 235, 0.1);
37
+ --radar-ring-trial-border: rgba(37, 99, 235, 0.25);
38
+ --radar-ring-assess: #ca8a04;
39
+ --radar-ring-assess-bg: rgba(202, 138, 4, 0.1);
40
+ --radar-ring-assess-border: rgba(202, 138, 4, 0.25);
41
+ --radar-ring-hold: #dc2626;
42
+ --radar-ring-hold-bg: rgba(220, 38, 38, 0.1);
43
+ --radar-ring-hold-border: rgba(220, 38, 38, 0.25);
44
+
45
+ /* Signals */
46
+ --radar-moved-in: #16a34a;
47
+ --radar-moved-out: #dc2626;
48
+
49
+ /* Prose */
50
+ --radar-prose-body: #334155;
51
+ --radar-prose-headings: #0f172a;
52
+ --radar-prose-links: #2563eb;
53
+ --radar-prose-bold: #0f172a;
54
+ --radar-prose-code: #7c3aed;
55
+ --radar-prose-quotes: #64748b;
56
+ --radar-prose-hr: #e2e8f0;
57
+ }
58
+
59
+ /* Dark mode — system preference OR explicit data-theme attribute */
60
+ @media (prefers-color-scheme: dark) {
61
+ :root:not([data-theme="light"]) {
62
+ /* Layout */
63
+ --radar-bg: #0f172a;
64
+ --radar-bg-secondary: #1e293b;
65
+ --radar-text: #e2e8f0;
66
+ --radar-text-secondary: #cbd5e1;
67
+ --radar-text-muted: #94a3b8;
68
+ --radar-text-faint: #94a3b8;
69
+ --radar-border: #334155;
70
+ --radar-border-subtle: #475569;
71
+
72
+ /* Interactive */
73
+ --radar-hover-bg: #334155;
74
+ --radar-link: #60a5fa;
75
+ --radar-active-bg: #3b82f6;
76
+ --radar-active-text: #0f172a;
77
+
78
+ /* Radar SVG */
79
+ --radar-chart-center: #334155;
80
+ --radar-chart-mid: #1e293b;
81
+ --radar-chart-edge: #0f172a;
82
+ --radar-chart-ring: #475569;
83
+ --radar-chart-divider: #475569;
84
+ --radar-chart-label: #94a3b8;
85
+ --radar-chart-band: 226, 232, 240;
86
+ --radar-dot-stroke: #0f172a;
87
+
88
+ /* Ring status */
89
+ --radar-ring-adopt: #4ade80;
90
+ --radar-ring-adopt-bg: rgba(74, 222, 128, 0.15);
91
+ --radar-ring-adopt-border: rgba(74, 222, 128, 0.3);
92
+ --radar-ring-trial: #60a5fa;
93
+ --radar-ring-trial-bg: rgba(96, 165, 250, 0.15);
94
+ --radar-ring-trial-border: rgba(96, 165, 250, 0.3);
95
+ --radar-ring-assess: #facc15;
96
+ --radar-ring-assess-bg: rgba(250, 204, 21, 0.15);
97
+ --radar-ring-assess-border: rgba(250, 204, 21, 0.3);
98
+ --radar-ring-hold: #f87171;
99
+ --radar-ring-hold-bg: rgba(248, 113, 113, 0.15);
100
+ --radar-ring-hold-border: rgba(248, 113, 113, 0.3);
101
+
102
+ /* Signals */
103
+ --radar-moved-in: #4ade80;
104
+ --radar-moved-out: #f87171;
105
+
106
+ /* Prose */
107
+ --radar-prose-body: #cbd5e1;
108
+ --radar-prose-headings: #e2e8f0;
109
+ --radar-prose-links: #60a5fa;
110
+ --radar-prose-bold: #e2e8f0;
111
+ --radar-prose-code: #a78bfa;
112
+ --radar-prose-quotes: #94a3b8;
113
+ --radar-prose-hr: #475569;
114
+ }
115
+ }
116
+
117
+ /* Explicit dark override (user clicked toggle while system is light) */
118
+ :root[data-theme="dark"] {
119
+ /* Layout */
120
+ --radar-bg: #0f172a;
121
+ --radar-bg-secondary: #1e293b;
122
+ --radar-text: #e2e8f0;
123
+ --radar-text-secondary: #cbd5e1;
124
+ --radar-text-muted: #94a3b8;
125
+ --radar-text-faint: #94a3b8;
126
+ --radar-border: #334155;
127
+ --radar-border-subtle: #475569;
128
+
129
+ /* Interactive */
130
+ --radar-hover-bg: #334155;
131
+ --radar-link: #60a5fa;
132
+ --radar-active-bg: #3b82f6;
133
+ --radar-active-text: #0f172a;
134
+
135
+ /* Radar SVG */
136
+ --radar-chart-center: #334155;
137
+ --radar-chart-mid: #1e293b;
138
+ --radar-chart-edge: #0f172a;
139
+ --radar-chart-ring: #475569;
140
+ --radar-chart-divider: #475569;
141
+ --radar-chart-label: #94a3b8;
142
+ --radar-chart-band: 226, 232, 240;
143
+ --radar-dot-stroke: #0f172a;
144
+
145
+ /* Ring status */
146
+ --radar-ring-adopt: #4ade80;
147
+ --radar-ring-adopt-bg: rgba(74, 222, 128, 0.15);
148
+ --radar-ring-adopt-border: rgba(74, 222, 128, 0.3);
149
+ --radar-ring-trial: #60a5fa;
150
+ --radar-ring-trial-bg: rgba(96, 165, 250, 0.15);
151
+ --radar-ring-trial-border: rgba(96, 165, 250, 0.3);
152
+ --radar-ring-assess: #facc15;
153
+ --radar-ring-assess-bg: rgba(250, 204, 21, 0.15);
154
+ --radar-ring-assess-border: rgba(250, 204, 21, 0.3);
155
+ --radar-ring-hold: #f87171;
156
+ --radar-ring-hold-bg: rgba(248, 113, 113, 0.15);
157
+ --radar-ring-hold-border: rgba(248, 113, 113, 0.3);
158
+
159
+ /* Signals */
160
+ --radar-moved-in: #4ade80;
161
+ --radar-moved-out: #f87171;
162
+
163
+ /* Prose */
164
+ --radar-prose-body: #cbd5e1;
165
+ --radar-prose-headings: #e2e8f0;
166
+ --radar-prose-links: #60a5fa;
167
+ --radar-prose-bold: #e2e8f0;
168
+ --radar-prose-code: #a78bfa;
169
+ --radar-prose-quotes: #94a3b8;
170
+ --radar-prose-hr: #475569;
171
+ }
package/virtual.d.ts ADDED
@@ -0,0 +1,9 @@
1
+ declare module 'virtual:techradar/config' {
2
+ const config: import('./config').ResolvedConfig;
3
+ export default config;
4
+ }
5
+
6
+ declare module 'virtual:techradar/theme' {
7
+ const css: string;
8
+ export default css;
9
+ }