| 18 |
18 |
pressure, |
| 19 |
19 |
type DimensionKey, |
| 20 |
20 |
} from "@airiskindex/scoring"; |
| 21 |
|
−import { ScoreBar, ScoreTile, ShareMeter } from "@/components/score-marks"; |
|
21 |
+import { ScoreBar, ShareMeter, SubScoreDotPlot } from "@/components/score-marks"; |
| 22 |
22 |
import { formatWage, socGroupName } from "@/lib/soc-groups"; |
| 23 |
23 |
|
| 24 |
24 |
export const dynamic = "force-dynamic"; |
| 197 |
197 |
) : ( |
| 198 |
198 |
<> |
| 199 |
199 |
<section className="mt-10"> |
| 200 |
|
− <div className="grid gap-4 sm:grid-cols-3"> |
| 201 |
|
− <ScoreTile |
| 202 |
|
− label="Substitution" |
| 203 |
|
− band={{ |
| 204 |
|
− low: score.substitutionLow, |
| 205 |
|
− score: score.substitution, |
| 206 |
|
− high: score.substitutionHigh, |
| 207 |
|
− }} |
| 208 |
|
− hint="Composite pressure that AI replaces the human on this occupation's tasks — capability discounted by cost, barriers and adoption." |
| 209 |
|
− /> |
| 210 |
|
− <ScoreTile |
| 211 |
|
− label="Exposure" |
| 212 |
|
− band={{ low: score.exposureLow, score: score.exposure, high: score.exposureHigh }} |
| 213 |
|
− hint="Technical capability only: could AI perform these tasks, regardless of whether anyone deploys it." |
| 214 |
|
− /> |
| 215 |
|
− <ScoreTile |
| 216 |
|
− label="Augmentation" |
| 217 |
|
− band={{ |
| 218 |
|
− low: score.augmentationLow, |
| 219 |
|
− score: score.augmentation, |
| 220 |
|
− high: score.augmentationHigh, |
| 221 |
|
− }} |
| 222 |
|
− hint="How much AI assists a human doing this work. High augmentation with moderate substitution reads as a changing job, not a disappearing one." |
| 223 |
|
− /> |
|
200 |
+ <div className="card p-5 sm:p-6"> |
|
201 |
+ <div className="flex flex-wrap items-baseline justify-between gap-2"> |
|
202 |
+ <h2 className="text-lg font-semibold tracking-tight">Sub-scores</h2> |
|
203 |
+ <p className="text-xs text-[var(--muted)]"> |
|
204 |
+ 0–100 · band = confidence interval from rater disagreement |
|
205 |
+ </p> |
|
206 |
+ </div> |
|
207 |
+ <div className="mt-4"> |
|
208 |
+ <SubScoreDotPlot |
|
209 |
+ rows={[ |
|
210 |
+ { |
|
211 |
+ label: "Substitution", |
|
212 |
+ band: { |
|
213 |
+ low: score.substitutionLow, |
|
214 |
+ score: score.substitution, |
|
215 |
+ high: score.substitutionHigh, |
|
216 |
+ }, |
|
217 |
+ }, |
|
218 |
+ { |
|
219 |
+ label: "Exposure", |
|
220 |
+ band: { |
|
221 |
+ low: score.exposureLow, |
|
222 |
+ score: score.exposure, |
|
223 |
+ high: score.exposureHigh, |
|
224 |
+ }, |
|
225 |
+ }, |
|
226 |
+ { |
|
227 |
+ label: "Augmentation", |
|
228 |
+ band: { |
|
229 |
+ low: score.augmentationLow, |
|
230 |
+ score: score.augmentation, |
|
231 |
+ high: score.augmentationHigh, |
|
232 |
+ }, |
|
233 |
+ }, |
|
234 |
+ ]} |
|
235 |
+ /> |
|
236 |
+ </div> |
|
237 |
+ <div className="mt-5 grid gap-4 border-t border-[var(--grid)] pt-4 text-xs leading-relaxed text-[var(--muted)] sm:grid-cols-3"> |
|
238 |
+ <p> |
|
239 |
+ <strong className="font-medium text-[var(--ink-2)]">Substitution</strong> — the |
|
240 |
+ headline: capability discounted by cost, barriers and adoption. |
|
241 |
+ </p> |
|
242 |
+ <p> |
|
243 |
+ <strong className="font-medium text-[var(--ink-2)]">Exposure</strong> — |
|
244 |
+ technical capability alone, regardless of whether anyone deploys it. |
|
245 |
+ </p> |
|
246 |
+ <p> |
|
247 |
+ <strong className="font-medium text-[var(--ink-2)]">Augmentation</strong> — how |
|
248 |
+ much AI assists without replacing. High here + moderate substitution = a |
|
249 |
+ changing job, not a disappearing one. |
|
250 |
+ </p> |
|
251 |
+ </div> |
| 224 |
252 |
</div> |
| 225 |
253 |
<div className="mt-4"> |
| 226 |
254 |
<ShareMeter |
| 248 |
276 |
<div className="mt-5 overflow-hidden card"> |
| 249 |
277 |
{dimensions.map((dim) => ( |
| 250 |
278 |
<div key={dim.dimension} className="border-b border-[var(--grid)] px-5 py-3.5 last:border-b-0"> |
| 251 |
|
− <div className="flex items-baseline gap-2"> |
|
279 |
+ <div className="flex flex-wrap items-baseline gap-2"> |
| 252 |
280 |
<span className="text-sm font-medium"> |
| 253 |
281 |
{DIMENSION_LABELS[dim.dimension]} |
| 254 |
282 |
</span> |
| 255 |
|
− <span className="text-xs text-[var(--muted)]"> |
| 256 |
|
− weight {(dim.weight * 100).toFixed(0)}% |
| 257 |
|
− {dim.inverted && " · inverted — strong barriers lower the score"} |
|
283 |
+ <span className="rounded-full bg-[var(--seq-track)] px-2 py-0.5 text-[10px] font-semibold tabular-nums"> |
|
284 |
+ w {(dim.weight * 100).toFixed(0)}% |
| 258 |
285 |
</span> |
|
286 |
+ {dim.inverted && ( |
|
287 |
+ <span className="text-xs text-[var(--muted)]"> |
|
288 |
+ inverted — strong barriers lower the score |
|
289 |
+ </span> |
|
290 |
+ )} |
| 259 |
291 |
<span className="ml-auto text-sm font-semibold tabular-nums"> |
| 260 |
292 |
{dim.pressure.toFixed(0)} |
| 261 |
293 |
</span> |