Skip to content

Commit 80668b4

Browse files
p-linnaneclaude
andauthored
feat(site): show device marketing names in hardware support grid (#366)
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent db024c0 commit 80668b4

2 files changed

Lines changed: 150 additions & 2 deletions

File tree

site/src/components/ChipGrid.astro

Lines changed: 45 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ interface Props {
77
kernels: Kernel[];
88
}
99
10+
import { deviceDisplayName } from '../lib/deviceNames';
11+
1012
const { kernels } = Astro.props;
1113
1214
const chipFamilies: Record<string, { device: string; chip: string }[]> = {};
@@ -26,13 +28,23 @@ const hasChips = Object.keys(chipFamilies).length > 0;
2628
hasChips && (
2729
<section class="hardware" data-pagefind-ignore>
2830
<h2>Hardware Support</h2>
31+
<p class="hardware-hint">Click a device name to show its model identifier.</p>
2932
<div class="chip-grid">
3033
{Object.entries(chipFamilies).map(([chip, devices]) => (
3134
<div class="chip-card">
3235
<h3>{chip}</h3>
3336
<ul>
3437
{devices.map((d) => (
35-
<li>{d.device}</li>
38+
<li>
39+
<button
40+
type="button"
41+
class="device-toggle"
42+
data-model={d.device}
43+
data-name={deviceDisplayName(d.device)}
44+
>
45+
{deviceDisplayName(d.device)}
46+
</button>
47+
</li>
3648
))}
3749
</ul>
3850
</div>
@@ -50,6 +62,12 @@ const hasChips = Object.keys(chipFamilies).length > 0;
5062
border-bottom: 2px solid var(--color-border);
5163
}
5264

65+
.hardware-hint {
66+
font-size: 0.85rem;
67+
color: var(--color-text-secondary);
68+
margin-bottom: 1rem;
69+
}
70+
5371
.chip-grid {
5472
display: grid;
5573
grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
@@ -81,10 +99,35 @@ const hasChips = Object.keys(chipFamilies).length > 0;
8199
list-style: none;
82100
font-size: 0.85rem;
83101
color: var(--color-text-secondary);
84-
font-family: var(--font-mono);
85102
}
86103

87104
.chip-card li {
88105
padding: 0.15rem 0;
89106
}
107+
108+
.device-toggle {
109+
appearance: none;
110+
background: none;
111+
border: none;
112+
padding: 0;
113+
margin: 0;
114+
font: inherit;
115+
color: inherit;
116+
cursor: pointer;
117+
text-align: left;
118+
}
119+
120+
.device-toggle:hover {
121+
text-decoration: underline;
122+
text-decoration-style: dotted;
123+
}
90124
</style>
125+
126+
<script>
127+
document.addEventListener('click', (e) => {
128+
const btn = (e.target as HTMLElement).closest('.device-toggle') as HTMLButtonElement | null;
129+
if (!btn) return;
130+
const isModel = btn.classList.toggle('showing-model');
131+
btn.textContent = isModel ? btn.dataset.model! : btn.dataset.name!;
132+
});
133+
</script>

site/src/lib/deviceNames.ts

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
/**
2+
* Device model identifier to marketing name mapping.
3+
* Mirrors Sources/macOSdbKit/Models/DeviceRegistry.swift — keep in sync.
4+
*/
5+
const deviceNames: Record<string, string> = {
6+
// M1
7+
'MacBookAir10,1': 'MacBook Air (M1, Late 2020)',
8+
'MacBookPro17,1': 'MacBook Pro (13-inch, M1, Late 2020)',
9+
'Macmini9,1': 'Mac mini (M1, Late 2020)',
10+
'iMac21,1': 'iMac (24-inch, M1, 2021) 2-port',
11+
'iMac21,2': 'iMac (24-inch, M1, 2021) 4-port',
12+
13+
// M1 Pro
14+
'MacBookPro18,1': 'MacBook Pro (16-inch, M1 Pro, Late 2021)',
15+
'MacBookPro18,3': 'MacBook Pro (14-inch, M1 Pro, Late 2021)',
16+
17+
// M1 Max
18+
'MacBookPro18,2': 'MacBook Pro (16-inch, M1 Max, Late 2021)',
19+
'MacBookPro18,4': 'MacBook Pro (14-inch, M1 Max, Late 2021)',
20+
'Mac13,1': 'Mac Studio (M1 Max, 2022)',
21+
22+
// M1 Ultra
23+
'Mac13,2': 'Mac Studio (M1 Ultra, 2022)',
24+
25+
// M2
26+
'Mac14,2': 'MacBook Air (13-inch, M2, 2022)',
27+
'Mac14,7': 'MacBook Pro (13-inch, M2, 2022)',
28+
'Mac14,3': 'Mac mini (M2, 2023)',
29+
'Mac14,15': 'MacBook Air (15-inch, M2, 2023)',
30+
31+
// M2 Pro
32+
'Mac14,9': 'MacBook Pro (14-inch, M2 Pro, 2023)',
33+
'Mac14,10': 'MacBook Pro (16-inch, M2 Pro, 2023)',
34+
'Mac14,12': 'Mac mini (M2 Pro, 2023)',
35+
36+
// M2 Max
37+
'Mac14,5': 'MacBook Pro (14-inch, M2 Max, 2023)',
38+
'Mac14,6': 'MacBook Pro (16-inch, M2 Max, 2023)',
39+
'Mac14,13': 'Mac Studio (M2 Max, 2023)',
40+
41+
// M2 Ultra
42+
'Mac14,14': 'Mac Studio (M2 Ultra, 2023)',
43+
'Mac14,8': 'Mac Pro (M2 Ultra, 2023)',
44+
45+
// M3
46+
'Mac15,3': 'MacBook Pro (14-inch, M3, Late 2023)',
47+
'Mac15,4': 'iMac (24-inch, M3, 2023) 2-port',
48+
'Mac15,5': 'iMac (24-inch, M3, 2023) 4-port',
49+
'Mac15,12': 'MacBook Air (13-inch, M3, 2024)',
50+
'Mac15,13': 'MacBook Air (15-inch, M3, 2024)',
51+
52+
// M3 Pro
53+
'Mac15,6': 'MacBook Pro (14-inch, M3 Pro, Late 2023)',
54+
'Mac15,7': 'MacBook Pro (16-inch, M3 Pro, Late 2023)',
55+
56+
// M3 Max
57+
'Mac15,8': 'MacBook Pro (14-inch, M3 Max, Late 2023)',
58+
'Mac15,9': 'MacBook Pro (16-inch, M3 Max, Late 2023)',
59+
'Mac15,10': 'MacBook Pro (14-inch, M3 Max, Late 2023)',
60+
'Mac15,11': 'MacBook Pro (16-inch, M3 Max, Late 2023)',
61+
62+
// M3 Ultra
63+
'Mac15,14': 'Mac Studio (M3 Ultra, 2025)',
64+
65+
// M4
66+
'Mac16,1': 'MacBook Pro (14-inch, M4, Late 2024)',
67+
'Mac16,2': 'iMac (24-inch, M4, 2024) 2-port',
68+
'Mac16,3': 'iMac (24-inch, M4, 2024) 4-port',
69+
'Mac16,10': 'Mac mini (M4, 2024)',
70+
'Mac16,12': 'MacBook Air (13-inch, M4, 2025)',
71+
'Mac16,13': 'MacBook Air (15-inch, M4, 2025)',
72+
73+
// M4 Pro
74+
'Mac16,7': 'MacBook Pro (16-inch, M4 Pro, Late 2024)',
75+
'Mac16,8': 'MacBook Pro (14-inch, M4 Pro, Late 2024)',
76+
'Mac16,11': 'Mac mini (M4 Pro, 2024)',
77+
78+
// M4 Max
79+
'Mac16,5': 'MacBook Pro (16-inch, M4 Max, Late 2024)',
80+
'Mac16,6': 'MacBook Pro (14-inch, M4 Max, Late 2024)',
81+
'Mac16,9': 'Mac Studio (M4 Max, 2025)',
82+
83+
// M5
84+
'Mac17,2': 'MacBook Pro (14-inch, M5, 2025)',
85+
'Mac17,3': 'MacBook Air (13-inch, M5, 2026)',
86+
'Mac17,4': 'MacBook Air (15-inch, M5, 2026)',
87+
88+
// M5 Pro
89+
'Mac17,6': 'MacBook Pro (16-inch, M5 Pro, 2026)',
90+
'Mac17,7': 'MacBook Pro (14-inch, M5 Pro, 2026)',
91+
92+
// M5 Max
93+
'Mac17,8': 'MacBook Pro (16-inch, M5 Max, 2026)',
94+
'Mac17,9': 'MacBook Pro (14-inch, M5 Max, 2026)',
95+
96+
// A18 Pro
97+
'Mac17,5': 'MacBook Neo (13-inch, 2026)',
98+
99+
// Virtual Mac
100+
'VirtualMac2,1': 'Apple Virtual Machine',
101+
};
102+
103+
export function deviceDisplayName(model: string): string {
104+
return deviceNames[model] ?? model;
105+
}

0 commit comments

Comments
 (0)