@mieweb/ui 0.7.1-dev.15 → 0.7.1-dev.17

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.
Files changed (86) hide show
  1. package/dist/{chunk-XCVBCY7L.cjs → chunk-26DPQUSB.cjs} +4 -4
  2. package/dist/{chunk-XCVBCY7L.cjs.map → chunk-26DPQUSB.cjs.map} +1 -1
  3. package/dist/{chunk-477Z2DYN.js → chunk-3SRBIXQX.js} +4 -4
  4. package/dist/{chunk-477Z2DYN.js.map → chunk-3SRBIXQX.js.map} +1 -1
  5. package/dist/{chunk-UXBRRSJ6.js → chunk-5BDCQBYW.js} +3 -3
  6. package/dist/{chunk-UXBRRSJ6.js.map → chunk-5BDCQBYW.js.map} +1 -1
  7. package/dist/{chunk-C7I3ZGMQ.cjs → chunk-6J7UGYT5.cjs} +4 -4
  8. package/dist/{chunk-C7I3ZGMQ.cjs.map → chunk-6J7UGYT5.cjs.map} +1 -1
  9. package/dist/{chunk-JJNCQMR5.js → chunk-BMRQ4VME.js} +3 -3
  10. package/dist/{chunk-JJNCQMR5.js.map → chunk-BMRQ4VME.js.map} +1 -1
  11. package/dist/{chunk-QA6ZDHFP.js → chunk-BOOJDRJO.js} +35 -11
  12. package/dist/chunk-BOOJDRJO.js.map +1 -0
  13. package/dist/{chunk-34LGPMO4.js → chunk-DLBV42JD.js} +3 -3
  14. package/dist/{chunk-34LGPMO4.js.map → chunk-DLBV42JD.js.map} +1 -1
  15. package/dist/{chunk-4G3NJLQA.js → chunk-EGWWTIWS.js} +117 -73
  16. package/dist/chunk-EGWWTIWS.js.map +1 -0
  17. package/dist/{chunk-IXWRD4AP.js → chunk-EKRT7K2K.js} +3 -3
  18. package/dist/{chunk-IXWRD4AP.js.map → chunk-EKRT7K2K.js.map} +1 -1
  19. package/dist/{chunk-MHD5HZ4X.js → chunk-FDV7EQWH.js} +3 -3
  20. package/dist/{chunk-MHD5HZ4X.js.map → chunk-FDV7EQWH.js.map} +1 -1
  21. package/dist/{chunk-GDBPFHNX.js → chunk-HIDV32ZX.js} +3 -3
  22. package/dist/{chunk-GDBPFHNX.js.map → chunk-HIDV32ZX.js.map} +1 -1
  23. package/dist/{chunk-ZDEYV373.cjs → chunk-MYFZYUPR.cjs} +35 -11
  24. package/dist/chunk-MYFZYUPR.cjs.map +1 -0
  25. package/dist/{chunk-I2BKK3AQ.js → chunk-NGLI2MSM.js} +3 -3
  26. package/dist/{chunk-I2BKK3AQ.js.map → chunk-NGLI2MSM.js.map} +1 -1
  27. package/dist/{chunk-EDBGSGUK.cjs → chunk-OAHORW4N.cjs} +117 -73
  28. package/dist/chunk-OAHORW4N.cjs.map +1 -0
  29. package/dist/{chunk-IS5PNYR7.js → chunk-P6L74SKG.js} +3 -3
  30. package/dist/{chunk-IS5PNYR7.js.map → chunk-P6L74SKG.js.map} +1 -1
  31. package/dist/{chunk-GKWWFJDB.cjs → chunk-Q5VBO3I5.cjs} +5 -5
  32. package/dist/{chunk-GKWWFJDB.cjs.map → chunk-Q5VBO3I5.cjs.map} +1 -1
  33. package/dist/{chunk-UTCFBBOD.cjs → chunk-QI2SB6U3.cjs} +7 -7
  34. package/dist/{chunk-UTCFBBOD.cjs.map → chunk-QI2SB6U3.cjs.map} +1 -1
  35. package/dist/{chunk-U4HA2WHA.cjs → chunk-RBS3GHDZ.cjs} +4 -4
  36. package/dist/{chunk-U4HA2WHA.cjs.map → chunk-RBS3GHDZ.cjs.map} +1 -1
  37. package/dist/{chunk-YXHX2DAK.cjs → chunk-RYQ3S3KO.cjs} +5 -5
  38. package/dist/{chunk-YXHX2DAK.cjs.map → chunk-RYQ3S3KO.cjs.map} +1 -1
  39. package/dist/{chunk-C2NNNOSU.cjs → chunk-VVI32P7L.cjs} +4 -4
  40. package/dist/{chunk-C2NNNOSU.cjs.map → chunk-VVI32P7L.cjs.map} +1 -1
  41. package/dist/{chunk-BZMBCKW2.cjs → chunk-VWCMOWGH.cjs} +8 -8
  42. package/dist/{chunk-BZMBCKW2.cjs.map → chunk-VWCMOWGH.cjs.map} +1 -1
  43. package/dist/{chunk-OJEXXH5D.cjs → chunk-ZBI52NP2.cjs} +4 -4
  44. package/dist/{chunk-OJEXXH5D.cjs.map → chunk-ZBI52NP2.cjs.map} +1 -1
  45. package/dist/components/Autocomplete/index.cjs +3 -3
  46. package/dist/components/Autocomplete/index.js +2 -2
  47. package/dist/components/CountryCodeDropdown/index.cjs +5 -5
  48. package/dist/components/CountryCodeDropdown/index.js +2 -2
  49. package/dist/components/DateInput/index.cjs +3 -3
  50. package/dist/components/DateInput/index.d.cts +3 -1
  51. package/dist/components/DateInput/index.d.ts +3 -1
  52. package/dist/components/DateInput/index.js +2 -2
  53. package/dist/components/Dropdown/index.cjs +8 -8
  54. package/dist/components/Dropdown/index.d.cts +1 -1
  55. package/dist/components/Dropdown/index.d.ts +1 -1
  56. package/dist/components/Dropdown/index.js +2 -2
  57. package/dist/components/MediaEditor/index.cjs +8 -8
  58. package/dist/components/MediaEditor/index.js +3 -3
  59. package/dist/components/RichTextEditor/index.cjs +6 -6
  60. package/dist/components/RichTextEditor/index.js +3 -3
  61. package/dist/components/Select/index.cjs +4 -4
  62. package/dist/components/Select/index.js +2 -2
  63. package/dist/components/SuperChat/index.cjs +8 -8
  64. package/dist/components/SuperChat/index.js +3 -3
  65. package/dist/components/SuperChat/plugins/index.cjs +4 -4
  66. package/dist/components/SuperChat/plugins/index.js +3 -3
  67. package/dist/esheet.cjs +7 -7
  68. package/dist/esheet.js +4 -4
  69. package/dist/hooks/index.cjs +2 -2
  70. package/dist/hooks/index.d.cts +1 -1
  71. package/dist/hooks/index.d.ts +1 -1
  72. package/dist/hooks/index.js +1 -1
  73. package/dist/index.cjs +802 -161
  74. package/dist/index.cjs.map +1 -1
  75. package/dist/index.d.cts +53 -4
  76. package/dist/index.d.ts +53 -4
  77. package/dist/index.js +664 -24
  78. package/dist/index.js.map +1 -1
  79. package/dist/styles.css +1 -1
  80. package/dist/{useAnchoredPosition-nXdSFKHf.d.cts → useAnchoredPosition-C7PNglzD.d.cts} +6 -2
  81. package/dist/{useAnchoredPosition-nXdSFKHf.d.ts → useAnchoredPosition-C7PNglzD.d.ts} +6 -2
  82. package/package.json +1 -1
  83. package/dist/chunk-4G3NJLQA.js.map +0 -1
  84. package/dist/chunk-EDBGSGUK.cjs.map +0 -1
  85. package/dist/chunk-QA6ZDHFP.js.map +0 -1
  86. package/dist/chunk-ZDEYV373.cjs.map +0 -1
package/dist/index.js CHANGED
@@ -28,17 +28,17 @@ import { Spinner, SpinnerWithLabel } from './chunk-UA7E7PDS.js';
28
28
  export { FullPageSpinner, Spinner, SpinnerWithLabel, spinnerVariants } from './chunk-UA7E7PDS.js';
29
29
  import { SparklesIcon, RefreshIcon, CloseIcon, AIMessageDisplay } from './chunk-RZJXCI53.js';
30
30
  export { AILogoIcon, AIMessageDisplay, AITypingIndicator, ChatBubble, ChevronIcon, CloseIcon, CollapsiblePill, MCPToolCallDisplay, MessageAvatar, RefreshIcon, ResourceLink, SendIcon, SparklesIcon, SpinnerIcon, ToolStatusIcon, getToolIcon } from './chunk-RZJXCI53.js';
31
- import { EmptyState } from './chunk-MHD5HZ4X.js';
32
- export { AttachmentPreview, ConversationHeader, ConversationListItem, ConversationListSkeleton, DateSeparator, EmptyState, LightboxModal, LoadMoreButton, MessageBubble, MessageList, MessageStatusIcon, MessageThread, MessagingSplitView, ReadReceiptIndicator, SkeletonMessage, TypingIndicator, bubbleVariants, formatDateLabel, formatFileSize, formatLastSeen, getConversationSubtitle, getConversationTitle, groupMessagesByDate, headerVariants, isSameSenderGroup, useMessageScroll, useMessages, useReadReceipts, useTypingIndicator } from './chunk-MHD5HZ4X.js';
33
- import { MessageComposer } from './chunk-IXWRD4AP.js';
34
- export { AttachmentPicker, AttachmentPreviewItem, CameraButton, CharacterCounter, DragDropZone, MessageComposer, SendButton, generateAttachmentId, getFileType, sendButtonVariants, validateFile } from './chunk-IXWRD4AP.js';
31
+ import { EmptyState } from './chunk-FDV7EQWH.js';
32
+ export { AttachmentPreview, ConversationHeader, ConversationListItem, ConversationListSkeleton, DateSeparator, EmptyState, LightboxModal, LoadMoreButton, MessageBubble, MessageList, MessageStatusIcon, MessageThread, MessagingSplitView, ReadReceiptIndicator, SkeletonMessage, TypingIndicator, bubbleVariants, formatDateLabel, formatFileSize, formatLastSeen, getConversationSubtitle, getConversationTitle, groupMessagesByDate, headerVariants, isSameSenderGroup, useMessageScroll, useMessages, useReadReceipts, useTypingIndicator } from './chunk-FDV7EQWH.js';
33
+ import { MessageComposer } from './chunk-EKRT7K2K.js';
34
+ export { AttachmentPicker, AttachmentPreviewItem, CameraButton, CharacterCounter, DragDropZone, MessageComposer, SendButton, generateAttachmentId, getFileType, sendButtonVariants, validateFile } from './chunk-EKRT7K2K.js';
35
35
  export { PhoneInput, PhoneInputGroup } from './chunk-3D4ITDLO.js';
36
36
  import { Progress } from './chunk-CEQJGUAS.js';
37
37
  export { CircularProgress, Progress, circularProgressVariants, progressBarFillVariants, progressBarTrackVariants } from './chunk-CEQJGUAS.js';
38
38
  export { QuickAction, QuickActionGroup, QuickActionIcons, quickActionIconVariants, quickActionVariants } from './chunk-5U6GETAW.js';
39
39
  import { RecordButton } from './chunk-VNWJTCBQ.js';
40
40
  export { RecordButton, formatDuration, recordButtonVariants } from './chunk-VNWJTCBQ.js';
41
- export { RichTextEditor, convertAngleBracketsToMustache, processDictation } from './chunk-UXBRRSJ6.js';
41
+ export { RichTextEditor, convertAngleBracketsToMustache, processDictation } from './chunk-5BDCQBYW.js';
42
42
  export { Separator, separatorVariants } from './chunk-OQWZYKJM.js';
43
43
  export { DateButton, DatePicker, RadioOption, SchedulePicker, TimeButton, TimePicker, dateButtonVariants, radioOptionVariants, timeButtonVariants } from './chunk-23AYDOCH.js';
44
44
  export { ScrollArea, scrollAreaVariants } from './chunk-HS25RPDW.js';
@@ -49,7 +49,7 @@ export { HtmlPreviewBlock } from './chunk-MWPPOX6F.js';
49
49
  export { MermaidBlock } from './chunk-NU6QKULE.js';
50
50
  export { SurveyBlock } from './chunk-VE6OUO7X.js';
51
51
  export { FenceBlock } from './chunk-RZFSJD67.js';
52
- export { FillerWordsModal, MediaEditor, SilenceSettingsModal, SpeedMarkerMenu, WordEditorModal } from './chunk-I2BKK3AQ.js';
52
+ export { FillerWordsModal, MediaEditor, SilenceSettingsModal, SpeedMarkerMenu, WordEditorModal } from './chunk-NGLI2MSM.js';
53
53
  export { Slider, sliderRangeVariants, sliderThumbVariants, sliderTrackVariants } from './chunk-OTQ72WX3.js';
54
54
  import './chunk-RISZWWEQ.js';
55
55
  export { MediaPlayer, inferMediaKind, mediaPlayerVariants } from './chunk-PS5INHGC.js';
@@ -59,24 +59,24 @@ import { Checkbox } from './chunk-KFLDXJEE.js';
59
59
  export { Checkbox, CheckboxGroup, checkboxVariants } from './chunk-KFLDXJEE.js';
60
60
  export { CollabStatus, defaultCollabStatusLabels, useYjsCollabStatus } from './chunk-SVSHA7XV.js';
61
61
  export { Collapsible, CollapsibleContent, CollapsibleTrigger } from './chunk-BJKAVWED.js';
62
- export { CountryCodeDropdown, formatE164, validatePhoneNumber } from './chunk-JJNCQMR5.js';
63
- import { Dropdown, DropdownItem, DropdownSeparator, DropdownHeader } from './chunk-GDBPFHNX.js';
64
- export { Dropdown, DropdownContent, DropdownHeader, DropdownItem, DropdownLabel, DropdownSeparator } from './chunk-GDBPFHNX.js';
62
+ export { CountryCodeDropdown, formatE164, validatePhoneNumber } from './chunk-BMRQ4VME.js';
63
+ import { Dropdown, DropdownItem, DropdownSeparator, DropdownHeader } from './chunk-HIDV32ZX.js';
64
+ export { Dropdown, DropdownContent, DropdownHeader, DropdownItem, DropdownLabel, DropdownSeparator } from './chunk-HIDV32ZX.js';
65
65
  import { Alert, AlertTitle, AlertDescription } from './chunk-6EWJGRC3.js';
66
66
  export { Alert, AlertDescription, AlertTitle, alertVariants } from './chunk-6EWJGRC3.js';
67
67
  import { AlertDialog } from './chunk-H3HF36ZL.js';
68
68
  export { AlertDialog } from './chunk-H3HF36ZL.js';
69
69
  export { AudioPlayer, ProgressBar, audioPlayerVariants, formatTime as formatAudioTime, playButtonVariants } from './chunk-XO3WLK65.js';
70
70
  export { AudioRecorder, audioRecorderVariants, controlButtonVariants, formatTime, waveformContainerVariants } from './chunk-2DW4PUJD.js';
71
- export { Autocomplete } from './chunk-IS5PNYR7.js';
71
+ export { Autocomplete } from './chunk-P6L74SKG.js';
72
72
  import { Avatar } from './chunk-DCBMTFLE.js';
73
73
  export { Avatar, AvatarGroup, avatarVariants, getInitials } from './chunk-DCBMTFLE.js';
74
74
  import './chunk-IQ4KQJAO.js';
75
75
  export { Breadcrumb, BreadcrumbSlash } from './chunk-5Y5FSR4N.js';
76
76
  import { evaluateDue, completedKeys, normalizeOrders } from './chunk-Y5KEFV5O.js';
77
77
  export { buildChartOrderRows, buildEncounterOrderRows, dueForOrder, evaluateDue, evaluateProgram, isApplicable } from './chunk-Y5KEFV5O.js';
78
- import { useCodeLookupConfig, RowActionToolbar, RowIconButton, toolbarKeyNav, parseSig, labelToMedicationFields, MedicationEditor } from './chunk-477Z2DYN.js';
79
- export { ALLERGY_TYPE_LABELS, AllergyList, AllergyManager, CodeLookupProvider, MEDICATION_STATUS_LABELS, MedicationEditor, MedicationList, MedicationReconciliation, RowActionToolbar, RowIconButton, labelToMedicationFields, lookupToMedicationFields, parseMedicationLabel, parseSig, toolbarKeyNav, useCodeLookupConfig } from './chunk-477Z2DYN.js';
78
+ import { useCodeLookupConfig, RowActionToolbar, RowIconButton, toolbarKeyNav, parseSig, labelToMedicationFields, MedicationEditor } from './chunk-3SRBIXQX.js';
79
+ export { ALLERGY_TYPE_LABELS, AllergyList, AllergyManager, CodeLookupProvider, MEDICATION_STATUS_LABELS, MedicationEditor, MedicationList, MedicationReconciliation, RowActionToolbar, RowIconButton, labelToMedicationFields, lookupToMedicationFields, parseMedicationLabel, parseSig, toolbarKeyNav, useCodeLookupConfig } from './chunk-3SRBIXQX.js';
80
80
  import { Textarea } from './chunk-AFGADE3B.js';
81
81
  export { Textarea, textareaVariants } from './chunk-AFGADE3B.js';
82
82
  import { Tooltip } from './chunk-FJ7YPVKV.js';
@@ -85,12 +85,12 @@ import { RadioGroup, Radio } from './chunk-QUUBTNMH.js';
85
85
  export { Radio, RadioGroup, radioVariants } from './chunk-QUUBTNMH.js';
86
86
  import { Label } from './chunk-I3WGZPI6.js';
87
87
  export { Label, labelVariants } from './chunk-I3WGZPI6.js';
88
- import { Select } from './chunk-34LGPMO4.js';
89
- export { Select, selectTriggerVariants } from './chunk-34LGPMO4.js';
88
+ import { Select } from './chunk-DLBV42JD.js';
89
+ export { Select, selectTriggerVariants } from './chunk-DLBV42JD.js';
90
90
  import { Card, CardHeader, CardContent, CardTitle } from './chunk-QYSUYB3S.js';
91
91
  export { Card, CardActions, CardBadge, CardCollapsible, CardContent, CardDescription, CardDivider, CardFooter, CardHeader, CardMedia, CardStat, CardTitle, cardAccentVariants, cardVariants } from './chunk-QYSUYB3S.js';
92
- import { DateInput } from './chunk-4G3NJLQA.js';
93
- export { DateInput } from './chunk-4G3NJLQA.js';
92
+ import { DateInput } from './chunk-EGWWTIWS.js';
93
+ export { DateInput } from './chunk-EGWWTIWS.js';
94
94
  import { Modal, ModalHeader, ModalTitle, ModalClose, ModalBody, ModalFooter } from './chunk-XMCIXHGH.js';
95
95
  export { Modal, ModalBody, ModalClose, ModalFooter, ModalHeader, ModalTitle, modalContentVariants, modalOverlayVariants } from './chunk-XMCIXHGH.js';
96
96
  import { Input, inputVariants } from './chunk-YXCE2HSK.js';
@@ -116,8 +116,8 @@ import { useEscapeKey } from './chunk-T4ME7QCT.js';
116
116
  export { useEscapeKey } from './chunk-T4ME7QCT.js';
117
117
  import { useClickOutside } from './chunk-62ZOA6PX.js';
118
118
  export { useClickOutside } from './chunk-62ZOA6PX.js';
119
- import { useAnchoredPosition } from './chunk-QA6ZDHFP.js';
120
- export { useAnchoredPosition } from './chunk-QA6ZDHFP.js';
119
+ import { useAnchoredPosition } from './chunk-BOOJDRJO.js';
120
+ export { useAnchoredPosition } from './chunk-BOOJDRJO.js';
121
121
  import './chunk-7XUN3OQT.js';
122
122
  export { formatPhoneNumber, isPhoneNumberEmpty, isValidPhoneNumber, unformatPhoneNumber } from './chunk-ZVPJ2MH6.js';
123
123
  export { isHtmlEmpty, stripHtmlTags } from './chunk-ERLPVXOV.js';
@@ -134,7 +134,7 @@ import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
134
134
  import { cva } from 'class-variance-authority';
135
135
  import * as ReactDOM from 'react-dom';
136
136
  import { createPortal } from 'react-dom';
137
- import { FileUp, X, AlertCircle as AlertCircle$1, Calendar as Calendar$1, ChevronLeft, ChevronRight as ChevronRight$1, ChevronDown as ChevronDown$1, FolderUp, Upload, Edit2, Check, ChevronUp as ChevronUp$1, Phone as Phone$1, Mail as Mail$1, Clock as Clock$1, MapPin, Shield, Building2, SlidersHorizontal, Trash2 as Trash2$1, Pencil as Pencil$1, Plus as Plus$1, Link as Link$1, AlertTriangle as AlertTriangle$1, RefreshCw as RefreshCw$1 } from 'lucide-react';
137
+ import { FileUp, X, AlertCircle as AlertCircle$1, ChevronUp as ChevronUp$1, Check, Calendar as Calendar$1, ChevronLeft, ChevronRight as ChevronRight$1, ChevronDown as ChevronDown$1, FolderUp, Upload, Edit2, Phone as Phone$1, Mail as Mail$1, Clock as Clock$1, MapPin, Shield, Building2, SlidersHorizontal, Trash2 as Trash2$1, Pencil as Pencil$1, Plus as Plus$1, Link as Link$1, AlertTriangle as AlertTriangle$1, RefreshCw as RefreshCw$1 } from 'lucide-react';
138
138
 
139
139
  var SEX_OPTIONS = [
140
140
  { value: "F", label: "Female" },
@@ -5580,6 +5580,329 @@ function VisitScribe({
5580
5580
  }
5581
5581
  );
5582
5582
  }
5583
+ var MENU_OFFSET_PX = 6;
5584
+ var MENU_MAX_HEIGHT_PX = 320;
5585
+ function optionKey(option) {
5586
+ return `${option.provider}\0${option.model}`;
5587
+ }
5588
+ function renderedOptionKey(option, index) {
5589
+ return `${option.id ?? optionKey(option)}\0${index}`;
5590
+ }
5591
+ function groupByProvider(models) {
5592
+ const groups = /* @__PURE__ */ new Map();
5593
+ for (const model of models) {
5594
+ const group = groups.get(model.provider);
5595
+ if (group) {
5596
+ group.push(model);
5597
+ } else {
5598
+ groups.set(model.provider, [model]);
5599
+ }
5600
+ }
5601
+ return Array.from(groups, ([provider, options]) => ({ provider, options }));
5602
+ }
5603
+ function getProviderLabel(models, provider) {
5604
+ return models.find((model) => model.provider === provider && model.providerLabel)?.providerLabel ?? provider;
5605
+ }
5606
+ function ComposerModelSelector({
5607
+ models,
5608
+ value,
5609
+ providerFilter,
5610
+ onProviderFilterChange,
5611
+ onChange,
5612
+ disabled = false,
5613
+ className,
5614
+ boundaryRef,
5615
+ placeholder = "Model",
5616
+ anyLabel = "Any",
5617
+ emptyLabel = "No models",
5618
+ ariaLabel = "Model"
5619
+ }) {
5620
+ const [open, setOpen] = React10.useState(false);
5621
+ const [internalProviderFilter, setInternalProviderFilter] = React10.useState(null);
5622
+ const [highlightedIndex, setHighlightedIndex] = React10.useState(0);
5623
+ const listRef = React10.useRef(null);
5624
+ const menuId = React10.useId();
5625
+ const {
5626
+ anchorRef: triggerRef,
5627
+ floatingRef: menuRef,
5628
+ style: menuStyle
5629
+ } = useAnchoredPosition({
5630
+ open,
5631
+ placement: "top-start",
5632
+ offset: MENU_OFFSET_PX,
5633
+ matchMinWidth: true,
5634
+ maxHeight: MENU_MAX_HEIGHT_PX,
5635
+ allowFlip: false,
5636
+ boundaryRef
5637
+ });
5638
+ const activeProviderFilter = providerFilter === void 0 ? internalProviderFilter : providerFilter;
5639
+ const selectedKey = value ? optionKey(value) : null;
5640
+ const selectedOption = models.find(
5641
+ (model) => optionKey(model) === selectedKey
5642
+ );
5643
+ const providers = React10.useMemo(
5644
+ () => Array.from(new Set(models.map((model) => model.provider))),
5645
+ [models]
5646
+ );
5647
+ const providerLabels = React10.useMemo(
5648
+ () => new Map(
5649
+ providers.map((provider) => [
5650
+ provider,
5651
+ getProviderLabel(models, provider)
5652
+ ])
5653
+ ),
5654
+ [models, providers]
5655
+ );
5656
+ const filteredModels = React10.useMemo(
5657
+ () => activeProviderFilter === null ? models : models.filter((model) => model.provider === activeProviderFilter),
5658
+ [activeProviderFilter, models]
5659
+ );
5660
+ const groupedModels = React10.useMemo(
5661
+ () => groupByProvider(filteredModels),
5662
+ [filteredModels]
5663
+ );
5664
+ const groupedRenderedModels = React10.useMemo(() => {
5665
+ let index = 0;
5666
+ return groupedModels.map((group) => ({
5667
+ provider: group.provider,
5668
+ options: group.options.map((option) => {
5669
+ const rendered = {
5670
+ option,
5671
+ index,
5672
+ key: renderedOptionKey(option, index)
5673
+ };
5674
+ index += 1;
5675
+ return rendered;
5676
+ })
5677
+ }));
5678
+ }, [groupedModels]);
5679
+ const renderedModels = React10.useMemo(
5680
+ () => groupedRenderedModels.flatMap((group) => group.options),
5681
+ [groupedRenderedModels]
5682
+ );
5683
+ const getOptionId = React10.useCallback(
5684
+ (index) => `${menuId}-option-${index}`,
5685
+ [menuId]
5686
+ );
5687
+ const activeOptionId = open && renderedModels[highlightedIndex] ? getOptionId(highlightedIndex) : void 0;
5688
+ const selectedRenderedIndex = React10.useMemo(
5689
+ () => selectedKey ? renderedModels.findIndex(
5690
+ (renderedModel) => optionKey(renderedModel.option) === selectedKey
5691
+ ) : -1,
5692
+ [renderedModels, selectedKey]
5693
+ );
5694
+ const setProvider = React10.useCallback(
5695
+ (provider) => {
5696
+ if (providerFilter === void 0) {
5697
+ setInternalProviderFilter(provider);
5698
+ }
5699
+ onProviderFilterChange?.(provider);
5700
+ },
5701
+ [onProviderFilterChange, providerFilter]
5702
+ );
5703
+ const close = React10.useCallback(
5704
+ (restoreFocus = true) => {
5705
+ setOpen(false);
5706
+ if (restoreFocus) {
5707
+ triggerRef.current?.focus({ preventScroll: true });
5708
+ }
5709
+ },
5710
+ [triggerRef]
5711
+ );
5712
+ const selectModel = React10.useCallback(
5713
+ (model) => {
5714
+ onChange({ provider: model.provider, model: model.model });
5715
+ close();
5716
+ },
5717
+ [close, onChange]
5718
+ );
5719
+ const outsideRefs = React10.useMemo(
5720
+ () => [triggerRef, menuRef],
5721
+ [triggerRef, menuRef]
5722
+ );
5723
+ useClickOutside(outsideRefs, () => close(false), open);
5724
+ useEscapeKey(close, open);
5725
+ React10.useEffect(() => {
5726
+ if (!open) return;
5727
+ setHighlightedIndex(selectedRenderedIndex >= 0 ? selectedRenderedIndex : 0);
5728
+ }, [activeProviderFilter, open, selectedRenderedIndex]);
5729
+ React10.useEffect(() => {
5730
+ if (!open) return;
5731
+ setHighlightedIndex(
5732
+ (current) => Math.min(current, Math.max(renderedModels.length - 1, 0))
5733
+ );
5734
+ }, [open, renderedModels.length]);
5735
+ React10.useEffect(() => {
5736
+ if (!open) return;
5737
+ requestAnimationFrame(
5738
+ () => listRef.current?.focus({ preventScroll: true })
5739
+ );
5740
+ }, [open]);
5741
+ const handleTriggerKeyDown = (event) => {
5742
+ if (event.key === "ArrowDown" || event.key === "ArrowUp") {
5743
+ event.preventDefault();
5744
+ setOpen(true);
5745
+ }
5746
+ };
5747
+ const handleMenuKeyDown = (event) => {
5748
+ if (renderedModels.length === 0) return;
5749
+ if (event.key === "ArrowDown") {
5750
+ event.preventDefault();
5751
+ setHighlightedIndex((current) => (current + 1) % renderedModels.length);
5752
+ }
5753
+ if (event.key === "ArrowUp") {
5754
+ event.preventDefault();
5755
+ setHighlightedIndex(
5756
+ (current) => (current - 1 + renderedModels.length) % renderedModels.length
5757
+ );
5758
+ }
5759
+ if (event.key === "Home") {
5760
+ event.preventDefault();
5761
+ setHighlightedIndex(0);
5762
+ }
5763
+ if (event.key === "End") {
5764
+ event.preventDefault();
5765
+ setHighlightedIndex(renderedModels.length - 1);
5766
+ }
5767
+ if (event.key === "Enter" || event.key === " ") {
5768
+ event.preventDefault();
5769
+ const highlightedModel = renderedModels[highlightedIndex]?.option;
5770
+ if (highlightedModel) {
5771
+ selectModel(highlightedModel);
5772
+ }
5773
+ }
5774
+ };
5775
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
5776
+ /* @__PURE__ */ jsxs(
5777
+ "button",
5778
+ {
5779
+ ref: triggerRef,
5780
+ type: "button",
5781
+ disabled,
5782
+ "aria-haspopup": "listbox",
5783
+ "aria-expanded": open,
5784
+ "aria-controls": open ? menuId : void 0,
5785
+ onClick: () => setOpen((current) => !current),
5786
+ onKeyDown: handleTriggerKeyDown,
5787
+ "data-slot": "composer-model-selector-trigger",
5788
+ className: cn(
5789
+ "inline-flex h-8 max-w-full items-center gap-1.5 rounded-full border px-2.5 text-sm font-medium",
5790
+ "border-border bg-background text-foreground shadow-sm",
5791
+ "hover:bg-muted/50",
5792
+ "focus-visible:ring-ring focus-visible:ring-2 focus-visible:outline-none",
5793
+ "disabled:cursor-not-allowed disabled:opacity-50",
5794
+ className
5795
+ ),
5796
+ children: [
5797
+ /* @__PURE__ */ jsx("span", { className: "min-w-0 truncate", children: selectedOption?.label ?? selectedOption?.model ?? placeholder }),
5798
+ /* @__PURE__ */ jsx(ChevronUp$1, { "aria-hidden": "true", className: "h-3.5 w-3.5 shrink-0" })
5799
+ ]
5800
+ }
5801
+ ),
5802
+ open && createPortal(
5803
+ /* @__PURE__ */ jsxs(
5804
+ "div",
5805
+ {
5806
+ ref: menuRef,
5807
+ style: menuStyle,
5808
+ "data-slot": "composer-model-selector-menu",
5809
+ className: cn(
5810
+ "border-border bg-card text-card-foreground flex w-80 max-w-full flex-col rounded-lg border shadow-lg",
5811
+ "animate-in fade-in overflow-hidden duration-100"
5812
+ ),
5813
+ children: [
5814
+ /* @__PURE__ */ jsx(
5815
+ "div",
5816
+ {
5817
+ "data-slot": "composer-model-selector-provider-filter",
5818
+ className: "border-border flex min-h-9 items-center gap-1 overflow-x-auto overflow-y-hidden border-b p-2",
5819
+ children: [null, ...providers].map((provider) => {
5820
+ const selected = activeProviderFilter === provider;
5821
+ return /* @__PURE__ */ jsx(
5822
+ "button",
5823
+ {
5824
+ type: "button",
5825
+ "aria-pressed": selected,
5826
+ onMouseDown: (event) => event.preventDefault(),
5827
+ onClick: () => setProvider(provider),
5828
+ className: cn(
5829
+ "inline-flex h-6 shrink-0 items-center justify-center rounded-full px-2.5 text-xs font-medium whitespace-nowrap transition-colors",
5830
+ "focus-visible:ring-ring focus-visible:ring-2 focus-visible:outline-none",
5831
+ selected ? "bg-primary text-primary-foreground" : "text-muted-foreground hover:bg-muted hover:text-foreground"
5832
+ ),
5833
+ children: provider === null ? anyLabel : providerLabels.get(provider) ?? provider
5834
+ },
5835
+ provider ?? "all-providers"
5836
+ );
5837
+ })
5838
+ }
5839
+ ),
5840
+ /* @__PURE__ */ jsx(
5841
+ "div",
5842
+ {
5843
+ ref: listRef,
5844
+ id: menuId,
5845
+ role: "listbox",
5846
+ "aria-label": ariaLabel,
5847
+ "aria-activedescendant": activeOptionId,
5848
+ tabIndex: -1,
5849
+ onKeyDown: handleMenuKeyDown,
5850
+ className: "min-h-0 flex-1 overflow-y-auto p-1",
5851
+ children: groupedModels.length === 0 ? /* @__PURE__ */ jsx("div", { className: "text-muted-foreground px-3 py-4 text-center text-sm", children: emptyLabel }) : groupedRenderedModels.map((group) => /* @__PURE__ */ jsxs(
5852
+ "div",
5853
+ {
5854
+ role: "group",
5855
+ "aria-label": providerLabels.get(group.provider) ?? group.provider,
5856
+ children: [
5857
+ /* @__PURE__ */ jsx("div", { className: "text-muted-foreground px-3 py-1.5 text-xs font-semibold uppercase", children: providerLabels.get(group.provider) ?? group.provider }),
5858
+ group.options.map((renderedModel) => {
5859
+ const { index, key, option: model } = renderedModel;
5860
+ const selected = optionKey(model) === selectedKey;
5861
+ const highlighted = index === highlightedIndex;
5862
+ return /* @__PURE__ */ jsxs(
5863
+ "button",
5864
+ {
5865
+ id: getOptionId(index),
5866
+ type: "button",
5867
+ role: "option",
5868
+ "aria-selected": selected,
5869
+ onMouseDown: (event) => event.preventDefault(),
5870
+ onClick: () => selectModel(model),
5871
+ onMouseEnter: () => setHighlightedIndex(index),
5872
+ className: cn(
5873
+ "flex w-full items-center gap-2 rounded-md px-3 py-2 text-start text-sm",
5874
+ "focus-visible:ring-ring transition-colors focus-visible:ring-2 focus-visible:outline-none",
5875
+ highlighted && "bg-muted",
5876
+ selected && "bg-primary/10 text-primary"
5877
+ ),
5878
+ children: [
5879
+ /* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1 truncate", children: model.label ?? model.model }),
5880
+ selected && /* @__PURE__ */ jsx(
5881
+ Check,
5882
+ {
5883
+ "aria-hidden": "true",
5884
+ className: "text-primary h-4 w-4 shrink-0"
5885
+ }
5886
+ )
5887
+ ]
5888
+ },
5889
+ key
5890
+ );
5891
+ })
5892
+ ]
5893
+ },
5894
+ group.provider
5895
+ ))
5896
+ }
5897
+ )
5898
+ ]
5899
+ }
5900
+ ),
5901
+ document.body
5902
+ )
5903
+ ] });
5904
+ }
5905
+ ComposerModelSelector.displayName = "ComposerModelSelector";
5583
5906
  function normalizeString(value) {
5584
5907
  return value.trim().replace(/\s+/g, " ").toLowerCase();
5585
5908
  }
@@ -9690,6 +10013,50 @@ function LoadingSpinner({ className }) {
9690
10013
  }
9691
10014
  );
9692
10015
  }
10016
+
10017
+ // src/components/BusinessHoursEditor/scheduleRules.ts
10018
+ function generateId2() {
10019
+ return Math.random().toString(36).substring(2, 9);
10020
+ }
10021
+ function ruleSignature(slot) {
10022
+ return `${slot.start}\0${slot.end}\0${slot.description ?? ""}`;
10023
+ }
10024
+ function scheduleToRules(schedule) {
10025
+ const rulesBySignature = /* @__PURE__ */ new Map();
10026
+ const orderedRules = [];
10027
+ for (const day of schedule) {
10028
+ for (const slot of day.hours) {
10029
+ const signature = ruleSignature(slot);
10030
+ const candidates = rulesBySignature.get(signature) ?? [];
10031
+ let rule = candidates.find((r) => !r.days.includes(day.day));
10032
+ if (!rule) {
10033
+ rule = {
10034
+ id: `rule-${orderedRules.length}`,
10035
+ days: [],
10036
+ start: slot.start,
10037
+ end: slot.end,
10038
+ description: slot.description
10039
+ };
10040
+ candidates.push(rule);
10041
+ rulesBySignature.set(signature, candidates);
10042
+ orderedRules.push(rule);
10043
+ }
10044
+ rule.days.push(day.day);
10045
+ }
10046
+ }
10047
+ return orderedRules;
10048
+ }
10049
+ function rulesToSchedule(rules) {
10050
+ return Array.from({ length: 7 }, (_, day) => ({
10051
+ day,
10052
+ hours: rules.filter((rule) => rule.days.includes(day)).map((rule, index) => ({
10053
+ id: `slot-${day}-${index}`,
10054
+ start: rule.start,
10055
+ end: rule.end,
10056
+ ...rule.description ? { description: rule.description } : {}
10057
+ }))
10058
+ }));
10059
+ }
9693
10060
  var DAY_NAMES = {
9694
10061
  0: "Sunday",
9695
10062
  1: "Monday",
@@ -9957,6 +10324,63 @@ function DayScheduleRow({
9957
10324
  }
9958
10325
  );
9959
10326
  }
10327
+ function GroupedScheduleRows({
10328
+ officeHours,
10329
+ useShortDayNames = false,
10330
+ use24Hour = false
10331
+ }) {
10332
+ const normalized = officeHours.map((dayHours) => ({
10333
+ day: parseDayToNumber(dayHours.day),
10334
+ hours: (dayHours.hours ?? []).map((range) => ({
10335
+ start: range.start ?? "",
10336
+ end: range.end ?? "",
10337
+ ...range.description ? { description: range.description } : {}
10338
+ }))
10339
+ }));
10340
+ const rules = scheduleToRules(normalized);
10341
+ const closedDays = normalized.filter((dayHours) => dayHours.hours.length === 0).map((dayHours) => dayHours.day);
10342
+ const dayNames = useShortDayNames ? DAY_NAMES_SHORT : DAY_NAMES;
10343
+ const formatDays = (days) => days.map((day) => dayNames[day]).join(", ");
10344
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
10345
+ rules.map((rule) => /* @__PURE__ */ jsxs(
10346
+ "div",
10347
+ {
10348
+ "data-slot": "business-hours-grouped-row",
10349
+ className: cn(dayRowVariants({ isToday: false })),
10350
+ children: [
10351
+ /* @__PURE__ */ jsx(
10352
+ "span",
10353
+ {
10354
+ "data-slot": "business-hours-day-name",
10355
+ className: "min-w-[80px] font-medium",
10356
+ children: formatDays(rule.days)
10357
+ }
10358
+ ),
10359
+ /* @__PURE__ */ jsx("div", { "data-slot": "business-hours-day-hours", className: "text-end", children: /* @__PURE__ */ jsx(TimeRangeDisplay, { range: rule, use24Hour }) })
10360
+ ]
10361
+ },
10362
+ rule.id
10363
+ )),
10364
+ closedDays.length > 0 && /* @__PURE__ */ jsxs(
10365
+ "div",
10366
+ {
10367
+ "data-slot": "business-hours-grouped-row",
10368
+ className: cn(dayRowVariants({ isToday: false })),
10369
+ children: [
10370
+ /* @__PURE__ */ jsx(
10371
+ "span",
10372
+ {
10373
+ "data-slot": "business-hours-day-name",
10374
+ className: "min-w-[80px] font-medium",
10375
+ children: formatDays(closedDays)
10376
+ }
10377
+ ),
10378
+ /* @__PURE__ */ jsx("div", { "data-slot": "business-hours-day-hours", className: "text-end", children: /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: "Closed" }) })
10379
+ ]
10380
+ }
10381
+ )
10382
+ ] });
10383
+ }
9960
10384
  function BusinessHours({
9961
10385
  schedule,
9962
10386
  variant = "default",
@@ -9965,6 +10389,7 @@ function BusinessHours({
9965
10389
  highlightToday = true,
9966
10390
  useShortDayNames = false,
9967
10391
  use24Hour = false,
10392
+ groupDays = false,
9968
10393
  showHeader = true,
9969
10394
  headerText = "Hours",
9970
10395
  className
@@ -10100,7 +10525,14 @@ function BusinessHours({
10100
10525
  {
10101
10526
  "data-slot": "business-hours-schedule",
10102
10527
  className: "space-y-1 divide-y divide-neutral-100 dark:divide-neutral-800",
10103
- children: schedule.officeHours.map((dayHours, idx) => /* @__PURE__ */ jsx(
10528
+ children: groupDays ? /* @__PURE__ */ jsx(
10529
+ GroupedScheduleRows,
10530
+ {
10531
+ officeHours: schedule.officeHours,
10532
+ useShortDayNames,
10533
+ use24Hour
10534
+ }
10535
+ ) : schedule.officeHours.map((dayHours, idx) => /* @__PURE__ */ jsx(
10104
10536
  DayScheduleRow,
10105
10537
  {
10106
10538
  dayHours,
@@ -10237,9 +10669,6 @@ var DAY_NAMES2 = [
10237
10669
  "Saturday"
10238
10670
  ];
10239
10671
  var DAY_NAMES_SHORT2 = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
10240
- function generateId2() {
10241
- return Math.random().toString(36).substring(2, 9);
10242
- }
10243
10672
  function getOrderedDays(weekStartsOn) {
10244
10673
  if (weekStartsOn === 1) {
10245
10674
  return [1, 2, 3, 4, 5, 6, 0];
@@ -10255,6 +10684,15 @@ function ensureAllDays(schedule) {
10255
10684
  return result;
10256
10685
  }
10257
10686
  function BusinessHoursEditor({
10687
+ variant = "days",
10688
+ ...props
10689
+ }) {
10690
+ if (variant === "rules") {
10691
+ return /* @__PURE__ */ jsx(BusinessHoursRulesEditor, { ...props });
10692
+ }
10693
+ return /* @__PURE__ */ jsx(BusinessHoursDaysEditor, { ...props });
10694
+ }
10695
+ function BusinessHoursDaysEditor({
10258
10696
  value,
10259
10697
  onChange,
10260
10698
  disabled = false,
@@ -10524,6 +10962,208 @@ function BusinessHoursEditor({
10524
10962
  }
10525
10963
  );
10526
10964
  }
10965
+ function normalizeSchedule(schedule) {
10966
+ return JSON.stringify(
10967
+ ensureAllDays(schedule).map((day) => ({
10968
+ day: day.day,
10969
+ hours: day.hours.map((slot) => ({
10970
+ start: slot.start,
10971
+ end: slot.end,
10972
+ description: slot.description ?? ""
10973
+ }))
10974
+ }))
10975
+ );
10976
+ }
10977
+ function BusinessHoursRulesEditor({
10978
+ value,
10979
+ onChange,
10980
+ disabled = false,
10981
+ showDescription = true,
10982
+ use24Hour = false,
10983
+ weekStartsOn = 0,
10984
+ className,
10985
+ addHoursLabel = "Add Hours"
10986
+ }) {
10987
+ const [rules, setRules] = React10.useState(
10988
+ () => scheduleToRules(value)
10989
+ );
10990
+ const timeFormat = use24Hour ? "24-hour" : "12-hour";
10991
+ const lastScheduleRef = React10.useRef(normalizeSchedule(value));
10992
+ React10.useEffect(() => {
10993
+ const incoming = normalizeSchedule(value);
10994
+ if (incoming !== lastScheduleRef.current) {
10995
+ lastScheduleRef.current = incoming;
10996
+ setRules(scheduleToRules(value));
10997
+ }
10998
+ }, [value]);
10999
+ const emit = useCallback(
11000
+ (nextRules) => {
11001
+ setRules(nextRules);
11002
+ const schedule = rulesToSchedule(nextRules);
11003
+ const normalized = normalizeSchedule(schedule);
11004
+ if (normalized !== lastScheduleRef.current) {
11005
+ lastScheduleRef.current = normalized;
11006
+ onChange(schedule);
11007
+ }
11008
+ },
11009
+ [onChange]
11010
+ );
11011
+ const handleAddRule = useCallback(() => {
11012
+ emit([
11013
+ ...rules,
11014
+ { id: generateId2(), days: [], start: "09:00", end: "17:00" }
11015
+ ]);
11016
+ }, [emit, rules]);
11017
+ const handleRemoveRule = useCallback(
11018
+ (ruleId) => {
11019
+ emit(rules.filter((rule) => rule.id !== ruleId));
11020
+ },
11021
+ [emit, rules]
11022
+ );
11023
+ const handleToggleDay = useCallback(
11024
+ (ruleId, day) => {
11025
+ emit(
11026
+ rules.map(
11027
+ (rule) => rule.id === ruleId ? {
11028
+ ...rule,
11029
+ days: rule.days.includes(day) ? rule.days.filter((d) => d !== day) : [...rule.days, day]
11030
+ } : rule
11031
+ )
11032
+ );
11033
+ },
11034
+ [emit, rules]
11035
+ );
11036
+ const handleRuleChange = useCallback(
11037
+ (ruleId, field, value2) => {
11038
+ emit(
11039
+ rules.map(
11040
+ (rule) => rule.id === ruleId ? { ...rule, [field]: value2 } : rule
11041
+ )
11042
+ );
11043
+ },
11044
+ [emit, rules]
11045
+ );
11046
+ const orderedDays = getOrderedDays(weekStartsOn);
11047
+ return /* @__PURE__ */ jsxs(
11048
+ "div",
11049
+ {
11050
+ "data-slot": "business-hours-editor",
11051
+ className: cn("business-hours-editor space-y-3", className),
11052
+ children: [
11053
+ rules.map((rule) => /* @__PURE__ */ jsxs(
11054
+ "fieldset",
11055
+ {
11056
+ "data-slot": "business-hours-rule",
11057
+ className: "flex flex-wrap items-center gap-2 border-b border-gray-200 pb-3 last:border-0 dark:border-gray-700",
11058
+ children: [
11059
+ /* @__PURE__ */ jsx("legend", { className: "sr-only", children: "Availability rule" }),
11060
+ /* @__PURE__ */ jsx(
11061
+ "div",
11062
+ {
11063
+ "data-slot": "business-hours-rule-days",
11064
+ className: "flex shrink-0 gap-1",
11065
+ children: orderedDays.map((day) => {
11066
+ const selected = rule.days.includes(day);
11067
+ return /* @__PURE__ */ jsx(
11068
+ "button",
11069
+ {
11070
+ type: "button",
11071
+ "aria-pressed": selected,
11072
+ "aria-label": DAY_NAMES2[day],
11073
+ disabled,
11074
+ onClick: () => handleToggleDay(rule.id, day),
11075
+ className: cn(
11076
+ "inline-flex h-7 w-9 items-center justify-center rounded-full border text-xs font-medium transition-colors",
11077
+ "focus-visible:ring-ring focus-visible:ring-2 focus-visible:outline-none",
11078
+ "disabled:cursor-not-allowed disabled:opacity-50",
11079
+ selected ? "border-primary-800 bg-primary-800 text-white" : "border-border text-muted-foreground hover:bg-muted hover:text-foreground"
11080
+ ),
11081
+ children: DAY_NAMES_SHORT2[day]
11082
+ },
11083
+ day
11084
+ );
11085
+ })
11086
+ }
11087
+ ),
11088
+ /* @__PURE__ */ jsx("div", { className: "w-32 sm:w-36", children: /* @__PURE__ */ jsx(
11089
+ DateInput,
11090
+ {
11091
+ inputType: "time",
11092
+ timeFormat,
11093
+ minuteStep: 15,
11094
+ value: rule.start,
11095
+ onChange: (time) => handleRuleChange(rule.id, "start", time),
11096
+ disabled,
11097
+ size: "sm",
11098
+ className: "text-sm",
11099
+ label: "Start time",
11100
+ hideLabel: true
11101
+ }
11102
+ ) }),
11103
+ /* @__PURE__ */ jsx("span", { "data-slot": "business-hours-separator", className: "text-gray-400", children: "\u2013" }),
11104
+ /* @__PURE__ */ jsx("div", { className: "w-32 sm:w-36", children: /* @__PURE__ */ jsx(
11105
+ DateInput,
11106
+ {
11107
+ inputType: "time",
11108
+ timeFormat,
11109
+ minuteStep: 15,
11110
+ value: rule.end,
11111
+ onChange: (time) => handleRuleChange(rule.id, "end", time),
11112
+ disabled,
11113
+ size: "sm",
11114
+ className: "text-sm",
11115
+ label: "End time",
11116
+ hideLabel: true
11117
+ }
11118
+ ) }),
11119
+ showDescription && /* @__PURE__ */ jsx("div", { className: "min-w-[120px] flex-1", children: /* @__PURE__ */ jsx(
11120
+ Input,
11121
+ {
11122
+ type: "text",
11123
+ value: rule.description || "",
11124
+ onChange: (e) => handleRuleChange(rule.id, "description", e.target.value),
11125
+ placeholder: "Description (optional)",
11126
+ disabled,
11127
+ className: "text-sm",
11128
+ "aria-label": "Description"
11129
+ }
11130
+ ) }),
11131
+ /* @__PURE__ */ jsx(
11132
+ Button,
11133
+ {
11134
+ type: "button",
11135
+ variant: "ghost",
11136
+ size: "sm",
11137
+ onClick: () => handleRemoveRule(rule.id),
11138
+ disabled,
11139
+ className: "text-red-500 hover:bg-red-50 hover:text-red-600 dark:hover:bg-red-900/20",
11140
+ "aria-label": "Remove availability rule",
11141
+ children: /* @__PURE__ */ jsx(XIcon, { className: "h-4 w-4" })
11142
+ }
11143
+ )
11144
+ ]
11145
+ },
11146
+ rule.id
11147
+ )),
11148
+ /* @__PURE__ */ jsxs(
11149
+ Button,
11150
+ {
11151
+ type: "button",
11152
+ variant: "ghost",
11153
+ size: "sm",
11154
+ onClick: handleAddRule,
11155
+ disabled,
11156
+ className: "text-xs",
11157
+ children: [
11158
+ /* @__PURE__ */ jsx(PlusIcon2, { className: "me-1 h-3 w-3" }),
11159
+ addHoursLabel
11160
+ ]
11161
+ }
11162
+ )
11163
+ ]
11164
+ }
11165
+ );
11166
+ }
10527
11167
  function createDefaultSchedule() {
10528
11168
  return [
10529
11169
  { day: 0, hours: [] },
@@ -42774,6 +43414,6 @@ function WebsiteInputGroup({
42774
43414
  }
42775
43415
  WebsiteInputGroup.displayName = "WebsiteInputGroup";
42776
43416
 
42777
- export { AIChat, AIChatModal, AIChatTrigger, AIReconciliationPanel, AccessDeniedPage, ActionButton2 as ActionButton, ActionButtonsBar, ActiveFilters, AddContactModal, AddServiceCard, AdditionalFields, Address, AddressCard, AddressCompact, AddressDisplay, AddressForm, AddressInline, AppHeader, AppHeaderActions, AppHeaderBrand, AppHeaderDivider, AppHeaderIconButton, AppHeaderSearch, AppHeaderSection, AppHeaderTitle, AppHeaderUserMenu, Assessment, AuthButtons, AuthDialog, BookAppointmentButton, BookingDialog, BusinessHours, BusinessHoursEditor, CHANGE_TYPE_LABELS, CONCERN_STATUS_LABELS, CSVColumnMapper, CSVFileUpload, CardSkeleton, CheckrIntegration, ClaimListingButton, ClaimProviderForm, CodingChips, CommandPalette, CommandPaletteProvider, CommandPaletteTrigger, CompactCookieBanner, CompactFilterBar, CompactHeader, CompactHours, CompactProviderHeader, ConditionEditor, ConnectionStatusBadge, ConnectionStatusBar, ConnectionStatusOverlay, ConsentSwitch, CookieConsentBanner, CopyrightText, CountBadge, CreateInvoiceModal, CreateReferralModal, DEFAULT_ERROR_CONFIGS, DEFAULT_LANGUAGES, DEFAULT_RADIUS_OPTIONS, DEFAULT_SOCIAL_PROVIDERS, DOTBadge, DashboardWidget, DashboardWidgetActions, DashboardWidgetDataCards, DashboardWidgetInfo, DashboardWidgetTable, DateRangeFilter, DateRangePicker, DialogOverlay, DisclaimerText, DocumentDetectionOverlay, DocumentScanner, DropZone, DropzoneOverlay, EditUserRoleModal, EmployeeForm, EmployeeProfileCard, EmployerContactCard, EmployerList, EmployerPricingCard, EmployerServiceModal, EmployerView, ErrorPage, FileManager, FilePreview, FloatingAIChat, FloatingInput, FooterLinkSection, SocialMediaLinks2 as FooterSocialLinks, HRISProviderSelector, HandsFreeChat, HealthSurveillance, HelpSupportPanel, HeroSearchBar, HeyOzwell, HeyOzwellToggle, HoursSummary, ImagingOrderEditor, InlineBookingForm, InventoryManager, InviteUserModal, InvoiceList, InvoicePaymentPage, InvoiceView, LabOrderEditor, LanguageSelector, LanguageSelectorInline, LanguageSelectorNative, LegalLinks, LoadingBar, LoadingDots, LoadingOverlay, LoadingPage, LoadingSkeleton, MODEL_MANIFEST, MaintenancePage, MobileBackButton, MobileMenuButton, MobileMenuPanel, ModelInfoList, NavLinks, NewsletterForm, NotFoundPage, NotificationCenter, ORDER_TYPE_META, ORDER_TYPE_SEARCH_DOMAINS, OfflinePage, OnboardingCompletion, OnboardingStepQuestion, OnboardingWizard, OpenStatusBadge, OrderCard, OrderConfirmation, OrderConfirmationWizard, OrderDetailSidebar, OrderEditor, OrderList, OrderLookupForm, OrderSidebar, OrderSidebarTabs, OzwellSettingsMenu, PageHeader, PatientHeader, PaymentHistoryTable, PaymentMethodBank, PaymentMethodCard, PaymentMethodList, PendingClaimsTable, PermissionsEditor, PillSelect, PresentingProblems, ProblemList, ProcedureOrderEditor, ProductVersion, ProductVersionBadge, Breadcrumb2 as ProviderBreadcrumb, ProviderCard, ProviderCardGrid, ProviderCardSkeleton, ProviderDetailHeader, ProviderDetailHeaderSkeleton, ProviderLogo2 as ProviderLogo, ProviderOverview, ProviderSearchBar, ProviderSearchFilters, ProviderSelector, ProviderSettings, SocialMediaLinks as ProviderSocialLinks, ProviderUsersTable, QuickBookCard, QuickLinksCard, RELEVANCE_LABELS, RecurringServiceAddCard, RecurringServiceCard, RecurringServiceGrid, RecurringServiceSetupModal, ReferralEditor, RejectionModal, ReportDashboard, ReportDatePicker, ReportLink, ReportTimeRange, ResultsEntryCard, ResultsEntryForm, ResultsEntryModal, SSOConfigForm, ScheduleCalendar, SearchResultsMessage, SelectedServicesBadges, ServerErrorPage, ServiceAccordion, ServiceBadge, ServiceBadgeGroup, ServiceCard, ServiceCategoryBadge, ServiceGeneralSettings, ServiceGrid, ServiceLink, ServiceList, ServiceMultiSelect, ServicePicker, ServicePricingManager, ServiceSelect, ServiceShippingSettings, ServiceTagCloud, ServiceTagCloudBadges, SetupServiceModal, Sidebar, SidebarContent, SidebarFooter, SidebarHeader, SidebarMobileToggle, SidebarNav, SidebarNavGroup, SidebarNavItem, SidebarProvider, SidebarSearch, SidebarToggle, SimpleFooter, SiteFooter, SiteHeader, SiteLogo, StepIndicator, StripeBadge, StripeSecureBadge, SuggestedActions, TableOfContents, TimelineEventList, TimelineProgress, Toast, ToastContainer, ToastProvider, UncertaintyBadge, UpdateAvailableOverlay, UserMenu, VerifiedBadge2 as VerifiedBadge, VisitScribe, VoiceManager, VoiceSetup, WEBSITE_TYPES, WebChartReportViewer, WebcamModal, WebsiteInput, WebsiteInputGroup, askOzwell, askOzwellStream, attributeSegments, calculateDateRange, centroid, chime, clearVoiceprints, clearWhatPrints, clusterEmbeddings, concernGroupKey, concernHistoryContent, cosine, countBadgeVariants, countChipVariants, create24HourSchedule, createDefaultSchedule, createWeekdaySchedule, currentAssertion, decodeTo16kMono, defaultOrderTabs, defaultReconciliationIsEqual, endsWithDone, formatAddressLines, formatAddressSingleLine, formatCityState, formatCityStateZip, generateId, getDefaultPresets, getDictationLoad, getExtendedPresets, getGoogleMapsSearchUrl, getGoogleMapsUrl, getOzwellConfig, getVoiceprints, getWakeWarm, inferSpeakerRoles, isConditionCodetype, isOzwellConfigured, isValidUrl, isWhisperLoaded, labelClusters, loadWhatPrints, medicationToOrder, mergeTurns, openRollingRecorder, orderToMedication, orderTypeForCodetype, panelVariants as reconciliationPanelVariants, saveWhatPrints, setVoiceprints, stripStopPhrase, subscribeDictationLoad, subscribeWakeWarm, toOzwellMessages, transcribeBlob, transcribeGate, transcribeSamples, transcribeSegments, transcribeServer, trimTrailingStopPhrase, useCamera, useCommandPalette, useConnectionStatus, useCookieConsent, useDiarization, useDocumentDetection, useDropzone, useFileUpload, useHeyOzwell, useSidebar, useSpeakerVerify, useToast, useVisitScribe, useVoiceSetup, useWakeWord, warmStopGate, warmWakeModels, warmWhisper, widgetVariants };
43417
+ export { AIChat, AIChatModal, AIChatTrigger, AIReconciliationPanel, AccessDeniedPage, ActionButton2 as ActionButton, ActionButtonsBar, ActiveFilters, AddContactModal, AddServiceCard, AdditionalFields, Address, AddressCard, AddressCompact, AddressDisplay, AddressForm, AddressInline, AppHeader, AppHeaderActions, AppHeaderBrand, AppHeaderDivider, AppHeaderIconButton, AppHeaderSearch, AppHeaderSection, AppHeaderTitle, AppHeaderUserMenu, Assessment, AuthButtons, AuthDialog, BookAppointmentButton, BookingDialog, BusinessHours, BusinessHoursEditor, CHANGE_TYPE_LABELS, CONCERN_STATUS_LABELS, CSVColumnMapper, CSVFileUpload, CardSkeleton, CheckrIntegration, ClaimListingButton, ClaimProviderForm, CodingChips, CommandPalette, CommandPaletteProvider, CommandPaletteTrigger, CompactCookieBanner, CompactFilterBar, CompactHeader, CompactHours, CompactProviderHeader, ComposerModelSelector, ConditionEditor, ConnectionStatusBadge, ConnectionStatusBar, ConnectionStatusOverlay, ConsentSwitch, CookieConsentBanner, CopyrightText, CountBadge, CreateInvoiceModal, CreateReferralModal, DEFAULT_ERROR_CONFIGS, DEFAULT_LANGUAGES, DEFAULT_RADIUS_OPTIONS, DEFAULT_SOCIAL_PROVIDERS, DOTBadge, DashboardWidget, DashboardWidgetActions, DashboardWidgetDataCards, DashboardWidgetInfo, DashboardWidgetTable, DateRangeFilter, DateRangePicker, DialogOverlay, DisclaimerText, DocumentDetectionOverlay, DocumentScanner, DropZone, DropzoneOverlay, EditUserRoleModal, EmployeeForm, EmployeeProfileCard, EmployerContactCard, EmployerList, EmployerPricingCard, EmployerServiceModal, EmployerView, ErrorPage, FileManager, FilePreview, FloatingAIChat, FloatingInput, FooterLinkSection, SocialMediaLinks2 as FooterSocialLinks, HRISProviderSelector, HandsFreeChat, HealthSurveillance, HelpSupportPanel, HeroSearchBar, HeyOzwell, HeyOzwellToggle, HoursSummary, ImagingOrderEditor, InlineBookingForm, InventoryManager, InviteUserModal, InvoiceList, InvoicePaymentPage, InvoiceView, LabOrderEditor, LanguageSelector, LanguageSelectorInline, LanguageSelectorNative, LegalLinks, LoadingBar, LoadingDots, LoadingOverlay, LoadingPage, LoadingSkeleton, MODEL_MANIFEST, MaintenancePage, MobileBackButton, MobileMenuButton, MobileMenuPanel, ModelInfoList, NavLinks, NewsletterForm, NotFoundPage, NotificationCenter, ORDER_TYPE_META, ORDER_TYPE_SEARCH_DOMAINS, OfflinePage, OnboardingCompletion, OnboardingStepQuestion, OnboardingWizard, OpenStatusBadge, OrderCard, OrderConfirmation, OrderConfirmationWizard, OrderDetailSidebar, OrderEditor, OrderList, OrderLookupForm, OrderSidebar, OrderSidebarTabs, OzwellSettingsMenu, PageHeader, PatientHeader, PaymentHistoryTable, PaymentMethodBank, PaymentMethodCard, PaymentMethodList, PendingClaimsTable, PermissionsEditor, PillSelect, PresentingProblems, ProblemList, ProcedureOrderEditor, ProductVersion, ProductVersionBadge, Breadcrumb2 as ProviderBreadcrumb, ProviderCard, ProviderCardGrid, ProviderCardSkeleton, ProviderDetailHeader, ProviderDetailHeaderSkeleton, ProviderLogo2 as ProviderLogo, ProviderOverview, ProviderSearchBar, ProviderSearchFilters, ProviderSelector, ProviderSettings, SocialMediaLinks as ProviderSocialLinks, ProviderUsersTable, QuickBookCard, QuickLinksCard, RELEVANCE_LABELS, RecurringServiceAddCard, RecurringServiceCard, RecurringServiceGrid, RecurringServiceSetupModal, ReferralEditor, RejectionModal, ReportDashboard, ReportDatePicker, ReportLink, ReportTimeRange, ResultsEntryCard, ResultsEntryForm, ResultsEntryModal, SSOConfigForm, ScheduleCalendar, SearchResultsMessage, SelectedServicesBadges, ServerErrorPage, ServiceAccordion, ServiceBadge, ServiceBadgeGroup, ServiceCard, ServiceCategoryBadge, ServiceGeneralSettings, ServiceGrid, ServiceLink, ServiceList, ServiceMultiSelect, ServicePicker, ServicePricingManager, ServiceSelect, ServiceShippingSettings, ServiceTagCloud, ServiceTagCloudBadges, SetupServiceModal, Sidebar, SidebarContent, SidebarFooter, SidebarHeader, SidebarMobileToggle, SidebarNav, SidebarNavGroup, SidebarNavItem, SidebarProvider, SidebarSearch, SidebarToggle, SimpleFooter, SiteFooter, SiteHeader, SiteLogo, StepIndicator, StripeBadge, StripeSecureBadge, SuggestedActions, TableOfContents, TimelineEventList, TimelineProgress, Toast, ToastContainer, ToastProvider, UncertaintyBadge, UpdateAvailableOverlay, UserMenu, VerifiedBadge2 as VerifiedBadge, VisitScribe, VoiceManager, VoiceSetup, WEBSITE_TYPES, WebChartReportViewer, WebcamModal, WebsiteInput, WebsiteInputGroup, askOzwell, askOzwellStream, attributeSegments, calculateDateRange, centroid, chime, clearVoiceprints, clearWhatPrints, clusterEmbeddings, concernGroupKey, concernHistoryContent, cosine, countBadgeVariants, countChipVariants, create24HourSchedule, createDefaultSchedule, createWeekdaySchedule, currentAssertion, decodeTo16kMono, defaultOrderTabs, defaultReconciliationIsEqual, endsWithDone, formatAddressLines, formatAddressSingleLine, formatCityState, formatCityStateZip, generateId, getDefaultPresets, getDictationLoad, getExtendedPresets, getGoogleMapsSearchUrl, getGoogleMapsUrl, getOzwellConfig, getVoiceprints, getWakeWarm, inferSpeakerRoles, isConditionCodetype, isOzwellConfigured, isValidUrl, isWhisperLoaded, labelClusters, loadWhatPrints, medicationToOrder, mergeTurns, openRollingRecorder, orderToMedication, orderTypeForCodetype, panelVariants as reconciliationPanelVariants, saveWhatPrints, setVoiceprints, stripStopPhrase, subscribeDictationLoad, subscribeWakeWarm, toOzwellMessages, transcribeBlob, transcribeGate, transcribeSamples, transcribeSegments, transcribeServer, trimTrailingStopPhrase, useCamera, useCommandPalette, useConnectionStatus, useCookieConsent, useDiarization, useDocumentDetection, useDropzone, useFileUpload, useHeyOzwell, useSidebar, useSpeakerVerify, useToast, useVisitScribe, useVoiceSetup, useWakeWord, warmStopGate, warmWakeModels, warmWhisper, widgetVariants };
42778
43418
  //# sourceMappingURL=index.js.map
42779
43419
  //# sourceMappingURL=index.js.map