@mieweb/ui 0.11.0-dev.52 → 0.11.0-dev.54

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -137,7 +137,7 @@ export { useMediaTransport } from './chunk-4LKAZW2W.js';
137
137
  export { useUrlTab } from './chunk-CVNPNZMX.js';
138
138
  import './chunk-7XUN3OQT.js';
139
139
  export { formatPhoneNumber, isPhoneNumberEmpty, isValidPhoneNumber, unformatPhoneNumber } from './chunk-ZVPJ2MH6.js';
140
- export { miewebUIPreset, miewebUISafelist } from './chunk-L3JA7EDU.js';
140
+ export { miewebUIPreset, miewebUISafelist } from './chunk-DDP7XWIL.js';
141
141
  export { Accordion } from './chunk-BHKGVFTY.js';
142
142
  import './chunk-H2Y7HZV5.js';
143
143
  export { AvatarGroup, defaultAvatarGroupLabels } from './chunk-DVDT7TX7.js';
@@ -226,7 +226,7 @@ import * as React16 from 'react';
226
226
  import React16__default, { createContext, useState, useEffect, useCallback, useMemo, useContext, useRef, useId } from 'react';
227
227
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
228
228
  import { cva } from 'class-variance-authority';
229
- import { AudioWaveform, Play, Pause, FileUp, X, AlertCircle, VolumeX, Volume2, Minimize2, Maximize2, ZoomOut, ZoomIn, LocateFixed, Search, Calendar as Calendar$1, ChevronLeft, ChevronRight as ChevronRight$1, ChevronDown as ChevronDown$1, FolderUp, Upload, Edit2, Check, ChevronUp, 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, ExternalLink as ExternalLink$1, Link, AlertTriangle as AlertTriangle$1, RefreshCw } from 'lucide-react';
229
+ import { AudioWaveform, Play, Pause, FileUp, X, AlertCircle, Users as Users$1, VolumeX, Volume2, Minimize2, Maximize2, ZoomOut, ZoomIn, LocateFixed, Search, Calendar as Calendar$1, ChevronLeft, ChevronRight as ChevronRight$1, ChevronDown as ChevronDown$1, FolderUp, Upload, Edit2, Check, ChevronUp, 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, ExternalLink as ExternalLink$1, Link, AlertTriangle as AlertTriangle$1, RefreshCw } from 'lucide-react';
230
230
  import { useVirtualizer } from '@tanstack/react-virtual';
231
231
  import * as ReactDOM from 'react-dom';
232
232
  import { createPortal } from 'react-dom';
@@ -3759,18 +3759,10 @@ function overlappingLanes({ probabilities, numSpeakers }, [from, to], primary) {
3759
3759
  }
3760
3760
  return lanes;
3761
3761
  }
3762
- function transcriptFromFrames(words, frames, names, durationSeconds) {
3763
- const ids = names.map((_, lane) => `lane-${lane}`);
3762
+ function buildTranscript(words, attribute, { durationMs, speakers, speakerActivity }) {
3764
3763
  const segments = [];
3765
3764
  for (const word of words) {
3766
- const range = wordFrameRange(frames, word);
3767
- const means = laneMeans(frames, range);
3768
- let lane = 0;
3769
- for (let l = 1; l < means.length; l++) if (means[l] > means[lane]) lane = l;
3770
- const speakerId = ids[lane] ?? `lane-${lane}`;
3771
- const others = overlappingLanes(frames, range, lane).map(
3772
- (l) => ids[l] ?? `lane-${l}`
3773
- );
3765
+ const { speakerId, others } = attribute(word);
3774
3766
  const spoken = {
3775
3767
  text: word.text.trim(),
3776
3768
  startMs: ms(word.start),
@@ -3794,19 +3786,104 @@ function transcriptFromFrames(words, frames, names, durationSeconds) {
3794
3786
  ...others.length ? { overlapSpeakerIds: others } : {}
3795
3787
  });
3796
3788
  }
3797
- const speakerActivity = laneActivity(frames);
3798
3789
  const heard = /* @__PURE__ */ new Set([
3799
3790
  ...segments.map((s) => s.speakerId),
3800
3791
  ...speakerActivity.map((a) => a.speakerId)
3801
3792
  ]);
3802
3793
  return {
3803
- durationMs: ms(durationSeconds),
3804
- speakers: names.map((name, lane) => ({ id: ids[lane], name })).filter((s) => heard.has(s.id)),
3794
+ durationMs,
3795
+ speakers: speakers.filter((s) => heard.has(s.id)),
3805
3796
  segments,
3806
3797
  words: segments.flatMap((s) => s.words),
3807
3798
  speakerActivity
3808
3799
  };
3809
3800
  }
3801
+ var laneSpeakers = (names) => names.map((name, lane) => ({ id: `lane-${lane}`, name }));
3802
+ function timelineFromFrames(frames, names, durationSeconds) {
3803
+ const speakerActivity = laneActivity(frames);
3804
+ const heard = new Set(speakerActivity.map((a) => a.speakerId));
3805
+ return {
3806
+ durationMs: ms(durationSeconds),
3807
+ speakers: laneSpeakers(names).filter((s) => heard.has(s.id)),
3808
+ speakerActivity
3809
+ };
3810
+ }
3811
+ function transcriptFromFrames(words, frames, names, durationSeconds) {
3812
+ const id = (lane) => `lane-${lane}`;
3813
+ return buildTranscript(
3814
+ words,
3815
+ (word) => {
3816
+ const range = wordFrameRange(frames, word);
3817
+ const means = laneMeans(frames, range);
3818
+ let lane = 0;
3819
+ for (let l = 1; l < means.length; l++)
3820
+ if (means[l] > means[lane]) lane = l;
3821
+ return {
3822
+ speakerId: id(lane),
3823
+ others: overlappingLanes(frames, range, lane).map(id)
3824
+ };
3825
+ },
3826
+ // Every named lane: a word can land on a lane with no activity of its own.
3827
+ {
3828
+ ...timelineFromFrames(frames, names, durationSeconds),
3829
+ speakers: laneSpeakers(names)
3830
+ }
3831
+ );
3832
+ }
3833
+ function transcriptFromActivity(words, timeline) {
3834
+ const spans = timeline.speakerActivity;
3835
+ const speakers = timeline.speakers.length ? timeline.speakers : [{ id: "lane-0", name: "Speaker 1" }];
3836
+ const fallback = speakers[0].id;
3837
+ return buildTranscript(
3838
+ words,
3839
+ (word) => {
3840
+ const from = ms(word.start);
3841
+ const to = Math.max(ms(word.end), from + 1);
3842
+ const heard = spans.filter((s) => s.startMs < to && s.endMs > from);
3843
+ if (heard.length === 0) {
3844
+ const gap = (s) => Math.max(s.startMs - to, from - s.endMs);
3845
+ const nearest = spans.reduce(
3846
+ (best, s) => !best || gap(s) < gap(best) ? s : best,
3847
+ void 0
3848
+ );
3849
+ return { speakerId: nearest?.speakerId ?? fallback, others: [] };
3850
+ }
3851
+ const within = (s) => [
3852
+ Math.max(from, s.startMs),
3853
+ Math.min(to, s.endMs)
3854
+ ];
3855
+ const totals = /* @__PURE__ */ new Map();
3856
+ for (const s of heard) {
3857
+ const [start, end] = within(s);
3858
+ totals.set(s.speakerId, (totals.get(s.speakerId) ?? 0) + end - start);
3859
+ }
3860
+ const rank = (id) => {
3861
+ const i = speakers.findIndex((s) => s.id === id);
3862
+ return i < 0 ? Infinity : i;
3863
+ };
3864
+ let speakerId = heard[0].speakerId;
3865
+ for (const [id, total] of totals) {
3866
+ const best = totals.get(speakerId) ?? 0;
3867
+ if (total > best || total === best && rank(id) < rank(speakerId))
3868
+ speakerId = id;
3869
+ }
3870
+ const mine = heard.filter((s) => s.speakerId === speakerId);
3871
+ const together = (s) => {
3872
+ const [start, end] = within(s);
3873
+ return mine.some(
3874
+ (m) => Math.min(end, m.endMs) > Math.max(start, m.startMs)
3875
+ );
3876
+ };
3877
+ const others = [
3878
+ ...new Set(
3879
+ heard.filter((s) => s.speakerId !== speakerId && together(s)).map((s) => s.speakerId)
3880
+ )
3881
+ ];
3882
+ return { speakerId, others };
3883
+ },
3884
+ { ...timeline, speakers }
3885
+ );
3886
+ }
3810
3887
 
3811
3888
  // src/components/AI/HeyOzwell/audio.ts
3812
3889
  function openRollingRecorder(stream, maxSeconds = 2) {
@@ -4020,6 +4097,7 @@ function listenNemotron(stream, options, onStage) {
4020
4097
  let cursor = 0;
4021
4098
  let pushed = Promise.resolve();
4022
4099
  let open = true;
4100
+ let paused = false;
4023
4101
  const close = () => {
4024
4102
  if (!open) return;
4025
4103
  open = false;
@@ -4031,7 +4109,7 @@ function listenNemotron(stream, options, onStage) {
4031
4109
  const fresh = recorder.snapshotFrom(cursor);
4032
4110
  cursor += fresh.length;
4033
4111
  recorder.discardBefore(cursor);
4034
- if (fresh.length > 0) {
4112
+ if (fresh.length > 0 && !paused) {
4035
4113
  const samples = resampleTo16kMono(fresh, recorder.sampleRate);
4036
4114
  pushed = pushed.then(() => nemotron.push(samples));
4037
4115
  pushed.catch(() => {
@@ -4053,6 +4131,14 @@ function listenNemotron(stream, options, onStage) {
4053
4131
  void pushed.catch(() => {
4054
4132
  }).then(() => nemotron.finish()).catch(() => {
4055
4133
  });
4134
+ },
4135
+ pause: () => {
4136
+ drain();
4137
+ paused = true;
4138
+ },
4139
+ resume: () => {
4140
+ drain();
4141
+ paused = false;
4056
4142
  }
4057
4143
  };
4058
4144
  }
@@ -4284,7 +4370,9 @@ function useNemotronDiarization({
4284
4370
  names,
4285
4371
  namespace: nsRef.current,
4286
4372
  hydrated: hydratedRef.current,
4287
- cancel: listener.cancel
4373
+ cancel: listener.cancel,
4374
+ pause: listener.pause,
4375
+ resume: listener.resume
4288
4376
  };
4289
4377
  return session;
4290
4378
  },
@@ -4331,6 +4419,27 @@ function useNemotronDiarization({
4331
4419
  }),
4332
4420
  [track, labelSpeakers]
4333
4421
  );
4422
+ const finish = React16.useCallback(
4423
+ (live) => {
4424
+ const session = live;
4425
+ const stopping = session.namespace === nsRef.current ? session.listener.stop() : null;
4426
+ if (stopping) stopping.catch(() => {
4427
+ });
4428
+ else session.cancel();
4429
+ return track(async (assertNamespace) => {
4430
+ if (!stopping)
4431
+ throw new Error("Voiceprint namespace changed during processing");
4432
+ const frames = await stopping;
4433
+ assertNamespace();
4434
+ return timelineFromFrames(
4435
+ frames,
4436
+ laneNames(frames, session.names),
4437
+ frames.numFrames * frames.frameDurationSeconds
4438
+ );
4439
+ });
4440
+ },
4441
+ [track]
4442
+ );
4334
4443
  const voices = React16.useMemo(
4335
4444
  () => prints.map((p) => ({
4336
4445
  name: p.name,
@@ -4348,7 +4457,8 @@ function useNemotronDiarization({
4348
4457
  enroll,
4349
4458
  removeVoice,
4350
4459
  listen,
4351
- diarize
4460
+ diarize,
4461
+ finish
4352
4462
  };
4353
4463
  }
4354
4464
 
@@ -6847,6 +6957,8 @@ var DEFAULT_TRANSCRIPT_PLAYER_LABELS = {
6847
6957
  searchTranscript: "Search transcript",
6848
6958
  searchPlaceholder: "Search transcript\u2026",
6849
6959
  showSpeakers: "Show speakers",
6960
+ showSpeakerLanes: "Show speakers",
6961
+ hideSpeakerLanes: "Hide speakers",
6850
6962
  allSpeakers: "All speakers",
6851
6963
  someSpeakers: "Some speakers",
6852
6964
  noTranscript: "No transcript for this recording.",
@@ -6870,7 +6982,7 @@ var DEFAULT_TRANSCRIPT_PLAYER_LABELS = {
6870
6982
  seekValue: (current, total) => `${current} of ${total}`,
6871
6983
  windowValue: (start, end) => `${start} to ${end}`
6872
6984
  };
6873
- var ROW_GRID = "grid grid-cols-[6.5rem_minmax(0,1fr)] items-center gap-x-3";
6985
+ var ROW_GRID = "grid grid-cols-[var(--tp-label,6.5rem)_minmax(0,1fr)] items-center gap-x-3";
6874
6986
  var HIDE_DELAY_MS = 150;
6875
6987
  var viewFraction = (time, view) => view.span > 0 ? Math.min(1, Math.max(0, (time - view.start) / view.span)) : 0;
6876
6988
  var timeAtPointer = (clientX, element, view) => {
@@ -7267,10 +7379,13 @@ function TimelineOverview({
7267
7379
  {
7268
7380
  "aria-hidden": "true",
7269
7381
  className: "text-muted-foreground relative mx-9 mt-1 h-4 text-[11px] tabular-nums",
7270
- children: ticksFor(whole).map((t) => /* @__PURE__ */ jsx(
7382
+ children: ticksFor(whole).map((t, i) => /* @__PURE__ */ jsx(
7271
7383
  "span",
7272
7384
  {
7273
- className: "absolute -translate-x-1/2",
7385
+ className: cn(
7386
+ "absolute -translate-x-1/2",
7387
+ i % 2 === 1 && "hidden @md:inline"
7388
+ ),
7274
7389
  style: {
7275
7390
  // rtl-ignore -- time axis inside the player's dir="ltr" timeline
7276
7391
  left: `${viewFraction(t, whole) * 100}%`
@@ -7329,7 +7444,8 @@ var Row = React16.memo(function Row2({
7329
7444
  "aria-posinset": posInSet,
7330
7445
  onClick: () => onPlay(utterance),
7331
7446
  className: cn(
7332
- "flex cursor-pointer items-start gap-3 rounded-lg px-2 py-2 text-sm",
7447
+ // Narrow hosts put the text on its own line under the time and speaker.
7448
+ "flex cursor-pointer flex-wrap items-start gap-x-3 gap-y-1 rounded-lg px-2 py-2 text-sm @md:flex-nowrap",
7333
7449
  active ? "bg-primary-50 dark:bg-primary-950/40" : "hover:bg-muted/60"
7334
7450
  ),
7335
7451
  children: [
@@ -7371,7 +7487,7 @@ var Row = React16.memo(function Row2({
7371
7487
  ]
7372
7488
  }
7373
7489
  ),
7374
- /* @__PURE__ */ jsxs("span", { className: "min-w-0 flex-1", children: [
7490
+ /* @__PURE__ */ jsxs("span", { className: "min-w-0 grow basis-full ps-9 @md:basis-0 @md:ps-0", children: [
7375
7491
  utterance.text ? highlight(utterance.text, query) : /* @__PURE__ */ jsx("span", { className: "text-muted-foreground italic", children: labels.noWords }),
7376
7492
  overlap && /* @__PURE__ */ jsx("span", { className: "text-muted-foreground border-border ms-2 inline-block max-w-full rounded border px-1.5 text-[11px] break-words", children: labels.overlapWith(overlap) })
7377
7493
  ] })
@@ -7459,7 +7575,7 @@ function TranscriptList({
7459
7575
  "p",
7460
7576
  {
7461
7577
  role: "status",
7462
- className: "text-muted-foreground flex h-80 items-center justify-center p-6 text-center text-sm",
7578
+ className: "text-muted-foreground flex items-center justify-center p-6 text-center text-sm",
7463
7579
  children: emptyMessage
7464
7580
  }
7465
7581
  );
@@ -7478,7 +7594,7 @@ function TranscriptList({
7478
7594
  if (e.target === e.currentTarget && USER_SCROLL_KEYS.has(e.key))
7479
7595
  setDetached(true);
7480
7596
  },
7481
- className: "focus-visible:ring-ring h-80 overflow-y-auto rounded-lg focus-visible:ring-2 focus-visible:outline-none",
7597
+ className: "focus-visible:ring-ring max-h-80 overflow-y-auto rounded-lg focus-visible:ring-2 focus-visible:outline-none",
7482
7598
  children: virtualize ? /* @__PURE__ */ jsx(
7483
7599
  "div",
7484
7600
  {
@@ -7724,7 +7840,7 @@ function inertOutside(element) {
7724
7840
  }
7725
7841
  return () => changed.forEach((el) => el.removeAttribute("inert"));
7726
7842
  }
7727
- var TRACK_OFFSET = "7.25rem";
7843
+ var TRACK_OFFSET = "calc(var(--tp-label, 6.5rem) + 0.75rem)";
7728
7844
  var pressedButton = "aria-pressed:bg-primary-50 aria-pressed:text-primary-800 dark:aria-pressed:bg-primary-950 dark:aria-pressed:text-primary-200";
7729
7845
  function TranscriptPlayer({
7730
7846
  src,
@@ -7732,11 +7848,17 @@ function TranscriptPlayer({
7732
7848
  speakerLabels,
7733
7849
  peaks: providedPeaks,
7734
7850
  labels: labelOverrides,
7851
+ collapsibleLanes = false,
7852
+ showSpeakerPanel = true,
7853
+ sticky = true,
7735
7854
  className
7736
7855
  }) {
7737
7856
  const rootRef = React16.useRef(null);
7738
7857
  const fullscreenButtonRef = React16.useRef(null);
7739
7858
  const transcriptHeadingId = React16.useId();
7859
+ const lanesId = React16.useId();
7860
+ const [lanesOpen, setLanesOpen] = React16.useState(!collapsibleLanes);
7861
+ const showLanes = !collapsibleLanes || lanesOpen;
7740
7862
  const labels = React16.useMemo(
7741
7863
  () => ({ ...DEFAULT_TRANSCRIPT_PLAYER_LABELS, ...labelOverrides }),
7742
7864
  [labelOverrides]
@@ -7818,7 +7940,10 @@ function TranscriptPlayer({
7818
7940
  const onKeyDown = (event) => {
7819
7941
  if (event.key !== "Escape" || document.fullscreenElement) return;
7820
7942
  const target = event.target;
7821
- if (target?.closest?.('[aria-expanded="true"]')) return;
7943
+ if (target?.closest?.(
7944
+ '[aria-expanded="true"][aria-haspopup]:not([aria-haspopup="false"])'
7945
+ ))
7946
+ return;
7822
7947
  if (target?.type === "search" && target.value) return;
7823
7948
  setFullscreen(false);
7824
7949
  };
@@ -7926,7 +8051,8 @@ function TranscriptPlayer({
7926
8051
  {
7927
8052
  ref: rootRef,
7928
8053
  className: cn(
7929
- "text-foreground flex flex-col gap-4",
8054
+ // Sized by its container, not the viewport, so it also fits narrow hosts such as a chat bubble.
8055
+ "text-foreground @container flex flex-col gap-4",
7930
8056
  fullscreen && "bg-background fixed inset-0 z-50 overflow-y-auto p-6",
7931
8057
  className
7932
8058
  ),
@@ -7945,9 +8071,13 @@ function TranscriptPlayer({
7945
8071
  "section",
7946
8072
  {
7947
8073
  "aria-label": labels.recording,
7948
- className: "border-border bg-card text-card-foreground sticky top-0 z-10 rounded-xl border p-4",
8074
+ className: cn(
8075
+ // The label width is set here, not on the root: a container query only sees an ancestor.
8076
+ "border-border bg-card text-card-foreground rounded-xl border p-3 [--tp-label:4.5rem] @md:p-4 @md:[--tp-label:6.5rem]",
8077
+ sticky && "sticky top-0 z-10"
8078
+ ),
7949
8079
  children: [
7950
- /* @__PURE__ */ jsxs("div", { className: "mb-3 flex flex-wrap items-center gap-x-4 gap-y-2", children: [
8080
+ /* @__PURE__ */ jsxs("div", { className: "mb-6 flex flex-wrap items-center gap-x-4 gap-y-2", children: [
7951
8081
  /* @__PURE__ */ jsx(
7952
8082
  Button,
7953
8083
  {
@@ -7977,7 +8107,23 @@ function TranscriptPlayer({
7977
8107
  ] }),
7978
8108
  playback.error && /* @__PURE__ */ jsx("span", { role: "alert", className: "text-destructive text-sm", children: playback.error === "load" ? labels.loadError : labels.playError }),
7979
8109
  !src && /* @__PURE__ */ jsx("span", { className: "text-muted-foreground text-sm", children: labels.noRecording }),
7980
- /* @__PURE__ */ jsxs("div", { className: "ms-auto flex items-center gap-2", children: [
8110
+ /* @__PURE__ */ jsxs("div", { className: "ms-auto flex flex-wrap items-center gap-2", children: [
8111
+ collapsibleLanes && /* @__PURE__ */ jsxs(
8112
+ Button,
8113
+ {
8114
+ type: "button",
8115
+ variant: "ghost",
8116
+ size: "sm",
8117
+ "aria-expanded": lanesOpen,
8118
+ "aria-controls": lanesId,
8119
+ onClick: () => setLanesOpen((open) => !open),
8120
+ "aria-label": lanesOpen ? labels.hideSpeakerLanes : labels.showSpeakerLanes,
8121
+ children: [
8122
+ /* @__PURE__ */ jsx(Users$1, { "aria-hidden": "true", className: "h-4 w-4 @sm:me-1.5" }),
8123
+ /* @__PURE__ */ jsx("span", { "aria-hidden": "true", className: "hidden @sm:inline", children: lanesOpen ? labels.hideSpeakerLanes : labels.showSpeakerLanes })
8124
+ ]
8125
+ }
8126
+ ),
7981
8127
  /* @__PURE__ */ jsx(
7982
8128
  Button,
7983
8129
  {
@@ -7995,7 +8141,7 @@ function TranscriptPlayer({
7995
8141
  children: playback.volume === 0 ? /* @__PURE__ */ jsx(VolumeX, { "aria-hidden": "true", className: "h-4 w-4" }) : /* @__PURE__ */ jsx(Volume2, { "aria-hidden": "true", className: "h-4 w-4" })
7996
8142
  }
7997
8143
  ),
7998
- /* @__PURE__ */ jsx(
8144
+ /* @__PURE__ */ jsx("div", { className: "hidden @md:block", children: /* @__PURE__ */ jsx(
7999
8145
  Slider,
8000
8146
  {
8001
8147
  "aria-label": labels.volume,
@@ -8007,7 +8153,7 @@ function TranscriptPlayer({
8007
8153
  size: "sm",
8008
8154
  className: "w-24"
8009
8155
  }
8010
- ),
8156
+ ) }),
8011
8157
  /* @__PURE__ */ jsx(
8012
8158
  Select,
8013
8159
  {
@@ -8036,75 +8182,90 @@ function TranscriptPlayer({
8036
8182
  )
8037
8183
  ] })
8038
8184
  ] }),
8039
- /* @__PURE__ */ jsxs("div", { dir: "ltr", className: "relative space-y-1.5", children: [
8040
- /* @__PURE__ */ jsxs("div", { className: ROW_GRID, children: [
8041
- /* @__PURE__ */ jsx("span", {}),
8042
- /* @__PURE__ */ jsx(
8043
- "div",
8044
- {
8045
- role: "slider",
8046
- tabIndex: 0,
8047
- "aria-label": labels.seek,
8048
- "aria-valuemin": 0,
8049
- "aria-valuemax": Math.round(duration),
8050
- "aria-valuenow": Math.round(currentTime),
8051
- "aria-valuetext": labels.seekValue(
8052
- formatClock(currentTime),
8053
- formatClock(duration)
8054
- ),
8055
- onKeyDown: onSeekKey,
8056
- onClick: (e) => seekTo(timeAtPointer(e.clientX, e.currentTarget, view)),
8057
- className: "focus-visible:ring-ring cursor-pointer rounded focus-visible:ring-2 focus-visible:outline-none",
8058
- children: /* @__PURE__ */ jsx(Waveform, { peaks, view, currentTime })
8059
- }
8060
- )
8061
- ] }),
8062
- visibleSpeakers.length > 0 ? /* @__PURE__ */ jsx(
8063
- SpeakerLanes,
8064
- {
8065
- speakers: visibleSpeakers,
8066
- segments: visibleSegments,
8067
- view,
8068
- playingId,
8069
- onPlaySegment: playSegment,
8070
- onPause: pause,
8071
- onSeek: seekTo,
8072
- labels
8073
- },
8074
- src ?? ""
8075
- ) : /* @__PURE__ */ jsx("p", { className: "text-muted-foreground py-2 text-center text-xs", children: speakers.length ? labels.allSpeakersHidden : labels.noActivity }),
8076
- /* @__PURE__ */ jsxs("div", { className: cn(ROW_GRID, "h-4"), "aria-hidden": "true", children: [
8077
- /* @__PURE__ */ jsx("span", {}),
8078
- /* @__PURE__ */ jsx("div", { className: "text-muted-foreground relative text-[11px] tabular-nums", children: ticksFor(view).map((t) => /* @__PURE__ */ jsx(
8079
- "span",
8080
- {
8081
- className: "absolute -translate-x-1/2",
8082
- style: {
8083
- // rtl-ignore -- time axis inside the player's dir="ltr" timeline
8084
- left: `${viewFraction(t, view) * 100}%`
8185
+ /* @__PURE__ */ jsxs(
8186
+ "div",
8187
+ {
8188
+ id: lanesId,
8189
+ dir: "ltr",
8190
+ className: cn(
8191
+ "relative space-y-1.5",
8192
+ // No lane labels to line up with, so the waveform takes the full width.
8193
+ !showLanes && "[--tp-label:0px]"
8194
+ ),
8195
+ children: [
8196
+ /* @__PURE__ */ jsxs("div", { className: ROW_GRID, children: [
8197
+ /* @__PURE__ */ jsx("span", {}),
8198
+ /* @__PURE__ */ jsx(
8199
+ "div",
8200
+ {
8201
+ role: "slider",
8202
+ tabIndex: 0,
8203
+ "aria-label": labels.seek,
8204
+ "aria-valuemin": 0,
8205
+ "aria-valuemax": Math.round(duration),
8206
+ "aria-valuenow": Math.round(currentTime),
8207
+ "aria-valuetext": labels.seekValue(
8208
+ formatClock(currentTime),
8209
+ formatClock(duration)
8210
+ ),
8211
+ onKeyDown: onSeekKey,
8212
+ onClick: (e) => seekTo(timeAtPointer(e.clientX, e.currentTarget, view)),
8213
+ className: "focus-visible:ring-ring cursor-pointer rounded focus-visible:ring-2 focus-visible:outline-none",
8214
+ children: /* @__PURE__ */ jsx(Waveform, { peaks, view, currentTime })
8215
+ }
8216
+ )
8217
+ ] }),
8218
+ !showLanes ? null : visibleSpeakers.length > 0 ? /* @__PURE__ */ jsx(
8219
+ SpeakerLanes,
8220
+ {
8221
+ speakers: visibleSpeakers,
8222
+ segments: visibleSegments,
8223
+ view,
8224
+ playingId,
8225
+ onPlaySegment: playSegment,
8226
+ onPause: pause,
8227
+ onSeek: seekTo,
8228
+ labels
8085
8229
  },
8086
- children: formatClock(t)
8087
- },
8088
- t
8089
- )) })
8090
- ] }),
8091
- playheadVisible && /* @__PURE__ */ jsxs(
8092
- "div",
8093
- {
8094
- "aria-hidden": "true",
8095
- className: "pointer-events-none absolute inset-y-0",
8096
- style: {
8097
- // rtl-ignore -- time axis inside the player's dir="ltr" timeline
8098
- left: `calc(${TRACK_OFFSET} + (100% - ${TRACK_OFFSET}) * ${playhead})`
8099
- },
8100
- children: [
8101
- /* @__PURE__ */ jsx("span", { className: "bg-primary-600 absolute inset-y-0 w-0.5 -translate-x-1/2" }),
8102
- /* @__PURE__ */ jsx("span", { className: "bg-primary-800 absolute -top-5 -translate-x-1/2 rounded px-1 text-[10px] font-medium text-white tabular-nums", children: formatClock(currentTime) })
8103
- ]
8104
- }
8105
- )
8106
- ] }),
8107
- /* @__PURE__ */ jsxs("div", { dir: "ltr", className: cn(ROW_GRID, "mt-3 items-start"), children: [
8230
+ src ?? ""
8231
+ ) : /* @__PURE__ */ jsx("p", { className: "text-muted-foreground py-2 text-center text-xs", children: speakers.length ? labels.allSpeakersHidden : labels.noActivity }),
8232
+ /* @__PURE__ */ jsxs("div", { className: cn(ROW_GRID, "h-4"), "aria-hidden": "true", children: [
8233
+ /* @__PURE__ */ jsx("span", {}),
8234
+ /* @__PURE__ */ jsx("div", { className: "text-muted-foreground relative text-[11px] tabular-nums", children: ticksFor(view).map((t, i) => /* @__PURE__ */ jsx(
8235
+ "span",
8236
+ {
8237
+ className: cn(
8238
+ "absolute -translate-x-1/2",
8239
+ i % 2 === 1 && "hidden @md:inline"
8240
+ ),
8241
+ style: {
8242
+ // rtl-ignore -- time axis inside the player's dir="ltr" timeline
8243
+ left: `${viewFraction(t, view) * 100}%`
8244
+ },
8245
+ children: formatClock(t)
8246
+ },
8247
+ t
8248
+ )) })
8249
+ ] }),
8250
+ playheadVisible && /* @__PURE__ */ jsxs(
8251
+ "div",
8252
+ {
8253
+ "aria-hidden": "true",
8254
+ className: "pointer-events-none absolute inset-y-0",
8255
+ style: {
8256
+ // rtl-ignore -- time axis inside the player's dir="ltr" timeline
8257
+ left: `calc(${TRACK_OFFSET} + (100% - ${TRACK_OFFSET}) * ${playhead})`
8258
+ },
8259
+ children: [
8260
+ /* @__PURE__ */ jsx("span", { className: "bg-primary-600 absolute inset-y-0 w-0.5 -translate-x-1/2" }),
8261
+ /* @__PURE__ */ jsx("span", { className: "bg-primary-800 absolute -top-5 -translate-x-1/2 rounded px-1 text-[10px] font-medium text-white tabular-nums", children: formatClock(currentTime) })
8262
+ ]
8263
+ }
8264
+ )
8265
+ ]
8266
+ }
8267
+ ),
8268
+ showLanes && /* @__PURE__ */ jsxs("div", { dir: "ltr", className: cn(ROW_GRID, "mt-3 items-start"), children: [
8108
8269
  /* @__PURE__ */ jsxs("div", { className: "flex items-center", children: [
8109
8270
  /* @__PURE__ */ jsx(
8110
8271
  Button,
@@ -8160,106 +8321,115 @@ function TranscriptPlayer({
8160
8321
  ]
8161
8322
  }
8162
8323
  ),
8163
- /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-1 gap-4 lg:grid-cols-[minmax(0,1fr)_18rem]", children: [
8164
- /* @__PURE__ */ jsxs(
8165
- "section",
8166
- {
8167
- "aria-labelledby": transcriptHeadingId,
8168
- className: "border-border bg-card text-card-foreground rounded-xl border p-4",
8169
- children: [
8170
- /* @__PURE__ */ jsxs("div", { className: "mb-3 flex flex-wrap items-center gap-3", children: [
8171
- /* @__PURE__ */ jsx("h3", { id: transcriptHeadingId, className: "text-base font-semibold", children: labels.transcript }),
8172
- /* @__PURE__ */ jsxs("div", { className: "relative min-w-40 flex-1", children: [
8173
- /* @__PURE__ */ jsx(
8174
- Search,
8175
- {
8176
- "aria-hidden": "true",
8177
- className: "text-muted-foreground pointer-events-none absolute start-2.5 top-1/2 h-4 w-4 -translate-y-1/2"
8178
- }
8179
- ),
8324
+ /* @__PURE__ */ jsxs(
8325
+ "div",
8326
+ {
8327
+ className: cn(
8328
+ "grid grid-cols-1 gap-4",
8329
+ showSpeakerPanel && "lg:grid-cols-[minmax(0,1fr)_18rem]"
8330
+ ),
8331
+ children: [
8332
+ /* @__PURE__ */ jsxs(
8333
+ "section",
8334
+ {
8335
+ "aria-labelledby": transcriptHeadingId,
8336
+ className: "border-border bg-card text-card-foreground rounded-xl border p-3 @md:p-4",
8337
+ children: [
8338
+ /* @__PURE__ */ jsxs("div", { className: "mb-3 flex flex-wrap items-center gap-3", children: [
8339
+ /* @__PURE__ */ jsx("h3", { id: transcriptHeadingId, className: "text-base font-semibold", children: labels.transcript }),
8340
+ /* @__PURE__ */ jsxs("div", { className: "relative min-w-40 flex-1", children: [
8341
+ /* @__PURE__ */ jsx(
8342
+ Search,
8343
+ {
8344
+ "aria-hidden": "true",
8345
+ className: "text-muted-foreground pointer-events-none absolute start-2.5 top-1/2 h-4 w-4 -translate-y-1/2"
8346
+ }
8347
+ ),
8348
+ /* @__PURE__ */ jsx(
8349
+ Input,
8350
+ {
8351
+ type: "search",
8352
+ label: labels.searchTranscript,
8353
+ hideLabel: true,
8354
+ placeholder: labels.searchPlaceholder,
8355
+ value: query,
8356
+ onChange: (e) => setQuery(e.target.value),
8357
+ size: "sm",
8358
+ className: "ps-8"
8359
+ }
8360
+ )
8361
+ ] }),
8362
+ /* @__PURE__ */ jsx(
8363
+ Select,
8364
+ {
8365
+ "aria-label": labels.showSpeakers,
8366
+ size: "sm",
8367
+ className: "w-44",
8368
+ value: filterValue,
8369
+ onValueChange: (v) => {
8370
+ if (v === ALL_SPEAKERS) setHidden(/* @__PURE__ */ new Set());
8371
+ else if (v.startsWith(SPEAKER_PREFIX)) {
8372
+ const id = v.slice(SPEAKER_PREFIX.length);
8373
+ setHidden(
8374
+ new Set(
8375
+ speakers.filter((s) => s.id !== id).map((s) => s.id)
8376
+ )
8377
+ );
8378
+ }
8379
+ },
8380
+ options: [
8381
+ { value: ALL_SPEAKERS, label: labels.allSpeakers },
8382
+ ...speakers.map((s) => ({
8383
+ value: SPEAKER_PREFIX + s.id,
8384
+ label: s.name
8385
+ })),
8386
+ ...filterValue === SOME_SPEAKERS ? [
8387
+ {
8388
+ value: SOME_SPEAKERS,
8389
+ label: labels.someSpeakers,
8390
+ disabled: true
8391
+ }
8392
+ ] : []
8393
+ ]
8394
+ }
8395
+ )
8396
+ ] }),
8180
8397
  /* @__PURE__ */ jsx(
8181
- Input,
8398
+ TranscriptList,
8182
8399
  {
8183
- type: "search",
8184
- label: labels.searchTranscript,
8185
- hideLabel: true,
8186
- placeholder: labels.searchPlaceholder,
8187
- value: query,
8188
- onChange: (e) => setQuery(e.target.value),
8189
- size: "sm",
8190
- className: "ps-8"
8191
- }
8192
- )
8193
- ] }),
8194
- /* @__PURE__ */ jsx(
8195
- Select,
8196
- {
8197
- "aria-label": labels.showSpeakers,
8198
- size: "sm",
8199
- className: "w-44",
8200
- value: filterValue,
8201
- onValueChange: (v) => {
8202
- if (v === ALL_SPEAKERS) setHidden(/* @__PURE__ */ new Set());
8203
- else if (v.startsWith(SPEAKER_PREFIX)) {
8204
- const id = v.slice(SPEAKER_PREFIX.length);
8205
- setHidden(
8206
- new Set(
8207
- speakers.filter((s) => s.id !== id).map((s) => s.id)
8208
- )
8209
- );
8210
- }
8400
+ utterances: shown,
8401
+ speakersById,
8402
+ activeId: active?.id ?? null,
8403
+ playingId,
8404
+ query,
8405
+ onPlay: playUtterance,
8406
+ onPause: pause,
8407
+ labels,
8408
+ emptyMessage: utterances.length === 0 ? labels.noTranscript : labels.noMatches
8211
8409
  },
8212
- options: [
8213
- { value: ALL_SPEAKERS, label: labels.allSpeakers },
8214
- ...speakers.map((s) => ({
8215
- value: SPEAKER_PREFIX + s.id,
8216
- label: s.name
8217
- })),
8218
- ...filterValue === SOME_SPEAKERS ? [
8219
- {
8220
- value: SOME_SPEAKERS,
8221
- label: labels.someSpeakers,
8222
- disabled: true
8223
- }
8224
- ] : []
8225
- ]
8226
- }
8227
- )
8228
- ] }),
8410
+ src ?? ""
8411
+ )
8412
+ ]
8413
+ }
8414
+ ),
8415
+ showSpeakerPanel && /* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
8229
8416
  /* @__PURE__ */ jsx(
8230
- TranscriptList,
8417
+ SpeakerPanel,
8231
8418
  {
8232
- utterances: shown,
8233
- speakersById,
8234
- activeId: active?.id ?? null,
8235
- playingId,
8236
- query,
8237
- onPlay: playUtterance,
8238
- onPause: pause,
8239
- labels,
8240
- emptyMessage: utterances.length === 0 ? labels.noTranscript : labels.noMatches
8241
- },
8242
- src ?? ""
8243
- )
8244
- ]
8245
- }
8246
- ),
8247
- /* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
8248
- /* @__PURE__ */ jsx(
8249
- SpeakerPanel,
8250
- {
8251
- speakers,
8252
- talkTime: talk,
8253
- duration,
8254
- hidden,
8255
- onToggle: toggleSpeaker,
8256
- overlapping,
8257
- labels
8258
- }
8259
- ),
8260
- /* @__PURE__ */ jsx("p", { className: "text-muted-foreground bg-muted/50 rounded-xl p-4 text-xs", children: labels.hint })
8261
- ] })
8262
- ] })
8419
+ speakers,
8420
+ talkTime: talk,
8421
+ duration,
8422
+ hidden,
8423
+ onToggle: toggleSpeaker,
8424
+ overlapping,
8425
+ labels
8426
+ }
8427
+ ),
8428
+ /* @__PURE__ */ jsx("p", { className: "text-muted-foreground bg-muted/50 rounded-xl p-4 text-xs", children: labels.hint })
8429
+ ] })
8430
+ ]
8431
+ }
8432
+ )
8263
8433
  ]
8264
8434
  }
8265
8435
  );
@@ -44555,6 +44725,6 @@ function WebsiteInputGroup({
44555
44725
  }
44556
44726
  WebsiteInputGroup.displayName = "WebsiteInputGroup";
44557
44727
 
44558
- 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, AuthButtons, AuthDialog, BUSINESS_HOURS_END_OF_DAY, BookAppointmentButton, BookingDialog, BusinessHours, BusinessHoursEditor, CSVColumnMapper, CSVFileUpload, CardSkeleton, CaseContextBar, CaseManagementHeader, CheckrIntegration, ClaimListingButton, ClaimProviderForm, CommandPalette, CommandPaletteProvider, CommandPaletteTrigger, CompactCookieBanner, CompactFilterBar, CompactHeader, CompactHours, CompactProviderHeader, ConnectionStatusBadge, ConnectionStatusBar, ConnectionStatusOverlay, ConsentSwitch, CookieConsentBanner, CopyrightText, CountBadge, CountryDropdown, CreateInvoiceModal, CreateReferralModal, DEFAULT_BUSINESS_HOURS_EDITOR_LABELS, DEFAULT_ERROR_CONFIGS, DEFAULT_LANGUAGES, DEFAULT_RADIUS_OPTIONS, DEFAULT_SERVICE_PRICING_MANAGER_LABELS, DEFAULT_SOCIAL_PROVIDERS, DEFAULT_TRANSCRIPT_PLAYER_LABELS, DOTBadge, DashboardWidget, DashboardWidgetActions, DashboardWidgetDataCards, DashboardWidgetInfo, DashboardWidgetTable, DateRangeFilter, DateRangePicker, DialogOverlay, DisclaimerText, DockablePanel, 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, HeyOzwellSelector, 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, MIN_ENROLL_SECONDS as NEMOTRON_MIN_ENROLL_SECONDS, NavLinks, NewsletterForm, NotFoundPage, NotificationCenter, OfflinePage, OnboardingCompletion, OnboardingStepQuestion, OnboardingWizard, OpenStatusBadge, OrderCard, OrderConfirmation, OrderConfirmationWizard, OrderDetailSidebar, OrderEditor, OrderList, OrderLookupForm, OrderSidebar, OrderSidebarTabs, OzwellChat, OzwellSettingsMenu, PageHeader, PatientHeader, PaymentHistoryTable, PaymentMethodBank, PaymentMethodCard, PaymentMethodList, PendingClaimsTable, PermissionsEditor, PillSelect, PresentingProblems, 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, TextAreaRich as RichTextArea, 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, TextAreaRich, TimelineEventList, TimelineProgress, Toast, ToastContainer, ToastProvider, TranscriptPlayer, UpdateAvailableOverlay, UserMenu, VerifiedBadge2 as VerifiedBadge, VisitScribe, VoiceManager, VoiceSetup, WEBSITE_TYPES, WebChartReportViewer, WebcamModal, WebsiteInput, WebsiteInputGroup, attributeSegments, calculateDateRange, centroid, chime, clusterEmbeddings, computePeaks, cosine, countBadgeVariants, countChipVariants, create24HourSchedule, createDefaultSchedule, createWeekdaySchedule, defaultCaseManagementHeaderLabels, defaultHeyOzwellSelectorLabels, defaultNemotronModel, defaultOrderTabs, defaultReconciliationIsEqual, formatAddressLines, formatAddressSingleLine, formatCityState, formatCityStateZip, generateId, getDefaultPresets, getExtendedPresets, getGoogleMapsSearchUrl, getGoogleMapsUrl, getWakeWarm, inferSpeakerRoles, isValidUrl, labelClusters, medicationToOrder, mergeTurns, normalizeClosingTime, openRollingRecorder, orderToMedication, parseTimeInput, panelVariants as reconciliationPanelVariants, subscribeWakeWarm, useCamera, useCommandPalette, useConnectionStatus, useCookieConsent, useDiarization, useDocumentDetection, useDropzone, useFileUpload, useHeyOzwell, useNemotronDiarization, useNemotronWakeVoices, useOptionalToast, useSidebar, useSpeakerVerify, useToast, useVisitScribe, useVoiceSetup, useWakeWord, warmNemotron, warmWakeModels, widgetVariants };
44728
+ 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, AuthButtons, AuthDialog, BUSINESS_HOURS_END_OF_DAY, BookAppointmentButton, BookingDialog, BusinessHours, BusinessHoursEditor, CSVColumnMapper, CSVFileUpload, CardSkeleton, CaseContextBar, CaseManagementHeader, CheckrIntegration, ClaimListingButton, ClaimProviderForm, CommandPalette, CommandPaletteProvider, CommandPaletteTrigger, CompactCookieBanner, CompactFilterBar, CompactHeader, CompactHours, CompactProviderHeader, ConnectionStatusBadge, ConnectionStatusBar, ConnectionStatusOverlay, ConsentSwitch, CookieConsentBanner, CopyrightText, CountBadge, CountryDropdown, CreateInvoiceModal, CreateReferralModal, DEFAULT_BUSINESS_HOURS_EDITOR_LABELS, DEFAULT_ERROR_CONFIGS, DEFAULT_LANGUAGES, DEFAULT_RADIUS_OPTIONS, DEFAULT_SERVICE_PRICING_MANAGER_LABELS, DEFAULT_SOCIAL_PROVIDERS, DEFAULT_TRANSCRIPT_PLAYER_LABELS, DOTBadge, DashboardWidget, DashboardWidgetActions, DashboardWidgetDataCards, DashboardWidgetInfo, DashboardWidgetTable, DateRangeFilter, DateRangePicker, DialogOverlay, DisclaimerText, DockablePanel, 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, HeyOzwellSelector, 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, MIN_ENROLL_SECONDS as NEMOTRON_MIN_ENROLL_SECONDS, NavLinks, NewsletterForm, NotFoundPage, NotificationCenter, OfflinePage, OnboardingCompletion, OnboardingStepQuestion, OnboardingWizard, OpenStatusBadge, OrderCard, OrderConfirmation, OrderConfirmationWizard, OrderDetailSidebar, OrderEditor, OrderList, OrderLookupForm, OrderSidebar, OrderSidebarTabs, OzwellChat, OzwellSettingsMenu, PageHeader, PatientHeader, PaymentHistoryTable, PaymentMethodBank, PaymentMethodCard, PaymentMethodList, PendingClaimsTable, PermissionsEditor, PillSelect, PresentingProblems, 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, TextAreaRich as RichTextArea, 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, TextAreaRich, TimelineEventList, TimelineProgress, Toast, ToastContainer, ToastProvider, TranscriptPlayer, UpdateAvailableOverlay, UserMenu, VerifiedBadge2 as VerifiedBadge, VisitScribe, VoiceManager, VoiceSetup, WEBSITE_TYPES, WebChartReportViewer, WebcamModal, WebsiteInput, WebsiteInputGroup, attributeSegments, calculateDateRange, centroid, chime, clusterEmbeddings, computePeaks, cosine, countBadgeVariants, countChipVariants, create24HourSchedule, createDefaultSchedule, createWeekdaySchedule, defaultCaseManagementHeaderLabels, defaultHeyOzwellSelectorLabels, defaultNemotronModel, defaultOrderTabs, defaultReconciliationIsEqual, formatAddressLines, formatAddressSingleLine, formatCityState, formatCityStateZip, generateId, getDefaultPresets, getExtendedPresets, getGoogleMapsSearchUrl, getGoogleMapsUrl, getWakeWarm, inferSpeakerRoles, isValidUrl, labelClusters, medicationToOrder, mergeTurns, normalizeClosingTime, openRollingRecorder, orderToMedication, parseTimeInput, panelVariants as reconciliationPanelVariants, subscribeWakeWarm, transcriptFromActivity, useCamera, useCommandPalette, useConnectionStatus, useCookieConsent, useDiarization, useDocumentDetection, useDropzone, useFileUpload, useHeyOzwell, useNemotronDiarization, useNemotronWakeVoices, useOptionalToast, useSidebar, useSpeakerVerify, useToast, useVisitScribe, useVoiceSetup, useWakeWord, warmNemotron, warmWakeModels, widgetVariants };
44559
44729
  //# sourceMappingURL=index.js.map
44560
44730
  //# sourceMappingURL=index.js.map