@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.
- package/app-layout/visual-refresh-toolbar/toolbar/index.js +1 -1
- package/app-layout/visual-refresh-toolbar/toolbar/index.js.map +1 -1
- package/app-layout/visual-refresh-toolbar/toolbar/trigger-button/index.d.ts +1 -1
- package/app-layout/visual-refresh-toolbar/toolbar/trigger-button/index.d.ts.map +1 -1
- package/app-layout/visual-refresh-toolbar/toolbar/trigger-button/index.js +1 -2
- package/app-layout/visual-refresh-toolbar/toolbar/trigger-button/index.js.map +1 -1
- package/app-layout/visual-refresh-toolbar/toolbar/trigger-button/styles.css.js +6 -7
- package/app-layout/visual-refresh-toolbar/toolbar/trigger-button/styles.scoped.css +20 -26
- package/app-layout/visual-refresh-toolbar/toolbar/trigger-button/styles.selectors.js +6 -7
- package/button/styles.css.js +22 -22
- package/button/styles.scoped.css +78 -78
- package/button/styles.selectors.js +22 -22
- package/help-panel/styles.css.js +6 -6
- package/help-panel/styles.scoped.css +70 -70
- package/help-panel/styles.selectors.js +6 -6
- package/i18n/messages/all.all.js +1 -1
- package/i18n/messages/all.all.json +1 -1
- package/i18n/messages/all.ar.js +1 -1
- package/i18n/messages/all.ar.json +1 -1
- package/i18n/messages/all.de.js +1 -1
- package/i18n/messages/all.de.json +1 -1
- package/i18n/messages/all.en-GB.js +1 -1
- package/i18n/messages/all.en-GB.json +1 -1
- package/i18n/messages/all.en.js +1 -1
- package/i18n/messages/all.en.json +1 -1
- package/i18n/messages/all.es.js +1 -1
- package/i18n/messages/all.es.json +1 -1
- package/i18n/messages/all.fr.js +1 -1
- package/i18n/messages/all.fr.json +1 -1
- package/i18n/messages/all.id.js +1 -1
- package/i18n/messages/all.id.json +1 -1
- package/i18n/messages/all.it.js +1 -1
- package/i18n/messages/all.it.json +1 -1
- package/i18n/messages/all.ja.js +1 -1
- package/i18n/messages/all.ja.json +1 -1
- package/i18n/messages/all.ko.js +1 -1
- package/i18n/messages/all.ko.json +1 -1
- package/i18n/messages/all.pt-BR.js +1 -1
- package/i18n/messages/all.pt-BR.json +1 -1
- package/i18n/messages/all.tr.js +1 -1
- package/i18n/messages/all.tr.json +1 -1
- package/i18n/messages/all.zh-CN.js +1 -1
- package/i18n/messages/all.zh-CN.json +1 -1
- package/i18n/messages/all.zh-TW.js +1 -1
- package/i18n/messages/all.zh-TW.json +1 -1
- package/i18n/messages-types.d.ts +18 -0
- package/i18n/messages-types.d.ts.map +1 -1
- package/i18n/messages-types.js.map +1 -1
- package/internal/base-component/styles.scoped.css +63 -4
- package/internal/components/token-list/styles.css.js +10 -10
- package/internal/components/token-list/styles.scoped.css +25 -25
- package/internal/components/token-list/styles.selectors.js +10 -10
- package/internal/environment.js +2 -2
- package/internal/environment.json +2 -2
- package/internal/generated/styles/tokens.d.ts +17 -3
- package/internal/generated/styles/tokens.js +17 -3
- package/internal/generated/theming/index.cjs +417 -9
- package/internal/generated/theming/index.cjs.d.ts +189 -0
- package/internal/generated/theming/index.d.ts +189 -0
- package/internal/generated/theming/index.js +417 -9
- package/internal/keycode.d.ts +3 -1
- package/internal/keycode.d.ts.map +1 -1
- package/internal/keycode.js +5 -0
- package/internal/keycode.js.map +1 -1
- package/internal/manifest.json +1 -1
- package/internal/utils/handle-key.d.ts +22 -1
- package/internal/utils/handle-key.d.ts.map +1 -1
- package/internal/utils/handle-key.js +62 -4
- package/internal/utils/handle-key.js.map +1 -1
- package/item-card/styles.css.js +14 -14
- package/item-card/styles.scoped.css +52 -52
- package/item-card/styles.selectors.js +14 -14
- package/link/styles.css.js +21 -21
- package/link/styles.scoped.css +81 -81
- package/link/styles.selectors.js +21 -21
- package/package.json +1 -1
- package/prompt-input/components/menu-dropdown.d.ts +33 -0
- package/prompt-input/components/menu-dropdown.d.ts.map +1 -0
- package/prompt-input/components/menu-dropdown.js +48 -0
- package/prompt-input/components/menu-dropdown.js.map +1 -0
- package/prompt-input/components/textarea-mode.d.ts +15 -0
- package/prompt-input/components/textarea-mode.d.ts.map +1 -0
- package/prompt-input/components/textarea-mode.js +8 -0
- package/prompt-input/components/textarea-mode.js.map +1 -0
- package/prompt-input/components/token-mode.d.ts +61 -0
- package/prompt-input/components/token-mode.d.ts.map +1 -0
- package/prompt-input/components/token-mode.js +37 -0
- package/prompt-input/components/token-mode.js.map +1 -0
- package/prompt-input/core/caret-controller.d.ts +73 -0
- package/prompt-input/core/caret-controller.d.ts.map +1 -0
- package/prompt-input/core/caret-controller.js +396 -0
- package/prompt-input/core/caret-controller.js.map +1 -0
- package/prompt-input/core/caret-spot-utils.d.ts +6 -0
- package/prompt-input/core/caret-spot-utils.d.ts.map +1 -0
- package/prompt-input/core/caret-spot-utils.js +52 -0
- package/prompt-input/core/caret-spot-utils.js.map +1 -0
- package/prompt-input/core/caret-utils.d.ts +25 -0
- package/prompt-input/core/caret-utils.d.ts.map +1 -0
- package/prompt-input/core/caret-utils.js +183 -0
- package/prompt-input/core/caret-utils.js.map +1 -0
- package/prompt-input/core/constants.d.ts +14 -0
- package/prompt-input/core/constants.d.ts.map +1 -0
- package/prompt-input/core/constants.js +18 -0
- package/prompt-input/core/constants.js.map +1 -0
- package/prompt-input/core/dom-utils.d.ts +60 -0
- package/prompt-input/core/dom-utils.d.ts.map +1 -0
- package/prompt-input/core/dom-utils.js +252 -0
- package/prompt-input/core/dom-utils.js.map +1 -0
- package/prompt-input/core/event-handlers.d.ts +68 -0
- package/prompt-input/core/event-handlers.d.ts.map +1 -0
- package/prompt-input/core/event-handlers.js +678 -0
- package/prompt-input/core/event-handlers.js.map +1 -0
- package/prompt-input/core/menu-state.d.ts +62 -0
- package/prompt-input/core/menu-state.d.ts.map +1 -0
- package/prompt-input/core/menu-state.js +168 -0
- package/prompt-input/core/menu-state.js.map +1 -0
- package/prompt-input/core/token-operations.d.ts +21 -0
- package/prompt-input/core/token-operations.d.ts.map +1 -0
- package/prompt-input/core/token-operations.js +273 -0
- package/prompt-input/core/token-operations.js.map +1 -0
- package/prompt-input/core/token-renderer.d.ts +26 -0
- package/prompt-input/core/token-renderer.d.ts.map +1 -0
- package/prompt-input/core/token-renderer.js +230 -0
- package/prompt-input/core/token-renderer.js.map +1 -0
- package/prompt-input/core/token-utils.d.ts +22 -0
- package/prompt-input/core/token-utils.d.ts.map +1 -0
- package/prompt-input/core/token-utils.js +262 -0
- package/prompt-input/core/token-utils.js.map +1 -0
- package/prompt-input/core/trigger-utils.d.ts +18 -0
- package/prompt-input/core/trigger-utils.d.ts.map +1 -0
- package/prompt-input/core/trigger-utils.js +174 -0
- package/prompt-input/core/trigger-utils.js.map +1 -0
- package/prompt-input/core/type-guards.d.ts +13 -0
- package/prompt-input/core/type-guards.d.ts.map +1 -0
- package/prompt-input/core/type-guards.js +36 -0
- package/prompt-input/core/type-guards.js.map +1 -0
- package/prompt-input/index.d.ts +1 -1
- package/prompt-input/index.d.ts.map +1 -1
- package/prompt-input/index.js.map +1 -1
- package/prompt-input/interfaces.d.ts +356 -7
- package/prompt-input/interfaces.d.ts.map +1 -1
- package/prompt-input/interfaces.js.map +1 -1
- package/prompt-input/internal.d.ts +1 -1
- package/prompt-input/internal.d.ts.map +1 -1
- package/prompt-input/internal.js +195 -61
- package/prompt-input/internal.js.map +1 -1
- package/prompt-input/styles.css.js +26 -17
- package/prompt-input/styles.scoped.css +152 -39
- package/prompt-input/styles.selectors.js +26 -17
- package/prompt-input/test-classes/styles.css.js +7 -6
- package/prompt-input/test-classes/styles.scoped.css +10 -6
- package/prompt-input/test-classes/styles.selectors.js +7 -6
- package/prompt-input/tokens/use-shortcuts.d.ts +37 -0
- package/prompt-input/tokens/use-shortcuts.d.ts.map +1 -0
- package/prompt-input/tokens/use-shortcuts.js +89 -0
- package/prompt-input/tokens/use-shortcuts.js.map +1 -0
- package/prompt-input/tokens/use-token-mode.d.ts +78 -0
- package/prompt-input/tokens/use-token-mode.d.ts.map +1 -0
- package/prompt-input/tokens/use-token-mode.js +817 -0
- package/prompt-input/tokens/use-token-mode.js.map +1 -0
- package/prompt-input/utils/insert-text-content-editable.d.ts +10 -0
- package/prompt-input/utils/insert-text-content-editable.d.ts.map +1 -0
- package/prompt-input/utils/insert-text-content-editable.js +133 -0
- package/prompt-input/utils/insert-text-content-editable.js.map +1 -0
- package/tabs/styles.css.js +30 -30
- package/tabs/styles.scoped.css +55 -55
- package/tabs/styles.selectors.js +30 -30
- package/test-utils/dom/hotspot/index.js +1 -2
- package/test-utils/dom/hotspot/index.js.map +1 -1
- package/test-utils/dom/prompt-input/index.d.ts +53 -1
- package/test-utils/dom/prompt-input/index.js +121 -13
- package/test-utils/dom/prompt-input/index.js.map +1 -1
- package/test-utils/dom/s3-resource-selector/index.js +2 -3
- package/test-utils/dom/s3-resource-selector/index.js.map +1 -1
- package/test-utils/selectors/hotspot/index.js +1 -2
- package/test-utils/selectors/hotspot/index.js.map +1 -1
- package/test-utils/selectors/prompt-input/index.d.ts +30 -0
- package/test-utils/selectors/prompt-input/index.js +53 -7
- package/test-utils/selectors/prompt-input/index.js.map +1 -1
- package/test-utils/selectors/s3-resource-selector/index.js +2 -3
- package/test-utils/selectors/s3-resource-selector/index.js.map +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-handlers.js","sourceRoot":"","sources":["../../../../src/prompt-input/core/event-handlers.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 { findUpUntil } from '@cloudscape-design/component-toolkit/dom';\n\nimport { fireKeyboardEvent } from '../../internal/events';\nimport { isHTMLElement } from '../../internal/utils/dom';\nimport handleKey from '../../internal/utils/handle-key';\nimport { PromptInputProps } from '../interfaces';\nimport { EditableState } from '../tokens/use-token-mode';\nimport { CaretController, getOwnerSelection, TOKEN_LENGTHS } from './caret-controller';\nimport { ElementType } from './constants';\nimport {\n createParagraph,\n createTrailingBreak,\n findAdjacentToken,\n findAllParagraphs,\n getTokenType,\n insertAfter,\n isCaretSpotType,\n isElementEffectivelyEmpty,\n isReferenceElementType,\n stripZeroWidthCharacters,\n} from './dom-utils';\nimport { MenuItemsHandlers, MenuItemsState } from './menu-state';\nimport { getPromptText } from './token-operations';\nimport { removeTokenRange } from './token-utils';\nimport { handleDeleteAfterTrigger, handleSpaceInOpenMenu } from './trigger-utils';\nimport { isBreakTextToken, isBRElement, isTextNode } from './type-guards';\n\n/** Configuration for the unified keyboard event handler. */\nexport interface KeyboardHandlerProps {\n editableElement: HTMLDivElement | null;\n editableState: EditableState;\n caretController: CaretController | null;\n tokens?: readonly PromptInputProps.InputToken[];\n tokensToText?: (tokens: readonly PromptInputProps.InputToken[]) => string;\n disabled?: boolean;\n readOnly?: boolean;\n i18nStrings?: PromptInputProps.I18nStrings;\n announceTokenOperation?: (message: string) => void;\n\n // Menu state\n getMenuOpen: () => boolean;\n getMenuItemsState: () => MenuItemsState | null;\n getMenuItemsHandlers: () => MenuItemsHandlers | null;\n getMenuStatusType?: () => PromptInputProps.MenuDefinition['statusType'];\n closeMenu: () => void;\n\n // Callbacks\n onAction?: (detail: PromptInputProps.ActionDetail) => void;\n onChange: (detail: { value: string; tokens: PromptInputProps.InputToken[] }) => void;\n markTokensAsSent: (tokens: readonly PromptInputProps.InputToken[]) => void;\n onKeyDown?: PromptInputProps['onKeyDown'];\n}\n\n/** Handles all keyboard events for the editable element. */\nexport function handleEditableKeyDown(event: React.KeyboardEvent<HTMLDivElement>, props: KeyboardHandlerProps): void {\n const { editableElement, editableState, caretController, tokens, tokensToText } = props;\n\n const emitChange = (detail: { value: string; tokens: PromptInputProps.InputToken[] }) => {\n props.markTokensAsSent(detail.tokens);\n props.onChange(detail);\n };\n\n const emitTokenDeletion = (newTokens: PromptInputProps.InputToken[], caretPos: number) => {\n const value = tokensToText ? tokensToText(newTokens) : getPromptText(newTokens);\n // Don't mark as sent — selection deletions use preventDefault so the DOM\n // is NOT updated by the browser. The render effect must see these as an\n // external change and re-render the DOM to match the new token state.\n props.onChange({ value, tokens: newTokens });\n if (caretController) {\n caretController.setCapturedPosition(caretPos);\n }\n };\n\n // Forward to consumer's onKeyDown\n fireKeyboardEvent(props.onKeyDown, event);\n\n const menuItemsState = props.getMenuItemsState();\n const menuItemsHandlers = props.getMenuItemsHandlers();\n const menuOpen = props.getMenuOpen();\n\n handleKey(event, {\n onInlineStart: () => handleInlineStart(event, caretController, props.announceTokenOperation),\n onInlineEnd: () => handleInlineEnd(event, caretController, props.announceTokenOperation),\n onShiftInlineStart: () => handleInlineStart(event, caretController, props.announceTokenOperation),\n onShiftInlineEnd: () => handleInlineEnd(event, caretController, props.announceTokenOperation),\n onSelectAll: () => {\n if (tokens?.length === 0) {\n event.preventDefault();\n }\n },\n onBackspace: () => {\n if (\n editableElement &&\n handleReferenceTokenDeletion(\n event,\n true,\n editableElement,\n editableState,\n props.announceTokenOperation,\n props.i18nStrings,\n caretController,\n tokens,\n emitTokenDeletion\n )\n ) {\n return;\n }\n if (!tokens || !editableElement) {\n return;\n }\n if (tokens.length === 0) {\n event.preventDefault();\n return;\n }\n handleBackspaceAtParagraphStart(event, editableElement, tokens, tokensToText, emitChange, caretController);\n },\n onDelete: () => {\n if (\n editableElement &&\n handleReferenceTokenDeletion(\n event,\n false,\n editableElement,\n editableState,\n props.announceTokenOperation,\n props.i18nStrings,\n caretController,\n tokens,\n emitTokenDeletion\n )\n ) {\n return;\n }\n if (!tokens || !editableElement) {\n return;\n }\n if (handleDeleteAtParagraphEnd(event, editableElement, tokens, tokensToText, emitChange, caretController)) {\n return;\n }\n handleDeleteAfterTrigger(event, editableElement);\n },\n onShiftEnter: () => {\n if (event.nativeEvent.isComposing) {\n return;\n }\n event.preventDefault();\n if (caretController?.findActiveTrigger()) {\n return;\n }\n if (editableElement) {\n splitParagraphAtCaret(editableElement, caretController);\n }\n },\n onEnter: () => {\n if (event.nativeEvent.isComposing) {\n return;\n }\n if (menuOpen && menuItemsHandlers) {\n event.preventDefault();\n menuItemsHandlers.selectHighlightedOptionWithKeyboard();\n return;\n }\n handleEnterSubmit(event, props);\n },\n onTab: () => {\n if (menuOpen && menuItemsHandlers && !event.shiftKey) {\n event.preventDefault();\n menuItemsHandlers.selectHighlightedOptionWithKeyboard();\n }\n },\n onSpace: () => {\n if (editableElement && handleSpaceAfterClosedTrigger(event, editableElement, menuOpen, caretController)) {\n return;\n }\n if (menuOpen && menuItemsHandlers && menuItemsState) {\n handleSpaceInOpenMenu(event, {\n menuItemsState,\n menuItemsHandlers,\n getMenuStatusType: props.getMenuStatusType,\n closeMenu: props.closeMenu,\n caretController: caretController ?? undefined,\n editableElement: editableElement ?? undefined,\n });\n }\n },\n onBlockEnd: () => {\n if (menuOpen && menuItemsHandlers) {\n event.preventDefault();\n menuItemsHandlers.moveHighlightWithKeyboard(1);\n }\n },\n onBlockStart: () => {\n if (menuOpen && menuItemsHandlers) {\n event.preventDefault();\n menuItemsHandlers.moveHighlightWithKeyboard(-1);\n }\n },\n onEscape: () => {\n if (menuOpen) {\n event.preventDefault();\n props.closeMenu();\n }\n },\n });\n}\n\n/** Handles Enter key for form submission and onAction. */\nfunction handleEnterSubmit(event: React.KeyboardEvent<HTMLDivElement>, props: KeyboardHandlerProps): void {\n if (props.disabled || props.readOnly) {\n event.preventDefault();\n return;\n }\n\n const currentTarget = event.currentTarget;\n if (!isHTMLElement(currentTarget)) {\n return;\n }\n\n const form = currentTarget.closest('form');\n if (form && !event.isDefaultPrevented()) {\n form.requestSubmit();\n }\n event.preventDefault();\n\n const plainText = props.tokensToText ? props.tokensToText(props.tokens ?? []) : getPromptText(props.tokens ?? []);\n\n if (props.onAction) {\n props.onAction({ value: plainText, tokens: [...(props.tokens ?? [])] });\n }\n}\n\n/** Splits the current paragraph at the caret position, creating a new paragraph below. */\nexport function splitParagraphAtCaret(\n editableElement: HTMLDivElement,\n caretController: CaretController | null,\n suppressInputEvent = false\n): void {\n const selection = getOwnerSelection(editableElement);\n if (!selection?.rangeCount) {\n return;\n }\n\n const range = selection.getRangeAt(0);\n const startElement = isHTMLElement(range.startContainer) ? range.startContainer : range.startContainer.parentElement;\n const currentP = startElement ? findUpUntil(startElement, node => node.nodeName === 'P') : null;\n\n if (!currentP?.parentNode) {\n return;\n }\n\n const afterRange = (editableElement.ownerDocument ?? document).createRange();\n afterRange.setStart(range.startContainer, range.startOffset);\n afterRange.setEndAfter(currentP.lastChild || currentP);\n\n const afterContent = afterRange.extractContents();\n\n // Strip trailing breaks from extracted content — they belong only in empty paragraphs\n for (const child of Array.from(afterContent.childNodes)) {\n if (child.nodeName === 'BR') {\n child.remove();\n }\n }\n\n const newP = createParagraph();\n newP.appendChild(afterContent);\n\n if (isElementEffectivelyEmpty(newP)) {\n newP.appendChild(createTrailingBreak());\n }\n\n if (isElementEffectivelyEmpty(currentP)) {\n currentP.appendChild(createTrailingBreak());\n }\n\n currentP.parentNode.insertBefore(newP, currentP.nextSibling);\n\n let newCaretPos: number | null = null;\n if (caretController) {\n const currentPos = caretController.getPosition();\n newCaretPos = currentPos + TOKEN_LENGTHS.LINE_BREAK;\n }\n\n if (!suppressInputEvent) {\n editableElement.dispatchEvent(new Event('input', { bubbles: true }));\n }\n\n if (caretController && newCaretPos !== null) {\n caretController.setPosition(newCaretPos);\n }\n}\n\ninterface TokenElementResult {\n targetElement: HTMLElement | null;\n wrapperElement: HTMLElement | null;\n}\n\nfunction findTokenElementForDeletion(container: Node, offset: number, isBackspace: boolean): TokenElementResult {\n let adjacent: Node | null = null;\n\n if (isTextNode(container)) {\n const isAtEdge = isBackspace ? offset === 0 : offset === (container.textContent?.length || 0);\n if (isAtEdge) {\n adjacent = isBackspace ? container.previousSibling : container.nextSibling;\n }\n } else if (isHTMLElement(container)) {\n const childIndex = isBackspace ? offset - 1 : offset;\n adjacent = container.childNodes[childIndex];\n }\n\n if (isHTMLElement(adjacent)) {\n const adjacentType = getTokenType(adjacent);\n if (isReferenceElementType(adjacentType)) {\n return {\n wrapperElement: adjacent,\n targetElement: adjacent,\n };\n }\n }\n\n return { targetElement: null, wrapperElement: null };\n}\n\nfunction isValidTokenForDeletion(element: HTMLElement | null): boolean {\n if (!element) {\n return false;\n }\n const tokenType = getTokenType(element);\n return isReferenceElementType(tokenType);\n}\n\n/** Handles Backspace/Delete when adjacent to a reference token. Returns true if handled. */\nexport function handleReferenceTokenDeletion(\n event: React.KeyboardEvent<HTMLDivElement>,\n isBackspace: boolean,\n editableElement: HTMLDivElement,\n state: EditableState,\n announceTokenOperation: ((message: string) => void) | undefined,\n i18nStrings: PromptInputProps.I18nStrings | undefined,\n caretController: CaretController | null,\n tokens?: readonly PromptInputProps.InputToken[],\n emitChange?: (newTokens: PromptInputProps.InputToken[], caretPosition: number) => void\n): boolean {\n const selection = getOwnerSelection(editableElement);\n if (!selection?.rangeCount) {\n return false;\n }\n\n const range = selection.getRangeAt(0);\n\n if (!range.collapsed) {\n event.preventDefault();\n\n if (!caretController || !tokens || !emitChange) {\n return false;\n }\n\n // Map the DOM selection to logical token positions and remove the range\n // from state. The render effect will update the DOM on the next cycle.\n const startPos = caretController.getPosition();\n\n // Get end position by temporarily collapsing the range to its end\n const tempRange = range.cloneRange();\n tempRange.collapse(false);\n selection.removeAllRanges();\n selection.addRange(tempRange);\n const endPos = caretController.getPosition();\n selection.removeAllRanges();\n selection.addRange(range);\n\n const rangeStart = Math.min(startPos, endPos);\n const rangeEnd = Math.max(startPos, endPos);\n\n const newTokens = removeTokenRange(tokens, rangeStart, rangeEnd);\n emitChange(newTokens, rangeStart);\n\n return true;\n }\n\n const { targetElement, wrapperElement } = findTokenElementForDeletion(\n range.startContainer,\n range.startOffset,\n isBackspace\n );\n\n const tokenElement = targetElement || wrapperElement || null;\n\n if (!isValidTokenForDeletion(tokenElement)) {\n return false;\n }\n\n const elementToRemove = (wrapperElement || tokenElement)!;\n const paragraph = elementToRemove.parentNode;\n if (!paragraph) {\n return false;\n }\n\n event.preventDefault();\n\n const tokenLabel = tokenElement!.textContent?.trim() || '';\n if (announceTokenOperation && tokenLabel) {\n const announcement = i18nStrings?.tokenRemovedAriaLabel?.({ label: tokenLabel, value: tokenLabel });\n if (announcement) {\n announceTokenOperation(announcement);\n }\n }\n\n state.skipNextZeroWidthUpdate = true;\n\n let newCaretPos: number | null = null;\n if (caretController) {\n const currentPos = caretController.getPosition();\n newCaretPos = isBackspace ? Math.max(0, currentPos - TOKEN_LENGTHS.REFERENCE) : currentPos;\n }\n\n elementToRemove.remove();\n editableElement.dispatchEvent(new Event('input', { bubbles: true }));\n\n if (caretController && newCaretPos !== null) {\n caretController.setPosition(newCaretPos);\n }\n\n return true;\n}\n\n/** If the caret is inside a reference's caret-spot, normalizes it to the paragraph level. */\nfunction normalizeCaretOutOfReference(\n container: Node,\n direction: 'forward' | 'backward',\n event: React.KeyboardEvent<HTMLDivElement>,\n selection: Selection\n): boolean {\n if (!isTextNode(container)) {\n return false;\n }\n\n const parent = container.parentElement;\n if (!parent || !isCaretSpotType(getTokenType(parent))) {\n return false;\n }\n\n const wrapper = parent.parentElement;\n if (!wrapper || !isReferenceElementType(getTokenType(wrapper))) {\n return false;\n }\n\n const paragraph = wrapper.parentElement;\n if (!paragraph) {\n return false;\n }\n\n const wrapperIndex = Array.from(paragraph.childNodes).indexOf(wrapper);\n const newOffset = direction === 'backward' ? wrapperIndex : wrapperIndex + 1;\n\n event.preventDefault();\n const newRange = (paragraph.ownerDocument ?? document).createRange();\n newRange.setStart(paragraph, newOffset);\n newRange.collapse(true);\n selection.removeAllRanges();\n selection.addRange(newRange);\n return true;\n}\n\n/** Handles inline-start (backward) arrow key — plain navigation or shift+selection across references. */\nexport function handleInlineStart(\n event: React.KeyboardEvent<HTMLDivElement>,\n caretController: CaretController | null,\n announceTokenOperation?: (message: string) => void\n): void {\n const selection = getOwnerSelection(event.currentTarget);\n if (!selection?.rangeCount) {\n return;\n }\n const range = selection.getRangeAt(0);\n\n if (range.collapsed && normalizeCaretOutOfReference(range.startContainer, 'backward', event, selection)) {\n return;\n }\n\n if (event.shiftKey) {\n handleShiftArrowAcrossTokens(event, selection, range, 'backward');\n return;\n }\n\n const { sibling, isReferenceToken } = findAdjacentToken(range.startContainer, range.startOffset, 'backward');\n if (isReferenceToken && sibling) {\n event.preventDefault();\n caretController?.moveBackward(TOKEN_LENGTHS.REFERENCE);\n if (announceTokenOperation && isHTMLElement(sibling)) {\n const label = stripZeroWidthCharacters(sibling.textContent?.trim() || '');\n if (label) {\n announceTokenOperation(label);\n }\n }\n }\n}\n\n/** Handles inline-end (forward) arrow key — plain navigation or shift+selection across references. */\nexport function handleInlineEnd(\n event: React.KeyboardEvent<HTMLDivElement>,\n caretController: CaretController | null,\n announceTokenOperation?: (message: string) => void\n): void {\n const selection = getOwnerSelection(event.currentTarget);\n if (!selection?.rangeCount) {\n return;\n }\n const range = selection.getRangeAt(0);\n\n if (range.collapsed && normalizeCaretOutOfReference(range.startContainer, 'forward', event, selection)) {\n return;\n }\n\n if (event.shiftKey) {\n handleShiftArrowAcrossTokens(event, selection, range, 'forward');\n return;\n }\n\n const { sibling, isReferenceToken } = findAdjacentToken(range.startContainer, range.startOffset, 'forward');\n if (isReferenceToken && sibling) {\n event.preventDefault();\n caretController?.moveForward(TOKEN_LENGTHS.REFERENCE);\n if (announceTokenOperation && isHTMLElement(sibling)) {\n const label = stripZeroWidthCharacters(sibling.textContent?.trim() || '');\n if (label) {\n announceTokenOperation(label);\n }\n }\n }\n}\n\n/** After the browser handles Shift+Arrow, nudge the focus past any reference it landed inside. */\nfunction handleShiftArrowAcrossTokens(\n event: React.KeyboardEvent<HTMLDivElement>,\n selection: Selection,\n range: Range,\n direction: 'forward' | 'backward'\n): boolean {\n const isBackward = direction === 'backward';\n\n // Check if the focus is adjacent to a reference in the arrow direction\n const focusNode = selection.focusNode;\n const focusOff = selection.focusOffset;\n if (!focusNode) {\n return false;\n }\n\n let adjacentRef: Node | null = null;\n\n // If focus is inside a reference (e.g. in a caret-spot), the reference itself is what we skip\n let containingRef: HTMLElement | null = null;\n let node: Node | null = isTextNode(focusNode) ? focusNode.parentElement : (focusNode as HTMLElement);\n while (node && isHTMLElement(node) && node !== event.currentTarget) {\n const tokenType = getTokenType(node);\n if (isReferenceElementType(tokenType)) {\n containingRef = node;\n break;\n }\n if (isCaretSpotType(tokenType) && node.parentElement) {\n const parentType = getTokenType(node.parentElement);\n if (isReferenceElementType(parentType)) {\n containingRef = node.parentElement;\n break;\n }\n }\n node = node.parentElement;\n }\n\n if (containingRef) {\n adjacentRef = containingRef;\n } else if (isTextNode(focusNode)) {\n if (isBackward && focusOff === 0) {\n adjacentRef = focusNode.previousSibling;\n } else if (!isBackward) {\n const len = focusNode.textContent?.length || 0;\n // Check at the text boundary — only jump over the reference when focus\n // is at the very end of the text node, not one character before.\n if (focusOff >= len && focusNode.nextSibling) {\n const nextSibling = focusNode.nextSibling;\n if (isHTMLElement(nextSibling) && isReferenceElementType(getTokenType(nextSibling))) {\n adjacentRef = nextSibling;\n }\n }\n }\n if (!adjacentRef && isBackward && focusOff === 0 && focusNode.previousSibling) {\n const previousSibling = focusNode.previousSibling;\n if (isHTMLElement(previousSibling) && isReferenceElementType(getTokenType(previousSibling))) {\n adjacentRef = previousSibling;\n }\n }\n } else if (isHTMLElement(focusNode)) {\n if (isBackward && focusOff > 0) {\n adjacentRef = focusNode.childNodes[focusOff - 1];\n } else if (!isBackward && focusOff < focusNode.childNodes.length) {\n adjacentRef = focusNode.childNodes[focusOff];\n }\n }\n\n if (!adjacentRef || !isHTMLElement(adjacentRef) || !isReferenceElementType(getTokenType(adjacentRef))) {\n return false;\n }\n\n const parent = adjacentRef.parentNode;\n if (!parent) {\n return false;\n }\n\n event.preventDefault();\n\n const index = Array.from(parent.childNodes).indexOf(adjacentRef as ChildNode);\n\n // Find the actual text node on the far side of the reference to extend into,\n // rather than using paragraph-level offsets which the browser may normalize\n // into the reference's caret-spot internals.\n let targetNode: Node = parent;\n let targetOffset: number = isBackward ? index : index + 1;\n\n if (!isBackward) {\n const nextSibling = adjacentRef.nextSibling;\n if (nextSibling && isTextNode(nextSibling)) {\n targetNode = nextSibling;\n targetOffset = 0;\n }\n } else {\n const prevSibling = adjacentRef.previousSibling;\n if (prevSibling && isTextNode(prevSibling)) {\n targetNode = prevSibling;\n targetOffset = prevSibling.textContent?.length || 0;\n }\n }\n\n // If extending would jump the focus past the anchor (deselecting through a reference),\n // collapse instead of flipping the selection direction.\n if (!range.collapsed && selection.anchorNode) {\n const anchorPos = adjacentRef.compareDocumentPosition(selection.anchorNode);\n const anchorIsAfter =\n (anchorPos & Node.DOCUMENT_POSITION_FOLLOWING) !== 0 || (anchorPos & Node.DOCUMENT_POSITION_CONTAINED_BY) !== 0;\n const anchorIsBefore =\n (anchorPos & Node.DOCUMENT_POSITION_PRECEDING) !== 0 || (anchorPos & Node.DOCUMENT_POSITION_CONTAINS) !== 0;\n\n if ((!isBackward && anchorIsAfter) || (isBackward && anchorIsBefore)) {\n const anchorNode = selection.anchorNode!;\n const anchorOffset = selection.anchorOffset;\n selection.collapse(anchorNode, anchorOffset);\n selection.extend(targetNode, targetOffset);\n return true;\n }\n }\n\n selection.extend(targetNode, targetOffset);\n\n return true;\n}\n\n/** Handles space key after a closed trigger element, inserting the space outside the trigger. */\nexport function handleSpaceAfterClosedTrigger(\n event: React.KeyboardEvent<HTMLDivElement>,\n editableElement: HTMLDivElement,\n menuOpen: boolean,\n caretController: CaretController | null\n): boolean {\n if (event.key !== ' ' || menuOpen) {\n return false;\n }\n\n const selection = getOwnerSelection(editableElement);\n if (!selection?.rangeCount) {\n return false;\n }\n\n const range = selection.getRangeAt(0);\n if (!range.collapsed) {\n return false;\n }\n\n let triggerElement: HTMLElement | null = null;\n let caretAtEnd = false;\n\n if (isTextNode(range.startContainer)) {\n const parent = range.startContainer.parentElement;\n const parentType = parent ? getTokenType(parent) : null;\n\n if (parentType === ElementType.Trigger && parent) {\n triggerElement = parent;\n const textLength = range.startContainer.textContent?.length || 0;\n caretAtEnd = range.startOffset === textLength;\n }\n } else if (isHTMLElement(range.startContainer)) {\n const container = range.startContainer;\n if (range.startOffset > 0) {\n const prevNode = container.childNodes[range.startOffset - 1];\n if (isHTMLElement(prevNode) && getTokenType(prevNode) === ElementType.Trigger) {\n triggerElement = prevNode;\n caretAtEnd = true;\n }\n }\n }\n\n if (!triggerElement || !caretAtEnd) {\n return false;\n }\n\n const paragraph = triggerElement.parentElement;\n if (!paragraph) {\n return false;\n }\n\n event.preventDefault();\n\n if (caretController) {\n caretController.capture();\n }\n\n const spaceNode = (triggerElement.ownerDocument ?? document).createTextNode(' ');\n insertAfter(spaceNode, triggerElement);\n\n editableElement.dispatchEvent(new Event('input', { bubbles: true }));\n\n if (caretController) {\n caretController.restore(1);\n }\n\n return true;\n}\n\nexport type MergeDirection = 'forward' | 'backward';\n\ninterface MergeParagraphsParams {\n direction: MergeDirection;\n editableElement: HTMLDivElement;\n tokens: readonly PromptInputProps.InputToken[];\n currentParagraphIndex: number;\n tokensToText?: (tokens: readonly PromptInputProps.InputToken[]) => string;\n onChange: (detail: { value: string; tokens: PromptInputProps.InputToken[] }) => void;\n caretController?: CaretController | null;\n}\n\n/** Merges two adjacent paragraphs by removing the break token between them. */\nexport function mergeParagraphs(params: MergeParagraphsParams): boolean {\n const { direction, editableElement, tokens, currentParagraphIndex, tokensToText, onChange, caretController } = params;\n\n const paragraphs = findAllParagraphs(editableElement);\n\n if (direction === 'backward') {\n if (currentParagraphIndex <= 0) {\n return false;\n }\n } else {\n if (currentParagraphIndex >= paragraphs.length - 1) {\n return false;\n }\n }\n\n const breakIndexToRemove = direction === 'backward' ? currentParagraphIndex : currentParagraphIndex + 1;\n\n let breakCount = 0;\n let breakRemoved = false;\n\n const newTokens = tokens.filter(token => {\n if (isBreakTextToken(token)) {\n breakCount++;\n if (breakCount === breakIndexToRemove) {\n breakRemoved = true;\n return false;\n }\n }\n return true;\n });\n\n if (!breakRemoved) {\n return false;\n }\n\n const value = tokensToText ? tokensToText(newTokens) : getPromptText(newTokens);\n onChange({ value, tokens: newTokens });\n\n if (caretController) {\n const currentPos = caretController.getPosition();\n // Backspace: cursor was at start of next paragraph, now needs to move back by the removed break\n // Delete: cursor stays where it is — the next line merges into the current one\n const newCaretPos = direction === 'backward' ? currentPos - TOKEN_LENGTHS.LINE_BREAK : currentPos;\n caretController.setPosition(newCaretPos);\n }\n\n return true;\n}\n\n/** Handles Backspace at the start of a paragraph by merging with the previous one. */\nexport function handleBackspaceAtParagraphStart(\n event: React.KeyboardEvent<HTMLDivElement>,\n editableElement: HTMLDivElement,\n tokens: readonly PromptInputProps.InputToken[],\n tokensToText: ((tokens: readonly PromptInputProps.InputToken[]) => string) | undefined,\n onChange: (detail: { value: string; tokens: PromptInputProps.InputToken[] }) => void,\n caretController: CaretController | null\n): boolean {\n const selection = getOwnerSelection(editableElement);\n if (!selection?.rangeCount) {\n return false;\n }\n\n const range = selection.getRangeAt(0);\n\n if (\n !range.collapsed ||\n range.startOffset !== 0 ||\n !isHTMLElement(range.startContainer) ||\n range.startContainer.nodeName !== 'P'\n ) {\n return false;\n }\n\n const paragraphs = findAllParagraphs(editableElement);\n const currentP = range.startContainer;\n const pIndex = Array.from(paragraphs).indexOf(currentP as HTMLParagraphElement);\n\n if (pIndex < 0) {\n return false;\n }\n\n const merged = mergeParagraphs({\n direction: 'backward',\n editableElement,\n tokens,\n currentParagraphIndex: pIndex,\n tokensToText,\n onChange,\n caretController: caretController,\n });\n\n if (merged) {\n event.preventDefault();\n }\n\n return merged;\n}\n\n/** Handles Delete at the end of a paragraph by merging with the next one. */\nexport function handleDeleteAtParagraphEnd(\n event: React.KeyboardEvent<HTMLDivElement>,\n editableElement: HTMLDivElement,\n tokens: readonly PromptInputProps.InputToken[],\n tokensToText: ((tokens: readonly PromptInputProps.InputToken[]) => string) | undefined,\n onChange: (detail: { value: string; tokens: PromptInputProps.InputToken[] }) => void,\n caretController: CaretController | null\n): boolean {\n const selection = getOwnerSelection(editableElement);\n if (!selection?.rangeCount) {\n return false;\n }\n\n const range = selection.getRangeAt(0);\n const container = range.startContainer;\n\n if (!range.collapsed) {\n return false;\n }\n\n let isAtEndOfParagraph = false;\n let currentP: HTMLParagraphElement | null = null;\n\n if (isHTMLElement(container) && container.nodeName === 'P') {\n currentP = container as HTMLParagraphElement;\n const hasOnlyTrailingBR = currentP.childNodes.length === 1 && isBRElement(currentP.firstChild);\n isAtEndOfParagraph = hasOnlyTrailingBR || range.startOffset === currentP.childNodes.length;\n } else if (isTextNode(container)) {\n isAtEndOfParagraph = range.startOffset === (container.textContent?.length || 0) && !container.nextSibling;\n let node: Node | null = container;\n while (node && node.nodeName !== 'P') {\n node = node.parentNode;\n }\n currentP = node as HTMLParagraphElement;\n }\n\n if (!isAtEndOfParagraph || !currentP) {\n return false;\n }\n\n const paragraphs = findAllParagraphs(editableElement);\n const pIndex = Array.from(paragraphs).indexOf(currentP);\n\n if (pIndex < 0) {\n return false;\n }\n\n const merged = mergeParagraphs({\n direction: 'forward',\n editableElement,\n tokens,\n currentParagraphIndex: pIndex,\n tokensToText,\n onChange,\n caretController: caretController,\n });\n\n if (merged) {\n event.preventDefault();\n }\n\n return merged;\n}\n\n/** Handles copy/cut events on the contentEditable element. */\nexport function handleClipboardEvent(event: React.ClipboardEvent, editableElement: HTMLElement, isCut: boolean): void {\n const selection = getOwnerSelection(editableElement);\n if (!selection || selection.rangeCount === 0) {\n return;\n }\n\n const range = selection.getRangeAt(0);\n const fragment = range.cloneContents();\n\n const paragraphs = findAllParagraphs(fragment);\n const text =\n paragraphs.length > 0\n ? paragraphs.map(p => stripZeroWidthCharacters(p.textContent || '')).join('\\n')\n : stripZeroWidthCharacters(fragment.textContent || '');\n\n event.clipboardData.setData('text/plain', text);\n event.preventDefault();\n\n if (isCut) {\n selection.deleteFromDocument();\n }\n}\n"]}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { DropdownStatusProps } from '../../internal/components/dropdown-status/interfaces';
|
|
2
|
+
import { OptionDefinition, OptionGroup } from '../../internal/components/option/interfaces';
|
|
3
|
+
import { HighlightedOptionHandlers, HighlightedOptionState } from '../../internal/components/options-list/utils/use-highlight-option';
|
|
4
|
+
import { PromptInputProps } from '../interfaces';
|
|
5
|
+
export type MenuItem = (OptionDefinition | OptionGroup) & {
|
|
6
|
+
type?: 'parent' | 'child' | 'use-entered';
|
|
7
|
+
option: OptionDefinition | OptionGroup;
|
|
8
|
+
};
|
|
9
|
+
/** Props for the useMenuItems hook. */
|
|
10
|
+
export interface UseMenuItemsProps {
|
|
11
|
+
menu: PromptInputProps.MenuDefinition;
|
|
12
|
+
filterText: string;
|
|
13
|
+
onSelectItem: (option: MenuItem) => void;
|
|
14
|
+
}
|
|
15
|
+
/** Current state of the menu items list, including highlight tracking. */
|
|
16
|
+
export interface MenuItemsState extends HighlightedOptionState<MenuItem> {
|
|
17
|
+
items: readonly MenuItem[];
|
|
18
|
+
showAll: boolean;
|
|
19
|
+
getItemGroup: (item: MenuItem) => undefined | OptionGroup;
|
|
20
|
+
}
|
|
21
|
+
/** Handlers for navigating and selecting menu items via keyboard and mouse. */
|
|
22
|
+
export interface MenuItemsHandlers extends HighlightedOptionHandlers<MenuItem> {
|
|
23
|
+
selectHighlightedOptionWithKeyboard(): boolean;
|
|
24
|
+
highlightVisibleOptionWithMouse(index: number): void;
|
|
25
|
+
selectVisibleOptionWithMouse(index: number): void;
|
|
26
|
+
}
|
|
27
|
+
interface UseMenuLoadMoreProps {
|
|
28
|
+
menu: PromptInputProps.MenuDefinition;
|
|
29
|
+
statusType: DropdownStatusProps.StatusType;
|
|
30
|
+
onLoadItems: (detail: PromptInputProps.MenuLoadItemsDetail) => void;
|
|
31
|
+
onLoadMoreItems?: () => void;
|
|
32
|
+
}
|
|
33
|
+
interface MenuLoadMoreHandlers {
|
|
34
|
+
fireLoadMoreOnScroll(): void;
|
|
35
|
+
fireLoadMoreOnRecoveryClick(): void;
|
|
36
|
+
fireLoadMoreOnMenuOpen(): void;
|
|
37
|
+
fireLoadMoreOnInputChange(filteringText: string): void;
|
|
38
|
+
}
|
|
39
|
+
/** Manages menu item filtering, highlighting, and selection for a trigger menu. */
|
|
40
|
+
export declare const useMenuItems: ({
|
|
41
|
+
menu,
|
|
42
|
+
filterText,
|
|
43
|
+
onSelectItem
|
|
44
|
+
}: UseMenuItemsProps) => [MenuItemsState, MenuItemsHandlers];
|
|
45
|
+
/** Manages pagination and load-more behavior for menu items. */
|
|
46
|
+
export declare const useMenuLoadMore: ({
|
|
47
|
+
menu,
|
|
48
|
+
statusType,
|
|
49
|
+
onLoadItems,
|
|
50
|
+
onLoadMoreItems
|
|
51
|
+
}: UseMenuLoadMoreProps) => MenuLoadMoreHandlers;
|
|
52
|
+
export interface MenuSelectionResult {
|
|
53
|
+
tokens: PromptInputProps.InputToken[];
|
|
54
|
+
caretPosition: number;
|
|
55
|
+
insertedToken: PromptInputProps.ReferenceToken;
|
|
56
|
+
}
|
|
57
|
+
/** Replaces a trigger token with a reference token (or pinned token) after menu selection. */
|
|
58
|
+
export declare function handleMenuSelection(tokens: readonly PromptInputProps.InputToken[], selectedOption: {
|
|
59
|
+
value: string;
|
|
60
|
+
label?: string;
|
|
61
|
+
}, menuId: string, isPinned: boolean, activeTrigger: PromptInputProps.TriggerToken): MenuSelectionResult;
|
|
62
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"menu-state.d.ts","sourceRoot":"","sources":["../../../../src/prompt-input/core/menu-state.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,mBAAmB,EAAE,MAAM,sDAAsD,CAAC;AAC3F,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,6CAA6C,CAAC;AAE5F,OAAO,EACL,yBAAyB,EACzB,sBAAsB,EAEvB,MAAM,mEAAmE,CAAC;AAC3E,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAKjD,MAAM,MAAM,QAAQ,GAAG,CAAC,gBAAgB,GAAG,WAAW,CAAC,GAAG;IACxD,IAAI,CAAC,EAAE,QAAQ,GAAG,OAAO,GAAG,aAAa,CAAC;IAC1C,MAAM,EAAE,gBAAgB,GAAG,WAAW,CAAC;CACxC,CAAC;AAEF,uCAAuC;AACvC,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,gBAAgB,CAAC,cAAc,CAAC;IACtC,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,CAAC,MAAM,EAAE,QAAQ,KAAK,IAAI,CAAC;CAC1C;AAED,0EAA0E;AAC1E,MAAM,WAAW,cAAe,SAAQ,sBAAsB,CAAC,QAAQ,CAAC;IACtE,KAAK,EAAE,SAAS,QAAQ,EAAE,CAAC;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,SAAS,GAAG,WAAW,CAAC;CAC3D;AAED,+EAA+E;AAC/E,MAAM,WAAW,iBAAkB,SAAQ,yBAAyB,CAAC,QAAQ,CAAC;IAC5E,mCAAmC,IAAI,OAAO,CAAC;IAC/C,+BAA+B,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrD,4BAA4B,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACnD;AAED,UAAU,oBAAoB;IAC5B,IAAI,EAAE,gBAAgB,CAAC,cAAc,CAAC;IACtC,UAAU,EAAE,mBAAmB,CAAC,UAAU,CAAC;IAC3C,WAAW,EAAE,CAAC,MAAM,EAAE,gBAAgB,CAAC,mBAAmB,KAAK,IAAI,CAAC;IACpE,eAAe,CAAC,EAAE,MAAM,IAAI,CAAC;CAC9B;AAED,UAAU,oBAAoB;IAC5B,oBAAoB,IAAI,IAAI,CAAC;IAC7B,2BAA2B,IAAI,IAAI,CAAC;IACpC,sBAAsB,IAAI,IAAI,CAAC;IAC/B,yBAAyB,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CACxD;AAUD,mFAAmF;AACnF,eAAO,MAAM,YAAY,GAAI,qCAI1B,iBAAiB,KAAG,CAAC,cAAc,EAAE,iBAAiB,CAgDxD,CAAC;AAyDF,gEAAgE;AAChE,eAAO,MAAM,eAAe,GAAI,qDAK7B,oBAAoB,KAAG,oBAmCzB,CAAC;AAEF,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,gBAAgB,CAAC,UAAU,EAAE,CAAC;IACtC,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,gBAAgB,CAAC,cAAc,CAAC;CAChD;AAED,8FAA8F;AAC9F,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,SAAS,gBAAgB,CAAC,UAAU,EAAE,EAC9C,cAAc,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,EACjD,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,OAAO,EACjB,aAAa,EAAE,gBAAgB,CAAC,YAAY,GAC3C,mBAAmB,CAsCrB"}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
import { useMemo, useRef } from 'react';
|
|
4
|
+
import { filterOptions } from '../../autosuggest/utils/utils';
|
|
5
|
+
import { generateTestIndexes } from '../../internal/components/options-list/utils/test-indexes';
|
|
6
|
+
import { useHighlightedOption, } from '../../internal/components/options-list/utils/use-highlight-option';
|
|
7
|
+
import { calculateTokenPosition } from './caret-controller';
|
|
8
|
+
import { generateTokenId } from './dom-utils';
|
|
9
|
+
import { isPinnedReferenceToken, isReferenceToken, isTriggerToken } from './type-guards';
|
|
10
|
+
function isMenuItemHighlightable(option) {
|
|
11
|
+
return !!option && option.type !== 'parent';
|
|
12
|
+
}
|
|
13
|
+
function isMenuItemInteractive(option) {
|
|
14
|
+
return !!option && !option.disabled && option.type !== 'parent';
|
|
15
|
+
}
|
|
16
|
+
/** Manages menu item filtering, highlighting, and selection for a trigger menu. */
|
|
17
|
+
export const useMenuItems = ({ menu, filterText, onSelectItem, }) => {
|
|
18
|
+
const { items, getItemGroup, getItemParent } = useMemo(() => createItems(menu.options), [menu.options]);
|
|
19
|
+
const filteredItems = useMemo(() => {
|
|
20
|
+
var _a;
|
|
21
|
+
const filteringType = (_a = menu.filteringType) !== null && _a !== void 0 ? _a : 'auto';
|
|
22
|
+
const filtered = filteringType === 'auto' ? filterOptions(items, filterText) : [...items];
|
|
23
|
+
generateTestIndexes(filtered, getItemParent);
|
|
24
|
+
return filtered;
|
|
25
|
+
}, [menu.filteringType, items, filterText, getItemParent]);
|
|
26
|
+
const [highlightedOptionState, highlightedOptionHandlers] = useHighlightedOption({
|
|
27
|
+
options: filteredItems,
|
|
28
|
+
isHighlightable: isMenuItemHighlightable,
|
|
29
|
+
});
|
|
30
|
+
const selectHighlightedOptionWithKeyboard = () => {
|
|
31
|
+
const { highlightedOption } = highlightedOptionState;
|
|
32
|
+
if (!highlightedOption || !isMenuItemInteractive(highlightedOption)) {
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
onSelectItem(highlightedOption);
|
|
36
|
+
return true;
|
|
37
|
+
};
|
|
38
|
+
const highlightVisibleOptionWithMouse = (index) => {
|
|
39
|
+
const item = filteredItems[index];
|
|
40
|
+
if (item && isMenuItemHighlightable(item)) {
|
|
41
|
+
highlightedOptionHandlers.setHighlightedIndexWithMouse(index);
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
const selectVisibleOptionWithMouse = (index) => {
|
|
45
|
+
const item = filteredItems[index];
|
|
46
|
+
if (item && isMenuItemInteractive(item)) {
|
|
47
|
+
onSelectItem(item);
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
return [
|
|
51
|
+
{ ...highlightedOptionState, items: filteredItems, showAll: false, getItemGroup },
|
|
52
|
+
{
|
|
53
|
+
...highlightedOptionHandlers,
|
|
54
|
+
selectHighlightedOptionWithKeyboard,
|
|
55
|
+
highlightVisibleOptionWithMouse,
|
|
56
|
+
selectVisibleOptionWithMouse,
|
|
57
|
+
},
|
|
58
|
+
];
|
|
59
|
+
};
|
|
60
|
+
function createItems(options) {
|
|
61
|
+
const items = [];
|
|
62
|
+
const itemToGroup = new WeakMap();
|
|
63
|
+
const getItemParent = (item) => itemToGroup.get(item);
|
|
64
|
+
const getItemGroup = (item) => { var _a; return (_a = getItemParent(item)) === null || _a === void 0 ? void 0 : _a.option; };
|
|
65
|
+
for (const option of options) {
|
|
66
|
+
if (isGroup(option)) {
|
|
67
|
+
for (const item of flattenGroup(option)) {
|
|
68
|
+
items.push(item);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
items.push({ ...option, option });
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
function flattenGroup(group) {
|
|
76
|
+
const { options, ...rest } = group;
|
|
77
|
+
let hasOnlyDisabledChildren = true;
|
|
78
|
+
const groupItem = { ...rest, type: 'parent', option: group };
|
|
79
|
+
const items = [groupItem];
|
|
80
|
+
for (const option of options) {
|
|
81
|
+
if (!option.disabled) {
|
|
82
|
+
hasOnlyDisabledChildren = false;
|
|
83
|
+
}
|
|
84
|
+
const childOption = {
|
|
85
|
+
...option,
|
|
86
|
+
type: 'child',
|
|
87
|
+
disabled: option.disabled || rest.disabled,
|
|
88
|
+
option,
|
|
89
|
+
};
|
|
90
|
+
items.push(childOption);
|
|
91
|
+
itemToGroup.set(childOption, groupItem);
|
|
92
|
+
}
|
|
93
|
+
items[0].disabled = items[0].disabled || hasOnlyDisabledChildren;
|
|
94
|
+
return items;
|
|
95
|
+
}
|
|
96
|
+
return { items, getItemGroup, getItemParent };
|
|
97
|
+
}
|
|
98
|
+
function isGroup(optionOrGroup) {
|
|
99
|
+
const key = 'options';
|
|
100
|
+
return key in optionOrGroup;
|
|
101
|
+
}
|
|
102
|
+
/** Manages pagination and load-more behavior for menu items. */
|
|
103
|
+
export const useMenuLoadMore = ({ menu, statusType, onLoadItems, onLoadMoreItems, }) => {
|
|
104
|
+
const lastFilteringText = useRef(null);
|
|
105
|
+
const fireLoadMore = (firstPage, samePage, filteringText) => {
|
|
106
|
+
var _a;
|
|
107
|
+
if (filteringText !== undefined && filteringText !== lastFilteringText.current) {
|
|
108
|
+
lastFilteringText.current = filteringText;
|
|
109
|
+
}
|
|
110
|
+
if (filteringText === undefined || lastFilteringText.current !== filteringText) {
|
|
111
|
+
onLoadItems({
|
|
112
|
+
menuId: menu.id,
|
|
113
|
+
filteringText: (_a = lastFilteringText.current) !== null && _a !== void 0 ? _a : '',
|
|
114
|
+
firstPage,
|
|
115
|
+
samePage,
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
};
|
|
119
|
+
const fireLoadMoreOnScroll = () => {
|
|
120
|
+
if (menu.options.length > 0 && statusType === 'pending') {
|
|
121
|
+
if (onLoadMoreItems) {
|
|
122
|
+
onLoadMoreItems();
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
fireLoadMore(false, false);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
};
|
|
129
|
+
const fireLoadMoreOnRecoveryClick = () => fireLoadMore(false, true);
|
|
130
|
+
const fireLoadMoreOnMenuOpen = () => { var _a; return fireLoadMore(true, false, (_a = lastFilteringText.current) !== null && _a !== void 0 ? _a : ''); };
|
|
131
|
+
const fireLoadMoreOnInputChange = (filteringText) => fireLoadMore(true, false, filteringText);
|
|
132
|
+
return { fireLoadMoreOnScroll, fireLoadMoreOnRecoveryClick, fireLoadMoreOnMenuOpen, fireLoadMoreOnInputChange };
|
|
133
|
+
};
|
|
134
|
+
/** Replaces a trigger token with a reference token (or pinned token) after menu selection. */
|
|
135
|
+
export function handleMenuSelection(tokens, selectedOption, menuId, isPinned, activeTrigger) {
|
|
136
|
+
const newTokens = [...tokens];
|
|
137
|
+
const triggerIndex = newTokens.findIndex(t => isTriggerToken(t) && t.id === activeTrigger.id);
|
|
138
|
+
if (isPinned) {
|
|
139
|
+
const pinnedToken = {
|
|
140
|
+
type: 'reference',
|
|
141
|
+
id: generateTokenId(),
|
|
142
|
+
label: selectedOption.label || selectedOption.value || '',
|
|
143
|
+
value: selectedOption.value || '',
|
|
144
|
+
menuId,
|
|
145
|
+
pinned: true,
|
|
146
|
+
};
|
|
147
|
+
newTokens.splice(triggerIndex, 1);
|
|
148
|
+
let insertIndex = 0;
|
|
149
|
+
while (insertIndex < newTokens.length && isPinnedReferenceToken(newTokens[insertIndex])) {
|
|
150
|
+
insertIndex++;
|
|
151
|
+
}
|
|
152
|
+
newTokens.splice(insertIndex, 0, pinnedToken);
|
|
153
|
+
const caretPos = calculateTokenPosition(newTokens, insertIndex);
|
|
154
|
+
return { tokens: newTokens, caretPosition: caretPos, insertedToken: pinnedToken };
|
|
155
|
+
}
|
|
156
|
+
const referenceToken = {
|
|
157
|
+
type: 'reference',
|
|
158
|
+
id: generateTokenId(),
|
|
159
|
+
label: selectedOption.label || selectedOption.value || '',
|
|
160
|
+
value: selectedOption.value || '',
|
|
161
|
+
menuId,
|
|
162
|
+
};
|
|
163
|
+
newTokens.splice(triggerIndex, 1, referenceToken);
|
|
164
|
+
const insertedIndex = newTokens.findIndex(t => isReferenceToken(t) && t.id === referenceToken.id);
|
|
165
|
+
const caretPos = calculateTokenPosition(newTokens, insertedIndex);
|
|
166
|
+
return { tokens: newTokens, caretPosition: caretPos, insertedToken: referenceToken };
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=menu-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"menu-state.js","sourceRoot":"","sources":["../../../../src/prompt-input/core/menu-state.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 { useMemo, useRef } from 'react';\n\nimport { filterOptions } from '../../autosuggest/utils/utils';\nimport { DropdownStatusProps } from '../../internal/components/dropdown-status/interfaces';\nimport { OptionDefinition, OptionGroup } from '../../internal/components/option/interfaces';\nimport { generateTestIndexes } from '../../internal/components/options-list/utils/test-indexes';\nimport {\n HighlightedOptionHandlers,\n HighlightedOptionState,\n useHighlightedOption,\n} from '../../internal/components/options-list/utils/use-highlight-option';\nimport { PromptInputProps } from '../interfaces';\nimport { calculateTokenPosition } from './caret-controller';\nimport { generateTokenId } from './dom-utils';\nimport { isPinnedReferenceToken, isReferenceToken, isTriggerToken } from './type-guards';\n\nexport type MenuItem = (OptionDefinition | OptionGroup) & {\n type?: 'parent' | 'child' | 'use-entered';\n option: OptionDefinition | OptionGroup;\n};\n\n/** Props for the useMenuItems hook. */\nexport interface UseMenuItemsProps {\n menu: PromptInputProps.MenuDefinition;\n filterText: string;\n onSelectItem: (option: MenuItem) => void;\n}\n\n/** Current state of the menu items list, including highlight tracking. */\nexport interface MenuItemsState extends HighlightedOptionState<MenuItem> {\n items: readonly MenuItem[];\n showAll: boolean;\n getItemGroup: (item: MenuItem) => undefined | OptionGroup;\n}\n\n/** Handlers for navigating and selecting menu items via keyboard and mouse. */\nexport interface MenuItemsHandlers extends HighlightedOptionHandlers<MenuItem> {\n selectHighlightedOptionWithKeyboard(): boolean;\n highlightVisibleOptionWithMouse(index: number): void;\n selectVisibleOptionWithMouse(index: number): void;\n}\n\ninterface UseMenuLoadMoreProps {\n menu: PromptInputProps.MenuDefinition;\n statusType: DropdownStatusProps.StatusType;\n onLoadItems: (detail: PromptInputProps.MenuLoadItemsDetail) => void;\n onLoadMoreItems?: () => void;\n}\n\ninterface MenuLoadMoreHandlers {\n fireLoadMoreOnScroll(): void;\n fireLoadMoreOnRecoveryClick(): void;\n fireLoadMoreOnMenuOpen(): void;\n fireLoadMoreOnInputChange(filteringText: string): void;\n}\n\nfunction isMenuItemHighlightable(option?: MenuItem): boolean {\n return !!option && option.type !== 'parent';\n}\n\nfunction isMenuItemInteractive(option?: MenuItem): boolean {\n return !!option && !option.disabled && option.type !== 'parent';\n}\n\n/** Manages menu item filtering, highlighting, and selection for a trigger menu. */\nexport const useMenuItems = ({\n menu,\n filterText,\n onSelectItem,\n}: UseMenuItemsProps): [MenuItemsState, MenuItemsHandlers] => {\n const { items, getItemGroup, getItemParent } = useMemo(() => createItems(menu.options), [menu.options]);\n\n const filteredItems = useMemo(() => {\n const filteringType = menu.filteringType ?? 'auto';\n const filtered: MenuItem[] =\n filteringType === 'auto' ? (filterOptions(items, filterText) as MenuItem[]) : [...items];\n generateTestIndexes(filtered, getItemParent);\n return filtered;\n }, [menu.filteringType, items, filterText, getItemParent]);\n\n const [highlightedOptionState, highlightedOptionHandlers] = useHighlightedOption({\n options: filteredItems,\n isHighlightable: isMenuItemHighlightable,\n });\n\n const selectHighlightedOptionWithKeyboard = () => {\n const { highlightedOption } = highlightedOptionState;\n if (!highlightedOption || !isMenuItemInteractive(highlightedOption)) {\n return false;\n }\n onSelectItem(highlightedOption);\n return true;\n };\n\n const highlightVisibleOptionWithMouse = (index: number) => {\n const item = filteredItems[index];\n if (item && isMenuItemHighlightable(item)) {\n highlightedOptionHandlers.setHighlightedIndexWithMouse(index);\n }\n };\n\n const selectVisibleOptionWithMouse = (index: number) => {\n const item = filteredItems[index];\n if (item && isMenuItemInteractive(item)) {\n onSelectItem(item);\n }\n };\n\n return [\n { ...highlightedOptionState, items: filteredItems, showAll: false, getItemGroup },\n {\n ...highlightedOptionHandlers,\n selectHighlightedOptionWithKeyboard,\n highlightVisibleOptionWithMouse,\n selectVisibleOptionWithMouse,\n },\n ];\n};\n\nfunction createItems(options: readonly OptionDefinition[]) {\n const items: MenuItem[] = [];\n const itemToGroup = new WeakMap<MenuItem, MenuItem>();\n const getItemParent = (item: MenuItem) => itemToGroup.get(item);\n const getItemGroup = (item: MenuItem) => getItemParent(item)?.option as OptionGroup;\n\n for (const option of options) {\n if (isGroup(option)) {\n for (const item of flattenGroup(option)) {\n items.push(item);\n }\n } else {\n items.push({ ...option, option });\n }\n }\n\n function flattenGroup(group: OptionGroup) {\n const { options, ...rest } = group;\n\n let hasOnlyDisabledChildren = true;\n\n const groupItem: MenuItem = { ...rest, type: 'parent', option: group };\n\n const items: MenuItem[] = [groupItem];\n\n for (const option of options) {\n if (!option.disabled) {\n hasOnlyDisabledChildren = false;\n }\n\n const childOption: MenuItem = {\n ...option,\n type: 'child',\n disabled: option.disabled || rest.disabled,\n option,\n };\n\n items.push(childOption);\n\n itemToGroup.set(childOption, groupItem);\n }\n\n items[0].disabled = items[0].disabled || hasOnlyDisabledChildren;\n\n return items;\n }\n\n return { items, getItemGroup, getItemParent };\n}\n\nfunction isGroup(optionOrGroup: OptionDefinition): optionOrGroup is OptionGroup {\n const key: keyof OptionGroup = 'options';\n return key in optionOrGroup;\n}\n\n/** Manages pagination and load-more behavior for menu items. */\nexport const useMenuLoadMore = ({\n menu,\n statusType,\n onLoadItems,\n onLoadMoreItems,\n}: UseMenuLoadMoreProps): MenuLoadMoreHandlers => {\n const lastFilteringText = useRef<string | null>(null);\n\n const fireLoadMore = (firstPage: boolean, samePage: boolean, filteringText?: string) => {\n if (filteringText !== undefined && filteringText !== lastFilteringText.current) {\n lastFilteringText.current = filteringText;\n }\n\n if (filteringText === undefined || lastFilteringText.current !== filteringText) {\n onLoadItems({\n menuId: menu.id,\n filteringText: lastFilteringText.current ?? '',\n firstPage,\n samePage,\n });\n }\n };\n\n const fireLoadMoreOnScroll = () => {\n if (menu.options.length > 0 && statusType === 'pending') {\n if (onLoadMoreItems) {\n onLoadMoreItems();\n } else {\n fireLoadMore(false, false);\n }\n }\n };\n\n const fireLoadMoreOnRecoveryClick = () => fireLoadMore(false, true);\n\n const fireLoadMoreOnMenuOpen = () => fireLoadMore(true, false, lastFilteringText.current ?? '');\n\n const fireLoadMoreOnInputChange = (filteringText: string) => fireLoadMore(true, false, filteringText);\n\n return { fireLoadMoreOnScroll, fireLoadMoreOnRecoveryClick, fireLoadMoreOnMenuOpen, fireLoadMoreOnInputChange };\n};\n\nexport interface MenuSelectionResult {\n tokens: PromptInputProps.InputToken[];\n caretPosition: number;\n insertedToken: PromptInputProps.ReferenceToken;\n}\n\n/** Replaces a trigger token with a reference token (or pinned token) after menu selection. */\nexport function handleMenuSelection(\n tokens: readonly PromptInputProps.InputToken[],\n selectedOption: { value: string; label?: string },\n menuId: string,\n isPinned: boolean,\n activeTrigger: PromptInputProps.TriggerToken\n): MenuSelectionResult {\n const newTokens = [...tokens];\n const triggerIndex = newTokens.findIndex(t => isTriggerToken(t) && t.id === activeTrigger.id);\n\n if (isPinned) {\n const pinnedToken: PromptInputProps.ReferenceToken = {\n type: 'reference',\n id: generateTokenId(),\n label: selectedOption.label || selectedOption.value || '',\n value: selectedOption.value || '',\n menuId,\n pinned: true,\n };\n\n newTokens.splice(triggerIndex, 1);\n\n let insertIndex = 0;\n while (insertIndex < newTokens.length && isPinnedReferenceToken(newTokens[insertIndex])) {\n insertIndex++;\n }\n\n newTokens.splice(insertIndex, 0, pinnedToken);\n const caretPos = calculateTokenPosition(newTokens, insertIndex);\n return { tokens: newTokens, caretPosition: caretPos, insertedToken: pinnedToken };\n }\n\n const referenceToken: PromptInputProps.ReferenceToken = {\n type: 'reference',\n id: generateTokenId(),\n label: selectedOption.label || selectedOption.value || '',\n value: selectedOption.value || '',\n menuId,\n };\n\n newTokens.splice(triggerIndex, 1, referenceToken);\n const insertedIndex = newTokens.findIndex(t => isReferenceToken(t) && t.id === referenceToken.id);\n const caretPos = calculateTokenPosition(newTokens, insertedIndex);\n return { tokens: newTokens, caretPosition: caretPos, insertedToken: referenceToken };\n}\n"]}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { PromptInputProps } from '../interfaces';
|
|
2
|
+
import { PortalContainer } from './token-renderer';
|
|
3
|
+
export type UpdateSource = 'user-input' | 'external' | 'menu-selection' | 'internal';
|
|
4
|
+
export interface ShortcutsConfig {
|
|
5
|
+
menus?: readonly PromptInputProps.MenuDefinition[];
|
|
6
|
+
tokensToText?: (tokens: readonly PromptInputProps.InputToken[]) => string;
|
|
7
|
+
}
|
|
8
|
+
export declare function extractTokensFromDOM(element: HTMLElement, menus?: readonly PromptInputProps.MenuDefinition[], portalContainers?: Map<string, PortalContainer>): PromptInputProps.InputToken[];
|
|
9
|
+
/** Default plain text serialization for tokens. */
|
|
10
|
+
export declare function getPromptText(tokens: readonly PromptInputProps.InputToken[]): string;
|
|
11
|
+
export declare function findLastPinnedTokenIndex(tokens: readonly PromptInputProps.InputToken[]): number;
|
|
12
|
+
/** Scans text tokens for trigger characters and converts them to trigger tokens. */
|
|
13
|
+
export declare function detectTriggersInTokens(tokens: readonly PromptInputProps.InputToken[], menus: readonly PromptInputProps.MenuDefinition[], onTriggerDetected?: (detail: PromptInputProps.TriggerDetectedDetail) => boolean, cancelledIds?: Set<string>): PromptInputProps.InputToken[];
|
|
14
|
+
export interface ProcessTokensResult {
|
|
15
|
+
tokens: PromptInputProps.InputToken[];
|
|
16
|
+
cancelledIds: Set<string>;
|
|
17
|
+
}
|
|
18
|
+
export declare function processTokens(tokens: readonly PromptInputProps.InputToken[], config: ShortcutsConfig, options: {
|
|
19
|
+
source: UpdateSource;
|
|
20
|
+
detectTriggers?: boolean;
|
|
21
|
+
}, onTriggerDetected?: (detail: PromptInputProps.TriggerDetectedDetail) => boolean, existingCancelledIds?: Set<string>): ProcessTokensResult;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-operations.d.ts","sourceRoot":"","sources":["../../../../src/prompt-input/core/token-operations.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAWtD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAWnD,MAAM,MAAM,YAAY,GAAG,YAAY,GAAG,UAAU,GAAG,gBAAgB,GAAG,UAAU,CAAC;AAErF,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,SAAS,gBAAgB,CAAC,cAAc,EAAE,CAAC;IACnD,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,SAAS,gBAAgB,CAAC,UAAU,EAAE,KAAK,MAAM,CAAC;CAC3E;AAED,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,WAAW,EACpB,KAAK,CAAC,EAAE,SAAS,gBAAgB,CAAC,cAAc,EAAE,EAClD,gBAAgB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,GAC9C,gBAAgB,CAAC,UAAU,EAAE,CA2B/B;AAsLD,mDAAmD;AACnD,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,gBAAgB,CAAC,UAAU,EAAE,GAAG,MAAM,CAyCpF;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,gBAAgB,CAAC,UAAU,EAAE,GAAG,MAAM,CAO/F;AAED,oFAAoF;AACpF,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,SAAS,gBAAgB,CAAC,UAAU,EAAE,EAC9C,KAAK,EAAE,SAAS,gBAAgB,CAAC,cAAc,EAAE,EACjD,iBAAiB,CAAC,EAAE,CAAC,MAAM,EAAE,gBAAgB,CAAC,qBAAqB,KAAK,OAAO,EAC/E,YAAY,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GACzB,gBAAgB,CAAC,UAAU,EAAE,CAqD/B;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,gBAAgB,CAAC,UAAU,EAAE,CAAC;IACtC,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAC3B;AAED,wBAAgB,aAAa,CAC3B,MAAM,EAAE,SAAS,gBAAgB,CAAC,UAAU,EAAE,EAC9C,MAAM,EAAE,eAAe,EACvB,OAAO,EAAE;IACP,MAAM,EAAE,YAAY,CAAC;IACrB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,EACD,iBAAiB,CAAC,EAAE,CAAC,MAAM,EAAE,gBAAgB,CAAC,qBAAqB,KAAK,OAAO,EAC/E,oBAAoB,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GACjC,mBAAmB,CASrB"}
|