@k2b/ui 0.18.0 → 0.20.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 (204) hide show
  1. package/README.md +3 -2
  2. package/dist/browser/actions/ContextMenu.js +3 -1
  3. package/dist/browser/actions/ContextMenu.js.map +1 -1
  4. package/dist/browser/actions/Dropdown.js +91 -46
  5. package/dist/browser/actions/Dropdown.js.map +1 -1
  6. package/dist/browser/actions/FilterChip.js +4 -1
  7. package/dist/browser/actions/FilterChip.js.map +1 -1
  8. package/dist/browser/actions/GestureMenu.js +467 -0
  9. package/dist/browser/actions/GestureMenu.js.map +1 -0
  10. package/dist/browser/actions/index.js +1 -0
  11. package/dist/browser/actions/index.js.map +1 -1
  12. package/dist/browser/chat/ChatComposer.js +1255 -534
  13. package/dist/browser/chat/ChatComposer.js.map +1 -1
  14. package/dist/browser/chat/ChatPrimitives.js +9 -3
  15. package/dist/browser/chat/ChatPrimitives.js.map +1 -1
  16. package/dist/browser/chat/ChatTimeline.js +19 -1
  17. package/dist/browser/chat/ChatTimeline.js.map +1 -1
  18. package/dist/browser/chat/chat-behavior.js +9 -0
  19. package/dist/browser/chat/chat-behavior.js.map +1 -1
  20. package/dist/browser/chat/index.js.map +1 -1
  21. package/dist/browser/chat/types.js.map +1 -1
  22. package/dist/browser/content/Calendar.js +579 -533
  23. package/dist/browser/content/Calendar.js.map +1 -1
  24. package/dist/browser/content/Lightbox.js +76 -40
  25. package/dist/browser/content/Lightbox.js.map +1 -1
  26. package/dist/browser/content/MessageRow.js +2 -2
  27. package/dist/browser/content/MessageRow.js.map +1 -1
  28. package/dist/browser/content/PdfPreview.js +146 -79
  29. package/dist/browser/content/PdfPreview.js.map +1 -1
  30. package/dist/browser/content/Timeline.js +1038 -0
  31. package/dist/browser/content/Timeline.js.map +1 -0
  32. package/dist/browser/content/VideoPlayer.js +29 -9
  33. package/dist/browser/content/VideoPlayer.js.map +1 -1
  34. package/dist/browser/content/chart-inspection.js +7 -2
  35. package/dist/browser/content/chart-inspection.js.map +1 -1
  36. package/dist/browser/content/index.js +1 -0
  37. package/dist/browser/content/index.js.map +1 -1
  38. package/dist/browser/content/timeline-model.js +579 -0
  39. package/dist/browser/content/timeline-model.js.map +1 -0
  40. package/dist/browser/feedback/dialog-core.js +26 -14
  41. package/dist/browser/feedback/dialog-core.js.map +1 -1
  42. package/dist/browser/inputs/ChoiceChips.js +66 -0
  43. package/dist/browser/inputs/ChoiceChips.js.map +1 -0
  44. package/dist/browser/inputs/ChoiceGroups.js +53 -12
  45. package/dist/browser/inputs/ChoiceGroups.js.map +1 -1
  46. package/dist/browser/inputs/FileInputs.js +48 -33
  47. package/dist/browser/inputs/FileInputs.js.map +1 -1
  48. package/dist/browser/inputs/SignatureInput.js +558 -0
  49. package/dist/browser/inputs/SignatureInput.js.map +1 -0
  50. package/dist/browser/inputs/TextInput.js +13 -1
  51. package/dist/browser/inputs/TextInput.js.map +1 -1
  52. package/dist/browser/inputs/emoji/EmojiPicker.js +841 -0
  53. package/dist/browser/inputs/emoji/EmojiPicker.js.map +1 -0
  54. package/dist/browser/inputs/emoji/emoji-data.js +1903 -0
  55. package/dist/browser/inputs/emoji/emoji-data.js.map +1 -0
  56. package/dist/browser/inputs/emoji/emoji-index.js +209 -0
  57. package/dist/browser/inputs/emoji/emoji-index.js.map +1 -0
  58. package/dist/browser/inputs/emoji/emoji-messages.js +64 -0
  59. package/dist/browser/inputs/emoji/emoji-messages.js.map +1 -0
  60. package/dist/browser/inputs/index.js +5 -0
  61. package/dist/browser/inputs/index.js.map +1 -1
  62. package/dist/browser/inputs/markdown/actions.js +6 -2
  63. package/dist/browser/inputs/markdown/actions.js.map +1 -1
  64. package/dist/browser/inputs/markdown/code-zone.js +38 -2
  65. package/dist/browser/inputs/markdown/code-zone.js.map +1 -1
  66. package/dist/browser/inputs/signature-messages.js +39 -0
  67. package/dist/browser/inputs/signature-messages.js.map +1 -0
  68. package/dist/browser/inputs/signature.js +208 -0
  69. package/dist/browser/inputs/signature.js.map +1 -0
  70. package/dist/browser/internal/render-error.js +49 -0
  71. package/dist/browser/internal/render-error.js.map +1 -0
  72. package/dist/browser/intl/messages.js +102 -0
  73. package/dist/browser/intl/messages.js.map +1 -1
  74. package/dist/browser/layout/AppWorkspace.js +321 -222
  75. package/dist/browser/layout/AppWorkspace.js.map +1 -1
  76. package/dist/browser/layout/FloatingWindow.js +4 -1
  77. package/dist/browser/layout/FloatingWindow.js.map +1 -1
  78. package/dist/browser/layout/SidebarItemPreview.js +5 -1
  79. package/dist/browser/layout/SidebarItemPreview.js.map +1 -1
  80. package/dist/browser/layout/index.js.map +1 -1
  81. package/dist/browser/surfaces/ResourceCard.js +212 -0
  82. package/dist/browser/surfaces/ResourceCard.js.map +1 -0
  83. package/dist/browser/surfaces/index.js +1 -0
  84. package/dist/browser/surfaces/index.js.map +1 -1
  85. package/dist/licenses/emojibase-data.txt +21 -0
  86. package/dist/ssr/actions/ContextMenu.js +3 -1
  87. package/dist/ssr/actions/ContextMenu.js.map +1 -1
  88. package/dist/ssr/actions/Dropdown.js +49 -12
  89. package/dist/ssr/actions/Dropdown.js.map +1 -1
  90. package/dist/ssr/actions/FilterChip.js +4 -1
  91. package/dist/ssr/actions/FilterChip.js.map +1 -1
  92. package/dist/ssr/actions/GestureMenu.js +411 -0
  93. package/dist/ssr/actions/GestureMenu.js.map +1 -0
  94. package/dist/ssr/actions/index.js +1 -0
  95. package/dist/ssr/actions/index.js.map +1 -1
  96. package/dist/ssr/chat/ChatComposer.js +767 -214
  97. package/dist/ssr/chat/ChatComposer.js.map +1 -1
  98. package/dist/ssr/chat/ChatPrimitives.js +9 -3
  99. package/dist/ssr/chat/ChatPrimitives.js.map +1 -1
  100. package/dist/ssr/chat/ChatTimeline.js +19 -1
  101. package/dist/ssr/chat/ChatTimeline.js.map +1 -1
  102. package/dist/ssr/chat/chat-behavior.js +9 -0
  103. package/dist/ssr/chat/chat-behavior.js.map +1 -1
  104. package/dist/ssr/chat/index.js.map +1 -1
  105. package/dist/ssr/chat/types.js.map +1 -1
  106. package/dist/ssr/content/Calendar.js +183 -142
  107. package/dist/ssr/content/Calendar.js.map +1 -1
  108. package/dist/ssr/content/Lightbox.js +19 -5
  109. package/dist/ssr/content/Lightbox.js.map +1 -1
  110. package/dist/ssr/content/MessageRow.js +2 -2
  111. package/dist/ssr/content/MessageRow.js.map +1 -1
  112. package/dist/ssr/content/PdfPreview.js +77 -36
  113. package/dist/ssr/content/PdfPreview.js.map +1 -1
  114. package/dist/ssr/content/Timeline.js +804 -0
  115. package/dist/ssr/content/Timeline.js.map +1 -0
  116. package/dist/ssr/content/VideoPlayer.js +29 -9
  117. package/dist/ssr/content/VideoPlayer.js.map +1 -1
  118. package/dist/ssr/content/chart-inspection.js +7 -2
  119. package/dist/ssr/content/chart-inspection.js.map +1 -1
  120. package/dist/ssr/content/index.js +1 -0
  121. package/dist/ssr/content/index.js.map +1 -1
  122. package/dist/ssr/content/timeline-model.js +579 -0
  123. package/dist/ssr/content/timeline-model.js.map +1 -0
  124. package/dist/ssr/feedback/dialog-core.js +26 -14
  125. package/dist/ssr/feedback/dialog-core.js.map +1 -1
  126. package/dist/ssr/inputs/ChoiceChips.js +66 -0
  127. package/dist/ssr/inputs/ChoiceChips.js.map +1 -0
  128. package/dist/ssr/inputs/ChoiceGroups.js +12 -4
  129. package/dist/ssr/inputs/ChoiceGroups.js.map +1 -1
  130. package/dist/ssr/inputs/FileInputs.js +19 -4
  131. package/dist/ssr/inputs/FileInputs.js.map +1 -1
  132. package/dist/ssr/inputs/SignatureInput.js +404 -0
  133. package/dist/ssr/inputs/SignatureInput.js.map +1 -0
  134. package/dist/ssr/inputs/TextInput.js +13 -1
  135. package/dist/ssr/inputs/TextInput.js.map +1 -1
  136. package/dist/ssr/inputs/emoji/EmojiPicker.js +551 -0
  137. package/dist/ssr/inputs/emoji/EmojiPicker.js.map +1 -0
  138. package/dist/ssr/inputs/emoji/emoji-data.js +1903 -0
  139. package/dist/ssr/inputs/emoji/emoji-data.js.map +1 -0
  140. package/dist/ssr/inputs/emoji/emoji-index.js +209 -0
  141. package/dist/ssr/inputs/emoji/emoji-index.js.map +1 -0
  142. package/dist/ssr/inputs/emoji/emoji-messages.js +64 -0
  143. package/dist/ssr/inputs/emoji/emoji-messages.js.map +1 -0
  144. package/dist/ssr/inputs/index.js +5 -0
  145. package/dist/ssr/inputs/index.js.map +1 -1
  146. package/dist/ssr/inputs/markdown/actions.js +6 -2
  147. package/dist/ssr/inputs/markdown/actions.js.map +1 -1
  148. package/dist/ssr/inputs/markdown/code-zone.js +38 -2
  149. package/dist/ssr/inputs/markdown/code-zone.js.map +1 -1
  150. package/dist/ssr/inputs/signature-messages.js +39 -0
  151. package/dist/ssr/inputs/signature-messages.js.map +1 -0
  152. package/dist/ssr/inputs/signature.js +208 -0
  153. package/dist/ssr/inputs/signature.js.map +1 -0
  154. package/dist/ssr/internal/render-error.js +49 -0
  155. package/dist/ssr/internal/render-error.js.map +1 -0
  156. package/dist/ssr/intl/messages.js +102 -0
  157. package/dist/ssr/intl/messages.js.map +1 -1
  158. package/dist/ssr/layout/AppWorkspace.js +112 -41
  159. package/dist/ssr/layout/AppWorkspace.js.map +1 -1
  160. package/dist/ssr/layout/FloatingWindow.js +4 -1
  161. package/dist/ssr/layout/FloatingWindow.js.map +1 -1
  162. package/dist/ssr/layout/SidebarItemPreview.js +5 -1
  163. package/dist/ssr/layout/SidebarItemPreview.js.map +1 -1
  164. package/dist/ssr/layout/index.js.map +1 -1
  165. package/dist/ssr/surfaces/ResourceCard.js +115 -0
  166. package/dist/ssr/surfaces/ResourceCard.js.map +1 -0
  167. package/dist/ssr/surfaces/index.js +1 -0
  168. package/dist/ssr/surfaces/index.js.map +1 -1
  169. package/dist/styles.css +1 -1
  170. package/dist/types/actions/Dropdown.d.ts +13 -1
  171. package/dist/types/actions/FilterChip.d.ts +5 -0
  172. package/dist/types/actions/GestureMenu.d.ts +35 -0
  173. package/dist/types/actions/index.d.ts +2 -0
  174. package/dist/types/chat/ChatComposer.d.ts +27 -1
  175. package/dist/types/chat/chat-behavior.d.ts +15 -0
  176. package/dist/types/chat/index.d.ts +1 -1
  177. package/dist/types/chat/types.d.ts +34 -0
  178. package/dist/types/content/Calendar.d.ts +28 -8
  179. package/dist/types/content/Lightbox.d.ts +8 -0
  180. package/dist/types/content/Timeline.d.ts +49 -0
  181. package/dist/types/content/index.d.ts +4 -2
  182. package/dist/types/content/timeline-model.d.ts +148 -0
  183. package/dist/types/feedback/dialog-core.d.ts +1 -1
  184. package/dist/types/inputs/ChoiceChips.d.ts +20 -0
  185. package/dist/types/inputs/ChoiceGroups.d.ts +11 -2
  186. package/dist/types/inputs/FileInputs.d.ts +6 -0
  187. package/dist/types/inputs/SignatureInput.d.ts +22 -0
  188. package/dist/types/inputs/emoji/EmojiPicker.d.ts +42 -0
  189. package/dist/types/inputs/emoji/emoji-data.d.ts +2 -0
  190. package/dist/types/inputs/emoji/emoji-index.d.ts +109 -0
  191. package/dist/types/inputs/emoji/emoji-messages.d.ts +30 -0
  192. package/dist/types/inputs/index.d.ts +10 -0
  193. package/dist/types/inputs/markdown/actions.d.ts +2 -0
  194. package/dist/types/inputs/markdown/code-zone.d.ts +7 -0
  195. package/dist/types/inputs/signature-messages.d.ts +11 -0
  196. package/dist/types/inputs/signature.d.ts +72 -0
  197. package/dist/types/internal/render-error.d.ts +13 -0
  198. package/dist/types/intl/messages.d.ts +51 -0
  199. package/dist/types/layout/AppWorkspace.d.ts +17 -0
  200. package/dist/types/layout/SidebarItemPreview.d.ts +2 -0
  201. package/dist/types/layout/index.d.ts +1 -1
  202. package/dist/types/surfaces/ResourceCard.d.ts +31 -0
  203. package/dist/types/surfaces/index.d.ts +2 -0
  204. package/package.json +6 -5
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sources":["inputs/SignatureInput.tsx"],"sourcesContent":["import { createEffect, createSignal, For, type JSX, on, Show, untrack } from \"solid-js\";\nimport { IconButton } from \"../actions/Button\";\nimport { SegmentedControl } from \"../actions/SegmentedControl\";\nimport { createFieldMeta, Field, fieldDescribedBy } from \"../internal/field\";\nimport { useUiMessages } from \"../intl/messages\";\nimport type { ValueFieldProps } from \"./field-contract\";\nimport { commitFieldValue, resolveMaybeAccessor } from \"./field-contract\";\nimport {\n drawingToSvg,\n type SignatureDrawing,\n type SignaturePoint,\n type SignatureValue,\n signatureName,\n strokeOutline,\n svgToDrawing,\n typedToSvg,\n} from \"./signature\";\nimport { useSignatureMessages } from \"./signature-messages\";\n\nexport type SignatureInputProps = ValueFieldProps<SignatureValue | null> & {\n /** Submits the value as JSON in a hidden input of this name. */\n name?: string;\n /** Shows the signature without allowing changes. */\n readOnly?: boolean;\n /**\n * Offers typing the name instead of drawing. Defaults to `true`: typing is the\n * keyboard and screen-reader path and helps people who cannot draw. Without\n * it, a typed value is still shown and can be cleared, but not edited.\n */\n allowTyped?: boolean;\n};\n\ntype SignatureMode = \"draw\" | \"type\";\n\n/** Base stroke width in drawing units (CSS pixels at the time of drawing). */\nconst STROKE_SIZE = 3.2;\n/** Points closer than this to the previous one add no shape, only path length. */\nconst MIN_POINT_DISTANCE = 1.2;\nconst EMPTY_SPACE = { x: 0, y: 0, width: 600, height: 200 };\n\nconst sameValue = (left: SignatureValue | null, right: SignatureValue | null) =>\n left === right ||\n (left !== null &&\n right !== null &&\n left.kind === right.kind &&\n left.svg === right.svg &&\n (left.kind === \"typed\" && right.kind === \"typed\" ? left.name === right.name : true));\n\nconst drawingOf = (value: SignatureValue | null): SignatureDrawing =>\n (value?.kind === \"drawn\" ? svgToDrawing(value.svg) : null) ?? { ...EMPTY_SPACE, strokes: [] };\n\nlet measureContext: CanvasRenderingContext2D | null | undefined;\nconst measureText = (text: string, font: string): number | undefined => {\n measureContext ??= document.createElement(\"canvas\").getContext(\"2d\");\n if (!measureContext) return undefined;\n measureContext.font = font;\n return measureContext.measureText(text).width;\n};\n\n/**\n * A signature field: draw with a finger, pen, or mouse, or type the name. The\n * value is an SVG document plus how it was given; `signatureToPng` turns it\n * into a bitmap. Legal evidence such as timestamps or hashes stays with the app.\n */\nexport function SignatureInput(props: SignatureInputProps): JSX.Element {\n const messages = useUiMessages();\n const text = useSignatureMessages();\n const meta = createFieldMeta(props.id);\n const requiredId = `${meta.controlId}-required`;\n const value = () => resolveMaybeAccessor(props.value) ?? null;\n const error = () => resolveMaybeAccessor(props.error);\n const allowTyped = () => props.allowTyped !== false;\n const editable = () => !props.disabled && !props.readOnly;\n\n const initial = untrack(value);\n const [mode, setMode] = createSignal<SignatureMode>(initial?.kind === \"typed\" ? \"type\" : \"draw\");\n const [drawing, setDrawing] = createSignal<SignatureDrawing>(drawingOf(initial));\n const [typedName, setTypedName] = createSignal(initial?.kind === \"typed\" ? initial.name : \"\");\n const [live, setLive] = createSignal(\"\");\n let svg: SVGSVGElement | undefined;\n let nameInput: HTMLInputElement | undefined;\n let lastReported: SignatureValue | null = initial;\n\n const drawnValue = (): SignatureValue | null => {\n const markup = drawingToSvg(drawing());\n return markup ? { kind: \"drawn\", svg: markup } : null;\n };\n const typedValue = (): SignatureValue | null => {\n const name = signatureName(typedName());\n if (!name) return null;\n const family = nameInput ? getComputedStyle(nameInput).fontFamily : \"cursive\";\n return { kind: \"typed\", name, svg: typedToSvg(name, family, measureText) };\n };\n const report = (next: SignatureValue | null, commit: boolean) => {\n if (sameValue(next, lastReported)) return;\n lastReported = next;\n if (commit) commitFieldValue(props, next);\n else props.onValueChange?.(next);\n };\n\n let stroke: { pointerId: number; pointerType: string; points: SignaturePoint[]; time: number } | null = null;\n /** Drops the stroke in progress without keeping its ink. */\n const abortStroke = () => {\n if (!stroke) return;\n const { pointerId } = stroke;\n stroke = null;\n setLive(\"\");\n if (svg?.hasPointerCapture(pointerId)) svg.releasePointerCapture(pointerId);\n };\n /** After Clear or the last Undo, keyboard focus moves from the now disabled button to the pad instead of the page. */\n const keepFocus = (button: HTMLElement) => {\n if (button.matches(\":focus-visible\")) queueMicrotask(() => svg?.focus());\n };\n\n // A value the parent sets (a stored signature, another record, a reset to null) replaces both inputs, so nothing of an\n // earlier signer stays behind the mode switch. Our own reports echo back unchanged.\n createEffect(\n on(\n value,\n (next) => {\n if (next === lastReported || sameValue(next, lastReported)) return;\n lastReported = next;\n abortStroke();\n setDrawing(drawingOf(next));\n setTypedName(next?.kind === \"typed\" ? next.name : \"\");\n if (next) setMode(next.kind === \"typed\" ? \"type\" : \"draw\");\n },\n { defer: true },\n ),\n );\n // A field that turns disabled or read-only, or leaves drawing, ends the stroke in progress without a value.\n createEffect(() => {\n if (!editable() || mode() !== \"draw\") abortStroke();\n });\n\n const switchMode = (next: SignatureMode) => {\n if (!editable() || next === mode()) return;\n setMode(next);\n report(next === \"draw\" ? drawnValue() : typedValue(), true);\n };\n const undo = (event: MouseEvent & { currentTarget: HTMLButtonElement }) => {\n if (!editable()) return;\n setDrawing((current) => ({ ...current, strokes: current.strokes.slice(0, -1) }));\n if (drawing().strokes.length === 0) keepFocus(event.currentTarget);\n report(drawnValue(), true);\n };\n const clear = (event: MouseEvent & { currentTarget: HTMLButtonElement }) => {\n if (!editable()) return;\n abortStroke();\n // Clear starts over in both modes. Without the Type option, a typed value it removes gives way to drawing.\n setTypedName(\"\");\n setDrawing((current) => ({ ...current, strokes: [] }));\n if (mode() === \"type\" && allowTyped()) {\n nameInput?.focus();\n } else {\n setMode(\"draw\");\n keepFocus(event.currentTarget);\n }\n report(null, true);\n };\n\n const toPoint = (event: PointerEvent): { x: number; y: number } | null => {\n const matrix = svg?.getScreenCTM();\n if (!matrix) return null;\n const point = new DOMPoint(event.clientX, event.clientY).matrixTransform(matrix.inverse());\n return { x: point.x, y: point.y };\n };\n const addPoint = (event: PointerEvent, force = false) => {\n if (!stroke) return;\n const position = toPoint(event);\n if (!position) return;\n const previous = stroke.points[stroke.points.length - 1];\n const distance = previous ? Math.hypot(position.x - previous.x, position.y - previous.y) : 0;\n if (previous && distance < MIN_POINT_DISTANCE && !force) return;\n let pressure: number;\n if (event.pointerType === \"pen\" && event.pressure > 0) {\n pressure = event.pressure;\n } else {\n // Without real pressure, faster movement draws a thinner line, as ink does.\n const elapsed = Math.max(1, event.timeStamp - stroke.time);\n const target = Math.min(1, Math.max(0.3, 1.1 - (distance / elapsed) * 0.3));\n pressure = previous ? previous.pressure * 0.6 + target * 0.4 : 0.6;\n }\n stroke.time = event.timeStamp;\n stroke.points.push({ ...position, pressure });\n setLive(strokeOutline(stroke.points, STROKE_SIZE));\n };\n /**\n * The drawing space after a stroke. It stays as it is while the ink lies inside it. Ink beyond it, drawn after the\n * pad changed its shape (a rotated phone, a resized window, a drawing from another device), grows the space to the\n * whole visible pad: the stored SVG then holds everything the signer saw, and the ink on the pad does not move.\n */\n const spaceAfter = (points: readonly SignaturePoint[]): Omit<SignatureDrawing, \"strokes\"> => {\n const { strokes: _, ...space } = drawing();\n const matrix = svg?.getScreenCTM();\n if (!svg || !matrix) return space;\n const box = svg.getBoundingClientRect();\n const inverse = matrix.inverse();\n const start = new DOMPoint(box.left, box.top).matrixTransform(inverse);\n const end = new DOMPoint(box.right, box.bottom).matrixTransform(inverse);\n // Ink reaches half the widest stroke past its points; what lies outside the pad was never visible and does not count.\n const reach = STROKE_SIZE / 2;\n let left = end.x;\n let top = end.y;\n let right = start.x;\n let bottom = start.y;\n for (const point of points) {\n left = Math.min(left, Math.max(start.x, point.x - reach));\n top = Math.min(top, Math.max(start.y, point.y - reach));\n right = Math.max(right, Math.min(end.x, point.x + reach));\n bottom = Math.max(bottom, Math.min(end.y, point.y + reach));\n }\n if (left >= space.x && top >= space.y && right <= space.x + space.width && bottom <= space.y + space.height) return space;\n const x = Math.min(space.x, start.x);\n const y = Math.min(space.y, start.y);\n return {\n x,\n y,\n width: Math.max(space.x + space.width, end.x) - x,\n height: Math.max(space.y + space.height, end.y) - y,\n };\n };\n const startStroke = (event: PointerEvent) => {\n // Only the primary contact draws: not a mouse's other buttons, a pen's barrel button, or its eraser.\n if (!editable() || !svg || event.button !== 0) return;\n // A pen takes over from a touch that is still down, such as a palm resting on a tablet.\n if (stroke?.pointerType === \"touch\" && event.pointerType === \"pen\") abortStroke();\n if (stroke) return;\n event.preventDefault();\n try {\n // Capture keeps the stroke when the pointer leaves the pad; a pointer that already ended cannot be captured.\n svg.setPointerCapture(event.pointerId);\n } catch {}\n if (drawing().strokes.length === 0) {\n // An empty pad adopts its current size, so one drawing unit is one CSS pixel while drawing.\n const box = svg.getBoundingClientRect();\n setDrawing({ x: 0, y: 0, width: Math.max(1, box.width), height: Math.max(1, box.height), strokes: [] });\n }\n stroke = { pointerId: event.pointerId, pointerType: event.pointerType, points: [], time: event.timeStamp };\n addPoint(event, true);\n };\n const moveStroke = (event: PointerEvent) => {\n if (stroke?.pointerId !== event.pointerId) return;\n event.preventDefault();\n const events = event.getCoalescedEvents?.() ?? [];\n for (const sample of events.length > 0 ? events : [event]) addPoint(sample);\n };\n const endStroke = (event: PointerEvent) => {\n if (!stroke || stroke.pointerId !== event.pointerId) return;\n addPoint(event, false);\n const { points } = stroke;\n const outline = strokeOutline(points, STROKE_SIZE);\n stroke = null;\n setLive(\"\");\n if (!outline) return;\n const space = spaceAfter(points);\n setDrawing((current) => ({ ...space, strokes: [...current.strokes, outline] }));\n report(drawnValue(), true);\n };\n // A cancelled pointer (an OS gesture, palm rejection) or lost capture is not a finished stroke.\n const cancelStroke = (event: PointerEvent) => {\n if (stroke?.pointerId === event.pointerId) abortStroke();\n };\n\n const empty = () => (mode() === \"draw\" ? drawing().strokes.length === 0 && !live() : !signatureName(typedName()));\n const serialized = () => {\n const current = value();\n return current ? JSON.stringify(current) : \"\";\n };\n\n return (\n <Field\n class={props.class}\n label={props.label}\n description={props.description}\n error={error()}\n meta={meta}\n labelFor={false}\n required={props.required}\n disabled={props.disabled}\n >\n <div\n id={meta.controlId}\n class=\"k2b-signature-input\"\n role=\"group\"\n aria-label={props.label ? undefined : props[\"aria-label\"]}\n aria-labelledby={props.label ? meta.labelId : undefined}\n aria-describedby={[props.required ? requiredId : undefined, fieldDescribedBy(meta, props)].filter(Boolean).join(\" \") || undefined}\n aria-invalid={error() ? \"true\" : undefined}\n data-mode={mode()}\n data-empty={empty() ? \"true\" : undefined}\n data-invalid={error() ? \"true\" : undefined}\n data-disabled={props.disabled ? \"true\" : undefined}\n data-readonly={props.readOnly ? \"true\" : undefined}\n >\n {/* A group cannot be marked required, so the required state is part of its description. */}\n <Show when={props.required}>\n <span id={requiredId} hidden>\n {messages().required}\n </span>\n </Show>\n <div class=\"k2b-signature-input__toolbar\">\n <Show when={allowTyped()}>\n <SegmentedControl\n class=\"k2b-signature-input__modes\"\n size=\"sm\"\n ariaLabel={text().method}\n options={[\n { value: \"draw\", label: text().draw, icon: \"ti ti-signature\" },\n { value: \"type\", label: text().type, icon: \"ti ti-keyboard\" },\n ]}\n value={mode}\n onValueChange={switchMode}\n disabled={!editable()}\n />\n </Show>\n <div class=\"k2b-signature-input__actions\">\n <IconButton\n size=\"sm\"\n variant=\"ghost\"\n label={text().undo}\n data-hidden={mode() === \"type\" ? \"true\" : undefined}\n disabled={!editable() || mode() !== \"draw\" || drawing().strokes.length === 0}\n onClick={undo}\n >\n <i class=\"ti ti-arrow-back-up\" aria-hidden=\"true\" />\n </IconButton>\n <IconButton size=\"sm\" variant=\"ghost\" label={messages().clear} disabled={!editable() || empty()} onClick={clear}>\n <i class=\"ti ti-eraser\" aria-hidden=\"true\" />\n </IconButton>\n </div>\n </div>\n <div class=\"k2b-signature-input__pad\">\n <span class=\"k2b-signature-input__line\" aria-hidden=\"true\" />\n <Show\n when={mode() === \"draw\"}\n fallback={\n <input\n ref={nameInput}\n class=\"k2b-signature-input__name\"\n type=\"text\"\n value={typedName()}\n placeholder={text().typeName}\n aria-label={text().typeName}\n aria-describedby={fieldDescribedBy(meta, props)}\n aria-invalid={error() ? \"true\" : undefined}\n aria-required={props.required || undefined}\n autocomplete=\"name\"\n autocapitalize=\"words\"\n spellcheck={false}\n disabled={props.disabled}\n readOnly={props.readOnly || !allowTyped()}\n onInput={(event) => {\n setTypedName(event.currentTarget.value);\n report(typedValue(), false);\n }}\n onChange={() => props.onValueCommit?.(typedValue())}\n />\n }\n >\n <span class=\"k2b-signature-input__placeholder\" aria-hidden=\"true\">\n <i class=\"ti ti-writing-sign\" aria-hidden=\"true\" />\n {text().signHere}\n </span>\n <svg\n ref={svg}\n class=\"k2b-signature-input__canvas\"\n role=\"img\"\n tabindex=\"-1\"\n aria-label={drawing().strokes.length > 0 ? text().drawn : text().drawArea}\n viewBox={`${drawing().x} ${drawing().y} ${drawing().width} ${drawing().height}`}\n preserveAspectRatio=\"xMidYMid meet\"\n onPointerDown={startStroke}\n onPointerMove={moveStroke}\n onPointerUp={endStroke}\n onPointerCancel={cancelStroke}\n onLostPointerCapture={(event) => {\n // A child path that held a touch's implicit capture hands it to the pad; only the pad's own loss counts.\n if (event.target === event.currentTarget) cancelStroke(event);\n }}\n >\n <g fill=\"currentColor\">\n <For each={drawing().strokes}>{(outline) => <path d={outline} />}</For>\n <Show when={live()}>\n <path d={live()} />\n </Show>\n </g>\n </svg>\n </Show>\n </div>\n </div>\n <Show when={props.name}>{(name) => <input type=\"hidden\" name={name()} value={serialized()} />}</Show>\n </Field>\n );\n}\n\nexport default SignatureInput;\n"],"mappings":";;;;;;;;;;;;;;AAAA,SAAS,YAAY,EAAE,YAAY,EAAE,GAAG,EAAY,EAAE,EAAE,IAAI,EAAE,OAAO,QAAQ,UAAU;AACvF,SAAS,UAAU,QAAQ,mBAAmB;AAC9C,SAAS,gBAAgB,QAAQ,6BAA6B;AAC9D,SAAS,eAAe,EAAE,KAAK,EAAE,gBAAgB,QAAQ,mBAAmB;AAC5E,SAAS,aAAa,QAAQ,kBAAkB;AAEhD,SAAS,gBAAgB,EAAE,oBAAoB,QAAQ,kBAAkB;AACzE,SACE,YAAY,EAIZ,aAAa,EACb,aAAa,EACb,YAAY,EACZ,UAAU,QACL,aAAa;AACpB,SAAS,oBAAoB,QAAQ,sBAAsB;AAiB3D;AACA,MAAM,WAAW,GAAG,GAAG;AACvB;AACA,MAAM,kBAAkB,GAAG,GAAG;AAC9B,MAAM,WAAW,GAAG;EAAE,CAAC,EAAE,CAAC;EAAE,CAAC,EAAE,CAAC;EAAE,KAAK,EAAE,GAAG;EAAE,MAAM,EAAE;AAAI,CAAC;AAE3D,MAAM,SAAS,GAAG,CAAC,IAA2B,EAAE,KAA4B,KAC1E,IAAI,KAAK,KAAK,IACb,IAAI,KAAK,IAAI,IACZ,KAAK,KAAK,IAAI,IACd,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,IACxB,IAAI,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG,KACrB,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,GAAG,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,GAAG,IAAI,CAAE;AAExF,MAAM,SAAS,GAAI,KAA4B,IAC7C,CAAC,KAAK,EAAE,IAAI,KAAK,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,KAAK;EAAE,GAAG,WAAW;EAAE,OAAO,EAAE;AAAG,CAAC;AAE/F,IAAI,cAA2D;AAC/D,MAAM,WAAW,GAAG,CAAC,IAAY,EAAE,IAAY,KAAyB;EACtE,cAAc,KAAK,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC;EACpE,IAAI,CAAC,cAAc,EAAE,OAAO,SAAS;EACrC,cAAc,CAAC,IAAI,GAAG,IAAI;EAC1B,OAAO,cAAc,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,KAAK;AAC/C,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA,OAAO,SAAS,cAAc,CAAC,KAA0B,EAAe;EACtE,MAAM,QAAQ,GAAG,aAAa,CAAC,CAAC;EAChC,MAAM,IAAI,GAAG,oBAAoB,CAAC,CAAC;EACnC,MAAM,IAAI,GAAG,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC;EACtC,MAAM,UAAU,GAAG,GAAG,IAAI,CAAC,SAAS,WAAW;EAC/C,MAAM,KAAK,GAAG,MAAM,oBAAoB,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,IAAI;EAC7D,MAAM,KAAK,GAAG,MAAM,oBAAoB,CAAC,KAAK,CAAC,KAAK,CAAC;EACrD,MAAM,UAAU,GAAG,MAAM,KAAK,CAAC,UAAU,KAAK,KAAK;EACnD,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,IAAI,CAAC,KAAK,CAAC,QAAQ;EAEzD,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC;EAC9B,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,YAAY,CAAgB,OAAO,EAAE,IAAI,KAAK,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;EAChG,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,YAAY,CAAmB,SAAS,CAAC,OAAO,CAAC,CAAC;EAChF,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,YAAY,CAAC,OAAO,EAAE,IAAI,KAAK,OAAO,GAAG,OAAO,CAAC,IAAI,GAAG,EAAE,CAAC;EAC7F,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,YAAY,CAAC,EAAE,CAAC;EACxC,IAAI,GAA8B;EAClC,IAAI,SAAuC;EAC3C,IAAI,YAAmC,GAAG,OAAO;EAEjD,MAAM,UAAU,GAAG,MAA6B;IAC9C,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;IACtC,OAAO,MAAM,GAAG;MAAE,IAAI,EAAE,OAAO;MAAE,GAAG,EAAE;IAAO,CAAC,GAAG,IAAI;EACvD,CAAC;EACD,MAAM,UAAU,GAAG,MAA6B;IAC9C,MAAM,IAAI,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC;IACvC,IAAI,CAAC,IAAI,EAAE,OAAO,IAAI;IACtB,MAAM,MAAM,GAAG,SAAS,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC,UAAU,GAAG,SAAS;IAC7E,OAAO;MAAE,IAAI,EAAE,OAAO;MAAE,IAAI;MAAE,GAAG,EAAE,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW;IAAE,CAAC;EAC5E,CAAC;EACD,MAAM,MAAM,GAAG,CAAC,IAA2B,EAAE,MAAe,KAAK;IAC/D,IAAI,SAAS,CAAC,IAAI,EAAE,YAAY,CAAC,EAAE;IACnC,YAAY,GAAG,IAAI;IACnB,IAAI,MAAM,EAAE,gBAAgB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,KACrC,KAAK,CAAC,aAAa,GAAG,IAAI,CAAC;EAClC,CAAC;EAED,IAAI,MAAiG,GAAG,IAAI;EAC5G;EACA,MAAM,WAAW,GAAG,MAAM;IACxB,IAAI,CAAC,MAAM,EAAE;IACb,MAAM;MAAE;IAAU,CAAC,GAAG,MAAM;IAC5B,MAAM,GAAG,IAAI;IACb,OAAO,CAAC,EAAE,CAAC;IACX,IAAI,GAAG,EAAE,iBAAiB,CAAC,SAAS,CAAC,EAAE,GAAG,CAAC,qBAAqB,CAAC,SAAS,CAAC;EAC7E,CAAC;EACD;EACA,MAAM,SAAS,GAAI,MAAmB,IAAK;IACzC,IAAI,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,cAAc,CAAC,MAAM,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;EAC1E,CAAC;;EAED;EACA;EACA,YAAY,CACV,EAAE,CACA,KAAK,EACJ,IAAI,IAAK;IACR,IAAI,IAAI,KAAK,YAAY,IAAI,SAAS,CAAC,IAAI,EAAE,YAAY,CAAC,EAAE;IAC5D,YAAY,GAAG,IAAI;IACnB,WAAW,CAAC,CAAC;IACb,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAC3B,YAAY,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,GAAG,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC;IACrD,IAAI,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,KAAK,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;EAC5D,CAAC,EACD;IAAE,KAAK,EAAE;EAAK,CAChB,CACF,CAAC;EACD;EACA,YAAY,CAAC,MAAM;IACjB,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,MAAM,EAAE,WAAW,CAAC,CAAC;EACrD,CAAC,CAAC;EAEF,MAAM,UAAU,GAAI,IAAmB,IAAK;IAC1C,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,IAAI,KAAK,IAAI,CAAC,CAAC,EAAE;IACpC,OAAO,CAAC,IAAI,CAAC;IACb,MAAM,CAAC,IAAI,KAAK,MAAM,GAAG,UAAU,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC;EAC7D,CAAC;EACD,MAAM,IAAI,GAAI,KAAwD,IAAK;IACzE,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE;IACjB,UAAU,CAAE,OAAO,KAAM;MAAE,GAAG,OAAO;MAAE,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;IAAE,CAAC,CAAC,CAAC;IAChF,IAAI,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,SAAS,CAAC,KAAK,CAAC,aAAa,CAAC;IAClE,MAAM,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC;EAC5B,CAAC;EACD,MAAM,KAAK,GAAI,KAAwD,IAAK;IAC1E,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE;IACjB,WAAW,CAAC,CAAC;IACb;IACA,YAAY,CAAC,EAAE,CAAC;IAChB,UAAU,CAAE,OAAO,KAAM;MAAE,GAAG,OAAO;MAAE,OAAO,EAAE;IAAG,CAAC,CAAC,CAAC;IACtD,IAAI,IAAI,CAAC,CAAC,KAAK,MAAM,IAAI,UAAU,CAAC,CAAC,EAAE;MACrC,SAAS,EAAE,KAAK,CAAC,CAAC;IACpB,CAAC,MAAM;MACL,OAAO,CAAC,MAAM,CAAC;MACf,SAAS,CAAC,KAAK,CAAC,aAAa,CAAC;IAChC;IACA,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC;EACpB,CAAC;EAED,MAAM,OAAO,GAAI,KAAmB,IAAsC;IACxE,MAAM,MAAM,GAAG,GAAG,EAAE,YAAY,CAAC,CAAC;IAClC,IAAI,CAAC,MAAM,EAAE,OAAO,IAAI;IACxB,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IAC1F,OAAO;MAAE,CAAC,EAAE,KAAK,CAAC,CAAC;MAAE,CAAC,EAAE,KAAK,CAAC;IAAE,CAAC;EACnC,CAAC;EACD,MAAM,QAAQ,GAAG,CAAC,KAAmB,EAAE,KAAK,GAAG,KAAK,KAAK;IACvD,IAAI,CAAC,MAAM,EAAE;IACb,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC;IAC/B,IAAI,CAAC,QAAQ,EAAE;IACf,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;IACxD,MAAM,QAAQ,GAAG,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC;IAC5F,IAAI,QAAQ,IAAI,QAAQ,GAAG,kBAAkB,IAAI,CAAC,KAAK,EAAE;IACzD,IAAI,QAAgB;IACpB,IAAI,KAAK,CAAC,WAAW,KAAK,KAAK,IAAI,KAAK,CAAC,QAAQ,GAAG,CAAC,EAAE;MACrD,QAAQ,GAAG,KAAK,CAAC,QAAQ;IAC3B,CAAC,MAAM;MACL;MACA,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC;MAC1D,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,GAAI,QAAQ,GAAG,OAAO,GAAI,GAAG,CAAC,CAAC;MAC3E,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC,QAAQ,GAAG,GAAG,GAAG,MAAM,GAAG,GAAG,GAAG,GAAG;IACpE;IACA,MAAM,CAAC,IAAI,GAAG,KAAK,CAAC,SAAS;IAC7B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;MAAE,GAAG,QAAQ;MAAE;IAAS,CAAC,CAAC;IAC7C,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;EACpD,CAAC;EACD;AACF;AACA;AACA;AACA;EACE,MAAM,UAAU,GAAI,MAAiC,IAAwC;IAC3F,MAAM;MAAE,OAAO,EAAE,CAAC;MAAE,GAAG;IAAM,CAAC,GAAG,OAAO,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,GAAG,EAAE,YAAY,CAAC,CAAC;IAClC,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,OAAO,KAAK;IACjC,MAAM,GAAG,GAAG,GAAG,CAAC,qBAAqB,CAAC,CAAC;IACvC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IAChC,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,eAAe,CAAC,OAAO,CAAC;IACtE,MAAM,GAAG,GAAG,IAAI,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,OAAO,CAAC;IACxE;IACA,MAAM,KAAK,GAAG,WAAW,GAAG,CAAC;IAC7B,IAAI,IAAI,GAAG,GAAG,CAAC,CAAC;IAChB,IAAI,GAAG,GAAG,GAAG,CAAC,CAAC;IACf,IAAI,KAAK,GAAG,KAAK,CAAC,CAAC;IACnB,IAAI,MAAM,GAAG,KAAK,CAAC,CAAC;IACpB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;MAC1B,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC;MACzD,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC;MACvD,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC;MACzD,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC;IAC7D;IACA,IAAI,IAAI,IAAI,KAAK,CAAC,CAAC,IAAI,GAAG,IAAI,KAAK,CAAC,CAAC,IAAI,KAAK,IAAI,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,IAAI,MAAM,IAAI,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO,KAAK;IACzH,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;IACpC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;IACpC,OAAO;MACL,CAAC;MACD,CAAC;MACD,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;MACjD,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG;IACpD,CAAC;EACH,CAAC;EACD,MAAM,WAAW,GAAI,KAAmB,IAAK;IAC3C;IACA,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;IAC/C;IACA,IAAI,MAAM,EAAE,WAAW,KAAK,OAAO,IAAI,KAAK,CAAC,WAAW,KAAK,KAAK,EAAE,WAAW,CAAC,CAAC;IACjF,IAAI,MAAM,EAAE;IACZ,KAAK,CAAC,cAAc,CAAC,CAAC;IACtB,IAAI;MACF;MACA,GAAG,CAAC,iBAAiB,CAAC,KAAK,CAAC,SAAS,CAAC;IACxC,CAAC,CAAC,MAAM,CAAC;IACT,IAAI,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;MAClC;MACA,MAAM,GAAG,GAAG,GAAG,CAAC,qBAAqB,CAAC,CAAC;MACvC,UAAU,CAAC;QAAE,CAAC,EAAE,CAAC;QAAE,CAAC,EAAE,CAAC;QAAE,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC;QAAE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC;QAAE,OAAO,EAAE;MAAG,CAAC,CAAC;IACzG;IACA,MAAM,GAAG;MAAE,SAAS,EAAE,KAAK,CAAC,SAAS;MAAE,WAAW,EAAE,KAAK,CAAC,WAAW;MAAE,MAAM,EAAE,EAAE;MAAE,IAAI,EAAE,KAAK,CAAC;IAAU,CAAC;IAC1G,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC;EACvB,CAAC;EACD,MAAM,UAAU,GAAI,KAAmB,IAAK;IAC1C,IAAI,MAAM,EAAE,SAAS,KAAK,KAAK,CAAC,SAAS,EAAE;IAC3C,KAAK,CAAC,cAAc,CAAC,CAAC;IACtB,MAAM,MAAM,GAAG,KAAK,CAAC,kBAAkB,GAAG,CAAC,IAAI,EAAE;IACjD,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,GAAG,MAAM,GAAG,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC;EAC7E,CAAC;EACD,MAAM,SAAS,GAAI,KAAmB,IAAK;IACzC,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS,EAAE;IACrD,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,MAAM;MAAE;IAAO,CAAC,GAAG,MAAM;IACzB,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,EAAE,WAAW,CAAC;IAClD,MAAM,GAAG,IAAI;IACb,OAAO,CAAC,EAAE,CAAC;IACX,IAAI,CAAC,OAAO,EAAE;IACd,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC;IAChC,UAAU,CAAE,OAAO,KAAM;MAAE,GAAG,KAAK;MAAE,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC,OAAO,EAAE,OAAO;IAAE,CAAC,CAAC,CAAC;IAC/E,MAAM,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC;EAC5B,CAAC;EACD;EACA,MAAM,YAAY,GAAI,KAAmB,IAAK;IAC5C,IAAI,MAAM,EAAE,SAAS,KAAK,KAAK,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;EAC1D,CAAC;EAED,MAAM,KAAK,GAAG,MAAO,IAAI,CAAC,CAAC,KAAK,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAE;EACjH,MAAM,UAAU,GAAG,MAAM;IACvB,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC;IACvB,OAAO,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE;EAC/C,CAAC;EAED,yBACG,KAAK;IAAA;MAAA,OACG,KAAK,CAAC,KAAK;IAAA;IAAA,IAClB,KAAK;MAAA,OAAE,KAAK,CAAC,KAAK;IAAA;IAAA,IAClB,WAAW;MAAA,OAAE,KAAK,CAAC,WAAW;IAAA;IAAA,IAC9B,KAAK;MAAA,OAAE,KAAK,CAAC,CAAC;IAAA;IACd,IAAI,EAAE,IAAI;IACV,QAAQ,EAAE,KAAK;IAAA,IACf,QAAQ;MAAA,OAAE,KAAK,CAAC,QAAQ;IAAA;IAAA,IACxB,QAAQ;MAAA,OAAE,KAAK,CAAC,QAAQ;IAAA;IAAA;MAAA,qDAGlB,IAAI,CAAC,SAAS,8CAGN,KAAK,CAAC,KAAK,YAAG,SAAS,mBAAG,KAAK,CAAC,YAAY,CAAC,oDACxC,KAAK,CAAC,KAAK,YAAG,IAAI,CAAC,OAAO,mBAAG,SAAS,8DACrC,CAAC,KAAK,CAAC,QAAQ,GAAG,UAAU,GAAG,SAAS,EAAE,gBAAgB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,SAAS,iDACnH,KAAK,CAAC,CAAC,GAAG,MAAM,YAAG,SAAS,uDAC/B,IAAI,CAAC,CAAC,+CACL,KAAK,CAAC,CAAC,GAAG,MAAM,YAAG,SAAS,iDAC1B,KAAK,CAAC,CAAC,GAAG,MAAM,YAAG,SAAS,kDAC3B,KAAK,CAAC,QAAQ,GAAG,MAAM,YAAG,SAAS,kDACnC,KAAK,CAAC,QAAQ,GAAG,MAAM,YAAG,SAAS,4CAGjD,IAAI;QAAA,IAAC,IAAI;UAAA,OAAE,KAAK,CAAC,QAAQ;QAAA;QAAA;UAAA,mDACd,UAAU,0BACjB,QAAQ,CAAC,CAAC,CAAC,QAAQ;QAAA;MAAA,gCAIrB,IAAI;QAAA,IAAC,IAAI;UAAA,OAAE,UAAU,CAAC,CAAC;QAAA;QAAA;UAAA,yBACrB,gBAAgB;YAAA;YAEf,IAAI;YAAA,IACJ,SAAS;cAAA,OAAE,IAAI,CAAC,CAAC,CAAC,MAAM;YAAA;YAAA,IACxB,OAAO;cAAA,OAAE,CACP;gBAAE,KAAK,EAAE,MAAM;gBAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI;gBAAE,IAAI,EAAE;cAAkB,CAAC,EAC9D;gBAAE,KAAK,EAAE,MAAM;gBAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI;gBAAE,IAAI,EAAE;cAAiB,CAAC,CAC9D;YAAA;YACD,KAAK,EAAE,IAAI;YACX,aAAa,EAAE,UAAU;YAAA,IACzB,QAAQ;cAAA,OAAE,CAAC,QAAQ,CAAC,CAAC;YAAA;UAAA;QAAA;MAAA,gCAItB,UAAU;QACT,IAAI;QACJ,OAAO;QAAA,IACP,KAAK;UAAA,OAAE,IAAI,CAAC,CAAC,CAAC,IAAI;QAAA;QAAA;UAAA,OACL,IAAI,CAAC,CAAC,KAAK,MAAM,GAAG,MAAM,GAAG,SAAS;QAAA;QAAA,IACnD,QAAQ;UAAA,OAAE,CAAC,QAAQ,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;QAAA;QAC5E,OAAO,EAAE,IAAI;QAAA;UAAA;QAAA;MAAA,gCAId,UAAU;QAAC,IAAI;QAAM,OAAO;QAAA,IAAS,KAAK;UAAA,OAAE,QAAQ,CAAC,CAAC,CAAC,KAAK;QAAA;QAAA,IAAE,QAAQ;UAAA,OAAE,CAAC,QAAQ,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC;QAAA;QAAE,OAAO,EAAE,KAAK;QAAA;UAAA;QAAA;MAAA,gCAOhH,IAAI;QAAA,IACH,IAAI;UAAA,OAAE,IAAI,CAAC,CAAC,KAAK,MAAM;QAAA;QAAA,IACvB,QAAQ;UAAA,uDAKG,SAAS,CAAC,CAAC,yDACL,IAAI,CAAC,CAAC,CAAC,QAAQ,wDAChB,IAAI,CAAC,CAAC,CAAC,QAAQ,8DACT,gBAAgB,CAAC,IAAI,EAAE,KAAK,CAAC,iDACjC,KAAK,CAAC,CAAC,GAAG,MAAM,YAAG,SAAS,2DAC3B,KAAK,CAAC,QAAQ,IAAI,SAAS,4CAIhC,KAAK,CAAC,QAAQ,8CACd,KAAK,CAAC,QAAQ,IAAI,CAAC,UAAU,CAAC,CAAC;QAAA;QAAA;UAAA,gCAW1C,IAAI,CAAC,CAAC,CAAC,QAAQ,gDAOJ,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,YAAG,IAAI,CAAC,CAAC,CAAC,KAAK,mBAAG,IAAI,CAAC,CAAC,CAAC,QAAQ,iBAChE,YAAG,OAAO,CAAC,CAAC,CAAC,CAAC,oBAAI,OAAO,CAAC,CAAC,CAAC,CAAC,oBAAI,OAAO,CAAC,CAAC,CAAC,KAAK,oBAAI,OAAO,CAAC,CAAC,CAAC,MAAM,SAAE,6BAY5E,GAAG;YAAA,IAAC,IAAI;cAAA,OAAE,OAAO,CAAC,CAAC,CAAC,OAAO;YAAA;YAAA,UAAI,OAAO,gDAAc,OAAO;UAAI,gCAC/D,IAAI;YAAA,IAAC,IAAI;cAAA,OAAE,IAAI,CAAC,CAAC;YAAA;YAAA;cAAA,mDACP,IAAI,CAAC,CAAC;YAAA;UAAA;QAAA;MAAA,wBAO1B,IAAI;QAAA,IAAC,IAAI;UAAA,OAAE,KAAK,CAAC,IAAI;QAAA;QAAA,UAAI,IAAI,mDAAgC,IAAI,CAAC,CAAC,mDAAS,UAAU,CAAC,CAAC;MAAI;IAAA;EAAA;AAGnG;AAEA,eAAe,cAAc","ignoreList":[]}
@@ -26,6 +26,8 @@ export function TextInput(props) {
26
26
  const icon = () => local.icon ?? (local.variant === "ai" ? "ti ti-sparkles" : local.markdown ? "ti ti-markdown" : "ti ti-cursor-text");
27
27
  // A custom icon stays while typing (a search field keeps its magnifier); only the default icon switches to the pencil.
28
28
  const activeIcon = () => local.activeIcon ?? local.icon ?? (local.variant === "ai" ? "ti ti-sparkles" : "ti ti-pencil");
29
+ // Names, addresses and passwords are typed exactly: phone keyboards must not capitalize or "correct" them.
30
+ const verbatim = () => local.password || local.type === "email" || local.type === "url" || /\b(username|email|url)\b/.test(String(rest.autocomplete ?? ""));
29
31
  const input = next => local.onValueChange?.(next);
30
32
  const commit = next => local.onValueCommit?.(next);
31
33
  const clear = () => {
@@ -75,7 +77,17 @@ export function TextInput(props) {
75
77
  return multiline();
76
78
  },
77
79
  get fallback() {
78
- return _$ssrElement("input", _$mergeProps(rest, {
80
+ return _$ssrElement("input", _$mergeProps({
81
+ get autocapitalize() {
82
+ return verbatim() ? "none" : undefined;
83
+ },
84
+ get autocorrect() {
85
+ return verbatim() ? "off" : undefined;
86
+ },
87
+ get spellcheck() {
88
+ return verbatim() ? false : undefined;
89
+ }
90
+ }, rest, {
79
91
  get id() {
80
92
  return meta.controlId;
81
93
  },
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["inputs/TextInput.tsx"],"sourcesContent":["import { createSignal, type JSX, Show, splitProps } from \"solid-js\";\nimport { createFieldMeta, Field, fieldControlAria } from \"../internal/field\";\nimport { useUiMessages } from \"../intl/messages\";\nimport type { Completion } from \"./completion\";\nimport type { ValueFieldProps } from \"./field-contract\";\nimport { commitFieldValue, resolveMaybeAccessor } from \"./field-contract\";\nimport { MarkdownEditor } from \"./markdown/MarkdownEditor\";\n\nexport type TextInputProps = Omit<\n JSX.InputHTMLAttributes<HTMLInputElement>,\n \"onChange\" | \"onInput\" | \"prefix\" | \"suffix\" | \"type\" | \"value\" | keyof ValueFieldProps<string>\n> &\n ValueFieldProps<string> & {\n minLength?: number;\n maxLength?: number;\n type?: \"text\" | \"search\" | \"email\" | \"url\" | \"tel\";\n variant?: \"default\" | \"ai\";\n icon?: string;\n activeIcon?: string;\n prefix?: JSX.Element;\n suffix?: JSX.Element;\n clearable?: boolean;\n onClear?: () => void;\n clearLabel?: string;\n multiline?: boolean;\n monospace?: boolean;\n password?: boolean;\n markdown?: boolean;\n onSubmit?: () => void;\n lines?: number;\n abbreviations?: Record<string, string>;\n completions?: readonly Completion[];\n };\n\nexport function TextInput(props: TextInputProps): JSX.Element {\n const messages = useUiMessages();\n const [local, rest] = splitProps(props, [\n \"activeIcon\",\n \"aria-describedby\",\n \"aria-label\",\n \"class\",\n \"clearLabel\",\n \"clearable\",\n \"completions\",\n \"description\",\n \"error\",\n \"icon\",\n \"id\",\n \"label\",\n \"lines\",\n \"markdown\",\n \"minLength\",\n \"maxLength\",\n \"monospace\",\n \"multiline\",\n \"onClear\",\n \"onValueCommit\",\n \"onSubmit\",\n \"onValueChange\",\n \"password\",\n \"prefix\",\n \"required\",\n \"suffix\",\n \"type\",\n \"value\",\n \"variant\",\n \"abbreviations\",\n ]);\n const meta = createFieldMeta(local.id);\n const value = () => resolveMaybeAccessor(local.value) ?? \"\";\n const error = () => resolveMaybeAccessor(local.error);\n const [passwordVisible, setPasswordVisible] = createSignal(false);\n const multiline = () => Boolean(local.multiline || local.markdown);\n const icon = () => local.icon ?? (local.variant === \"ai\" ? \"ti ti-sparkles\" : local.markdown ? \"ti ti-markdown\" : \"ti ti-cursor-text\");\n // A custom icon stays while typing (a search field keeps its magnifier); only the default icon switches to the pencil.\n const activeIcon = () => local.activeIcon ?? local.icon ?? (local.variant === \"ai\" ? \"ti ti-sparkles\" : \"ti ti-pencil\");\n const input = (next: string) => local.onValueChange?.(next);\n const commit = (next: string) => local.onValueCommit?.(next);\n const clear = () => {\n if (local.onClear) {\n local.onClear();\n return;\n }\n commitFieldValue(local, \"\");\n };\n\n return (\n <Show\n when={local.markdown}\n fallback={\n <Field\n class={local.class}\n label={local.label}\n description={local.description}\n error={error()}\n meta={meta}\n required={local.required}\n disabled={rest.disabled}\n >\n <div\n class=\"k2b-input-shell k2b-text-input\"\n data-invalid={error() ? \"true\" : undefined}\n data-ai={local.variant === \"ai\" ? \"true\" : undefined}\n data-multiline={multiline() ? \"true\" : undefined}\n data-monospace={local.monospace ? \"true\" : undefined}\n style={multiline() ? { \"--k2b-editor-lines\": String(local.lines ?? 3) } : undefined}\n >\n <span class=\"k2b-input-shell__icon k2b-text-input__icon\" aria-hidden=\"true\">\n <i class={icon()} />\n <i class={activeIcon()} />\n </span>\n <Show when={local.prefix}>\n <span class=\"k2b-input-shell__affix\">{local.prefix}</span>\n </Show>\n <Show\n when={multiline()}\n fallback={\n <input\n {...rest}\n id={meta.controlId}\n class=\"k2b-input\"\n type={local.password && !passwordVisible() ? \"password\" : (local.type ?? \"text\")}\n value={value()}\n minlength={local.minLength}\n maxlength={local.maxLength}\n required={local.required}\n {...fieldControlAria(meta, local)}\n onInput={(event) => {\n input(event.currentTarget.value);\n }}\n onChange={(event) => commit(event.currentTarget.value)}\n onKeyDown={(event) => {\n if (local.onSubmit && event.key === \"Enter\" && !event.shiftKey && !event.metaKey) {\n event.preventDefault();\n local.onSubmit();\n }\n }}\n />\n }\n >\n <textarea\n {...(rest as unknown as JSX.TextareaHTMLAttributes<HTMLTextAreaElement>)}\n id={meta.controlId}\n class=\"k2b-input k2b-text-input__textarea\"\n value={value()}\n rows={local.lines ?? 3}\n required={local.required}\n minlength={local.minLength}\n maxlength={local.maxLength}\n {...fieldControlAria(meta, local)}\n onInput={(event) => {\n input(event.currentTarget.value);\n }}\n onChange={(event) => commit(event.currentTarget.value)}\n onKeyDown={(event) => {\n if (local.onSubmit && event.key === \"Enter\" && !event.shiftKey && !event.metaKey) {\n event.preventDefault();\n local.onSubmit();\n }\n }}\n />\n </Show>\n <Show when={local.suffix}>\n <span class=\"k2b-input-shell__affix\">{local.suffix}</span>\n </Show>\n <Show when={local.clearable && value() && !multiline() && !local.password && !rest.disabled && !rest.readOnly}>\n <button\n type=\"button\"\n class=\"k2b-input-shell__clear k2b-input-clear-action\"\n aria-label={local.clearLabel ?? messages().clear}\n onClick={clear}\n >\n <i class=\"ti ti-x\" aria-hidden=\"true\" />\n </button>\n </Show>\n <Show when={local.password && !multiline()}>\n <button\n type=\"button\"\n class=\"k2b-input-shell__clear\"\n aria-label={passwordVisible() ? messages().hidePassword : messages().showPassword}\n aria-pressed={passwordVisible()}\n disabled={rest.disabled}\n onClick={() => setPasswordVisible((visible) => !visible)}\n >\n <i class={passwordVisible() ? \"ti ti-eye-off\" : \"ti ti-eye\"} aria-hidden=\"true\" />\n </button>\n </Show>\n </div>\n </Field>\n }\n >\n <MarkdownEditor\n class={local.class}\n label={local.label}\n description={local.description}\n error={error()}\n id={meta.controlId}\n name={rest.name}\n value={value()}\n onValueChange={input}\n onValueCommit={local.onValueCommit}\n onSubmit={local.onSubmit}\n placeholder={rest.placeholder}\n disabled={rest.disabled}\n required={local.required}\n lines={local.lines}\n maxLength={local.maxLength}\n spellcheck={rest.spellcheck === undefined ? undefined : rest.spellcheck === true || rest.spellcheck === \"true\"}\n abbreviations={local.abbreviations}\n completions={local.completions}\n aria-label={local[\"aria-label\"]}\n aria-describedby={local[\"aria-describedby\"]}\n />\n </Show>\n );\n}\n\nexport default TextInput;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["inputs/TextInput.tsx"],"sourcesContent":["import { createSignal, type JSX, Show, splitProps } from \"solid-js\";\nimport { createFieldMeta, Field, fieldControlAria } from \"../internal/field\";\nimport { useUiMessages } from \"../intl/messages\";\nimport type { Completion } from \"./completion\";\nimport type { ValueFieldProps } from \"./field-contract\";\nimport { commitFieldValue, resolveMaybeAccessor } from \"./field-contract\";\nimport { MarkdownEditor } from \"./markdown/MarkdownEditor\";\n\nexport type TextInputProps = Omit<\n JSX.InputHTMLAttributes<HTMLInputElement>,\n \"onChange\" | \"onInput\" | \"prefix\" | \"suffix\" | \"type\" | \"value\" | keyof ValueFieldProps<string>\n> &\n ValueFieldProps<string> & {\n minLength?: number;\n maxLength?: number;\n type?: \"text\" | \"search\" | \"email\" | \"url\" | \"tel\";\n variant?: \"default\" | \"ai\";\n icon?: string;\n activeIcon?: string;\n prefix?: JSX.Element;\n suffix?: JSX.Element;\n clearable?: boolean;\n onClear?: () => void;\n clearLabel?: string;\n multiline?: boolean;\n monospace?: boolean;\n password?: boolean;\n markdown?: boolean;\n onSubmit?: () => void;\n lines?: number;\n abbreviations?: Record<string, string>;\n completions?: readonly Completion[];\n };\n\nexport function TextInput(props: TextInputProps): JSX.Element {\n const messages = useUiMessages();\n const [local, rest] = splitProps(props, [\n \"activeIcon\",\n \"aria-describedby\",\n \"aria-label\",\n \"class\",\n \"clearLabel\",\n \"clearable\",\n \"completions\",\n \"description\",\n \"error\",\n \"icon\",\n \"id\",\n \"label\",\n \"lines\",\n \"markdown\",\n \"minLength\",\n \"maxLength\",\n \"monospace\",\n \"multiline\",\n \"onClear\",\n \"onValueCommit\",\n \"onSubmit\",\n \"onValueChange\",\n \"password\",\n \"prefix\",\n \"required\",\n \"suffix\",\n \"type\",\n \"value\",\n \"variant\",\n \"abbreviations\",\n ]);\n const meta = createFieldMeta(local.id);\n const value = () => resolveMaybeAccessor(local.value) ?? \"\";\n const error = () => resolveMaybeAccessor(local.error);\n const [passwordVisible, setPasswordVisible] = createSignal(false);\n const multiline = () => Boolean(local.multiline || local.markdown);\n const icon = () => local.icon ?? (local.variant === \"ai\" ? \"ti ti-sparkles\" : local.markdown ? \"ti ti-markdown\" : \"ti ti-cursor-text\");\n // A custom icon stays while typing (a search field keeps its magnifier); only the default icon switches to the pencil.\n const activeIcon = () => local.activeIcon ?? local.icon ?? (local.variant === \"ai\" ? \"ti ti-sparkles\" : \"ti ti-pencil\");\n // Names, addresses and passwords are typed exactly: phone keyboards must not capitalize or \"correct\" them.\n const verbatim = () =>\n local.password || local.type === \"email\" || local.type === \"url\" || /\\b(username|email|url)\\b/.test(String(rest.autocomplete ?? \"\"));\n const input = (next: string) => local.onValueChange?.(next);\n const commit = (next: string) => local.onValueCommit?.(next);\n const clear = () => {\n if (local.onClear) {\n local.onClear();\n return;\n }\n commitFieldValue(local, \"\");\n };\n\n return (\n <Show\n when={local.markdown}\n fallback={\n <Field\n class={local.class}\n label={local.label}\n description={local.description}\n error={error()}\n meta={meta}\n required={local.required}\n disabled={rest.disabled}\n >\n <div\n class=\"k2b-input-shell k2b-text-input\"\n data-invalid={error() ? \"true\" : undefined}\n data-ai={local.variant === \"ai\" ? \"true\" : undefined}\n data-multiline={multiline() ? \"true\" : undefined}\n data-monospace={local.monospace ? \"true\" : undefined}\n style={multiline() ? { \"--k2b-editor-lines\": String(local.lines ?? 3) } : undefined}\n >\n <span class=\"k2b-input-shell__icon k2b-text-input__icon\" aria-hidden=\"true\">\n <i class={icon()} />\n <i class={activeIcon()} />\n </span>\n <Show when={local.prefix}>\n <span class=\"k2b-input-shell__affix\">{local.prefix}</span>\n </Show>\n <Show\n when={multiline()}\n fallback={\n <input\n autocapitalize={verbatim() ? \"none\" : undefined}\n autocorrect={verbatim() ? \"off\" : undefined}\n spellcheck={verbatim() ? false : undefined}\n {...rest}\n id={meta.controlId}\n class=\"k2b-input\"\n type={local.password && !passwordVisible() ? \"password\" : (local.type ?? \"text\")}\n value={value()}\n minlength={local.minLength}\n maxlength={local.maxLength}\n required={local.required}\n {...fieldControlAria(meta, local)}\n onInput={(event) => {\n input(event.currentTarget.value);\n }}\n onChange={(event) => commit(event.currentTarget.value)}\n onKeyDown={(event) => {\n if (local.onSubmit && event.key === \"Enter\" && !event.shiftKey && !event.metaKey) {\n event.preventDefault();\n local.onSubmit();\n }\n }}\n />\n }\n >\n <textarea\n {...(rest as unknown as JSX.TextareaHTMLAttributes<HTMLTextAreaElement>)}\n id={meta.controlId}\n class=\"k2b-input k2b-text-input__textarea\"\n value={value()}\n rows={local.lines ?? 3}\n required={local.required}\n minlength={local.minLength}\n maxlength={local.maxLength}\n {...fieldControlAria(meta, local)}\n onInput={(event) => {\n input(event.currentTarget.value);\n }}\n onChange={(event) => commit(event.currentTarget.value)}\n onKeyDown={(event) => {\n if (local.onSubmit && event.key === \"Enter\" && !event.shiftKey && !event.metaKey) {\n event.preventDefault();\n local.onSubmit();\n }\n }}\n />\n </Show>\n <Show when={local.suffix}>\n <span class=\"k2b-input-shell__affix\">{local.suffix}</span>\n </Show>\n <Show when={local.clearable && value() && !multiline() && !local.password && !rest.disabled && !rest.readOnly}>\n <button\n type=\"button\"\n class=\"k2b-input-shell__clear k2b-input-clear-action\"\n aria-label={local.clearLabel ?? messages().clear}\n onClick={clear}\n >\n <i class=\"ti ti-x\" aria-hidden=\"true\" />\n </button>\n </Show>\n <Show when={local.password && !multiline()}>\n <button\n type=\"button\"\n class=\"k2b-input-shell__clear\"\n aria-label={passwordVisible() ? messages().hidePassword : messages().showPassword}\n aria-pressed={passwordVisible()}\n disabled={rest.disabled}\n onClick={() => setPasswordVisible((visible) => !visible)}\n >\n <i class={passwordVisible() ? \"ti ti-eye-off\" : \"ti ti-eye\"} aria-hidden=\"true\" />\n </button>\n </Show>\n </div>\n </Field>\n }\n >\n <MarkdownEditor\n class={local.class}\n label={local.label}\n description={local.description}\n error={error()}\n id={meta.controlId}\n name={rest.name}\n value={value()}\n onValueChange={input}\n onValueCommit={local.onValueCommit}\n onSubmit={local.onSubmit}\n placeholder={rest.placeholder}\n disabled={rest.disabled}\n required={local.required}\n lines={local.lines}\n maxLength={local.maxLength}\n spellcheck={rest.spellcheck === undefined ? undefined : rest.spellcheck === true || rest.spellcheck === \"true\"}\n abbreviations={local.abbreviations}\n completions={local.completions}\n aria-label={local[\"aria-label\"]}\n aria-describedby={local[\"aria-describedby\"]}\n />\n </Show>\n );\n}\n\nexport default TextInput;\n"],"mappings":"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","ignoreList":[]}