@cloudscape-design/components 3.0.1270 → 3.0.1272

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 (181) hide show
  1. package/app-layout/visual-refresh-toolbar/toolbar/index.js +1 -1
  2. package/app-layout/visual-refresh-toolbar/toolbar/index.js.map +1 -1
  3. package/app-layout/visual-refresh-toolbar/toolbar/trigger-button/index.d.ts +1 -1
  4. package/app-layout/visual-refresh-toolbar/toolbar/trigger-button/index.d.ts.map +1 -1
  5. package/app-layout/visual-refresh-toolbar/toolbar/trigger-button/index.js +1 -2
  6. package/app-layout/visual-refresh-toolbar/toolbar/trigger-button/index.js.map +1 -1
  7. package/app-layout/visual-refresh-toolbar/toolbar/trigger-button/styles.css.js +6 -7
  8. package/app-layout/visual-refresh-toolbar/toolbar/trigger-button/styles.scoped.css +20 -26
  9. package/app-layout/visual-refresh-toolbar/toolbar/trigger-button/styles.selectors.js +6 -7
  10. package/button/styles.css.js +22 -22
  11. package/button/styles.scoped.css +78 -78
  12. package/button/styles.selectors.js +22 -22
  13. package/help-panel/styles.css.js +6 -6
  14. package/help-panel/styles.scoped.css +70 -70
  15. package/help-panel/styles.selectors.js +6 -6
  16. package/i18n/messages/all.all.js +1 -1
  17. package/i18n/messages/all.all.json +1 -1
  18. package/i18n/messages/all.ar.js +1 -1
  19. package/i18n/messages/all.ar.json +1 -1
  20. package/i18n/messages/all.de.js +1 -1
  21. package/i18n/messages/all.de.json +1 -1
  22. package/i18n/messages/all.en-GB.js +1 -1
  23. package/i18n/messages/all.en-GB.json +1 -1
  24. package/i18n/messages/all.en.js +1 -1
  25. package/i18n/messages/all.en.json +1 -1
  26. package/i18n/messages/all.es.js +1 -1
  27. package/i18n/messages/all.es.json +1 -1
  28. package/i18n/messages/all.fr.js +1 -1
  29. package/i18n/messages/all.fr.json +1 -1
  30. package/i18n/messages/all.id.js +1 -1
  31. package/i18n/messages/all.id.json +1 -1
  32. package/i18n/messages/all.it.js +1 -1
  33. package/i18n/messages/all.it.json +1 -1
  34. package/i18n/messages/all.ja.js +1 -1
  35. package/i18n/messages/all.ja.json +1 -1
  36. package/i18n/messages/all.ko.js +1 -1
  37. package/i18n/messages/all.ko.json +1 -1
  38. package/i18n/messages/all.pt-BR.js +1 -1
  39. package/i18n/messages/all.pt-BR.json +1 -1
  40. package/i18n/messages/all.tr.js +1 -1
  41. package/i18n/messages/all.tr.json +1 -1
  42. package/i18n/messages/all.zh-CN.js +1 -1
  43. package/i18n/messages/all.zh-CN.json +1 -1
  44. package/i18n/messages/all.zh-TW.js +1 -1
  45. package/i18n/messages/all.zh-TW.json +1 -1
  46. package/i18n/messages-types.d.ts +18 -0
  47. package/i18n/messages-types.d.ts.map +1 -1
  48. package/i18n/messages-types.js.map +1 -1
  49. package/internal/base-component/styles.scoped.css +63 -4
  50. package/internal/components/token-list/styles.css.js +10 -10
  51. package/internal/components/token-list/styles.scoped.css +25 -25
  52. package/internal/components/token-list/styles.selectors.js +10 -10
  53. package/internal/environment.js +2 -2
  54. package/internal/environment.json +2 -2
  55. package/internal/generated/styles/tokens.d.ts +17 -3
  56. package/internal/generated/styles/tokens.js +17 -3
  57. package/internal/generated/theming/index.cjs +417 -9
  58. package/internal/generated/theming/index.cjs.d.ts +189 -0
  59. package/internal/generated/theming/index.d.ts +189 -0
  60. package/internal/generated/theming/index.js +417 -9
  61. package/internal/keycode.d.ts +3 -1
  62. package/internal/keycode.d.ts.map +1 -1
  63. package/internal/keycode.js +5 -0
  64. package/internal/keycode.js.map +1 -1
  65. package/internal/manifest.json +1 -1
  66. package/internal/utils/handle-key.d.ts +22 -1
  67. package/internal/utils/handle-key.d.ts.map +1 -1
  68. package/internal/utils/handle-key.js +62 -4
  69. package/internal/utils/handle-key.js.map +1 -1
  70. package/item-card/styles.css.js +14 -14
  71. package/item-card/styles.scoped.css +52 -52
  72. package/item-card/styles.selectors.js +14 -14
  73. package/link/styles.css.js +21 -21
  74. package/link/styles.scoped.css +81 -81
  75. package/link/styles.selectors.js +21 -21
  76. package/package.json +1 -1
  77. package/prompt-input/components/menu-dropdown.d.ts +33 -0
  78. package/prompt-input/components/menu-dropdown.d.ts.map +1 -0
  79. package/prompt-input/components/menu-dropdown.js +48 -0
  80. package/prompt-input/components/menu-dropdown.js.map +1 -0
  81. package/prompt-input/components/textarea-mode.d.ts +15 -0
  82. package/prompt-input/components/textarea-mode.d.ts.map +1 -0
  83. package/prompt-input/components/textarea-mode.js +8 -0
  84. package/prompt-input/components/textarea-mode.js.map +1 -0
  85. package/prompt-input/components/token-mode.d.ts +61 -0
  86. package/prompt-input/components/token-mode.d.ts.map +1 -0
  87. package/prompt-input/components/token-mode.js +37 -0
  88. package/prompt-input/components/token-mode.js.map +1 -0
  89. package/prompt-input/core/caret-controller.d.ts +73 -0
  90. package/prompt-input/core/caret-controller.d.ts.map +1 -0
  91. package/prompt-input/core/caret-controller.js +396 -0
  92. package/prompt-input/core/caret-controller.js.map +1 -0
  93. package/prompt-input/core/caret-spot-utils.d.ts +6 -0
  94. package/prompt-input/core/caret-spot-utils.d.ts.map +1 -0
  95. package/prompt-input/core/caret-spot-utils.js +52 -0
  96. package/prompt-input/core/caret-spot-utils.js.map +1 -0
  97. package/prompt-input/core/caret-utils.d.ts +25 -0
  98. package/prompt-input/core/caret-utils.d.ts.map +1 -0
  99. package/prompt-input/core/caret-utils.js +183 -0
  100. package/prompt-input/core/caret-utils.js.map +1 -0
  101. package/prompt-input/core/constants.d.ts +14 -0
  102. package/prompt-input/core/constants.d.ts.map +1 -0
  103. package/prompt-input/core/constants.js +18 -0
  104. package/prompt-input/core/constants.js.map +1 -0
  105. package/prompt-input/core/dom-utils.d.ts +60 -0
  106. package/prompt-input/core/dom-utils.d.ts.map +1 -0
  107. package/prompt-input/core/dom-utils.js +252 -0
  108. package/prompt-input/core/dom-utils.js.map +1 -0
  109. package/prompt-input/core/event-handlers.d.ts +68 -0
  110. package/prompt-input/core/event-handlers.d.ts.map +1 -0
  111. package/prompt-input/core/event-handlers.js +678 -0
  112. package/prompt-input/core/event-handlers.js.map +1 -0
  113. package/prompt-input/core/menu-state.d.ts +62 -0
  114. package/prompt-input/core/menu-state.d.ts.map +1 -0
  115. package/prompt-input/core/menu-state.js +168 -0
  116. package/prompt-input/core/menu-state.js.map +1 -0
  117. package/prompt-input/core/token-operations.d.ts +21 -0
  118. package/prompt-input/core/token-operations.d.ts.map +1 -0
  119. package/prompt-input/core/token-operations.js +273 -0
  120. package/prompt-input/core/token-operations.js.map +1 -0
  121. package/prompt-input/core/token-renderer.d.ts +26 -0
  122. package/prompt-input/core/token-renderer.d.ts.map +1 -0
  123. package/prompt-input/core/token-renderer.js +230 -0
  124. package/prompt-input/core/token-renderer.js.map +1 -0
  125. package/prompt-input/core/token-utils.d.ts +22 -0
  126. package/prompt-input/core/token-utils.d.ts.map +1 -0
  127. package/prompt-input/core/token-utils.js +262 -0
  128. package/prompt-input/core/token-utils.js.map +1 -0
  129. package/prompt-input/core/trigger-utils.d.ts +18 -0
  130. package/prompt-input/core/trigger-utils.d.ts.map +1 -0
  131. package/prompt-input/core/trigger-utils.js +174 -0
  132. package/prompt-input/core/trigger-utils.js.map +1 -0
  133. package/prompt-input/core/type-guards.d.ts +13 -0
  134. package/prompt-input/core/type-guards.d.ts.map +1 -0
  135. package/prompt-input/core/type-guards.js +36 -0
  136. package/prompt-input/core/type-guards.js.map +1 -0
  137. package/prompt-input/index.d.ts +1 -1
  138. package/prompt-input/index.d.ts.map +1 -1
  139. package/prompt-input/index.js.map +1 -1
  140. package/prompt-input/interfaces.d.ts +356 -7
  141. package/prompt-input/interfaces.d.ts.map +1 -1
  142. package/prompt-input/interfaces.js.map +1 -1
  143. package/prompt-input/internal.d.ts +1 -1
  144. package/prompt-input/internal.d.ts.map +1 -1
  145. package/prompt-input/internal.js +195 -61
  146. package/prompt-input/internal.js.map +1 -1
  147. package/prompt-input/styles.css.js +26 -17
  148. package/prompt-input/styles.scoped.css +152 -39
  149. package/prompt-input/styles.selectors.js +26 -17
  150. package/prompt-input/test-classes/styles.css.js +7 -6
  151. package/prompt-input/test-classes/styles.scoped.css +10 -6
  152. package/prompt-input/test-classes/styles.selectors.js +7 -6
  153. package/prompt-input/tokens/use-shortcuts.d.ts +37 -0
  154. package/prompt-input/tokens/use-shortcuts.d.ts.map +1 -0
  155. package/prompt-input/tokens/use-shortcuts.js +89 -0
  156. package/prompt-input/tokens/use-shortcuts.js.map +1 -0
  157. package/prompt-input/tokens/use-token-mode.d.ts +78 -0
  158. package/prompt-input/tokens/use-token-mode.d.ts.map +1 -0
  159. package/prompt-input/tokens/use-token-mode.js +817 -0
  160. package/prompt-input/tokens/use-token-mode.js.map +1 -0
  161. package/prompt-input/utils/insert-text-content-editable.d.ts +10 -0
  162. package/prompt-input/utils/insert-text-content-editable.d.ts.map +1 -0
  163. package/prompt-input/utils/insert-text-content-editable.js +133 -0
  164. package/prompt-input/utils/insert-text-content-editable.js.map +1 -0
  165. package/tabs/styles.css.js +30 -30
  166. package/tabs/styles.scoped.css +55 -55
  167. package/tabs/styles.selectors.js +30 -30
  168. package/test-utils/dom/hotspot/index.js +1 -2
  169. package/test-utils/dom/hotspot/index.js.map +1 -1
  170. package/test-utils/dom/prompt-input/index.d.ts +53 -1
  171. package/test-utils/dom/prompt-input/index.js +121 -13
  172. package/test-utils/dom/prompt-input/index.js.map +1 -1
  173. package/test-utils/dom/s3-resource-selector/index.js +2 -3
  174. package/test-utils/dom/s3-resource-selector/index.js.map +1 -1
  175. package/test-utils/selectors/hotspot/index.js +1 -2
  176. package/test-utils/selectors/hotspot/index.js.map +1 -1
  177. package/test-utils/selectors/prompt-input/index.d.ts +30 -0
  178. package/test-utils/selectors/prompt-input/index.js +53 -7
  179. package/test-utils/selectors/prompt-input/index.js.map +1 -1
  180. package/test-utils/selectors/s3-resource-selector/index.js +2 -3
  181. package/test-utils/selectors/s3-resource-selector/index.js.map +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"caret-controller.js","sourceRoot":"","sources":["../../../../src/prompt-input/core/caret-controller.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { isHTMLElement } from '../../internal/utils/dom';\nimport { PromptInputProps } from '../interfaces';\nimport { ElementType } from './constants';\nimport {\n findAllParagraphs,\n findElement,\n getTokenType,\n isEmptyState,\n isReferenceElementType,\n stripZeroWidthCharacters,\n} from './dom-utils';\nimport { isBreakTextToken, isTextNode, isTextToken, isTriggerToken } from './type-guards';\n\n/** Returns the Selection from the element's owning window, supporting iframe contexts. */\nexport function getOwnerSelection(element: Node): Selection | null {\n return (element.ownerDocument?.defaultView ?? window).getSelection();\n}\n\n/** Logical lengths for each token type, used for cursor position calculations. */\nexport const TOKEN_LENGTHS = {\n REFERENCE: 1,\n LINE_BREAK: 1,\n trigger: (filterText: string) => 1 + filterText.length,\n text: (content: string) => content.length,\n} as const;\n\n/** Calculates the logical cursor position after a given token index. */\nexport function calculateTokenPosition(tokens: readonly PromptInputProps.InputToken[], upToIndex: number): number {\n let pos = 0;\n for (let i = 0; i <= upToIndex && i < tokens.length; i++) {\n const token = tokens[i];\n if (isTextToken(token)) {\n pos += TOKEN_LENGTHS.text(token.value);\n } else if (isBreakTextToken(token)) {\n pos += TOKEN_LENGTHS.LINE_BREAK;\n } else if (isTriggerToken(token)) {\n pos += TOKEN_LENGTHS.trigger(token.value);\n } else {\n pos += TOKEN_LENGTHS.REFERENCE;\n }\n }\n return pos;\n}\n\n/** Calculates the total logical length of all tokens. */\nexport function calculateTotalTokenLength(tokens: readonly PromptInputProps.InputToken[]): number {\n return tokens.length === 0 ? 0 : calculateTokenPosition(tokens, tokens.length - 1);\n}\n\ninterface CaretState {\n start: number;\n end: number | undefined;\n isValid: boolean;\n}\n\n/** A resolved position within the DOM: a node and an offset into it. */\ninterface DOMLocation {\n node: Node;\n offset: number;\n}\n\n/**\n * Manages caret positioning within a contentEditable element.\n * Translates between logical token positions and DOM Range/Selection API.\n */\nexport class CaretController {\n private element: HTMLElement;\n private state: CaretState;\n\n constructor(element: HTMLElement) {\n this.element = element;\n this.state = { start: 0, end: undefined, isValid: false };\n }\n\n private get ownerDoc(): Document {\n return this.element.ownerDocument ?? document;\n }\n\n /**\n * Creates a DOM Range from resolved start/end locations and applies it to the given selection.\n * Returns the created Range for further use (e.g. scroll-into-view checks).\n */\n applyRange(\n ownerDocument: Document,\n selection: Selection,\n startLocation: DOMLocation,\n endLocation?: DOMLocation\n ): Range {\n const range = ownerDocument.createRange();\n range.setStart(startLocation.node, startLocation.offset);\n\n if (endLocation) {\n range.setEnd(endLocation.node, endLocation.offset);\n } else {\n range.collapse(true);\n }\n\n selection.removeAllRanges();\n selection.addRange(range);\n return range;\n }\n\n /** Returns the logical length of a DOM node based on its token type. */\n private getNodeLength(node: Node): number {\n const tokenType = isHTMLElement(node) ? getTokenType(node) : null;\n\n if (isTextNode(node) || tokenType === ElementType.Trigger) {\n return TOKEN_LENGTHS.text(node.textContent || '');\n } else if (tokenType && isReferenceElementType(tokenType)) {\n return TOKEN_LENGTHS.REFERENCE;\n }\n\n return 0;\n }\n\n /** Returns the current logical caret position from the DOM selection. */\n getPosition(): number {\n const selection = getOwnerSelection(this.element);\n if (!selection?.rangeCount) {\n return 0;\n }\n\n const range = selection.getRangeAt(0);\n if (!this.element.contains(range.startContainer)) {\n return 0;\n }\n\n return this.calculatePositionFromRange(range, false);\n }\n\n /** Finds the trigger element at the current caret position, if any. */\n findActiveTrigger(): HTMLElement | null {\n const selection = getOwnerSelection(this.element);\n if (!selection?.rangeCount) {\n return null;\n }\n\n const range = selection.getRangeAt(0);\n if (!range.collapsed) {\n return null;\n }\n\n let node: Node | null = range.startContainer;\n\n // Walk up from cursor to find a trigger ancestor\n while (node && node !== this.element) {\n if (isHTMLElement(node) && getTokenType(node) === ElementType.Trigger) {\n if (isTextNode(range.startContainer) && range.startContainer.parentElement === node) {\n // Caret must be after the trigger character (offset > 0) to be considered \"in\" the trigger\n if (range.startOffset > 0) {\n return node;\n }\n } else {\n return node;\n }\n }\n node = node.parentNode;\n }\n\n // Also check: cursor at offset 0 of a text node right after a trigger\n if (isTextNode(range.startContainer) && range.startOffset === 0) {\n const prevSibling = range.startContainer.previousSibling;\n if (isHTMLElement(prevSibling) && getTokenType(prevSibling) === ElementType.Trigger) {\n return prevSibling;\n }\n }\n\n return null;\n }\n\n /**\n * Sets the caret to a logical position, or creates a selection range if end is provided.\n * Handles smart positioning around atomic reference tokens and scrolls into view.\n * @param start logical start position\n * @param end optional logical end position for range selection\n */\n setPosition(start: number, end?: number): void {\n const ownerDocument = this.ownerDoc;\n if (ownerDocument.activeElement !== this.element) {\n this.element.focus();\n }\n\n const startLocation = this.findDOMLocation(start);\n\n if (!startLocation) {\n return;\n }\n\n const selection = getOwnerSelection(this.element);\n if (!selection) {\n return;\n }\n\n const endLocation = end !== undefined && end !== start ? (this.findDOMLocation(end) ?? undefined) : undefined;\n\n this.applyRange(ownerDocument, selection, startLocation, endLocation);\n\n this.state = { start, end, isValid: true };\n\n ownerDocument.dispatchEvent(new Event('selectionchange'));\n }\n\n /** Captures the current caret/selection state for later restoration. */\n capture(): void {\n const selection = getOwnerSelection(this.element);\n if (!selection?.rangeCount) {\n this.state = { start: 0, end: undefined, isValid: false };\n return;\n }\n\n const range = selection.getRangeAt(0);\n if (!this.element.contains(range.startContainer)) {\n this.state = { start: 0, end: undefined, isValid: false };\n return;\n }\n\n const start = this.calculatePositionFromRange(range, false);\n const end = range.collapsed ? undefined : this.calculatePositionFromRange(range, true);\n\n this.state = { start, end, isValid: true };\n }\n\n /** Returns the captured caret start position, or null if no valid capture exists. */\n getSavedPosition(): number | null {\n return this.state.isValid ? this.state.start : null;\n }\n\n /** Restores the caret to the previously captured state. */\n restore(offset = 0): void {\n if (!this.state.isValid || this.ownerDoc.activeElement !== this.element) {\n return;\n }\n\n this.setPosition(this.state.start + offset, this.state.end !== undefined ? this.state.end + offset : undefined);\n }\n\n /** Overrides the captured state so the next restore() positions to a calculated location.\n * Currently used only in tests — consider removing if no production use case emerges.\n */\n setCapturedPosition(start: number, end?: number): void {\n this.state = { start, end, isValid: true };\n }\n\n /** Selects all content in the element. */\n selectAll(): void {\n const selection = getOwnerSelection(this.element);\n if (!selection) {\n return;\n }\n\n if (isEmptyState(this.element)) {\n return;\n }\n\n if (this.ownerDoc.activeElement !== this.element) {\n this.element.focus();\n }\n\n const paragraphs = findAllParagraphs(this.element);\n if (paragraphs.length === 0) {\n return;\n }\n\n const firstP = paragraphs[0];\n const lastP = paragraphs[paragraphs.length - 1];\n\n const range = this.ownerDoc.createRange();\n range.setStart(firstP, 0);\n range.setEnd(lastP, lastP.childNodes.length);\n selection.removeAllRanges();\n selection.addRange(range);\n }\n\n /** Positions the caret at the end of a text node. */\n positionAfterText(textNode: Text): void {\n const range = this.ownerDoc.createRange();\n range.setStart(textNode, textNode.textContent?.length || 0);\n range.collapse(true);\n\n const selection = getOwnerSelection(this.element);\n if (selection) {\n selection.removeAllRanges();\n selection.addRange(range);\n }\n }\n\n /** Moves the caret forward by a logical offset. */\n moveForward(offset: number): void {\n const currentPos = this.getPosition();\n this.setPosition(currentPos + offset);\n }\n\n /** Moves the caret backward by a logical offset, clamped to 0. */\n moveBackward(offset: number): void {\n const currentPos = this.getPosition();\n this.setPosition(Math.max(0, currentPos - offset));\n }\n\n private calculatePositionFromRange(range: Range, useEnd: boolean): number {\n const paragraphs = findAllParagraphs(this.element);\n if (paragraphs.length === 0) {\n return 0;\n }\n\n const container = useEnd ? range.endContainer : range.startContainer;\n const offset = useEnd ? range.endOffset : range.startOffset;\n\n let position = 0;\n\n for (let pIndex = 0; pIndex < paragraphs.length; pIndex++) {\n const p = paragraphs[pIndex];\n if (pIndex > 0) {\n position += TOKEN_LENGTHS.LINE_BREAK;\n }\n\n if (!p.contains(container)) {\n position += this.countParagraphContent(p);\n } else {\n position += this.countUpToCursor(p, container, offset);\n break;\n }\n }\n\n return position;\n }\n\n private findDOMLocation(position: number): DOMLocation | null {\n const paragraphs = findAllParagraphs(this.element);\n let caretPos = 0;\n\n for (let pIndex = 0; pIndex < paragraphs.length; pIndex++) {\n const p = paragraphs[pIndex];\n\n if (pIndex > 0) {\n caretPos += TOKEN_LENGTHS.LINE_BREAK;\n if (caretPos >= position) {\n return { node: p, offset: 0 };\n }\n }\n\n const paragraphLength = this.countParagraphContent(p);\n\n if (caretPos + paragraphLength >= position) {\n return this.findLocationInParagraph(p, position - caretPos);\n }\n\n caretPos += paragraphLength;\n }\n\n const lastP = paragraphs[paragraphs.length - 1];\n if (lastP?.lastChild && isTextNode(lastP.lastChild)) {\n return { node: lastP.lastChild, offset: lastP.lastChild.textContent?.length || 0 };\n }\n return lastP ? { node: lastP, offset: lastP.childNodes.length } : null;\n }\n\n /** Resolves a DOM location for a specific child node at the given offset within a paragraph. */\n private resolveChildLocation(p: HTMLElement, child: ChildNode, offsetInChild: number): DOMLocation {\n if (isTextNode(child)) {\n return { node: child, offset: offsetInChild };\n }\n\n if (!isHTMLElement(child)) {\n return { node: p, offset: Array.from(p.childNodes).indexOf(child) };\n }\n\n const tokenType = getTokenType(child);\n const childIndex = Array.from(p.childNodes).indexOf(child);\n\n if (tokenType === ElementType.Trigger) {\n if (offsetInChild === 0) {\n return { node: p, offset: childIndex };\n }\n const triggerTextNode = child.childNodes[0];\n if (triggerTextNode && isTextNode(triggerTextNode)) {\n return { node: triggerTextNode, offset: offsetInChild };\n }\n return { node: p, offset: childIndex };\n }\n\n if (isReferenceElementType(tokenType)) {\n if (offsetInChild === 0) {\n return { node: p, offset: childIndex };\n }\n const nextSibling = child.nextSibling;\n if (nextSibling) {\n return isTextNode(nextSibling) ? { node: nextSibling, offset: 0 } : { node: p, offset: childIndex + 1 };\n }\n return { node: p, offset: p.childNodes.length };\n }\n\n return { node: p, offset: childIndex };\n }\n\n private findLocationInParagraph(p: HTMLElement, targetOffset: number): DOMLocation | null {\n let offsetInParagraph = 0;\n\n for (const child of Array.from(p.childNodes)) {\n const childLength = this.getNodeLength(child);\n\n if (offsetInParagraph + childLength >= targetOffset) {\n return this.resolveChildLocation(p, child, targetOffset - offsetInParagraph);\n }\n\n offsetInParagraph += childLength;\n }\n\n if (p.lastChild && isTextNode(p.lastChild)) {\n return { node: p.lastChild, offset: p.lastChild.textContent?.length || 0 };\n }\n return { node: p, offset: p.childNodes.length };\n }\n\n private countParagraphContent(p: Element): number {\n let count = 0;\n for (const child of Array.from(p.childNodes)) {\n count += this.getNodeLength(child);\n }\n return count;\n }\n\n private countUpToCursor(p: Element, container: Node, offset: number): number {\n if (container === p) {\n let count = 0;\n for (let i = 0; i < offset && i < p.childNodes.length; i++) {\n count += this.getNodeLength(p.childNodes[i]);\n }\n return count;\n }\n\n let count = 0;\n for (const child of Array.from(p.childNodes)) {\n if (child === container || child.contains(container)) {\n if (isTextNode(child)) {\n return count + offset;\n }\n\n if (isHTMLElement(child)) {\n const tokenType = getTokenType(child);\n\n if (tokenType === ElementType.Trigger) {\n const triggerTextNode = child.childNodes[0];\n if (triggerTextNode && isTextNode(triggerTextNode) && triggerTextNode === container) {\n return count + offset;\n }\n } else if (isReferenceElementType(tokenType)) {\n const caretSpotBefore = findElement(child, { tokenType: ElementType.CaretSpotBefore });\n const caretSpotAfter = findElement(child, { tokenType: ElementType.CaretSpotAfter });\n\n const caretInBefore =\n caretSpotBefore && (caretSpotBefore === container || caretSpotBefore.contains(container));\n const caretInAfter = caretSpotAfter && (caretSpotAfter === container || caretSpotAfter.contains(container));\n\n if (caretInBefore) {\n // Caret is in the before-spot: any typed text counts from the start of the reference\n const beforeContent = stripZeroWidthCharacters(caretSpotBefore!.textContent || '');\n if (beforeContent && isTextNode(container)) {\n return count + offset;\n }\n // No real content — caret is logically before the reference\n return count;\n } else if (caretInAfter) {\n // Caret is in the after-spot: position is after the reference (count it first)\n count += TOKEN_LENGTHS.REFERENCE;\n const afterContent = stripZeroWidthCharacters(caretSpotAfter!.textContent || '');\n if (afterContent && isTextNode(container)) {\n // offset - 1 because the zero-width character occupies position 0\n const contentOffset = Math.max(0, offset - 1);\n return count + contentOffset;\n }\n // No real content — caret is logically after the reference\n return count;\n } else {\n return count + TOKEN_LENGTHS.REFERENCE;\n }\n }\n }\n return count + this.getNodeLength(child);\n }\n count += this.getNodeLength(child);\n }\n\n return count;\n }\n}\n"]}
@@ -0,0 +1,6 @@
1
+ import { PortalContainer } from './token-renderer';
2
+ export interface TextExtractionResult {
3
+ movedTextNode: Text | null;
4
+ }
5
+ /** Extracts typed text from caret spots, moving it to the paragraph level. */
6
+ export declare function extractTextFromCaretSpots(portalContainers: Map<string, PortalContainer>, trackCaret: boolean): TextExtractionResult;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"caret-spot-utils.d.ts","sourceRoot":"","sources":["../../../../src/prompt-input/core/caret-spot-utils.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAEnD,MAAM,WAAW,oBAAoB;IACnC,aAAa,EAAE,IAAI,GAAG,IAAI,CAAC;CAC5B;AA+BD,8EAA8E;AAC9E,wBAAgB,yBAAyB,CACvC,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,EAC9C,UAAU,EAAE,OAAO,GAClB,oBAAoB,CAoBtB"}
@@ -0,0 +1,52 @@
1
+ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ import { getOwnerSelection } from './caret-controller';
4
+ import { ElementType, SPECIAL_CHARS } from './constants';
5
+ import { insertAfter, stripZeroWidthCharacters } from './dom-utils';
6
+ /** Extracts typed text from a caret-spot, moving it to the paragraph level. */
7
+ function extractFromSpot(spot, trackCaret) {
8
+ var _a, _b;
9
+ const extraText = stripZeroWidthCharacters(spot.textContent || '');
10
+ if (!extraText) {
11
+ return null;
12
+ }
13
+ let caretWasHere = false;
14
+ if (trackCaret) {
15
+ const selection = getOwnerSelection(spot);
16
+ if ((selection === null || selection === void 0 ? void 0 : selection.rangeCount) && spot.contains(selection.getRangeAt(0).startContainer)) {
17
+ caretWasHere = true;
18
+ }
19
+ }
20
+ const textNode = ((_a = spot.ownerDocument) !== null && _a !== void 0 ? _a : document).createTextNode(extraText);
21
+ const wrapper = spot.parentElement;
22
+ const isBefore = spot.getAttribute('data-type') === ElementType.CaretSpotBefore;
23
+ if (isBefore) {
24
+ (_b = wrapper.parentNode) === null || _b === void 0 ? void 0 : _b.insertBefore(textNode, wrapper);
25
+ }
26
+ else {
27
+ insertAfter(textNode, wrapper);
28
+ }
29
+ spot.textContent = SPECIAL_CHARS.ZERO_WIDTH_CHARACTER;
30
+ return caretWasHere ? textNode : null;
31
+ }
32
+ /** Extracts typed text from caret spots, moving it to the paragraph level. */
33
+ export function extractTextFromCaretSpots(portalContainers, trackCaret) {
34
+ let movedTextNode = null;
35
+ for (const container of portalContainers.values()) {
36
+ const wrapper = container.element.parentElement;
37
+ if (!wrapper) {
38
+ continue;
39
+ }
40
+ for (const child of Array.from(wrapper.children)) {
41
+ const type = child.getAttribute('data-type');
42
+ if (type === ElementType.CaretSpotBefore || type === ElementType.CaretSpotAfter) {
43
+ const result = extractFromSpot(child, trackCaret);
44
+ if (result) {
45
+ movedTextNode = result;
46
+ }
47
+ }
48
+ }
49
+ }
50
+ return { movedTextNode };
51
+ }
52
+ //# sourceMappingURL=caret-spot-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"caret-spot-utils.js","sourceRoot":"","sources":["../../../../src/prompt-input/core/caret-spot-utils.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,sCAAsC;AAEtC,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAOpE,+EAA+E;AAC/E,SAAS,eAAe,CAAC,IAAiB,EAAE,UAAmB;;IAC7D,MAAM,SAAS,GAAG,wBAAwB,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;IACnE,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,YAAY,GAAG,KAAK,CAAC;IACzB,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,SAAS,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAC1C,IAAI,CAAA,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,UAAU,KAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,EAAE,CAAC;YACnF,YAAY,GAAG,IAAI,CAAC;QACtB,CAAC;IACH,CAAC;IAED,MAAM,QAAQ,GAAG,CAAC,MAAA,IAAI,CAAC,aAAa,mCAAI,QAAQ,CAAC,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;IAC5E,MAAM,OAAO,GAAG,IAAI,CAAC,aAAc,CAAC;IACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,KAAK,WAAW,CAAC,eAAe,CAAC;IAEhF,IAAI,QAAQ,EAAE,CAAC;QACb,MAAA,OAAO,CAAC,UAAU,0CAAE,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACtD,CAAC;SAAM,CAAC;QACN,WAAW,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACjC,CAAC;IAED,IAAI,CAAC,WAAW,GAAG,aAAa,CAAC,oBAAoB,CAAC;IACtD,OAAO,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;AACxC,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,yBAAyB,CACvC,gBAA8C,EAC9C,UAAmB;IAEnB,IAAI,aAAa,GAAgB,IAAI,CAAC;IAEtC,KAAK,MAAM,SAAS,IAAI,gBAAgB,CAAC,MAAM,EAAE,EAAE,CAAC;QAClD,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC,aAAa,CAAC;QAChD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,SAAS;QACX,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YACjD,MAAM,IAAI,GAAG,KAAK,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;YAC7C,IAAI,IAAI,KAAK,WAAW,CAAC,eAAe,IAAI,IAAI,KAAK,WAAW,CAAC,cAAc,EAAE,CAAC;gBAChF,MAAM,MAAM,GAAG,eAAe,CAAC,KAAoB,EAAE,UAAU,CAAC,CAAC;gBACjE,IAAI,MAAM,EAAE,CAAC;oBACX,aAAa,GAAG,MAAM,CAAC;gBACzB,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,EAAE,aAAa,EAAE,CAAC;AAC3B,CAAC","sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { getOwnerSelection } from './caret-controller';\nimport { ElementType, SPECIAL_CHARS } from './constants';\nimport { insertAfter, stripZeroWidthCharacters } from './dom-utils';\nimport { PortalContainer } from './token-renderer';\n\nexport interface TextExtractionResult {\n movedTextNode: Text | null;\n}\n\n/** Extracts typed text from a caret-spot, moving it to the paragraph level. */\nfunction extractFromSpot(spot: HTMLElement, trackCaret: boolean): Text | null {\n const extraText = stripZeroWidthCharacters(spot.textContent || '');\n if (!extraText) {\n return null;\n }\n\n let caretWasHere = false;\n if (trackCaret) {\n const selection = getOwnerSelection(spot);\n if (selection?.rangeCount && spot.contains(selection.getRangeAt(0).startContainer)) {\n caretWasHere = true;\n }\n }\n\n const textNode = (spot.ownerDocument ?? document).createTextNode(extraText);\n const wrapper = spot.parentElement!;\n const isBefore = spot.getAttribute('data-type') === ElementType.CaretSpotBefore;\n\n if (isBefore) {\n wrapper.parentNode?.insertBefore(textNode, wrapper);\n } else {\n insertAfter(textNode, wrapper);\n }\n\n spot.textContent = SPECIAL_CHARS.ZERO_WIDTH_CHARACTER;\n return caretWasHere ? textNode : null;\n}\n\n/** Extracts typed text from caret spots, moving it to the paragraph level. */\nexport function extractTextFromCaretSpots(\n portalContainers: Map<string, PortalContainer>,\n trackCaret: boolean\n): TextExtractionResult {\n let movedTextNode: Text | null = null;\n\n for (const container of portalContainers.values()) {\n const wrapper = container.element.parentElement;\n if (!wrapper) {\n continue;\n }\n for (const child of Array.from(wrapper.children)) {\n const type = child.getAttribute('data-type');\n if (type === ElementType.CaretSpotBefore || type === ElementType.CaretSpotAfter) {\n const result = extractFromSpot(child as HTMLElement, trackCaret);\n if (result) {\n movedTextNode = result;\n }\n }\n }\n }\n\n return { movedTextNode };\n}\n"]}
@@ -0,0 +1,25 @@
1
+ /** Updates the mouse-down tracking flag used to skip selection normalization during drag. */
2
+ export declare function setMouseDown(value: boolean): void;
3
+ /** Returns whether the mouse is currently pressed. */
4
+ export declare function getMouseDown(): boolean;
5
+ /**
6
+ * Checks whether a node is inside a reference element's internals or directly
7
+ * on the contentEditable div (not inside a paragraph). These are non-typeable
8
+ * positions where the caret should not rest.
9
+ */
10
+ export declare function isNonTypeablePosition(node: Node | null): boolean;
11
+ /**
12
+ * Finds the reference wrapper element that contains the given node, if any.
13
+ * Returns null if the node is not inside a reference element.
14
+ */
15
+ export declare function findContainingReference(node: Node | null): HTMLElement | null;
16
+ /**
17
+ * Moves a collapsed caret out of non-typeable positions into the parent paragraph.
18
+ * Handles caret inside reference element internals (caret spots, token container)
19
+ * and caret on the contentEditable div itself (clicking on padding).
20
+ * Some browsers (notably Firefox) may place the caret in these positions on focus
21
+ * or imprecise clicks.
22
+ */
23
+ export declare function normalizeCollapsedCaret(selection: Selection | null): void;
24
+ /** Adjusts non-collapsed selection boundaries to exclude caret spot elements. */
25
+ export declare function normalizeSelection(selection: Selection | null, skipCaretSpots?: boolean): void;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"caret-utils.d.ts","sourceRoot":"","sources":["../../../../src/prompt-input/core/caret-utils.ts"],"names":[],"mappings":"AAYA,6FAA6F;AAC7F,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAEjD;AAED,sDAAsD;AACtD,wBAAgB,YAAY,IAAI,OAAO,CAEtC;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,OAAO,CAgBhE;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,WAAW,GAAG,IAAI,CAW7E;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI,GAAG,IAAI,CA0DzE;AAED,iFAAiF;AACjF,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI,EAAE,cAAc,GAAE,OAAe,GAAG,IAAI,CAyFrG"}
@@ -0,0 +1,183 @@
1
+ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ import { isHTMLElement } from '../../internal/utils/dom';
4
+ import { ElementType } from './constants';
5
+ import { getTokenType, isCaretSpotType, isReferenceElementType } from './dom-utils';
6
+ import { isTextNode } from './type-guards';
7
+ // Module-level flag: mouse state is inherently global (one mouse per document)
8
+ // and must be accessible from the standalone normalizeSelection function.
9
+ let isMouseDown = false;
10
+ /** Updates the mouse-down tracking flag used to skip selection normalization during drag. */
11
+ export function setMouseDown(value) {
12
+ isMouseDown = value;
13
+ }
14
+ /** Returns whether the mouse is currently pressed. */
15
+ export function getMouseDown() {
16
+ return isMouseDown;
17
+ }
18
+ /**
19
+ * Checks whether a node is inside a reference element's internals or directly
20
+ * on the contentEditable div (not inside a paragraph). These are non-typeable
21
+ * positions where the caret should not rest.
22
+ */
23
+ export function isNonTypeablePosition(node) {
24
+ while (node) {
25
+ if (node.nodeName === 'P') {
26
+ return false;
27
+ }
28
+ if (isHTMLElement(node)) {
29
+ if (isReferenceElementType(getTokenType(node))) {
30
+ return true;
31
+ }
32
+ if (node.getAttribute('contenteditable') === 'true') {
33
+ return true;
34
+ }
35
+ }
36
+ node = node.parentNode;
37
+ }
38
+ return false;
39
+ }
40
+ /**
41
+ * Finds the reference wrapper element that contains the given node, if any.
42
+ * Returns null if the node is not inside a reference element.
43
+ */
44
+ export function findContainingReference(node) {
45
+ while (node) {
46
+ if (node.nodeName === 'P') {
47
+ return null;
48
+ }
49
+ if (isHTMLElement(node) && isReferenceElementType(getTokenType(node))) {
50
+ return node;
51
+ }
52
+ node = node.parentNode;
53
+ }
54
+ return null;
55
+ }
56
+ /**
57
+ * Moves a collapsed caret out of non-typeable positions into the parent paragraph.
58
+ * Handles caret inside reference element internals (caret spots, token container)
59
+ * and caret on the contentEditable div itself (clicking on padding).
60
+ * Some browsers (notably Firefox) may place the caret in these positions on focus
61
+ * or imprecise clicks.
62
+ */
63
+ export function normalizeCollapsedCaret(selection) {
64
+ var _a;
65
+ if (!(selection === null || selection === void 0 ? void 0 : selection.rangeCount)) {
66
+ return;
67
+ }
68
+ const range = selection.getRangeAt(0);
69
+ if (!range.collapsed) {
70
+ return;
71
+ }
72
+ const container = range.startContainer;
73
+ // Walk up from the caret position to find a reference wrapper.
74
+ let node = isTextNode(container) ? container.parentElement : container;
75
+ let wrapper = null;
76
+ let caretSpotType = null;
77
+ while (node && isHTMLElement(node)) {
78
+ const tokenType = getTokenType(node);
79
+ if (isCaretSpotType(tokenType)) {
80
+ caretSpotType = tokenType;
81
+ }
82
+ if (isReferenceElementType(tokenType)) {
83
+ wrapper = node;
84
+ break;
85
+ }
86
+ node = node.parentElement;
87
+ }
88
+ if (!wrapper) {
89
+ return;
90
+ }
91
+ const paragraph = wrapper.parentElement;
92
+ if (!paragraph) {
93
+ return;
94
+ }
95
+ const wrapperIndex = Array.from(paragraph.childNodes).indexOf(wrapper);
96
+ // If we know the caret was in the before-spot, position before the wrapper.
97
+ // Otherwise position after it (after-spot, token container, or wrapper itself).
98
+ const newOffset = caretSpotType === ElementType.CaretSpotBefore ? wrapperIndex : wrapperIndex + 1;
99
+ // Guard: skip if the selection is already at the target position.
100
+ if (range.startContainer === paragraph && range.startOffset === newOffset) {
101
+ return;
102
+ }
103
+ const newRange = ((_a = container.ownerDocument) !== null && _a !== void 0 ? _a : document).createRange();
104
+ newRange.setStart(paragraph, newOffset);
105
+ newRange.collapse(true);
106
+ selection.removeAllRanges();
107
+ selection.addRange(newRange);
108
+ }
109
+ /** Adjusts non-collapsed selection boundaries to exclude caret spot elements. */
110
+ export function normalizeSelection(selection, skipCaretSpots = false) {
111
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j;
112
+ if (!(selection === null || selection === void 0 ? void 0 : selection.rangeCount)) {
113
+ return;
114
+ }
115
+ const range = selection.getRangeAt(0);
116
+ if (range.collapsed || isMouseDown || skipCaretSpots) {
117
+ return;
118
+ }
119
+ const normalizeBoundary = (container) => {
120
+ if (!isTextNode(container)) {
121
+ return null;
122
+ }
123
+ const parent = container.parentElement;
124
+ if (!parent) {
125
+ return null;
126
+ }
127
+ const parentType = getTokenType(parent);
128
+ if (!isCaretSpotType(parentType)) {
129
+ return null;
130
+ }
131
+ const wrapper = parent.parentElement;
132
+ if (!wrapper || !isReferenceElementType(getTokenType(wrapper))) {
133
+ return null;
134
+ }
135
+ const paragraph = wrapper.parentElement;
136
+ if (!paragraph) {
137
+ return null;
138
+ }
139
+ const wrapperIndex = Array.from(paragraph.childNodes).indexOf(wrapper);
140
+ const newOffset = parentType === ElementType.CaretSpotBefore ? wrapperIndex : wrapperIndex + 1;
141
+ return { container: paragraph, offset: newOffset };
142
+ };
143
+ const normalizedStart = normalizeBoundary(range.startContainer);
144
+ const normalizedEnd = normalizeBoundary(range.endContainer);
145
+ if (!normalizedStart && !normalizedEnd) {
146
+ return;
147
+ }
148
+ const newStartContainer = (_a = normalizedStart === null || normalizedStart === void 0 ? void 0 : normalizedStart.container) !== null && _a !== void 0 ? _a : range.startContainer;
149
+ const newStartOffset = (_b = normalizedStart === null || normalizedStart === void 0 ? void 0 : normalizedStart.offset) !== null && _b !== void 0 ? _b : range.startOffset;
150
+ const newEndContainer = (_c = normalizedEnd === null || normalizedEnd === void 0 ? void 0 : normalizedEnd.container) !== null && _c !== void 0 ? _c : range.endContainer;
151
+ const newEndOffset = (_d = normalizedEnd === null || normalizedEnd === void 0 ? void 0 : normalizedEnd.offset) !== null && _d !== void 0 ? _d : range.endOffset;
152
+ // Guard: skip if the selection already matches the normalized boundaries.
153
+ // Prevents Safari from entering an infinite selectionchange loop in RTL.
154
+ if (range.startContainer === newStartContainer &&
155
+ range.startOffset === newStartOffset &&
156
+ range.endContainer === newEndContainer &&
157
+ range.endOffset === newEndOffset) {
158
+ return;
159
+ }
160
+ // Determine if the selection is backward (focus before anchor in document order).
161
+ // Range always has start <= end, but the user may be selecting in reverse.
162
+ const isBackward = selection.anchorNode === range.endContainer &&
163
+ selection.anchorOffset === range.endOffset &&
164
+ selection.focusNode === range.startContainer &&
165
+ selection.focusOffset === range.startOffset;
166
+ if (isBackward) {
167
+ // Preserve backward direction: collapse to anchor (end), extend to focus (start)
168
+ const anchorContainer = (_e = normalizedEnd === null || normalizedEnd === void 0 ? void 0 : normalizedEnd.container) !== null && _e !== void 0 ? _e : range.endContainer;
169
+ const anchorOffset = (_f = normalizedEnd === null || normalizedEnd === void 0 ? void 0 : normalizedEnd.offset) !== null && _f !== void 0 ? _f : range.endOffset;
170
+ const focusContainer = (_g = normalizedStart === null || normalizedStart === void 0 ? void 0 : normalizedStart.container) !== null && _g !== void 0 ? _g : range.startContainer;
171
+ const focusOffset = (_h = normalizedStart === null || normalizedStart === void 0 ? void 0 : normalizedStart.offset) !== null && _h !== void 0 ? _h : range.startOffset;
172
+ selection.collapse(anchorContainer, anchorOffset);
173
+ selection.extend(focusContainer, focusOffset);
174
+ }
175
+ else {
176
+ const updatedRange = ((_j = range.startContainer.ownerDocument) !== null && _j !== void 0 ? _j : document).createRange();
177
+ updatedRange.setStart(newStartContainer, newStartOffset);
178
+ updatedRange.setEnd(newEndContainer, newEndOffset);
179
+ selection.removeAllRanges();
180
+ selection.addRange(updatedRange);
181
+ }
182
+ }
183
+ //# sourceMappingURL=caret-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"caret-utils.js","sourceRoot":"","sources":["../../../../src/prompt-input/core/caret-utils.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { isHTMLElement } from '../../internal/utils/dom';\nimport { ElementType } from './constants';\nimport { getTokenType, isCaretSpotType, isReferenceElementType } from './dom-utils';\nimport { isTextNode } from './type-guards';\n\n// Module-level flag: mouse state is inherently global (one mouse per document)\n// and must be accessible from the standalone normalizeSelection function.\nlet isMouseDown = false;\n\n/** Updates the mouse-down tracking flag used to skip selection normalization during drag. */\nexport function setMouseDown(value: boolean): void {\n isMouseDown = value;\n}\n\n/** Returns whether the mouse is currently pressed. */\nexport function getMouseDown(): boolean {\n return isMouseDown;\n}\n\n/**\n * Checks whether a node is inside a reference element's internals or directly\n * on the contentEditable div (not inside a paragraph). These are non-typeable\n * positions where the caret should not rest.\n */\nexport function isNonTypeablePosition(node: Node | null): boolean {\n while (node) {\n if (node.nodeName === 'P') {\n return false;\n }\n if (isHTMLElement(node)) {\n if (isReferenceElementType(getTokenType(node))) {\n return true;\n }\n if (node.getAttribute('contenteditable') === 'true') {\n return true;\n }\n }\n node = node.parentNode;\n }\n return false;\n}\n\n/**\n * Finds the reference wrapper element that contains the given node, if any.\n * Returns null if the node is not inside a reference element.\n */\nexport function findContainingReference(node: Node | null): HTMLElement | null {\n while (node) {\n if (node.nodeName === 'P') {\n return null;\n }\n if (isHTMLElement(node) && isReferenceElementType(getTokenType(node))) {\n return node;\n }\n node = node.parentNode;\n }\n return null;\n}\n\n/**\n * Moves a collapsed caret out of non-typeable positions into the parent paragraph.\n * Handles caret inside reference element internals (caret spots, token container)\n * and caret on the contentEditable div itself (clicking on padding).\n * Some browsers (notably Firefox) may place the caret in these positions on focus\n * or imprecise clicks.\n */\nexport function normalizeCollapsedCaret(selection: Selection | null): void {\n if (!selection?.rangeCount) {\n return;\n }\n\n const range = selection.getRangeAt(0);\n\n if (!range.collapsed) {\n return;\n }\n\n const container = range.startContainer;\n\n // Walk up from the caret position to find a reference wrapper.\n let node: Node | null = isTextNode(container) ? container.parentElement : (container as HTMLElement);\n let wrapper: HTMLElement | null = null;\n let caretSpotType: ElementType | null = null;\n\n while (node && isHTMLElement(node)) {\n const tokenType = getTokenType(node);\n\n if (isCaretSpotType(tokenType)) {\n caretSpotType = tokenType as ElementType;\n }\n\n if (isReferenceElementType(tokenType)) {\n wrapper = node;\n break;\n }\n\n node = node.parentElement;\n }\n\n if (!wrapper) {\n return;\n }\n\n const paragraph = wrapper.parentElement;\n if (!paragraph) {\n return;\n }\n\n const wrapperIndex = Array.from(paragraph.childNodes).indexOf(wrapper);\n\n // If we know the caret was in the before-spot, position before the wrapper.\n // Otherwise position after it (after-spot, token container, or wrapper itself).\n const newOffset = caretSpotType === ElementType.CaretSpotBefore ? wrapperIndex : wrapperIndex + 1;\n\n // Guard: skip if the selection is already at the target position.\n if (range.startContainer === paragraph && range.startOffset === newOffset) {\n return;\n }\n\n const newRange = (container.ownerDocument ?? document).createRange();\n newRange.setStart(paragraph, newOffset);\n newRange.collapse(true);\n selection.removeAllRanges();\n selection.addRange(newRange);\n}\n\n/** Adjusts non-collapsed selection boundaries to exclude caret spot elements. */\nexport function normalizeSelection(selection: Selection | null, skipCaretSpots: boolean = false): void {\n if (!selection?.rangeCount) {\n return;\n }\n\n const range = selection.getRangeAt(0);\n\n if (range.collapsed || isMouseDown || skipCaretSpots) {\n return;\n }\n\n const normalizeBoundary = (container: Node) => {\n if (!isTextNode(container)) {\n return null;\n }\n\n const parent = container.parentElement;\n if (!parent) {\n return null;\n }\n\n const parentType = getTokenType(parent);\n if (!isCaretSpotType(parentType)) {\n return null;\n }\n\n const wrapper = parent.parentElement;\n if (!wrapper || !isReferenceElementType(getTokenType(wrapper))) {\n return null;\n }\n\n const paragraph = wrapper.parentElement;\n if (!paragraph) {\n return null;\n }\n\n const wrapperIndex = Array.from(paragraph.childNodes).indexOf(wrapper);\n const newOffset = parentType === ElementType.CaretSpotBefore ? wrapperIndex : wrapperIndex + 1;\n\n return { container: paragraph, offset: newOffset };\n };\n\n const normalizedStart = normalizeBoundary(range.startContainer);\n const normalizedEnd = normalizeBoundary(range.endContainer);\n\n if (!normalizedStart && !normalizedEnd) {\n return;\n }\n\n const newStartContainer = normalizedStart?.container ?? range.startContainer;\n const newStartOffset = normalizedStart?.offset ?? range.startOffset;\n const newEndContainer = normalizedEnd?.container ?? range.endContainer;\n const newEndOffset = normalizedEnd?.offset ?? range.endOffset;\n\n // Guard: skip if the selection already matches the normalized boundaries.\n // Prevents Safari from entering an infinite selectionchange loop in RTL.\n if (\n range.startContainer === newStartContainer &&\n range.startOffset === newStartOffset &&\n range.endContainer === newEndContainer &&\n range.endOffset === newEndOffset\n ) {\n return;\n }\n\n // Determine if the selection is backward (focus before anchor in document order).\n // Range always has start <= end, but the user may be selecting in reverse.\n const isBackward =\n selection.anchorNode === range.endContainer &&\n selection.anchorOffset === range.endOffset &&\n selection.focusNode === range.startContainer &&\n selection.focusOffset === range.startOffset;\n\n if (isBackward) {\n // Preserve backward direction: collapse to anchor (end), extend to focus (start)\n const anchorContainer = normalizedEnd?.container ?? range.endContainer;\n const anchorOffset = normalizedEnd?.offset ?? range.endOffset;\n const focusContainer = normalizedStart?.container ?? range.startContainer;\n const focusOffset = normalizedStart?.offset ?? range.startOffset;\n\n selection.collapse(anchorContainer, anchorOffset);\n selection.extend(focusContainer, focusOffset);\n } else {\n const updatedRange = (range.startContainer.ownerDocument ?? document).createRange();\n updatedRange.setStart(newStartContainer, newStartOffset);\n updatedRange.setEnd(newEndContainer, newEndOffset);\n selection.removeAllRanges();\n selection.addRange(updatedRange);\n }\n}\n"]}
@@ -0,0 +1,14 @@
1
+ export declare enum ElementType {
2
+ Reference = "reference",
3
+ Pinned = "pinned",
4
+ CaretSpotBefore = "cursor-spot-before",
5
+ CaretSpotAfter = "cursor-spot-after",
6
+ Trigger = "trigger",
7
+ TrailingBreak = "trailing-break",
8
+ }
9
+ export declare const SPECIAL_CHARS: {
10
+ ZERO_WIDTH_CHARACTER: string;
11
+ NEWLINE: string;
12
+ };
13
+ export declare const DEFAULT_MAX_ROWS = 3;
14
+ export declare const NEXT_TICK_TIMEOUT = 0;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../../src/prompt-input/core/constants.ts"],"names":[],"mappings":"AAGA,oBAAY,WAAW;IACrB,SAAS,cAAc;IACvB,MAAM,WAAW;IACjB,eAAe,uBAAuB;IACtC,cAAc,sBAAsB;IACpC,OAAO,YAAY;IACnB,aAAa,mBAAmB;CACjC;AAED,eAAO,MAAM,aAAa;;;CAGzB,CAAC;AAEF,eAAO,MAAM,gBAAgB,IAAI,CAAC;AAClC,eAAO,MAAM,iBAAiB,IAAI,CAAC"}
@@ -0,0 +1,18 @@
1
+ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ export var ElementType;
4
+ (function (ElementType) {
5
+ ElementType["Reference"] = "reference";
6
+ ElementType["Pinned"] = "pinned";
7
+ ElementType["CaretSpotBefore"] = "cursor-spot-before";
8
+ ElementType["CaretSpotAfter"] = "cursor-spot-after";
9
+ ElementType["Trigger"] = "trigger";
10
+ ElementType["TrailingBreak"] = "trailing-break";
11
+ })(ElementType || (ElementType = {}));
12
+ export const SPECIAL_CHARS = {
13
+ ZERO_WIDTH_CHARACTER: '\u200B',
14
+ NEWLINE: '\n',
15
+ };
16
+ export const DEFAULT_MAX_ROWS = 3;
17
+ export const NEXT_TICK_TIMEOUT = 0;
18
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../../src/prompt-input/core/constants.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,sCAAsC;AAEtC,MAAM,CAAN,IAAY,WAOX;AAPD,WAAY,WAAW;IACrB,sCAAuB,CAAA;IACvB,gCAAiB,CAAA;IACjB,qDAAsC,CAAA;IACtC,mDAAoC,CAAA;IACpC,kCAAmB,CAAA;IACnB,+CAAgC,CAAA;AAClC,CAAC,EAPW,WAAW,KAAX,WAAW,QAOtB;AAED,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,oBAAoB,EAAE,QAAQ;IAC9B,OAAO,EAAE,IAAI;CACd,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAClC,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC","sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nexport enum ElementType {\n Reference = 'reference',\n Pinned = 'pinned',\n CaretSpotBefore = 'cursor-spot-before',\n CaretSpotAfter = 'cursor-spot-after',\n Trigger = 'trigger',\n TrailingBreak = 'trailing-break',\n}\n\nexport const SPECIAL_CHARS = {\n ZERO_WIDTH_CHARACTER: '\\u200B',\n NEWLINE: '\\n',\n};\n\nexport const DEFAULT_MAX_ROWS = 3;\nexport const NEXT_TICK_TIMEOUT = 0;\n"]}
@@ -0,0 +1,60 @@
1
+ import { ElementType } from './constants';
2
+ /** Reads the data-type attribute from an element and returns it as a typed ElementType. */
3
+ export declare function getTokenType(element: HTMLElement): ElementType | null;
4
+ /** Checks if a token type represents a reference element (inline or pinned). */
5
+ export declare function isReferenceElementType(tokenType: ElementType | string | null): boolean;
6
+ /** Inserts a node immediately after a reference node in the DOM. */
7
+ export declare function insertAfter(newNode: Node, referenceNode: Node): void;
8
+ /** Creates a styled paragraph element for the contentEditable container. */
9
+ export declare function createParagraph(ownerDoc?: Document): HTMLParagraphElement;
10
+ /** Creates a trailing BR element used as a placeholder in empty paragraphs. */
11
+ export declare function createTrailingBreak(ownerDoc?: Document): HTMLBRElement;
12
+ /**
13
+ * Generates a unique ID for DOM elements outside of React context.
14
+ * Uses the same format as component-toolkit's useRandomId hook, but as a plain
15
+ * function since token IDs are generated during DOM manipulation (not in React renders).
16
+ */
17
+ export declare function generateTokenId(): string;
18
+ /** Strips zero-width characters used for cursor positioning. */
19
+ export declare function stripZeroWidthCharacters(text: string): string;
20
+ interface TokenQueryOptions {
21
+ tokenType?: string | string[];
22
+ tokenId?: string;
23
+ }
24
+ /** Finds the first element matching the given token type and/or token ID within a container. */
25
+ export declare function findElement(container: HTMLElement, options: TokenQueryOptions): HTMLElement | null;
26
+ /** Returns all paragraph elements within a container. */
27
+ export declare function findAllParagraphs(container: HTMLElement | DocumentFragment): HTMLParagraphElement[];
28
+ /** Checks if an element has no meaningful content (ignoring whitespace and trailing BRs). */
29
+ export declare function isElementEffectivelyEmpty(element: HTMLElement): boolean;
30
+ export declare function hasOnlyTrailingBR(paragraph: HTMLElement): boolean;
31
+ export declare function isEmptyState(element: HTMLElement): boolean;
32
+ /** Resets the element to a single empty paragraph with a trailing BR. */
33
+ export declare function setEmptyState(element: HTMLElement): void;
34
+ /** Checks if a token type represents a caret spot element. */
35
+ export declare function isCaretSpotType(tokenType: ElementType | string | null): boolean;
36
+ export interface AdjacentTokenResult {
37
+ sibling: Node | null;
38
+ isReferenceToken: boolean;
39
+ }
40
+ /**
41
+ * Finds the adjacent sibling node in the given direction and checks if it's a reference token.
42
+ * @param container the node where the cursor currently sits
43
+ * @param offset cursor offset within the container
44
+ * @param direction which direction to look
45
+ */
46
+ export declare function findAdjacentToken(container: Node, offset: number, direction: 'backward' | 'forward'): AdjacentTokenResult;
47
+ /**
48
+ * When the caret lands immediately after a trigger element (e.g. at offset 0 of the
49
+ * next text node, or at the paragraph-level offset right after the trigger), nudge it
50
+ * inside the trigger's text node so that `findActiveTrigger` detects it correctly.
51
+ * @param cancelledIds Set of trigger IDs that are cancelled — caret won't be nudged into these.
52
+ */
53
+ export declare function normalizeCaretIntoTrigger(editableElement: HTMLElement, cancelledIds?: Set<string>): void;
54
+ /**
55
+ * Scrolls the caret into view within a scrollable contentEditable element.
56
+ * Inserts a temporary span at the selection to measure position, scrolls if
57
+ * needed, then removes the span.
58
+ */
59
+ export declare function scrollCaretIntoView(element: HTMLElement): void;
60
+ export {};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dom-utils.d.ts","sourceRoot":"","sources":["../../../../src/prompt-input/core/dom-utils.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,WAAW,EAAiB,MAAM,aAAa,CAAC;AAKzD,2FAA2F;AAC3F,wBAAgB,YAAY,CAAC,OAAO,EAAE,WAAW,GAAG,WAAW,GAAG,IAAI,CAarE;AACD,gFAAgF;AAChF,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,WAAW,GAAG,MAAM,GAAG,IAAI,GAAG,OAAO,CAEtF;AAED,oEAAoE;AACpE,wBAAgB,WAAW,CAAC,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,GAAG,IAAI,CAWpE;AAED,4EAA4E;AAC5E,wBAAgB,eAAe,CAAC,QAAQ,GAAE,QAAmB,GAAG,oBAAoB,CAInF;AAED,+EAA+E;AAC/E,wBAAgB,mBAAmB,CAAC,QAAQ,GAAE,QAAmB,GAAG,aAAa,CAIhF;AAID;;;;GAIG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED,gEAAgE;AAChE,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE7D;AAED,UAAU,iBAAiB;IACzB,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAeD,gGAAgG;AAChG,wBAAgB,WAAW,CAAC,SAAS,EAAE,WAAW,EAAE,OAAO,EAAE,iBAAiB,GAAG,WAAW,GAAG,IAAI,CAGlG;AAED,yDAAyD;AACzD,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,WAAW,GAAG,gBAAgB,GAAG,oBAAoB,EAAE,CAEnG;AAED,6FAA6F;AAC7F,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAiBvE;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,WAAW,GAAG,OAAO,CAEjE;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAG1D;AAED,yEAAyE;AACzE,wBAAgB,aAAa,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,CAWxD;AAED,8DAA8D;AAC9D,wBAAgB,eAAe,CAAC,SAAS,EAAE,WAAW,GAAG,MAAM,GAAG,IAAI,GAAG,OAAO,CAE/E;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,IAAI,GAAG,IAAI,CAAC;IACrB,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,IAAI,EACf,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,UAAU,GAAG,SAAS,GAChC,mBAAmB,CAqBrB;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,eAAe,EAAE,WAAW,EAAE,YAAY,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,CAuDxG;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,CA4C9D"}