@ceebee/ui 0.3.3 → 0.5.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/client.js CHANGED
@@ -1,16 +1,16 @@
1
1
  "use client";
2
- import { createContext, forwardRef, useContext, useMemo, useState, useRef, useEffect, useCallback, useId, useReducer, Children } from 'react';
3
- import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
2
+ import { createContext, forwardRef, useContext, useMemo, useState, useRef, useEffect, useCallback, useId, isValidElement, cloneElement, Fragment, useReducer, Children } from 'react';
3
+ import { jsxs, jsx, Fragment as Fragment$1 } from 'react/jsx-runtime';
4
4
  import { motion } from 'motion/react';
5
5
  import { Select as Select$1 } from '@base-ui/react/select';
6
- import { ChevronLeft, ChevronRight, ChevronsUpDown, Check, Minus, X, CalendarDays, Clock, Upload, Plus, Search, PanelLeftOpen, PanelLeftClose, ArrowUp, ArrowDown, XCircle, AlertTriangle, CheckCircle2, Info } from 'lucide-react';
6
+ import { ChevronLeft, ChevronRight, ChevronsUpDown, Check, Minus, X, CalendarDays, Clock, Upload as Upload$1, Plus, Search, Star, PanelLeftOpen, PanelLeftClose, ArrowUp, ArrowDown, XCircle, AlertTriangle, CheckCircle2, Info } from 'lucide-react';
7
7
  import { Checkbox as Checkbox$1 } from '@base-ui/react/checkbox';
8
8
  import { Radio } from '@base-ui/react/radio';
9
9
  import { RadioGroup as RadioGroup$1 } from '@base-ui/react/radio-group';
10
10
  import { Switch as Switch$1 } from '@base-ui/react/switch';
11
- import { Combobox as Combobox$1 } from '@base-ui/react/combobox';
11
+ import { Combobox } from '@base-ui/react/combobox';
12
12
  import { Popover as Popover$1 } from '@base-ui/react/popover';
13
- import { Dialog as Dialog$1 } from '@base-ui/react/dialog';
13
+ import { Dialog } from '@base-ui/react/dialog';
14
14
  import { Tooltip as Tooltip$1 } from '@base-ui/react/tooltip';
15
15
  import { Toast } from '@base-ui/react/toast';
16
16
  import { Tabs as Tabs$1 } from '@base-ui/react/tabs';
@@ -204,7 +204,7 @@ function Field({ label, hint, error, required = false, labelHidden = false, clas
204
204
  error && error !== true ? /* @__PURE__ */ jsx("p", { className: "cb-field__error", id: errorId, role: "alert", children: error }) : null
205
205
  ] }) });
206
206
  }
207
- var TextInput = forwardRef(function TextInput2({ size = "md", invalid, className, ...rest }, ref) {
207
+ var Input = forwardRef(function Input2({ size = "md", invalid, className, ...rest }, ref) {
208
208
  const field = useFieldWiring();
209
209
  return /* @__PURE__ */ jsx(
210
210
  "input",
@@ -271,10 +271,18 @@ function Select({
271
271
  ]
272
272
  }
273
273
  ),
274
- /* @__PURE__ */ jsx(Select$1.Portal, { children: /* @__PURE__ */ jsx(Select$1.Positioner, { sideOffset: 6, alignItemWithTrigger: false, children: /* @__PURE__ */ jsx(Select$1.Popup, { className: "cb-select__popup", children: items.map((item) => /* @__PURE__ */ jsxs(Select$1.Item, { value: item.value, disabled: item.disabled, className: "cb-select__item", children: [
275
- /* @__PURE__ */ jsx("span", { className: "cb-select__check", children: /* @__PURE__ */ jsx(Select$1.ItemIndicator, { children: /* @__PURE__ */ jsx(Check, { size: 14 }) }) }),
276
- /* @__PURE__ */ jsx(Select$1.ItemText, { children: item.label })
277
- ] }, item.value)) }) }) })
274
+ /* @__PURE__ */ jsx(Select$1.Portal, { children: /* @__PURE__ */ jsx(
275
+ Select$1.Positioner,
276
+ {
277
+ sideOffset: 6,
278
+ alignItemWithTrigger: false,
279
+ className: "cb-select__positioner",
280
+ children: /* @__PURE__ */ jsx(Select$1.Popup, { className: "cb-select__popup", children: items.map((item) => /* @__PURE__ */ jsxs(Select$1.Item, { value: item.value, disabled: item.disabled, className: "cb-select__item", children: [
281
+ /* @__PURE__ */ jsx("span", { className: "cb-select__check", children: /* @__PURE__ */ jsx(Select$1.ItemIndicator, { children: /* @__PURE__ */ jsx(Check, { size: 14 }) }) }),
282
+ /* @__PURE__ */ jsx(Select$1.ItemText, { children: item.label })
283
+ ] }, item.value)) })
284
+ }
285
+ ) })
278
286
  ]
279
287
  }
280
288
  );
@@ -326,6 +334,7 @@ function RadioGroup({
326
334
  name,
327
335
  label,
328
336
  direction = "column",
337
+ variant = "list",
329
338
  disabled,
330
339
  className
331
340
  }) {
@@ -341,7 +350,12 @@ function RadioGroup({
341
350
  disabled,
342
351
  "aria-label": label,
343
352
  "aria-describedby": field?.describedBy,
344
- className: cn("cb-radio-group", `cb-radio-group--${direction}`, className),
353
+ className: cn(
354
+ "cb-radio-group",
355
+ `cb-radio-group--${variant === "segmented" ? "row" : direction}`,
356
+ variant === "segmented" && "cb-radio-group--segmented",
357
+ className
358
+ ),
345
359
  children: options.map((option) => {
346
360
  const id = `${groupId}-${option.value}`;
347
361
  const descriptionId = option.description ? `${id}-description` : void 0;
@@ -416,57 +430,131 @@ function Switch({
416
430
  ) : null
417
431
  ] });
418
432
  }
419
- function Combobox({
433
+ function AutoComplete({
420
434
  items,
435
+ loadItems,
436
+ loadDelay = 250,
421
437
  value,
422
438
  defaultValue,
423
439
  onValueChange,
424
440
  placeholder = "Search\u2026",
425
441
  emptyMessage = "Nothing matched",
442
+ loadingMessage = "Searching\u2026",
443
+ errorMessage = "Could not search",
426
444
  size = "md",
427
445
  disabled,
428
446
  invalid,
429
447
  name,
448
+ id,
430
449
  className
431
450
  }) {
432
451
  const field = useFieldWiring();
433
452
  const labels = useLabels();
434
- const optionFor = (candidate) => items.find((item) => item.value === candidate) ?? null;
453
+ const async = Boolean(loadItems);
454
+ const shell = useRef(null);
455
+ const [loaded, setLoaded] = useState([]);
456
+ const [loading, setLoading] = useState(false);
457
+ const [failed, setFailed] = useState(false);
458
+ const [chosen, setChosen] = useState(null);
459
+ const available = async ? loaded : items ?? [];
460
+ const optionFor = (candidate) => {
461
+ if (candidate == null) return null;
462
+ if (chosen?.value === candidate) return chosen;
463
+ return available.find((item) => item.value === candidate) ?? null;
464
+ };
465
+ const asked = useRef(0);
466
+ const inFlight = useRef(null);
467
+ const search = useCallback((query2) => {
468
+ if (!loadItems) return;
469
+ const seq = asked.current + 1;
470
+ asked.current = seq;
471
+ inFlight.current?.abort();
472
+ const controller = new AbortController();
473
+ inFlight.current = controller;
474
+ setLoading(true);
475
+ setFailed(false);
476
+ loadItems(query2, controller.signal).then(
477
+ (next) => {
478
+ if (seq !== asked.current) return;
479
+ setLoaded(next);
480
+ setLoading(false);
481
+ },
482
+ () => {
483
+ if (seq !== asked.current || controller.signal.aborted) return;
484
+ setLoaded([]);
485
+ setFailed(true);
486
+ setLoading(false);
487
+ }
488
+ );
489
+ }, [loadItems]);
490
+ const [query, setQuery] = useState("");
491
+ useEffect(() => {
492
+ if (!async) return void 0;
493
+ const id2 = setTimeout(() => search(query), loadDelay);
494
+ return () => clearTimeout(id2);
495
+ }, [async, query, loadDelay, search]);
496
+ useEffect(() => () => {
497
+ asked.current += 1;
498
+ inFlight.current?.abort();
499
+ }, []);
435
500
  return /* @__PURE__ */ jsxs(
436
- Combobox$1.Root,
501
+ Combobox.Root,
437
502
  {
438
- items,
503
+ items: available,
504
+ filter: async ? null : void 0,
505
+ onInputValueChange: async ? (next) => setQuery(next) : void 0,
439
506
  value: value === void 0 ? void 0 : optionFor(value),
440
507
  defaultValue: defaultValue === void 0 ? void 0 : optionFor(defaultValue),
441
- onValueChange: (next) => onValueChange?.(next?.value ?? null),
508
+ onValueChange: (next) => {
509
+ const option = next;
510
+ setChosen(option);
511
+ onValueChange?.(option?.value ?? null);
512
+ },
442
513
  isItemEqualToValue: (a, b) => a?.value === b?.value,
443
514
  itemToStringLabel: (item) => typeof item === "string" ? item : item.label,
444
515
  disabled,
445
516
  name,
446
517
  children: [
447
- /* @__PURE__ */ jsxs("div", { className: cn("cb-combobox", `cb-combobox--${size}`, className), "data-disabled": disabled || void 0, children: [
448
- /* @__PURE__ */ jsx(
449
- Combobox$1.Input,
518
+ /* @__PURE__ */ jsxs(
519
+ "div",
520
+ {
521
+ ref: shell,
522
+ className: cn("cb-autocomplete", `cb-autocomplete--${size}`, className),
523
+ "data-disabled": disabled || void 0,
524
+ children: [
525
+ /* @__PURE__ */ jsx(
526
+ Combobox.Input,
527
+ {
528
+ className: "cb-autocomplete__input",
529
+ placeholder,
530
+ id: id ?? field?.controlId,
531
+ "aria-describedby": field?.describedBy,
532
+ "aria-invalid": invalid ?? field?.invalid ? true : void 0
533
+ }
534
+ ),
535
+ /* @__PURE__ */ jsx(Combobox.Clear, { className: "cb-autocomplete__clear", "aria-label": labels.clear, children: /* @__PURE__ */ jsx(X, { size: 14 }) }),
536
+ /* @__PURE__ */ jsx(Combobox.Trigger, { className: "cb-autocomplete__trigger", "aria-label": labels.open, children: /* @__PURE__ */ jsx(ChevronsUpDown, { size: 16 }) })
537
+ ]
538
+ }
539
+ ),
540
+ /* @__PURE__ */ jsx(Combobox.Portal, { children: /* @__PURE__ */ jsx(Combobox.Positioner, { anchor: shell, sideOffset: 6, className: "cb-autocomplete__positioner", children: /* @__PURE__ */ jsxs(Combobox.Popup, { className: "cb-autocomplete__popup", children: [
541
+ loading ? /* @__PURE__ */ jsx("p", { className: "cb-autocomplete__status", role: "status", children: loadingMessage }) : failed ? /* @__PURE__ */ jsx("p", { className: "cb-autocomplete__status", role: "alert", children: errorMessage }) : /* @__PURE__ */ jsx(Combobox.Empty, { className: "cb-autocomplete__empty", children: emptyMessage }),
542
+ /* @__PURE__ */ jsx(Combobox.List, { children: (item) => /* @__PURE__ */ jsxs(
543
+ Combobox.Item,
450
544
  {
451
- className: "cb-combobox__input",
452
- placeholder,
453
- id: field?.controlId,
454
- "aria-describedby": field?.describedBy,
455
- "aria-invalid": invalid ?? field?.invalid ? true : void 0
456
- }
457
- ),
458
- /* @__PURE__ */ jsx(Combobox$1.Clear, { className: "cb-combobox__clear", "aria-label": labels.clear, children: /* @__PURE__ */ jsx(X, { size: 14 }) }),
459
- /* @__PURE__ */ jsx(Combobox$1.Trigger, { className: "cb-combobox__trigger", "aria-label": labels.open, children: /* @__PURE__ */ jsx(ChevronsUpDown, { size: 16 }) })
460
- ] }),
461
- /* @__PURE__ */ jsx(Combobox$1.Portal, { children: /* @__PURE__ */ jsx(Combobox$1.Positioner, { sideOffset: 6, children: /* @__PURE__ */ jsxs(Combobox$1.Popup, { className: "cb-combobox__popup", children: [
462
- /* @__PURE__ */ jsx(Combobox$1.Empty, { className: "cb-combobox__empty", children: emptyMessage }),
463
- /* @__PURE__ */ jsx(Combobox$1.List, { children: (item) => /* @__PURE__ */ jsxs(Combobox$1.Item, { value: item, className: "cb-combobox__item", children: [
464
- /* @__PURE__ */ jsx("span", { className: "cb-combobox__check", children: /* @__PURE__ */ jsx(Combobox$1.ItemIndicator, { children: /* @__PURE__ */ jsx(Check, { size: 14 }) }) }),
465
- /* @__PURE__ */ jsxs("span", { className: "cb-combobox__text", children: [
466
- /* @__PURE__ */ jsx("span", { className: "cb-combobox__label", children: item.label }),
467
- item.description ? /* @__PURE__ */ jsx("span", { className: "cb-combobox__description", children: item.description }) : null
468
- ] })
469
- ] }, item.value) })
545
+ value: item,
546
+ disabled: item.disabled,
547
+ className: "cb-autocomplete__item",
548
+ children: [
549
+ /* @__PURE__ */ jsx("span", { className: "cb-autocomplete__check", children: /* @__PURE__ */ jsx(Combobox.ItemIndicator, { children: /* @__PURE__ */ jsx(Check, { size: 14 }) }) }),
550
+ /* @__PURE__ */ jsxs("span", { className: "cb-autocomplete__text", children: [
551
+ /* @__PURE__ */ jsx("span", { className: "cb-autocomplete__label", children: item.label }),
552
+ item.description ? /* @__PURE__ */ jsx("span", { className: "cb-autocomplete__description", children: item.description }) : null
553
+ ] })
554
+ ]
555
+ },
556
+ item.value
557
+ ) })
470
558
  ] }) }) })
471
559
  ]
472
560
  }
@@ -526,7 +614,7 @@ function isOutOfRange(date, min, max) {
526
614
  return false;
527
615
  }
528
616
  var WEEKDAYS = ["Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"];
529
- function DateInput({
617
+ function DatePicker({
530
618
  value,
531
619
  defaultValue = null,
532
620
  onValueChange,
@@ -601,57 +689,67 @@ function DateInput({
601
689
  ]
602
690
  }
603
691
  ),
604
- /* @__PURE__ */ jsx(Popover$1.Portal, { children: /* @__PURE__ */ jsx(Popover$1.Positioner, { anchor: fieldRef, side: "bottom", align: "start", sideOffset: 6, children: /* @__PURE__ */ jsxs(Popover$1.Popup, { className: "cb-calendar", children: [
605
- /* @__PURE__ */ jsxs("div", { className: "cb-calendar__head", children: [
606
- /* @__PURE__ */ jsx(
607
- "button",
608
- {
609
- type: "button",
610
- className: "cb-calendar__nav",
611
- "aria-label": labels.previousMonth,
612
- onClick: () => setCursor(new Date(cursor.getFullYear(), cursor.getMonth() - 1, 1)),
613
- children: /* @__PURE__ */ jsx(ChevronLeft, { size: 16 })
614
- }
615
- ),
616
- /* @__PURE__ */ jsx("p", { className: "cb-calendar__month", "aria-live": "polite", children: cursor.toLocaleDateString(void 0, { month: "long", year: "numeric" }) }),
617
- /* @__PURE__ */ jsx(
618
- "button",
619
- {
620
- type: "button",
621
- className: "cb-calendar__nav",
622
- "aria-label": labels.nextMonth,
623
- onClick: () => setCursor(new Date(cursor.getFullYear(), cursor.getMonth() + 1, 1)),
624
- children: /* @__PURE__ */ jsx(ChevronRight, { size: 16 })
625
- }
626
- )
627
- ] }),
628
- /* @__PURE__ */ jsxs("table", { className: "cb-calendar__grid", children: [
629
- /* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsx("tr", { children: weekdays.map((day) => /* @__PURE__ */ jsx("th", { scope: "col", abbr: day, children: day }, day)) }) }),
630
- /* @__PURE__ */ jsx("tbody", { children: weeks.map((week, weekIndex) => /* @__PURE__ */ jsx("tr", { children: week.map((cell) => {
631
- const selected = isSameDay(cell.date, current);
632
- const outside = isOutOfRange(cell.date, min, max);
633
- return /* @__PURE__ */ jsx("td", { children: /* @__PURE__ */ jsx(
634
- "button",
635
- {
636
- type: "button",
637
- className: "cb-calendar__day",
638
- "data-outside": !cell.inMonth || void 0,
639
- "data-selected": selected || void 0,
640
- "data-today": isSameDay(cell.date, /* @__PURE__ */ new Date()) || void 0,
641
- disabled: outside,
642
- "aria-pressed": selected,
643
- "aria-label": formatISO(cell.date),
644
- onClick: () => {
645
- commit(cell.date);
646
- setCursor(cell.date);
647
- setOpen(false);
648
- },
649
- children: cell.date.getDate()
650
- }
651
- ) }, cell.date.toISOString());
652
- }) }, weekIndex)) })
653
- ] })
654
- ] }) }) })
692
+ /* @__PURE__ */ jsx(Popover$1.Portal, { children: /* @__PURE__ */ jsx(
693
+ Popover$1.Positioner,
694
+ {
695
+ anchor: fieldRef,
696
+ side: "bottom",
697
+ align: "start",
698
+ sideOffset: 6,
699
+ className: "cb-calendar__positioner",
700
+ children: /* @__PURE__ */ jsxs(Popover$1.Popup, { className: "cb-calendar", children: [
701
+ /* @__PURE__ */ jsxs("div", { className: "cb-calendar__head", children: [
702
+ /* @__PURE__ */ jsx(
703
+ "button",
704
+ {
705
+ type: "button",
706
+ className: "cb-calendar__nav",
707
+ "aria-label": labels.previousMonth,
708
+ onClick: () => setCursor(new Date(cursor.getFullYear(), cursor.getMonth() - 1, 1)),
709
+ children: /* @__PURE__ */ jsx(ChevronLeft, { size: 16 })
710
+ }
711
+ ),
712
+ /* @__PURE__ */ jsx("p", { className: "cb-calendar__month", "aria-live": "polite", children: cursor.toLocaleDateString(void 0, { month: "long", year: "numeric" }) }),
713
+ /* @__PURE__ */ jsx(
714
+ "button",
715
+ {
716
+ type: "button",
717
+ className: "cb-calendar__nav",
718
+ "aria-label": labels.nextMonth,
719
+ onClick: () => setCursor(new Date(cursor.getFullYear(), cursor.getMonth() + 1, 1)),
720
+ children: /* @__PURE__ */ jsx(ChevronRight, { size: 16 })
721
+ }
722
+ )
723
+ ] }),
724
+ /* @__PURE__ */ jsxs("table", { className: "cb-calendar__grid", children: [
725
+ /* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsx("tr", { children: weekdays.map((day) => /* @__PURE__ */ jsx("th", { scope: "col", abbr: day, children: day }, day)) }) }),
726
+ /* @__PURE__ */ jsx("tbody", { children: weeks.map((week, weekIndex) => /* @__PURE__ */ jsx("tr", { children: week.map((cell) => {
727
+ const selected = isSameDay(cell.date, current);
728
+ const outside = isOutOfRange(cell.date, min, max);
729
+ return /* @__PURE__ */ jsx("td", { children: /* @__PURE__ */ jsx(
730
+ "button",
731
+ {
732
+ type: "button",
733
+ className: "cb-calendar__day",
734
+ "data-outside": !cell.inMonth || void 0,
735
+ "data-selected": selected || void 0,
736
+ "data-today": isSameDay(cell.date, /* @__PURE__ */ new Date()) || void 0,
737
+ disabled: outside,
738
+ "aria-pressed": selected,
739
+ "aria-label": formatISO(cell.date),
740
+ onClick: () => {
741
+ commit(cell.date);
742
+ setCursor(cell.date);
743
+ setOpen(false);
744
+ },
745
+ children: cell.date.getDate()
746
+ }
747
+ ) }, cell.date.toISOString());
748
+ }) }, weekIndex)) })
749
+ ] })
750
+ ] })
751
+ }
752
+ ) })
655
753
  ] });
656
754
  }
657
755
 
@@ -705,7 +803,7 @@ function isTimeOutOfRange(value, min, max) {
705
803
  if (max && minutes > timeToMinutes(max)) return true;
706
804
  return false;
707
805
  }
708
- function TimeInput({
806
+ function TimePicker({
709
807
  value,
710
808
  defaultValue = null,
711
809
  onValueChange,
@@ -772,27 +870,37 @@ function TimeInput({
772
870
  ]
773
871
  }
774
872
  ),
775
- /* @__PURE__ */ jsx(Popover$1.Portal, { children: /* @__PURE__ */ jsx(Popover$1.Positioner, { anchor: fieldRef, side: "bottom", align: "start", sideOffset: 6, children: /* @__PURE__ */ jsx(Popover$1.Popup, { className: "cb-times", children: /* @__PURE__ */ jsx("ul", { className: "cb-times__list", children: options.map((option) => {
776
- const selected = current ? timeToMinutes(current) === timeToMinutes(option) : false;
777
- return /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx(
778
- "button",
779
- {
780
- type: "button",
781
- className: "cb-times__option",
782
- "data-selected": selected || void 0,
783
- "aria-pressed": selected,
784
- onClick: () => {
785
- commit(option);
786
- setOpen(false);
787
- },
788
- children: formatTime(option)
789
- }
790
- ) }, formatTime(option));
791
- }) }) }) }) })
873
+ /* @__PURE__ */ jsx(Popover$1.Portal, { children: /* @__PURE__ */ jsx(
874
+ Popover$1.Positioner,
875
+ {
876
+ anchor: fieldRef,
877
+ side: "bottom",
878
+ align: "start",
879
+ sideOffset: 6,
880
+ className: "cb-times__positioner",
881
+ children: /* @__PURE__ */ jsx(Popover$1.Popup, { className: "cb-times", children: /* @__PURE__ */ jsx("ul", { className: "cb-times__list", children: options.map((option) => {
882
+ const selected = current ? timeToMinutes(current) === timeToMinutes(option) : false;
883
+ return /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx(
884
+ "button",
885
+ {
886
+ type: "button",
887
+ className: "cb-times__option",
888
+ "data-selected": selected || void 0,
889
+ "aria-pressed": selected,
890
+ onClick: () => {
891
+ commit(option);
892
+ setOpen(false);
893
+ },
894
+ children: formatTime(option)
895
+ }
896
+ ) }, formatTime(option));
897
+ }) }) })
898
+ }
899
+ ) })
792
900
  ] });
793
901
  }
794
902
 
795
- // src/form/file-drop.util.ts
903
+ // src/form/upload.util.ts
796
904
  function matchesAccept(file, accept) {
797
905
  if (!accept || accept.length === 0) return true;
798
906
  const name = file.name.toLowerCase();
@@ -830,7 +938,7 @@ function describeAccept(rules) {
830
938
  if (typeof rules.maxSize === "number") parts.push(`up to ${Math.round(rules.maxSize / (1024 * 1024))} MB`);
831
939
  return parts.length > 0 ? ` \u2014 ${parts.join(" ")}` : "";
832
940
  }
833
- function FileDrop({
941
+ function Upload({
834
942
  onFilesChange,
835
943
  files = [],
836
944
  onReject,
@@ -887,7 +995,7 @@ function FileDrop({
887
995
  }
888
996
  }
889
997
  ),
890
- /* @__PURE__ */ jsx("span", { className: "cb-filedrop__icon", "aria-hidden": "true", children: /* @__PURE__ */ jsx(Upload, { size: 20 }) }),
998
+ /* @__PURE__ */ jsx("span", { className: "cb-filedrop__icon", "aria-hidden": "true", children: /* @__PURE__ */ jsx(Upload$1, { size: 20 }) }),
891
999
  /* @__PURE__ */ jsx("span", { className: "cb-filedrop__button", children: multiple ? labels.chooseFiles : labels.chooseFile }),
892
1000
  /* @__PURE__ */ jsxs("p", { className: "cb-filedrop__hint", children: [
893
1001
  multiple ? labels.dropFilesHere : labels.dropFileHere,
@@ -950,7 +1058,7 @@ function canStep(value, direction, bounds) {
950
1058
  if (direction === 1) return typeof bounds.max !== "number" || value < bounds.max;
951
1059
  return typeof bounds.min !== "number" || value > bounds.min;
952
1060
  }
953
- function NumberInput({
1061
+ function InputNumber({
954
1062
  value,
955
1063
  defaultValue = null,
956
1064
  onValueChange,
@@ -1038,7 +1146,7 @@ function NumberInput({
1038
1146
  function formatValue(value) {
1039
1147
  return value === null ? "" : String(value);
1040
1148
  }
1041
- function Dialog({
1149
+ function Modal({
1042
1150
  open,
1043
1151
  defaultOpen,
1044
1152
  onOpenChange,
@@ -1051,26 +1159,51 @@ function Dialog({
1051
1159
  trigger,
1052
1160
  className
1053
1161
  }) {
1054
- return /* @__PURE__ */ jsxs(Dialog$1.Root, { open, defaultOpen, onOpenChange, children: [
1055
- trigger ? /* @__PURE__ */ jsx(Dialog$1.Trigger, { render: trigger }) : null,
1056
- /* @__PURE__ */ jsxs(Dialog$1.Portal, { children: [
1057
- /* @__PURE__ */ jsx(Dialog$1.Backdrop, { className: "cb-dialog__backdrop" }),
1162
+ return /* @__PURE__ */ jsxs(Dialog.Root, { open, defaultOpen, onOpenChange, children: [
1163
+ trigger ? /* @__PURE__ */ jsx(Dialog.Trigger, { render: trigger }) : null,
1164
+ /* @__PURE__ */ jsxs(Dialog.Portal, { children: [
1165
+ /* @__PURE__ */ jsx(Dialog.Backdrop, { className: "cb-modal__backdrop" }),
1058
1166
  /* @__PURE__ */ jsxs(
1059
- Dialog$1.Popup,
1167
+ Dialog.Popup,
1060
1168
  {
1061
- className: cn("cb-dialog", `cb-dialog--${size}`, `cb-dialog--${placement}`, className),
1169
+ className: cn("cb-modal", `cb-modal--${size}`, `cb-modal--${placement}`, className),
1062
1170
  children: [
1063
- /* @__PURE__ */ jsx(Dialog$1.Title, { className: "cb-dialog__title", children: title }),
1064
- description ? /* @__PURE__ */ jsx(Dialog$1.Description, { className: "cb-dialog__description", children: description }) : null,
1065
- children ? /* @__PURE__ */ jsx("div", { className: "cb-dialog__body", children }) : null,
1066
- footer ? /* @__PURE__ */ jsx("div", { className: "cb-dialog__footer", children: footer }) : null
1171
+ /* @__PURE__ */ jsx(Dialog.Title, { className: "cb-modal__title", children: title }),
1172
+ description ? /* @__PURE__ */ jsx(Dialog.Description, { className: "cb-modal__description", children: description }) : null,
1173
+ children ? /* @__PURE__ */ jsx("div", { className: "cb-modal__body", children }) : null,
1174
+ footer ? /* @__PURE__ */ jsx("div", { className: "cb-modal__footer", children: footer }) : null
1067
1175
  ]
1068
1176
  }
1069
1177
  )
1070
1178
  ] })
1071
1179
  ] });
1072
1180
  }
1073
- var DialogClose = Dialog$1.Close;
1181
+ var DialogClose = Dialog.Close;
1182
+ function Drawer({
1183
+ open,
1184
+ defaultOpen,
1185
+ onOpenChange,
1186
+ title,
1187
+ description,
1188
+ children,
1189
+ footer,
1190
+ trigger,
1191
+ className
1192
+ }) {
1193
+ return /* @__PURE__ */ jsxs(Dialog.Root, { open, defaultOpen, onOpenChange, children: [
1194
+ trigger ? /* @__PURE__ */ jsx(Dialog.Trigger, { render: trigger }) : null,
1195
+ /* @__PURE__ */ jsxs(Dialog.Portal, { children: [
1196
+ /* @__PURE__ */ jsx(Dialog.Backdrop, { className: "cb-drawer__backdrop" }),
1197
+ /* @__PURE__ */ jsxs(Dialog.Popup, { className: cn("cb-drawer", className), children: [
1198
+ /* @__PURE__ */ jsx(Dialog.Title, { className: "cb-drawer__title", children: title }),
1199
+ description ? /* @__PURE__ */ jsx(Dialog.Description, { className: "cb-drawer__description", children: description }) : null,
1200
+ children ? /* @__PURE__ */ jsx("div", { className: "cb-drawer__body", children }) : null,
1201
+ footer ? /* @__PURE__ */ jsx("div", { className: "cb-drawer__footer", children: footer }) : null
1202
+ ] })
1203
+ ] })
1204
+ ] });
1205
+ }
1206
+ var DrawerClose = Dialog.Close;
1074
1207
 
1075
1208
  // src/overlay/command.util.ts
1076
1209
  function rankCommand(command, query) {
@@ -1119,9 +1252,9 @@ function CommandPalette({
1119
1252
  onOpenChange(false);
1120
1253
  command.onRun();
1121
1254
  };
1122
- return /* @__PURE__ */ jsx(Dialog$1.Root, { open, onOpenChange, children: /* @__PURE__ */ jsxs(Dialog$1.Portal, { children: [
1123
- /* @__PURE__ */ jsx(Dialog$1.Backdrop, { className: "cb-dialog__backdrop" }),
1124
- /* @__PURE__ */ jsxs(Dialog$1.Popup, { className: cn("cb-palette", className), "aria-label": "Command palette", children: [
1255
+ return /* @__PURE__ */ jsx(Dialog.Root, { open, onOpenChange, children: /* @__PURE__ */ jsxs(Dialog.Portal, { children: [
1256
+ /* @__PURE__ */ jsx(Dialog.Backdrop, { className: "cb-palette__backdrop" }),
1257
+ /* @__PURE__ */ jsxs(Dialog.Popup, { className: cn("cb-palette", className), "aria-label": "Command palette", children: [
1125
1258
  /* @__PURE__ */ jsxs("div", { className: "cb-palette__search", children: [
1126
1259
  /* @__PURE__ */ jsx(Search, { size: 16, className: "cb-palette__search-icon" }),
1127
1260
  /* @__PURE__ */ jsx(
@@ -1259,20 +1392,155 @@ function Popover({
1259
1392
  }) {
1260
1393
  return /* @__PURE__ */ jsxs(Popover$1.Root, { open, onOpenChange, children: [
1261
1394
  /* @__PURE__ */ jsx(Popover$1.Trigger, { render: trigger }),
1262
- /* @__PURE__ */ jsx(Popover$1.Portal, { children: /* @__PURE__ */ jsx(Popover$1.Positioner, { side, align, sideOffset, children: /* @__PURE__ */ jsxs(Popover$1.Popup, { className: cn("cb-popover", className), children: [
1263
- showArrow ? /* @__PURE__ */ jsx(Popover$1.Arrow, { className: "cb-popover__arrow", children: /* @__PURE__ */ jsx(ArrowShape, {}) }) : null,
1264
- children
1265
- ] }) }) })
1395
+ /* @__PURE__ */ jsx(Popover$1.Portal, { children: /* @__PURE__ */ jsx(
1396
+ Popover$1.Positioner,
1397
+ {
1398
+ side,
1399
+ align,
1400
+ sideOffset,
1401
+ className: "cb-popover-positioner",
1402
+ children: /* @__PURE__ */ jsxs(Popover$1.Popup, { className: cn("cb-popover", className), children: [
1403
+ showArrow ? /* @__PURE__ */ jsx(Popover$1.Arrow, { className: "cb-popover__arrow", children: /* @__PURE__ */ jsx(ArrowShape, {}) }) : null,
1404
+ children
1405
+ ] })
1406
+ }
1407
+ ) })
1266
1408
  ] });
1267
1409
  }
1268
- function Tooltip({ children, label, side = "top", delay = 400 }) {
1410
+ function Tooltip({
1411
+ children,
1412
+ label,
1413
+ side = "top",
1414
+ align = "center",
1415
+ sideOffset = 6,
1416
+ showArrow = true,
1417
+ delay = 400
1418
+ }) {
1269
1419
  return /* @__PURE__ */ jsx(Tooltip$1.Provider, { delay, children: /* @__PURE__ */ jsxs(Tooltip$1.Root, { children: [
1270
1420
  /* @__PURE__ */ jsx(Tooltip$1.Trigger, { render: children }),
1271
- /* @__PURE__ */ jsx(Tooltip$1.Portal, { children: /* @__PURE__ */ jsx(Tooltip$1.Positioner, { side, sideOffset: 6, children: /* @__PURE__ */ jsx(Tooltip$1.Popup, { className: "cb-tooltip", children: label }) }) })
1421
+ /* @__PURE__ */ jsx(Tooltip$1.Portal, { children: /* @__PURE__ */ jsx(
1422
+ Tooltip$1.Positioner,
1423
+ {
1424
+ side,
1425
+ align,
1426
+ sideOffset,
1427
+ className: "cb-tooltip-positioner",
1428
+ children: /* @__PURE__ */ jsxs(Tooltip$1.Popup, { className: "cb-tooltip", children: [
1429
+ showArrow ? /* @__PURE__ */ jsx(Tooltip$1.Arrow, { className: "cb-tooltip__arrow", children: /* @__PURE__ */ jsx(ArrowShape, {}) }) : null,
1430
+ label
1431
+ ] })
1432
+ }
1433
+ ) })
1272
1434
  ] }) });
1273
1435
  }
1274
1436
  function ArrowShape() {
1275
- return /* @__PURE__ */ jsx("span", { className: "cb-arrow", "aria-hidden": "true" });
1437
+ return /* @__PURE__ */ jsxs(
1438
+ "svg",
1439
+ {
1440
+ className: "cb-arrow",
1441
+ viewBox: "0 0 16 8",
1442
+ preserveAspectRatio: "none",
1443
+ "aria-hidden": "true",
1444
+ focusable: "false",
1445
+ children: [
1446
+ /* @__PURE__ */ jsx("path", { className: "cb-arrow__fill", d: "M0 8 L8 0 L16 8 Z" }),
1447
+ /* @__PURE__ */ jsx("path", { className: "cb-arrow__edge", d: "M0 8 L8 0 L16 8" })
1448
+ ]
1449
+ }
1450
+ );
1451
+ }
1452
+ function Tag({
1453
+ children,
1454
+ tone = "neutral",
1455
+ variant = "soft",
1456
+ size = "md",
1457
+ icon,
1458
+ onClick,
1459
+ pressed,
1460
+ onClose,
1461
+ render,
1462
+ className
1463
+ }) {
1464
+ const labels = useLabels();
1465
+ const classes = cn("cb-badge", "cb-tag", `cb-badge--${variant}`, `cb-badge--${size}`, className);
1466
+ const body = /* @__PURE__ */ jsxs(Fragment$1, { children: [
1467
+ icon,
1468
+ children
1469
+ ] });
1470
+ if (render && isValidElement(render)) {
1471
+ return cloneElement(render, {
1472
+ className: cn(classes, "cb-tag--pressable", render.props.className),
1473
+ "data-tone": tone,
1474
+ children: body
1475
+ });
1476
+ }
1477
+ if (onClose) {
1478
+ return /* @__PURE__ */ jsxs("span", { className: classes, "data-tone": tone, children: [
1479
+ body,
1480
+ /* @__PURE__ */ jsx("button", { type: "button", className: "cb-tag__close", "aria-label": labels.dismiss, onClick: onClose, children: /* @__PURE__ */ jsx(X, { size: 12 }) })
1481
+ ] });
1482
+ }
1483
+ if (onClick) {
1484
+ return /* @__PURE__ */ jsx(
1485
+ "button",
1486
+ {
1487
+ type: "button",
1488
+ className: cn(classes, "cb-tag--pressable"),
1489
+ "data-tone": tone,
1490
+ "aria-pressed": pressed,
1491
+ onClick,
1492
+ children: body
1493
+ }
1494
+ );
1495
+ }
1496
+ return /* @__PURE__ */ jsx("span", { className: classes, "data-tone": tone, children: body });
1497
+ }
1498
+ function Rate({
1499
+ value,
1500
+ onValueChange,
1501
+ count = 5,
1502
+ size = 20,
1503
+ readOnly = false,
1504
+ label,
1505
+ className
1506
+ }) {
1507
+ const group = useId();
1508
+ const field = useFieldWiring();
1509
+ const scores = Array.from({ length: count }, (_, i) => i + 1);
1510
+ if (readOnly) {
1511
+ return /* @__PURE__ */ jsx(
1512
+ "span",
1513
+ {
1514
+ className: cn("cb-rate", "cb-rate--static", className),
1515
+ role: "img",
1516
+ "aria-label": label ? `${label}: ${value}/${count}` : `${value}/${count}`,
1517
+ children: scores.map((n) => /* @__PURE__ */ jsx(Star, { size, strokeWidth: 2.5, fill: value >= n ? "currentColor" : "none" }, n))
1518
+ }
1519
+ );
1520
+ }
1521
+ return /* @__PURE__ */ jsx(
1522
+ "span",
1523
+ {
1524
+ className: cn("cb-rate", className),
1525
+ role: "radiogroup",
1526
+ "aria-label": label,
1527
+ "aria-describedby": field?.describedBy,
1528
+ children: scores.map((n) => /* @__PURE__ */ jsx(
1529
+ "button",
1530
+ {
1531
+ id: `${group}-${n}`,
1532
+ type: "button",
1533
+ className: "cb-rate__star",
1534
+ role: "radio",
1535
+ "aria-checked": value === n,
1536
+ "aria-label": `${n}/${count}`,
1537
+ onClick: () => onValueChange?.(value === n ? 0 : n),
1538
+ children: /* @__PURE__ */ jsx(Star, { size, strokeWidth: 2.5, fill: value >= n ? "currentColor" : "none" })
1539
+ },
1540
+ n
1541
+ ))
1542
+ }
1543
+ );
1276
1544
  }
1277
1545
  var ICONS = {
1278
1546
  neutral: /* @__PURE__ */ jsx(Info, { size: 18 }),
@@ -1371,26 +1639,42 @@ function Tabs({ items, value, defaultValue, onValueChange, variant = "underline"
1371
1639
  }
1372
1640
  );
1373
1641
  }
1374
- function DropdownMenu({ trigger, items, align = "end", side = "bottom", className }) {
1642
+ function Dropdown({ trigger, items, sections, align = "end", side = "bottom", className }) {
1643
+ const groups = sections ?? [{ items }];
1375
1644
  return /* @__PURE__ */ jsxs(Menu.Root, { children: [
1376
1645
  /* @__PURE__ */ jsx(Menu.Trigger, { render: trigger }),
1377
- /* @__PURE__ */ jsx(Menu.Portal, { children: /* @__PURE__ */ jsx(Menu.Positioner, { side, align, sideOffset: 6, children: /* @__PURE__ */ jsx(Menu.Popup, { className: cn("cb-menu", className), children: items.map(
1378
- (item, index) => item.separator ? /* @__PURE__ */ jsx(Menu.Separator, { className: "cb-menu__separator" }, `separator-${index}`) : /* @__PURE__ */ jsxs(
1379
- Menu.Item,
1380
- {
1381
- className: "cb-menu__item",
1382
- "data-tone": item.tone,
1383
- disabled: item.disabled,
1384
- onClick: item.onSelect,
1385
- children: [
1386
- /* @__PURE__ */ jsx("span", { className: "cb-menu__icon", children: item.checked ? /* @__PURE__ */ jsx(Check, { size: 14 }) : item.icon }),
1387
- /* @__PURE__ */ jsx("span", { className: "cb-menu__label", children: item.label }),
1388
- item.shortcut ? /* @__PURE__ */ jsx("kbd", { className: "cb-menu__shortcut", children: item.shortcut }) : null
1389
- ]
1390
- },
1391
- `${String(item.label)}-${index}`
1392
- )
1393
- ) }) }) })
1646
+ /* @__PURE__ */ jsx(Menu.Portal, { children: /* @__PURE__ */ jsx(
1647
+ Menu.Positioner,
1648
+ {
1649
+ side,
1650
+ align,
1651
+ sideOffset: 6,
1652
+ className: "cb-menu-positioner",
1653
+ children: /* @__PURE__ */ jsx(Menu.Popup, { className: cn("cb-menu", className), children: groups.map((section, sectionIndex) => /* @__PURE__ */ jsxs(Fragment, { children: [
1654
+ sectionIndex > 0 ? /* @__PURE__ */ jsx(Menu.Separator, { className: "cb-menu__separator" }) : null,
1655
+ /* @__PURE__ */ jsxs(Menu.Group, { className: "cb-menu__group", children: [
1656
+ section.label ? /* @__PURE__ */ jsx(Menu.GroupLabel, { className: "cb-menu__group-label", children: section.label }) : null,
1657
+ section.items.map(
1658
+ (item, itemIndex) => item.separator ? /* @__PURE__ */ jsx(Menu.Separator, { className: "cb-menu__separator" }, `separator-${itemIndex}`) : /* @__PURE__ */ jsxs(
1659
+ Menu.Item,
1660
+ {
1661
+ className: "cb-menu__item",
1662
+ "data-tone": item.tone,
1663
+ disabled: item.disabled,
1664
+ onClick: item.onSelect,
1665
+ children: [
1666
+ /* @__PURE__ */ jsx("span", { className: "cb-menu__icon", children: item.checked ? /* @__PURE__ */ jsx(Check, { size: 14 }) : item.icon }),
1667
+ /* @__PURE__ */ jsx("span", { className: "cb-menu__label", children: item.label }),
1668
+ item.shortcut ? /* @__PURE__ */ jsx("kbd", { className: "cb-menu__shortcut", children: item.shortcut }) : null
1669
+ ]
1670
+ },
1671
+ `${String(item.label)}-${itemIndex}`
1672
+ )
1673
+ )
1674
+ ] })
1675
+ ] }, `section-${sectionIndex}`)) })
1676
+ }
1677
+ ) })
1394
1678
  ] });
1395
1679
  }
1396
1680
  var hasActiveChild = (item) => Boolean(item.items?.some((child) => child.active));
@@ -1434,7 +1718,7 @@ function SidebarEntry({ item, collapsed }) {
1434
1718
  if (collapsed) {
1435
1719
  return /* @__PURE__ */ jsx(Flyout, { label: item.label, items: children, children: /* @__PURE__ */ jsx(SidebarRow, { item: { ...item, active: item.active || hasActiveChild(item) }, collapsed: true }) });
1436
1720
  }
1437
- return /* @__PURE__ */ jsxs(Fragment, { children: [
1721
+ return /* @__PURE__ */ jsxs(Fragment$1, { children: [
1438
1722
  /* @__PURE__ */ jsxs(
1439
1723
  "button",
1440
1724
  {
@@ -1455,7 +1739,7 @@ function SidebarEntry({ item, collapsed }) {
1455
1739
  ] });
1456
1740
  }
1457
1741
  function SidebarRow({ item, collapsed, nested }) {
1458
- const content = /* @__PURE__ */ jsxs(Fragment, { children: [
1742
+ const content = /* @__PURE__ */ jsxs(Fragment$1, { children: [
1459
1743
  item.icon ? /* @__PURE__ */ jsx("span", { className: "cb-sidebar__icon", children: item.icon }) : null,
1460
1744
  /* @__PURE__ */ jsx("span", { className: "cb-sidebar__label", children: item.label }),
1461
1745
  item.adornment && !collapsed ? /* @__PURE__ */ jsx("span", { className: "cb-sidebar__adornment", children: item.adornment }) : null
@@ -1541,7 +1825,7 @@ function pageRange(page, pageSize, total, siblings = 1) {
1541
1825
  });
1542
1826
  return { items, totalPages, from, to };
1543
1827
  }
1544
- function DataTable({
1828
+ function Table({
1545
1829
  columns,
1546
1830
  rows,
1547
1831
  rowKey,
@@ -1609,7 +1893,7 @@ function DataTableSkeleton({ columns, rows = 5, className }) {
1609
1893
  /* @__PURE__ */ jsx("tbody", { children: Array.from({ length: rows }, (_, rowIndex) => /* @__PURE__ */ jsx("tr", { children: Array.from({ length: columns }, (_2, cellIndex) => /* @__PURE__ */ jsx("td", { children: /* @__PURE__ */ jsx(Skeleton, { width: cellIndex === 0 ? "70%" : "45%", height: "0.875rem" }) }, cellIndex)) }, rowIndex)) })
1610
1894
  ] }) });
1611
1895
  }
1612
- DataTable.Skeleton = DataTableSkeleton;
1896
+ Table.Skeleton = DataTableSkeleton;
1613
1897
  function Pagination({
1614
1898
  page,
1615
1899
  pageSize,
@@ -1883,7 +2167,7 @@ function Coachmark({
1883
2167
  const labels = useLabels();
1884
2168
  const rect = useAnchorRect(anchor, open && spotlight !== false);
1885
2169
  const padding = typeof spotlight === "number" ? spotlight : 8;
1886
- return /* @__PURE__ */ jsxs(Fragment, { children: [
2170
+ return /* @__PURE__ */ jsxs(Fragment$1, { children: [
1887
2171
  rect ? /* @__PURE__ */ jsx(
1888
2172
  "div",
1889
2173
  {
@@ -2058,7 +2342,7 @@ function Tour({ id, steps, open = false, onOpenChange, seenStore, onFinish, onSk
2058
2342
  spotlight: step.spotlight,
2059
2343
  progress: { current: state.index + 1, total: steps.length },
2060
2344
  onDismiss: skip,
2061
- actions: /* @__PURE__ */ jsxs(Fragment, { children: [
2345
+ actions: /* @__PURE__ */ jsxs(Fragment$1, { children: [
2062
2346
  state.index > 0 ? /* @__PURE__ */ jsx(Button, { size: "sm", variant: "ghost", tone: "neutral", onClick: () => rawDispatch({ type: "prev" }), children: text2.back }) : /* @__PURE__ */ jsx(Button, { size: "sm", variant: "ghost", tone: "neutral", onClick: skip, children: text2.skip }),
2063
2347
  /* @__PURE__ */ jsx(Button, { size: "sm", onClick: () => rawDispatch({ type: "next" }), children: isLast ? text2.done : text2.next })
2064
2348
  ] }),
@@ -2101,4 +2385,4 @@ function Stagger({ children, step = 0.06, from = "below", onView = false, classN
2101
2385
  return /* @__PURE__ */ jsx("div", { className, children: Children.map(children, (child, index) => /* @__PURE__ */ jsx(Reveal, { from, delay: index * step, onView, children: child })) });
2102
2386
  }
2103
2387
 
2104
- export { Alert, Button, Carousel, Checkbox, Checklist, Coachmark, Combobox, CommandPalette, DEFAULT_LABELS, DataTable, DateInput, Dialog, DialogClose, DropdownMenu, Field, FileDrop, Image, LabelsProvider, MotionProvider, NumberInput, Pagination, Popover, RadioGroup, Reveal, Select, Sidebar, Stagger, Switch, Tabs, TextInput, Textarea, ThemeProvider, TimeInput, ToastProvider, Tooltip, TopBar, Tour, ariaSortFor, canStep, clamp, decimalPlaces, describeAccept, filterCommands, formatISO, formatTime, groupCommands, hasEnded, initialTourState, isOutOfRange, isSameDay, isTimeOutOfRange, matchesAccept, monthMatrix, nextSort, pageRange, parseDateInput, parseNumber, parseTime, partitionFiles, rankCommand, resolveTarget, shouldAutoplay, startOfDay, stepBy, timeOptions, timeToMinutes, tourReducer, useFieldWiring, useLabels, useMotionSettings, useTheme, useToast };
2388
+ export { Alert, AutoComplete, Button, Carousel, Checkbox, Checklist, Coachmark, CommandPalette, DEFAULT_LABELS, DatePicker, DialogClose, Drawer, DrawerClose, Dropdown, Field, Image, Input, InputNumber, LabelsProvider, Modal, MotionProvider, Pagination, Popover, RadioGroup, Rate, Reveal, Select, Sidebar, Stagger, Switch, Table, Tabs, Tag, Textarea, ThemeProvider, TimePicker, ToastProvider, Tooltip, TopBar, Tour, Upload, ariaSortFor, canStep, clamp, decimalPlaces, describeAccept, filterCommands, formatISO, formatTime, groupCommands, hasEnded, initialTourState, isOutOfRange, isSameDay, isTimeOutOfRange, matchesAccept, monthMatrix, nextSort, pageRange, parseDateInput, parseNumber, parseTime, partitionFiles, rankCommand, resolveTarget, shouldAutoplay, startOfDay, stepBy, timeOptions, timeToMinutes, tourReducer, useFieldWiring, useLabels, useMotionSettings, useTheme, useToast };