@cloudscape-design/components 3.0.1291 → 3.0.1292

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.
@@ -2244,5 +2244,5 @@
2244
2244
  }
2245
2245
  }
2246
2246
  :root {
2247
- --awsui-version-info-2d19b0ff: true;
2247
+ --awsui-version-info-16e21592: true;
2248
2248
  }
@@ -1,6 +1,6 @@
1
1
  export var PACKAGE_SOURCE = "components";
2
- export var PACKAGE_VERSION = "3.0.0 (2d19b0ff)";
3
- export var GIT_SHA = "2d19b0ff";
2
+ export var PACKAGE_VERSION = "3.0.0 (16e21592)";
3
+ export var GIT_SHA = "16e21592";
4
4
  export var THEME = "open-source-visual-refresh";
5
5
  export var SYSTEM = "core";
6
6
  export var ALWAYS_VISUAL_REFRESH = true;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "PACKAGE_SOURCE": "components",
3
- "PACKAGE_VERSION": "3.0.0 (2d19b0ff)",
4
- "GIT_SHA": "2d19b0ff",
3
+ "PACKAGE_VERSION": "3.0.0 (16e21592)",
4
+ "GIT_SHA": "16e21592",
5
5
  "THEME": "open-source-visual-refresh",
6
6
  "SYSTEM": "core",
7
7
  "ALWAYS_VISUAL_REFRESH": true
@@ -1,3 +1,16 @@
1
+ export interface UseIMECompositionOptions {
2
+ /**
3
+ * Called synchronously when composition starts.
4
+ */
5
+ onCompositionStart?: () => void;
6
+ /**
7
+ * Called synchronously when composition ends (i.e. the user commits a composed character).
8
+ * At the point this fires, isComposing() still returns true — which blocks the spurious
9
+ * Enter keydown that some browsers fire immediately after compositionend. The flag is
10
+ * cleared after the next animation frame.
11
+ */
12
+ onCompositionEnd?: () => void;
13
+ }
1
14
  /**
2
15
  * Custom hook to handle IME composition state for preventing IME race conditions when pressing enter to end composition.
3
16
  *
@@ -6,7 +19,13 @@
6
19
  * 2. Second Enter: Triggers normal action (isComposing=false)
7
20
  *
8
21
  * This hook tracks composition lifecycle to prevent the second Enter during the brief window.
22
+ *
23
+ * The optional `onCompositionEnd` callback fires synchronously when composition commits,
24
+ * allowing callers to process the final composed text (e.g. trigger detection in token mode).
9
25
  */
10
- export declare function useIMEComposition(elementRef: React.RefObject<HTMLInputElement>): {
26
+ export declare function useIMEComposition(elementRef: React.RefObject<HTMLElement>, {
27
+ onCompositionStart,
28
+ onCompositionEnd
29
+ }?: UseIMECompositionOptions): {
11
30
  isComposing: () => boolean;
12
31
  };
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/internal/hooks/use-ime-composition/index.ts"],"names":[],"mappings":"AAKA;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,KAAK,CAAC,SAAS,CAAC,gBAAgB,CAAC;;EAgC9E"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/internal/hooks/use-ime-composition/index.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,wBAAwB;IACvC;;OAEG;IACH,kBAAkB,CAAC,EAAE,MAAM,IAAI,CAAC;IAChC;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAC;CAC/B;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,EACxC,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,GAAE,wBAA6B;;EAyCxE"}
@@ -9,14 +9,27 @@ import { useEffect, useRef } from 'react';
9
9
  * 2. Second Enter: Triggers normal action (isComposing=false)
10
10
  *
11
11
  * This hook tracks composition lifecycle to prevent the second Enter during the brief window.
12
+ *
13
+ * The optional `onCompositionEnd` callback fires synchronously when composition commits,
14
+ * allowing callers to process the final composed text (e.g. trigger detection in token mode).
12
15
  */
13
- export function useIMEComposition(elementRef) {
16
+ export function useIMEComposition(elementRef, { onCompositionStart, onCompositionEnd } = {}) {
14
17
  const wasComposingRef = useRef(false);
18
+ const onCompositionStartRef = useRef(onCompositionStart);
19
+ onCompositionStartRef.current = onCompositionStart;
20
+ const onCompositionEndRef = useRef(onCompositionEnd);
21
+ onCompositionEndRef.current = onCompositionEnd;
15
22
  const handleCompositionStart = () => {
23
+ var _a;
16
24
  wasComposingRef.current = true;
25
+ (_a = onCompositionStartRef.current) === null || _a === void 0 ? void 0 : _a.call(onCompositionStartRef);
17
26
  };
18
27
  const handleCompositionEnd = () => {
19
- // Keep flag true briefly to catch immediate post-composition Enter events
28
+ var _a;
29
+ // Fire the callback while wasComposing is still true — this blocks the spurious
30
+ // Enter keydown that fires synchronously after compositionend in some browsers.
31
+ (_a = onCompositionEndRef.current) === null || _a === void 0 ? void 0 : _a.call(onCompositionEndRef);
32
+ // Keep flag true briefly to catch immediate post-composition Enter events.
20
33
  requestAnimationFrame(() => {
21
34
  wasComposingRef.current = false;
22
35
  });
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/internal/hooks/use-ime-composition/index.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,sCAAsC;AAEtC,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAE1C;;;;;;;;GAQG;AACH,MAAM,UAAU,iBAAiB,CAAC,UAA6C;IAC7E,MAAM,eAAe,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAEtC,MAAM,sBAAsB,GAAG,GAAG,EAAE;QAClC,eAAe,CAAC,OAAO,GAAG,IAAI,CAAC;IACjC,CAAC,CAAC;IAEF,MAAM,oBAAoB,GAAG,GAAG,EAAE;QAChC,0EAA0E;QAC1E,qBAAqB,CAAC,GAAG,EAAE;YACzB,eAAe,CAAC,OAAO,GAAG,KAAK,CAAC;QAClC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC;QACnC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO;QACT,CAAC;QAED,OAAO,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,sBAAsB,CAAC,CAAC;QACrE,OAAO,CAAC,gBAAgB,CAAC,gBAAgB,EAAE,oBAAoB,CAAC,CAAC;QAEjE,OAAO,GAAG,EAAE;YACV,OAAO,CAAC,mBAAmB,CAAC,kBAAkB,EAAE,sBAAsB,CAAC,CAAC;YACxE,OAAO,CAAC,mBAAmB,CAAC,gBAAgB,EAAE,oBAAoB,CAAC,CAAC;QACtE,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;IAEjB,MAAM,WAAW,GAAG,GAAG,EAAE,CAAC,eAAe,CAAC,OAAO,CAAC;IAElD,OAAO,EAAE,WAAW,EAAE,CAAC;AACzB,CAAC","sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { useEffect, useRef } from 'react';\n\n/**\n * Custom hook to handle IME composition state for preventing IME race conditions when pressing enter to end composition.\n *\n * IME generates duplicate Enter events:\n * 1. First Enter: Ends composition (isComposing=true -> false)\n * 2. Second Enter: Triggers normal action (isComposing=false)\n *\n * This hook tracks composition lifecycle to prevent the second Enter during the brief window.\n */\nexport function useIMEComposition(elementRef: React.RefObject<HTMLInputElement>) {\n const wasComposingRef = useRef(false);\n\n const handleCompositionStart = () => {\n wasComposingRef.current = true;\n };\n\n const handleCompositionEnd = () => {\n // Keep flag true briefly to catch immediate post-composition Enter events\n requestAnimationFrame(() => {\n wasComposingRef.current = false;\n });\n };\n\n useEffect(() => {\n const element = elementRef.current;\n if (!element) {\n return;\n }\n\n element.addEventListener('compositionstart', handleCompositionStart);\n element.addEventListener('compositionend', handleCompositionEnd);\n\n return () => {\n element.removeEventListener('compositionstart', handleCompositionStart);\n element.removeEventListener('compositionend', handleCompositionEnd);\n };\n }, [elementRef]);\n\n const isComposing = () => wasComposingRef.current;\n\n return { isComposing };\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/internal/hooks/use-ime-composition/index.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,sCAAsC;AAEtC,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAgB1C;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,iBAAiB,CAC/B,UAAwC,EACxC,EAAE,kBAAkB,EAAE,gBAAgB,KAA+B,EAAE;IAEvE,MAAM,eAAe,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IACtC,MAAM,qBAAqB,GAAG,MAAM,CAAC,kBAAkB,CAAC,CAAC;IACzD,qBAAqB,CAAC,OAAO,GAAG,kBAAkB,CAAC;IACnD,MAAM,mBAAmB,GAAG,MAAM,CAAC,gBAAgB,CAAC,CAAC;IACrD,mBAAmB,CAAC,OAAO,GAAG,gBAAgB,CAAC;IAE/C,MAAM,sBAAsB,GAAG,GAAG,EAAE;;QAClC,eAAe,CAAC,OAAO,GAAG,IAAI,CAAC;QAC/B,MAAA,qBAAqB,CAAC,OAAO,qEAAI,CAAC;IACpC,CAAC,CAAC;IAEF,MAAM,oBAAoB,GAAG,GAAG,EAAE;;QAChC,gFAAgF;QAChF,gFAAgF;QAChF,MAAA,mBAAmB,CAAC,OAAO,mEAAI,CAAC;QAChC,2EAA2E;QAC3E,qBAAqB,CAAC,GAAG,EAAE;YACzB,eAAe,CAAC,OAAO,GAAG,KAAK,CAAC;QAClC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC;QACnC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO;QACT,CAAC;QAED,OAAO,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,sBAAsB,CAAC,CAAC;QACrE,OAAO,CAAC,gBAAgB,CAAC,gBAAgB,EAAE,oBAAoB,CAAC,CAAC;QAEjE,OAAO,GAAG,EAAE;YACV,OAAO,CAAC,mBAAmB,CAAC,kBAAkB,EAAE,sBAAsB,CAAC,CAAC;YACxE,OAAO,CAAC,mBAAmB,CAAC,gBAAgB,EAAE,oBAAoB,CAAC,CAAC;QACtE,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;IAEjB,MAAM,WAAW,GAAG,GAAG,EAAE,CAAC,eAAe,CAAC,OAAO,CAAC;IAElD,OAAO,EAAE,WAAW,EAAE,CAAC;AACzB,CAAC","sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { useEffect, useRef } from 'react';\n\nexport interface UseIMECompositionOptions {\n /**\n * Called synchronously when composition starts.\n */\n onCompositionStart?: () => void;\n /**\n * Called synchronously when composition ends (i.e. the user commits a composed character).\n * At the point this fires, isComposing() still returns true — which blocks the spurious\n * Enter keydown that some browsers fire immediately after compositionend. The flag is\n * cleared after the next animation frame.\n */\n onCompositionEnd?: () => void;\n}\n\n/**\n * Custom hook to handle IME composition state for preventing IME race conditions when pressing enter to end composition.\n *\n * IME generates duplicate Enter events:\n * 1. First Enter: Ends composition (isComposing=true -> false)\n * 2. Second Enter: Triggers normal action (isComposing=false)\n *\n * This hook tracks composition lifecycle to prevent the second Enter during the brief window.\n *\n * The optional `onCompositionEnd` callback fires synchronously when composition commits,\n * allowing callers to process the final composed text (e.g. trigger detection in token mode).\n */\nexport function useIMEComposition(\n elementRef: React.RefObject<HTMLElement>,\n { onCompositionStart, onCompositionEnd }: UseIMECompositionOptions = {}\n) {\n const wasComposingRef = useRef(false);\n const onCompositionStartRef = useRef(onCompositionStart);\n onCompositionStartRef.current = onCompositionStart;\n const onCompositionEndRef = useRef(onCompositionEnd);\n onCompositionEndRef.current = onCompositionEnd;\n\n const handleCompositionStart = () => {\n wasComposingRef.current = true;\n onCompositionStartRef.current?.();\n };\n\n const handleCompositionEnd = () => {\n // Fire the callback while wasComposing is still true — this blocks the spurious\n // Enter keydown that fires synchronously after compositionend in some browsers.\n onCompositionEndRef.current?.();\n // Keep flag true briefly to catch immediate post-composition Enter events.\n requestAnimationFrame(() => {\n wasComposingRef.current = false;\n });\n };\n\n useEffect(() => {\n const element = elementRef.current;\n if (!element) {\n return;\n }\n\n element.addEventListener('compositionstart', handleCompositionStart);\n element.addEventListener('compositionend', handleCompositionEnd);\n\n return () => {\n element.removeEventListener('compositionstart', handleCompositionStart);\n element.removeEventListener('compositionend', handleCompositionEnd);\n };\n }, [elementRef]);\n\n const isComposing = () => wasComposingRef.current;\n\n return { isComposing };\n}\n"]}
@@ -1,3 +1,3 @@
1
1
  {
2
- "commit": "2d19b0fff4244b5b6b6fcd4affa414482fadb539"
2
+ "commit": "16e21592c8e2ab81e23f37040bc74be3d21b8efa"
3
3
  }
package/package.json CHANGED
@@ -164,7 +164,7 @@
164
164
  "./internal/base-component/index.js",
165
165
  "./internal/base-component/styles.css.js"
166
166
  ],
167
- "version": "3.0.1291",
167
+ "version": "3.0.1292",
168
168
  "repository": {
169
169
  "type": "git",
170
170
  "url": "https://github.com/cloudscape-design/components.git"
@@ -25,6 +25,8 @@ export interface KeyboardHandlerProps {
25
25
  }) => void;
26
26
  markTokensAsSent: (tokens: readonly PromptInputProps.InputToken[]) => void;
27
27
  onKeyDown?: PromptInputProps['onKeyDown'];
28
+ /** Returns true if an IME composition session is active or just ended (spurious-Enter window). */
29
+ isComposing?: () => boolean;
28
30
  }
29
31
  /** Handles all keyboard events for the editable element. */
30
32
  export declare function handleEditableKeyDown(event: React.KeyboardEvent<HTMLDivElement>, props: KeyboardHandlerProps): void;
@@ -1 +1 @@
1
- {"version":3,"file":"event-handlers.d.ts","sourceRoot":"","sources":["../../../../src/prompt-input/core/event-handlers.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,eAAe,EAAoC,MAAM,oBAAoB,CAAC;AAcvF,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAMjE,4DAA4D;AAC5D,MAAM,WAAW,oBAAoB;IACnC,eAAe,EAAE,cAAc,GAAG,IAAI,CAAC;IACvC,aAAa,EAAE,aAAa,CAAC;IAC7B,eAAe,EAAE,eAAe,GAAG,IAAI,CAAC;IACxC,MAAM,CAAC,EAAE,SAAS,gBAAgB,CAAC,UAAU,EAAE,CAAC;IAChD,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,SAAS,gBAAgB,CAAC,UAAU,EAAE,KAAK,MAAM,CAAC;IAC1E,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,gBAAgB,CAAC,WAAW,CAAC;IAC3C,sBAAsB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAGnD,WAAW,EAAE,MAAM,OAAO,CAAC;IAC3B,iBAAiB,EAAE,MAAM,cAAc,GAAG,IAAI,CAAC;IAC/C,oBAAoB,EAAE,MAAM,iBAAiB,GAAG,IAAI,CAAC;IACrD,iBAAiB,CAAC,EAAE,MAAM,gBAAgB,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;IACxE,SAAS,EAAE,MAAM,IAAI,CAAC;IAGtB,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,gBAAgB,CAAC,YAAY,KAAK,IAAI,CAAC;IAC3D,QAAQ,EAAE,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,gBAAgB,CAAC,UAAU,EAAE,CAAA;KAAE,KAAK,IAAI,CAAC;IACrF,gBAAgB,EAAE,CAAC,MAAM,EAAE,SAAS,gBAAgB,CAAC,UAAU,EAAE,KAAK,IAAI,CAAC;IAC3E,SAAS,CAAC,EAAE,gBAAgB,CAAC,WAAW,CAAC,CAAC;CAC3C;AAED,4DAA4D;AAC5D,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,KAAK,CAAC,aAAa,CAAC,cAAc,CAAC,EAAE,KAAK,EAAE,oBAAoB,GAAG,IAAI,CAsJnH;AA2BD,0FAA0F;AAC1F,wBAAgB,qBAAqB,CACnC,eAAe,EAAE,cAAc,EAC/B,eAAe,EAAE,eAAe,GAAG,IAAI,EACvC,kBAAkB,UAAQ,GACzB,IAAI,CAqDN;AAyCD,4FAA4F;AAC5F,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,KAAK,CAAC,aAAa,CAAC,cAAc,CAAC,EAC1C,WAAW,EAAE,OAAO,EACpB,eAAe,EAAE,cAAc,EAC/B,KAAK,EAAE,aAAa,EACpB,sBAAsB,EAAE,CAAC,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,EAC/D,WAAW,EAAE,gBAAgB,CAAC,WAAW,GAAG,SAAS,EACrD,eAAe,EAAE,eAAe,GAAG,IAAI,EACvC,MAAM,CAAC,EAAE,SAAS,gBAAgB,CAAC,UAAU,EAAE,EAC/C,UAAU,CAAC,EAAE,CAAC,SAAS,EAAE,gBAAgB,CAAC,UAAU,EAAE,EAAE,aAAa,EAAE,MAAM,KAAK,IAAI,GACrF,OAAO,CAiFT;AAwCD,yGAAyG;AACzG,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,KAAK,CAAC,aAAa,CAAC,cAAc,CAAC,EAC1C,eAAe,EAAE,eAAe,GAAG,IAAI,EACvC,sBAAsB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GACjD,IAAI,CA2BN;AAED,sGAAsG;AACtG,wBAAgB,eAAe,CAC7B,KAAK,EAAE,KAAK,CAAC,aAAa,CAAC,cAAc,CAAC,EAC1C,eAAe,EAAE,eAAe,GAAG,IAAI,EACvC,sBAAsB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GACjD,IAAI,CA2BN;AA6HD,iGAAiG;AACjG,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,KAAK,CAAC,aAAa,CAAC,cAAc,CAAC,EAC1C,eAAe,EAAE,cAAc,EAC/B,QAAQ,EAAE,OAAO,EACjB,eAAe,EAAE,eAAe,GAAG,IAAI,GACtC,OAAO,CA+DT;AAED,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,UAAU,CAAC;AAEpD,UAAU,qBAAqB;IAC7B,SAAS,EAAE,cAAc,CAAC;IAC1B,eAAe,EAAE,cAAc,CAAC;IAChC,MAAM,EAAE,SAAS,gBAAgB,CAAC,UAAU,EAAE,CAAC;IAC/C,qBAAqB,EAAE,MAAM,CAAC;IAC9B,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,SAAS,gBAAgB,CAAC,UAAU,EAAE,KAAK,MAAM,CAAC;IAC1E,QAAQ,EAAE,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,gBAAgB,CAAC,UAAU,EAAE,CAAA;KAAE,KAAK,IAAI,CAAC;IACrF,eAAe,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;CAC1C;AAED,+EAA+E;AAC/E,wBAAgB,eAAe,CAAC,MAAM,EAAE,qBAAqB,GAAG,OAAO,CA+CtE;AAED,sFAAsF;AACtF,wBAAgB,+BAA+B,CAC7C,KAAK,EAAE,KAAK,CAAC,aAAa,CAAC,cAAc,CAAC,EAC1C,eAAe,EAAE,cAAc,EAC/B,MAAM,EAAE,SAAS,gBAAgB,CAAC,UAAU,EAAE,EAC9C,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,SAAS,gBAAgB,CAAC,UAAU,EAAE,KAAK,MAAM,CAAC,GAAG,SAAS,EACtF,QAAQ,EAAE,CAAC,MAAM,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,gBAAgB,CAAC,UAAU,EAAE,CAAA;CAAE,KAAK,IAAI,EACpF,eAAe,EAAE,eAAe,GAAG,IAAI,GACtC,OAAO,CAwCT;AAED,6EAA6E;AAC7E,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,KAAK,CAAC,aAAa,CAAC,cAAc,CAAC,EAC1C,eAAe,EAAE,cAAc,EAC/B,MAAM,EAAE,SAAS,gBAAgB,CAAC,UAAU,EAAE,EAC9C,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,SAAS,gBAAgB,CAAC,UAAU,EAAE,KAAK,MAAM,CAAC,GAAG,SAAS,EACtF,QAAQ,EAAE,CAAC,MAAM,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,gBAAgB,CAAC,UAAU,EAAE,CAAA;CAAE,KAAK,IAAI,EACpF,eAAe,EAAE,eAAe,GAAG,IAAI,GACtC,OAAO,CAuDT;AAED,8DAA8D;AAC9D,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,KAAK,CAAC,cAAc,EAAE,eAAe,EAAE,WAAW,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAqBpH"}
1
+ {"version":3,"file":"event-handlers.d.ts","sourceRoot":"","sources":["../../../../src/prompt-input/core/event-handlers.ts"],"names":[],"mappings":"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"}
@@ -71,7 +71,8 @@ export function handleEditableKeyDown(event, props) {
71
71
  handleDeleteAfterTrigger(event, editableElement);
72
72
  },
73
73
  onShiftEnter: () => {
74
- if (event.nativeEvent.isComposing) {
74
+ var _a;
75
+ if (event.nativeEvent.isComposing || ((_a = props.isComposing) === null || _a === void 0 ? void 0 : _a.call(props))) {
75
76
  return;
76
77
  }
77
78
  event.preventDefault();
@@ -83,7 +84,8 @@ export function handleEditableKeyDown(event, props) {
83
84
  }
84
85
  },
85
86
  onEnter: () => {
86
- if (event.nativeEvent.isComposing) {
87
+ var _a;
88
+ if (event.nativeEvent.isComposing || ((_a = props.isComposing) === null || _a === void 0 ? void 0 : _a.call(props))) {
87
89
  return;
88
90
  }
89
91
  if (menuOpen && menuItemsHandlers) {
@@ -1 +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"]}
1
+ {"version":3,"file":"event-handlers.js","sourceRoot":"","sources":["../../../../src/prompt-input/core/event-handlers.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,sCAAsC;AAEtC,OAAO,EAAE,WAAW,EAAE,MAAM,0CAA0C,CAAC;AAEvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,SAAS,MAAM,iCAAiC,CAAC;AAGxD,OAAO,EAAmB,iBAAiB,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACvF,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EACL,eAAe,EACf,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,EACjB,YAAY,EACZ,WAAW,EACX,eAAe,EACf,yBAAyB,EACzB,sBAAsB,EACtB,wBAAwB,GACzB,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAClF,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AA8B1E,4DAA4D;AAC5D,MAAM,UAAU,qBAAqB,CAAC,KAA0C,EAAE,KAA2B;IAC3G,MAAM,EAAE,eAAe,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,KAAK,CAAC;IAExF,MAAM,UAAU,GAAG,CAAC,MAAgE,EAAE,EAAE;QACtF,KAAK,CAAC,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACtC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACzB,CAAC,CAAC;IAEF,MAAM,iBAAiB,GAAG,CAAC,SAAwC,EAAE,QAAgB,EAAE,EAAE;QACvF,MAAM,KAAK,GAAG,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;QAChF,yEAAyE;QACzE,wEAAwE;QACxE,sEAAsE;QACtE,KAAK,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;QAC7C,IAAI,eAAe,EAAE,CAAC;YACpB,eAAe,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;QAChD,CAAC;IACH,CAAC,CAAC;IAEF,kCAAkC;IAClC,iBAAiB,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAE1C,MAAM,cAAc,GAAG,KAAK,CAAC,iBAAiB,EAAE,CAAC;IACjD,MAAM,iBAAiB,GAAG,KAAK,CAAC,oBAAoB,EAAE,CAAC;IACvD,MAAM,QAAQ,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IAErC,SAAS,CAAC,KAAK,EAAE;QACf,aAAa,EAAE,GAAG,EAAE,CAAC,iBAAiB,CAAC,KAAK,EAAE,eAAe,EAAE,KAAK,CAAC,sBAAsB,CAAC;QAC5F,WAAW,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,KAAK,EAAE,eAAe,EAAE,KAAK,CAAC,sBAAsB,CAAC;QACxF,kBAAkB,EAAE,GAAG,EAAE,CAAC,iBAAiB,CAAC,KAAK,EAAE,eAAe,EAAE,KAAK,CAAC,sBAAsB,CAAC;QACjG,gBAAgB,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,KAAK,EAAE,eAAe,EAAE,KAAK,CAAC,sBAAsB,CAAC;QAC7F,WAAW,EAAE,GAAG,EAAE;YAChB,IAAI,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,MAAM,MAAK,CAAC,EAAE,CAAC;gBACzB,KAAK,CAAC,cAAc,EAAE,CAAC;YACzB,CAAC;QACH,CAAC;QACD,WAAW,EAAE,GAAG,EAAE;YAChB,IACE,eAAe;gBACf,4BAA4B,CAC1B,KAAK,EACL,IAAI,EACJ,eAAe,EACf,aAAa,EACb,KAAK,CAAC,sBAAsB,EAC5B,KAAK,CAAC,WAAW,EACjB,eAAe,EACf,MAAM,EACN,iBAAiB,CAClB,EACD,CAAC;gBACD,OAAO;YACT,CAAC;YACD,IAAI,CAAC,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;gBAChC,OAAO;YACT,CAAC;YACD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACxB,KAAK,CAAC,cAAc,EAAE,CAAC;gBACvB,OAAO;YACT,CAAC;YACD,+BAA+B,CAAC,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,eAAe,CAAC,CAAC;QAC7G,CAAC;QACD,QAAQ,EAAE,GAAG,EAAE;YACb,IACE,eAAe;gBACf,4BAA4B,CAC1B,KAAK,EACL,KAAK,EACL,eAAe,EACf,aAAa,EACb,KAAK,CAAC,sBAAsB,EAC5B,KAAK,CAAC,WAAW,EACjB,eAAe,EACf,MAAM,EACN,iBAAiB,CAClB,EACD,CAAC;gBACD,OAAO;YACT,CAAC;YACD,IAAI,CAAC,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;gBAChC,OAAO;YACT,CAAC;YACD,IAAI,0BAA0B,CAAC,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,eAAe,CAAC,EAAE,CAAC;gBAC1G,OAAO;YACT,CAAC;YACD,wBAAwB,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC;QACnD,CAAC;QACD,YAAY,EAAE,GAAG,EAAE;;YACjB,IAAI,KAAK,CAAC,WAAW,CAAC,WAAW,KAAI,MAAA,KAAK,CAAC,WAAW,qDAAI,CAAA,EAAE,CAAC;gBAC3D,OAAO;YACT,CAAC;YACD,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,IAAI,eAAe,aAAf,eAAe,uBAAf,eAAe,CAAE,iBAAiB,EAAE,EAAE,CAAC;gBACzC,OAAO;YACT,CAAC;YACD,IAAI,eAAe,EAAE,CAAC;gBACpB,qBAAqB,CAAC,eAAe,EAAE,eAAe,CAAC,CAAC;YAC1D,CAAC;QACH,CAAC;QACD,OAAO,EAAE,GAAG,EAAE;;YACZ,IAAI,KAAK,CAAC,WAAW,CAAC,WAAW,KAAI,MAAA,KAAK,CAAC,WAAW,qDAAI,CAAA,EAAE,CAAC;gBAC3D,OAAO;YACT,CAAC;YACD,IAAI,QAAQ,IAAI,iBAAiB,EAAE,CAAC;gBAClC,KAAK,CAAC,cAAc,EAAE,CAAC;gBACvB,iBAAiB,CAAC,mCAAmC,EAAE,CAAC;gBACxD,OAAO;YACT,CAAC;YACD,iBAAiB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAClC,CAAC;QACD,KAAK,EAAE,GAAG,EAAE;YACV,IAAI,QAAQ,IAAI,iBAAiB,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;gBACrD,KAAK,CAAC,cAAc,EAAE,CAAC;gBACvB,iBAAiB,CAAC,mCAAmC,EAAE,CAAC;YAC1D,CAAC;QACH,CAAC;QACD,OAAO,EAAE,GAAG,EAAE;YACZ,IAAI,eAAe,IAAI,6BAA6B,CAAC,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,eAAe,CAAC,EAAE,CAAC;gBACxG,OAAO;YACT,CAAC;YACD,IAAI,QAAQ,IAAI,iBAAiB,IAAI,cAAc,EAAE,CAAC;gBACpD,qBAAqB,CAAC,KAAK,EAAE;oBAC3B,cAAc;oBACd,iBAAiB;oBACjB,iBAAiB,EAAE,KAAK,CAAC,iBAAiB;oBAC1C,SAAS,EAAE,KAAK,CAAC,SAAS;oBAC1B,eAAe,EAAE,eAAe,aAAf,eAAe,cAAf,eAAe,GAAI,SAAS;oBAC7C,eAAe,EAAE,eAAe,aAAf,eAAe,cAAf,eAAe,GAAI,SAAS;iBAC9C,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QACD,UAAU,EAAE,GAAG,EAAE;YACf,IAAI,QAAQ,IAAI,iBAAiB,EAAE,CAAC;gBAClC,KAAK,CAAC,cAAc,EAAE,CAAC;gBACvB,iBAAiB,CAAC,yBAAyB,CAAC,CAAC,CAAC,CAAC;YACjD,CAAC;QACH,CAAC;QACD,YAAY,EAAE,GAAG,EAAE;YACjB,IAAI,QAAQ,IAAI,iBAAiB,EAAE,CAAC;gBAClC,KAAK,CAAC,cAAc,EAAE,CAAC;gBACvB,iBAAiB,CAAC,yBAAyB,CAAC,CAAC,CAAC,CAAC,CAAC;YAClD,CAAC;QACH,CAAC;QACD,QAAQ,EAAE,GAAG,EAAE;YACb,IAAI,QAAQ,EAAE,CAAC;gBACb,KAAK,CAAC,cAAc,EAAE,CAAC;gBACvB,KAAK,CAAC,SAAS,EAAE,CAAC;YACpB,CAAC;QACH,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAED,0DAA0D;AAC1D,SAAS,iBAAiB,CAAC,KAA0C,EAAE,KAA2B;;IAChG,IAAI,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QACrC,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,OAAO;IACT,CAAC;IAED,MAAM,aAAa,GAAG,KAAK,CAAC,aAAa,CAAC;IAC1C,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,EAAE,CAAC;QAClC,OAAO;IACT,CAAC;IAED,MAAM,IAAI,GAAG,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC3C,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,kBAAkB,EAAE,EAAE,CAAC;QACxC,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IACD,KAAK,CAAC,cAAc,EAAE,CAAC;IAEvB,MAAM,SAAS,GAAG,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,MAAA,KAAK,CAAC,MAAM,mCAAI,EAAE,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,MAAA,KAAK,CAAC,MAAM,mCAAI,EAAE,CAAC,CAAC;IAElH,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QACnB,KAAK,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,MAAA,KAAK,CAAC,MAAM,mCAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;IAC1E,CAAC;AACH,CAAC;AAED,0FAA0F;AAC1F,MAAM,UAAU,qBAAqB,CACnC,eAA+B,EAC/B,eAAuC,EACvC,kBAAkB,GAAG,KAAK;;IAE1B,MAAM,SAAS,GAAG,iBAAiB,CAAC,eAAe,CAAC,CAAC;IACrD,IAAI,CAAC,CAAA,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,UAAU,CAAA,EAAE,CAAC;QAC3B,OAAO;IACT,CAAC;IAED,MAAM,KAAK,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IACtC,MAAM,YAAY,GAAG,aAAa,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,aAAa,CAAC;IACrH,MAAM,QAAQ,GAAG,YAAY,CAAC,CAAC,CAAC,WAAW,CAAC,YAAY,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAEhG,IAAI,CAAC,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,UAAU,CAAA,EAAE,CAAC;QAC1B,OAAO;IACT,CAAC;IAED,MAAM,UAAU,GAAG,CAAC,MAAA,eAAe,CAAC,aAAa,mCAAI,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;IAC7E,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;IAC7D,UAAU,CAAC,WAAW,CAAC,QAAQ,CAAC,SAAS,IAAI,QAAQ,CAAC,CAAC;IAEvD,MAAM,YAAY,GAAG,UAAU,CAAC,eAAe,EAAE,CAAC;IAElD,sFAAsF;IACtF,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,EAAE,CAAC;QACxD,IAAI,KAAK,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;YAC5B,KAAK,CAAC,MAAM,EAAE,CAAC;QACjB,CAAC;IACH,CAAC;IAED,MAAM,IAAI,GAAG,eAAe,EAAE,CAAC;IAC/B,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;IAE/B,IAAI,yBAAyB,CAAC,IAAI,CAAC,EAAE,CAAC;QACpC,IAAI,CAAC,WAAW,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAC1C,CAAC;IAED,IAAI,yBAAyB,CAAC,QAAQ,CAAC,EAAE,CAAC;QACxC,QAAQ,CAAC,WAAW,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAC9C,CAAC;IAED,QAAQ,CAAC,UAAU,CAAC,YAAY,CAAC,IAAI,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAC;IAE7D,IAAI,WAAW,GAAkB,IAAI,CAAC;IACtC,IAAI,eAAe,EAAE,CAAC;QACpB,MAAM,UAAU,GAAG,eAAe,CAAC,WAAW,EAAE,CAAC;QACjD,WAAW,GAAG,UAAU,GAAG,aAAa,CAAC,UAAU,CAAC;IACtD,CAAC;IAED,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACxB,eAAe,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACvE,CAAC;IAED,IAAI,eAAe,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;QAC5C,eAAe,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;IAC3C,CAAC;AACH,CAAC;AAOD,SAAS,2BAA2B,CAAC,SAAe,EAAE,MAAc,EAAE,WAAoB;;IACxF,IAAI,QAAQ,GAAgB,IAAI,CAAC;IAEjC,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC1B,MAAM,QAAQ,GAAG,WAAW,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,CAAA,MAAA,SAAS,CAAC,WAAW,0CAAE,MAAM,KAAI,CAAC,CAAC,CAAC;QAC9F,IAAI,QAAQ,EAAE,CAAC;YACb,QAAQ,GAAG,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC;QAC7E,CAAC;IACH,CAAC;SAAM,IAAI,aAAa,CAAC,SAAS,CAAC,EAAE,CAAC;QACpC,MAAM,UAAU,GAAG,WAAW,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QACrD,QAAQ,GAAG,SAAS,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IAC9C,CAAC;IAED,IAAI,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5B,MAAM,YAAY,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;QAC5C,IAAI,sBAAsB,CAAC,YAAY,CAAC,EAAE,CAAC;YACzC,OAAO;gBACL,cAAc,EAAE,QAAQ;gBACxB,aAAa,EAAE,QAAQ;aACxB,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC;AACvD,CAAC;AAED,SAAS,uBAAuB,CAAC,OAA2B;IAC1D,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IACxC,OAAO,sBAAsB,CAAC,SAAS,CAAC,CAAC;AAC3C,CAAC;AAED,4FAA4F;AAC5F,MAAM,UAAU,4BAA4B,CAC1C,KAA0C,EAC1C,WAAoB,EACpB,eAA+B,EAC/B,KAAoB,EACpB,sBAA+D,EAC/D,WAAqD,EACrD,eAAuC,EACvC,MAA+C,EAC/C,UAAsF;;IAEtF,MAAM,SAAS,GAAG,iBAAiB,CAAC,eAAe,CAAC,CAAC;IACrD,IAAI,CAAC,CAAA,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,UAAU,CAAA,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,KAAK,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAEtC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;QACrB,KAAK,CAAC,cAAc,EAAE,CAAC;QAEvB,IAAI,CAAC,eAAe,IAAI,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;YAC/C,OAAO,KAAK,CAAC;QACf,CAAC;QAED,wEAAwE;QACxE,uEAAuE;QACvE,MAAM,QAAQ,GAAG,eAAe,CAAC,WAAW,EAAE,CAAC;QAE/C,kEAAkE;QAClE,MAAM,SAAS,GAAG,KAAK,CAAC,UAAU,EAAE,CAAC;QACrC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC1B,SAAS,CAAC,eAAe,EAAE,CAAC;QAC5B,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QAC9B,MAAM,MAAM,GAAG,eAAe,CAAC,WAAW,EAAE,CAAC;QAC7C,SAAS,CAAC,eAAe,EAAE,CAAC;QAC5B,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAE1B,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAE5C,MAAM,SAAS,GAAG,gBAAgB,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;QACjE,UAAU,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QAElC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,EAAE,aAAa,EAAE,cAAc,EAAE,GAAG,2BAA2B,CACnE,KAAK,CAAC,cAAc,EACpB,KAAK,CAAC,WAAW,EACjB,WAAW,CACZ,CAAC;IAEF,MAAM,YAAY,GAAG,aAAa,IAAI,cAAc,IAAI,IAAI,CAAC;IAE7D,IAAI,CAAC,uBAAuB,CAAC,YAAY,CAAC,EAAE,CAAC;QAC3C,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,eAAe,GAAG,CAAC,cAAc,IAAI,YAAY,CAAE,CAAC;IAC1D,MAAM,SAAS,GAAG,eAAe,CAAC,UAAU,CAAC;IAC7C,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,CAAC,cAAc,EAAE,CAAC;IAEvB,MAAM,UAAU,GAAG,CAAA,MAAA,YAAa,CAAC,WAAW,0CAAE,IAAI,EAAE,KAAI,EAAE,CAAC;IAC3D,IAAI,sBAAsB,IAAI,UAAU,EAAE,CAAC;QACzC,MAAM,YAAY,GAAG,MAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,qBAAqB,4DAAG,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC;QACpG,IAAI,YAAY,EAAE,CAAC;YACjB,sBAAsB,CAAC,YAAY,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,uBAAuB,GAAG,IAAI,CAAC;IAErC,IAAI,WAAW,GAAkB,IAAI,CAAC;IACtC,IAAI,eAAe,EAAE,CAAC;QACpB,MAAM,UAAU,GAAG,eAAe,CAAC,WAAW,EAAE,CAAC;QACjD,WAAW,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;IAC7F,CAAC;IAED,eAAe,CAAC,MAAM,EAAE,CAAC;IACzB,eAAe,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAErE,IAAI,eAAe,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;QAC5C,eAAe,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;IAC3C,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,6FAA6F;AAC7F,SAAS,4BAA4B,CACnC,SAAe,EACf,SAAiC,EACjC,KAA0C,EAC1C,SAAoB;;IAEpB,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,MAAM,GAAG,SAAS,CAAC,aAAa,CAAC;IACvC,IAAI,CAAC,MAAM,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;QACtD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,CAAC,aAAa,CAAC;IACrC,IAAI,CAAC,OAAO,IAAI,CAAC,sBAAsB,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;QAC/D,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC;IACxC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACvE,MAAM,SAAS,GAAG,SAAS,KAAK,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC;IAE7E,KAAK,CAAC,cAAc,EAAE,CAAC;IACvB,MAAM,QAAQ,GAAG,CAAC,MAAA,SAAS,CAAC,aAAa,mCAAI,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;IACrE,QAAQ,CAAC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IACxC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACxB,SAAS,CAAC,eAAe,EAAE,CAAC;IAC5B,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC7B,OAAO,IAAI,CAAC;AACd,CAAC;AAED,yGAAyG;AACzG,MAAM,UAAU,iBAAiB,CAC/B,KAA0C,EAC1C,eAAuC,EACvC,sBAAkD;;IAElD,MAAM,SAAS,GAAG,iBAAiB,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IACzD,IAAI,CAAC,CAAA,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,UAAU,CAAA,EAAE,CAAC;QAC3B,OAAO;IACT,CAAC;IACD,MAAM,KAAK,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAEtC,IAAI,KAAK,CAAC,SAAS,IAAI,4BAA4B,CAAC,KAAK,CAAC,cAAc,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,CAAC,EAAE,CAAC;QACxG,OAAO;IACT,CAAC;IAED,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QACnB,4BAA4B,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;QAClE,OAAO;IACT,CAAC;IAED,MAAM,EAAE,OAAO,EAAE,gBAAgB,EAAE,GAAG,iBAAiB,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;IAC7G,IAAI,gBAAgB,IAAI,OAAO,EAAE,CAAC;QAChC,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,eAAe,aAAf,eAAe,uBAAf,eAAe,CAAE,YAAY,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;QACvD,IAAI,sBAAsB,IAAI,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC;YACrD,MAAM,KAAK,GAAG,wBAAwB,CAAC,CAAA,MAAA,OAAO,CAAC,WAAW,0CAAE,IAAI,EAAE,KAAI,EAAE,CAAC,CAAC;YAC1E,IAAI,KAAK,EAAE,CAAC;gBACV,sBAAsB,CAAC,KAAK,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED,sGAAsG;AACtG,MAAM,UAAU,eAAe,CAC7B,KAA0C,EAC1C,eAAuC,EACvC,sBAAkD;;IAElD,MAAM,SAAS,GAAG,iBAAiB,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IACzD,IAAI,CAAC,CAAA,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,UAAU,CAAA,EAAE,CAAC;QAC3B,OAAO;IACT,CAAC;IACD,MAAM,KAAK,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAEtC,IAAI,KAAK,CAAC,SAAS,IAAI,4BAA4B,CAAC,KAAK,CAAC,cAAc,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,CAAC,EAAE,CAAC;QACvG,OAAO;IACT,CAAC;IAED,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QACnB,4BAA4B,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;QACjE,OAAO;IACT,CAAC;IAED,MAAM,EAAE,OAAO,EAAE,gBAAgB,EAAE,GAAG,iBAAiB,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;IAC5G,IAAI,gBAAgB,IAAI,OAAO,EAAE,CAAC;QAChC,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,eAAe,aAAf,eAAe,uBAAf,eAAe,CAAE,WAAW,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;QACtD,IAAI,sBAAsB,IAAI,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC;YACrD,MAAM,KAAK,GAAG,wBAAwB,CAAC,CAAA,MAAA,OAAO,CAAC,WAAW,0CAAE,IAAI,EAAE,KAAI,EAAE,CAAC,CAAC;YAC1E,IAAI,KAAK,EAAE,CAAC;gBACV,sBAAsB,CAAC,KAAK,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED,kGAAkG;AAClG,SAAS,4BAA4B,CACnC,KAA0C,EAC1C,SAAoB,EACpB,KAAY,EACZ,SAAiC;;IAEjC,MAAM,UAAU,GAAG,SAAS,KAAK,UAAU,CAAC;IAE5C,uEAAuE;IACvE,MAAM,SAAS,GAAG,SAAS,CAAC,SAAS,CAAC;IACtC,MAAM,QAAQ,GAAG,SAAS,CAAC,WAAW,CAAC;IACvC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,WAAW,GAAgB,IAAI,CAAC;IAEpC,8FAA8F;IAC9F,IAAI,aAAa,GAAuB,IAAI,CAAC;IAC7C,IAAI,IAAI,GAAgB,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAE,SAAyB,CAAC;IACrG,OAAO,IAAI,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,IAAI,KAAK,KAAK,CAAC,aAAa,EAAE,CAAC;QACnE,MAAM,SAAS,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;QACrC,IAAI,sBAAsB,CAAC,SAAS,CAAC,EAAE,CAAC;YACtC,aAAa,GAAG,IAAI,CAAC;YACrB,MAAM;QACR,CAAC;QACD,IAAI,eAAe,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACrD,MAAM,UAAU,GAAG,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YACpD,IAAI,sBAAsB,CAAC,UAAU,CAAC,EAAE,CAAC;gBACvC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;gBACnC,MAAM;YACR,CAAC;QACH,CAAC;QACD,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED,IAAI,aAAa,EAAE,CAAC;QAClB,WAAW,GAAG,aAAa,CAAC;IAC9B,CAAC;SAAM,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QACjC,IAAI,UAAU,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;YACjC,WAAW,GAAG,SAAS,CAAC,eAAe,CAAC;QAC1C,CAAC;aAAM,IAAI,CAAC,UAAU,EAAE,CAAC;YACvB,MAAM,GAAG,GAAG,CAAA,MAAA,SAAS,CAAC,WAAW,0CAAE,MAAM,KAAI,CAAC,CAAC;YAC/C,uEAAuE;YACvE,iEAAiE;YACjE,IAAI,QAAQ,IAAI,GAAG,IAAI,SAAS,CAAC,WAAW,EAAE,CAAC;gBAC7C,MAAM,WAAW,GAAG,SAAS,CAAC,WAAW,CAAC;gBAC1C,IAAI,aAAa,CAAC,WAAW,CAAC,IAAI,sBAAsB,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC;oBACpF,WAAW,GAAG,WAAW,CAAC;gBAC5B,CAAC;YACH,CAAC;QACH,CAAC;QACD,IAAI,CAAC,WAAW,IAAI,UAAU,IAAI,QAAQ,KAAK,CAAC,IAAI,SAAS,CAAC,eAAe,EAAE,CAAC;YAC9E,MAAM,eAAe,GAAG,SAAS,CAAC,eAAe,CAAC;YAClD,IAAI,aAAa,CAAC,eAAe,CAAC,IAAI,sBAAsB,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC;gBAC5F,WAAW,GAAG,eAAe,CAAC;YAChC,CAAC;QACH,CAAC;IACH,CAAC;SAAM,IAAI,aAAa,CAAC,SAAS,CAAC,EAAE,CAAC;QACpC,IAAI,UAAU,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;YAC/B,WAAW,GAAG,SAAS,CAAC,UAAU,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;QACnD,CAAC;aAAM,IAAI,CAAC,UAAU,IAAI,QAAQ,GAAG,SAAS,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;YACjE,WAAW,GAAG,SAAS,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IAED,IAAI,CAAC,WAAW,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,IAAI,CAAC,sBAAsB,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC;QACtG,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,MAAM,GAAG,WAAW,CAAC,UAAU,CAAC;IACtC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,CAAC,cAAc,EAAE,CAAC;IAEvB,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,WAAwB,CAAC,CAAC;IAE9E,6EAA6E;IAC7E,4EAA4E;IAC5E,6CAA6C;IAC7C,IAAI,UAAU,GAAS,MAAM,CAAC;IAC9B,IAAI,YAAY,GAAW,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC;IAE1D,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,WAAW,GAAG,WAAW,CAAC,WAAW,CAAC;QAC5C,IAAI,WAAW,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAC3C,UAAU,GAAG,WAAW,CAAC;YACzB,YAAY,GAAG,CAAC,CAAC;QACnB,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,WAAW,GAAG,WAAW,CAAC,eAAe,CAAC;QAChD,IAAI,WAAW,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAC3C,UAAU,GAAG,WAAW,CAAC;YACzB,YAAY,GAAG,CAAA,MAAA,WAAW,CAAC,WAAW,0CAAE,MAAM,KAAI,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;IAED,uFAAuF;IACvF,wDAAwD;IACxD,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,SAAS,CAAC,UAAU,EAAE,CAAC;QAC7C,MAAM,SAAS,GAAG,WAAW,CAAC,uBAAuB,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QAC5E,MAAM,aAAa,GACjB,CAAC,SAAS,GAAG,IAAI,CAAC,2BAA2B,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,8BAA8B,CAAC,KAAK,CAAC,CAAC;QAClH,MAAM,cAAc,GAClB,CAAC,SAAS,GAAG,IAAI,CAAC,2BAA2B,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,0BAA0B,CAAC,KAAK,CAAC,CAAC;QAE9G,IAAI,CAAC,CAAC,UAAU,IAAI,aAAa,CAAC,IAAI,CAAC,UAAU,IAAI,cAAc,CAAC,EAAE,CAAC;YACrE,MAAM,UAAU,GAAG,SAAS,CAAC,UAAW,CAAC;YACzC,MAAM,YAAY,GAAG,SAAS,CAAC,YAAY,CAAC;YAC5C,SAAS,CAAC,QAAQ,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;YAC7C,SAAS,CAAC,MAAM,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;YAC3C,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,SAAS,CAAC,MAAM,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;IAE3C,OAAO,IAAI,CAAC;AACd,CAAC;AAED,iGAAiG;AACjG,MAAM,UAAU,6BAA6B,CAC3C,KAA0C,EAC1C,eAA+B,EAC/B,QAAiB,EACjB,eAAuC;;IAEvC,IAAI,KAAK,CAAC,GAAG,KAAK,GAAG,IAAI,QAAQ,EAAE,CAAC;QAClC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,SAAS,GAAG,iBAAiB,CAAC,eAAe,CAAC,CAAC;IACrD,IAAI,CAAC,CAAA,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,UAAU,CAAA,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,KAAK,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IACtC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;QACrB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,cAAc,GAAuB,IAAI,CAAC;IAC9C,IAAI,UAAU,GAAG,KAAK,CAAC;IAEvB,IAAI,UAAU,CAAC,KAAK,CAAC,cAAc,CAAC,EAAE,CAAC;QACrC,MAAM,MAAM,GAAG,KAAK,CAAC,cAAc,CAAC,aAAa,CAAC;QAClD,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAExD,IAAI,UAAU,KAAK,WAAW,CAAC,OAAO,IAAI,MAAM,EAAE,CAAC;YACjD,cAAc,GAAG,MAAM,CAAC;YACxB,MAAM,UAAU,GAAG,CAAA,MAAA,KAAK,CAAC,cAAc,CAAC,WAAW,0CAAE,MAAM,KAAI,CAAC,CAAC;YACjE,UAAU,GAAG,KAAK,CAAC,WAAW,KAAK,UAAU,CAAC;QAChD,CAAC;IACH,CAAC;SAAM,IAAI,aAAa,CAAC,KAAK,CAAC,cAAc,CAAC,EAAE,CAAC;QAC/C,MAAM,SAAS,GAAG,KAAK,CAAC,cAAc,CAAC;QACvC,IAAI,KAAK,CAAC,WAAW,GAAG,CAAC,EAAE,CAAC;YAC1B,MAAM,QAAQ,GAAG,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC;YAC7D,IAAI,aAAa,CAAC,QAAQ,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,KAAK,WAAW,CAAC,OAAO,EAAE,CAAC;gBAC9E,cAAc,GAAG,QAAQ,CAAC;gBAC1B,UAAU,GAAG,IAAI,CAAC;YACpB,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,CAAC,cAAc,IAAI,CAAC,UAAU,EAAE,CAAC;QACnC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,SAAS,GAAG,cAAc,CAAC,aAAa,CAAC;IAC/C,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,CAAC,cAAc,EAAE,CAAC;IAEvB,IAAI,eAAe,EAAE,CAAC;QACpB,eAAe,CAAC,OAAO,EAAE,CAAC;IAC5B,CAAC;IAED,MAAM,SAAS,GAAG,CAAC,MAAA,cAAc,CAAC,aAAa,mCAAI,QAAQ,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;IACjF,WAAW,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IAEvC,eAAe,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAErE,IAAI,eAAe,EAAE,CAAC;QACpB,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC7B,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAcD,+EAA+E;AAC/E,MAAM,UAAU,eAAe,CAAC,MAA6B;IAC3D,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,EAAE,qBAAqB,EAAE,YAAY,EAAE,QAAQ,EAAE,eAAe,EAAE,GAAG,MAAM,CAAC;IAEtH,MAAM,UAAU,GAAG,iBAAiB,CAAC,eAAe,CAAC,CAAC;IAEtD,IAAI,SAAS,KAAK,UAAU,EAAE,CAAC;QAC7B,IAAI,qBAAqB,IAAI,CAAC,EAAE,CAAC;YAC/B,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;SAAM,CAAC;QACN,IAAI,qBAAqB,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACnD,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,MAAM,kBAAkB,GAAG,SAAS,KAAK,UAAU,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,qBAAqB,GAAG,CAAC,CAAC;IAExG,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,YAAY,GAAG,KAAK,CAAC;IAEzB,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;QACtC,IAAI,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC;YAC5B,UAAU,EAAE,CAAC;YACb,IAAI,UAAU,KAAK,kBAAkB,EAAE,CAAC;gBACtC,YAAY,GAAG,IAAI,CAAC;gBACpB,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,KAAK,GAAG,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;IAChF,QAAQ,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;IAEvC,IAAI,eAAe,EAAE,CAAC;QACpB,MAAM,UAAU,GAAG,eAAe,CAAC,WAAW,EAAE,CAAC;QACjD,gGAAgG;QAChG,+EAA+E;QAC/E,MAAM,WAAW,GAAG,SAAS,KAAK,UAAU,CAAC,CAAC,CAAC,UAAU,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC;QAClG,eAAe,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;IAC3C,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,sFAAsF;AACtF,MAAM,UAAU,+BAA+B,CAC7C,KAA0C,EAC1C,eAA+B,EAC/B,MAA8C,EAC9C,YAAsF,EACtF,QAAoF,EACpF,eAAuC;IAEvC,MAAM,SAAS,GAAG,iBAAiB,CAAC,eAAe,CAAC,CAAC;IACrD,IAAI,CAAC,CAAA,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,UAAU,CAAA,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,KAAK,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAEtC,IACE,CAAC,KAAK,CAAC,SAAS;QAChB,KAAK,CAAC,WAAW,KAAK,CAAC;QACvB,CAAC,aAAa,CAAC,KAAK,CAAC,cAAc,CAAC;QACpC,KAAK,CAAC,cAAc,CAAC,QAAQ,KAAK,GAAG,EACrC,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,UAAU,GAAG,iBAAiB,CAAC,eAAe,CAAC,CAAC;IACtD,MAAM,QAAQ,GAAG,KAAK,CAAC,cAAc,CAAC;IACtC,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,QAAgC,CAAC,CAAC;IAEhF,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;QACf,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,MAAM,GAAG,eAAe,CAAC;QAC7B,SAAS,EAAE,UAAU;QACrB,eAAe;QACf,MAAM;QACN,qBAAqB,EAAE,MAAM;QAC7B,YAAY;QACZ,QAAQ;QACR,eAAe,EAAE,eAAe;KACjC,CAAC,CAAC;IAEH,IAAI,MAAM,EAAE,CAAC;QACX,KAAK,CAAC,cAAc,EAAE,CAAC;IACzB,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,0BAA0B,CACxC,KAA0C,EAC1C,eAA+B,EAC/B,MAA8C,EAC9C,YAAsF,EACtF,QAAoF,EACpF,eAAuC;;IAEvC,MAAM,SAAS,GAAG,iBAAiB,CAAC,eAAe,CAAC,CAAC;IACrD,IAAI,CAAC,CAAA,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,UAAU,CAAA,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,KAAK,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IACtC,MAAM,SAAS,GAAG,KAAK,CAAC,cAAc,CAAC;IAEvC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;QACrB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,kBAAkB,GAAG,KAAK,CAAC;IAC/B,IAAI,QAAQ,GAAgC,IAAI,CAAC;IAEjD,IAAI,aAAa,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC,QAAQ,KAAK,GAAG,EAAE,CAAC;QAC3D,QAAQ,GAAG,SAAiC,CAAC;QAC7C,MAAM,iBAAiB,GAAG,QAAQ,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QAC/F,kBAAkB,GAAG,iBAAiB,IAAI,KAAK,CAAC,WAAW,KAAK,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC;IAC7F,CAAC;SAAM,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QACjC,kBAAkB,GAAG,KAAK,CAAC,WAAW,KAAK,CAAC,CAAA,MAAA,SAAS,CAAC,WAAW,0CAAE,MAAM,KAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC;QAC1G,IAAI,IAAI,GAAgB,SAAS,CAAC;QAClC,OAAO,IAAI,IAAI,IAAI,CAAC,QAAQ,KAAK,GAAG,EAAE,CAAC;YACrC,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC;QACzB,CAAC;QACD,QAAQ,GAAG,IAA4B,CAAC;IAC1C,CAAC;IAED,IAAI,CAAC,kBAAkB,IAAI,CAAC,QAAQ,EAAE,CAAC;QACrC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,UAAU,GAAG,iBAAiB,CAAC,eAAe,CAAC,CAAC;IACtD,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAExD,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;QACf,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,MAAM,GAAG,eAAe,CAAC;QAC7B,SAAS,EAAE,SAAS;QACpB,eAAe;QACf,MAAM;QACN,qBAAqB,EAAE,MAAM;QAC7B,YAAY;QACZ,QAAQ;QACR,eAAe,EAAE,eAAe;KACjC,CAAC,CAAC;IAEH,IAAI,MAAM,EAAE,CAAC;QACX,KAAK,CAAC,cAAc,EAAE,CAAC;IACzB,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,8DAA8D;AAC9D,MAAM,UAAU,oBAAoB,CAAC,KAA2B,EAAE,eAA4B,EAAE,KAAc;IAC5G,MAAM,SAAS,GAAG,iBAAiB,CAAC,eAAe,CAAC,CAAC;IACrD,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,UAAU,KAAK,CAAC,EAAE,CAAC;QAC7C,OAAO;IACT,CAAC;IAED,MAAM,KAAK,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IACtC,MAAM,QAAQ,GAAG,KAAK,CAAC,aAAa,EAAE,CAAC;IAEvC,MAAM,UAAU,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAC/C,MAAM,IAAI,GACR,UAAU,CAAC,MAAM,GAAG,CAAC;QACnB,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,wBAAwB,CAAC,CAAC,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QAC/E,CAAC,CAAC,wBAAwB,CAAC,QAAQ,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;IAE3D,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;IAChD,KAAK,CAAC,cAAc,EAAE,CAAC;IAEvB,IAAI,KAAK,EAAE,CAAC;QACV,SAAS,CAAC,kBAAkB,EAAE,CAAC;IACjC,CAAC;AACH,CAAC","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 /** Returns true if an IME composition session is active or just ended (spurious-Enter window). */\n isComposing?: () => boolean;\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 || props.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 || props.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"]}
@@ -1 +1 @@
1
- {"version":3,"file":"use-token-mode.d.ts","sourceRoot":"","sources":["../../../../src/prompt-input/tokens/use-token-mode.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"use-token-mode.d.ts","sourceRoot":"","sources":["../../../../src/prompt-input/tokens/use-token-mode.tsx"],"names":[],"mappings":"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"}
@@ -6,6 +6,7 @@ import clsx from 'clsx';
6
6
  import { useStableCallback, useUniqueId } from '@cloudscape-design/component-toolkit/internal';
7
7
  import { useDropdownStatus } from '../../internal/components/dropdown-status';
8
8
  import { fireKeyboardEvent, fireNonCancelableEvent } from '../../internal/events';
9
+ import { useIMEComposition } from '../../internal/hooks/use-ime-composition';
9
10
  import { getFirstScrollableParent } from '../../internal/utils/scrollable-containers';
10
11
  import Token from '../../token/internal';
11
12
  import { calculateTokenPosition, CaretController, getOwnerSelection } from '../core/caret-controller';
@@ -296,6 +297,25 @@ export function useTokenMode(config) {
296
297
  // Refs to avoid recreating handleInput when these change (new array reference each render).
297
298
  const menusRef = useRef(menus);
298
299
  menusRef.current = menus;
300
+ // Stable ref so the compositionend callback always calls the latest handleInput.
301
+ const handleInputRef = useRef(() => { });
302
+ // `composing` React state drives placeholder visibility — hidden while the user
303
+ // is actively composing CJK characters so intermediate characters don't flash
304
+ // the placeholder on and off.
305
+ const [composing, setComposing] = useState(false);
306
+ // Track IME composition state so the onInput handler skips intermediate characters
307
+ // during CJK (and other) composition sequences. The onCompositionEnd callback
308
+ // fires synchronously when the user commits a composed character — handleInput
309
+ // runs unconditionally there. `isComposing()` stays true briefly after compositionend
310
+ // (until the next animation frame) to block the spurious Enter keydown that some
311
+ // browsers fire immediately after compositionend.
312
+ const { isComposing } = useIMEComposition(editableElementRef, {
313
+ onCompositionStart: () => setComposing(true),
314
+ onCompositionEnd: () => {
315
+ setComposing(false);
316
+ handleInputRef.current();
317
+ },
318
+ });
299
319
  const handleInput = useCallback(() => {
300
320
  var _a, _b, _c, _d;
301
321
  if (!editableElementRef.current) {
@@ -387,6 +407,8 @@ export function useTokenMode(config) {
387
407
  shortcutsState.triggerElementsRef,
388
408
  shortcutsState.cancelledTriggerIds,
389
409
  ]);
410
+ // Keep the ref in sync so the compositionend handler always calls the latest version.
411
+ handleInputRef.current = handleInput;
390
412
  // Token render effect
391
413
  useLayoutEffect(() => {
392
414
  if (!editableElementRef.current) {
@@ -632,6 +654,7 @@ export function useTokenMode(config) {
632
654
  onChange,
633
655
  markTokensAsSent,
634
656
  onKeyDown,
657
+ isComposing,
635
658
  });
636
659
  });
637
660
  const handleEditableElementFocus = useStableCallback(() => {
@@ -737,7 +760,7 @@ export function useTokenMode(config) {
737
760
  const shouldRenderMenuDropdown = useMemo(() => {
738
761
  return !!(menuIsOpen && activeMenu && menuItemsState && triggerVisible);
739
762
  }, [menuIsOpen, activeMenu, menuItemsState, triggerVisible]);
740
- const showPlaceholder = !!(placeholder && (!tokens || tokens.length === 0));
763
+ const showPlaceholder = !!(placeholder && (!tokens || tokens.length === 0) && !composing);
741
764
  const editableElementAttributes = {
742
765
  'aria-label': ariaLabel,
743
766
  'aria-labelledby': ariaLabelledby,
@@ -811,7 +834,19 @@ export function useTokenMode(config) {
811
834
  menuItemsHandlers,
812
835
  menuDropdownStatus,
813
836
  shouldRenderMenuDropdown,
814
- handleInput,
837
+ handleInput: () => {
838
+ // Skip processing during IME composition — intermediate input events fire
839
+ // for each keystroke during CJK composition and must not trigger token
840
+ // detection. The onCompositionEnd callback calls handleInput directly
841
+ // (bypassing this guard) once the final text is committed.
842
+ // Note: we use `composing` (React state) rather than `isComposing()` (ref)
843
+ // so that input events after compositionend — such as the user immediately
844
+ // deleting the committed text — are processed normally. The spurious-Enter
845
+ // guard in the keyboard handler uses `isComposing()` separately.
846
+ if (!composing) {
847
+ handleInput();
848
+ }
849
+ },
815
850
  handleLoadMore,
816
851
  tokenOperationAnnouncement,
817
852
  markTokensAsSent,
@@ -1 +1 @@
1
- {"version":3,"file":"use-token-mode.js","sourceRoot":"","sources":["../../../../src/prompt-input/tokens/use-token-mode.tsx"],"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 React, { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport ReactDOM from 'react-dom';\nimport clsx from 'clsx';\n\nimport { useStableCallback, useUniqueId } from '@cloudscape-design/component-toolkit/internal';\n\nimport { useDropdownStatus } from '../../internal/components/dropdown-status';\nimport { fireKeyboardEvent, fireNonCancelableEvent } from '../../internal/events';\nimport { getFirstScrollableParent } from '../../internal/utils/scrollable-containers';\nimport Token from '../../token/internal';\nimport { calculateTokenPosition, CaretController, getOwnerSelection } from '../core/caret-controller';\nimport { extractTextFromCaretSpots } from '../core/caret-spot-utils';\nimport {\n findContainingReference,\n getMouseDown,\n isNonTypeablePosition,\n normalizeCollapsedCaret,\n normalizeSelection,\n setMouseDown,\n} from '../core/caret-utils';\nimport { NEXT_TICK_TIMEOUT } from '../core/constants';\nimport { createParagraph, findAllParagraphs } from '../core/dom-utils';\nimport { handleClipboardEvent, handleEditableKeyDown } from '../core/event-handlers';\nimport {\n handleMenuSelection,\n MenuItem,\n MenuItemsHandlers,\n MenuItemsState,\n useMenuItems,\n useMenuLoadMore,\n} from '../core/menu-state';\nimport { extractTokensFromDOM, getPromptText, processTokens } from '../core/token-operations';\nimport { PortalContainer, renderTokensToDOM } from '../core/token-renderer';\nimport {\n enforcePinnedTokenOrdering,\n getCaretPositionAfterPinnedReorder,\n getCaretPositionAfterTokenRemoval,\n mergeConsecutiveTextTokens,\n} from '../core/token-utils';\nimport { detectTriggerTransition } from '../core/trigger-utils';\nimport { isReferenceToken, isTextNode, isTextToken, isTriggerToken } from '../core/type-guards';\nimport { PromptInputProps } from '../interfaces';\nimport { insertTextIntoContentEditable } from '../utils/insert-text-content-editable';\nimport { ShortcutsState, useShortcutsEffects, useShortcutsState } from './use-shortcuts';\n\nimport styles from '../styles.css.js';\nimport testutilStyles from '../test-classes/styles.css.js';\n\n/** Mutable state shared between the editable tokens hook and event handlers. */\nexport interface EditableState {\n skipNextZeroWidthUpdate: boolean;\n menuSelectionTokenId: string | null;\n}\n\nexport function createEditableState(): EditableState {\n return {\n skipNextZeroWidthUpdate: false,\n menuSelectionTokenId: null,\n };\n}\n\n/**\n * Determines if the token array changed structurally and needs a full DOM re-render.\n *\n * Compares token types, IDs, and text values. During normal typing the extracted\n * tokens already match the DOM, so text comparisons won't trigger unnecessary\n * re-renders. External updates (parent replacing tokens) will be detected by\n * the value difference and trigger a re-render.\n *\n * Returns 'none' if no changes, 'text-only' if only token values differ\n * (same count, types, and IDs — covers both text and trigger filter changes),\n * or 'structural' for any other change.\n */\nfunction classifyChange(\n oldTokens: readonly PromptInputProps.InputToken[] | undefined,\n newTokens: readonly PromptInputProps.InputToken[] | undefined\n): 'none' | 'text-only' | 'structural' {\n if (!oldTokens || !newTokens) {\n return 'structural';\n }\n\n if (oldTokens.length !== newTokens.length) {\n return 'structural';\n }\n\n let hasTextDiff = false;\n\n for (let i = 0; i < oldTokens.length; i++) {\n const oldToken = oldTokens[i];\n const newToken = newTokens[i];\n\n if (oldToken.type !== newToken.type) {\n return 'structural';\n }\n\n if (isReferenceToken(oldToken) && isReferenceToken(newToken)) {\n if (oldToken.id !== newToken.id) {\n return 'structural';\n }\n }\n\n if (isTriggerToken(oldToken) && isTriggerToken(newToken)) {\n if (oldToken.id !== newToken.id) {\n return 'structural';\n }\n // Transition between empty and non-empty filter text changes the underline styling.\n const wasEmpty = oldToken.value.length === 0;\n const isEmpty = newToken.value.length === 0;\n if (wasEmpty !== isEmpty) {\n return 'structural';\n }\n if (oldToken.value !== newToken.value) {\n hasTextDiff = true;\n }\n }\n\n if (isTextToken(oldToken) && isTextToken(newToken)) {\n if (oldToken.value !== newToken.value) {\n hasTextDiff = true;\n }\n }\n }\n\n return hasTextDiff ? 'text-only' : 'none';\n}\n\n/**\n * Positions the caret after a menu-selected reference token.\n * Returns true if the caret was positioned (token found), false otherwise.\n */\nfunction positionCaretAfterMenuSelection(\n tokens: readonly PromptInputProps.InputToken[],\n editableState: EditableState,\n caretController: CaretController | null\n): boolean {\n if (!editableState.menuSelectionTokenId || !caretController) {\n return false;\n }\n\n const insertedTokenIndex = tokens.findIndex(t => isReferenceToken(t) && t.id === editableState.menuSelectionTokenId);\n\n if (insertedTokenIndex === -1) {\n return false;\n }\n\n const caretPos = calculateTokenPosition(tokens, insertedTokenIndex);\n caretController.setPosition(caretPos);\n editableState.menuSelectionTokenId = null;\n return true;\n}\n\n/** Finds a trigger token by its ID in the token array. */\nfunction findTriggerTokenById(\n tokens: readonly PromptInputProps.InputToken[],\n triggerId: string\n): PromptInputProps.TriggerToken | null {\n const trigger = tokens.find(token => isTriggerToken(token) && token.id === triggerId);\n if (trigger && isTriggerToken(trigger)) {\n return trigger;\n }\n return null;\n}\n\n/** Configuration for the useTokenMode hook — all props needed to drive token-mode behavior. */\nexport interface UseTokenModeConfig {\n editableElementRef: React.RefObject<HTMLDivElement>;\n caretControllerRef: React.MutableRefObject<CaretController | null>;\n\n tokens?: readonly PromptInputProps.InputToken[];\n tokensToText?: (tokens: readonly PromptInputProps.InputToken[]) => string;\n menus?: readonly PromptInputProps.MenuDefinition[];\n disabled?: boolean;\n readOnly?: boolean;\n autoFocus?: boolean;\n placeholder?: string;\n invalid?: boolean;\n warning?: boolean;\n ariaLabel?: string;\n ariaLabelledby?: string;\n ariaDescribedby?: string;\n ariaRequired?: boolean;\n disableBrowserAutocorrect?: boolean;\n spellcheck?: boolean;\n\n onChange: (detail: { value: string; tokens: PromptInputProps.InputToken[] }) => void;\n onTriggerDetected?: (detail: PromptInputProps.TriggerDetectedDetail) => boolean;\n onAction?: PromptInputProps['onAction'];\n onBlur?: PromptInputProps['onBlur'];\n onFocus?: PromptInputProps['onFocus'];\n onKeyDown?: PromptInputProps['onKeyDown'];\n onKeyUp?: PromptInputProps['onKeyUp'];\n onMenuItemSelect?: PromptInputProps['onMenuItemSelect'];\n onMenuFilter?: PromptInputProps['onMenuFilter'];\n onMenuLoadItems?: PromptInputProps['onMenuLoadItems'];\n\n i18nStrings?: PromptInputProps['i18nStrings'];\n\n adjustInputHeight: () => void;\n}\n\n/** Return value of useTokenMode — state, handlers, and attributes consumed by TokenMode component. */\nexport interface UseTokenModeResult {\n portalContainersRef: React.MutableRefObject<Map<string, PortalContainer>>;\n /** Snapshot of portal containers for rendering portals. Updated after each renderTokensToDOM call. */\n portalContainers: PortalContainer[];\n /** Portal elements to render — renders Token components into DOM containers via createPortal. */\n portals: React.ReactPortal[];\n\n editableState: EditableState;\n\n editableElementAttributes: React.HTMLAttributes<HTMLDivElement> & { 'data-placeholder'?: string };\n\n activeTriggerToken: PromptInputProps.TriggerToken | null;\n activeMenu: PromptInputProps.MenuDefinition | null;\n menuIsOpen: boolean;\n menuFilterText: string;\n triggerWrapperRef: React.MutableRefObject<HTMLElement | null>;\n triggerWrapperReady: boolean;\n\n menuListId: string;\n menuFooterControlId: string;\n highlightedMenuOptionId: string | undefined;\n menuItemsState: MenuItemsState;\n menuItemsHandlers: MenuItemsHandlers;\n menuDropdownStatus: ReturnType<typeof useDropdownStatus> | null;\n shouldRenderMenuDropdown: boolean;\n\n handleInput: () => void;\n\n handleLoadMore: () => void;\n\n tokenOperationAnnouncement: string;\n\n markTokensAsSent: (tokens: readonly PromptInputProps.InputToken[]) => void;\n}\n\ninterface ProcessorConfig {\n tokens?: readonly PromptInputProps.InputToken[];\n menus?: readonly PromptInputProps.MenuDefinition[];\n tokensToText?: (tokens: readonly PromptInputProps.InputToken[]) => string;\n onChange: (detail: { value: string; tokens: PromptInputProps.InputToken[] }) => void;\n onTriggerDetected?: (detail: PromptInputProps.TriggerDetectedDetail) => boolean;\n state: ShortcutsState;\n}\n\n/**\n * Processes token changes from both user input and external (parent) updates.\n *\n * For user input: runs trigger detection on extracted DOM tokens and emits\n * the processed result via onChange.\n *\n * For external updates: detects if the parent provided new tokens that need\n * trigger detection or ID assignment, and emits corrected tokens if so.\n * Skips processing when the tokens reference matches what we last emitted\n * (for example, the parent is echoing back our own onChange).\n */\nfunction useTokenProcessor(config: ProcessorConfig) {\n const { tokens, menus, tokensToText, onChange, onTriggerDetected, state } = config;\n\n const emitTokenChange = useStableCallback((newTokens: PromptInputProps.InputToken[]) => {\n const value = tokensToText ? tokensToText(newTokens) : getPromptText(newTokens);\n state.markTokensAsSent(newTokens);\n onChange({ value, tokens: newTokens });\n });\n\n const markCancelledTriggers = useStableCallback((cancelledIds: Set<string>) => {\n for (const id of cancelledIds) {\n state.cancelledTriggerIds.current.add(id);\n // Prevent opening the menu if the active trigger was cancelled\n if (state.caretInTrigger === id) {\n state.setCaretInTrigger(null);\n }\n }\n });\n\n /** Processes tokens extracted from the DOM after user input. */\n const processUserInput = useStableCallback((inputTokens: PromptInputProps.InputToken[]) => {\n const { tokens: processed, cancelledIds } = processTokens(\n inputTokens,\n { menus, tokensToText },\n {\n source: 'user-input',\n detectTriggers: true,\n },\n onTriggerDetected,\n state.cancelledTriggerIds.current\n );\n\n markCancelledTriggers(cancelledIds);\n emitTokenChange(processed);\n });\n\n /** Processes external token updates from the parent component. */\n useEffect(() => {\n // Skip if these are the tokens we just emitted — the parent is echoing back our onChange\n if (state.lastEmittedTokensRef.current === tokens) {\n return;\n }\n\n if (!tokens) {\n return;\n }\n\n const { tokens: processed, cancelledIds } = processTokens(\n tokens,\n { menus, tokensToText },\n {\n source: 'external',\n detectTriggers: true,\n },\n undefined,\n state.cancelledTriggerIds.current\n );\n\n markCancelledTriggers(cancelledIds);\n\n // Only emit if processing actually changed the tokens (e.g., new triggers detected,\n // IDs assigned). Compare by type, value, and ID to avoid false positives from\n // reference inequality after processTokens creates new token objects.\n const hasChanges =\n processed.length !== tokens.length ||\n processed.some((t, i) => {\n const orig = tokens[i];\n if (t.type !== orig.type || t.value !== orig.value) {\n return true;\n }\n if (isReferenceToken(t) && isReferenceToken(orig) && t.id !== orig.id) {\n return true;\n }\n if (isTriggerToken(t) && isTriggerToken(orig) && t.id !== orig.id) {\n return true;\n }\n return false;\n });\n\n if (hasChanges) {\n emitTokenChange(processed);\n } else {\n // Mark as seen even when no changes — prevents re-processing on next render\n state.lastEmittedTokensRef.current = tokens;\n }\n }, [tokens, menus, tokensToText, state, emitTokenChange, markCancelledTriggers]);\n\n return {\n processUserInput,\n };\n}\n\n/** Encapsulates all token-mode logic: trigger detection, menu state, keyboard handling, and rendering. */\nexport function useTokenMode(config: UseTokenModeConfig): UseTokenModeResult {\n const {\n editableElementRef,\n caretControllerRef,\n tokens,\n tokensToText,\n menus,\n disabled,\n readOnly,\n autoFocus,\n placeholder,\n invalid,\n warning,\n ariaLabel,\n ariaLabelledby,\n ariaDescribedby,\n ariaRequired,\n disableBrowserAutocorrect,\n spellcheck,\n onChange,\n onTriggerDetected,\n onAction,\n onBlur,\n onFocus,\n onKeyDown,\n onKeyUp,\n onMenuItemSelect,\n onMenuFilter,\n onMenuLoadItems,\n i18nStrings,\n adjustInputHeight,\n } = config;\n\n const shortcutsState = useShortcutsState();\n\n const { markTokensAsSent } = shortcutsState;\n\n const activeTriggerToken = useMemo((): PromptInputProps.TriggerToken | null => {\n if (!tokens || !caretControllerRef.current) {\n return null;\n }\n\n const activeTriggerID = caretControllerRef.current.findActiveTrigger()?.id || null;\n\n if (!activeTriggerID) {\n return null;\n }\n\n if (shortcutsState.cancelledTriggerIds.current.has(activeTriggerID)) {\n return null;\n }\n\n return findTriggerTokenById(tokens, activeTriggerID);\n // eslint-disable-next-line react-hooks/exhaustive-deps -- caretInTrigger is the invalidation signal from useShortcutsEffects\n }, [tokens, caretControllerRef, shortcutsState.caretInTrigger]);\n\n const activeMenu = useMemo(\n () =>\n activeTriggerToken && shortcutsState.caretInTrigger && !disabled && !readOnly\n ? (menus?.find(m => m.trigger === activeTriggerToken.triggerChar) ?? null)\n : null,\n [activeTriggerToken, shortcutsState.caretInTrigger, menus, disabled, readOnly]\n );\n\n const menuIsOpen = !!activeMenu;\n const menuFilterText = activeTriggerToken?.value ?? '';\n\n const processor = useTokenProcessor({\n tokens,\n menus,\n tokensToText,\n onChange,\n onTriggerDetected,\n state: shortcutsState,\n });\n\n const { processUserInput } = processor;\n\n useShortcutsEffects({\n tokens,\n editableElementRef,\n state: shortcutsState,\n activeTriggerToken,\n caretController: caretControllerRef,\n });\n\n const triggerWrapperRef = useRef<HTMLElement | null>(null);\n const [triggerVisible, setTriggerVisible] = useState(true);\n\n // Resolve the trigger DOM element synchronously during render from the tracked map.\n // The Dropdown's contentKey (which includes activeTriggerToken.id) handles\n // repositioning when the active trigger changes — no open/close toggle needed.\n if (activeTriggerToken?.id && menuIsOpen) {\n triggerWrapperRef.current = shortcutsState.triggerElementsRef.current.get(activeTriggerToken.id) ?? null;\n } else {\n triggerWrapperRef.current = null;\n }\n\n const triggerWrapperReady = !!triggerWrapperRef.current && menuIsOpen;\n\n // Hide menu dropdown when trigger scrolls out of the editable container\n useEffect(() => {\n if (!menuIsOpen || !triggerWrapperRef.current || !editableElementRef.current) {\n setTriggerVisible(true);\n return;\n }\n\n const trigger = triggerWrapperRef.current;\n const container = editableElementRef.current;\n\n const checkTriggerVisibility = () => {\n const triggerRect = trigger.getBoundingClientRect();\n const containerRect = container.getBoundingClientRect();\n\n const isOutOfView = triggerRect.bottom < containerRect.top || triggerRect.top > containerRect.bottom;\n setTriggerVisible(!isOutOfView);\n };\n\n checkTriggerVisibility();\n\n container.addEventListener('scroll', checkTriggerVisibility);\n\n const scrollableParent = getFirstScrollableParent(container);\n if (scrollableParent) {\n scrollableParent.addEventListener('scroll', checkTriggerVisibility);\n }\n\n return () => {\n container.removeEventListener('scroll', checkTriggerVisibility);\n if (scrollableParent) {\n scrollableParent.removeEventListener('scroll', checkTriggerVisibility);\n }\n };\n }, [menuIsOpen, editableElementRef, activeTriggerToken]);\n\n const portalContainersRef = useRef<Map<string, PortalContainer>>(new Map());\n const [portalContainers, setPortalContainers] = useState<PortalContainer[]>([]);\n\n const renderTokens = useCallback(\n (tokens: readonly PromptInputProps.InputToken[], target: HTMLElement) => {\n const result = renderTokensToDOM(\n tokens,\n target,\n portalContainersRef.current,\n shortcutsState.triggerElementsRef.current,\n shortcutsState.cancelledTriggerIds.current\n );\n\n // Update trigger element map from render result\n shortcutsState.triggerElementsRef.current = new Map(result.triggerElements);\n\n setPortalContainers(Array.from(portalContainersRef.current.values()));\n return result;\n },\n [shortcutsState.triggerElementsRef, shortcutsState.cancelledTriggerIds, portalContainersRef]\n );\n\n useLayoutEffect(() => {\n if (editableElementRef.current && !caretControllerRef.current) {\n caretControllerRef.current = new CaretController(editableElementRef.current);\n }\n }, [editableElementRef, caretControllerRef]);\n\n const editableState = useRef(createEditableState()).current;\n\n const [tokenOperationAnnouncement, setTokenOperationAnnouncement] = useState<string>('');\n\n const announceTokenOperation = useStableCallback((message: string) => {\n setTokenOperationAnnouncement(message);\n });\n\n const lastRenderedTokensRef = useRef<readonly PromptInputProps.InputToken[] | undefined>(undefined);\n const lastDisabledRef = useRef(disabled);\n const lastReadOnlyRef = useRef(readOnly);\n\n // Refs to avoid recreating handleInput when these change (new array reference each render).\n const menusRef = useRef(menus);\n menusRef.current = menus;\n\n const handleInput = useCallback(() => {\n if (!editableElementRef.current) {\n return;\n }\n\n const ownerDoc = editableElementRef.current.ownerDocument ?? document;\n const cc = caretControllerRef.current;\n\n if (cc) {\n cc.capture();\n }\n\n if (editableState.skipNextZeroWidthUpdate) {\n editableState.skipNextZeroWidthUpdate = false;\n }\n\n const { movedTextNode } = extractTextFromCaretSpots(portalContainersRef.current, true);\n\n // Extract filter text from cancelled triggers, moving it to the paragraph level\n for (const id of shortcutsState.cancelledTriggerIds.current) {\n const trigger =\n shortcutsState.triggerElementsRef.current.get(id) ??\n (editableElementRef.current.querySelector(`#${CSS.escape(id)}`) as HTMLElement | null);\n if (!trigger) {\n continue;\n }\n const filterText = (trigger.textContent || '').substring(1);\n if (!filterText) {\n continue;\n }\n\n let caretInTrigger = false;\n const selection = editableElementRef.current ? getOwnerSelection(editableElementRef.current) : null;\n if (selection?.rangeCount && trigger.contains(selection.getRangeAt(0).startContainer)) {\n caretInTrigger = true;\n }\n\n const textNode = ownerDoc.createTextNode(filterText);\n trigger.parentNode?.insertBefore(textNode, trigger.nextSibling);\n trigger.textContent = (trigger.textContent || '').charAt(0);\n\n if (caretInTrigger && !movedTextNode) {\n if (cc) {\n cc.positionAfterText(textNode);\n }\n }\n }\n\n if (movedTextNode && cc) {\n cc.positionAfterText(movedTextNode);\n }\n\n const directTextNodes = Array.from(editableElementRef.current.childNodes).filter(\n node => isTextNode(node) && node.textContent?.trim()\n );\n\n if (directTextNodes.length > 0) {\n if (cc) {\n cc.capture();\n }\n\n let targetP = findAllParagraphs(editableElementRef.current)[0];\n if (!targetP) {\n targetP = createParagraph();\n editableElementRef.current.appendChild(targetP);\n }\n\n directTextNodes.forEach(textNode => {\n targetP!.appendChild(textNode);\n });\n\n if (cc) {\n cc.restore();\n }\n }\n\n let extractedTokens = extractTokensFromDOM(\n editableElementRef.current,\n menusRef.current,\n portalContainersRef.current\n );\n\n // When a new trigger appears in the DOM, render immediately to ensure the\n // trigger element exists before subsequent caret operations.\n const newTriggers = extractedTokens.filter(isTriggerToken);\n const existingTriggerIds = new Set(shortcutsState.triggerElementsRef.current.keys());\n if (newTriggers.some(t => !existingTriggerIds.has(t.id))) {\n renderTokens(extractedTokens, editableElementRef.current);\n }\n\n const movedTokens = enforcePinnedTokenOrdering(extractedTokens);\n const tokensWereMoved = movedTokens.some((t, i) => t !== extractedTokens[i]);\n\n const mergedTokens = mergeConsecutiveTextTokens(movedTokens);\n\n if (tokensWereMoved) {\n const caretPosBeforeMove = cc?.getPosition() ?? 0;\n const adjustedPosition = getCaretPositionAfterPinnedReorder(extractedTokens, mergedTokens, caretPosBeforeMove);\n\n extractedTokens = mergedTokens;\n\n renderTokens(mergedTokens, editableElementRef.current);\n\n if (editableElementRef.current && ownerDoc.activeElement === editableElementRef.current && cc) {\n cc.setPosition(adjustedPosition);\n }\n }\n\n processUserInput(extractedTokens);\n\n adjustInputHeight();\n }, [\n processUserInput,\n adjustInputHeight,\n editableElementRef,\n caretControllerRef,\n portalContainersRef,\n editableState,\n renderTokens,\n shortcutsState.triggerElementsRef,\n shortcutsState.cancelledTriggerIds,\n ]);\n\n // Token render effect\n useLayoutEffect(() => {\n if (!editableElementRef.current) {\n return;\n }\n\n const cc = caretControllerRef.current;\n const orderedTokens = tokens ? enforcePinnedTokenOrdering(tokens) : tokens;\n const prevOrderedTokens = lastRenderedTokensRef.current;\n\n const stateChanged = lastDisabledRef.current !== disabled || lastReadOnlyRef.current !== readOnly;\n lastDisabledRef.current = disabled;\n lastReadOnlyRef.current = readOnly;\n\n const triggerTransition = detectTriggerTransition(lastRenderedTokensRef.current, orderedTokens);\n\n const changeType = classifyChange(lastRenderedTokensRef.current, orderedTokens);\n const needsRerender = stateChanged || changeType !== 'none' || triggerTransition > 0;\n\n if (!needsRerender) {\n positionCaretAfterMenuSelection(orderedTokens ?? [], editableState, cc);\n\n lastRenderedTokensRef.current = orderedTokens;\n return;\n }\n\n // Text-only changes from user input are already reflected in the DOM by the\n // browser's native editing. Skip re-render to preserve cursor position —\n // Text-only changes from user input are already reflected in the DOM by the\n // browser's native editing. Skip re-render to preserve cursor position —\n // re-rendering would read a corrupted position from normalizeCaretIntoTrigger.\n // External updates still need a re-render.\n if (\n changeType === 'text-only' &&\n !stateChanged &&\n triggerTransition === 0 &&\n shortcutsState.lastEmittedTokensRef.current === tokens\n ) {\n lastRenderedTokensRef.current = orderedTokens;\n return;\n }\n\n if (triggerTransition > 0 && orderedTokens && cc) {\n renderTokens(orderedTokens, editableElementRef.current);\n lastRenderedTokensRef.current = orderedTokens;\n cc.setPosition(triggerTransition);\n adjustInputHeight();\n return;\n }\n\n // A new trigger appeared (e.g. user typed a trigger char, possibly replacing a selection).\n // Position the caret after the trigger character so the user can start typing a filter.\n const newTrigger =\n orderedTokens &&\n prevOrderedTokens &&\n orderedTokens.find(t => isTriggerToken(t) && !prevOrderedTokens.some(p => isTriggerToken(p) && p.id === t.id));\n if (newTrigger && isTriggerToken(newTrigger) && cc) {\n renderTokens(orderedTokens, editableElementRef.current);\n lastRenderedTokensRef.current = orderedTokens;\n // Use the saved position from insertText if available, otherwise position after the trigger char\n const savedPos = cc.getSavedPosition();\n if (savedPos !== null) {\n cc.setPosition(savedPos);\n } else {\n const triggerIndex = orderedTokens.indexOf(newTrigger);\n const posBeforeTrigger = triggerIndex > 0 ? calculateTokenPosition(orderedTokens, triggerIndex - 1) : 0;\n cc.setPosition(posBeforeTrigger + newTrigger.triggerChar.length);\n }\n adjustInputHeight();\n return;\n }\n\n if (\n lastRenderedTokensRef.current &&\n orderedTokens &&\n lastRenderedTokensRef.current.length === 0 &&\n orderedTokens.length === 0\n ) {\n lastRenderedTokensRef.current = orderedTokens;\n return;\n }\n\n if (editableState.menuSelectionTokenId && cc) {\n const insertedTokenIndex = (orderedTokens ?? []).findIndex(\n t => isReferenceToken(t) && t.id === editableState.menuSelectionTokenId\n );\n\n if (insertedTokenIndex !== -1) {\n renderTokens(orderedTokens ?? [], editableElementRef.current);\n positionCaretAfterMenuSelection(orderedTokens ?? [], editableState, cc);\n\n lastRenderedTokensRef.current = orderedTokens;\n adjustInputHeight();\n return;\n }\n }\n\n lastRenderedTokensRef.current = orderedTokens;\n\n if (cc) {\n cc.capture();\n }\n\n renderTokens(orderedTokens ?? [], editableElementRef.current);\n\n if (positionCaretAfterMenuSelection(orderedTokens ?? [], editableState, cc)) {\n adjustInputHeight();\n return;\n }\n\n if (cc) {\n const savedPosition = cc.getSavedPosition();\n const restoredPosition = getCaretPositionAfterTokenRemoval(\n savedPosition,\n prevOrderedTokens ?? [],\n orderedTokens ?? []\n );\n\n if (restoredPosition !== null) {\n cc.setPosition(restoredPosition);\n } else {\n cc.restore();\n }\n }\n\n adjustInputHeight();\n }, [\n disabled,\n readOnly,\n tokens,\n adjustInputHeight,\n caretControllerRef,\n editableElementRef,\n portalContainersRef,\n editableState,\n renderTokens,\n shortcutsState,\n ]);\n\n useEffect(() => {\n const handleSelectionChange = () => {\n const sel = editableElementRef.current ? getOwnerSelection(editableElementRef.current) : null;\n if (!sel?.rangeCount || !editableElementRef.current?.contains(sel.getRangeAt(0).startContainer)) {\n return;\n }\n // Skip caret normalization during mousedown — the user may be starting a\n // drag selection from a caret-spot position adjacent to a reference.\n if (!getMouseDown()) {\n normalizeCollapsedCaret(sel);\n }\n normalizeSelection(sel);\n };\n const handleMouseDown = () => {\n setMouseDown(true);\n };\n const handleMouseUp = () => {\n setMouseDown(false);\n const sel = editableElementRef.current ? getOwnerSelection(editableElementRef.current) : null;\n if (!sel?.rangeCount || !editableElementRef.current?.contains(sel.getRangeAt(0).startContainer)) {\n return;\n }\n normalizeCollapsedCaret(sel);\n normalizeSelection(sel);\n\n // Deferred re-check: browsers may finalize caret position after mouseup\n /* istanbul ignore next -- browser mouseup normalization covered by integ tests */\n requestAnimationFrame(() => {\n const sel = editableElementRef.current ? getOwnerSelection(editableElementRef.current) : null;\n if (!sel?.rangeCount) {\n return;\n }\n\n const range = sel.getRangeAt(0);\n if (!range.collapsed) {\n const startBad = isNonTypeablePosition(range.startContainer);\n const endBad = isNonTypeablePosition(range.endContainer);\n\n if (startBad) {\n const ref = findContainingReference(range.startContainer);\n if (ref?.parentNode) {\n const index = Array.from(ref.parentNode.childNodes).indexOf(ref as ChildNode);\n range.setStart(ref.parentNode, index);\n }\n }\n if (endBad) {\n const ref = findContainingReference(range.endContainer);\n if (ref?.parentNode) {\n const index = Array.from(ref.parentNode.childNodes).indexOf(ref as ChildNode);\n range.setEnd(ref.parentNode, index + 1);\n }\n }\n }\n\n normalizeCollapsedCaret(sel);\n normalizeSelection(sel);\n });\n };\n\n const ownerDoc = editableElementRef.current?.ownerDocument ?? document;\n const element = editableElementRef.current;\n // selectionchange only fires on document — containment is checked inside the handler.\n ownerDoc.addEventListener('selectionchange', handleSelectionChange);\n // mousedown/mouseup scoped to the element to avoid reacting to clicks elsewhere.\n element?.addEventListener('mousedown', handleMouseDown);\n element?.addEventListener('mouseup', handleMouseUp);\n\n return () => {\n ownerDoc.removeEventListener('selectionchange', handleSelectionChange);\n element?.removeEventListener('mousedown', handleMouseDown);\n element?.removeEventListener('mouseup', handleMouseUp);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps -- only needs to run on mount\n }, []);\n\n const handleMenuSelect = useStableCallback((option: MenuItem) => {\n if (!activeMenu || !activeTriggerToken || !tokens) {\n return;\n }\n\n shortcutsState.setCaretInTrigger(null);\n\n const result = handleMenuSelection(\n tokens,\n {\n value: option.option.value || '',\n label: option.option.label || option.option.value || '',\n },\n activeMenu.id,\n activeMenu.useAtStart ?? false,\n activeTriggerToken\n );\n\n const value = tokensToText ? tokensToText(result.tokens) : getPromptText(result.tokens);\n markTokensAsSent(result.tokens);\n\n editableState.menuSelectionTokenId = result.insertedToken.id || null;\n\n const isPinned = activeMenu.useAtStart ?? false;\n const announcement = isPinned\n ? i18nStrings?.tokenPinnedAriaLabel?.(result.insertedToken)\n : i18nStrings?.tokenInsertedAriaLabel?.(result.insertedToken);\n\n if (announcement) {\n announceTokenOperation(announcement);\n }\n\n onChange({ value, tokens: result.tokens });\n\n fireNonCancelableEvent(onMenuItemSelect, {\n menuId: activeMenu.id,\n option: option.option,\n });\n });\n\n const [menuItemsState, menuItemsHandlers] = useMenuItems({\n menu: activeMenu ?? { id: '', trigger: '', options: [] },\n filterText: menuFilterText,\n onSelectItem: handleMenuSelect,\n });\n\n const menuStateRef = useRef({\n itemsState: menuItemsState,\n itemsHandlers: menuItemsHandlers,\n isOpen: menuIsOpen,\n });\n menuStateRef.current = {\n itemsState: menuItemsState,\n itemsHandlers: menuItemsHandlers,\n isOpen: menuIsOpen,\n };\n\n const closeMenu = useStableCallback(() => {\n shortcutsState.menuJustClosed.current = shortcutsState.caretInTrigger;\n shortcutsState.setCaretInTrigger(null);\n });\n\n const handleEditableElementKeyDown = useStableCallback((event: React.KeyboardEvent<HTMLDivElement>) => {\n handleEditableKeyDown(event, {\n editableElement: editableElementRef.current,\n editableState,\n caretController: caretControllerRef.current,\n tokens,\n tokensToText,\n disabled,\n readOnly,\n i18nStrings,\n announceTokenOperation,\n getMenuOpen: () => menuStateRef.current.isOpen,\n getMenuItemsState: () => menuStateRef.current.itemsState,\n getMenuItemsHandlers: () => menuStateRef.current.itemsHandlers,\n getMenuStatusType: () => activeMenu?.statusType,\n closeMenu,\n onAction: onAction ? detail => fireNonCancelableEvent(onAction, detail) : undefined,\n onChange,\n markTokensAsSent,\n onKeyDown,\n });\n });\n\n const handleEditableElementFocus = useStableCallback(() => {\n if (onFocus) {\n fireNonCancelableEvent(onFocus);\n }\n });\n\n const handleEditableElementBlur = useStableCallback(() => {\n if (onBlur) {\n fireNonCancelableEvent(onBlur);\n }\n });\n\n useEffect(() => {\n if (autoFocus && editableElementRef.current) {\n editableElementRef.current.focus();\n }\n // Intentionally run only on mount — autoFocus should fire once\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useEffect(() => {\n const ownerWindow = (editableElementRef.current?.ownerDocument ?? document).defaultView ?? window;\n const handleResize = () => adjustInputHeight();\n ownerWindow.addEventListener('resize', handleResize);\n return () => {\n ownerWindow.removeEventListener('resize', handleResize);\n };\n }, [adjustInputHeight, editableElementRef]);\n\n const menuLoadMoreResult = useMenuLoadMore({\n menu: activeMenu ?? { id: '', trigger: '', options: [] },\n statusType: activeMenu?.statusType ?? 'finished',\n onLoadItems: detail => {\n fireNonCancelableEvent(onMenuLoadItems, detail);\n },\n onLoadMoreItems: () => {\n fireNonCancelableEvent(onMenuLoadItems, {\n menuId: activeMenu?.id ?? '',\n filteringText: undefined,\n firstPage: false,\n samePage: false,\n });\n },\n });\n\n const menuLoadMoreHandlers = activeMenu ? menuLoadMoreResult : null;\n\n useEffect(() => {\n if (menuIsOpen && activeMenu && menuLoadMoreHandlers) {\n menuLoadMoreHandlers.fireLoadMoreOnMenuOpen();\n }\n }, [menuIsOpen, activeMenu, menuLoadMoreHandlers]);\n\n const prevMenuOpenRef = useRef(false);\n const prevItemsLengthRef = useRef(0);\n\n useEffect(() => {\n const justOpened = menuIsOpen && !prevMenuOpenRef.current;\n const itemsLoaded =\n menuIsOpen && prevMenuOpenRef.current && prevItemsLengthRef.current === 0 && menuItemsState.items.length > 0;\n\n if ((justOpened || itemsLoaded) && menuItemsHandlers && menuItemsState && menuItemsState.items.length > 0) {\n // Reset highlight so goHomeWithKeyboard triggers a state change even at index 0\n menuItemsHandlers.resetHighlightWithKeyboard();\n setTimeout(() => {\n menuItemsHandlers?.goHomeWithKeyboard();\n }, NEXT_TICK_TIMEOUT);\n }\n\n prevMenuOpenRef.current = menuIsOpen;\n prevItemsLengthRef.current = menuItemsState?.items.length ?? 0;\n // eslint-disable-next-line react-hooks/exhaustive-deps -- only needs to react to menu open/close and item count changes\n }, [menuIsOpen, menuItemsState.items.length]);\n\n useEffect(() => {\n if (activeTriggerToken && activeMenu && onMenuFilter) {\n fireNonCancelableEvent(onMenuFilter, {\n menuId: activeMenu.id,\n filteringText: activeTriggerToken.value,\n });\n }\n }, [activeTriggerToken, activeMenu, onMenuFilter]);\n\n const handleLoadMore = useStableCallback(() => {\n if (menuLoadMoreHandlers) {\n menuLoadMoreHandlers.fireLoadMoreOnScroll();\n }\n });\n\n const menuListId = useUniqueId('menu-list');\n const menuFooterControlId = useUniqueId('menu-footer');\n const highlightedMenuOptionIdSource = useUniqueId();\n const highlightedMenuOptionId = menuItemsState?.highlightedOption ? highlightedMenuOptionIdSource : undefined;\n\n const menuDropdownStatusResult = useDropdownStatus({\n ...(activeMenu ?? {}),\n isEmpty: !menuItemsState || menuItemsState.items.length === 0,\n recoveryText: i18nStrings?.menuRecoveryText,\n errorIconAriaLabel: i18nStrings?.menuErrorIconAriaLabel,\n loadingText: i18nStrings?.menuLoadingText,\n finishedText: i18nStrings?.menuFinishedText,\n errorText: i18nStrings?.menuErrorText,\n onRecoveryClick: () => {\n if (menuLoadMoreHandlers) {\n menuLoadMoreHandlers.fireLoadMoreOnRecoveryClick();\n }\n editableElementRef.current?.focus();\n },\n hasRecoveryCallback: Boolean(onMenuLoadItems),\n });\n\n const menuDropdownStatus = activeMenu ? menuDropdownStatusResult : null;\n\n const shouldRenderMenuDropdown = useMemo(() => {\n return !!(menuIsOpen && activeMenu && menuItemsState && triggerVisible);\n }, [menuIsOpen, activeMenu, menuItemsState, triggerVisible]);\n\n const showPlaceholder = !!(placeholder && (!tokens || tokens.length === 0));\n\n const editableElementAttributes: React.HTMLAttributes<HTMLDivElement> & { 'data-placeholder'?: string } = {\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledby,\n 'aria-describedby': ariaDescribedby,\n 'aria-invalid': invalid ? 'true' : undefined,\n 'aria-disabled': disabled ? 'true' : undefined,\n 'aria-readonly': readOnly ? 'true' : undefined,\n 'aria-required': ariaRequired ? 'true' : undefined,\n 'data-placeholder': placeholder,\n className: clsx(styles.textarea, testutilStyles.textarea, {\n [styles.invalid]: invalid,\n [styles.warning]: warning,\n [styles['textarea-disabled']]: disabled,\n [styles['textarea-readonly']]: readOnly,\n [styles['placeholder-visible']]: showPlaceholder,\n }),\n autoCorrect: disableBrowserAutocorrect ? 'off' : undefined,\n autoCapitalize: disableBrowserAutocorrect ? 'off' : undefined,\n spellCheck: spellcheck,\n // When disabled, omit tabIndex entirely so the div is not focusable at all.\n tabIndex: disabled ? undefined : 0,\n onKeyDown: handleEditableElementKeyDown,\n onKeyUp: onKeyUp && (event => fireKeyboardEvent(onKeyUp, event)),\n onBlur: handleEditableElementBlur,\n onFocus: handleEditableElementFocus,\n onCopy: (event: React.ClipboardEvent) => {\n if (editableElementRef.current) {\n handleClipboardEvent(event, editableElementRef.current, false);\n }\n },\n onCut: (event: React.ClipboardEvent) => {\n if (editableElementRef.current) {\n handleClipboardEvent(event, editableElementRef.current, !disabled && !readOnly);\n if (!disabled && !readOnly) {\n handleInput();\n }\n }\n },\n onPaste: (event: React.ClipboardEvent) => {\n event.preventDefault();\n if (disabled || readOnly) {\n return;\n }\n const text = event.clipboardData.getData('text/plain');\n if (!text || !editableElementRef.current || !caretControllerRef.current) {\n return;\n }\n const cc = caretControllerRef.current;\n // Pass undefined for caretStart/caretEnd — let insertText calculate\n // the position after the selection is deleted by replaceSelection.\n insertTextIntoContentEditable(editableElementRef.current, text, undefined, undefined, cc, true);\n },\n };\n\n const portals = portalContainers.map(container =>\n ReactDOM.createPortal(\n <Token key={container.id} variant=\"inline\" label={container.label} disabled={!!disabled} readOnly={!!readOnly} />,\n container.element\n )\n );\n\n return {\n portalContainersRef,\n portalContainers,\n portals,\n editableState,\n editableElementAttributes,\n activeTriggerToken,\n activeMenu,\n menuIsOpen,\n menuFilterText,\n triggerWrapperRef,\n triggerWrapperReady,\n menuListId,\n menuFooterControlId,\n highlightedMenuOptionId,\n menuItemsState,\n menuItemsHandlers,\n menuDropdownStatus,\n shouldRenderMenuDropdown,\n handleInput,\n handleLoadMore,\n tokenOperationAnnouncement,\n markTokensAsSent,\n };\n}\n"]}
1
+ {"version":3,"file":"use-token-mode.js","sourceRoot":"","sources":["../../../../src/prompt-input/tokens/use-token-mode.tsx"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,sCAAsC;AAEtC,OAAO,KAAK,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAClG,OAAO,QAAQ,MAAM,WAAW,CAAC;AACjC,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,+CAA+C,CAAC;AAE/F,OAAO,EAAE,iBAAiB,EAAE,MAAM,2CAA2C,CAAC;AAC9E,OAAO,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAClF,OAAO,EAAE,iBAAiB,EAAE,MAAM,0CAA0C,CAAC;AAC7E,OAAO,EAAE,wBAAwB,EAAE,MAAM,4CAA4C,CAAC;AACtF,OAAO,KAAK,MAAM,sBAAsB,CAAC;AACzC,OAAO,EAAE,sBAAsB,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AACtG,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AACrE,OAAO,EACL,uBAAuB,EACvB,YAAY,EACZ,qBAAqB,EACrB,uBAAuB,EACvB,kBAAkB,EAClB,YAAY,GACb,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AACrF,OAAO,EACL,mBAAmB,EAInB,YAAY,EACZ,eAAe,GAChB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC9F,OAAO,EAAmB,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC5E,OAAO,EACL,0BAA0B,EAC1B,kCAAkC,EAClC,iCAAiC,EACjC,0BAA0B,GAC3B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAEhG,OAAO,EAAE,6BAA6B,EAAE,MAAM,uCAAuC,CAAC;AACtF,OAAO,EAAkB,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEzF,OAAO,MAAM,MAAM,kBAAkB,CAAC;AACtC,OAAO,cAAc,MAAM,+BAA+B,CAAC;AAQ3D,MAAM,UAAU,mBAAmB;IACjC,OAAO;QACL,uBAAuB,EAAE,KAAK;QAC9B,oBAAoB,EAAE,IAAI;KAC3B,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;GAWG;AACH,SAAS,cAAc,CACrB,SAA6D,EAC7D,SAA6D;IAE7D,IAAI,CAAC,SAAS,IAAI,CAAC,SAAS,EAAE,CAAC;QAC7B,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,IAAI,SAAS,CAAC,MAAM,KAAK,SAAS,CAAC,MAAM,EAAE,CAAC;QAC1C,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,IAAI,WAAW,GAAG,KAAK,CAAC;IAExB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1C,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;QAC9B,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;QAE9B,IAAI,QAAQ,CAAC,IAAI,KAAK,QAAQ,CAAC,IAAI,EAAE,CAAC;YACpC,OAAO,YAAY,CAAC;QACtB,CAAC;QAED,IAAI,gBAAgB,CAAC,QAAQ,CAAC,IAAI,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7D,IAAI,QAAQ,CAAC,EAAE,KAAK,QAAQ,CAAC,EAAE,EAAE,CAAC;gBAChC,OAAO,YAAY,CAAC;YACtB,CAAC;QACH,CAAC;QAED,IAAI,cAAc,CAAC,QAAQ,CAAC,IAAI,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzD,IAAI,QAAQ,CAAC,EAAE,KAAK,QAAQ,CAAC,EAAE,EAAE,CAAC;gBAChC,OAAO,YAAY,CAAC;YACtB,CAAC;YACD,oFAAoF;YACpF,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC;YAC7C,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC;YAC5C,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;gBACzB,OAAO,YAAY,CAAC;YACtB,CAAC;YACD,IAAI,QAAQ,CAAC,KAAK,KAAK,QAAQ,CAAC,KAAK,EAAE,CAAC;gBACtC,WAAW,GAAG,IAAI,CAAC;YACrB,CAAC;QACH,CAAC;QAED,IAAI,WAAW,CAAC,QAAQ,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC;YACnD,IAAI,QAAQ,CAAC,KAAK,KAAK,QAAQ,CAAC,KAAK,EAAE,CAAC;gBACtC,WAAW,GAAG,IAAI,CAAC;YACrB,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC;AAC5C,CAAC;AAED;;;GAGG;AACH,SAAS,+BAA+B,CACtC,MAA8C,EAC9C,aAA4B,EAC5B,eAAuC;IAEvC,IAAI,CAAC,aAAa,CAAC,oBAAoB,IAAI,CAAC,eAAe,EAAE,CAAC;QAC5D,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,kBAAkB,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,aAAa,CAAC,oBAAoB,CAAC,CAAC;IAErH,IAAI,kBAAkB,KAAK,CAAC,CAAC,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,QAAQ,GAAG,sBAAsB,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IACpE,eAAe,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IACtC,aAAa,CAAC,oBAAoB,GAAG,IAAI,CAAC;IAC1C,OAAO,IAAI,CAAC;AACd,CAAC;AAED,0DAA0D;AAC1D,SAAS,oBAAoB,CAC3B,MAA8C,EAC9C,SAAiB;IAEjB,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC;IACtF,IAAI,OAAO,IAAI,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC;QACvC,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAoFD;;;;;;;;;;GAUG;AACH,SAAS,iBAAiB,CAAC,MAAuB;IAChD,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,iBAAiB,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC;IAEnF,MAAM,eAAe,GAAG,iBAAiB,CAAC,CAAC,SAAwC,EAAE,EAAE;QACrF,MAAM,KAAK,GAAG,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;QAChF,KAAK,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;QAClC,QAAQ,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,MAAM,qBAAqB,GAAG,iBAAiB,CAAC,CAAC,YAAyB,EAAE,EAAE;QAC5E,KAAK,MAAM,EAAE,IAAI,YAAY,EAAE,CAAC;YAC9B,KAAK,CAAC,mBAAmB,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC1C,+DAA+D;YAC/D,IAAI,KAAK,CAAC,cAAc,KAAK,EAAE,EAAE,CAAC;gBAChC,KAAK,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,gEAAgE;IAChE,MAAM,gBAAgB,GAAG,iBAAiB,CAAC,CAAC,WAA0C,EAAE,EAAE;QACxF,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,GAAG,aAAa,CACvD,WAAW,EACX,EAAE,KAAK,EAAE,YAAY,EAAE,EACvB;YACE,MAAM,EAAE,YAAY;YACpB,cAAc,EAAE,IAAI;SACrB,EACD,iBAAiB,EACjB,KAAK,CAAC,mBAAmB,CAAC,OAAO,CAClC,CAAC;QAEF,qBAAqB,CAAC,YAAY,CAAC,CAAC;QACpC,eAAe,CAAC,SAAS,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,kEAAkE;IAClE,SAAS,CAAC,GAAG,EAAE;QACb,yFAAyF;QACzF,IAAI,KAAK,CAAC,oBAAoB,CAAC,OAAO,KAAK,MAAM,EAAE,CAAC;YAClD,OAAO;QACT,CAAC;QAED,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO;QACT,CAAC;QAED,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,GAAG,aAAa,CACvD,MAAM,EACN,EAAE,KAAK,EAAE,YAAY,EAAE,EACvB;YACE,MAAM,EAAE,UAAU;YAClB,cAAc,EAAE,IAAI;SACrB,EACD,SAAS,EACT,KAAK,CAAC,mBAAmB,CAAC,OAAO,CAClC,CAAC;QAEF,qBAAqB,CAAC,YAAY,CAAC,CAAC;QAEpC,oFAAoF;QACpF,8EAA8E;QAC9E,sEAAsE;QACtE,MAAM,UAAU,GACd,SAAS,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM;YAClC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;gBACtB,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;gBACvB,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC;oBACnD,OAAO,IAAI,CAAC;gBACd,CAAC;gBACD,IAAI,gBAAgB,CAAC,CAAC,CAAC,IAAI,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,EAAE,CAAC;oBACtE,OAAO,IAAI,CAAC;gBACd,CAAC;gBACD,IAAI,cAAc,CAAC,CAAC,CAAC,IAAI,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,EAAE,CAAC;oBAClE,OAAO,IAAI,CAAC;gBACd,CAAC;gBACD,OAAO,KAAK,CAAC;YACf,CAAC,CAAC,CAAC;QAEL,IAAI,UAAU,EAAE,CAAC;YACf,eAAe,CAAC,SAAS,CAAC,CAAC;QAC7B,CAAC;aAAM,CAAC;YACN,4EAA4E;YAC5E,KAAK,CAAC,oBAAoB,CAAC,OAAO,GAAG,MAAM,CAAC;QAC9C,CAAC;IACH,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,eAAe,EAAE,qBAAqB,CAAC,CAAC,CAAC;IAEjF,OAAO;QACL,gBAAgB;KACjB,CAAC;AACJ,CAAC;AAED,0GAA0G;AAC1G,MAAM,UAAU,YAAY,CAAC,MAA0B;;IACrD,MAAM,EACJ,kBAAkB,EAClB,kBAAkB,EAClB,MAAM,EACN,YAAY,EACZ,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,WAAW,EACX,OAAO,EACP,OAAO,EACP,SAAS,EACT,cAAc,EACd,eAAe,EACf,YAAY,EACZ,yBAAyB,EACzB,UAAU,EACV,QAAQ,EACR,iBAAiB,EACjB,QAAQ,EACR,MAAM,EACN,OAAO,EACP,SAAS,EACT,OAAO,EACP,gBAAgB,EAChB,YAAY,EACZ,eAAe,EACf,WAAW,EACX,iBAAiB,GAClB,GAAG,MAAM,CAAC;IAEX,MAAM,cAAc,GAAG,iBAAiB,EAAE,CAAC;IAE3C,MAAM,EAAE,gBAAgB,EAAE,GAAG,cAAc,CAAC;IAE5C,MAAM,kBAAkB,GAAG,OAAO,CAAC,GAAyC,EAAE;;QAC5E,IAAI,CAAC,MAAM,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,CAAC;YAC3C,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,eAAe,GAAG,CAAA,MAAA,kBAAkB,CAAC,OAAO,CAAC,iBAAiB,EAAE,0CAAE,EAAE,KAAI,IAAI,CAAC;QAEnF,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,cAAc,CAAC,mBAAmB,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,CAAC;YACpE,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,oBAAoB,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;QACrD,6HAA6H;IAC/H,CAAC,EAAE,CAAC,MAAM,EAAE,kBAAkB,EAAE,cAAc,CAAC,cAAc,CAAC,CAAC,CAAC;IAEhE,MAAM,UAAU,GAAG,OAAO,CACxB,GAAG,EAAE;;QACH,OAAA,kBAAkB,IAAI,cAAc,CAAC,cAAc,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ;YAC3E,CAAC,CAAC,CAAC,MAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,kBAAkB,CAAC,WAAW,CAAC,mCAAI,IAAI,CAAC;YAC1E,CAAC,CAAC,IAAI,CAAA;KAAA,EACV,CAAC,kBAAkB,EAAE,cAAc,CAAC,cAAc,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAC/E,CAAC;IAEF,MAAM,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC;IAChC,MAAM,cAAc,GAAG,MAAA,kBAAkB,aAAlB,kBAAkB,uBAAlB,kBAAkB,CAAE,KAAK,mCAAI,EAAE,CAAC;IAEvD,MAAM,SAAS,GAAG,iBAAiB,CAAC;QAClC,MAAM;QACN,KAAK;QACL,YAAY;QACZ,QAAQ;QACR,iBAAiB;QACjB,KAAK,EAAE,cAAc;KACtB,CAAC,CAAC;IAEH,MAAM,EAAE,gBAAgB,EAAE,GAAG,SAAS,CAAC;IAEvC,mBAAmB,CAAC;QAClB,MAAM;QACN,kBAAkB;QAClB,KAAK,EAAE,cAAc;QACrB,kBAAkB;QAClB,eAAe,EAAE,kBAAkB;KACpC,CAAC,CAAC;IAEH,MAAM,iBAAiB,GAAG,MAAM,CAAqB,IAAI,CAAC,CAAC;IAC3D,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAE3D,oFAAoF;IACpF,2EAA2E;IAC3E,+EAA+E;IAC/E,IAAI,CAAA,kBAAkB,aAAlB,kBAAkB,uBAAlB,kBAAkB,CAAE,EAAE,KAAI,UAAU,EAAE,CAAC;QACzC,iBAAiB,CAAC,OAAO,GAAG,MAAA,cAAc,CAAC,kBAAkB,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,EAAE,CAAC,mCAAI,IAAI,CAAC;IAC3G,CAAC;SAAM,CAAC;QACN,iBAAiB,CAAC,OAAO,GAAG,IAAI,CAAC;IACnC,CAAC;IAED,MAAM,mBAAmB,GAAG,CAAC,CAAC,iBAAiB,CAAC,OAAO,IAAI,UAAU,CAAC;IAEtE,wEAAwE;IACxE,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,UAAU,IAAI,CAAC,iBAAiB,CAAC,OAAO,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,CAAC;YAC7E,iBAAiB,CAAC,IAAI,CAAC,CAAC;YACxB,OAAO;QACT,CAAC;QAED,MAAM,OAAO,GAAG,iBAAiB,CAAC,OAAO,CAAC;QAC1C,MAAM,SAAS,GAAG,kBAAkB,CAAC,OAAO,CAAC;QAE7C,MAAM,sBAAsB,GAAG,GAAG,EAAE;YAClC,MAAM,WAAW,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC;YACpD,MAAM,aAAa,GAAG,SAAS,CAAC,qBAAqB,EAAE,CAAC;YAExD,MAAM,WAAW,GAAG,WAAW,CAAC,MAAM,GAAG,aAAa,CAAC,GAAG,IAAI,WAAW,CAAC,GAAG,GAAG,aAAa,CAAC,MAAM,CAAC;YACrG,iBAAiB,CAAC,CAAC,WAAW,CAAC,CAAC;QAClC,CAAC,CAAC;QAEF,sBAAsB,EAAE,CAAC;QAEzB,SAAS,CAAC,gBAAgB,CAAC,QAAQ,EAAE,sBAAsB,CAAC,CAAC;QAE7D,MAAM,gBAAgB,GAAG,wBAAwB,CAAC,SAAS,CAAC,CAAC;QAC7D,IAAI,gBAAgB,EAAE,CAAC;YACrB,gBAAgB,CAAC,gBAAgB,CAAC,QAAQ,EAAE,sBAAsB,CAAC,CAAC;QACtE,CAAC;QAED,OAAO,GAAG,EAAE;YACV,SAAS,CAAC,mBAAmB,CAAC,QAAQ,EAAE,sBAAsB,CAAC,CAAC;YAChE,IAAI,gBAAgB,EAAE,CAAC;gBACrB,gBAAgB,CAAC,mBAAmB,CAAC,QAAQ,EAAE,sBAAsB,CAAC,CAAC;YACzE,CAAC;QACH,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,UAAU,EAAE,kBAAkB,EAAE,kBAAkB,CAAC,CAAC,CAAC;IAEzD,MAAM,mBAAmB,GAAG,MAAM,CAA+B,IAAI,GAAG,EAAE,CAAC,CAAC;IAC5E,MAAM,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,GAAG,QAAQ,CAAoB,EAAE,CAAC,CAAC;IAEhF,MAAM,YAAY,GAAG,WAAW,CAC9B,CAAC,MAA8C,EAAE,MAAmB,EAAE,EAAE;QACtE,MAAM,MAAM,GAAG,iBAAiB,CAC9B,MAAM,EACN,MAAM,EACN,mBAAmB,CAAC,OAAO,EAC3B,cAAc,CAAC,kBAAkB,CAAC,OAAO,EACzC,cAAc,CAAC,mBAAmB,CAAC,OAAO,CAC3C,CAAC;QAEF,gDAAgD;QAChD,cAAc,CAAC,kBAAkB,CAAC,OAAO,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;QAE5E,mBAAmB,CAAC,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACtE,OAAO,MAAM,CAAC;IAChB,CAAC,EACD,CAAC,cAAc,CAAC,kBAAkB,EAAE,cAAc,CAAC,mBAAmB,EAAE,mBAAmB,CAAC,CAC7F,CAAC;IAEF,eAAe,CAAC,GAAG,EAAE;QACnB,IAAI,kBAAkB,CAAC,OAAO,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,CAAC;YAC9D,kBAAkB,CAAC,OAAO,GAAG,IAAI,eAAe,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;QAC/E,CAAC;IACH,CAAC,EAAE,CAAC,kBAAkB,EAAE,kBAAkB,CAAC,CAAC,CAAC;IAE7C,MAAM,aAAa,GAAG,MAAM,CAAC,mBAAmB,EAAE,CAAC,CAAC,OAAO,CAAC;IAE5D,MAAM,CAAC,0BAA0B,EAAE,6BAA6B,CAAC,GAAG,QAAQ,CAAS,EAAE,CAAC,CAAC;IAEzF,MAAM,sBAAsB,GAAG,iBAAiB,CAAC,CAAC,OAAe,EAAE,EAAE;QACnE,6BAA6B,CAAC,OAAO,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,MAAM,qBAAqB,GAAG,MAAM,CAAqD,SAAS,CAAC,CAAC;IACpG,MAAM,eAAe,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;IACzC,MAAM,eAAe,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;IAEzC,4FAA4F;IAC5F,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC/B,QAAQ,CAAC,OAAO,GAAG,KAAK,CAAC;IAEzB,iFAAiF;IACjF,MAAM,cAAc,GAAG,MAAM,CAAa,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAEpD,gFAAgF;IAChF,8EAA8E;IAC9E,8BAA8B;IAC9B,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAElD,mFAAmF;IACnF,8EAA8E;IAC9E,+EAA+E;IAC/E,sFAAsF;IACtF,iFAAiF;IACjF,kDAAkD;IAClD,MAAM,EAAE,WAAW,EAAE,GAAG,iBAAiB,CAAC,kBAAkB,EAAE;QAC5D,kBAAkB,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC;QAC5C,gBAAgB,EAAE,GAAG,EAAE;YACrB,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,cAAc,CAAC,OAAO,EAAE,CAAC;QAC3B,CAAC;KACF,CAAC,CAAC;IAEH,MAAM,WAAW,GAAG,WAAW,CAAC,GAAG,EAAE;;QACnC,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,CAAC;YAChC,OAAO;QACT,CAAC;QAED,MAAM,QAAQ,GAAG,MAAA,kBAAkB,CAAC,OAAO,CAAC,aAAa,mCAAI,QAAQ,CAAC;QACtE,MAAM,EAAE,GAAG,kBAAkB,CAAC,OAAO,CAAC;QAEtC,IAAI,EAAE,EAAE,CAAC;YACP,EAAE,CAAC,OAAO,EAAE,CAAC;QACf,CAAC;QAED,IAAI,aAAa,CAAC,uBAAuB,EAAE,CAAC;YAC1C,aAAa,CAAC,uBAAuB,GAAG,KAAK,CAAC;QAChD,CAAC;QAED,MAAM,EAAE,aAAa,EAAE,GAAG,yBAAyB,CAAC,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAEvF,gFAAgF;QAChF,KAAK,MAAM,EAAE,IAAI,cAAc,CAAC,mBAAmB,CAAC,OAAO,EAAE,CAAC;YAC5D,MAAM,OAAO,GACX,MAAA,cAAc,CAAC,kBAAkB,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,mCAChD,kBAAkB,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAwB,CAAC;YACzF,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,SAAS;YACX,CAAC;YACD,MAAM,UAAU,GAAG,CAAC,OAAO,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YAC5D,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,SAAS;YACX,CAAC;YAED,IAAI,cAAc,GAAG,KAAK,CAAC;YAC3B,MAAM,SAAS,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,iBAAiB,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YACpG,IAAI,CAAA,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,UAAU,KAAI,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,EAAE,CAAC;gBACtF,cAAc,GAAG,IAAI,CAAC;YACxB,CAAC;YAED,MAAM,QAAQ,GAAG,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;YACrD,MAAA,OAAO,CAAC,UAAU,0CAAE,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;YAChE,OAAO,CAAC,WAAW,GAAG,CAAC,OAAO,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAE5D,IAAI,cAAc,IAAI,CAAC,aAAa,EAAE,CAAC;gBACrC,IAAI,EAAE,EAAE,CAAC;oBACP,EAAE,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;gBACjC,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,aAAa,IAAI,EAAE,EAAE,CAAC;YACxB,EAAE,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC;QACtC,CAAC;QAED,MAAM,eAAe,GAAG,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,MAAM,CAC9E,IAAI,CAAC,EAAE,WAAC,OAAA,UAAU,CAAC,IAAI,CAAC,KAAI,MAAA,IAAI,CAAC,WAAW,0CAAE,IAAI,EAAE,CAAA,CAAA,EAAA,CACrD,CAAC;QAEF,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/B,IAAI,EAAE,EAAE,CAAC;gBACP,EAAE,CAAC,OAAO,EAAE,CAAC;YACf,CAAC;YAED,IAAI,OAAO,GAAG,iBAAiB,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;YAC/D,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,GAAG,eAAe,EAAE,CAAC;gBAC5B,kBAAkB,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;YAClD,CAAC;YAED,eAAe,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;gBACjC,OAAQ,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;YACjC,CAAC,CAAC,CAAC;YAEH,IAAI,EAAE,EAAE,CAAC;gBACP,EAAE,CAAC,OAAO,EAAE,CAAC;YACf,CAAC;QACH,CAAC;QAED,IAAI,eAAe,GAAG,oBAAoB,CACxC,kBAAkB,CAAC,OAAO,EAC1B,QAAQ,CAAC,OAAO,EAChB,mBAAmB,CAAC,OAAO,CAC5B,CAAC;QAEF,0EAA0E;QAC1E,6DAA6D;QAC7D,MAAM,WAAW,GAAG,eAAe,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;QAC3D,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC,cAAc,CAAC,kBAAkB,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QACrF,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;YACzD,YAAY,CAAC,eAAe,EAAE,kBAAkB,CAAC,OAAO,CAAC,CAAC;QAC5D,CAAC;QAED,MAAM,WAAW,GAAG,0BAA0B,CAAC,eAAe,CAAC,CAAC;QAChE,MAAM,eAAe,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;QAE7E,MAAM,YAAY,GAAG,0BAA0B,CAAC,WAAW,CAAC,CAAC;QAE7D,IAAI,eAAe,EAAE,CAAC;YACpB,MAAM,kBAAkB,GAAG,MAAA,EAAE,aAAF,EAAE,uBAAF,EAAE,CAAE,WAAW,EAAE,mCAAI,CAAC,CAAC;YAClD,MAAM,gBAAgB,GAAG,kCAAkC,CAAC,eAAe,EAAE,YAAY,EAAE,kBAAkB,CAAC,CAAC;YAE/G,eAAe,GAAG,YAAY,CAAC;YAE/B,YAAY,CAAC,YAAY,EAAE,kBAAkB,CAAC,OAAO,CAAC,CAAC;YAEvD,IAAI,kBAAkB,CAAC,OAAO,IAAI,QAAQ,CAAC,aAAa,KAAK,kBAAkB,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC;gBAC9F,EAAE,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAC;YACnC,CAAC;QACH,CAAC;QAED,gBAAgB,CAAC,eAAe,CAAC,CAAC;QAElC,iBAAiB,EAAE,CAAC;IACtB,CAAC,EAAE;QACD,gBAAgB;QAChB,iBAAiB;QACjB,kBAAkB;QAClB,kBAAkB;QAClB,mBAAmB;QACnB,aAAa;QACb,YAAY;QACZ,cAAc,CAAC,kBAAkB;QACjC,cAAc,CAAC,mBAAmB;KACnC,CAAC,CAAC;IAEH,sFAAsF;IACtF,cAAc,CAAC,OAAO,GAAG,WAAW,CAAC;IAErC,sBAAsB;IACtB,eAAe,CAAC,GAAG,EAAE;QACnB,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,CAAC;YAChC,OAAO;QACT,CAAC;QAED,MAAM,EAAE,GAAG,kBAAkB,CAAC,OAAO,CAAC;QACtC,MAAM,aAAa,GAAG,MAAM,CAAC,CAAC,CAAC,0BAA0B,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QAC3E,MAAM,iBAAiB,GAAG,qBAAqB,CAAC,OAAO,CAAC;QAExD,MAAM,YAAY,GAAG,eAAe,CAAC,OAAO,KAAK,QAAQ,IAAI,eAAe,CAAC,OAAO,KAAK,QAAQ,CAAC;QAClG,eAAe,CAAC,OAAO,GAAG,QAAQ,CAAC;QACnC,eAAe,CAAC,OAAO,GAAG,QAAQ,CAAC;QAEnC,MAAM,iBAAiB,GAAG,uBAAuB,CAAC,qBAAqB,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;QAEhG,MAAM,UAAU,GAAG,cAAc,CAAC,qBAAqB,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;QAChF,MAAM,aAAa,GAAG,YAAY,IAAI,UAAU,KAAK,MAAM,IAAI,iBAAiB,GAAG,CAAC,CAAC;QAErF,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,+BAA+B,CAAC,aAAa,aAAb,aAAa,cAAb,aAAa,GAAI,EAAE,EAAE,aAAa,EAAE,EAAE,CAAC,CAAC;YAExE,qBAAqB,CAAC,OAAO,GAAG,aAAa,CAAC;YAC9C,OAAO;QACT,CAAC;QAED,4EAA4E;QAC5E,yEAAyE;QACzE,4EAA4E;QAC5E,yEAAyE;QACzE,+EAA+E;QAC/E,2CAA2C;QAC3C,IACE,UAAU,KAAK,WAAW;YAC1B,CAAC,YAAY;YACb,iBAAiB,KAAK,CAAC;YACvB,cAAc,CAAC,oBAAoB,CAAC,OAAO,KAAK,MAAM,EACtD,CAAC;YACD,qBAAqB,CAAC,OAAO,GAAG,aAAa,CAAC;YAC9C,OAAO;QACT,CAAC;QAED,IAAI,iBAAiB,GAAG,CAAC,IAAI,aAAa,IAAI,EAAE,EAAE,CAAC;YACjD,YAAY,CAAC,aAAa,EAAE,kBAAkB,CAAC,OAAO,CAAC,CAAC;YACxD,qBAAqB,CAAC,OAAO,GAAG,aAAa,CAAC;YAC9C,EAAE,CAAC,WAAW,CAAC,iBAAiB,CAAC,CAAC;YAClC,iBAAiB,EAAE,CAAC;YACpB,OAAO;QACT,CAAC;QAED,2FAA2F;QAC3F,wFAAwF;QACxF,MAAM,UAAU,GACd,aAAa;YACb,iBAAiB;YACjB,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACjH,IAAI,UAAU,IAAI,cAAc,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC;YACnD,YAAY,CAAC,aAAa,EAAE,kBAAkB,CAAC,OAAO,CAAC,CAAC;YACxD,qBAAqB,CAAC,OAAO,GAAG,aAAa,CAAC;YAC9C,iGAAiG;YACjG,MAAM,QAAQ,GAAG,EAAE,CAAC,gBAAgB,EAAE,CAAC;YACvC,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;gBACtB,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;YAC3B,CAAC;iBAAM,CAAC;gBACN,MAAM,YAAY,GAAG,aAAa,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;gBACvD,MAAM,gBAAgB,GAAG,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,sBAAsB,CAAC,aAAa,EAAE,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACxG,EAAE,CAAC,WAAW,CAAC,gBAAgB,GAAG,UAAU,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YACnE,CAAC;YACD,iBAAiB,EAAE,CAAC;YACpB,OAAO;QACT,CAAC;QAED,IACE,qBAAqB,CAAC,OAAO;YAC7B,aAAa;YACb,qBAAqB,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;YAC1C,aAAa,CAAC,MAAM,KAAK,CAAC,EAC1B,CAAC;YACD,qBAAqB,CAAC,OAAO,GAAG,aAAa,CAAC;YAC9C,OAAO;QACT,CAAC;QAED,IAAI,aAAa,CAAC,oBAAoB,IAAI,EAAE,EAAE,CAAC;YAC7C,MAAM,kBAAkB,GAAG,CAAC,aAAa,aAAb,aAAa,cAAb,aAAa,GAAI,EAAE,CAAC,CAAC,SAAS,CACxD,CAAC,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,aAAa,CAAC,oBAAoB,CACxE,CAAC;YAEF,IAAI,kBAAkB,KAAK,CAAC,CAAC,EAAE,CAAC;gBAC9B,YAAY,CAAC,aAAa,aAAb,aAAa,cAAb,aAAa,GAAI,EAAE,EAAE,kBAAkB,CAAC,OAAO,CAAC,CAAC;gBAC9D,+BAA+B,CAAC,aAAa,aAAb,aAAa,cAAb,aAAa,GAAI,EAAE,EAAE,aAAa,EAAE,EAAE,CAAC,CAAC;gBAExE,qBAAqB,CAAC,OAAO,GAAG,aAAa,CAAC;gBAC9C,iBAAiB,EAAE,CAAC;gBACpB,OAAO;YACT,CAAC;QACH,CAAC;QAED,qBAAqB,CAAC,OAAO,GAAG,aAAa,CAAC;QAE9C,IAAI,EAAE,EAAE,CAAC;YACP,EAAE,CAAC,OAAO,EAAE,CAAC;QACf,CAAC;QAED,YAAY,CAAC,aAAa,aAAb,aAAa,cAAb,aAAa,GAAI,EAAE,EAAE,kBAAkB,CAAC,OAAO,CAAC,CAAC;QAE9D,IAAI,+BAA+B,CAAC,aAAa,aAAb,aAAa,cAAb,aAAa,GAAI,EAAE,EAAE,aAAa,EAAE,EAAE,CAAC,EAAE,CAAC;YAC5E,iBAAiB,EAAE,CAAC;YACpB,OAAO;QACT,CAAC;QAED,IAAI,EAAE,EAAE,CAAC;YACP,MAAM,aAAa,GAAG,EAAE,CAAC,gBAAgB,EAAE,CAAC;YAC5C,MAAM,gBAAgB,GAAG,iCAAiC,CACxD,aAAa,EACb,iBAAiB,aAAjB,iBAAiB,cAAjB,iBAAiB,GAAI,EAAE,EACvB,aAAa,aAAb,aAAa,cAAb,aAAa,GAAI,EAAE,CACpB,CAAC;YAEF,IAAI,gBAAgB,KAAK,IAAI,EAAE,CAAC;gBAC9B,EAAE,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAC;YACnC,CAAC;iBAAM,CAAC;gBACN,EAAE,CAAC,OAAO,EAAE,CAAC;YACf,CAAC;QACH,CAAC;QAED,iBAAiB,EAAE,CAAC;IACtB,CAAC,EAAE;QACD,QAAQ;QACR,QAAQ;QACR,MAAM;QACN,iBAAiB;QACjB,kBAAkB;QAClB,kBAAkB;QAClB,mBAAmB;QACnB,aAAa;QACb,YAAY;QACZ,cAAc;KACf,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;;QACb,MAAM,qBAAqB,GAAG,GAAG,EAAE;;YACjC,MAAM,GAAG,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,iBAAiB,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAC9F,IAAI,CAAC,CAAA,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,UAAU,CAAA,IAAI,CAAC,CAAA,MAAA,kBAAkB,CAAC,OAAO,0CAAE,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAA,EAAE,CAAC;gBAChG,OAAO;YACT,CAAC;YACD,yEAAyE;YACzE,qEAAqE;YACrE,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC;gBACpB,uBAAuB,CAAC,GAAG,CAAC,CAAC;YAC/B,CAAC;YACD,kBAAkB,CAAC,GAAG,CAAC,CAAC;QAC1B,CAAC,CAAC;QACF,MAAM,eAAe,GAAG,GAAG,EAAE;YAC3B,YAAY,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC,CAAC;QACF,MAAM,aAAa,GAAG,GAAG,EAAE;;YACzB,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,MAAM,GAAG,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,iBAAiB,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAC9F,IAAI,CAAC,CAAA,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,UAAU,CAAA,IAAI,CAAC,CAAA,MAAA,kBAAkB,CAAC,OAAO,0CAAE,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAA,EAAE,CAAC;gBAChG,OAAO;YACT,CAAC;YACD,uBAAuB,CAAC,GAAG,CAAC,CAAC;YAC7B,kBAAkB,CAAC,GAAG,CAAC,CAAC;YAExB,wEAAwE;YACxE,kFAAkF;YAClF,qBAAqB,CAAC,GAAG,EAAE;gBACzB,MAAM,GAAG,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,iBAAiB,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gBAC9F,IAAI,CAAC,CAAA,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,UAAU,CAAA,EAAE,CAAC;oBACrB,OAAO;gBACT,CAAC;gBAED,MAAM,KAAK,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;gBAChC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;oBACrB,MAAM,QAAQ,GAAG,qBAAqB,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;oBAC7D,MAAM,MAAM,GAAG,qBAAqB,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;oBAEzD,IAAI,QAAQ,EAAE,CAAC;wBACb,MAAM,GAAG,GAAG,uBAAuB,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;wBAC1D,IAAI,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,UAAU,EAAE,CAAC;4BACpB,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,GAAgB,CAAC,CAAC;4BAC9E,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;wBACxC,CAAC;oBACH,CAAC;oBACD,IAAI,MAAM,EAAE,CAAC;wBACX,MAAM,GAAG,GAAG,uBAAuB,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;wBACxD,IAAI,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,UAAU,EAAE,CAAC;4BACpB,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,GAAgB,CAAC,CAAC;4BAC9E,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;wBAC1C,CAAC;oBACH,CAAC;gBACH,CAAC;gBAED,uBAAuB,CAAC,GAAG,CAAC,CAAC;gBAC7B,kBAAkB,CAAC,GAAG,CAAC,CAAC;YAC1B,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;QAEF,MAAM,QAAQ,GAAG,MAAA,MAAA,kBAAkB,CAAC,OAAO,0CAAE,aAAa,mCAAI,QAAQ,CAAC;QACvE,MAAM,OAAO,GAAG,kBAAkB,CAAC,OAAO,CAAC;QAC3C,sFAAsF;QACtF,QAAQ,CAAC,gBAAgB,CAAC,iBAAiB,EAAE,qBAAqB,CAAC,CAAC;QACpE,iFAAiF;QACjF,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,gBAAgB,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;QACxD,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,gBAAgB,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;QAEpD,OAAO,GAAG,EAAE;YACV,QAAQ,CAAC,mBAAmB,CAAC,iBAAiB,EAAE,qBAAqB,CAAC,CAAC;YACvE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,mBAAmB,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;YAC3D,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,mBAAmB,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;QACzD,CAAC,CAAC;QACF,qFAAqF;IACvF,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,gBAAgB,GAAG,iBAAiB,CAAC,CAAC,MAAgB,EAAE,EAAE;;QAC9D,IAAI,CAAC,UAAU,IAAI,CAAC,kBAAkB,IAAI,CAAC,MAAM,EAAE,CAAC;YAClD,OAAO;QACT,CAAC;QAED,cAAc,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAEvC,MAAM,MAAM,GAAG,mBAAmB,CAChC,MAAM,EACN;YACE,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE;YAChC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE;SACxD,EACD,UAAU,CAAC,EAAE,EACb,MAAA,UAAU,CAAC,UAAU,mCAAI,KAAK,EAC9B,kBAAkB,CACnB,CAAC;QAEF,MAAM,KAAK,GAAG,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACxF,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAEhC,aAAa,CAAC,oBAAoB,GAAG,MAAM,CAAC,aAAa,CAAC,EAAE,IAAI,IAAI,CAAC;QAErE,MAAM,QAAQ,GAAG,MAAA,UAAU,CAAC,UAAU,mCAAI,KAAK,CAAC;QAChD,MAAM,YAAY,GAAG,QAAQ;YAC3B,CAAC,CAAC,MAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,oBAAoB,4DAAG,MAAM,CAAC,aAAa,CAAC;YAC3D,CAAC,CAAC,MAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,sBAAsB,4DAAG,MAAM,CAAC,aAAa,CAAC,CAAC;QAEhE,IAAI,YAAY,EAAE,CAAC;YACjB,sBAAsB,CAAC,YAAY,CAAC,CAAC;QACvC,CAAC;QAED,QAAQ,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QAE3C,sBAAsB,CAAC,gBAAgB,EAAE;YACvC,MAAM,EAAE,UAAU,CAAC,EAAE;YACrB,MAAM,EAAE,MAAM,CAAC,MAAM;SACtB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,YAAY,CAAC;QACvD,IAAI,EAAE,UAAU,aAAV,UAAU,cAAV,UAAU,GAAI,EAAE,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;QACxD,UAAU,EAAE,cAAc;QAC1B,YAAY,EAAE,gBAAgB;KAC/B,CAAC,CAAC;IAEH,MAAM,YAAY,GAAG,MAAM,CAAC;QAC1B,UAAU,EAAE,cAAc;QAC1B,aAAa,EAAE,iBAAiB;QAChC,MAAM,EAAE,UAAU;KACnB,CAAC,CAAC;IACH,YAAY,CAAC,OAAO,GAAG;QACrB,UAAU,EAAE,cAAc;QAC1B,aAAa,EAAE,iBAAiB;QAChC,MAAM,EAAE,UAAU;KACnB,CAAC;IAEF,MAAM,SAAS,GAAG,iBAAiB,CAAC,GAAG,EAAE;QACvC,cAAc,CAAC,cAAc,CAAC,OAAO,GAAG,cAAc,CAAC,cAAc,CAAC;QACtE,cAAc,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,MAAM,4BAA4B,GAAG,iBAAiB,CAAC,CAAC,KAA0C,EAAE,EAAE;QACpG,qBAAqB,CAAC,KAAK,EAAE;YAC3B,eAAe,EAAE,kBAAkB,CAAC,OAAO;YAC3C,aAAa;YACb,eAAe,EAAE,kBAAkB,CAAC,OAAO;YAC3C,MAAM;YACN,YAAY;YACZ,QAAQ;YACR,QAAQ;YACR,WAAW;YACX,sBAAsB;YACtB,WAAW,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,MAAM;YAC9C,iBAAiB,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,UAAU;YACxD,oBAAoB,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,aAAa;YAC9D,iBAAiB,EAAE,GAAG,EAAE,CAAC,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,UAAU;YAC/C,SAAS;YACT,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,sBAAsB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS;YACnF,QAAQ;YACR,gBAAgB;YAChB,SAAS;YACT,WAAW;SACZ,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,MAAM,0BAA0B,GAAG,iBAAiB,CAAC,GAAG,EAAE;QACxD,IAAI,OAAO,EAAE,CAAC;YACZ,sBAAsB,CAAC,OAAO,CAAC,CAAC;QAClC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,yBAAyB,GAAG,iBAAiB,CAAC,GAAG,EAAE;QACvD,IAAI,MAAM,EAAE,CAAC;YACX,sBAAsB,CAAC,MAAM,CAAC,CAAC;QACjC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,SAAS,IAAI,kBAAkB,CAAC,OAAO,EAAE,CAAC;YAC5C,kBAAkB,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACrC,CAAC;QACD,+DAA+D;QAC/D,uDAAuD;IACzD,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,SAAS,CAAC,GAAG,EAAE;;QACb,MAAM,WAAW,GAAG,MAAA,CAAC,MAAA,MAAA,kBAAkB,CAAC,OAAO,0CAAE,aAAa,mCAAI,QAAQ,CAAC,CAAC,WAAW,mCAAI,MAAM,CAAC;QAClG,MAAM,YAAY,GAAG,GAAG,EAAE,CAAC,iBAAiB,EAAE,CAAC;QAC/C,WAAW,CAAC,gBAAgB,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QACrD,OAAO,GAAG,EAAE;YACV,WAAW,CAAC,mBAAmB,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QAC1D,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,iBAAiB,EAAE,kBAAkB,CAAC,CAAC,CAAC;IAE5C,MAAM,kBAAkB,GAAG,eAAe,CAAC;QACzC,IAAI,EAAE,UAAU,aAAV,UAAU,cAAV,UAAU,GAAI,EAAE,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;QACxD,UAAU,EAAE,MAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,UAAU,mCAAI,UAAU;QAChD,WAAW,EAAE,MAAM,CAAC,EAAE;YACpB,sBAAsB,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;QAClD,CAAC;QACD,eAAe,EAAE,GAAG,EAAE;;YACpB,sBAAsB,CAAC,eAAe,EAAE;gBACtC,MAAM,EAAE,MAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,EAAE,mCAAI,EAAE;gBAC5B,aAAa,EAAE,SAAS;gBACxB,SAAS,EAAE,KAAK;gBAChB,QAAQ,EAAE,KAAK;aAChB,CAAC,CAAC;QACL,CAAC;KACF,CAAC,CAAC;IAEH,MAAM,oBAAoB,GAAG,UAAU,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC;IAEpE,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,UAAU,IAAI,UAAU,IAAI,oBAAoB,EAAE,CAAC;YACrD,oBAAoB,CAAC,sBAAsB,EAAE,CAAC;QAChD,CAAC;IACH,CAAC,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,oBAAoB,CAAC,CAAC,CAAC;IAEnD,MAAM,eAAe,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IACtC,MAAM,kBAAkB,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IAErC,SAAS,CAAC,GAAG,EAAE;;QACb,MAAM,UAAU,GAAG,UAAU,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC;QAC1D,MAAM,WAAW,GACf,UAAU,IAAI,eAAe,CAAC,OAAO,IAAI,kBAAkB,CAAC,OAAO,KAAK,CAAC,IAAI,cAAc,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;QAE/G,IAAI,CAAC,UAAU,IAAI,WAAW,CAAC,IAAI,iBAAiB,IAAI,cAAc,IAAI,cAAc,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1G,gFAAgF;YAChF,iBAAiB,CAAC,0BAA0B,EAAE,CAAC;YAC/C,UAAU,CAAC,GAAG,EAAE;gBACd,iBAAiB,aAAjB,iBAAiB,uBAAjB,iBAAiB,CAAE,kBAAkB,EAAE,CAAC;YAC1C,CAAC,EAAE,iBAAiB,CAAC,CAAC;QACxB,CAAC;QAED,eAAe,CAAC,OAAO,GAAG,UAAU,CAAC;QACrC,kBAAkB,CAAC,OAAO,GAAG,MAAA,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,KAAK,CAAC,MAAM,mCAAI,CAAC,CAAC;QAC/D,wHAAwH;IAC1H,CAAC,EAAE,CAAC,UAAU,EAAE,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IAE9C,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,kBAAkB,IAAI,UAAU,IAAI,YAAY,EAAE,CAAC;YACrD,sBAAsB,CAAC,YAAY,EAAE;gBACnC,MAAM,EAAE,UAAU,CAAC,EAAE;gBACrB,aAAa,EAAE,kBAAkB,CAAC,KAAK;aACxC,CAAC,CAAC;QACL,CAAC;IACH,CAAC,EAAE,CAAC,kBAAkB,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC,CAAC;IAEnD,MAAM,cAAc,GAAG,iBAAiB,CAAC,GAAG,EAAE;QAC5C,IAAI,oBAAoB,EAAE,CAAC;YACzB,oBAAoB,CAAC,oBAAoB,EAAE,CAAC;QAC9C,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,UAAU,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC;IAC5C,MAAM,mBAAmB,GAAG,WAAW,CAAC,aAAa,CAAC,CAAC;IACvD,MAAM,6BAA6B,GAAG,WAAW,EAAE,CAAC;IACpD,MAAM,uBAAuB,GAAG,CAAA,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,iBAAiB,EAAC,CAAC,CAAC,6BAA6B,CAAC,CAAC,CAAC,SAAS,CAAC;IAE9G,MAAM,wBAAwB,GAAG,iBAAiB,CAAC;QACjD,GAAG,CAAC,UAAU,aAAV,UAAU,cAAV,UAAU,GAAI,EAAE,CAAC;QACrB,OAAO,EAAE,CAAC,cAAc,IAAI,cAAc,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;QAC7D,YAAY,EAAE,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,gBAAgB;QAC3C,kBAAkB,EAAE,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,sBAAsB;QACvD,WAAW,EAAE,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,eAAe;QACzC,YAAY,EAAE,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,gBAAgB;QAC3C,SAAS,EAAE,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,aAAa;QACrC,eAAe,EAAE,GAAG,EAAE;;YACpB,IAAI,oBAAoB,EAAE,CAAC;gBACzB,oBAAoB,CAAC,2BAA2B,EAAE,CAAC;YACrD,CAAC;YACD,MAAA,kBAAkB,CAAC,OAAO,0CAAE,KAAK,EAAE,CAAC;QACtC,CAAC;QACD,mBAAmB,EAAE,OAAO,CAAC,eAAe,CAAC;KAC9C,CAAC,CAAC;IAEH,MAAM,kBAAkB,GAAG,UAAU,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,IAAI,CAAC;IAExE,MAAM,wBAAwB,GAAG,OAAO,CAAC,GAAG,EAAE;QAC5C,OAAO,CAAC,CAAC,CAAC,UAAU,IAAI,UAAU,IAAI,cAAc,IAAI,cAAc,CAAC,CAAC;IAC1E,CAAC,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,cAAc,EAAE,cAAc,CAAC,CAAC,CAAC;IAE7D,MAAM,eAAe,GAAG,CAAC,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAE1F,MAAM,yBAAyB,GAA2E;QACxG,YAAY,EAAE,SAAS;QACvB,iBAAiB,EAAE,cAAc;QACjC,kBAAkB,EAAE,eAAe;QACnC,cAAc,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;QAC5C,eAAe,EAAE,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;QAC9C,eAAe,EAAE,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;QAC9C,eAAe,EAAE,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;QAClD,kBAAkB,EAAE,WAAW;QAC/B,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,cAAc,CAAC,QAAQ,EAAE;YACxD,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,OAAO;YACzB,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,OAAO;YACzB,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,EAAE,QAAQ;YACvC,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,EAAE,QAAQ;YACvC,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC,EAAE,eAAe;SACjD,CAAC;QACF,WAAW,EAAE,yBAAyB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;QAC1D,cAAc,EAAE,yBAAyB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;QAC7D,UAAU,EAAE,UAAU;QACtB,4EAA4E;QAC5E,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QAClC,SAAS,EAAE,4BAA4B;QACvC,OAAO,EAAE,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,iBAAiB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAChE,MAAM,EAAE,yBAAyB;QACjC,OAAO,EAAE,0BAA0B;QACnC,MAAM,EAAE,CAAC,KAA2B,EAAE,EAAE;YACtC,IAAI,kBAAkB,CAAC,OAAO,EAAE,CAAC;gBAC/B,oBAAoB,CAAC,KAAK,EAAE,kBAAkB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YACjE,CAAC;QACH,CAAC;QACD,KAAK,EAAE,CAAC,KAA2B,EAAE,EAAE;YACrC,IAAI,kBAAkB,CAAC,OAAO,EAAE,CAAC;gBAC/B,oBAAoB,CAAC,KAAK,EAAE,kBAAkB,CAAC,OAAO,EAAE,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAChF,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,EAAE,CAAC;oBAC3B,WAAW,EAAE,CAAC;gBAChB,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,EAAE,CAAC,KAA2B,EAAE,EAAE;YACvC,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,IAAI,QAAQ,IAAI,QAAQ,EAAE,CAAC;gBACzB,OAAO;YACT,CAAC;YACD,MAAM,IAAI,GAAG,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;YACvD,IAAI,CAAC,IAAI,IAAI,CAAC,kBAAkB,CAAC,OAAO,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,CAAC;gBACxE,OAAO;YACT,CAAC;YACD,MAAM,EAAE,GAAG,kBAAkB,CAAC,OAAO,CAAC;YACtC,oEAAoE;YACpE,mEAAmE;YACnE,6BAA6B,CAAC,kBAAkB,CAAC,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;QAClG,CAAC;KACF,CAAC;IAEF,MAAM,OAAO,GAAG,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAC/C,QAAQ,CAAC,YAAY,CACnB,oBAAC,KAAK,IAAC,GAAG,EAAE,SAAS,CAAC,EAAE,EAAE,OAAO,EAAC,QAAQ,EAAC,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,GAAI,EACjH,SAAS,CAAC,OAAO,CAClB,CACF,CAAC;IAEF,OAAO;QACL,mBAAmB;QACnB,gBAAgB;QAChB,OAAO;QACP,aAAa;QACb,yBAAyB;QACzB,kBAAkB;QAClB,UAAU;QACV,UAAU;QACV,cAAc;QACd,iBAAiB;QACjB,mBAAmB;QACnB,UAAU;QACV,mBAAmB;QACnB,uBAAuB;QACvB,cAAc;QACd,iBAAiB;QACjB,kBAAkB;QAClB,wBAAwB;QACxB,WAAW,EAAE,GAAG,EAAE;YAChB,0EAA0E;YAC1E,uEAAuE;YACvE,sEAAsE;YACtE,2DAA2D;YAC3D,2EAA2E;YAC3E,2EAA2E;YAC3E,2EAA2E;YAC3E,iEAAiE;YACjE,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,WAAW,EAAE,CAAC;YAChB,CAAC;QACH,CAAC;QACD,cAAc;QACd,0BAA0B;QAC1B,gBAAgB;KACjB,CAAC;AACJ,CAAC","sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport React, { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport ReactDOM from 'react-dom';\nimport clsx from 'clsx';\n\nimport { useStableCallback, useUniqueId } from '@cloudscape-design/component-toolkit/internal';\n\nimport { useDropdownStatus } from '../../internal/components/dropdown-status';\nimport { fireKeyboardEvent, fireNonCancelableEvent } from '../../internal/events';\nimport { useIMEComposition } from '../../internal/hooks/use-ime-composition';\nimport { getFirstScrollableParent } from '../../internal/utils/scrollable-containers';\nimport Token from '../../token/internal';\nimport { calculateTokenPosition, CaretController, getOwnerSelection } from '../core/caret-controller';\nimport { extractTextFromCaretSpots } from '../core/caret-spot-utils';\nimport {\n findContainingReference,\n getMouseDown,\n isNonTypeablePosition,\n normalizeCollapsedCaret,\n normalizeSelection,\n setMouseDown,\n} from '../core/caret-utils';\nimport { NEXT_TICK_TIMEOUT } from '../core/constants';\nimport { createParagraph, findAllParagraphs } from '../core/dom-utils';\nimport { handleClipboardEvent, handleEditableKeyDown } from '../core/event-handlers';\nimport {\n handleMenuSelection,\n MenuItem,\n MenuItemsHandlers,\n MenuItemsState,\n useMenuItems,\n useMenuLoadMore,\n} from '../core/menu-state';\nimport { extractTokensFromDOM, getPromptText, processTokens } from '../core/token-operations';\nimport { PortalContainer, renderTokensToDOM } from '../core/token-renderer';\nimport {\n enforcePinnedTokenOrdering,\n getCaretPositionAfterPinnedReorder,\n getCaretPositionAfterTokenRemoval,\n mergeConsecutiveTextTokens,\n} from '../core/token-utils';\nimport { detectTriggerTransition } from '../core/trigger-utils';\nimport { isReferenceToken, isTextNode, isTextToken, isTriggerToken } from '../core/type-guards';\nimport { PromptInputProps } from '../interfaces';\nimport { insertTextIntoContentEditable } from '../utils/insert-text-content-editable';\nimport { ShortcutsState, useShortcutsEffects, useShortcutsState } from './use-shortcuts';\n\nimport styles from '../styles.css.js';\nimport testutilStyles from '../test-classes/styles.css.js';\n\n/** Mutable state shared between the editable tokens hook and event handlers. */\nexport interface EditableState {\n skipNextZeroWidthUpdate: boolean;\n menuSelectionTokenId: string | null;\n}\n\nexport function createEditableState(): EditableState {\n return {\n skipNextZeroWidthUpdate: false,\n menuSelectionTokenId: null,\n };\n}\n\n/**\n * Determines if the token array changed structurally and needs a full DOM re-render.\n *\n * Compares token types, IDs, and text values. During normal typing the extracted\n * tokens already match the DOM, so text comparisons won't trigger unnecessary\n * re-renders. External updates (parent replacing tokens) will be detected by\n * the value difference and trigger a re-render.\n *\n * Returns 'none' if no changes, 'text-only' if only token values differ\n * (same count, types, and IDs — covers both text and trigger filter changes),\n * or 'structural' for any other change.\n */\nfunction classifyChange(\n oldTokens: readonly PromptInputProps.InputToken[] | undefined,\n newTokens: readonly PromptInputProps.InputToken[] | undefined\n): 'none' | 'text-only' | 'structural' {\n if (!oldTokens || !newTokens) {\n return 'structural';\n }\n\n if (oldTokens.length !== newTokens.length) {\n return 'structural';\n }\n\n let hasTextDiff = false;\n\n for (let i = 0; i < oldTokens.length; i++) {\n const oldToken = oldTokens[i];\n const newToken = newTokens[i];\n\n if (oldToken.type !== newToken.type) {\n return 'structural';\n }\n\n if (isReferenceToken(oldToken) && isReferenceToken(newToken)) {\n if (oldToken.id !== newToken.id) {\n return 'structural';\n }\n }\n\n if (isTriggerToken(oldToken) && isTriggerToken(newToken)) {\n if (oldToken.id !== newToken.id) {\n return 'structural';\n }\n // Transition between empty and non-empty filter text changes the underline styling.\n const wasEmpty = oldToken.value.length === 0;\n const isEmpty = newToken.value.length === 0;\n if (wasEmpty !== isEmpty) {\n return 'structural';\n }\n if (oldToken.value !== newToken.value) {\n hasTextDiff = true;\n }\n }\n\n if (isTextToken(oldToken) && isTextToken(newToken)) {\n if (oldToken.value !== newToken.value) {\n hasTextDiff = true;\n }\n }\n }\n\n return hasTextDiff ? 'text-only' : 'none';\n}\n\n/**\n * Positions the caret after a menu-selected reference token.\n * Returns true if the caret was positioned (token found), false otherwise.\n */\nfunction positionCaretAfterMenuSelection(\n tokens: readonly PromptInputProps.InputToken[],\n editableState: EditableState,\n caretController: CaretController | null\n): boolean {\n if (!editableState.menuSelectionTokenId || !caretController) {\n return false;\n }\n\n const insertedTokenIndex = tokens.findIndex(t => isReferenceToken(t) && t.id === editableState.menuSelectionTokenId);\n\n if (insertedTokenIndex === -1) {\n return false;\n }\n\n const caretPos = calculateTokenPosition(tokens, insertedTokenIndex);\n caretController.setPosition(caretPos);\n editableState.menuSelectionTokenId = null;\n return true;\n}\n\n/** Finds a trigger token by its ID in the token array. */\nfunction findTriggerTokenById(\n tokens: readonly PromptInputProps.InputToken[],\n triggerId: string\n): PromptInputProps.TriggerToken | null {\n const trigger = tokens.find(token => isTriggerToken(token) && token.id === triggerId);\n if (trigger && isTriggerToken(trigger)) {\n return trigger;\n }\n return null;\n}\n\n/** Configuration for the useTokenMode hook — all props needed to drive token-mode behavior. */\nexport interface UseTokenModeConfig {\n editableElementRef: React.RefObject<HTMLDivElement>;\n caretControllerRef: React.MutableRefObject<CaretController | null>;\n\n tokens?: readonly PromptInputProps.InputToken[];\n tokensToText?: (tokens: readonly PromptInputProps.InputToken[]) => string;\n menus?: readonly PromptInputProps.MenuDefinition[];\n disabled?: boolean;\n readOnly?: boolean;\n autoFocus?: boolean;\n placeholder?: string;\n invalid?: boolean;\n warning?: boolean;\n ariaLabel?: string;\n ariaLabelledby?: string;\n ariaDescribedby?: string;\n ariaRequired?: boolean;\n disableBrowserAutocorrect?: boolean;\n spellcheck?: boolean;\n\n onChange: (detail: { value: string; tokens: PromptInputProps.InputToken[] }) => void;\n onTriggerDetected?: (detail: PromptInputProps.TriggerDetectedDetail) => boolean;\n onAction?: PromptInputProps['onAction'];\n onBlur?: PromptInputProps['onBlur'];\n onFocus?: PromptInputProps['onFocus'];\n onKeyDown?: PromptInputProps['onKeyDown'];\n onKeyUp?: PromptInputProps['onKeyUp'];\n onMenuItemSelect?: PromptInputProps['onMenuItemSelect'];\n onMenuFilter?: PromptInputProps['onMenuFilter'];\n onMenuLoadItems?: PromptInputProps['onMenuLoadItems'];\n\n i18nStrings?: PromptInputProps['i18nStrings'];\n\n adjustInputHeight: () => void;\n}\n\n/** Return value of useTokenMode — state, handlers, and attributes consumed by TokenMode component. */\nexport interface UseTokenModeResult {\n portalContainersRef: React.MutableRefObject<Map<string, PortalContainer>>;\n /** Snapshot of portal containers for rendering portals. Updated after each renderTokensToDOM call. */\n portalContainers: PortalContainer[];\n /** Portal elements to render — renders Token components into DOM containers via createPortal. */\n portals: React.ReactPortal[];\n\n editableState: EditableState;\n\n editableElementAttributes: React.HTMLAttributes<HTMLDivElement> & { 'data-placeholder'?: string };\n\n activeTriggerToken: PromptInputProps.TriggerToken | null;\n activeMenu: PromptInputProps.MenuDefinition | null;\n menuIsOpen: boolean;\n menuFilterText: string;\n triggerWrapperRef: React.MutableRefObject<HTMLElement | null>;\n triggerWrapperReady: boolean;\n\n menuListId: string;\n menuFooterControlId: string;\n highlightedMenuOptionId: string | undefined;\n menuItemsState: MenuItemsState;\n menuItemsHandlers: MenuItemsHandlers;\n menuDropdownStatus: ReturnType<typeof useDropdownStatus> | null;\n shouldRenderMenuDropdown: boolean;\n\n handleInput: () => void;\n\n handleLoadMore: () => void;\n\n tokenOperationAnnouncement: string;\n\n markTokensAsSent: (tokens: readonly PromptInputProps.InputToken[]) => void;\n}\n\ninterface ProcessorConfig {\n tokens?: readonly PromptInputProps.InputToken[];\n menus?: readonly PromptInputProps.MenuDefinition[];\n tokensToText?: (tokens: readonly PromptInputProps.InputToken[]) => string;\n onChange: (detail: { value: string; tokens: PromptInputProps.InputToken[] }) => void;\n onTriggerDetected?: (detail: PromptInputProps.TriggerDetectedDetail) => boolean;\n state: ShortcutsState;\n}\n\n/**\n * Processes token changes from both user input and external (parent) updates.\n *\n * For user input: runs trigger detection on extracted DOM tokens and emits\n * the processed result via onChange.\n *\n * For external updates: detects if the parent provided new tokens that need\n * trigger detection or ID assignment, and emits corrected tokens if so.\n * Skips processing when the tokens reference matches what we last emitted\n * (for example, the parent is echoing back our own onChange).\n */\nfunction useTokenProcessor(config: ProcessorConfig) {\n const { tokens, menus, tokensToText, onChange, onTriggerDetected, state } = config;\n\n const emitTokenChange = useStableCallback((newTokens: PromptInputProps.InputToken[]) => {\n const value = tokensToText ? tokensToText(newTokens) : getPromptText(newTokens);\n state.markTokensAsSent(newTokens);\n onChange({ value, tokens: newTokens });\n });\n\n const markCancelledTriggers = useStableCallback((cancelledIds: Set<string>) => {\n for (const id of cancelledIds) {\n state.cancelledTriggerIds.current.add(id);\n // Prevent opening the menu if the active trigger was cancelled\n if (state.caretInTrigger === id) {\n state.setCaretInTrigger(null);\n }\n }\n });\n\n /** Processes tokens extracted from the DOM after user input. */\n const processUserInput = useStableCallback((inputTokens: PromptInputProps.InputToken[]) => {\n const { tokens: processed, cancelledIds } = processTokens(\n inputTokens,\n { menus, tokensToText },\n {\n source: 'user-input',\n detectTriggers: true,\n },\n onTriggerDetected,\n state.cancelledTriggerIds.current\n );\n\n markCancelledTriggers(cancelledIds);\n emitTokenChange(processed);\n });\n\n /** Processes external token updates from the parent component. */\n useEffect(() => {\n // Skip if these are the tokens we just emitted — the parent is echoing back our onChange\n if (state.lastEmittedTokensRef.current === tokens) {\n return;\n }\n\n if (!tokens) {\n return;\n }\n\n const { tokens: processed, cancelledIds } = processTokens(\n tokens,\n { menus, tokensToText },\n {\n source: 'external',\n detectTriggers: true,\n },\n undefined,\n state.cancelledTriggerIds.current\n );\n\n markCancelledTriggers(cancelledIds);\n\n // Only emit if processing actually changed the tokens (e.g., new triggers detected,\n // IDs assigned). Compare by type, value, and ID to avoid false positives from\n // reference inequality after processTokens creates new token objects.\n const hasChanges =\n processed.length !== tokens.length ||\n processed.some((t, i) => {\n const orig = tokens[i];\n if (t.type !== orig.type || t.value !== orig.value) {\n return true;\n }\n if (isReferenceToken(t) && isReferenceToken(orig) && t.id !== orig.id) {\n return true;\n }\n if (isTriggerToken(t) && isTriggerToken(orig) && t.id !== orig.id) {\n return true;\n }\n return false;\n });\n\n if (hasChanges) {\n emitTokenChange(processed);\n } else {\n // Mark as seen even when no changes — prevents re-processing on next render\n state.lastEmittedTokensRef.current = tokens;\n }\n }, [tokens, menus, tokensToText, state, emitTokenChange, markCancelledTriggers]);\n\n return {\n processUserInput,\n };\n}\n\n/** Encapsulates all token-mode logic: trigger detection, menu state, keyboard handling, and rendering. */\nexport function useTokenMode(config: UseTokenModeConfig): UseTokenModeResult {\n const {\n editableElementRef,\n caretControllerRef,\n tokens,\n tokensToText,\n menus,\n disabled,\n readOnly,\n autoFocus,\n placeholder,\n invalid,\n warning,\n ariaLabel,\n ariaLabelledby,\n ariaDescribedby,\n ariaRequired,\n disableBrowserAutocorrect,\n spellcheck,\n onChange,\n onTriggerDetected,\n onAction,\n onBlur,\n onFocus,\n onKeyDown,\n onKeyUp,\n onMenuItemSelect,\n onMenuFilter,\n onMenuLoadItems,\n i18nStrings,\n adjustInputHeight,\n } = config;\n\n const shortcutsState = useShortcutsState();\n\n const { markTokensAsSent } = shortcutsState;\n\n const activeTriggerToken = useMemo((): PromptInputProps.TriggerToken | null => {\n if (!tokens || !caretControllerRef.current) {\n return null;\n }\n\n const activeTriggerID = caretControllerRef.current.findActiveTrigger()?.id || null;\n\n if (!activeTriggerID) {\n return null;\n }\n\n if (shortcutsState.cancelledTriggerIds.current.has(activeTriggerID)) {\n return null;\n }\n\n return findTriggerTokenById(tokens, activeTriggerID);\n // eslint-disable-next-line react-hooks/exhaustive-deps -- caretInTrigger is the invalidation signal from useShortcutsEffects\n }, [tokens, caretControllerRef, shortcutsState.caretInTrigger]);\n\n const activeMenu = useMemo(\n () =>\n activeTriggerToken && shortcutsState.caretInTrigger && !disabled && !readOnly\n ? (menus?.find(m => m.trigger === activeTriggerToken.triggerChar) ?? null)\n : null,\n [activeTriggerToken, shortcutsState.caretInTrigger, menus, disabled, readOnly]\n );\n\n const menuIsOpen = !!activeMenu;\n const menuFilterText = activeTriggerToken?.value ?? '';\n\n const processor = useTokenProcessor({\n tokens,\n menus,\n tokensToText,\n onChange,\n onTriggerDetected,\n state: shortcutsState,\n });\n\n const { processUserInput } = processor;\n\n useShortcutsEffects({\n tokens,\n editableElementRef,\n state: shortcutsState,\n activeTriggerToken,\n caretController: caretControllerRef,\n });\n\n const triggerWrapperRef = useRef<HTMLElement | null>(null);\n const [triggerVisible, setTriggerVisible] = useState(true);\n\n // Resolve the trigger DOM element synchronously during render from the tracked map.\n // The Dropdown's contentKey (which includes activeTriggerToken.id) handles\n // repositioning when the active trigger changes — no open/close toggle needed.\n if (activeTriggerToken?.id && menuIsOpen) {\n triggerWrapperRef.current = shortcutsState.triggerElementsRef.current.get(activeTriggerToken.id) ?? null;\n } else {\n triggerWrapperRef.current = null;\n }\n\n const triggerWrapperReady = !!triggerWrapperRef.current && menuIsOpen;\n\n // Hide menu dropdown when trigger scrolls out of the editable container\n useEffect(() => {\n if (!menuIsOpen || !triggerWrapperRef.current || !editableElementRef.current) {\n setTriggerVisible(true);\n return;\n }\n\n const trigger = triggerWrapperRef.current;\n const container = editableElementRef.current;\n\n const checkTriggerVisibility = () => {\n const triggerRect = trigger.getBoundingClientRect();\n const containerRect = container.getBoundingClientRect();\n\n const isOutOfView = triggerRect.bottom < containerRect.top || triggerRect.top > containerRect.bottom;\n setTriggerVisible(!isOutOfView);\n };\n\n checkTriggerVisibility();\n\n container.addEventListener('scroll', checkTriggerVisibility);\n\n const scrollableParent = getFirstScrollableParent(container);\n if (scrollableParent) {\n scrollableParent.addEventListener('scroll', checkTriggerVisibility);\n }\n\n return () => {\n container.removeEventListener('scroll', checkTriggerVisibility);\n if (scrollableParent) {\n scrollableParent.removeEventListener('scroll', checkTriggerVisibility);\n }\n };\n }, [menuIsOpen, editableElementRef, activeTriggerToken]);\n\n const portalContainersRef = useRef<Map<string, PortalContainer>>(new Map());\n const [portalContainers, setPortalContainers] = useState<PortalContainer[]>([]);\n\n const renderTokens = useCallback(\n (tokens: readonly PromptInputProps.InputToken[], target: HTMLElement) => {\n const result = renderTokensToDOM(\n tokens,\n target,\n portalContainersRef.current,\n shortcutsState.triggerElementsRef.current,\n shortcutsState.cancelledTriggerIds.current\n );\n\n // Update trigger element map from render result\n shortcutsState.triggerElementsRef.current = new Map(result.triggerElements);\n\n setPortalContainers(Array.from(portalContainersRef.current.values()));\n return result;\n },\n [shortcutsState.triggerElementsRef, shortcutsState.cancelledTriggerIds, portalContainersRef]\n );\n\n useLayoutEffect(() => {\n if (editableElementRef.current && !caretControllerRef.current) {\n caretControllerRef.current = new CaretController(editableElementRef.current);\n }\n }, [editableElementRef, caretControllerRef]);\n\n const editableState = useRef(createEditableState()).current;\n\n const [tokenOperationAnnouncement, setTokenOperationAnnouncement] = useState<string>('');\n\n const announceTokenOperation = useStableCallback((message: string) => {\n setTokenOperationAnnouncement(message);\n });\n\n const lastRenderedTokensRef = useRef<readonly PromptInputProps.InputToken[] | undefined>(undefined);\n const lastDisabledRef = useRef(disabled);\n const lastReadOnlyRef = useRef(readOnly);\n\n // Refs to avoid recreating handleInput when these change (new array reference each render).\n const menusRef = useRef(menus);\n menusRef.current = menus;\n\n // Stable ref so the compositionend callback always calls the latest handleInput.\n const handleInputRef = useRef<() => void>(() => {});\n\n // `composing` React state drives placeholder visibility — hidden while the user\n // is actively composing CJK characters so intermediate characters don't flash\n // the placeholder on and off.\n const [composing, setComposing] = useState(false);\n\n // Track IME composition state so the onInput handler skips intermediate characters\n // during CJK (and other) composition sequences. The onCompositionEnd callback\n // fires synchronously when the user commits a composed character — handleInput\n // runs unconditionally there. `isComposing()` stays true briefly after compositionend\n // (until the next animation frame) to block the spurious Enter keydown that some\n // browsers fire immediately after compositionend.\n const { isComposing } = useIMEComposition(editableElementRef, {\n onCompositionStart: () => setComposing(true),\n onCompositionEnd: () => {\n setComposing(false);\n handleInputRef.current();\n },\n });\n\n const handleInput = useCallback(() => {\n if (!editableElementRef.current) {\n return;\n }\n\n const ownerDoc = editableElementRef.current.ownerDocument ?? document;\n const cc = caretControllerRef.current;\n\n if (cc) {\n cc.capture();\n }\n\n if (editableState.skipNextZeroWidthUpdate) {\n editableState.skipNextZeroWidthUpdate = false;\n }\n\n const { movedTextNode } = extractTextFromCaretSpots(portalContainersRef.current, true);\n\n // Extract filter text from cancelled triggers, moving it to the paragraph level\n for (const id of shortcutsState.cancelledTriggerIds.current) {\n const trigger =\n shortcutsState.triggerElementsRef.current.get(id) ??\n (editableElementRef.current.querySelector(`#${CSS.escape(id)}`) as HTMLElement | null);\n if (!trigger) {\n continue;\n }\n const filterText = (trigger.textContent || '').substring(1);\n if (!filterText) {\n continue;\n }\n\n let caretInTrigger = false;\n const selection = editableElementRef.current ? getOwnerSelection(editableElementRef.current) : null;\n if (selection?.rangeCount && trigger.contains(selection.getRangeAt(0).startContainer)) {\n caretInTrigger = true;\n }\n\n const textNode = ownerDoc.createTextNode(filterText);\n trigger.parentNode?.insertBefore(textNode, trigger.nextSibling);\n trigger.textContent = (trigger.textContent || '').charAt(0);\n\n if (caretInTrigger && !movedTextNode) {\n if (cc) {\n cc.positionAfterText(textNode);\n }\n }\n }\n\n if (movedTextNode && cc) {\n cc.positionAfterText(movedTextNode);\n }\n\n const directTextNodes = Array.from(editableElementRef.current.childNodes).filter(\n node => isTextNode(node) && node.textContent?.trim()\n );\n\n if (directTextNodes.length > 0) {\n if (cc) {\n cc.capture();\n }\n\n let targetP = findAllParagraphs(editableElementRef.current)[0];\n if (!targetP) {\n targetP = createParagraph();\n editableElementRef.current.appendChild(targetP);\n }\n\n directTextNodes.forEach(textNode => {\n targetP!.appendChild(textNode);\n });\n\n if (cc) {\n cc.restore();\n }\n }\n\n let extractedTokens = extractTokensFromDOM(\n editableElementRef.current,\n menusRef.current,\n portalContainersRef.current\n );\n\n // When a new trigger appears in the DOM, render immediately to ensure the\n // trigger element exists before subsequent caret operations.\n const newTriggers = extractedTokens.filter(isTriggerToken);\n const existingTriggerIds = new Set(shortcutsState.triggerElementsRef.current.keys());\n if (newTriggers.some(t => !existingTriggerIds.has(t.id))) {\n renderTokens(extractedTokens, editableElementRef.current);\n }\n\n const movedTokens = enforcePinnedTokenOrdering(extractedTokens);\n const tokensWereMoved = movedTokens.some((t, i) => t !== extractedTokens[i]);\n\n const mergedTokens = mergeConsecutiveTextTokens(movedTokens);\n\n if (tokensWereMoved) {\n const caretPosBeforeMove = cc?.getPosition() ?? 0;\n const adjustedPosition = getCaretPositionAfterPinnedReorder(extractedTokens, mergedTokens, caretPosBeforeMove);\n\n extractedTokens = mergedTokens;\n\n renderTokens(mergedTokens, editableElementRef.current);\n\n if (editableElementRef.current && ownerDoc.activeElement === editableElementRef.current && cc) {\n cc.setPosition(adjustedPosition);\n }\n }\n\n processUserInput(extractedTokens);\n\n adjustInputHeight();\n }, [\n processUserInput,\n adjustInputHeight,\n editableElementRef,\n caretControllerRef,\n portalContainersRef,\n editableState,\n renderTokens,\n shortcutsState.triggerElementsRef,\n shortcutsState.cancelledTriggerIds,\n ]);\n\n // Keep the ref in sync so the compositionend handler always calls the latest version.\n handleInputRef.current = handleInput;\n\n // Token render effect\n useLayoutEffect(() => {\n if (!editableElementRef.current) {\n return;\n }\n\n const cc = caretControllerRef.current;\n const orderedTokens = tokens ? enforcePinnedTokenOrdering(tokens) : tokens;\n const prevOrderedTokens = lastRenderedTokensRef.current;\n\n const stateChanged = lastDisabledRef.current !== disabled || lastReadOnlyRef.current !== readOnly;\n lastDisabledRef.current = disabled;\n lastReadOnlyRef.current = readOnly;\n\n const triggerTransition = detectTriggerTransition(lastRenderedTokensRef.current, orderedTokens);\n\n const changeType = classifyChange(lastRenderedTokensRef.current, orderedTokens);\n const needsRerender = stateChanged || changeType !== 'none' || triggerTransition > 0;\n\n if (!needsRerender) {\n positionCaretAfterMenuSelection(orderedTokens ?? [], editableState, cc);\n\n lastRenderedTokensRef.current = orderedTokens;\n return;\n }\n\n // Text-only changes from user input are already reflected in the DOM by the\n // browser's native editing. Skip re-render to preserve cursor position —\n // Text-only changes from user input are already reflected in the DOM by the\n // browser's native editing. Skip re-render to preserve cursor position —\n // re-rendering would read a corrupted position from normalizeCaretIntoTrigger.\n // External updates still need a re-render.\n if (\n changeType === 'text-only' &&\n !stateChanged &&\n triggerTransition === 0 &&\n shortcutsState.lastEmittedTokensRef.current === tokens\n ) {\n lastRenderedTokensRef.current = orderedTokens;\n return;\n }\n\n if (triggerTransition > 0 && orderedTokens && cc) {\n renderTokens(orderedTokens, editableElementRef.current);\n lastRenderedTokensRef.current = orderedTokens;\n cc.setPosition(triggerTransition);\n adjustInputHeight();\n return;\n }\n\n // A new trigger appeared (e.g. user typed a trigger char, possibly replacing a selection).\n // Position the caret after the trigger character so the user can start typing a filter.\n const newTrigger =\n orderedTokens &&\n prevOrderedTokens &&\n orderedTokens.find(t => isTriggerToken(t) && !prevOrderedTokens.some(p => isTriggerToken(p) && p.id === t.id));\n if (newTrigger && isTriggerToken(newTrigger) && cc) {\n renderTokens(orderedTokens, editableElementRef.current);\n lastRenderedTokensRef.current = orderedTokens;\n // Use the saved position from insertText if available, otherwise position after the trigger char\n const savedPos = cc.getSavedPosition();\n if (savedPos !== null) {\n cc.setPosition(savedPos);\n } else {\n const triggerIndex = orderedTokens.indexOf(newTrigger);\n const posBeforeTrigger = triggerIndex > 0 ? calculateTokenPosition(orderedTokens, triggerIndex - 1) : 0;\n cc.setPosition(posBeforeTrigger + newTrigger.triggerChar.length);\n }\n adjustInputHeight();\n return;\n }\n\n if (\n lastRenderedTokensRef.current &&\n orderedTokens &&\n lastRenderedTokensRef.current.length === 0 &&\n orderedTokens.length === 0\n ) {\n lastRenderedTokensRef.current = orderedTokens;\n return;\n }\n\n if (editableState.menuSelectionTokenId && cc) {\n const insertedTokenIndex = (orderedTokens ?? []).findIndex(\n t => isReferenceToken(t) && t.id === editableState.menuSelectionTokenId\n );\n\n if (insertedTokenIndex !== -1) {\n renderTokens(orderedTokens ?? [], editableElementRef.current);\n positionCaretAfterMenuSelection(orderedTokens ?? [], editableState, cc);\n\n lastRenderedTokensRef.current = orderedTokens;\n adjustInputHeight();\n return;\n }\n }\n\n lastRenderedTokensRef.current = orderedTokens;\n\n if (cc) {\n cc.capture();\n }\n\n renderTokens(orderedTokens ?? [], editableElementRef.current);\n\n if (positionCaretAfterMenuSelection(orderedTokens ?? [], editableState, cc)) {\n adjustInputHeight();\n return;\n }\n\n if (cc) {\n const savedPosition = cc.getSavedPosition();\n const restoredPosition = getCaretPositionAfterTokenRemoval(\n savedPosition,\n prevOrderedTokens ?? [],\n orderedTokens ?? []\n );\n\n if (restoredPosition !== null) {\n cc.setPosition(restoredPosition);\n } else {\n cc.restore();\n }\n }\n\n adjustInputHeight();\n }, [\n disabled,\n readOnly,\n tokens,\n adjustInputHeight,\n caretControllerRef,\n editableElementRef,\n portalContainersRef,\n editableState,\n renderTokens,\n shortcutsState,\n ]);\n\n useEffect(() => {\n const handleSelectionChange = () => {\n const sel = editableElementRef.current ? getOwnerSelection(editableElementRef.current) : null;\n if (!sel?.rangeCount || !editableElementRef.current?.contains(sel.getRangeAt(0).startContainer)) {\n return;\n }\n // Skip caret normalization during mousedown — the user may be starting a\n // drag selection from a caret-spot position adjacent to a reference.\n if (!getMouseDown()) {\n normalizeCollapsedCaret(sel);\n }\n normalizeSelection(sel);\n };\n const handleMouseDown = () => {\n setMouseDown(true);\n };\n const handleMouseUp = () => {\n setMouseDown(false);\n const sel = editableElementRef.current ? getOwnerSelection(editableElementRef.current) : null;\n if (!sel?.rangeCount || !editableElementRef.current?.contains(sel.getRangeAt(0).startContainer)) {\n return;\n }\n normalizeCollapsedCaret(sel);\n normalizeSelection(sel);\n\n // Deferred re-check: browsers may finalize caret position after mouseup\n /* istanbul ignore next -- browser mouseup normalization covered by integ tests */\n requestAnimationFrame(() => {\n const sel = editableElementRef.current ? getOwnerSelection(editableElementRef.current) : null;\n if (!sel?.rangeCount) {\n return;\n }\n\n const range = sel.getRangeAt(0);\n if (!range.collapsed) {\n const startBad = isNonTypeablePosition(range.startContainer);\n const endBad = isNonTypeablePosition(range.endContainer);\n\n if (startBad) {\n const ref = findContainingReference(range.startContainer);\n if (ref?.parentNode) {\n const index = Array.from(ref.parentNode.childNodes).indexOf(ref as ChildNode);\n range.setStart(ref.parentNode, index);\n }\n }\n if (endBad) {\n const ref = findContainingReference(range.endContainer);\n if (ref?.parentNode) {\n const index = Array.from(ref.parentNode.childNodes).indexOf(ref as ChildNode);\n range.setEnd(ref.parentNode, index + 1);\n }\n }\n }\n\n normalizeCollapsedCaret(sel);\n normalizeSelection(sel);\n });\n };\n\n const ownerDoc = editableElementRef.current?.ownerDocument ?? document;\n const element = editableElementRef.current;\n // selectionchange only fires on document — containment is checked inside the handler.\n ownerDoc.addEventListener('selectionchange', handleSelectionChange);\n // mousedown/mouseup scoped to the element to avoid reacting to clicks elsewhere.\n element?.addEventListener('mousedown', handleMouseDown);\n element?.addEventListener('mouseup', handleMouseUp);\n\n return () => {\n ownerDoc.removeEventListener('selectionchange', handleSelectionChange);\n element?.removeEventListener('mousedown', handleMouseDown);\n element?.removeEventListener('mouseup', handleMouseUp);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps -- only needs to run on mount\n }, []);\n\n const handleMenuSelect = useStableCallback((option: MenuItem) => {\n if (!activeMenu || !activeTriggerToken || !tokens) {\n return;\n }\n\n shortcutsState.setCaretInTrigger(null);\n\n const result = handleMenuSelection(\n tokens,\n {\n value: option.option.value || '',\n label: option.option.label || option.option.value || '',\n },\n activeMenu.id,\n activeMenu.useAtStart ?? false,\n activeTriggerToken\n );\n\n const value = tokensToText ? tokensToText(result.tokens) : getPromptText(result.tokens);\n markTokensAsSent(result.tokens);\n\n editableState.menuSelectionTokenId = result.insertedToken.id || null;\n\n const isPinned = activeMenu.useAtStart ?? false;\n const announcement = isPinned\n ? i18nStrings?.tokenPinnedAriaLabel?.(result.insertedToken)\n : i18nStrings?.tokenInsertedAriaLabel?.(result.insertedToken);\n\n if (announcement) {\n announceTokenOperation(announcement);\n }\n\n onChange({ value, tokens: result.tokens });\n\n fireNonCancelableEvent(onMenuItemSelect, {\n menuId: activeMenu.id,\n option: option.option,\n });\n });\n\n const [menuItemsState, menuItemsHandlers] = useMenuItems({\n menu: activeMenu ?? { id: '', trigger: '', options: [] },\n filterText: menuFilterText,\n onSelectItem: handleMenuSelect,\n });\n\n const menuStateRef = useRef({\n itemsState: menuItemsState,\n itemsHandlers: menuItemsHandlers,\n isOpen: menuIsOpen,\n });\n menuStateRef.current = {\n itemsState: menuItemsState,\n itemsHandlers: menuItemsHandlers,\n isOpen: menuIsOpen,\n };\n\n const closeMenu = useStableCallback(() => {\n shortcutsState.menuJustClosed.current = shortcutsState.caretInTrigger;\n shortcutsState.setCaretInTrigger(null);\n });\n\n const handleEditableElementKeyDown = useStableCallback((event: React.KeyboardEvent<HTMLDivElement>) => {\n handleEditableKeyDown(event, {\n editableElement: editableElementRef.current,\n editableState,\n caretController: caretControllerRef.current,\n tokens,\n tokensToText,\n disabled,\n readOnly,\n i18nStrings,\n announceTokenOperation,\n getMenuOpen: () => menuStateRef.current.isOpen,\n getMenuItemsState: () => menuStateRef.current.itemsState,\n getMenuItemsHandlers: () => menuStateRef.current.itemsHandlers,\n getMenuStatusType: () => activeMenu?.statusType,\n closeMenu,\n onAction: onAction ? detail => fireNonCancelableEvent(onAction, detail) : undefined,\n onChange,\n markTokensAsSent,\n onKeyDown,\n isComposing,\n });\n });\n\n const handleEditableElementFocus = useStableCallback(() => {\n if (onFocus) {\n fireNonCancelableEvent(onFocus);\n }\n });\n\n const handleEditableElementBlur = useStableCallback(() => {\n if (onBlur) {\n fireNonCancelableEvent(onBlur);\n }\n });\n\n useEffect(() => {\n if (autoFocus && editableElementRef.current) {\n editableElementRef.current.focus();\n }\n // Intentionally run only on mount — autoFocus should fire once\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useEffect(() => {\n const ownerWindow = (editableElementRef.current?.ownerDocument ?? document).defaultView ?? window;\n const handleResize = () => adjustInputHeight();\n ownerWindow.addEventListener('resize', handleResize);\n return () => {\n ownerWindow.removeEventListener('resize', handleResize);\n };\n }, [adjustInputHeight, editableElementRef]);\n\n const menuLoadMoreResult = useMenuLoadMore({\n menu: activeMenu ?? { id: '', trigger: '', options: [] },\n statusType: activeMenu?.statusType ?? 'finished',\n onLoadItems: detail => {\n fireNonCancelableEvent(onMenuLoadItems, detail);\n },\n onLoadMoreItems: () => {\n fireNonCancelableEvent(onMenuLoadItems, {\n menuId: activeMenu?.id ?? '',\n filteringText: undefined,\n firstPage: false,\n samePage: false,\n });\n },\n });\n\n const menuLoadMoreHandlers = activeMenu ? menuLoadMoreResult : null;\n\n useEffect(() => {\n if (menuIsOpen && activeMenu && menuLoadMoreHandlers) {\n menuLoadMoreHandlers.fireLoadMoreOnMenuOpen();\n }\n }, [menuIsOpen, activeMenu, menuLoadMoreHandlers]);\n\n const prevMenuOpenRef = useRef(false);\n const prevItemsLengthRef = useRef(0);\n\n useEffect(() => {\n const justOpened = menuIsOpen && !prevMenuOpenRef.current;\n const itemsLoaded =\n menuIsOpen && prevMenuOpenRef.current && prevItemsLengthRef.current === 0 && menuItemsState.items.length > 0;\n\n if ((justOpened || itemsLoaded) && menuItemsHandlers && menuItemsState && menuItemsState.items.length > 0) {\n // Reset highlight so goHomeWithKeyboard triggers a state change even at index 0\n menuItemsHandlers.resetHighlightWithKeyboard();\n setTimeout(() => {\n menuItemsHandlers?.goHomeWithKeyboard();\n }, NEXT_TICK_TIMEOUT);\n }\n\n prevMenuOpenRef.current = menuIsOpen;\n prevItemsLengthRef.current = menuItemsState?.items.length ?? 0;\n // eslint-disable-next-line react-hooks/exhaustive-deps -- only needs to react to menu open/close and item count changes\n }, [menuIsOpen, menuItemsState.items.length]);\n\n useEffect(() => {\n if (activeTriggerToken && activeMenu && onMenuFilter) {\n fireNonCancelableEvent(onMenuFilter, {\n menuId: activeMenu.id,\n filteringText: activeTriggerToken.value,\n });\n }\n }, [activeTriggerToken, activeMenu, onMenuFilter]);\n\n const handleLoadMore = useStableCallback(() => {\n if (menuLoadMoreHandlers) {\n menuLoadMoreHandlers.fireLoadMoreOnScroll();\n }\n });\n\n const menuListId = useUniqueId('menu-list');\n const menuFooterControlId = useUniqueId('menu-footer');\n const highlightedMenuOptionIdSource = useUniqueId();\n const highlightedMenuOptionId = menuItemsState?.highlightedOption ? highlightedMenuOptionIdSource : undefined;\n\n const menuDropdownStatusResult = useDropdownStatus({\n ...(activeMenu ?? {}),\n isEmpty: !menuItemsState || menuItemsState.items.length === 0,\n recoveryText: i18nStrings?.menuRecoveryText,\n errorIconAriaLabel: i18nStrings?.menuErrorIconAriaLabel,\n loadingText: i18nStrings?.menuLoadingText,\n finishedText: i18nStrings?.menuFinishedText,\n errorText: i18nStrings?.menuErrorText,\n onRecoveryClick: () => {\n if (menuLoadMoreHandlers) {\n menuLoadMoreHandlers.fireLoadMoreOnRecoveryClick();\n }\n editableElementRef.current?.focus();\n },\n hasRecoveryCallback: Boolean(onMenuLoadItems),\n });\n\n const menuDropdownStatus = activeMenu ? menuDropdownStatusResult : null;\n\n const shouldRenderMenuDropdown = useMemo(() => {\n return !!(menuIsOpen && activeMenu && menuItemsState && triggerVisible);\n }, [menuIsOpen, activeMenu, menuItemsState, triggerVisible]);\n\n const showPlaceholder = !!(placeholder && (!tokens || tokens.length === 0) && !composing);\n\n const editableElementAttributes: React.HTMLAttributes<HTMLDivElement> & { 'data-placeholder'?: string } = {\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledby,\n 'aria-describedby': ariaDescribedby,\n 'aria-invalid': invalid ? 'true' : undefined,\n 'aria-disabled': disabled ? 'true' : undefined,\n 'aria-readonly': readOnly ? 'true' : undefined,\n 'aria-required': ariaRequired ? 'true' : undefined,\n 'data-placeholder': placeholder,\n className: clsx(styles.textarea, testutilStyles.textarea, {\n [styles.invalid]: invalid,\n [styles.warning]: warning,\n [styles['textarea-disabled']]: disabled,\n [styles['textarea-readonly']]: readOnly,\n [styles['placeholder-visible']]: showPlaceholder,\n }),\n autoCorrect: disableBrowserAutocorrect ? 'off' : undefined,\n autoCapitalize: disableBrowserAutocorrect ? 'off' : undefined,\n spellCheck: spellcheck,\n // When disabled, omit tabIndex entirely so the div is not focusable at all.\n tabIndex: disabled ? undefined : 0,\n onKeyDown: handleEditableElementKeyDown,\n onKeyUp: onKeyUp && (event => fireKeyboardEvent(onKeyUp, event)),\n onBlur: handleEditableElementBlur,\n onFocus: handleEditableElementFocus,\n onCopy: (event: React.ClipboardEvent) => {\n if (editableElementRef.current) {\n handleClipboardEvent(event, editableElementRef.current, false);\n }\n },\n onCut: (event: React.ClipboardEvent) => {\n if (editableElementRef.current) {\n handleClipboardEvent(event, editableElementRef.current, !disabled && !readOnly);\n if (!disabled && !readOnly) {\n handleInput();\n }\n }\n },\n onPaste: (event: React.ClipboardEvent) => {\n event.preventDefault();\n if (disabled || readOnly) {\n return;\n }\n const text = event.clipboardData.getData('text/plain');\n if (!text || !editableElementRef.current || !caretControllerRef.current) {\n return;\n }\n const cc = caretControllerRef.current;\n // Pass undefined for caretStart/caretEnd — let insertText calculate\n // the position after the selection is deleted by replaceSelection.\n insertTextIntoContentEditable(editableElementRef.current, text, undefined, undefined, cc, true);\n },\n };\n\n const portals = portalContainers.map(container =>\n ReactDOM.createPortal(\n <Token key={container.id} variant=\"inline\" label={container.label} disabled={!!disabled} readOnly={!!readOnly} />,\n container.element\n )\n );\n\n return {\n portalContainersRef,\n portalContainers,\n portals,\n editableState,\n editableElementAttributes,\n activeTriggerToken,\n activeMenu,\n menuIsOpen,\n menuFilterText,\n triggerWrapperRef,\n triggerWrapperReady,\n menuListId,\n menuFooterControlId,\n highlightedMenuOptionId,\n menuItemsState,\n menuItemsHandlers,\n menuDropdownStatus,\n shouldRenderMenuDropdown,\n handleInput: () => {\n // Skip processing during IME composition — intermediate input events fire\n // for each keystroke during CJK composition and must not trigger token\n // detection. The onCompositionEnd callback calls handleInput directly\n // (bypassing this guard) once the final text is committed.\n // Note: we use `composing` (React state) rather than `isComposing()` (ref)\n // so that input events after compositionend — such as the user immediately\n // deleting the committed text — are processed normally. The spurious-Enter\n // guard in the keyboard handler uses `isComposing()` separately.\n if (!composing) {\n handleInput();\n }\n },\n handleLoadMore,\n tokenOperationAnnouncement,\n markTokensAsSent,\n };\n}\n"]}