@usefidel/design-system 0.16.0 → 0.18.0

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.
package/dist/index.css CHANGED
@@ -1519,6 +1519,15 @@
1519
1519
  .fds-dot--danger {
1520
1520
  background: var(--color-destructive, #eb2d2d);
1521
1521
  }
1522
+ .fds-tag__icon {
1523
+ display: inline-flex;
1524
+ flex-shrink: 0;
1525
+ color: var(--color-text-secondary, #525252);
1526
+ }
1527
+ .fds-tag__icon > svg {
1528
+ width: 14px;
1529
+ height: 14px;
1530
+ }
1522
1531
 
1523
1532
  /* src/components/MultiSelect/multi-select.css */
1524
1533
  .fds-multiselect {
@@ -1915,6 +1924,103 @@
1915
1924
  filter: drop-shadow(0 8px 8px rgba(0, 0, 0, 0.13));
1916
1925
  }
1917
1926
 
1927
+ /* src/components/Callout/callout.css */
1928
+ .fds-callout {
1929
+ box-sizing: border-box;
1930
+ display: flex;
1931
+ align-items: center;
1932
+ gap: 14px;
1933
+ padding: 14px 16px;
1934
+ border: 1px solid var(--fds-callout-border);
1935
+ border-radius: var(--radius-lg, 12px);
1936
+ background: var(--fds-callout-bg);
1937
+ font-family: var(--font-body, "Rethink Sans", system-ui, sans-serif);
1938
+ color: var(--color-text, #171717);
1939
+ }
1940
+ .fds-callout__icon {
1941
+ display: inline-flex;
1942
+ align-items: center;
1943
+ justify-content: center;
1944
+ flex-shrink: 0;
1945
+ align-self: flex-start;
1946
+ width: 32px;
1947
+ height: 32px;
1948
+ border-radius: var(--radius-md, 8px);
1949
+ background: var(--color-bg, #ffffff);
1950
+ color: var(--fds-callout-icon);
1951
+ }
1952
+ .fds-callout__icon > svg {
1953
+ width: 16px;
1954
+ height: 16px;
1955
+ }
1956
+ .fds-callout__body {
1957
+ flex: 1;
1958
+ min-width: 0;
1959
+ }
1960
+ .fds-callout__title {
1961
+ display: flex;
1962
+ flex-wrap: wrap;
1963
+ align-items: center;
1964
+ gap: 4px 8px;
1965
+ margin: 0;
1966
+ font-size: var(--font-size-text-sm, 14px);
1967
+ line-height: 20px;
1968
+ font-weight: var(--font-weight-semibold, 600);
1969
+ }
1970
+ .fds-callout__aside {
1971
+ display: inline-flex;
1972
+ }
1973
+ .fds-callout__text {
1974
+ margin-top: 2px;
1975
+ font-size: 13px;
1976
+ line-height: 20px;
1977
+ color: var(--color-text-secondary, #525252);
1978
+ }
1979
+ .fds-callout__action {
1980
+ display: flex;
1981
+ flex-shrink: 0;
1982
+ gap: 8px;
1983
+ }
1984
+ @media (max-width: 480px) {
1985
+ .fds-callout {
1986
+ flex-wrap: wrap;
1987
+ }
1988
+ .fds-callout__action {
1989
+ flex-basis: 100%;
1990
+ padding-left: 46px;
1991
+ }
1992
+ }
1993
+ .fds-callout--neutral {
1994
+ --fds-callout-bg: var(--color-surface-subtle, #fafafa);
1995
+ --fds-callout-border: var(--color-border, #e5e5e5);
1996
+ --fds-callout-icon: var(--color-text-secondary, #525252);
1997
+ }
1998
+ .fds-callout--accent {
1999
+ --fds-callout-bg: var(--color-accent-subtle, #fff7ed);
2000
+ --fds-callout-border: var(--color-accent-muted, #fdba74);
2001
+ --fds-callout-icon: var(--color-accent, #ea580c);
2002
+ }
2003
+ .fds-callout--info {
2004
+ --fds-callout-bg: var(--color-info-surface, #eff6ff);
2005
+ --fds-callout-border: var(--color-info, #93c5fd);
2006
+ --fds-callout-icon: var(--color-info-strong, #2563eb);
2007
+ }
2008
+ .fds-callout--success {
2009
+ --fds-callout-bg: var(--color-success-bg, #f0fdf4);
2010
+ --fds-callout-border: var(--color-success, #86efac);
2011
+ --fds-callout-icon: var(--color-success-text, #15803d);
2012
+ }
2013
+ .fds-callout--warning {
2014
+ --fds-callout-bg: var(--color-warning-bg, #fffbeb);
2015
+ --fds-callout-border: var(--color-warning-border, #fcd34d);
2016
+ --fds-callout-icon: var(--color-warning-text, #92400e);
2017
+ }
2018
+ .fds-callout--danger {
2019
+ --fds-callout-bg: var(--color-error-bg, #fef2f2);
2020
+ --fds-callout-border: var(--color-error-border, #fecaca);
2021
+ --fds-callout-icon: var(--color-destructive, #eb2d2d);
2022
+ }
2023
+
1918
2024
  /* src/components/Skeleton/skeleton.css */
1919
2025
  .fds-skeleton {
1920
2026
  display: block;
@@ -1952,3 +2058,374 @@
1952
2058
  animation: none;
1953
2059
  }
1954
2060
  }
2061
+
2062
+ /* src/components/Card/card.css */
2063
+ .fds-card {
2064
+ box-sizing: border-box;
2065
+ border-radius: var(--radius-2xl, 16px);
2066
+ color: var(--color-text, #171717);
2067
+ }
2068
+ .fds-card--subtle {
2069
+ background: var(--color-surface-subtle, #fafafa);
2070
+ border: 1px solid var(--color-border-light, #f5f5f5);
2071
+ }
2072
+ .fds-card--default {
2073
+ background: var(--color-bg, #ffffff);
2074
+ border: 1px solid var(--color-border, #e5e5e5);
2075
+ border-radius: var(--radius-xl, 12px);
2076
+ }
2077
+ .fds-card--plain {
2078
+ background: var(--color-bg, #ffffff);
2079
+ border: 1px solid transparent;
2080
+ border-radius: var(--radius-xl, 12px);
2081
+ }
2082
+ .fds-card--pad-none {
2083
+ padding: 0;
2084
+ }
2085
+ .fds-card--pad-md {
2086
+ padding: var(--spacing-6, 24px);
2087
+ }
2088
+ .fds-card--pad-lg {
2089
+ padding: var(--spacing-10, 40px) var(--spacing-12, 48px);
2090
+ }
2091
+ @media (max-width: 600px) {
2092
+ .fds-card--pad-lg {
2093
+ padding: var(--spacing-6, 24px);
2094
+ }
2095
+ }
2096
+
2097
+ /* src/components/Stat/stat.css */
2098
+ .fds-stat {
2099
+ display: flex;
2100
+ flex-direction: column;
2101
+ gap: var(--spacing-1, 4px);
2102
+ font-family: var(--font-body, "Rethink Sans", system-ui, sans-serif);
2103
+ }
2104
+ .fds-stat__label {
2105
+ margin: 0;
2106
+ font-size: var(--font-size-text-sm, 14px);
2107
+ line-height: 20px;
2108
+ font-weight: var(--font-weight-medium, 500);
2109
+ color: var(--color-text-secondary, #525252);
2110
+ }
2111
+ .fds-stat__value {
2112
+ margin: 0;
2113
+ font-size: var(--font-size-display-md, 36px);
2114
+ line-height: 44px;
2115
+ font-weight: var(--font-weight-semibold, 600);
2116
+ letter-spacing: -0.02em;
2117
+ color: var(--color-text, #171717);
2118
+ font-variant-numeric: tabular-nums;
2119
+ }
2120
+ .fds-stat__detail {
2121
+ display: flex;
2122
+ flex-wrap: wrap;
2123
+ gap: var(--spacing-2, 8px);
2124
+ margin-top: var(--spacing-3, 12px);
2125
+ }
2126
+
2127
+ /* src/components/Checkbox/checkbox.css */
2128
+ .fds-checkbox {
2129
+ display: inline-flex;
2130
+ position: relative;
2131
+ }
2132
+ .fds-checkbox__input {
2133
+ position: absolute;
2134
+ inset: 0;
2135
+ width: 100%;
2136
+ height: 100%;
2137
+ margin: 0;
2138
+ opacity: 0;
2139
+ cursor: pointer;
2140
+ z-index: 1;
2141
+ }
2142
+ .fds-checkbox__input:disabled {
2143
+ cursor: not-allowed;
2144
+ }
2145
+ .fds-checkbox__control {
2146
+ display: inline-flex;
2147
+ align-items: flex-start;
2148
+ gap: var(--spacing-2, 8px);
2149
+ cursor: pointer;
2150
+ }
2151
+ .fds-checkbox__box {
2152
+ box-sizing: border-box;
2153
+ display: inline-grid;
2154
+ place-items: center;
2155
+ flex-shrink: 0;
2156
+ width: 16px;
2157
+ height: 16px;
2158
+ margin-top: 3px;
2159
+ border: 1px solid var(--color-border-strong, #d4d4d4);
2160
+ border-radius: var(--radius-sm, 4px);
2161
+ background: var(--color-bg, #ffffff);
2162
+ color: var(--color-bg, #ffffff);
2163
+ transition: background-color var(--duration-quick, 150ms) ease, border-color var(--duration-quick, 150ms) ease;
2164
+ }
2165
+ .fds-checkbox__control:not(:has(.fds-checkbox__text)) .fds-checkbox__box {
2166
+ margin-top: 0;
2167
+ }
2168
+ .fds-checkbox__tick,
2169
+ .fds-checkbox__dash {
2170
+ grid-area: 1 / 1;
2171
+ width: 10px;
2172
+ height: 10px;
2173
+ visibility: hidden;
2174
+ }
2175
+ .fds-checkbox__input:checked ~ .fds-checkbox__control .fds-checkbox__box,
2176
+ .fds-checkbox__input:indeterminate ~ .fds-checkbox__control .fds-checkbox__box {
2177
+ background: var(--color-text, #171717);
2178
+ border-color: var(--color-text, #171717);
2179
+ }
2180
+ .fds-checkbox__input:checked:not(:indeterminate) ~ .fds-checkbox__control .fds-checkbox__tick {
2181
+ visibility: visible;
2182
+ }
2183
+ .fds-checkbox__input:indeterminate ~ .fds-checkbox__control .fds-checkbox__dash {
2184
+ visibility: visible;
2185
+ }
2186
+ .fds-checkbox__input:hover:not(:disabled):not(:checked) ~ .fds-checkbox__control .fds-checkbox__box {
2187
+ border-color: var(--color-text-secondary, #525252);
2188
+ }
2189
+ .fds-checkbox__input:focus-visible ~ .fds-checkbox__control .fds-checkbox__box {
2190
+ outline: 2px solid var(--color-focus, #ea580c);
2191
+ outline-offset: 2px;
2192
+ }
2193
+ .fds-checkbox[data-disabled] .fds-checkbox__box {
2194
+ opacity: 0.5;
2195
+ }
2196
+ .fds-checkbox[data-disabled] .fds-checkbox__label,
2197
+ .fds-checkbox[data-disabled] .fds-checkbox__description {
2198
+ color: var(--color-text-muted, #a3a3a3);
2199
+ }
2200
+ .fds-checkbox__text {
2201
+ display: inline-flex;
2202
+ flex-direction: column;
2203
+ gap: 2px;
2204
+ }
2205
+ .fds-checkbox__label {
2206
+ font-family: var(--font-body, "Rethink Sans", system-ui, sans-serif);
2207
+ font-size: var(--font-size-text-sm, 14px);
2208
+ line-height: 22px;
2209
+ font-weight: var(--font-weight-medium, 500);
2210
+ color: var(--color-text, #171717);
2211
+ }
2212
+ .fds-checkbox__description {
2213
+ font-family: var(--font-body, "Rethink Sans", system-ui, sans-serif);
2214
+ font-size: var(--font-size-text-sm, 14px);
2215
+ line-height: 22px;
2216
+ color: var(--color-text-secondary, #525252);
2217
+ }
2218
+ @media (prefers-reduced-motion: reduce) {
2219
+ .fds-checkbox__box {
2220
+ transition: none;
2221
+ }
2222
+ }
2223
+
2224
+ /* src/components/Radio/radio.css */
2225
+ .fds-radio {
2226
+ display: inline-flex;
2227
+ position: relative;
2228
+ }
2229
+ .fds-radio__input {
2230
+ position: absolute;
2231
+ inset: 0;
2232
+ width: 100%;
2233
+ height: 100%;
2234
+ margin: 0;
2235
+ opacity: 0;
2236
+ cursor: pointer;
2237
+ z-index: 1;
2238
+ }
2239
+ .fds-radio__input:disabled {
2240
+ cursor: not-allowed;
2241
+ }
2242
+ .fds-radio__control {
2243
+ display: inline-flex;
2244
+ align-items: flex-start;
2245
+ gap: var(--spacing-2, 8px);
2246
+ cursor: pointer;
2247
+ }
2248
+ .fds-radio__circle {
2249
+ box-sizing: border-box;
2250
+ flex-shrink: 0;
2251
+ width: 16px;
2252
+ height: 16px;
2253
+ margin-top: 3px;
2254
+ border: 1px solid var(--color-border-strong, #d4d4d4);
2255
+ border-radius: var(--radius-full, 9999px);
2256
+ background: var(--color-bg, #ffffff);
2257
+ transition: border-color var(--duration-quick, 150ms) ease, border-width var(--duration-quick, 150ms) ease;
2258
+ }
2259
+ .fds-radio__control:not(:has(.fds-radio__text)) .fds-radio__circle {
2260
+ margin-top: 0;
2261
+ }
2262
+ .fds-radio__input:checked ~ .fds-radio__control .fds-radio__circle {
2263
+ border: 5px solid var(--color-text, #171717);
2264
+ }
2265
+ .fds-radio__input:hover:not(:disabled):not(:checked) ~ .fds-radio__control .fds-radio__circle {
2266
+ border-color: var(--color-text-secondary, #525252);
2267
+ }
2268
+ .fds-radio__input:focus-visible ~ .fds-radio__control .fds-radio__circle {
2269
+ outline: 2px solid var(--color-focus, #ea580c);
2270
+ outline-offset: 2px;
2271
+ }
2272
+ .fds-radio[data-disabled] .fds-radio__circle {
2273
+ opacity: 0.5;
2274
+ }
2275
+ .fds-radio[data-disabled] .fds-radio__label,
2276
+ .fds-radio[data-disabled] .fds-radio__description {
2277
+ color: var(--color-text-muted, #a3a3a3);
2278
+ }
2279
+ .fds-radio__text {
2280
+ display: inline-flex;
2281
+ flex-direction: column;
2282
+ gap: 2px;
2283
+ }
2284
+ .fds-radio__label {
2285
+ font-family: var(--font-body, "Rethink Sans", system-ui, sans-serif);
2286
+ font-size: var(--font-size-text-sm, 14px);
2287
+ line-height: 22px;
2288
+ font-weight: var(--font-weight-medium, 500);
2289
+ color: var(--color-text, #171717);
2290
+ }
2291
+ .fds-radio__description {
2292
+ font-family: var(--font-body, "Rethink Sans", system-ui, sans-serif);
2293
+ font-size: var(--font-size-text-sm, 14px);
2294
+ line-height: 22px;
2295
+ color: var(--color-text-secondary, #525252);
2296
+ }
2297
+ @media (prefers-reduced-motion: reduce) {
2298
+ .fds-radio__circle {
2299
+ transition: none;
2300
+ }
2301
+ }
2302
+
2303
+ /* src/components/Accordion/accordion.css */
2304
+ .fds-accordion {
2305
+ box-sizing: border-box;
2306
+ background: var(--color-bg, #ffffff);
2307
+ border: 1px solid var(--color-border, #e5e5e5);
2308
+ border-radius: var(--radius-xl, 12px);
2309
+ font-family: var(--font-body, "Rethink Sans", system-ui, sans-serif);
2310
+ color: var(--color-text, #171717);
2311
+ }
2312
+ .fds-accordion + .fds-accordion {
2313
+ margin-top: var(--spacing-3, 12px);
2314
+ }
2315
+ .fds-accordion__header {
2316
+ display: flex;
2317
+ align-items: center;
2318
+ gap: var(--spacing-3, 12px);
2319
+ padding: 0 var(--spacing-4, 16px) 0 0;
2320
+ }
2321
+ .fds-accordion__trigger {
2322
+ flex: 1 1 auto;
2323
+ min-width: 0;
2324
+ display: flex;
2325
+ align-items: center;
2326
+ gap: var(--spacing-3, 12px);
2327
+ padding: var(--spacing-4, 16px);
2328
+ margin: 0;
2329
+ border: 0;
2330
+ background: none;
2331
+ font: inherit;
2332
+ color: inherit;
2333
+ text-align: left;
2334
+ cursor: pointer;
2335
+ border-radius: var(--radius-xl, 12px);
2336
+ }
2337
+ .fds-accordion__trigger:focus-visible {
2338
+ outline: 2px solid var(--color-focus, #ea580c);
2339
+ outline-offset: -2px;
2340
+ }
2341
+ .fds-accordion__actions {
2342
+ display: flex;
2343
+ align-items: center;
2344
+ gap: var(--spacing-2, 8px);
2345
+ flex-shrink: 0;
2346
+ }
2347
+ .fds-accordion__chevron {
2348
+ display: inline-flex;
2349
+ flex-shrink: 0;
2350
+ color: var(--color-text-secondary, #525252);
2351
+ cursor: pointer;
2352
+ transition: transform var(--duration-quick, 150ms) ease;
2353
+ }
2354
+ .fds-accordion[data-open] .fds-accordion__chevron {
2355
+ transform: rotate(180deg);
2356
+ }
2357
+ .fds-accordion__body {
2358
+ padding: 0 var(--spacing-4, 16px) var(--spacing-4, 16px);
2359
+ }
2360
+ @media (prefers-reduced-motion: reduce) {
2361
+ .fds-accordion__chevron {
2362
+ transition: none;
2363
+ }
2364
+ }
2365
+
2366
+ /* src/components/StepList/step-list.css */
2367
+ .fds-steps {
2368
+ list-style: none;
2369
+ margin: 0;
2370
+ padding: 0;
2371
+ display: flex;
2372
+ flex-direction: column;
2373
+ gap: var(--spacing-3, 12px);
2374
+ font-family: var(--font-body, "Rethink Sans", system-ui, sans-serif);
2375
+ }
2376
+ .fds-steps__step {
2377
+ box-sizing: border-box;
2378
+ display: flex;
2379
+ align-items: center;
2380
+ gap: var(--spacing-3, 12px);
2381
+ min-height: 54px;
2382
+ padding: var(--spacing-3, 12px) var(--spacing-4, 16px);
2383
+ border: 1px solid var(--color-border, #e5e5e5);
2384
+ border-radius: var(--radius-lg, 8px);
2385
+ background: var(--color-surface-subtle, #fafafa);
2386
+ font-size: var(--font-size-text-sm, 14px);
2387
+ line-height: 20px;
2388
+ color: var(--color-text-muted, #a3a3a3);
2389
+ }
2390
+ .fds-steps__icon {
2391
+ display: inline-flex;
2392
+ flex-shrink: 0;
2393
+ }
2394
+ .fds-steps__step--done {
2395
+ background: var(--color-text, #171717);
2396
+ border-color: var(--color-text, #171717);
2397
+ color: var(--color-bg, #ffffff);
2398
+ font-weight: var(--font-weight-medium, 500);
2399
+ }
2400
+ .fds-steps__step--active {
2401
+ background: var(--color-surface, #f5f5f5);
2402
+ color: var(--color-text, #171717);
2403
+ font-weight: var(--font-weight-medium, 500);
2404
+ }
2405
+ .fds-steps__step--failed {
2406
+ background: var(--color-error-bg, #fef2f2);
2407
+ border-color: var(--color-error-border, #fecaca);
2408
+ color: var(--color-error-text, #991b1b);
2409
+ font-weight: var(--font-weight-medium, 500);
2410
+ }
2411
+ .fds-steps__spinner {
2412
+ animation: fds-steps-spin 1.2s linear infinite;
2413
+ }
2414
+ @keyframes fds-steps-spin {
2415
+ to {
2416
+ transform: rotate(360deg);
2417
+ }
2418
+ }
2419
+ .fds-steps__sr {
2420
+ position: absolute;
2421
+ width: 1px;
2422
+ height: 1px;
2423
+ overflow: hidden;
2424
+ clip: rect(0 0 0 0);
2425
+ white-space: nowrap;
2426
+ }
2427
+ @media (prefers-reduced-motion: reduce) {
2428
+ .fds-steps__spinner {
2429
+ animation: none;
2430
+ }
2431
+ }
package/dist/index.d.cts CHANGED
@@ -1,5 +1,5 @@
1
1
  import * as react from 'react';
2
- import { ButtonHTMLAttributes, ReactNode, HTMLAttributes, InputHTMLAttributes } from 'react';
2
+ import { ButtonHTMLAttributes, ReactNode, AnchorHTMLAttributes, HTMLAttributes, InputHTMLAttributes } from 'react';
3
3
 
4
4
  type ButtonVariant = 'primary' | 'outlined' | 'text' | 'neutral' | 'link'
5
5
  /** High-contrast near-black, for a page's main create action ("New comparison"). */
@@ -26,6 +26,25 @@ interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
26
26
  */
27
27
  declare function Button({ variant, size, leftIcon, rightIcon, type, className, children, ...rest }: ButtonProps): react.JSX.Element;
28
28
 
29
+ interface ButtonLinkProps extends AnchorHTMLAttributes<HTMLAnchorElement> {
30
+ /** Where the link goes. */
31
+ href: string;
32
+ /** Visual style. @default 'primary' */
33
+ variant?: ButtonVariant;
34
+ /** Size step. @default 'medium' */
35
+ size?: ButtonSize;
36
+ /** Optional leading icon (rendered in a 20px slot). */
37
+ leftIcon?: ReactNode;
38
+ /** Optional trailing icon (rendered in a 20px slot). */
39
+ rightIcon?: ReactNode;
40
+ }
41
+ /**
42
+ * A link that looks like a Button. Use it when the action navigates (to a
43
+ * page or another site) rather than doing something on this page, so the
44
+ * browser keeps link behaviour: open in a new tab, copy link, status bar URL.
45
+ */
46
+ declare function ButtonLink({ variant, size, leftIcon, rightIcon, className, children, ...rest }: ButtonLinkProps): react.JSX.Element;
47
+
29
48
  interface MismatchProperty {
30
49
  /** Property label, e.g. "color", "font-size". */
31
50
  label: string;
@@ -443,6 +462,8 @@ declare function Badge({ tone, icon, className, children, ...rest }: BadgeProps)
443
462
  interface TagProps extends HTMLAttributes<HTMLSpanElement> {
444
463
  /** Colour of the leading dot. Leave out for no dot. */
445
464
  dot?: Tone;
465
+ /** Leading icon, drawn at 14px, e.g. a repository or branch mark. */
466
+ icon?: ReactNode;
446
467
  children: ReactNode;
447
468
  }
448
469
  /**
@@ -450,7 +471,7 @@ interface TagProps extends HTMLAttributes<HTMLSpanElement> {
450
471
  * optional coloured dot. Measured from Figma "✅Project" comparison-type chip
451
472
  * (node 231:59808).
452
473
  */
453
- declare function Tag({ dot, className, children, ...rest }: TagProps): react.JSX.Element;
474
+ declare function Tag({ dot, icon, className, children, ...rest }: TagProps): react.JSX.Element;
454
475
 
455
476
  interface MultiSelectOption {
456
477
  value: string;
@@ -536,6 +557,28 @@ declare function StackedCardsIllustration({ className }: {
536
557
  className?: string;
537
558
  }): react.JSX.Element;
538
559
 
560
+ /** Colour role. `accent` is the brand tint, for a prompt to act (an upgrade, a next step). */
561
+ type CalloutTone = Tone | 'accent';
562
+ interface CalloutProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {
563
+ /** Colour role. @default 'neutral' */
564
+ tone?: CalloutTone;
565
+ /** Leading icon, drawn at 16px in a 32px tile. */
566
+ icon?: ReactNode;
567
+ /** One-line heading. */
568
+ title: ReactNode;
569
+ /** Shown after the title, e.g. a Badge. */
570
+ titleAside?: ReactNode;
571
+ /** Supporting text under the title. */
572
+ children?: ReactNode;
573
+ /** Trailing action(s), e.g. a ButtonLink. Moves under the text on phones. */
574
+ action?: ReactNode;
575
+ }
576
+ /**
577
+ * Fidel design-system Callout: a tinted row that tells the reader something
578
+ * about the page they are on and, optionally, what to do about it.
579
+ */
580
+ declare function Callout({ tone, icon, title, titleAside, children, action, className, ...rest }: CalloutProps): react.JSX.Element;
581
+
539
582
  type SkeletonShape = 'rect' | 'text' | 'circle';
540
583
  interface SkeletonProps extends Omit<HTMLAttributes<HTMLSpanElement>, 'children'> {
541
584
  /** rect: a block. text: line(s) at text height. circle: an avatar or icon. @default 'rect' */
@@ -562,4 +605,105 @@ interface SkeletonGroupProps extends HTMLAttributes<HTMLDivElement> {
562
605
  /** Wraps a skeleton layout and announces it once as loading (role="status"). */
563
606
  declare function SkeletonGroup({ label, className, children, ...rest }: SkeletonGroupProps): react.JSX.Element;
564
607
 
565
- export { AppNav, type AppNavProps, Avatar, type AvatarProps, type AvatarSize, Badge, type BadgeProps, type Breakpoint, Button, type ButtonProps, type ButtonSize, type ButtonVariant, type DiffElement, type DiffPropertyLine, DiffPropertyList, type DiffPropertyListProps, DiffSection, type DiffSectionProps, EmptyState, type EmptyStateProps, MismatchCard, type MismatchCardProps, type MismatchProperty, Modal, type ModalProps, type ModalSize, type ModalTone, MultiSelect, type MultiSelectOption, type MultiSelectProps, Pagination, type PaginationProps, SearchInput, type SearchInputProps, SectionHeader, type SectionHeaderProps, SegmentedControl, type SegmentedControlProps, type SegmentedOption, Select, type SelectOption, type SelectProps, SettingsSection, type SettingsSectionProps, Skeleton, SkeletonGroup, type SkeletonGroupProps, type SkeletonProps, type SkeletonShape, Split, type SplitProps, StackedCardsIllustration, TabNav, type TabNavProps, Tag, type TagProps, Toggle, type ToggleProps, type ToggleSize, type Tone, breakpoints };
608
+ /** Surface colour. `subtle` is the grey panel, `default` white with a border, `plain` white without one. */
609
+ type CardTone = 'subtle' | 'default' | 'plain';
610
+ type CardPadding = 'none' | 'md' | 'lg';
611
+ interface CardProps extends HTMLAttributes<HTMLDivElement> {
612
+ /** @default 'default' */
613
+ tone?: CardTone;
614
+ /** Inner spacing: 24px (`md`) or 40px (`lg`, 24px on phones). @default 'md' */
615
+ padding?: CardPadding;
616
+ children?: ReactNode;
617
+ }
618
+ /**
619
+ * Fidel design-system Card: a rounded surface that groups related content.
620
+ * It has no layout of its own; put anything inside. Measured from Figma
621
+ * "Integrations" frames (nodes 231:66631, 231:67267, 231:67335).
622
+ */
623
+ declare function Card({ tone, padding, className, children, ...rest }: CardProps): react.JSX.Element;
624
+
625
+ interface StatProps extends HTMLAttributes<HTMLDivElement> {
626
+ /** What the number counts, e.g. "Tokens found". */
627
+ label: ReactNode;
628
+ /** The figure itself. */
629
+ value: ReactNode;
630
+ /** Detail under the figure, e.g. a row of Tags. */
631
+ children?: ReactNode;
632
+ }
633
+ /**
634
+ * Fidel design-system Stat: a caption, a large figure and optional detail.
635
+ * Has no surface; wrap it in a Card. Measured from Figma "Design System
636
+ * connected" (node 231:67335).
637
+ */
638
+ declare function Stat({ label, value, children, className, ...rest }: StatProps): react.JSX.Element;
639
+
640
+ interface CheckboxProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'type' | 'size'> {
641
+ /** Text beside the box. Without one, pass `aria-label`. */
642
+ label?: ReactNode;
643
+ /** Secondary line under the label. */
644
+ description?: ReactNode;
645
+ /** Shows a dash for "some of these"; screen readers announce it as mixed. */
646
+ indeterminate?: boolean;
647
+ }
648
+ /**
649
+ * Fidel design-system Checkbox. Renders a native checkbox, visually hidden
650
+ * over a drawn box, so checked/indeterminate/disabled/focus come from the
651
+ * input itself and every standard input attribute passes through. Built like
652
+ * Toggle; checked is ink-filled to match the Integrations frames.
653
+ */
654
+ declare const Checkbox: react.ForwardRefExoticComponent<CheckboxProps & react.RefAttributes<HTMLInputElement>>;
655
+
656
+ interface RadioProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'type' | 'size'> {
657
+ /** Text beside the circle. Without one, pass `aria-label`. */
658
+ label?: ReactNode;
659
+ /** Secondary line under the label. */
660
+ description?: ReactNode;
661
+ }
662
+ /**
663
+ * Fidel design-system Radio: one choice of several. Give every Radio in a
664
+ * set the same `name`, and wrap the set in a `role="radiogroup"` element (or
665
+ * a fieldset) with a label. Built like Checkbox: a native input over a drawn
666
+ * circle, ink-filled when chosen.
667
+ */
668
+ declare const Radio: react.ForwardRefExoticComponent<RadioProps & react.RefAttributes<HTMLInputElement>>;
669
+
670
+ interface AccordionProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {
671
+ /** Header content, always visible. Clicking it opens and closes the body. */
672
+ summary: ReactNode;
673
+ /**
674
+ * Controls in the header that do their own thing, e.g. a Retry button.
675
+ * Kept outside the toggle so they stay separate keyboard stops.
676
+ */
677
+ actions?: ReactNode;
678
+ /** Controlled open state. */
679
+ open?: boolean;
680
+ /** Initial open state when uncontrolled. @default false */
681
+ defaultOpen?: boolean;
682
+ onOpenChange?: (open: boolean) => void;
683
+ /** Body, shown while open. */
684
+ children?: ReactNode;
685
+ }
686
+ /**
687
+ * Fidel design-system Accordion: one row that expands to show more. Stack
688
+ * several for a list. The header is a button with `aria-expanded`; the
689
+ * chevron on the right points down when closed and up when open.
690
+ */
691
+ declare function Accordion({ summary, actions, open: openProp, defaultOpen, onOpenChange, children, className, ...rest }: AccordionProps): react.JSX.Element;
692
+
693
+ type StepStatus = 'done' | 'active' | 'pending' | 'failed';
694
+ interface Step {
695
+ id: string;
696
+ label: ReactNode;
697
+ status: StepStatus;
698
+ }
699
+ interface StepListProps extends Omit<HTMLAttributes<HTMLOListElement>, 'children'> {
700
+ steps: Step[];
701
+ }
702
+ /**
703
+ * Fidel design-system StepList: an ordered list of steps, each done, in
704
+ * progress, not started or failed. The in-progress step is marked
705
+ * `aria-current="step"`. Measured from Figma "Scanning" (node 231:67267).
706
+ */
707
+ declare function StepList({ steps, className, ...rest }: StepListProps): react.JSX.Element;
708
+
709
+ export { Accordion, type AccordionProps, AppNav, type AppNavProps, Avatar, type AvatarProps, type AvatarSize, Badge, type BadgeProps, type Breakpoint, Button, ButtonLink, type ButtonLinkProps, type ButtonProps, type ButtonSize, type ButtonVariant, Callout, type CalloutProps, type CalloutTone, Card, type CardPadding, type CardProps, type CardTone, Checkbox, type CheckboxProps, type DiffElement, type DiffPropertyLine, DiffPropertyList, type DiffPropertyListProps, DiffSection, type DiffSectionProps, EmptyState, type EmptyStateProps, MismatchCard, type MismatchCardProps, type MismatchProperty, Modal, type ModalProps, type ModalSize, type ModalTone, MultiSelect, type MultiSelectOption, type MultiSelectProps, Pagination, type PaginationProps, Radio, type RadioProps, SearchInput, type SearchInputProps, SectionHeader, type SectionHeaderProps, SegmentedControl, type SegmentedControlProps, type SegmentedOption, Select, type SelectOption, type SelectProps, SettingsSection, type SettingsSectionProps, Skeleton, SkeletonGroup, type SkeletonGroupProps, type SkeletonProps, type SkeletonShape, Split, type SplitProps, StackedCardsIllustration, Stat, type StatProps, type Step, StepList, type StepListProps, type StepStatus, TabNav, type TabNavProps, Tag, type TagProps, Toggle, type ToggleProps, type ToggleSize, type Tone, breakpoints };