@k2b/ui 0.31.0 → 0.33.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (209) hide show
  1. package/dist/base.css +2 -0
  2. package/dist/browser/actions/Dropdown.js +159 -99
  3. package/dist/browser/actions/Dropdown.js.map +1 -1
  4. package/dist/browser/actions/FilterChip.js +113 -56
  5. package/dist/browser/actions/FilterChip.js.map +1 -1
  6. package/dist/browser/actions/ViewTabs.js +8 -0
  7. package/dist/browser/actions/ViewTabs.js.map +1 -1
  8. package/dist/browser/actions/filter-messages.js +26 -2
  9. package/dist/browser/actions/filter-messages.js.map +1 -1
  10. package/dist/browser/actions/menu-rows.js +23 -3
  11. package/dist/browser/actions/menu-rows.js.map +1 -1
  12. package/dist/browser/actions/menu-sheet.js +2 -7
  13. package/dist/browser/actions/menu-sheet.js.map +1 -1
  14. package/dist/browser/chat/ChatComposer.js +480 -403
  15. package/dist/browser/chat/ChatComposer.js.map +1 -1
  16. package/dist/browser/chat/chat-messages.js +14 -0
  17. package/dist/browser/chat/chat-messages.js.map +1 -1
  18. package/dist/browser/chat/index.js.map +1 -1
  19. package/dist/browser/content/Calendar.js +39 -29
  20. package/dist/browser/content/Calendar.js.map +1 -1
  21. package/dist/browser/content/CalendarDayView.js +159 -165
  22. package/dist/browser/content/CalendarDayView.js.map +1 -1
  23. package/dist/browser/content/Chart.js +104 -55
  24. package/dist/browser/content/Chart.js.map +1 -1
  25. package/dist/browser/content/ChartExplorer.js +5 -3
  26. package/dist/browser/content/ChartExplorer.js.map +1 -1
  27. package/dist/browser/content/MapView.js +4 -4
  28. package/dist/browser/content/MapView.js.map +1 -1
  29. package/dist/browser/content/MessageRow.js +607 -343
  30. package/dist/browser/content/MessageRow.js.map +1 -1
  31. package/dist/browser/content/ReactionBar.js +17 -0
  32. package/dist/browser/content/ReactionBar.js.map +1 -1
  33. package/dist/browser/content/chart-inspection-core.js +4 -1
  34. package/dist/browser/content/chart-inspection-core.js.map +1 -1
  35. package/dist/browser/content/code-highlight.js +66 -0
  36. package/dist/browser/content/code-highlight.js.map +1 -1
  37. package/dist/browser/content/index.js +2 -1
  38. package/dist/browser/content/index.js.map +1 -1
  39. package/dist/browser/content/map-view-live.js +47 -10
  40. package/dist/browser/content/map-view-live.js.map +1 -1
  41. package/dist/browser/content/map-view-types.js.map +1 -1
  42. package/dist/browser/feedback/dialog-core.js +6 -0
  43. package/dist/browser/feedback/dialog-core.js.map +1 -1
  44. package/dist/browser/inputs/AutocompleteEditor.js +167 -104
  45. package/dist/browser/inputs/AutocompleteEditor.js.map +1 -1
  46. package/dist/browser/inputs/RichSelect.js +1474 -0
  47. package/dist/browser/inputs/RichSelect.js.map +1 -0
  48. package/dist/browser/inputs/TextInput.js +99 -61
  49. package/dist/browser/inputs/TextInput.js.map +1 -1
  50. package/dist/browser/inputs/choice.js +19 -8
  51. package/dist/browser/inputs/choice.js.map +1 -1
  52. package/dist/browser/inputs/index.js +1 -0
  53. package/dist/browser/inputs/index.js.map +1 -1
  54. package/dist/browser/inputs/rich-select-messages.js +46 -0
  55. package/dist/browser/inputs/rich-select-messages.js.map +1 -0
  56. package/dist/browser/intl/shortcut-messages.js +4 -0
  57. package/dist/browser/intl/shortcut-messages.js.map +1 -1
  58. package/dist/browser/intl/shortcut.js +4 -0
  59. package/dist/browser/intl/shortcut.js.map +1 -1
  60. package/dist/browser/layout/AppWorkspace.js +624 -565
  61. package/dist/browser/layout/AppWorkspace.js.map +1 -1
  62. package/dist/browser/layout/DetailPanel.js +10 -1
  63. package/dist/browser/layout/DetailPanel.js.map +1 -1
  64. package/dist/browser/layout/MobileShell.js +213 -38
  65. package/dist/browser/layout/MobileShell.js.map +1 -1
  66. package/dist/browser/layout/Navigation.js +14 -5
  67. package/dist/browser/layout/Navigation.js.map +1 -1
  68. package/dist/browser/layout/PageTitle.js +9 -3
  69. package/dist/browser/layout/PageTitle.js.map +1 -1
  70. package/dist/browser/layout/ResizeSeparator.js +8 -2
  71. package/dist/browser/layout/ResizeSeparator.js.map +1 -1
  72. package/dist/browser/layout/app-workspace-controller.js +192 -31
  73. package/dist/browser/layout/app-workspace-controller.js.map +1 -1
  74. package/dist/browser/layout/index.js +1 -0
  75. package/dist/browser/layout/index.js.map +1 -1
  76. package/dist/browser/layout/navigation-model.js.map +1 -1
  77. package/dist/browser/layout/resize-separator.js +25 -1
  78. package/dist/browser/layout/resize-separator.js.map +1 -1
  79. package/dist/browser/layout/scroll-fade.js +32 -5
  80. package/dist/browser/layout/scroll-fade.js.map +1 -1
  81. package/dist/browser/surfaces/NoticeCard.js +46 -30
  82. package/dist/browser/surfaces/NoticeCard.js.map +1 -1
  83. package/dist/browser/surfaces/Skeleton.js +14 -0
  84. package/dist/browser/surfaces/Skeleton.js.map +1 -0
  85. package/dist/browser/surfaces/index.js +1 -0
  86. package/dist/browser/surfaces/index.js.map +1 -1
  87. package/dist/browser/surfaces/resource-messages.js +2 -2
  88. package/dist/browser/surfaces/resource-messages.js.map +1 -1
  89. package/dist/ssr/actions/Dropdown.js +51 -27
  90. package/dist/ssr/actions/Dropdown.js.map +1 -1
  91. package/dist/ssr/actions/FilterChip.js +67 -16
  92. package/dist/ssr/actions/FilterChip.js.map +1 -1
  93. package/dist/ssr/actions/ViewTabs.js +8 -0
  94. package/dist/ssr/actions/ViewTabs.js.map +1 -1
  95. package/dist/ssr/actions/filter-messages.js +26 -2
  96. package/dist/ssr/actions/filter-messages.js.map +1 -1
  97. package/dist/ssr/actions/menu-rows.js +23 -3
  98. package/dist/ssr/actions/menu-rows.js.map +1 -1
  99. package/dist/ssr/actions/menu-sheet.js +2 -7
  100. package/dist/ssr/actions/menu-sheet.js.map +1 -1
  101. package/dist/ssr/chat/ChatComposer.js +96 -67
  102. package/dist/ssr/chat/ChatComposer.js.map +1 -1
  103. package/dist/ssr/chat/chat-messages.js +14 -0
  104. package/dist/ssr/chat/chat-messages.js.map +1 -1
  105. package/dist/ssr/chat/index.js.map +1 -1
  106. package/dist/ssr/content/Calendar.js +40 -31
  107. package/dist/ssr/content/Calendar.js.map +1 -1
  108. package/dist/ssr/content/CalendarDayView.js +40 -48
  109. package/dist/ssr/content/CalendarDayView.js.map +1 -1
  110. package/dist/ssr/content/Chart.js +27 -7
  111. package/dist/ssr/content/Chart.js.map +1 -1
  112. package/dist/ssr/content/ChartExplorer.js +5 -3
  113. package/dist/ssr/content/ChartExplorer.js.map +1 -1
  114. package/dist/ssr/content/MapView.js +4 -4
  115. package/dist/ssr/content/MapView.js.map +1 -1
  116. package/dist/ssr/content/MessageRow.js +264 -91
  117. package/dist/ssr/content/MessageRow.js.map +1 -1
  118. package/dist/ssr/content/ReactionBar.js +17 -0
  119. package/dist/ssr/content/ReactionBar.js.map +1 -1
  120. package/dist/ssr/content/chart-inspection-core.js +4 -1
  121. package/dist/ssr/content/chart-inspection-core.js.map +1 -1
  122. package/dist/ssr/content/code-highlight.js +66 -0
  123. package/dist/ssr/content/code-highlight.js.map +1 -1
  124. package/dist/ssr/content/index.js +2 -1
  125. package/dist/ssr/content/index.js.map +1 -1
  126. package/dist/ssr/content/map-view-types.js.map +1 -1
  127. package/dist/ssr/feedback/dialog-core.js +6 -0
  128. package/dist/ssr/feedback/dialog-core.js.map +1 -1
  129. package/dist/ssr/inputs/AutocompleteEditor.js +64 -24
  130. package/dist/ssr/inputs/AutocompleteEditor.js.map +1 -1
  131. package/dist/ssr/inputs/RichSelect.js +950 -0
  132. package/dist/ssr/inputs/RichSelect.js.map +1 -0
  133. package/dist/ssr/inputs/TextInput.js +44 -17
  134. package/dist/ssr/inputs/TextInput.js.map +1 -1
  135. package/dist/ssr/inputs/choice.js +19 -8
  136. package/dist/ssr/inputs/choice.js.map +1 -1
  137. package/dist/ssr/inputs/index.js +1 -0
  138. package/dist/ssr/inputs/index.js.map +1 -1
  139. package/dist/ssr/inputs/rich-select-messages.js +46 -0
  140. package/dist/ssr/inputs/rich-select-messages.js.map +1 -0
  141. package/dist/ssr/intl/shortcut-messages.js +4 -0
  142. package/dist/ssr/intl/shortcut-messages.js.map +1 -1
  143. package/dist/ssr/intl/shortcut.js +4 -0
  144. package/dist/ssr/intl/shortcut.js.map +1 -1
  145. package/dist/ssr/layout/AppWorkspace.js +166 -125
  146. package/dist/ssr/layout/AppWorkspace.js.map +1 -1
  147. package/dist/ssr/layout/DetailPanel.js +1 -1
  148. package/dist/ssr/layout/DetailPanel.js.map +1 -1
  149. package/dist/ssr/layout/MobileShell.js +100 -20
  150. package/dist/ssr/layout/MobileShell.js.map +1 -1
  151. package/dist/ssr/layout/Navigation.js +1 -1
  152. package/dist/ssr/layout/Navigation.js.map +1 -1
  153. package/dist/ssr/layout/PageTitle.js +9 -3
  154. package/dist/ssr/layout/PageTitle.js.map +1 -1
  155. package/dist/ssr/layout/ResizeSeparator.js +4 -1
  156. package/dist/ssr/layout/ResizeSeparator.js.map +1 -1
  157. package/dist/ssr/layout/app-workspace-controller.js +192 -31
  158. package/dist/ssr/layout/app-workspace-controller.js.map +1 -1
  159. package/dist/ssr/layout/index.js +1 -0
  160. package/dist/ssr/layout/index.js.map +1 -1
  161. package/dist/ssr/layout/navigation-model.js.map +1 -1
  162. package/dist/ssr/layout/resize-separator.js +25 -1
  163. package/dist/ssr/layout/resize-separator.js.map +1 -1
  164. package/dist/ssr/layout/scroll-fade.js +32 -5
  165. package/dist/ssr/layout/scroll-fade.js.map +1 -1
  166. package/dist/ssr/surfaces/NoticeCard.js +21 -12
  167. package/dist/ssr/surfaces/NoticeCard.js.map +1 -1
  168. package/dist/ssr/surfaces/Skeleton.js +8 -0
  169. package/dist/ssr/surfaces/Skeleton.js.map +1 -0
  170. package/dist/ssr/surfaces/index.js +1 -0
  171. package/dist/ssr/surfaces/index.js.map +1 -1
  172. package/dist/ssr/surfaces/resource-messages.js +2 -2
  173. package/dist/ssr/surfaces/resource-messages.js.map +1 -1
  174. package/dist/styles.css +1 -1
  175. package/dist/types/actions/Dropdown.d.ts +14 -0
  176. package/dist/types/actions/FilterChip.d.ts +11 -0
  177. package/dist/types/actions/filter-messages.d.ts +12 -0
  178. package/dist/types/actions/menu-rows.d.ts +7 -2
  179. package/dist/types/chat/ChatComposer.d.ts +13 -0
  180. package/dist/types/chat/chat-messages.d.ts +7 -0
  181. package/dist/types/chat/index.d.ts +1 -1
  182. package/dist/types/content/Calendar.d.ts +7 -0
  183. package/dist/types/content/Chart.d.ts +4 -2
  184. package/dist/types/content/ChartExplorer.d.ts +0 -1
  185. package/dist/types/content/MessageRow.d.ts +64 -2
  186. package/dist/types/content/code-highlight.d.ts +3 -1
  187. package/dist/types/content/index.d.ts +3 -2
  188. package/dist/types/content/map-view-live.d.ts +1 -1
  189. package/dist/types/content/map-view-types.d.ts +2 -0
  190. package/dist/types/feedback/dialog-core.d.ts +3 -0
  191. package/dist/types/inputs/AutocompleteEditor.d.ts +6 -1
  192. package/dist/types/inputs/RichSelect.d.ts +93 -0
  193. package/dist/types/inputs/TextInput.d.ts +5 -2
  194. package/dist/types/inputs/choice.d.ts +24 -4
  195. package/dist/types/inputs/index.d.ts +2 -0
  196. package/dist/types/inputs/rich-select-messages.d.ts +21 -0
  197. package/dist/types/intl/shortcut-messages.d.ts +2 -0
  198. package/dist/types/layout/AppWorkspace.d.ts +9 -0
  199. package/dist/types/layout/DetailPanel.d.ts +2 -0
  200. package/dist/types/layout/MobileShell.d.ts +52 -5
  201. package/dist/types/layout/app-workspace-controller.d.ts +2 -0
  202. package/dist/types/layout/index.d.ts +2 -1
  203. package/dist/types/layout/navigation-model.d.ts +2 -0
  204. package/dist/types/layout/resize-separator.d.ts +1 -0
  205. package/dist/types/layout/scroll-fade.d.ts +5 -0
  206. package/dist/types/surfaces/NoticeCard.d.ts +3 -0
  207. package/dist/types/surfaces/Skeleton.d.ts +6 -0
  208. package/dist/types/surfaces/index.d.ts +1 -0
  209. package/package.json +4 -4
@@ -1,5 +1,6 @@
1
1
  import { template as _$template } from "solid-js/web";
2
2
  import { delegateEvents as _$delegateEvents } from "solid-js/web";
3
+ import { setProperty as _$setProperty } from "solid-js/web";
3
4
  import { style as _$style } from "solid-js/web";
4
5
  import { runHydrationEvents as _$runHydrationEvents } from "solid-js/web";
5
6
  import { effect as _$effect } from "solid-js/web";
@@ -7,19 +8,22 @@ import { setAttribute as _$setAttribute } from "solid-js/web";
7
8
  import { getNextMarker as _$getNextMarker } from "solid-js/web";
8
9
  import { spread as _$spread } from "solid-js/web";
9
10
  import { mergeProps as _$mergeProps } from "solid-js/web";
10
- import { use as _$use } from "solid-js/web";
11
- import { createComponent as _$createComponent } from "solid-js/web";
12
11
  import { getNextElement as _$getNextElement } from "solid-js/web";
13
12
  import { insert as _$insert } from "solid-js/web";
13
+ import { createComponent as _$createComponent } from "solid-js/web";
14
+ import { use as _$use } from "solid-js/web";
14
15
  import { memo as _$memo } from "solid-js/web";
15
- var _tmpl$ = /*#__PURE__*/_$template(`<div class=k2b-autocomplete__placeholder aria-hidden=true>`),
16
- _tmpl$2 = /*#__PURE__*/_$template(`<div class=k2b-autocomplete__status role=status><i class="ti ti-loader-2 k2b-spin"aria-hidden=true></i>Loading suggestions`),
17
- _tmpl$3 = /*#__PURE__*/_$template(`<div popover=manual class=k2b-autocomplete__options role=presentation><div class=k2b-autocomplete__listbox role=listbox><!$><!/><!$><!/><!$><!/>`),
18
- _tmpl$4 = /*#__PURE__*/_$template(`<div class=k2b-autocomplete><div class=k2b-autocomplete__surface><!$><!/><div class=k2b-autocomplete__preview aria-hidden=true></div><textarea class=k2b-autocomplete__input></textarea></div><!$><!/>`),
19
- _tmpl$5 = /*#__PURE__*/_$template(`<div class=k2b-autocomplete__status data-error=true role=alert><i class="ti ti-alert-circle"aria-hidden=true></i><span></span><button type=button>`),
20
- _tmpl$6 = /*#__PURE__*/_$template(`<div class=k2b-autocomplete__option role=option><span></span><!$><!/>`),
21
- _tmpl$7 = /*#__PURE__*/_$template(`<small>`);
16
+ var _tmpl$ = /*#__PURE__*/_$template(`<div class=k2b-autocomplete__gutter aria-hidden=true>`),
17
+ _tmpl$2 = /*#__PURE__*/_$template(`<div class=k2b-autocomplete__placeholder aria-hidden=true>`),
18
+ _tmpl$3 = /*#__PURE__*/_$template(`<div class=k2b-autocomplete__status role=status><i class="ti ti-loader-2 k2b-spin"aria-hidden=true></i>Loading suggestions`),
19
+ _tmpl$4 = /*#__PURE__*/_$template(`<div popover=manual class=k2b-autocomplete__options role=presentation><div class=k2b-autocomplete__listbox role=listbox><!$><!/><!$><!/><!$><!/>`),
20
+ _tmpl$5 = /*#__PURE__*/_$template(`<div class=k2b-autocomplete><div class=k2b-autocomplete__surface><!$><!/><!$><!/><div class=k2b-autocomplete__preview aria-hidden=true></div><textarea class=k2b-autocomplete__input></textarea></div><!$><!/>`),
21
+ _tmpl$6 = /*#__PURE__*/_$template(`<div>`),
22
+ _tmpl$7 = /*#__PURE__*/_$template(`<div class=k2b-autocomplete__status data-error=true role=alert><i class="ti ti-alert-circle"aria-hidden=true></i><span></span><button type=button>`),
23
+ _tmpl$8 = /*#__PURE__*/_$template(`<div class=k2b-autocomplete__option role=option><span></span><!$><!/>`),
24
+ _tmpl$9 = /*#__PURE__*/_$template(`<small>`);
22
25
  import { createEffect, createMemo, createSignal, createUniqueId, For, onCleanup, onMount, Show, untrack } from "solid-js";
26
+ import { isServer } from "solid-js/web";
23
27
  import { createFieldMeta, Field, fieldControlAria } from "../internal/field";
24
28
  import { useUiMessages } from "../intl/messages";
25
29
  import { buildSuggestContext, createCompletionBehaviorState, detectQuery, displayLabel, plainTextHighlight, renderWithOverlay, resolveSuggestions } from "./completion";
@@ -31,6 +35,7 @@ export function AutocompleteEditor(props) {
31
35
  const meta = createFieldMeta(props.id);
32
36
  let textarea;
33
37
  let preview;
38
+ let gutter;
34
39
  let dropdown;
35
40
  let currentAbort = null;
36
41
  let currentTimer = null;
@@ -139,8 +144,13 @@ export function AutocompleteEditor(props) {
139
144
  setCompletionError(null);
140
145
  closeDropdown();
141
146
  };
147
+ createEffect(() => {
148
+ if (!props.readOnly) return;
149
+ completionBehavior.reset();
150
+ clearCompletion();
151
+ });
142
152
  const positionDropdown = () => {
143
- if (!dropdown?.isConnected || !textarea?.isConnected) return;
153
+ if (props.readOnly || !dropdown?.isConnected || !textarea?.isConnected) return;
144
154
  const anchor = preview?.querySelector("[data-completion-anchor]");
145
155
  const rect = anchor?.getBoundingClientRect() ?? textarea.getBoundingClientRect();
146
156
  const maxHeight = 260;
@@ -162,6 +172,7 @@ export function AutocompleteEditor(props) {
162
172
  };
163
173
  const isAbortError = error => error instanceof DOMException ? error.name === "AbortError" : Boolean(error && typeof error === "object" && "name" in error && error.name === "AbortError");
164
174
  const applySuggestionList = (context, suggestions) => {
175
+ if (props.readOnly) return;
165
176
  const currentText = localValue();
166
177
  const normalized = context.text.toLowerCase();
167
178
  const usable = suggestions.filter(suggestion => {
@@ -196,11 +207,11 @@ export function AutocompleteEditor(props) {
196
207
  const runAsync = async (context, promise, signal) => {
197
208
  try {
198
209
  const suggestions = await promise;
199
- if (signal.aborted) return;
210
+ if (signal.aborted || props.readOnly) return;
200
211
  setLoading(false);
201
212
  applySuggestionList(context, suggestions);
202
213
  } catch (error) {
203
- if (signal.aborted || isAbortError(error)) return;
214
+ if (signal.aborted || props.readOnly || isAbortError(error)) return;
204
215
  setLoading(false);
205
216
  setCompletionError(error instanceof Error ? error.message : completionMessages().suggestionsCouldNotLoad);
206
217
  setDropdownOpen(true);
@@ -208,7 +219,7 @@ export function AutocompleteEditor(props) {
208
219
  }
209
220
  };
210
221
  const startResolution = (context, signal) => {
211
- if (signal.aborted || !textarea) return;
222
+ if (signal.aborted || props.readOnly || !textarea) return;
212
223
  setCompletionError(null);
213
224
  setLoading(true);
214
225
  setDropdownOpen(true);
@@ -222,7 +233,7 @@ export function AutocompleteEditor(props) {
222
233
  void runAsync(context, result.promise, signal);
223
234
  }
224
235
  } catch (error) {
225
- if (signal.aborted || isAbortError(error)) return;
236
+ if (signal.aborted || props.readOnly || isAbortError(error)) return;
226
237
  setLoading(false);
227
238
  setCompletionError(error instanceof Error ? error.message : completionMessages().suggestionsCouldNotLoad);
228
239
  setDropdownOpen(true);
@@ -230,6 +241,7 @@ export function AutocompleteEditor(props) {
230
241
  }
231
242
  };
232
243
  const recomputeCompletion = () => {
244
+ if (props.readOnly) return clearCompletion();
233
245
  if (!textarea) return;
234
246
  const context = detectQuery(textarea, props.completions);
235
247
  if (!context) {
@@ -260,7 +272,7 @@ export function AutocompleteEditor(props) {
260
272
  }
261
273
  };
262
274
  const retryCompletion = () => {
263
- if (!textarea) return;
275
+ if (props.readOnly || !textarea) return;
264
276
  const context = detectQuery(textarea, props.completions);
265
277
  if (!context) return clearCompletion();
266
278
  currentAbort?.abort();
@@ -272,7 +284,7 @@ export function AutocompleteEditor(props) {
272
284
  const activateSuggestion = (index = state()?.selectedIndex ?? -1) => {
273
285
  const current = state();
274
286
  const active = current?.suggestions[index];
275
- if (!textarea || !current || !active) return false;
287
+ if (props.readOnly || !textarea || !current || !active) return false;
276
288
  if (!active.textEdit && active.text === current.context.text) {
277
289
  clearCompletion();
278
290
  return false;
@@ -317,6 +329,10 @@ export function AutocompleteEditor(props) {
317
329
  });
318
330
  });
319
331
  const onInput = event => {
332
+ if (props.readOnly) {
333
+ event.currentTarget.value = localValue();
334
+ return;
335
+ }
320
336
  if (event.inputType.startsWith("insert") && completionBehavior.tryExpand(event.currentTarget, props.completions)) {
321
337
  return;
322
338
  }
@@ -326,6 +342,13 @@ export function AutocompleteEditor(props) {
326
342
  };
327
343
  const onKeyDown = event => {
328
344
  if (!textarea || event.isComposing) return;
345
+ if (props.readOnly) {
346
+ if (event.key === "Enter" && props.onSubmit && (props.singleLine && !event.shiftKey && !event.metaKey && !event.ctrlKey && !event.altKey || !props.singleLine && (event.metaKey || event.ctrlKey))) {
347
+ event.preventDefault();
348
+ props.onSubmit();
349
+ }
350
+ return;
351
+ }
329
352
  if ((props.restoreExpansionOnBackspace ?? true) && event.key === "Backspace" && !event.metaKey && !event.ctrlKey && !event.altKey && !event.shiftKey && completionBehavior.tryRestore(textarea)) {
330
353
  event.preventDefault();
331
354
  return;
@@ -396,49 +419,76 @@ export function AutocompleteEditor(props) {
396
419
  return props.disabled;
397
420
  },
398
421
  get children() {
399
- var _el$ = _$getNextElement(_tmpl$4),
422
+ var _el$ = _$getNextElement(_tmpl$5),
400
423
  _el$2 = _el$.firstChild,
401
- _el$6 = _el$2.firstChild,
402
- [_el$7, _co$] = _$getNextMarker(_el$6.nextSibling),
403
- _el$4 = _el$7.nextSibling,
404
- _el$5 = _el$4.nextSibling,
405
- _el$15 = _el$2.nextSibling,
406
- [_el$16, _co$5] = _$getNextMarker(_el$15.nextSibling);
424
+ _el$7 = _el$2.firstChild,
425
+ [_el$8, _co$] = _$getNextMarker(_el$7.nextSibling),
426
+ _el$9 = _el$8.nextSibling,
427
+ [_el$0, _co$2] = _$getNextMarker(_el$9.nextSibling),
428
+ _el$5 = _el$0.nextSibling,
429
+ _el$6 = _el$5.nextSibling,
430
+ _el$18 = _el$2.nextSibling,
431
+ [_el$19, _co$6] = _$getNextMarker(_el$18.nextSibling);
407
432
  _$insert(_el$2, _$createComponent(Show, {
408
433
  get when() {
409
- return _$memo(() => !!!localValue())() && props.placeholder;
434
+ return props.lineNumbers;
410
435
  },
411
436
  get children() {
412
437
  var _el$3 = _$getNextElement(_tmpl$);
413
- _$insert(_el$3, () => props.placeholder);
438
+ var _ref$ = gutter;
439
+ typeof _ref$ === "function" ? _$use(_ref$, _el$3) : gutter = _el$3;
440
+ _$insert(_el$3, _$createComponent(For, {
441
+ get each() {
442
+ return localValue().split("\n");
443
+ },
444
+ children: (_, index) => (() => {
445
+ var _el$20 = _$getNextElement(_tmpl$6);
446
+ _$insert(_el$20, () => index() + 1);
447
+ _$effect(() => _$setAttribute(_el$20, "data-marked", props.markedLine === index() + 1 ? "true" : undefined));
448
+ return _el$20;
449
+ })()
450
+ }));
414
451
  return _el$3;
415
452
  }
416
- }), _el$7, _co$);
417
- var _ref$ = preview;
418
- typeof _ref$ === "function" ? _$use(_ref$, _el$4) : preview = _el$4;
419
- _el$5.addEventListener("blur", event => {
453
+ }), _el$8, _co$);
454
+ _$insert(_el$2, _$createComponent(Show, {
455
+ get when() {
456
+ return _$memo(() => !!!localValue())() && props.placeholder;
457
+ },
458
+ get children() {
459
+ var _el$4 = _$getNextElement(_tmpl$2);
460
+ _$insert(_el$4, () => props.placeholder);
461
+ return _el$4;
462
+ }
463
+ }), _el$0, _co$2);
464
+ var _ref$2 = preview;
465
+ typeof _ref$2 === "function" ? _$use(_ref$2, _el$5) : preview = _el$5;
466
+ _el$6.addEventListener("blur", event => {
420
467
  const next = event.relatedTarget;
421
468
  if (next && dropdown?.contains(next)) return;
422
469
  completionBehavior.reset();
423
470
  clearCompletion();
424
471
  });
425
- _el$5.addEventListener("compositionend", () => setComposing(false));
426
- _el$5.addEventListener("compositionstart", () => setComposing(true));
427
- _el$5.addEventListener("scroll", event => {
472
+ _el$6.addEventListener("compositionend", () => setComposing(false));
473
+ _el$6.addEventListener("compositionstart", () => setComposing(true));
474
+ _el$6.addEventListener("scroll", event => {
475
+ if (gutter) gutter.scrollTop = event.currentTarget.scrollTop;
428
476
  if (preview) {
429
477
  preview.scrollTop = event.currentTarget.scrollTop;
430
478
  preview.scrollLeft = event.currentTarget.scrollLeft;
431
479
  }
432
480
  if (dropdown?.matches(":popover-open")) positionDropdown();
433
481
  });
434
- _el$5.$$keydown = onKeyDown;
435
- _el$5.addEventListener("change", event => props.onValueCommit?.(event.currentTarget.value));
436
- _el$5.$$input = onInput;
482
+ _el$6.$$keydown = onKeyDown;
483
+ _el$6.addEventListener("change", event => {
484
+ if (!props.readOnly) props.onValueCommit?.(event.currentTarget.value);
485
+ });
486
+ _el$6.$$input = onInput;
437
487
  _$use(element => {
438
488
  textarea = element;
439
489
  props.textareaRef?.(element);
440
- }, _el$5);
441
- _$spread(_el$5, _$mergeProps({
490
+ }, _el$6);
491
+ _$spread(_el$6, _$mergeProps({
442
492
  get id() {
443
493
  return meta.controlId;
444
494
  },
@@ -448,6 +498,9 @@ export function AutocompleteEditor(props) {
448
498
  get disabled() {
449
499
  return props.disabled;
450
500
  },
501
+ get readOnly() {
502
+ return props.readOnly;
503
+ },
451
504
  get required() {
452
505
  return props.required;
453
506
  },
@@ -457,6 +510,9 @@ export function AutocompleteEditor(props) {
457
510
  get maxLength() {
458
511
  return props.maxLength;
459
512
  },
513
+ get wrap() {
514
+ return props.lineNumbers ? "off" : "soft";
515
+ },
460
516
  get rows() {
461
517
  return _$memo(() => !!props.singleLine)() ? 1 : props.lines ?? 3;
462
518
  }
@@ -469,66 +525,67 @@ export function AutocompleteEditor(props) {
469
525
  get ["aria-activedescendant"]() {
470
526
  return _$memo(() => !!(dropdownOpen() && state()))() ? optionId(state().selectedIndex) : undefined;
471
527
  }
472
- }), false, false);
528
+ }), false, true);
529
+ _$insert(_el$6, () => isServer ? `\n${localValue()}` : undefined);
473
530
  _$insert(_el$, _$createComponent(Show, {
474
531
  get when() {
475
532
  return state() || loading() || completionError();
476
533
  },
477
534
  get children() {
478
- var _el$8 = _$getNextElement(_tmpl$3),
479
- _el$9 = _el$8.firstChild,
480
- _el$1 = _el$9.firstChild,
481
- [_el$10, _co$2] = _$getNextMarker(_el$1.nextSibling),
482
- _el$11 = _el$10.nextSibling,
483
- [_el$12, _co$3] = _$getNextMarker(_el$11.nextSibling),
484
- _el$13 = _el$12.nextSibling,
485
- [_el$14, _co$4] = _$getNextMarker(_el$13.nextSibling);
486
- var _ref$2 = dropdown;
487
- typeof _ref$2 === "function" ? _$use(_ref$2, _el$8) : dropdown = _el$8;
488
- _$setAttribute(_el$9, "id", listboxId);
489
- _$insert(_el$9, _$createComponent(Show, {
535
+ var _el$1 = _$getNextElement(_tmpl$4),
536
+ _el$10 = _el$1.firstChild,
537
+ _el$12 = _el$10.firstChild,
538
+ [_el$13, _co$3] = _$getNextMarker(_el$12.nextSibling),
539
+ _el$14 = _el$13.nextSibling,
540
+ [_el$15, _co$4] = _$getNextMarker(_el$14.nextSibling),
541
+ _el$16 = _el$15.nextSibling,
542
+ [_el$17, _co$5] = _$getNextMarker(_el$16.nextSibling);
543
+ var _ref$3 = dropdown;
544
+ typeof _ref$3 === "function" ? _$use(_ref$3, _el$1) : dropdown = _el$1;
545
+ _$setAttribute(_el$10, "id", listboxId);
546
+ _$insert(_el$10, _$createComponent(Show, {
490
547
  get when() {
491
548
  return loading();
492
549
  },
493
550
  get children() {
494
- return _$getNextElement(_tmpl$2);
551
+ return _$getNextElement(_tmpl$3);
495
552
  }
496
- }), _el$10, _co$2);
497
- _$insert(_el$9, _$createComponent(Show, {
553
+ }), _el$13, _co$3);
554
+ _$insert(_el$10, _$createComponent(Show, {
498
555
  get when() {
499
556
  return completionError();
500
557
  },
501
558
  children: message => (() => {
502
- var _el$17 = _$getNextElement(_tmpl$5),
503
- _el$18 = _el$17.firstChild,
504
- _el$19 = _el$18.nextSibling,
505
- _el$20 = _el$19.nextSibling;
506
- _$insert(_el$19, message);
507
- _el$20.$$click = retryCompletion;
508
- _el$20.$$mousedown = event => event.preventDefault();
509
- _$insert(_el$20, () => messages().retry);
559
+ var _el$21 = _$getNextElement(_tmpl$7),
560
+ _el$22 = _el$21.firstChild,
561
+ _el$23 = _el$22.nextSibling,
562
+ _el$24 = _el$23.nextSibling;
563
+ _$insert(_el$23, message);
564
+ _el$24.$$click = retryCompletion;
565
+ _el$24.$$mousedown = event => event.preventDefault();
566
+ _$insert(_el$24, () => messages().retry);
510
567
  _$runHydrationEvents();
511
- return _el$17;
568
+ return _el$21;
512
569
  })()
513
- }), _el$12, _co$3);
514
- _$insert(_el$9, _$createComponent(For, {
570
+ }), _el$15, _co$4);
571
+ _$insert(_el$10, _$createComponent(For, {
515
572
  get each() {
516
573
  return state()?.suggestions ?? [];
517
574
  },
518
575
  children: (suggestion, index) => // biome-ignore lint/a11y/useKeyWithClickEvents: the owning textarea handles keyboard activation through aria-activedescendant.
519
576
  (() => {
520
- var _el$21 = _$getNextElement(_tmpl$6),
521
- _el$22 = _el$21.firstChild,
522
- _el$23 = _el$22.nextSibling,
523
- [_el$24, _co$6] = _$getNextMarker(_el$23.nextSibling);
524
- _el$21.$$click = () => {
577
+ var _el$25 = _$getNextElement(_tmpl$8),
578
+ _el$26 = _el$25.firstChild,
579
+ _el$27 = _el$26.nextSibling,
580
+ [_el$28, _co$7] = _$getNextMarker(_el$27.nextSibling);
581
+ _el$25.$$click = () => {
525
582
  activateSuggestion(index());
526
583
  textarea?.focus();
527
584
  };
528
- _el$21.$$mousedown = event => {
585
+ _el$25.$$mousedown = event => {
529
586
  event.preventDefault();
530
587
  };
531
- _el$21.addEventListener("mouseenter", () => {
588
+ _el$25.addEventListener("mouseenter", () => {
532
589
  const current = state();
533
590
  if (current) {
534
591
  setState({
@@ -537,24 +594,24 @@ export function AutocompleteEditor(props) {
537
594
  });
538
595
  }
539
596
  });
540
- _$insert(_el$22, () => displayLabel(suggestion, state().context.completion));
541
- _$insert(_el$21, _$createComponent(Show, {
597
+ _$insert(_el$26, () => displayLabel(suggestion, state().context.completion));
598
+ _$insert(_el$25, _$createComponent(Show, {
542
599
  get when() {
543
600
  return suggestion.hint;
544
601
  },
545
602
  children: hint => (() => {
546
- var _el$25 = _$getNextElement(_tmpl$7);
547
- _$insert(_el$25, hint);
548
- return _el$25;
603
+ var _el$29 = _$getNextElement(_tmpl$9);
604
+ _$insert(_el$29, hint);
605
+ return _el$29;
549
606
  })()
550
- }), _el$24, _co$6);
607
+ }), _el$28, _co$7);
551
608
  _$effect(_p$ => {
552
- var _v$0 = optionId(index()),
553
- _v$1 = index() === state()?.selectedIndex,
554
- _v$10 = loading() ? "true" : undefined;
555
- _v$0 !== _p$.e && _$setAttribute(_el$21, "id", _p$.e = _v$0);
556
- _v$1 !== _p$.t && _$setAttribute(_el$21, "aria-selected", _p$.t = _v$1);
557
- _v$10 !== _p$.a && _$setAttribute(_el$21, "data-loading", _p$.a = _v$10);
609
+ var _v$10 = optionId(index()),
610
+ _v$11 = index() === state()?.selectedIndex,
611
+ _v$12 = loading() ? "true" : undefined;
612
+ _v$10 !== _p$.e && _$setAttribute(_el$25, "id", _p$.e = _v$10);
613
+ _v$11 !== _p$.t && _$setAttribute(_el$25, "aria-selected", _p$.t = _v$11);
614
+ _v$12 !== _p$.a && _$setAttribute(_el$25, "data-loading", _p$.a = _v$12);
558
615
  return _p$;
559
616
  }, {
560
617
  e: undefined,
@@ -562,37 +619,41 @@ export function AutocompleteEditor(props) {
562
619
  a: undefined
563
620
  });
564
621
  _$runHydrationEvents();
565
- return _el$21;
622
+ return _el$25;
566
623
  })()
567
- }), _el$14, _co$4);
624
+ }), _el$17, _co$5);
568
625
  _$effect(_p$ => {
569
626
  var _v$ = completionMessages().completionSuggestions,
570
627
  _v$2 = completionMessages().suggestions;
571
- _v$ !== _p$.e && _$setAttribute(_el$8, "aria-label", _p$.e = _v$);
572
- _v$2 !== _p$.t && _$setAttribute(_el$9, "aria-label", _p$.t = _v$2);
628
+ _v$ !== _p$.e && _$setAttribute(_el$1, "aria-label", _p$.e = _v$);
629
+ _v$2 !== _p$.t && _$setAttribute(_el$10, "aria-label", _p$.t = _v$2);
573
630
  return _p$;
574
631
  }, {
575
632
  e: undefined,
576
633
  t: undefined
577
634
  });
578
- return _el$8;
635
+ return _el$1;
579
636
  }
580
- }), _el$16, _co$5);
637
+ }), _el$19, _co$6);
581
638
  _$effect(_p$ => {
582
- var _v$3 = useOverlay() ? "true" : undefined,
583
- _v$4 = props.singleLine ? "true" : undefined,
584
- _v$5 = props.fill && !props.singleLine ? "true" : undefined,
585
- _v$6 = props.disabled ? "true" : undefined,
586
- _v$7 = error() ? "true" : undefined,
587
- _v$8 = props.variant === "paper" ? "paper" : undefined,
588
- _v$9 = surfaceStyle();
589
- _v$3 !== _p$.e && _$setAttribute(_el$, "data-overlay", _p$.e = _v$3);
590
- _v$4 !== _p$.t && _$setAttribute(_el$, "data-single-line", _p$.t = _v$4);
591
- _v$5 !== _p$.a && _$setAttribute(_el$, "data-fill", _p$.a = _v$5);
592
- _v$6 !== _p$.o && _$setAttribute(_el$, "data-disabled", _p$.o = _v$6);
593
- _v$7 !== _p$.i && _$setAttribute(_el$, "data-invalid", _p$.i = _v$7);
594
- _v$8 !== _p$.n && _$setAttribute(_el$, "data-variant", _p$.n = _v$8);
595
- _p$.s = _$style(_el$, _v$9, _p$.s);
639
+ var _v$3 = props.lineNumbers ? "true" : undefined,
640
+ _v$4 = useOverlay() ? "true" : undefined,
641
+ _v$5 = props.singleLine ? "true" : undefined,
642
+ _v$6 = props.fill && !props.singleLine ? "true" : undefined,
643
+ _v$7 = props.disabled ? "true" : undefined,
644
+ _v$8 = error() ? "true" : undefined,
645
+ _v$9 = props.variant === "paper" || props.variant === "embedded" ? props.variant : undefined,
646
+ _v$0 = surfaceStyle(),
647
+ _v$1 = isServer ? renderWithOverlay(localValue(), props.highlight ?? plainTextHighlight, {}) : undefined;
648
+ _v$3 !== _p$.e && _$setAttribute(_el$, "data-line-numbers", _p$.e = _v$3);
649
+ _v$4 !== _p$.t && _$setAttribute(_el$, "data-overlay", _p$.t = _v$4);
650
+ _v$5 !== _p$.a && _$setAttribute(_el$, "data-single-line", _p$.a = _v$5);
651
+ _v$6 !== _p$.o && _$setAttribute(_el$, "data-fill", _p$.o = _v$6);
652
+ _v$7 !== _p$.i && _$setAttribute(_el$, "data-disabled", _p$.i = _v$7);
653
+ _v$8 !== _p$.n && _$setAttribute(_el$, "data-invalid", _p$.n = _v$8);
654
+ _v$9 !== _p$.s && _$setAttribute(_el$, "data-variant", _p$.s = _v$9);
655
+ _p$.h = _$style(_el$, _v$0, _p$.h);
656
+ _v$1 !== _p$.r && _$setProperty(_el$5, "innerHTML", _p$.r = _v$1);
596
657
  return _p$;
597
658
  }, {
598
659
  e: undefined,
@@ -601,7 +662,9 @@ export function AutocompleteEditor(props) {
601
662
  o: undefined,
602
663
  i: undefined,
603
664
  n: undefined,
604
- s: undefined
665
+ s: undefined,
666
+ h: undefined,
667
+ r: undefined
605
668
  });
606
669
  _$runHydrationEvents();
607
670
  return _el$;