@anvia/react-ui 1.3.0 → 1.3.1

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 (131) hide show
  1. package/dist/attachment/index.d.ts +3 -21
  2. package/dist/attachment/index.js +3 -12
  3. package/dist/attachment-DsKTPumt.js +89 -0
  4. package/dist/attachment-DsKTPumt.js.map +1 -0
  5. package/dist/chat/index.d.ts +3 -152
  6. package/dist/chat/index.js +3 -25
  7. package/dist/chat-CAnvUEAv.js +1210 -0
  8. package/dist/chat-CAnvUEAv.js.map +1 -0
  9. package/dist/completion/index.d.ts +3 -29
  10. package/dist/completion/index.js +3 -16
  11. package/dist/completion-DDTKoZRJ.js +124 -0
  12. package/dist/completion-DDTKoZRJ.js.map +1 -0
  13. package/dist/connection-DeNq8wHS.js +203 -0
  14. package/dist/connection-DeNq8wHS.js.map +1 -0
  15. package/dist/contexts-B4ijG24z.js +212 -0
  16. package/dist/contexts-B4ijG24z.js.map +1 -0
  17. package/dist/elements-D4vmkkF8.js +19 -0
  18. package/dist/elements-D4vmkkF8.js.map +1 -0
  19. package/dist/graph-explorer/index.d.ts +54 -73
  20. package/dist/graph-explorer/index.d.ts.map +1 -0
  21. package/dist/graph-explorer/index.js +181 -248
  22. package/dist/graph-explorer/index.js.map +1 -1
  23. package/dist/human-input/index.d.ts +3 -78
  24. package/dist/human-input/index.js +3 -21
  25. package/dist/human-input-CsCbZomZ.js +314 -0
  26. package/dist/human-input-CsCbZomZ.js.map +1 -0
  27. package/dist/image/index.d.ts +3 -40
  28. package/dist/image/index.js +3 -12
  29. package/dist/image-D_7vaQCR.js +302 -0
  30. package/dist/image-D_7vaQCR.js.map +1 -0
  31. package/dist/index-B1Qs2Cjv.d.ts +145 -0
  32. package/dist/index-B1Qs2Cjv.d.ts.map +1 -0
  33. package/dist/index-BCBVcl0D.d.ts +277 -0
  34. package/dist/index-BCBVcl0D.d.ts.map +1 -0
  35. package/dist/index-CE22tsua.d.ts +20 -0
  36. package/dist/index-CE22tsua.d.ts.map +1 -0
  37. package/dist/index-CGqtpc6b.d.ts +25 -0
  38. package/dist/index-CGqtpc6b.d.ts.map +1 -0
  39. package/dist/index-DqdyM0Jm.d.ts +7 -0
  40. package/dist/index-DqdyM0Jm.d.ts.map +1 -0
  41. package/dist/index-Mw3ltwSG.d.ts +318 -0
  42. package/dist/index-Mw3ltwSG.d.ts.map +1 -0
  43. package/dist/index.d.ts +7 -40
  44. package/dist/index.js +34 -118
  45. package/dist/index.js.map +1 -1
  46. package/dist/message/index.d.ts +3 -105
  47. package/dist/message/index.js +3 -20
  48. package/dist/message-Dn3wW6yy.js +783 -0
  49. package/dist/message-Dn3wW6yy.js.map +1 -0
  50. package/dist/primitives-xfE7zfwJ.js +15 -0
  51. package/dist/primitives-xfE7zfwJ.js.map +1 -0
  52. package/dist/refs-Djj9rSvB.js +10 -0
  53. package/dist/refs-Djj9rSvB.js.map +1 -0
  54. package/dist/sandbox-desktop/index.d.ts +100 -104
  55. package/dist/sandbox-desktop/index.d.ts.map +1 -0
  56. package/dist/sandbox-desktop/index.js +344 -342
  57. package/dist/sandbox-desktop/index.js.map +1 -1
  58. package/dist/sandbox-terminal/index.d.ts +52 -56
  59. package/dist/sandbox-terminal/index.d.ts.map +1 -0
  60. package/dist/sandbox-terminal/index.js +217 -208
  61. package/dist/sandbox-terminal/index.js.map +1 -1
  62. package/dist/selection-toolbar/index.d.ts +3 -21
  63. package/dist/selection-toolbar/index.js +3 -13
  64. package/dist/selection-toolbar-CIkOoM-7.js +171 -0
  65. package/dist/selection-toolbar-CIkOoM-7.js.map +1 -0
  66. package/dist/shared-BSYElFU2.d.ts +2 -0
  67. package/dist/shared.d.ts +4 -14
  68. package/dist/shared.js +1 -43
  69. package/dist/stream/index.d.ts +2 -22
  70. package/dist/stream/index.js +1 -8
  71. package/dist/stream-CAO0x8_1.js +298 -0
  72. package/dist/stream-CAO0x8_1.js.map +1 -0
  73. package/dist/thread-list/index.d.ts +3 -47
  74. package/dist/thread-list/index.js +3 -18
  75. package/dist/thread-list-xJbGXFrE.js +228 -0
  76. package/dist/thread-list-xJbGXFrE.js.map +1 -0
  77. package/dist/ticket-CoJHBpdF.d.ts +32 -0
  78. package/dist/ticket-CoJHBpdF.d.ts.map +1 -0
  79. package/dist/value-BGGrx72L.js +13 -0
  80. package/dist/value-BGGrx72L.js.map +1 -0
  81. package/package.json +22 -22
  82. package/dist/attachment/index.js.map +0 -1
  83. package/dist/attachment-mbjsroli.d.ts +0 -9
  84. package/dist/chat/index.js.map +0 -1
  85. package/dist/chat-PSj1Fo4W.d.ts +0 -88
  86. package/dist/chunk-22EZJUPM.js +0 -120
  87. package/dist/chunk-22EZJUPM.js.map +0 -1
  88. package/dist/chunk-5FZKTDZR.js +0 -201
  89. package/dist/chunk-5FZKTDZR.js.map +0 -1
  90. package/dist/chunk-6XOJFLX4.js +0 -22
  91. package/dist/chunk-6XOJFLX4.js.map +0 -1
  92. package/dist/chunk-CKA4CE26.js +0 -25
  93. package/dist/chunk-CKA4CE26.js.map +0 -1
  94. package/dist/chunk-DLBNFBXQ.js +0 -425
  95. package/dist/chunk-DLBNFBXQ.js.map +0 -1
  96. package/dist/chunk-E73S3SOF.js +0 -404
  97. package/dist/chunk-E73S3SOF.js.map +0 -1
  98. package/dist/chunk-F6AKBUO3.js +0 -380
  99. package/dist/chunk-F6AKBUO3.js.map +0 -1
  100. package/dist/chunk-HGOPGZNQ.js +0 -195
  101. package/dist/chunk-HGOPGZNQ.js.map +0 -1
  102. package/dist/chunk-KHB5CHAU.js +0 -220
  103. package/dist/chunk-KHB5CHAU.js.map +0 -1
  104. package/dist/chunk-LHABOAOP.js +0 -316
  105. package/dist/chunk-LHABOAOP.js.map +0 -1
  106. package/dist/chunk-N5XQU36W.js +0 -410
  107. package/dist/chunk-N5XQU36W.js.map +0 -1
  108. package/dist/chunk-T3ZFZ3NP.js +0 -30
  109. package/dist/chunk-T3ZFZ3NP.js.map +0 -1
  110. package/dist/chunk-T4IYUEPH.js +0 -1612
  111. package/dist/chunk-T4IYUEPH.js.map +0 -1
  112. package/dist/chunk-W2AHKMRS.js +0 -1092
  113. package/dist/chunk-W2AHKMRS.js.map +0 -1
  114. package/dist/completion/index.js.map +0 -1
  115. package/dist/completion-input-DHlwrhxB.d.ts +0 -24
  116. package/dist/composer-6iCSIq6L.d.ts +0 -111
  117. package/dist/human-input/index.js.map +0 -1
  118. package/dist/human-input-CkLrZ8IC.d.ts +0 -27
  119. package/dist/image/index.js.map +0 -1
  120. package/dist/image-VZv6Ddsn.d.ts +0 -14
  121. package/dist/message/index.js.map +0 -1
  122. package/dist/message-CNRnZQwU.d.ts +0 -14
  123. package/dist/render-CRKWam2v.d.ts +0 -8
  124. package/dist/selection-toolbar/index.js.map +0 -1
  125. package/dist/selection-toolbar-Cwjbuv5S.d.ts +0 -14
  126. package/dist/shared.js.map +0 -1
  127. package/dist/stream/index.js.map +0 -1
  128. package/dist/thread-Bz6-1zaJ.d.ts +0 -12
  129. package/dist/thread-list/index.js.map +0 -1
  130. package/dist/thread-list-On8db4XL.d.ts +0 -34
  131. package/dist/ticket-pexI1zIa.d.ts +0 -33
@@ -1,220 +0,0 @@
1
- import {
2
- messageElementFromNode
3
- } from "./chunk-6XOJFLX4.js";
4
- import {
5
- renderPrimitive
6
- } from "./chunk-T3ZFZ3NP.js";
7
- import {
8
- InternalSelectionToolbarProvider,
9
- useSelectionToolbar
10
- } from "./chunk-E73S3SOF.js";
11
-
12
- // src/selection-toolbar/parts.tsx
13
- import {
14
- forwardRef,
15
- useCallback,
16
- useEffect,
17
- useMemo,
18
- useState
19
- } from "react";
20
- import { createPortal } from "react-dom";
21
- import { Fragment, jsx, jsxs } from "react/jsx-runtime";
22
- var SelectionToolbarRoot = forwardRef(
23
- function SelectionToolbarRoot2({ children, container, onQuote, onSelectionChange, style, ...props }, ref) {
24
- const [selection, setSelectionState] = useState();
25
- const portalContainer = container ?? globalThis.document?.body;
26
- const setSelection = useCallback(
27
- (nextSelection) => {
28
- setSelectionState((currentSelection) => {
29
- if (sameSelection(currentSelection, nextSelection)) {
30
- return currentSelection;
31
- }
32
- onSelectionChange?.(nextSelection);
33
- return nextSelection;
34
- });
35
- },
36
- [onSelectionChange]
37
- );
38
- const clear = useCallback(() => {
39
- globalThis.document?.getSelection()?.removeAllRanges();
40
- setSelection(void 0);
41
- }, [setSelection]);
42
- const copy = useCallback(async () => {
43
- if (selection === void 0) {
44
- return;
45
- }
46
- await globalThis.navigator?.clipboard?.writeText(selection.text);
47
- clear();
48
- }, [clear, selection]);
49
- const quote = useCallback(() => {
50
- if (selection === void 0) {
51
- return;
52
- }
53
- onQuote?.(selection);
54
- clear();
55
- }, [clear, onQuote, selection]);
56
- const value = useMemo(() => {
57
- const context = { quote, copy, clear };
58
- if (selection !== void 0) context.selection = selection;
59
- return context;
60
- }, [clear, copy, quote, selection]);
61
- useEffect(() => {
62
- const document = globalThis.document;
63
- if (document === void 0) {
64
- return;
65
- }
66
- const handleSelectionChange = () => {
67
- setSelection(selectionFromDocument(document));
68
- };
69
- document.addEventListener("selectionchange", handleSelectionChange);
70
- document.addEventListener("mouseup", handleSelectionChange);
71
- document.addEventListener("keyup", handleSelectionChange);
72
- document.addEventListener("scroll", handleSelectionChange, true);
73
- return () => {
74
- document.removeEventListener("selectionchange", handleSelectionChange);
75
- document.removeEventListener("mouseup", handleSelectionChange);
76
- document.removeEventListener("keyup", handleSelectionChange);
77
- document.removeEventListener("scroll", handleSelectionChange, true);
78
- };
79
- }, [setSelection]);
80
- if (selection === void 0 || portalContainer === void 0) {
81
- return null;
82
- }
83
- const toolbarStyle = {
84
- position: "fixed",
85
- top: selection.rect.top,
86
- left: selection.rect.left + selection.rect.width / 2,
87
- transform: "translate(-50%, calc(-100% - 8px))",
88
- ...style
89
- };
90
- const toolbar = /* @__PURE__ */ jsx(InternalSelectionToolbarProvider, { value, children: renderPrimitive(
91
- "div",
92
- {
93
- ...props,
94
- children: children ?? /* @__PURE__ */ jsxs(Fragment, { children: [
95
- /* @__PURE__ */ jsx(SelectionToolbarQuote, {}),
96
- /* @__PURE__ */ jsx(SelectionToolbarCopy, {})
97
- ] }),
98
- style: toolbarStyle,
99
- role: props.role ?? "toolbar"
100
- },
101
- ref
102
- ) });
103
- return createPortal(toolbar, portalContainer);
104
- }
105
- );
106
- var SelectionToolbarQuote = forwardRef(
107
- function SelectionToolbarQuote2({ onClick, ...props }, ref) {
108
- const { disabled, handleClick } = useSelectionToolbarAction("quote", props.disabled, onClick);
109
- return renderPrimitive(
110
- "button",
111
- {
112
- ...props,
113
- children: props.children ?? "Quote",
114
- disabled,
115
- onClick: handleClick,
116
- type: props.type ?? "button",
117
- "data-state": disabled ? "disabled" : "enabled"
118
- },
119
- ref
120
- );
121
- }
122
- );
123
- var SelectionToolbarCopy = forwardRef(
124
- function SelectionToolbarCopy2({ onClick, ...props }, ref) {
125
- const { disabled, handleClick } = useSelectionToolbarAction("copy", props.disabled, onClick);
126
- return renderPrimitive(
127
- "button",
128
- {
129
- ...props,
130
- children: props.children ?? "Copy",
131
- disabled,
132
- onClick: handleClick,
133
- type: props.type ?? "button",
134
- "data-state": disabled ? "disabled" : "enabled"
135
- },
136
- ref
137
- );
138
- }
139
- );
140
- function useSelectionToolbarAction(actionName, disabledProp, onClick) {
141
- const toolbar = useSelectionToolbar();
142
- const disabled = disabledProp ?? toolbar.selection === void 0;
143
- const action = toolbar[actionName];
144
- const handleClick = useCallback(
145
- (event) => {
146
- onClick?.(event);
147
- if (event.defaultPrevented || disabled) {
148
- return;
149
- }
150
- void action();
151
- },
152
- [action, disabled, onClick]
153
- );
154
- return { disabled, handleClick };
155
- }
156
- function selectionFromDocument(document) {
157
- const selection = document.getSelection();
158
- if (selection === null || selection.rangeCount === 0) {
159
- return void 0;
160
- }
161
- const text = selection.toString();
162
- if (text.trim().length === 0) {
163
- return void 0;
164
- }
165
- const anchorMessage = messageElementFromNode(selection.anchorNode);
166
- const focusMessage = messageElementFromNode(selection.focusNode);
167
- if (anchorMessage === void 0 || focusMessage === void 0 || anchorMessage.element !== focusMessage.element) {
168
- return void 0;
169
- }
170
- const range = selection.getRangeAt(0);
171
- return {
172
- text,
173
- messageId: anchorMessage.messageId,
174
- rect: selectionRect(range)
175
- };
176
- }
177
- function selectionRect(range) {
178
- const rangeWithRect = range;
179
- const rect = rangeWithRect.getBoundingClientRect?.();
180
- if (rect !== void 0 && (rect.width > 0 || rect.height > 0)) {
181
- return rect;
182
- }
183
- const firstRect = range.getClientRects().item(0);
184
- if (firstRect !== null) {
185
- return firstRect;
186
- }
187
- const DOMRectConstructor = globalThis.DOMRect;
188
- if (DOMRectConstructor !== void 0) {
189
- return new DOMRectConstructor(0, 0, 0, 0);
190
- }
191
- return {
192
- bottom: 0,
193
- height: 0,
194
- left: 0,
195
- right: 0,
196
- top: 0,
197
- width: 0,
198
- x: 0,
199
- y: 0,
200
- toJSON: () => ({})
201
- };
202
- }
203
- function sameSelection(currentSelection, nextSelection) {
204
- if (currentSelection === void 0 || nextSelection === void 0) {
205
- return currentSelection === nextSelection;
206
- }
207
- return currentSelection.text === nextSelection.text && currentSelection.messageId === nextSelection.messageId && currentSelection.rect.left === nextSelection.rect.left && currentSelection.rect.top === nextSelection.rect.top && currentSelection.rect.width === nextSelection.rect.width && currentSelection.rect.height === nextSelection.rect.height;
208
- }
209
-
210
- // src/selection-toolbar/index.ts
211
- var SelectionToolbarPrimitive = {
212
- Root: SelectionToolbarRoot,
213
- Quote: SelectionToolbarQuote,
214
- Copy: SelectionToolbarCopy
215
- };
216
-
217
- export {
218
- SelectionToolbarPrimitive
219
- };
220
- //# sourceMappingURL=chunk-KHB5CHAU.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/selection-toolbar/parts.tsx","../src/selection-toolbar/index.ts"],"sourcesContent":["import {\n type CSSProperties,\n forwardRef,\n type MouseEvent,\n type ReactNode,\n useCallback,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\n\nimport {\n InternalSelectionToolbarProvider,\n type SelectionToolbarContextValue,\n type SelectionToolbarSelection,\n useSelectionToolbar,\n} from \"../contexts\";\nimport { messageElementFromNode } from \"../message/elements\";\nimport { type PrimitiveProps, renderPrimitive } from \"../primitives\";\n\ntype SelectionToolbarRootProps = Omit<PrimitiveProps<\"div\">, \"children\"> & {\n children?: ReactNode;\n container?: Element | DocumentFragment;\n onQuote?: (selection: SelectionToolbarSelection) => void;\n onSelectionChange?: (selection: SelectionToolbarSelection | undefined) => void;\n};\n\nconst SelectionToolbarRoot = forwardRef<HTMLDivElement, SelectionToolbarRootProps>(\n function SelectionToolbarRoot(\n { children, container, onQuote, onSelectionChange, style, ...props },\n ref,\n ) {\n const [selection, setSelectionState] = useState<SelectionToolbarSelection | undefined>();\n const portalContainer = container ?? globalThis.document?.body;\n\n const setSelection = useCallback(\n (nextSelection: SelectionToolbarSelection | undefined) => {\n setSelectionState((currentSelection) => {\n if (sameSelection(currentSelection, nextSelection)) {\n return currentSelection;\n }\n onSelectionChange?.(nextSelection);\n return nextSelection;\n });\n },\n [onSelectionChange],\n );\n\n const clear = useCallback(() => {\n globalThis.document?.getSelection()?.removeAllRanges();\n setSelection(undefined);\n }, [setSelection]);\n\n const copy = useCallback(async () => {\n if (selection === undefined) {\n return;\n }\n await globalThis.navigator?.clipboard?.writeText(selection.text);\n clear();\n }, [clear, selection]);\n\n const quote = useCallback(() => {\n if (selection === undefined) {\n return;\n }\n onQuote?.(selection);\n clear();\n }, [clear, onQuote, selection]);\n\n const value = useMemo<SelectionToolbarContextValue>(() => {\n const context: SelectionToolbarContextValue = { quote, copy, clear };\n if (selection !== undefined) context.selection = selection;\n return context;\n }, [clear, copy, quote, selection]);\n\n useEffect(() => {\n const document = globalThis.document;\n if (document === undefined) {\n return;\n }\n\n const handleSelectionChange = () => {\n setSelection(selectionFromDocument(document));\n };\n\n document.addEventListener(\"selectionchange\", handleSelectionChange);\n document.addEventListener(\"mouseup\", handleSelectionChange);\n document.addEventListener(\"keyup\", handleSelectionChange);\n document.addEventListener(\"scroll\", handleSelectionChange, true);\n return () => {\n document.removeEventListener(\"selectionchange\", handleSelectionChange);\n document.removeEventListener(\"mouseup\", handleSelectionChange);\n document.removeEventListener(\"keyup\", handleSelectionChange);\n document.removeEventListener(\"scroll\", handleSelectionChange, true);\n };\n }, [setSelection]);\n\n if (selection === undefined || portalContainer === undefined) {\n return null;\n }\n\n const toolbarStyle: CSSProperties = {\n position: \"fixed\",\n top: selection.rect.top,\n left: selection.rect.left + selection.rect.width / 2,\n transform: \"translate(-50%, calc(-100% - 8px))\",\n ...style,\n };\n\n const toolbar = (\n <InternalSelectionToolbarProvider value={value}>\n {renderPrimitive(\n \"div\",\n {\n ...props,\n children: children ?? (\n <>\n <SelectionToolbarQuote />\n <SelectionToolbarCopy />\n </>\n ),\n style: toolbarStyle,\n role: props.role ?? \"toolbar\",\n } as PrimitiveProps<\"div\">,\n ref,\n )}\n </InternalSelectionToolbarProvider>\n );\n\n return createPortal(toolbar, portalContainer);\n },\n);\n\nconst SelectionToolbarQuote = forwardRef<HTMLButtonElement, PrimitiveProps<\"button\">>(\n function SelectionToolbarQuote({ onClick, ...props }, ref) {\n const { disabled, handleClick } = useSelectionToolbarAction(\"quote\", props.disabled, onClick);\n\n return renderPrimitive(\n \"button\",\n {\n ...props,\n children: props.children ?? \"Quote\",\n disabled,\n onClick: handleClick,\n type: props.type ?? \"button\",\n \"data-state\": disabled ? \"disabled\" : \"enabled\",\n } as PrimitiveProps<\"button\">,\n ref,\n );\n },\n);\n\nconst SelectionToolbarCopy = forwardRef<HTMLButtonElement, PrimitiveProps<\"button\">>(\n function SelectionToolbarCopy({ onClick, ...props }, ref) {\n const { disabled, handleClick } = useSelectionToolbarAction(\"copy\", props.disabled, onClick);\n\n return renderPrimitive(\n \"button\",\n {\n ...props,\n children: props.children ?? \"Copy\",\n disabled,\n onClick: handleClick,\n type: props.type ?? \"button\",\n \"data-state\": disabled ? \"disabled\" : \"enabled\",\n } as PrimitiveProps<\"button\">,\n ref,\n );\n },\n);\n\ntype SelectionToolbarAction = \"copy\" | \"quote\";\n\nfunction useSelectionToolbarAction(\n actionName: SelectionToolbarAction,\n disabledProp: boolean | undefined,\n onClick: ((event: MouseEvent<HTMLButtonElement>) => void) | undefined,\n): {\n disabled: boolean;\n handleClick(event: MouseEvent<HTMLButtonElement>): void;\n} {\n const toolbar = useSelectionToolbar();\n const disabled = disabledProp ?? toolbar.selection === undefined;\n const action = toolbar[actionName];\n const handleClick = useCallback(\n (event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n if (event.defaultPrevented || disabled) {\n return;\n }\n void action();\n },\n [action, disabled, onClick],\n );\n return { disabled, handleClick };\n}\n\nfunction selectionFromDocument(document: Document): SelectionToolbarSelection | undefined {\n const selection = document.getSelection();\n if (selection === null || selection.rangeCount === 0) {\n return undefined;\n }\n const text = selection.toString();\n if (text.trim().length === 0) {\n return undefined;\n }\n\n const anchorMessage = messageElementFromNode(selection.anchorNode);\n const focusMessage = messageElementFromNode(selection.focusNode);\n if (\n anchorMessage === undefined ||\n focusMessage === undefined ||\n anchorMessage.element !== focusMessage.element\n ) {\n return undefined;\n }\n\n const range = selection.getRangeAt(0);\n return {\n text,\n messageId: anchorMessage.messageId,\n rect: selectionRect(range),\n };\n}\n\nfunction selectionRect(range: Range): DOMRect {\n const rangeWithRect = range as Range & {\n getBoundingClientRect?: () => DOMRect;\n };\n const rect = rangeWithRect.getBoundingClientRect?.();\n if (rect !== undefined && (rect.width > 0 || rect.height > 0)) {\n return rect;\n }\n const firstRect = range.getClientRects().item(0);\n if (firstRect !== null) {\n return firstRect;\n }\n const DOMRectConstructor = globalThis.DOMRect;\n if (DOMRectConstructor !== undefined) {\n return new DOMRectConstructor(0, 0, 0, 0);\n }\n return {\n bottom: 0,\n height: 0,\n left: 0,\n right: 0,\n top: 0,\n width: 0,\n x: 0,\n y: 0,\n toJSON: () => ({}),\n } as DOMRect;\n}\n\nfunction sameSelection(\n currentSelection: SelectionToolbarSelection | undefined,\n nextSelection: SelectionToolbarSelection | undefined,\n): boolean {\n if (currentSelection === undefined || nextSelection === undefined) {\n return currentSelection === nextSelection;\n }\n return (\n currentSelection.text === nextSelection.text &&\n currentSelection.messageId === nextSelection.messageId &&\n currentSelection.rect.left === nextSelection.rect.left &&\n currentSelection.rect.top === nextSelection.rect.top &&\n currentSelection.rect.width === nextSelection.rect.width &&\n currentSelection.rect.height === nextSelection.rect.height\n );\n}\n\nexport { SelectionToolbarCopy, SelectionToolbarQuote, SelectionToolbarRoot };\n","import { SelectionToolbarCopy, SelectionToolbarQuote, SelectionToolbarRoot } from \"./parts\";\n\nexport const SelectionToolbarPrimitive = {\n Root: SelectionToolbarRoot,\n Quote: SelectionToolbarQuote,\n Copy: SelectionToolbarCopy,\n} as const;\n\nexport type { SelectionToolbarContextValue, SelectionToolbarSelection } from \"../contexts\";\nexport { useSelectionToolbar } from \"../contexts\";\n"],"mappings":"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","names":["SelectionToolbarRoot","SelectionToolbarQuote","SelectionToolbarCopy"]}
@@ -1,316 +0,0 @@
1
- import {
2
- composeRefs,
3
- renderPrimitive
4
- } from "./chunk-T3ZFZ3NP.js";
5
- import {
6
- InternalThreadListItemProvider,
7
- InternalThreadListRootProvider,
8
- useInternalThreadListRoot,
9
- useThreadList,
10
- useThreadListItem
11
- } from "./chunk-E73S3SOF.js";
12
-
13
- // src/thread-list/parts.tsx
14
- import {
15
- forwardRef,
16
- useCallback,
17
- useMemo,
18
- useRef
19
- } from "react";
20
- import { jsx } from "react/jsx-runtime";
21
- var ThreadListRoot = forwardRef(function ThreadListRoot2({ onKeyDown, ...props }, ref) {
22
- const threadList = useThreadList();
23
- const rootRef = useRef(null);
24
- const newButtonRef = useRef(null);
25
- const itemElements = useRef(/* @__PURE__ */ new Map());
26
- const triggerElements = useRef(/* @__PURE__ */ new Map());
27
- const registerItem = useCallback((threadId, element) => {
28
- if (element === null) itemElements.current.delete(threadId);
29
- else itemElements.current.set(threadId, element);
30
- }, []);
31
- const registerTrigger = useCallback((threadId, element) => {
32
- if (element === null) triggerElements.current.delete(threadId);
33
- else triggerElements.current.set(threadId, element);
34
- }, []);
35
- const rootContext = useMemo(
36
- () => ({
37
- rootRef,
38
- newButtonRef,
39
- itemElements,
40
- triggerElements,
41
- registerItem,
42
- registerTrigger
43
- }),
44
- [registerItem, registerTrigger]
45
- );
46
- const composedRef = useMemo(
47
- () => composeRefs(ref, (node) => {
48
- rootRef.current = node;
49
- }),
50
- [ref]
51
- );
52
- const handleKeyDown = useCallback(
53
- (event) => {
54
- onKeyDown?.(event);
55
- if (event.defaultPrevented || !["ArrowDown", "ArrowUp", "Home", "End"].includes(event.key)) {
56
- return;
57
- }
58
- const triggers = orderedEnabledTriggers(rootContext);
59
- if (triggers.length === 0) {
60
- return;
61
- }
62
- event.preventDefault();
63
- const activeElement = document.activeElement;
64
- const currentIndex = activeElement instanceof HTMLButtonElement ? triggers.indexOf(activeElement) : -1;
65
- const nextIndex = nextTriggerIndex(event.key, currentIndex, triggers.length);
66
- triggers[nextIndex]?.focus();
67
- },
68
- [onKeyDown, rootContext]
69
- );
70
- return /* @__PURE__ */ jsx(InternalThreadListRootProvider, { value: rootContext, children: renderPrimitive(
71
- "div",
72
- {
73
- ...props,
74
- onKeyDown: handleKeyDown,
75
- "data-state": threadList.status ?? "idle"
76
- },
77
- composedRef
78
- ) });
79
- });
80
- var ThreadListNew = forwardRef(
81
- function ThreadListNew2({ onClick, ...props }, ref) {
82
- const threadList = useThreadList();
83
- const root = useInternalThreadListRoot();
84
- const composedRef = useMemo(
85
- () => composeRefs(ref, (node) => {
86
- root.newButtonRef.current = node;
87
- }),
88
- [ref, root.newButtonRef]
89
- );
90
- const handleClick = useCallback(
91
- (event) => {
92
- onClick?.(event);
93
- if (event.defaultPrevented || props.disabled) {
94
- return;
95
- }
96
- void threadList.createThread();
97
- },
98
- [onClick, props.disabled, threadList]
99
- );
100
- return renderPrimitive(
101
- "button",
102
- {
103
- ...props,
104
- children: props.children ?? "New chat",
105
- onClick: handleClick,
106
- type: props.type ?? "button",
107
- "data-state": props.disabled ? "disabled" : "enabled"
108
- },
109
- composedRef
110
- );
111
- }
112
- );
113
- var ThreadListItems = forwardRef(function ThreadListItems2({ archived = false, children, keepMounted = false, ...props }, ref) {
114
- const threadList = useThreadList();
115
- const threads = threadList.threads.filter((thread) => Boolean(thread.archived) === archived);
116
- const empty = threads.length === 0;
117
- if (empty && !keepMounted) {
118
- return null;
119
- }
120
- return renderPrimitive(
121
- "div",
122
- {
123
- ...props,
124
- children: threads.map((thread) => /* @__PURE__ */ jsx(
125
- InternalThreadListItemProvider,
126
- {
127
- value: { thread, active: thread.id === threadList.activeThreadId },
128
- children: typeof children === "function" ? children(thread) : children ?? /* @__PURE__ */ jsx(DefaultThreadItem, {})
129
- },
130
- thread.id
131
- )),
132
- "data-state": empty ? "empty" : "populated"
133
- },
134
- ref
135
- );
136
- });
137
- var ThreadListEmpty = forwardRef(function ThreadListEmpty2({ archived = false, ...props }, ref) {
138
- const threadList = useThreadList();
139
- const hasVisibleThreads = threadList.threads.some(
140
- (thread) => Boolean(thread.archived) === archived
141
- );
142
- if (hasVisibleThreads) {
143
- return null;
144
- }
145
- return renderPrimitive(
146
- "div",
147
- {
148
- ...props,
149
- children: props.children ?? "No conversations."
150
- },
151
- ref
152
- );
153
- });
154
- var ThreadListItemRoot = forwardRef(
155
- function ThreadListItemRoot2(props, ref) {
156
- const item = useThreadListItem();
157
- const root = useInternalThreadListRoot();
158
- const composedRef = useMemo(
159
- () => composeRefs(ref, (node) => root.registerItem(item.thread.id, node)),
160
- [item.thread.id, ref, root]
161
- );
162
- return renderPrimitive(
163
- "div",
164
- {
165
- ...props,
166
- "data-state": item.active ? "active" : "inactive"
167
- },
168
- composedRef
169
- );
170
- }
171
- );
172
- var ThreadListItemTrigger = forwardRef(
173
- function ThreadListItemTrigger2({ onClick, ...props }, ref) {
174
- const threadList = useThreadList();
175
- const item = useThreadListItem();
176
- const root = useInternalThreadListRoot();
177
- const disabled = props.disabled ?? false;
178
- const composedRef = useMemo(
179
- () => composeRefs(ref, (node) => root.registerTrigger(item.thread.id, node)),
180
- [item.thread.id, ref, root]
181
- );
182
- const handleClick = useCallback(
183
- (event) => {
184
- onClick?.(event);
185
- if (event.defaultPrevented || disabled) {
186
- return;
187
- }
188
- void threadList.switchThread(item.thread.id);
189
- },
190
- [disabled, item.thread.id, onClick, threadList]
191
- );
192
- return renderPrimitive(
193
- "button",
194
- {
195
- ...props,
196
- children: props.children ?? /* @__PURE__ */ jsx(ThreadListItemTitle, {}),
197
- disabled,
198
- onClick: handleClick,
199
- type: props.type ?? "button",
200
- "aria-current": item.active ? "true" : void 0,
201
- "data-state": disabled ? "disabled" : "enabled"
202
- },
203
- composedRef
204
- );
205
- }
206
- );
207
- var ThreadListItemTitle = forwardRef(
208
- function ThreadListItemTitle2({ fallback = "New chat", ...props }, ref) {
209
- const { thread } = useThreadListItem();
210
- return renderPrimitive(
211
- "span",
212
- {
213
- ...props,
214
- children: props.children ?? thread.title ?? fallback
215
- },
216
- ref
217
- );
218
- }
219
- );
220
- function createThreadListItemAction(action, defaultLabel) {
221
- return forwardRef(function ThreadListItemAction({ onClick, ...props }, ref) {
222
- const threadList = useThreadList();
223
- const { thread } = useThreadListItem();
224
- const root = useInternalThreadListRoot();
225
- const actionHandler = threadList[action];
226
- const disabled = props.disabled ?? actionHandler === void 0;
227
- const handleClick = useCallback(
228
- (event) => {
229
- onClick?.(event);
230
- if (event.defaultPrevented || disabled) {
231
- return;
232
- }
233
- focusAfterThreadItemRemoval(thread.id, root);
234
- void actionHandler?.(thread.id);
235
- },
236
- [actionHandler, disabled, onClick, root, thread.id]
237
- );
238
- return renderPrimitive(
239
- "button",
240
- {
241
- ...props,
242
- children: props.children ?? defaultLabel,
243
- disabled,
244
- onClick: handleClick,
245
- type: props.type ?? "button",
246
- "data-state": disabled ? "disabled" : "enabled"
247
- },
248
- ref
249
- );
250
- });
251
- }
252
- var ThreadListItemArchive = createThreadListItemAction("archiveThread", "Archive");
253
- var ThreadListItemUnarchive = createThreadListItemAction("unarchiveThread", "Unarchive");
254
- var ThreadListItemDelete = createThreadListItemAction("deleteThread", "Delete");
255
- function DefaultThreadItem() {
256
- return /* @__PURE__ */ jsx(ThreadListItemRoot, { children: /* @__PURE__ */ jsx(ThreadListItemTrigger, {}) });
257
- }
258
- function nextTriggerIndex(key, currentIndex, triggerCount) {
259
- if (key === "Home") {
260
- return 0;
261
- }
262
- if (key === "End") {
263
- return triggerCount - 1;
264
- }
265
- if (currentIndex === -1) {
266
- return key === "ArrowUp" ? triggerCount - 1 : 0;
267
- }
268
- if (key === "ArrowUp") {
269
- return (currentIndex - 1 + triggerCount) % triggerCount;
270
- }
271
- return (currentIndex + 1) % triggerCount;
272
- }
273
- function focusAfterThreadItemRemoval(threadId, rootContext) {
274
- const root = rootContext.rootRef.current;
275
- const currentItem = rootContext.itemElements.current.get(threadId);
276
- if (root === null || currentItem === void 0 || !currentItem.contains(root.ownerDocument.activeElement)) {
277
- return;
278
- }
279
- const triggers = orderedEnabledTriggers(rootContext);
280
- const currentTrigger = rootContext.triggerElements.current.get(threadId);
281
- const currentIndex = currentTrigger === void 0 ? -1 : triggers.indexOf(currentTrigger);
282
- const remainingTriggers = triggers.filter((trigger) => !currentItem.contains(trigger));
283
- const fallback = rootContext.newButtonRef.current;
284
- const focusTarget = remainingTriggers[Math.min(Math.max(currentIndex, 0), remainingTriggers.length - 1)] ?? fallback ?? root;
285
- if (focusTarget === root && !root.hasAttribute("tabindex")) {
286
- root.tabIndex = -1;
287
- }
288
- focusTarget.focus();
289
- }
290
- function orderedEnabledTriggers(rootContext) {
291
- return [...rootContext.triggerElements.current.values()].filter((trigger) => trigger.isConnected && !trigger.disabled).sort(
292
- (left, right) => left.compareDocumentPosition(right) & Node.DOCUMENT_POSITION_FOLLOWING ? -1 : 1
293
- );
294
- }
295
-
296
- // src/thread-list/index.ts
297
- var ThreadListPrimitive = {
298
- Root: ThreadListRoot,
299
- New: ThreadListNew,
300
- Items: ThreadListItems,
301
- Empty: ThreadListEmpty
302
- };
303
- var ThreadListItemPrimitive = {
304
- Root: ThreadListItemRoot,
305
- Trigger: ThreadListItemTrigger,
306
- Title: ThreadListItemTitle,
307
- Archive: ThreadListItemArchive,
308
- Unarchive: ThreadListItemUnarchive,
309
- Delete: ThreadListItemDelete
310
- };
311
-
312
- export {
313
- ThreadListPrimitive,
314
- ThreadListItemPrimitive
315
- };
316
- //# sourceMappingURL=chunk-LHABOAOP.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/thread-list/parts.tsx","../src/thread-list/index.ts"],"sourcesContent":["import {\n forwardRef,\n type KeyboardEvent,\n type MouseEvent,\n type ReactNode,\n useCallback,\n useMemo,\n useRef,\n} from \"react\";\n\nimport {\n InternalThreadListItemProvider,\n InternalThreadListRootProvider,\n type ThreadListRecord,\n useInternalThreadListRoot,\n useThreadList,\n useThreadListItem,\n} from \"../contexts\";\nimport { composeRefs, type PrimitiveProps, renderPrimitive } from \"../primitives\";\n\ntype ThreadListRootProps = PrimitiveProps<\"div\">;\n\nconst ThreadListRoot = forwardRef<HTMLDivElement, ThreadListRootProps>(function ThreadListRoot(\n { onKeyDown, ...props },\n ref,\n) {\n const threadList = useThreadList();\n const rootRef = useRef<HTMLDivElement | null>(null);\n const newButtonRef = useRef<HTMLButtonElement | null>(null);\n const itemElements = useRef(new Map<string, HTMLDivElement>());\n const triggerElements = useRef(new Map<string, HTMLButtonElement>());\n const registerItem = useCallback((threadId: string, element: HTMLDivElement | null) => {\n if (element === null) itemElements.current.delete(threadId);\n else itemElements.current.set(threadId, element);\n }, []);\n const registerTrigger = useCallback((threadId: string, element: HTMLButtonElement | null) => {\n if (element === null) triggerElements.current.delete(threadId);\n else triggerElements.current.set(threadId, element);\n }, []);\n const rootContext = useMemo(\n () => ({\n rootRef,\n newButtonRef,\n itemElements,\n triggerElements,\n registerItem,\n registerTrigger,\n }),\n [registerItem, registerTrigger],\n );\n const composedRef = useMemo(\n () =>\n composeRefs<HTMLDivElement>(ref, (node) => {\n rootRef.current = node;\n }),\n [ref],\n );\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLDivElement>) => {\n onKeyDown?.(event);\n if (event.defaultPrevented || ![\"ArrowDown\", \"ArrowUp\", \"Home\", \"End\"].includes(event.key)) {\n return;\n }\n const triggers = orderedEnabledTriggers(rootContext);\n if (triggers.length === 0) {\n return;\n }\n event.preventDefault();\n const activeElement = document.activeElement;\n const currentIndex =\n activeElement instanceof HTMLButtonElement ? triggers.indexOf(activeElement) : -1;\n const nextIndex = nextTriggerIndex(event.key, currentIndex, triggers.length);\n triggers[nextIndex]?.focus();\n },\n [onKeyDown, rootContext],\n );\n\n return (\n <InternalThreadListRootProvider value={rootContext}>\n {renderPrimitive(\n \"div\",\n {\n ...props,\n onKeyDown: handleKeyDown,\n \"data-state\": threadList.status ?? \"idle\",\n } as PrimitiveProps<\"div\">,\n composedRef,\n )}\n </InternalThreadListRootProvider>\n );\n});\n\nconst ThreadListNew = forwardRef<HTMLButtonElement, PrimitiveProps<\"button\">>(\n function ThreadListNew({ onClick, ...props }, ref) {\n const threadList = useThreadList();\n const root = useInternalThreadListRoot();\n const composedRef = useMemo(\n () =>\n composeRefs<HTMLButtonElement>(ref, (node) => {\n root.newButtonRef.current = node;\n }),\n [ref, root.newButtonRef],\n );\n\n const handleClick = useCallback(\n (event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n if (event.defaultPrevented || props.disabled) {\n return;\n }\n void threadList.createThread();\n },\n [onClick, props.disabled, threadList],\n );\n\n return renderPrimitive(\n \"button\",\n {\n ...props,\n children: props.children ?? \"New chat\",\n onClick: handleClick,\n type: props.type ?? \"button\",\n \"data-state\": props.disabled ? \"disabled\" : \"enabled\",\n } as PrimitiveProps<\"button\">,\n composedRef,\n );\n },\n);\n\ntype ThreadListItemsChildren = ReactNode | ((thread: ThreadListRecord) => ReactNode);\n\ntype ThreadListItemsProps = Omit<PrimitiveProps<\"div\">, \"children\"> & {\n archived?: boolean;\n children?: ThreadListItemsChildren;\n keepMounted?: boolean;\n};\n\nconst ThreadListItems = forwardRef<HTMLDivElement, ThreadListItemsProps>(function ThreadListItems(\n { archived = false, children, keepMounted = false, ...props },\n ref,\n) {\n const threadList = useThreadList();\n const threads = threadList.threads.filter((thread) => Boolean(thread.archived) === archived);\n const empty = threads.length === 0;\n if (empty && !keepMounted) {\n return null;\n }\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n children: threads.map((thread) => (\n <InternalThreadListItemProvider\n key={thread.id}\n value={{ thread, active: thread.id === threadList.activeThreadId }}\n >\n {typeof children === \"function\" ? children(thread) : (children ?? <DefaultThreadItem />)}\n </InternalThreadListItemProvider>\n )),\n \"data-state\": empty ? \"empty\" : \"populated\",\n } as PrimitiveProps<\"div\">,\n ref,\n );\n});\n\ntype ThreadListEmptyProps = PrimitiveProps<\"div\"> & {\n archived?: boolean;\n};\n\nconst ThreadListEmpty = forwardRef<HTMLDivElement, ThreadListEmptyProps>(function ThreadListEmpty(\n { archived = false, ...props },\n ref,\n) {\n const threadList = useThreadList();\n const hasVisibleThreads = threadList.threads.some(\n (thread) => Boolean(thread.archived) === archived,\n );\n if (hasVisibleThreads) {\n return null;\n }\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n children: props.children ?? \"No conversations.\",\n } as PrimitiveProps<\"div\">,\n ref,\n );\n});\n\nconst ThreadListItemRoot = forwardRef<HTMLDivElement, PrimitiveProps<\"div\">>(\n function ThreadListItemRoot(props, ref) {\n const item = useThreadListItem();\n const root = useInternalThreadListRoot();\n const composedRef = useMemo(\n () => composeRefs<HTMLDivElement>(ref, (node) => root.registerItem(item.thread.id, node)),\n [item.thread.id, ref, root],\n );\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n \"data-state\": item.active ? \"active\" : \"inactive\",\n } as PrimitiveProps<\"div\">,\n composedRef,\n );\n },\n);\n\nconst ThreadListItemTrigger = forwardRef<HTMLButtonElement, PrimitiveProps<\"button\">>(\n function ThreadListItemTrigger({ onClick, ...props }, ref) {\n const threadList = useThreadList();\n const item = useThreadListItem();\n const root = useInternalThreadListRoot();\n const disabled = props.disabled ?? false;\n const composedRef = useMemo(\n () =>\n composeRefs<HTMLButtonElement>(ref, (node) => root.registerTrigger(item.thread.id, node)),\n [item.thread.id, ref, root],\n );\n\n const handleClick = useCallback(\n (event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n if (event.defaultPrevented || disabled) {\n return;\n }\n void threadList.switchThread(item.thread.id);\n },\n [disabled, item.thread.id, onClick, threadList],\n );\n\n return renderPrimitive(\n \"button\",\n {\n ...props,\n children: props.children ?? <ThreadListItemTitle />,\n disabled,\n onClick: handleClick,\n type: props.type ?? \"button\",\n \"aria-current\": item.active ? \"true\" : undefined,\n \"data-state\": disabled ? \"disabled\" : \"enabled\",\n } as PrimitiveProps<\"button\">,\n composedRef,\n );\n },\n);\n\ntype ThreadListItemTitleProps = PrimitiveProps<\"span\"> & {\n fallback?: ReactNode;\n};\n\nconst ThreadListItemTitle = forwardRef<HTMLSpanElement, ThreadListItemTitleProps>(\n function ThreadListItemTitle({ fallback = \"New chat\", ...props }, ref) {\n const { thread } = useThreadListItem();\n\n return renderPrimitive(\n \"span\",\n {\n ...props,\n children: props.children ?? thread.title ?? fallback,\n } as PrimitiveProps<\"span\">,\n ref,\n );\n },\n);\n\ntype ThreadListItemActionKey = \"archiveThread\" | \"unarchiveThread\" | \"deleteThread\";\nfunction createThreadListItemAction(action: ThreadListItemActionKey, defaultLabel: string) {\n return forwardRef<HTMLButtonElement, PrimitiveProps<\"button\">>(function ThreadListItemAction(\n { onClick, ...props },\n ref,\n ) {\n const threadList = useThreadList();\n const { thread } = useThreadListItem();\n const root = useInternalThreadListRoot();\n const actionHandler = threadList[action];\n const disabled = props.disabled ?? actionHandler === undefined;\n\n const handleClick = useCallback(\n (event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n if (event.defaultPrevented || disabled) {\n return;\n }\n focusAfterThreadItemRemoval(thread.id, root);\n void actionHandler?.(thread.id);\n },\n [actionHandler, disabled, onClick, root, thread.id],\n );\n\n return renderPrimitive(\n \"button\",\n {\n ...props,\n children: props.children ?? defaultLabel,\n disabled,\n onClick: handleClick,\n type: props.type ?? \"button\",\n \"data-state\": disabled ? \"disabled\" : \"enabled\",\n } as PrimitiveProps<\"button\">,\n ref,\n );\n });\n}\n\nconst ThreadListItemArchive = createThreadListItemAction(\"archiveThread\", \"Archive\");\nconst ThreadListItemUnarchive = createThreadListItemAction(\"unarchiveThread\", \"Unarchive\");\nconst ThreadListItemDelete = createThreadListItemAction(\"deleteThread\", \"Delete\");\n\nfunction DefaultThreadItem(): ReactNode {\n return (\n <ThreadListItemRoot>\n <ThreadListItemTrigger />\n </ThreadListItemRoot>\n );\n}\n\nfunction nextTriggerIndex(key: string, currentIndex: number, triggerCount: number): number {\n if (key === \"Home\") {\n return 0;\n }\n if (key === \"End\") {\n return triggerCount - 1;\n }\n if (currentIndex === -1) {\n return key === \"ArrowUp\" ? triggerCount - 1 : 0;\n }\n if (key === \"ArrowUp\") {\n return (currentIndex - 1 + triggerCount) % triggerCount;\n }\n return (currentIndex + 1) % triggerCount;\n}\n\nfunction focusAfterThreadItemRemoval(\n threadId: string,\n rootContext: ReturnType<typeof useInternalThreadListRoot>,\n): void {\n const root = rootContext.rootRef.current;\n const currentItem = rootContext.itemElements.current.get(threadId);\n if (\n root === null ||\n currentItem === undefined ||\n !currentItem.contains(root.ownerDocument.activeElement)\n ) {\n return;\n }\n\n const triggers = orderedEnabledTriggers(rootContext);\n const currentTrigger = rootContext.triggerElements.current.get(threadId);\n const currentIndex = currentTrigger === undefined ? -1 : triggers.indexOf(currentTrigger);\n const remainingTriggers = triggers.filter((trigger) => !currentItem.contains(trigger));\n const fallback = rootContext.newButtonRef.current;\n const focusTarget =\n remainingTriggers[Math.min(Math.max(currentIndex, 0), remainingTriggers.length - 1)] ??\n fallback ??\n root;\n\n if (focusTarget === root && !root.hasAttribute(\"tabindex\")) {\n root.tabIndex = -1;\n }\n focusTarget.focus();\n}\n\nfunction orderedEnabledTriggers(\n rootContext: ReturnType<typeof useInternalThreadListRoot>,\n): HTMLButtonElement[] {\n return [...rootContext.triggerElements.current.values()]\n .filter((trigger) => trigger.isConnected && !trigger.disabled)\n .sort((left, right) =>\n left.compareDocumentPosition(right) & Node.DOCUMENT_POSITION_FOLLOWING ? -1 : 1,\n );\n}\n\nexport {\n ThreadListEmpty,\n ThreadListItemArchive,\n ThreadListItemDelete,\n ThreadListItemRoot,\n ThreadListItems,\n ThreadListItemTitle,\n ThreadListItemTrigger,\n ThreadListItemUnarchive,\n ThreadListNew,\n ThreadListRoot,\n};\n","import {\n ThreadListEmpty,\n ThreadListItemArchive,\n ThreadListItemDelete,\n ThreadListItemRoot,\n ThreadListItems,\n ThreadListItemTitle,\n ThreadListItemTrigger,\n ThreadListItemUnarchive,\n ThreadListNew,\n ThreadListRoot,\n} from \"./parts\";\n\nexport const ThreadListPrimitive = {\n Root: ThreadListRoot,\n New: ThreadListNew,\n Items: ThreadListItems,\n Empty: ThreadListEmpty,\n} as const;\n\nexport const ThreadListItemPrimitive = {\n Root: ThreadListItemRoot,\n Trigger: ThreadListItemTrigger,\n Title: ThreadListItemTitle,\n Archive: ThreadListItemArchive,\n Unarchive: ThreadListItemUnarchive,\n Delete: ThreadListItemDelete,\n} as const;\n\nexport type {\n ThreadListController,\n ThreadListItemContextValue,\n ThreadListProviderProps,\n ThreadListRecord,\n} from \"../contexts\";\nexport { ThreadListProvider, useThreadList, useThreadListItem } from \"../contexts\";\n"],"mappings":"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","names":["ThreadListRoot","ThreadListNew","ThreadListItems","ThreadListEmpty","ThreadListItemRoot","ThreadListItemTrigger","ThreadListItemTitle"]}