Review

Scope kiln-hold CTAs with CSS modules composes

KilnShare still ships hold-slot CTAs from a global buttons.css, so .primary undercuts every other primary on the member portal. Move the shared surface into Button.module.css, reuse it with composes for primary/ghost variants (no :global), and wire ConfirmHold to the hashed class map so nothing leaks into the rest of the app.

CSS ModulesTier 1css-modulescomposesscoping

Click a line to flag it, pick one or more labels, then submit. If the change looks correct, approve it.

src/holds/Button.module.css+11-4
1-/* was global: src/styles/buttons.css */
2-.btn {
1+/* local-only base — hashed; composes shares it without a second DOM class string */
2+.base {
33 display: inline-flex;
44 align-items: center;
55 justify-content: center;
66 gap: 0.5rem;
77 min-height: 2.5rem;
88 padding: 0.5rem 1rem;
99 border-radius: 0.5rem;
1010 font: 600 0.875rem/1.2 var(--sans);
1111 cursor: pointer;
1212}
1313
14-.btn.primary {
14+.primary {
15+ composes: base;
1516 border: 1px solid var(--clay-700);
1617 background: var(--clay-600);
1718 color: var(--paper);
1819}
1920
20-.btn.ghost {
21+.ghost {
22+ composes: base;
2123 border: 1px solid var(--ink-200);
2224 background: transparent;
2325 color: var(--ink-800);
2426}
2527
28+.primary:disabled,
29+.ghost:disabled {
30+ opacity: 0.5;
31+ cursor: not-allowed;
32+}