@geomak/ui 5.0.3 → 5.2.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.cjs +778 -236
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +373 -13
- package/dist/index.d.ts +373 -13
- package/dist/index.js +773 -237
- package/dist/index.js.map +1 -1
- package/dist/styles.css +162 -9
- package/package.json +2 -1
package/dist/index.d.ts
CHANGED
|
@@ -339,6 +339,268 @@ interface PortalProps {
|
|
|
339
339
|
*/
|
|
340
340
|
declare function Portal({ children, target }: PortalProps): React$1.ReactPortal;
|
|
341
341
|
|
|
342
|
+
type Spacing = 'none' | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl';
|
|
343
|
+
type BoxBackground = 'none' | 'background' | 'surface' | 'surface-raised' | 'accent';
|
|
344
|
+
type BoxBorder = 'none' | 'border' | 'border-strong' | 'accent' | 'status-error';
|
|
345
|
+
type BoxRadius = 'none' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 'full';
|
|
346
|
+
type BoxShadow = 'none' | 'sm' | 'md' | 'lg' | 'xl';
|
|
347
|
+
interface BoxProps {
|
|
348
|
+
as?: keyof React$1.JSX.IntrinsicElements;
|
|
349
|
+
/** Padding shorthand — applies to all sides. */
|
|
350
|
+
p?: Spacing;
|
|
351
|
+
/** Horizontal padding (left + right). */
|
|
352
|
+
px?: Spacing;
|
|
353
|
+
/** Vertical padding (top + bottom). */
|
|
354
|
+
py?: Spacing;
|
|
355
|
+
pt?: Spacing;
|
|
356
|
+
pr?: Spacing;
|
|
357
|
+
pb?: Spacing;
|
|
358
|
+
pl?: Spacing;
|
|
359
|
+
/** Margin shorthand. */
|
|
360
|
+
m?: Spacing;
|
|
361
|
+
mx?: Spacing;
|
|
362
|
+
my?: Spacing;
|
|
363
|
+
mt?: Spacing;
|
|
364
|
+
mr?: Spacing;
|
|
365
|
+
mb?: Spacing;
|
|
366
|
+
ml?: Spacing;
|
|
367
|
+
background?: BoxBackground;
|
|
368
|
+
border?: BoxBorder;
|
|
369
|
+
radius?: BoxRadius;
|
|
370
|
+
shadow?: BoxShadow;
|
|
371
|
+
/** Width via Tailwind class or CSS value. */
|
|
372
|
+
width?: string | number;
|
|
373
|
+
/** Height via Tailwind class or CSS value. */
|
|
374
|
+
height?: string | number;
|
|
375
|
+
/** Click handler — accepts any element-typed handler. */
|
|
376
|
+
onClick?: React$1.MouseEventHandler<HTMLElement>;
|
|
377
|
+
className?: string;
|
|
378
|
+
style?: React$1.CSSProperties;
|
|
379
|
+
children?: React$1.ReactNode;
|
|
380
|
+
}
|
|
381
|
+
/**
|
|
382
|
+
* A polymorphic layout primitive — a `<div>` (by default) styled via prop
|
|
383
|
+
* shortcuts to the design system's tokenised spacing, surface, border,
|
|
384
|
+
* radius, and shadow scales. Use it when you'd otherwise reach for a
|
|
385
|
+
* className-only `<div>` with `p-4 bg-surface border border-border rounded-lg`.
|
|
386
|
+
*
|
|
387
|
+
* The token shortcuts map straight to Tailwind classes under the hood, so
|
|
388
|
+
* Tailwind's content scanner sees the classes and JIT-emits the CSS. There
|
|
389
|
+
* is no runtime style cost beyond the className concatenation.
|
|
390
|
+
*
|
|
391
|
+
* Use `as` when the semantic element should differ (`<section>`, `<article>`).
|
|
392
|
+
*
|
|
393
|
+
* @example Padded card surface
|
|
394
|
+
* ```tsx
|
|
395
|
+
* <Box p="lg" background="surface" border="border" radius="lg" shadow="sm">
|
|
396
|
+
* <Typography variant="h3">Card title</Typography>
|
|
397
|
+
* </Box>
|
|
398
|
+
* ```
|
|
399
|
+
*
|
|
400
|
+
* @example Semantic section
|
|
401
|
+
* ```tsx
|
|
402
|
+
* <Box as="section" px="md" py="lg" background="background">
|
|
403
|
+
* <PageContent />
|
|
404
|
+
* </Box>
|
|
405
|
+
* ```
|
|
406
|
+
*/
|
|
407
|
+
declare function Box({ as, p, px, py, pt, pr, pb, pl, m, mx, my, mt, mr, mb, ml, background, border, radius, shadow, width, height, onClick, className, style, children, }: BoxProps): react_jsx_runtime.JSX.Element;
|
|
408
|
+
|
|
409
|
+
type FlexDirection = 'row' | 'row-reverse' | 'col' | 'col-reverse';
|
|
410
|
+
type FlexAlign = 'start' | 'center' | 'end' | 'stretch' | 'baseline';
|
|
411
|
+
type FlexJustify = 'start' | 'center' | 'end' | 'between' | 'around' | 'evenly';
|
|
412
|
+
type FlexWrap = 'nowrap' | 'wrap' | 'wrap-reverse';
|
|
413
|
+
interface FlexProps extends BoxProps {
|
|
414
|
+
direction?: FlexDirection;
|
|
415
|
+
align?: FlexAlign;
|
|
416
|
+
justify?: FlexJustify;
|
|
417
|
+
wrap?: FlexWrap;
|
|
418
|
+
/** Gap between children — uses the same spacing token scale as Box. */
|
|
419
|
+
gap?: Spacing;
|
|
420
|
+
inline?: boolean;
|
|
421
|
+
}
|
|
422
|
+
/**
|
|
423
|
+
* `Box` with `display: flex` baked in. All Box props are accepted (padding,
|
|
424
|
+
* margin, background, border, etc.) plus flex-specific controls.
|
|
425
|
+
*
|
|
426
|
+
* @example Horizontal row, centred, with gap
|
|
427
|
+
* ```tsx
|
|
428
|
+
* <Flex direction="row" align="center" gap="md">
|
|
429
|
+
* <Avatar src={user.photo} alt={user.name} />
|
|
430
|
+
* <Typography variant="body">{user.name}</Typography>
|
|
431
|
+
* </Flex>
|
|
432
|
+
* ```
|
|
433
|
+
*
|
|
434
|
+
* @example Vertical stack
|
|
435
|
+
* ```tsx
|
|
436
|
+
* <Flex direction="col" gap="sm">
|
|
437
|
+
* <Typography variant="h3">Title</Typography>
|
|
438
|
+
* <Typography variant="body">Body text</Typography>
|
|
439
|
+
* </Flex>
|
|
440
|
+
* ```
|
|
441
|
+
*/
|
|
442
|
+
declare function Flex({ direction, align, justify, wrap, gap, inline, className, ...boxProps }: FlexProps): react_jsx_runtime.JSX.Element;
|
|
443
|
+
|
|
444
|
+
interface GridProps extends BoxProps {
|
|
445
|
+
/**
|
|
446
|
+
* Number of columns (1–12) for the most common case, OR an explicit
|
|
447
|
+
* CSS grid-template-columns string for arbitrary layouts
|
|
448
|
+
* (e.g. `"200px 1fr"` or `"repeat(auto-fit, minmax(180px, 1fr))"`).
|
|
449
|
+
*/
|
|
450
|
+
cols?: number | string;
|
|
451
|
+
/** Same as `cols` but for rows. */
|
|
452
|
+
rows?: number | string;
|
|
453
|
+
/** Uniform gap. Token scale, like Box's padding. */
|
|
454
|
+
gap?: Spacing;
|
|
455
|
+
/** Horizontal-only gap (overrides `gap`). */
|
|
456
|
+
gapX?: Spacing;
|
|
457
|
+
/** Vertical-only gap (overrides `gap`). */
|
|
458
|
+
gapY?: Spacing;
|
|
459
|
+
/** Cross-axis alignment of items within their cell. */
|
|
460
|
+
align?: 'start' | 'center' | 'end' | 'stretch';
|
|
461
|
+
/** Main-axis alignment of items within their cell. */
|
|
462
|
+
justify?: 'start' | 'center' | 'end' | 'stretch';
|
|
463
|
+
}
|
|
464
|
+
/**
|
|
465
|
+
* `Box` with `display: grid` baked in. Use `cols` / `rows` as numbers for
|
|
466
|
+
* the common "N equal tracks" case, or pass any CSS grid-template-* string
|
|
467
|
+
* for arbitrary layouts (auto-fit grids, fixed-width sidebars, etc.).
|
|
468
|
+
*
|
|
469
|
+
* @example 3-column grid with medium gap
|
|
470
|
+
* ```tsx
|
|
471
|
+
* <Grid cols={3} gap="md">
|
|
472
|
+
* <Card />
|
|
473
|
+
* <Card />
|
|
474
|
+
* <Card />
|
|
475
|
+
* </Grid>
|
|
476
|
+
* ```
|
|
477
|
+
*
|
|
478
|
+
* @example Auto-fit responsive grid
|
|
479
|
+
* ```tsx
|
|
480
|
+
* <Grid cols="repeat(auto-fit, minmax(220px, 1fr))" gap="lg">
|
|
481
|
+
* {items.map((it) => <Card key={it.id} {...it} />)}
|
|
482
|
+
* </Grid>
|
|
483
|
+
* ```
|
|
484
|
+
*/
|
|
485
|
+
declare function Grid({ cols, rows, gap, gapX, gapY, align, justify, className, style, ...boxProps }: GridProps): react_jsx_runtime.JSX.Element;
|
|
486
|
+
|
|
487
|
+
type AvatarSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';
|
|
488
|
+
type AvatarShape = 'circle' | 'square';
|
|
489
|
+
type AvatarStatus = 'online' | 'offline' | 'away' | 'busy';
|
|
490
|
+
interface AvatarProps {
|
|
491
|
+
/** Image URL. If missing or fails to load, `fallback` renders instead. */
|
|
492
|
+
src?: string;
|
|
493
|
+
/** Alt text — required when `src` is provided for screen readers. */
|
|
494
|
+
alt?: string;
|
|
495
|
+
/**
|
|
496
|
+
* Fallback rendered when the image is unavailable. Pass either:
|
|
497
|
+
* - a string (e.g. user initials like "JD") — rendered with semi-bold weight
|
|
498
|
+
* - any ReactNode (icon, emoji)
|
|
499
|
+
* - omit entirely — a generic "person" silhouette is used
|
|
500
|
+
*/
|
|
501
|
+
fallback?: React$1.ReactNode;
|
|
502
|
+
/** Size preset. Default `'md'`. */
|
|
503
|
+
size?: AvatarSize;
|
|
504
|
+
/** Circle (default) or rounded square. */
|
|
505
|
+
shape?: AvatarShape;
|
|
506
|
+
/**
|
|
507
|
+
* Optional presence indicator dot in the bottom-right corner.
|
|
508
|
+
* `'online' | 'offline' | 'away' | 'busy'`.
|
|
509
|
+
*/
|
|
510
|
+
status?: AvatarStatus;
|
|
511
|
+
className?: string;
|
|
512
|
+
}
|
|
513
|
+
/**
|
|
514
|
+
* Circular (or rounded-square) user avatar built on `@radix-ui/react-avatar`.
|
|
515
|
+
* Radix handles the image-load lifecycle: it tries to load `src`, falls back
|
|
516
|
+
* to the `fallback` slot after a short delay if the image is missing or fails
|
|
517
|
+
* to decode, and re-attempts on `src` change.
|
|
518
|
+
*
|
|
519
|
+
* **Fallback strategy** (in order):
|
|
520
|
+
* 1. `fallback` prop if provided (string or ReactNode)
|
|
521
|
+
* 2. Two-character initials extracted from `alt` if `alt` is provided
|
|
522
|
+
* 3. A generic "person" silhouette SVG
|
|
523
|
+
*
|
|
524
|
+
* **Status dot** is an optional presence indicator in the bottom-right —
|
|
525
|
+
* online (green), away (amber), busy (red), offline (grey).
|
|
526
|
+
*
|
|
527
|
+
* @example Basic with image
|
|
528
|
+
* ```tsx
|
|
529
|
+
* <Avatar src="/users/jd.jpg" alt="Jane Doe" />
|
|
530
|
+
* ```
|
|
531
|
+
*
|
|
532
|
+
* @example Fallback to initials
|
|
533
|
+
* ```tsx
|
|
534
|
+
* <Avatar alt="Jane Doe" size="lg" />
|
|
535
|
+
* ```
|
|
536
|
+
*
|
|
537
|
+
* @example Online presence + square shape
|
|
538
|
+
* ```tsx
|
|
539
|
+
* <Avatar src={user.photo} alt={user.name} status="online" shape="square" />
|
|
540
|
+
* ```
|
|
541
|
+
*/
|
|
542
|
+
declare function Avatar({ src, alt, fallback, size, shape, status, className, }: AvatarProps): react_jsx_runtime.JSX.Element;
|
|
543
|
+
|
|
544
|
+
type TypographyVariant = 'display' | 'h1' | 'h2' | 'h3' | 'h4' | 'subtitle' | 'body' | 'caption' | 'overline' | 'code';
|
|
545
|
+
type TypographyColor = 'foreground' | 'foreground-secondary' | 'foreground-muted' | 'accent' | 'status-error' | 'status-warning' | 'status-success' | 'status-info' | 'inherit';
|
|
546
|
+
type TypographyWeight = 'normal' | 'medium' | 'semibold' | 'bold';
|
|
547
|
+
type TypographyAlign = 'left' | 'center' | 'right' | 'justify';
|
|
548
|
+
interface TypographyProps {
|
|
549
|
+
/** Visual scale variant. */
|
|
550
|
+
variant?: TypographyVariant;
|
|
551
|
+
/**
|
|
552
|
+
* Element to render. Defaults are sensible per variant
|
|
553
|
+
* (e.g. h1 → `<h1>`, body → `<p>`, code → `<code>`). Override
|
|
554
|
+
* with `as` when the semantic element should differ from the visual
|
|
555
|
+
* style (e.g. a styled-as-h1 product card heading rendered as `<div>`).
|
|
556
|
+
*/
|
|
557
|
+
as?: keyof React$1.JSX.IntrinsicElements;
|
|
558
|
+
color?: TypographyColor;
|
|
559
|
+
weight?: TypographyWeight;
|
|
560
|
+
align?: TypographyAlign;
|
|
561
|
+
/** Truncate to one line with ellipsis. */
|
|
562
|
+
truncate?: boolean;
|
|
563
|
+
/** Render the text with reduced opacity (useful for disabled states). */
|
|
564
|
+
muted?: boolean;
|
|
565
|
+
className?: string;
|
|
566
|
+
style?: React$1.CSSProperties;
|
|
567
|
+
children?: React$1.ReactNode;
|
|
568
|
+
}
|
|
569
|
+
/**
|
|
570
|
+
* Polymorphic typography primitive. `variant` picks a visual scale; `as`
|
|
571
|
+
* controls the rendered element when it should differ from the default
|
|
572
|
+
* for that variant (e.g. a styled-as-h2 card title rendered as `<div>`).
|
|
573
|
+
*
|
|
574
|
+
* **Variants** map to the design-system text scale:
|
|
575
|
+
* - `display`: hero headlines
|
|
576
|
+
* - `h1` – `h4`: section / subsection headings
|
|
577
|
+
* - `subtitle`: emphasised lead text
|
|
578
|
+
* - `body` (default): paragraph text
|
|
579
|
+
* - `caption`: small label / hint text
|
|
580
|
+
* - `overline`: uppercase eyebrow text
|
|
581
|
+
* - `code`: inline code samples
|
|
582
|
+
*
|
|
583
|
+
* **Colour** accepts any semantic token; defaults to `inherit` so the
|
|
584
|
+
* parent's text colour flows through (useful when nesting Typography
|
|
585
|
+
* inside a coloured surface like an accent badge).
|
|
586
|
+
*
|
|
587
|
+
* @example Section heading
|
|
588
|
+
* ```tsx
|
|
589
|
+
* <Typography variant="h2">Vessel performance</Typography>
|
|
590
|
+
* ```
|
|
591
|
+
*
|
|
592
|
+
* @example Styled as h1 but rendered as div (for SEO-neutral cards)
|
|
593
|
+
* ```tsx
|
|
594
|
+
* <Typography variant="h1" as="div">Card title</Typography>
|
|
595
|
+
* ```
|
|
596
|
+
*
|
|
597
|
+
* @example Error message
|
|
598
|
+
* ```tsx
|
|
599
|
+
* <Typography variant="caption" color="status-error">{errorText}</Typography>
|
|
600
|
+
* ```
|
|
601
|
+
*/
|
|
602
|
+
declare function Typography({ variant, as, color, weight, align, truncate, muted, className, style, children, }: TypographyProps): react_jsx_runtime.JSX.Element;
|
|
603
|
+
|
|
342
604
|
type IconButtonVariant = 'primary' | 'bordered';
|
|
343
605
|
interface IconButtonProps {
|
|
344
606
|
icon?: React.ReactNode;
|
|
@@ -699,25 +961,71 @@ interface FadingBaseProps {
|
|
|
699
961
|
declare function FadingBase({ className, isMounted, children, }: FadingBaseProps): react_jsx_runtime.JSX.Element;
|
|
700
962
|
|
|
701
963
|
interface ListItem {
|
|
964
|
+
/** Stable key for React reconciliation + active-key matching. */
|
|
702
965
|
key: string | number;
|
|
966
|
+
/** Main item text (title). Required. */
|
|
703
967
|
label: React$1.ReactNode;
|
|
968
|
+
/** Optional description rendered below the label, in foreground-secondary. */
|
|
969
|
+
description?: React$1.ReactNode;
|
|
970
|
+
/**
|
|
971
|
+
* Optional leading slot, typically an Avatar. Anything React-renderable
|
|
972
|
+
* is accepted (icon, image, status badge…).
|
|
973
|
+
*/
|
|
974
|
+
avatar?: React$1.ReactNode;
|
|
975
|
+
/** Optional trailing slot, e.g. a badge, count, or action icon. */
|
|
976
|
+
trailing?: React$1.ReactNode;
|
|
977
|
+
/** Disable interaction for this item only. */
|
|
978
|
+
disabled?: boolean;
|
|
704
979
|
}
|
|
705
980
|
interface ListProps {
|
|
706
981
|
items: ListItem[];
|
|
707
982
|
onItemClick: (item: ListItem) => void;
|
|
708
983
|
activeKey?: string | number;
|
|
984
|
+
/**
|
|
985
|
+
* Visual density. `'compact'` for dense reference lists,
|
|
986
|
+
* `'comfortable'` (default) for typical UI, `'spacious'` for hero rows.
|
|
987
|
+
*/
|
|
988
|
+
density?: 'compact' | 'comfortable' | 'spacious';
|
|
709
989
|
}
|
|
710
990
|
/**
|
|
711
|
-
* Vertical clickable list with
|
|
991
|
+
* Vertical clickable list with optional avatar / description / trailing
|
|
992
|
+
* slots per item. Built on `role="listbox"` + `role="option"` so screen
|
|
993
|
+
* readers announce it as a selectable list. Keyboard activation works on
|
|
994
|
+
* Enter and Space.
|
|
712
995
|
*
|
|
713
|
-
*
|
|
996
|
+
* **When to use this** over a Table:
|
|
997
|
+
* - When the dataset is a simple sequence of records that the user
|
|
998
|
+
* browses + picks one of (sidebar nav, contact list, vessel chooser).
|
|
999
|
+
* - When each row's primary signal is a 1–2-line summary, not a tabular
|
|
1000
|
+
* breakdown.
|
|
1001
|
+
*
|
|
1002
|
+
* Use Table when comparing rows across multiple columns matters more than
|
|
1003
|
+
* picking one.
|
|
1004
|
+
*
|
|
1005
|
+
* @example Plain
|
|
1006
|
+
* ```tsx
|
|
1007
|
+
* <List
|
|
1008
|
+
* items={[{ key: 1, label: 'Aurora' }, { key: 2, label: 'Beacon' }]}
|
|
1009
|
+
* activeKey={2}
|
|
1010
|
+
* onItemClick={(it) => setSelected(it.key)}
|
|
1011
|
+
* />
|
|
1012
|
+
* ```
|
|
1013
|
+
*
|
|
1014
|
+
* @example With avatars + descriptions
|
|
1015
|
+
* ```tsx
|
|
714
1016
|
* <List
|
|
715
|
-
* items={
|
|
716
|
-
*
|
|
717
|
-
*
|
|
1017
|
+
* items={crew.map((c) => ({
|
|
1018
|
+
* key: c.id,
|
|
1019
|
+
* label: c.name,
|
|
1020
|
+
* description: c.rank,
|
|
1021
|
+
* avatar: <Avatar src={c.photo} alt={c.name} status={c.status} />,
|
|
1022
|
+
* trailing: <Badge count={c.unread} />,
|
|
1023
|
+
* }))}
|
|
1024
|
+
* onItemClick={(it) => navigate(`/crew/${it.key}`)}
|
|
718
1025
|
* />
|
|
1026
|
+
* ```
|
|
719
1027
|
*/
|
|
720
|
-
declare function List({ items, onItemClick, activeKey }: ListProps): react_jsx_runtime.JSX.Element;
|
|
1028
|
+
declare function List({ items, onItemClick, activeKey, density, }: ListProps): react_jsx_runtime.JSX.Element;
|
|
721
1029
|
|
|
722
1030
|
interface ScalableContainerProps {
|
|
723
1031
|
/** Resting width. Any CSS length / percent. Default `'100%'`. */
|
|
@@ -1076,6 +1384,16 @@ interface TableProps<T extends Record<string, any> = Record<string, any>> {
|
|
|
1076
1384
|
hasSearch?: boolean;
|
|
1077
1385
|
footer?: React$1.ReactNode;
|
|
1078
1386
|
header?: React$1.ReactNode;
|
|
1387
|
+
/**
|
|
1388
|
+
* When `true`, the body renders skeleton rows (one per column with the
|
|
1389
|
+
* shared shimmer animation) instead of data. Use during initial data
|
|
1390
|
+
* fetch, server-side pagination transitions, or any time the dataset is
|
|
1391
|
+
* not yet ready. Combine with `pagination.serverSide` for the canonical
|
|
1392
|
+
* "loading next page" pattern.
|
|
1393
|
+
*/
|
|
1394
|
+
loading?: boolean;
|
|
1395
|
+
/** Number of skeleton rows to render when `loading` is true. Default `8`. */
|
|
1396
|
+
loadingRowCount?: number;
|
|
1079
1397
|
}
|
|
1080
1398
|
/** ─────────────────── main component ─────────────────── */
|
|
1081
1399
|
/**
|
|
@@ -1118,7 +1436,7 @@ interface TableProps<T extends Record<string, any> = Record<string, any>> {
|
|
|
1118
1436
|
* />
|
|
1119
1437
|
* ```
|
|
1120
1438
|
*/
|
|
1121
|
-
declare function Table<T extends Record<string, any> = Record<string, any>>({ columns, rows, getRowKey, pagination, expandRow, hasSearch, footer, header, }: TableProps<T>): react_jsx_runtime.JSX.Element;
|
|
1439
|
+
declare function Table<T extends Record<string, any> = Record<string, any>>({ columns, rows, getRowKey, pagination, expandRow, hasSearch, footer, header, loading, loadingRowCount, }: TableProps<T>): react_jsx_runtime.JSX.Element;
|
|
1122
1440
|
|
|
1123
1441
|
interface ThemeSwitchProps {
|
|
1124
1442
|
checked: boolean;
|
|
@@ -1786,25 +2104,67 @@ interface AutoCompleteProps {
|
|
|
1786
2104
|
style?: React$1.CSSProperties;
|
|
1787
2105
|
/** Label/input orientation. Defaults to `'vertical'`. */
|
|
1788
2106
|
layout?: 'horizontal' | 'vertical';
|
|
2107
|
+
/**
|
|
2108
|
+
* Static list — when provided, the component does its own substring
|
|
2109
|
+
* filtering on `label` and `key`. Mutually exclusive with `onSearch`.
|
|
2110
|
+
*/
|
|
1789
2111
|
items?: AutoCompleteItem[];
|
|
2112
|
+
/**
|
|
2113
|
+
* Async resolver — when provided, `items` is ignored and `onSearch(term)`
|
|
2114
|
+
* is called (debounced) every time the user pauses typing. Its returned
|
|
2115
|
+
* promise drives the option list. The component manages an internal
|
|
2116
|
+
* `loading` state and shows an `xs` LoadingSpinner where the search icon
|
|
2117
|
+
* normally lives while a query is in flight.
|
|
2118
|
+
*/
|
|
2119
|
+
onSearch?: (term: string) => Promise<AutoCompleteItem[]>;
|
|
2120
|
+
/**
|
|
2121
|
+
* Debounce delay (ms) before `onSearch` fires after the user stops
|
|
2122
|
+
* typing. Default `250`. Ignored when `items` is used.
|
|
2123
|
+
*/
|
|
2124
|
+
debounce?: number;
|
|
1790
2125
|
onItemClick?: (value: string) => void;
|
|
1791
2126
|
/** Custom "empty" message */
|
|
1792
2127
|
emptyText?: string;
|
|
2128
|
+
/** Custom "loading" message — shown in async mode while a query is in flight. */
|
|
2129
|
+
loadingText?: string;
|
|
1793
2130
|
}
|
|
1794
2131
|
/**
|
|
1795
|
-
* Search-as-you-type autocomplete powered by Radix Popover.
|
|
2132
|
+
* Search-as-you-type autocomplete powered by Radix Popover. Supports two
|
|
2133
|
+
* modes:
|
|
2134
|
+
*
|
|
2135
|
+
* - **Static**: pass `items` — the component substring-filters locally.
|
|
2136
|
+
* Best for small fixed lists (≤ 200 entries).
|
|
2137
|
+
* - **Async**: pass `onSearch(term) => Promise<Item[]>` — the component
|
|
2138
|
+
* debounces input and drives the option list from the resolver. Shows
|
|
2139
|
+
* an `xs` LoadingSpinner while the query is in flight.
|
|
1796
2140
|
*
|
|
1797
2141
|
* The popover opens when the input is focused and closes when an item is
|
|
1798
|
-
* selected or the user clicks away.
|
|
2142
|
+
* selected or the user clicks away.
|
|
1799
2143
|
*
|
|
1800
|
-
* @example
|
|
2144
|
+
* @example Static (small fixed list)
|
|
2145
|
+
* ```tsx
|
|
1801
2146
|
* <AutoComplete
|
|
1802
2147
|
* label="Vessel"
|
|
1803
|
-
* items={vessels.map(v => ({ key: v.imo, value: v.imo, label: v.name }))}
|
|
2148
|
+
* items={vessels.map((v) => ({ key: v.imo, value: v.imo, label: v.name }))}
|
|
1804
2149
|
* onItemClick={(imo) => setVessel(imo)}
|
|
1805
2150
|
* />
|
|
2151
|
+
* ```
|
|
2152
|
+
*
|
|
2153
|
+
* @example Async (server-backed)
|
|
2154
|
+
* ```tsx
|
|
2155
|
+
* <AutoComplete
|
|
2156
|
+
* label="Port"
|
|
2157
|
+
* debounce={300}
|
|
2158
|
+
* onSearch={async (term) => {
|
|
2159
|
+
* const res = await fetch(`/api/ports?q=${encodeURIComponent(term)}`)
|
|
2160
|
+
* const data = await res.json()
|
|
2161
|
+
* return data.map((p) => ({ key: p.unlocode, value: p.unlocode, label: p.name }))
|
|
2162
|
+
* }}
|
|
2163
|
+
* onItemClick={(unlocode) => setPort(unlocode)}
|
|
2164
|
+
* />
|
|
2165
|
+
* ```
|
|
1806
2166
|
*/
|
|
1807
|
-
declare function AutoComplete({ disabled, label, placeholder, name, inputStyle, style, layout, items, onItemClick, emptyText, }: AutoCompleteProps): react_jsx_runtime.JSX.Element;
|
|
2167
|
+
declare function AutoComplete({ disabled, label, placeholder, name, inputStyle, style, layout, items, onSearch, debounce, onItemClick, emptyText, loadingText, }: AutoCompleteProps): react_jsx_runtime.JSX.Element;
|
|
1808
2168
|
|
|
1809
2169
|
interface TreeSelectNode {
|
|
1810
2170
|
key: string | number;
|
|
@@ -1980,4 +2340,4 @@ type TemporalPickerProps = DatePickerProps;
|
|
|
1980
2340
|
*/
|
|
1981
2341
|
declare function DatePicker({ value, onChange, label, placeholder, htmlFor, name: _name, layout, disabled, errorMessage, min, max, style, format, weekStartsOn, clearable, }: DatePickerProps): react_jsx_runtime.JSX.Element;
|
|
1982
2342
|
|
|
1983
|
-
export { AppShell, type AppShellProps, AutoComplete, type AutoCompleteProps, Button, type ButtonProps, Catalog, CatalogCarousel, type CatalogCarouselProps, CatalogGrid, type CatalogGridProps, type CatalogProps, Checkbox, type CheckboxProps, ContextMenu, type ContextMenuActionItem, type ContextMenuPosition, type ContextMenuProps, type DatePickerProps, Drawer, type DrawerProps, Dropdown, type DropdownItem, type DropdownProps, type ExpandRowOptions, FadingBase, type FadingBaseProps, FileInput, type FileInputProps, GridCard, type GridCardItem, type GridCardProps, Icon, IconButton, type IconButtonProps, List, type ListItem, type ListProps, LoadingSpinner, type LoadingSpinnerProps, Modal, type ModalProps, type NotificationPayload, NotificationProvider, NumberInput, type NumberInputProps, OpaqueGridCard, type OpaqueGridCardProps, type PaginationOptions, Password, type PasswordProps, Portal, type PortalProps, ScalableContainer, type ScalableContainerProps, SearchInput, type SearchInputProps, Sidebar, type SidebarItem, type SidebarProps, type SidebarSection, SkeletonBox, type SkeletonBoxProps, SkeletonCard, type SkeletonCardProps, SkeletonCircle, type SkeletonCircleProps, SkeletonText, type SkeletonTextProps, Switch, type SwitchInputProps, type TabItem, Table, type TableColumn, type TableProps, Tabs, type TabsProps, DatePicker as Temporal, type TemporalPickerProps, TextInput, type TextInputProps, type ThemeColors, type ThemeConfig, type ThemeDensity, type ThemeMotion, ThemeProvider, type ThemeProviderProps, type ThemeRadius, type ThemeShadows, ThemeSwitch, type ThemeSwitchProps, type ThemeTypography, ToggleButton, type ToggleButtonProps, type ToggleItem, Tooltip, type TooltipProps, TooltipProvider, TopBar, type TopBarProps, Tree, type TreeItemClickPayload, type TreeNode, type TreeProps, TreeSelect, type TreeSelectProps, Wizard, type WizardProps, type WizardStep, useNotification };
|
|
2343
|
+
export { AppShell, type AppShellProps, AutoComplete, type AutoCompleteProps, Avatar, type AvatarProps, type AvatarShape, type AvatarSize, type AvatarStatus, Box, type BoxBackground, type BoxBorder, type BoxProps, type BoxRadius, type BoxShadow, Button, type ButtonProps, Catalog, CatalogCarousel, type CatalogCarouselProps, CatalogGrid, type CatalogGridProps, type CatalogProps, Checkbox, type CheckboxProps, ContextMenu, type ContextMenuActionItem, type ContextMenuPosition, type ContextMenuProps, type DatePickerProps, Drawer, type DrawerProps, Dropdown, type DropdownItem, type DropdownProps, type ExpandRowOptions, FadingBase, type FadingBaseProps, FileInput, type FileInputProps, Flex, type FlexAlign, type FlexDirection, type FlexJustify, type FlexProps, type FlexWrap, Grid, GridCard, type GridCardItem, type GridCardProps, type GridProps, Icon, IconButton, type IconButtonProps, List, type ListItem, type ListProps, LoadingSpinner, type LoadingSpinnerProps, Modal, type ModalProps, type NotificationPayload, NotificationProvider, NumberInput, type NumberInputProps, OpaqueGridCard, type OpaqueGridCardProps, type PaginationOptions, Password, type PasswordProps, Portal, type PortalProps, ScalableContainer, type ScalableContainerProps, SearchInput, type SearchInputProps, Sidebar, type SidebarItem, type SidebarProps, type SidebarSection, SkeletonBox, type SkeletonBoxProps, SkeletonCard, type SkeletonCardProps, SkeletonCircle, type SkeletonCircleProps, SkeletonText, type SkeletonTextProps, type Spacing, Switch, type SwitchInputProps, type TabItem, Table, type TableColumn, type TableProps, Tabs, type TabsProps, DatePicker as Temporal, type TemporalPickerProps, TextInput, type TextInputProps, type ThemeColors, type ThemeConfig, type ThemeDensity, type ThemeMotion, ThemeProvider, type ThemeProviderProps, type ThemeRadius, type ThemeShadows, ThemeSwitch, type ThemeSwitchProps, type ThemeTypography, ToggleButton, type ToggleButtonProps, type ToggleItem, Tooltip, type TooltipProps, TooltipProvider, TopBar, type TopBarProps, Tree, type TreeItemClickPayload, type TreeNode, type TreeProps, TreeSelect, type TreeSelectProps, Typography, type TypographyAlign, type TypographyColor, type TypographyProps, type TypographyVariant, type TypographyWeight, Wizard, type WizardProps, type WizardStep, useNotification };
|