From 8d2a3a59c0bd208a6ecb826a709d6389b2a72aa4 Mon Sep 17 00:00:00 2001
From: Ben Elan <no-reply@benelan.dev>
Date: Wed, 19 Jul 2023 09:09:03 -0700
Subject: [PATCH] fix(color-picker): maintains correct numbering system when
 entering invalid RGB value (#7327)

**Related Issue:** #5978

## Summary

Entering an RGB channel value greater than 255 or less than 0 clamps the
value so it doesn't become invalid. This caused the numbering system to
revert to the default `latn`.

It is a timing issue with `calcite-input`'s lifecycle methods and it
reproduces outside of `calcite-color-picker`. Here is a demo showing
that using a timeout or requesting an animation frame (kind of) fixes
the issue:

https://codepen.io/benesri/pen/vYQjYJK

The issue isn't reproducible in `calcite-input-number`.
---
 .../color-picker-hex-input.e2e.ts             | 60 ++++++------
 .../color-picker-hex-input.tsx                | 16 ++--
 .../color-picker/color-picker.e2e.ts          | 91 ++++++++++---------
 .../components/color-picker/color-picker.tsx  | 15 +--
 .../src/components/input/input.tsx            | 11 ---
 5 files changed, 92 insertions(+), 101 deletions(-)

diff --git a/packages/calcite-components/src/components/color-picker-hex-input/color-picker-hex-input.e2e.ts b/packages/calcite-components/src/components/color-picker-hex-input/color-picker-hex-input.e2e.ts
index ac39fdbe630..7d8c3380c28 100644
--- a/packages/calcite-components/src/components/color-picker-hex-input/color-picker-hex-input.e2e.ts
+++ b/packages/calcite-components/src/components/color-picker-hex-input/color-picker-hex-input.e2e.ts
@@ -54,7 +54,7 @@ describe("calcite-color-picker-hex-input", () => {
     await page.setContent("<calcite-color-picker-hex-input allow-empty></calcite-color-picker-hex-input>");
 
     const input = await page.find(`calcite-color-picker-hex-input`);
-    await input.setProperty("value", null);
+    input.setProperty("value", null);
     await page.waitForChanges();
 
     expect(await input.getProperty("value")).toBe(null);
@@ -69,7 +69,7 @@ describe("calcite-color-picker-hex-input", () => {
     await page.setContent("<calcite-color-picker-hex-input></calcite-color-picker-hex-input>");
 
     const input = await page.find(`calcite-color-picker-hex-input`);
-    await input.setProperty("value", "#abc");
+    input.setProperty("value", "#abc");
     await page.waitForChanges();
 
     expect(await input.getProperty("value")).toBe("#aabbcc");
@@ -80,7 +80,7 @@ describe("calcite-color-picker-hex-input", () => {
     await page.setContent("<calcite-color-picker-hex-input alpha-channel></calcite-color-picker-hex-input>");
 
     const input = await page.find(`calcite-color-picker-hex-input`);
-    await input.setProperty("value", "#abcd");
+    input.setProperty("value", "#abcd");
     await page.waitForChanges();
 
     expect(await input.getProperty("value")).toBe("#aabbccdd");
@@ -91,7 +91,7 @@ describe("calcite-color-picker-hex-input", () => {
     await page.setContent("<calcite-color-picker-hex-input></calcite-color-picker-hex-input>");
 
     const input = await page.find(`calcite-color-picker-hex-input`);
-    await input.setProperty("value", "#fafafa");
+    input.setProperty("value", "#fafafa");
     await page.waitForChanges();
 
     expect(await input.getProperty("value")).toBe("#fafafa");
@@ -102,7 +102,7 @@ describe("calcite-color-picker-hex-input", () => {
     await page.setContent("<calcite-color-picker-hex-input alpha-channel></calcite-color-picker-hex-input>");
 
     const input = await page.find(`calcite-color-picker-hex-input`);
-    await input.setProperty("value", "#fafafafa");
+    input.setProperty("value", "#fafafafa");
     await page.waitForChanges();
 
     expect(await input.getProperty("value")).toBe("#fafafafa");
@@ -132,37 +132,37 @@ describe("calcite-color-picker-hex-input", () => {
     await page.setContent(`<calcite-color-picker-hex-input value='${hex}'></calcite-color-picker-hex-input>`);
     const input = await page.find(`calcite-color-picker-hex-input`);
 
-    await input.setProperty("value", null);
+    input.setProperty("value", null);
     await page.waitForChanges();
 
     expect(await input.getProperty("value")).toBe(hex);
 
-    await input.setProperty("value", "wrong");
+    input.setProperty("value", "wrong");
     await page.waitForChanges();
 
     expect(await input.getProperty("value")).toBe(hex);
 
-    await input.setProperty("value", "#");
+    input.setProperty("value", "#");
     await page.waitForChanges();
 
     expect(await input.getProperty("value")).toBe(hex);
 
-    await input.setProperty("value", "#a");
+    input.setProperty("value", "#a");
     await page.waitForChanges();
 
     expect(await input.getProperty("value")).toBe(hex);
 
-    await input.setProperty("value", "#aa");
+    input.setProperty("value", "#aa");
     await page.waitForChanges();
 
     expect(await input.getProperty("value")).toBe(hex);
 
-    await input.setProperty("value", "#aaaa");
+    input.setProperty("value", "#aaaa");
     await page.waitForChanges();
 
     expect(await input.getProperty("value")).toBe(hex);
 
-    await input.setProperty("value", "#aaaaa");
+    input.setProperty("value", "#aaaaa");
     await page.waitForChanges();
 
     expect(await input.getProperty("value")).toBe(hex);
@@ -176,37 +176,37 @@ describe("calcite-color-picker-hex-input", () => {
     );
     const input = await page.find(`calcite-color-picker-hex-input`);
 
-    await input.setProperty("value", null);
+    input.setProperty("value", null);
     await page.waitForChanges();
 
     expect(await input.getProperty("value")).toBe(hex);
 
-    await input.setProperty("value", "wrong");
+    input.setProperty("value", "wrong");
     await page.waitForChanges();
 
     expect(await input.getProperty("value")).toBe(hex);
 
-    await input.setProperty("value", "#");
+    input.setProperty("value", "#");
     await page.waitForChanges();
 
     expect(await input.getProperty("value")).toBe(hex);
 
-    await input.setProperty("value", "#a");
+    input.setProperty("value", "#a");
     await page.waitForChanges();
 
     expect(await input.getProperty("value")).toBe(hex);
 
-    await input.setProperty("value", "#aa");
+    input.setProperty("value", "#aa");
     await page.waitForChanges();
 
     expect(await input.getProperty("value")).toBe(hex);
 
-    await input.setProperty("value", "#aaaaa");
+    input.setProperty("value", "#aaaaa");
     await page.waitForChanges();
 
     expect(await input.getProperty("value")).toBe(hex);
 
-    await input.setProperty("value", "#aaaaaaa");
+    input.setProperty("value", "#aaaaaaa");
     await page.waitForChanges();
 
     expect(await input.getProperty("value")).toBe(hex);
@@ -219,7 +219,7 @@ describe("calcite-color-picker-hex-input", () => {
     const input = await page.find("calcite-color-picker-hex-input");
     const spy = await input.spyOnEvent("calciteColorPickerHexInputChange");
 
-    await input.setProperty("value", "#abcdef");
+    input.setProperty("value", "#abcdef");
     await page.waitForChanges();
 
     expect(spy).toHaveReceivedEventTimes(0);
@@ -360,7 +360,7 @@ describe("calcite-color-picker-hex-input", () => {
           const initialHex = "#000000";
 
           await input.callMethod("setFocus");
-          await input.setProperty("value", initialHex);
+          input.setProperty("value", initialHex);
           await page.waitForChanges();
 
           await page.keyboard.press("ArrowUp");
@@ -404,7 +404,7 @@ describe("calcite-color-picker-hex-input", () => {
 
           it("restores previous value when a nudge key is pressed and no-color is allowed and set", async () => {
             const noColorValue = null;
-            await input.setProperty("value", noColorValue);
+            input.setProperty("value", noColorValue);
             await page.waitForChanges();
             await input.callMethod("setFocus");
             await page.waitForChanges();
@@ -413,14 +413,14 @@ describe("calcite-color-picker-hex-input", () => {
             await page.waitForChanges();
             expect(await input.getProperty("value")).toBe(startingHex);
 
-            await input.setProperty("value", noColorValue);
+            input.setProperty("value", noColorValue);
             await page.waitForChanges();
 
             await page.keyboard.press("ArrowDown");
             await page.waitForChanges();
             expect(await input.getProperty("value")).toBe(startingHex);
 
-            await input.setProperty("value", noColorValue);
+            input.setProperty("value", noColorValue);
             await page.waitForChanges();
 
             await page.keyboard.down("Shift");
@@ -428,7 +428,7 @@ describe("calcite-color-picker-hex-input", () => {
             await page.keyboard.up("Shift");
             expect(await input.getProperty("value")).toBe(startingHex);
 
-            await input.setProperty("value", noColorValue);
+            input.setProperty("value", noColorValue);
             await page.waitForChanges();
 
             await page.keyboard.down("Shift");
@@ -474,7 +474,7 @@ describe("calcite-color-picker-hex-input", () => {
           const initialHex = "#000000ff";
 
           await input.callMethod("setFocus");
-          await input.setProperty("value", initialHex);
+          input.setProperty("value", initialHex);
           await page.waitForChanges();
 
           await page.keyboard.press("ArrowUp");
@@ -523,7 +523,7 @@ describe("calcite-color-picker-hex-input", () => {
 
           it("restores previous value when a nudge key is pressed and no-color is allowed and set", async () => {
             const noColorValue = null;
-            await input.setProperty("value", noColorValue);
+            input.setProperty("value", noColorValue);
             await page.waitForChanges();
             await input.callMethod("setFocus");
             await page.waitForChanges();
@@ -532,14 +532,14 @@ describe("calcite-color-picker-hex-input", () => {
             await page.waitForChanges();
             expect(await input.getProperty("value")).toBe(startingHexa);
 
-            await input.setProperty("value", noColorValue);
+            input.setProperty("value", noColorValue);
             await page.waitForChanges();
 
             await page.keyboard.press("ArrowDown");
             await page.waitForChanges();
             expect(await input.getProperty("value")).toBe(startingHexa);
 
-            await input.setProperty("value", noColorValue);
+            input.setProperty("value", noColorValue);
             await page.waitForChanges();
 
             await page.keyboard.down("Shift");
@@ -547,7 +547,7 @@ describe("calcite-color-picker-hex-input", () => {
             await page.keyboard.up("Shift");
             expect(await input.getProperty("value")).toBe(startingHexa);
 
-            await input.setProperty("value", noColorValue);
+            input.setProperty("value", noColorValue);
             await page.waitForChanges();
 
             await page.keyboard.down("Shift");
diff --git a/packages/calcite-components/src/components/color-picker-hex-input/color-picker-hex-input.tsx b/packages/calcite-components/src/components/color-picker-hex-input/color-picker-hex-input.tsx
index d4c44265871..daa2fc8382c 100644
--- a/packages/calcite-components/src/components/color-picker-hex-input/color-picker-hex-input.tsx
+++ b/packages/calcite-components/src/components/color-picker-hex-input/color-picker-hex-input.tsx
@@ -282,7 +282,6 @@ export class ColorPickerHexInput implements LoadableComponent {
     if (isValidHex(hex)) {
       event.preventDefault();
       this.hexInputNode.value = hex.slice(1);
-      this.hexInputNode.internalSyncChildElValue();
     }
   };
 
@@ -292,14 +291,14 @@ export class ColorPickerHexInput implements LoadableComponent {
   //
   //--------------------------------------------------------------------------
 
-  private hexInputNode: HTMLCalciteInputElement;
+  private hexInputNode: HTMLCalciteInputTextElement;
 
   /**
    * The last valid/selected color. Used as a fallback if an invalid hex code is entered.
    */
   @State() internalColor: Color | null = DEFAULT_COLOR;
 
-  private opacityInputNode: HTMLCalciteInputElement;
+  private opacityInputNode: HTMLCalciteInputNumberElement;
 
   private previousNonNullValue: string = this.value;
 
@@ -317,13 +316,12 @@ export class ColorPickerHexInput implements LoadableComponent {
 
     return (
       <div class={CSS.container}>
-        <calcite-input
+        <calcite-input-text
           class={CSS.hexInput}
           label={messages?.hex || hexLabel}
           maxLength={6}
-          numberingSystem={this.numberingSystem}
-          onCalciteInputChange={this.onHexInputChange}
-          onCalciteInternalInputBlur={this.onHexInputBlur}
+          onCalciteInputTextChange={this.onHexInputChange}
+          onCalciteInternalInputTextBlur={this.onHexInputBlur}
           onKeyDown={this.onInputKeyDown}
           onPaste={this.onHexInputPaste}
           prefixText="#"
@@ -414,11 +412,11 @@ export class ColorPickerHexInput implements LoadableComponent {
     this.value = oldValue;
   }
 
-  private storeHexInputRef = (node: HTMLCalciteInputElement): void => {
+  private storeHexInputRef = (node: HTMLCalciteInputTextElement): void => {
     this.hexInputNode = node;
   };
 
-  private storeOpacityInputRef = (node: HTMLCalciteInputElement): void => {
+  private storeOpacityInputRef = (node: HTMLCalciteInputNumberElement): void => {
     this.opacityInputNode = node;
   };
 
diff --git a/packages/calcite-components/src/components/color-picker/color-picker.e2e.ts b/packages/calcite-components/src/components/color-picker/color-picker.e2e.ts
index ee9a2571409..eb5c0df9e07 100644
--- a/packages/calcite-components/src/components/color-picker/color-picker.e2e.ts
+++ b/packages/calcite-components/src/components/color-picker/color-picker.e2e.ts
@@ -783,7 +783,7 @@ describe("calcite-color-picker", () => {
     // see https://jasmine.github.io/tutorials/custom_argument_matchers for more info
     function toBeInteger(): any {
       return {
-        asymmetricMatch(abc): boolean {
+        asymmetricMatch(abc: string): boolean {
           return Number.isInteger(abc);
         },
 
@@ -795,8 +795,8 @@ describe("calcite-color-picker", () => {
 
     function toBeNumber(): any {
       return {
-        asymmetricMatch(expected): boolean {
-          return !isNaN(parseFloat(expected)) && isFinite(expected);
+        asymmetricMatch(expected: string): boolean {
+          return !isNaN(parseFloat(expected)) && isFinite(Number(expected));
         },
 
         jasmineToString(): string {
@@ -805,6 +805,31 @@ describe("calcite-color-picker", () => {
       };
     }
 
+    it("numbering system does not revert to latn when clamping RGB channels", async () => {
+      const page = await newE2EPage();
+      await page.setContent(
+        html`<calcite-color-picker numbering-system="arab" value="#fff000"></calcite-color-picker>`
+      );
+
+      const calciteInputNumber = await page.find(`calcite-color-picker >>> .${CSS.channel}`);
+
+      await selectText(calciteInputNumber);
+      await calciteInputNumber.type("25555");
+      await calciteInputNumber.press("Enter");
+      await page.waitForChanges();
+
+      const nativeInputValue = await page.evaluate(
+        async (CSS) =>
+          document
+            .querySelector("calcite-color-picker")
+            .shadowRoot.querySelector(`.${CSS.channel}`)
+            .shadowRoot.querySelector("input").value,
+        CSS
+      );
+
+      expect(nativeInputValue).toBe("٢٥٥");
+    });
+
     describe("default", () => {
       describe("keeps value in same format when applying updates", () => {
         let page: E2EPage;
@@ -828,7 +853,7 @@ describe("calcite-color-picker", () => {
 
           const [rgbModeButton, hsvModeButton] = await page.findAll(`calcite-color-picker >>> .${CSS.colorMode}`);
           const [rInput, gInput, bInput, hInput, sInput, vInput] = await page.findAll(
-            `calcite-color-picker >>> calcite-input.${CSS.channel}`
+            `calcite-color-picker >>> .${CSS.channel}`
           );
 
           await rgbModeButton.click();
@@ -953,7 +978,7 @@ describe("calcite-color-picker", () => {
 
             const [rgbModeButton, hsvModeButton] = await page.findAll(`calcite-color-picker >>> .${CSS.colorMode}`);
             const [rInput, gInput, bInput, hInput, sInput, vInput] = await page.findAll(
-              `calcite-color-picker >>> calcite-input.${CSS.channel}`
+              `calcite-color-picker >>> .${CSS.channel}`
             );
 
             await rgbModeButton.click();
@@ -988,9 +1013,7 @@ describe("calcite-color-picker", () => {
 
             it("allows modifying color via RGB inputs", async () => {
               const [rgbModeButton] = await page.findAll(`calcite-color-picker >>> .${CSS.colorMode}`);
-              const [rInput, gInput, bInput] = await page.findAll(
-                `calcite-color-picker >>> calcite-input.${CSS.channel}`
-              );
+              const [rInput, gInput, bInput] = await page.findAll(`calcite-color-picker >>> .${CSS.channel}`);
               await rgbModeButton.click();
 
               await clearAndEnterHexOrChannelValue(page, rInput, "128");
@@ -1002,9 +1025,7 @@ describe("calcite-color-picker", () => {
 
             it("allows modifying color via HSV inputs", async () => {
               const [, hsvModeButton] = await page.findAll(`calcite-color-picker >>> .${CSS.colorMode}`);
-              const [, , , hInput, sInput, vInput] = await page.findAll(
-                `calcite-color-picker >>> calcite-input.${CSS.channel}`
-              );
+              const [, , , hInput, sInput, vInput] = await page.findAll(`calcite-color-picker >>> .${CSS.channel}`);
               await hsvModeButton.click();
 
               // modifying value channel first to ensure other channel changes affect the underlying color
@@ -1027,9 +1048,7 @@ describe("calcite-color-picker", () => {
 
             it("allows nudging RGB values", async () => {
               const [rgbModeButton] = await page.findAll(`calcite-color-picker >>> .${CSS.colorMode}`);
-              const [rInput, gInput, bInput] = await page.findAll(
-                `calcite-color-picker >>> calcite-input.${CSS.channel}`
-              );
+              const [rInput, gInput, bInput] = await page.findAll(`calcite-color-picker >>> .${CSS.channel}`);
               await rgbModeButton.click();
 
               await assertChannelValueNudge(page, rInput);
@@ -1040,9 +1059,7 @@ describe("calcite-color-picker", () => {
             it("allows nudging HSV values", async () => {
               const [, hsvModeButton] = await page.findAll(`calcite-color-picker >>> .${CSS.colorMode}`);
 
-              const [, , , hInput, sInput, vInput] = await page.findAll(
-                `calcite-color-picker >>> calcite-input.${CSS.channel}`
-              );
+              const [, , , hInput, sInput, vInput] = await page.findAll(`calcite-color-picker >>> .${CSS.channel}`);
               await hsvModeButton.click();
 
               await assertChannelValueNudge(page, hInput);
@@ -1089,7 +1106,7 @@ describe("calcite-color-picker", () => {
 
             const [rgbModeButton, hsvModeButton] = await page.findAll(`calcite-color-picker >>> .${CSS.colorMode}`);
             const [rInput, gInput, bInput, hInput, sInput, vInput] = await page.findAll(
-              `calcite-color-picker >>> calcite-input.${CSS.channel}`
+              `calcite-color-picker >>> .${CSS.channel}`
             );
 
             await rgbModeButton.click();
@@ -1119,9 +1136,7 @@ describe("calcite-color-picker", () => {
 
             it("restores previous color to RGB inputs", async () => {
               const [rgbModeButton] = await page.findAll(`calcite-color-picker >>> .${CSS.colorMode}`);
-              const [rInput, gInput, bInput] = await page.findAll(
-                `calcite-color-picker >>> calcite-input.${CSS.channel}`
-              );
+              const [rInput, gInput, bInput] = await page.findAll(`calcite-color-picker >>> .${CSS.channel}`);
               await rgbModeButton.click();
 
               await assertChannelValueNudge(page, rInput);
@@ -1131,9 +1146,7 @@ describe("calcite-color-picker", () => {
 
             it("restores previous color to HSV inputs", async () => {
               const [, hsvModeButton] = await page.findAll(`calcite-color-picker >>> .${CSS.colorMode}`);
-              const [, , , hInput, sInput, vInput] = await page.findAll(
-                `calcite-color-picker >>> calcite-input.${CSS.channel}`
-              );
+              const [, , , hInput, sInput, vInput] = await page.findAll(`calcite-color-picker >>> .${CSS.channel}`);
               await hsvModeButton.click();
 
               await assertChannelValueNudge(page, hInput);
@@ -1205,9 +1218,7 @@ describe("calcite-color-picker", () => {
               const picker = await page.find("calcite-color-picker");
 
               const [rgbModeButton] = await page.findAll(`calcite-color-picker >>> .${CSS.colorMode}`);
-              const [rInput, gInput, bInput] = await page.findAll(
-                `calcite-color-picker >>> calcite-input.${CSS.channel}`
-              );
+              const [rInput, gInput, bInput] = await page.findAll(`calcite-color-picker >>> .${CSS.channel}`);
 
               await rgbModeButton.click();
 
@@ -1227,9 +1238,7 @@ describe("calcite-color-picker", () => {
 
               const [, hsvModeButton] = await page.findAll(`calcite-color-picker >>> .${CSS.colorMode}`);
 
-              const [, , , hInput, sInput, vInput] = await page.findAll(
-                `calcite-color-picker >>> calcite-input.${CSS.channel}`
-              );
+              const [, , , hInput, sInput, vInput] = await page.findAll(`calcite-color-picker >>> .${CSS.channel}`);
 
               await hsvModeButton.click();
 
@@ -1270,7 +1279,7 @@ describe("calcite-color-picker", () => {
 
           const [rgbModeButton, hsvModeButton] = await page.findAll(`calcite-color-picker >>> .${CSS.colorMode}`);
           const [rInput, gInput, bInput, rgbAInput, hInput, sInput, vInput, hsvAInput] = await page.findAll(
-            `calcite-color-picker >>> calcite-input.${CSS.channel}`
+            `calcite-color-picker >>> .${CSS.channel}`
           );
 
           await rgbModeButton.click();
@@ -1492,7 +1501,7 @@ describe("calcite-color-picker", () => {
 
             const [rgbModeButton, hsvModeButton] = await page.findAll(`calcite-color-picker >>> .${CSS.colorMode}`);
             const [rInput, gInput, bInput, rgbAInput, hInput, sInput, vInput, hsvAInput] = await page.findAll(
-              `calcite-color-picker >>> calcite-input.${CSS.channel}`
+              `calcite-color-picker >>> .${CSS.channel}`
             );
 
             await rgbModeButton.click();
@@ -1530,7 +1539,7 @@ describe("calcite-color-picker", () => {
             it("allows modifying color via RGBA inputs", async () => {
               const [rgbModeButton] = await page.findAll(`calcite-color-picker >>> .${CSS.colorMode}`);
               const [rInput, gInput, bInput, rgbAInput] = await page.findAll(
-                `calcite-color-picker >>> calcite-input.${CSS.channel}`
+                `calcite-color-picker >>> .${CSS.channel}`
               );
               await rgbModeButton.click();
 
@@ -1545,7 +1554,7 @@ describe("calcite-color-picker", () => {
             it("allows modifying color via HSVA inputs", async () => {
               const [, hsvModeButton] = await page.findAll(`calcite-color-picker >>> .${CSS.colorMode}`);
               const [, , , , hInput, sInput, vInput, hsvAInput] = await page.findAll(
-                `calcite-color-picker >>> calcite-input.${CSS.channel}`
+                `calcite-color-picker >>> .${CSS.channel}`
               );
               await hsvModeButton.click();
 
@@ -1573,7 +1582,7 @@ describe("calcite-color-picker", () => {
             it("allows nudging RGBA values", async () => {
               const [rgbModeButton] = await page.findAll(`calcite-color-picker >>> .${CSS.colorMode}`);
               const [rInput, gInput, bInput, rgbAInput] = await page.findAll(
-                `calcite-color-picker >>> calcite-input.${CSS.channel}`
+                `calcite-color-picker >>> .${CSS.channel}`
               );
               await rgbModeButton.click();
 
@@ -1586,7 +1595,7 @@ describe("calcite-color-picker", () => {
             it("allows nudging HSVA values", async () => {
               const [, hsvModeButton] = await page.findAll(`calcite-color-picker >>> .${CSS.colorMode}`);
               const [, , , , hInput, sInput, vInput, hsvAInput] = await page.findAll(
-                `calcite-color-picker >>> calcite-input.${CSS.channel}`
+                `calcite-color-picker >>> .${CSS.channel}`
               );
               await hsvModeButton.click();
 
@@ -1645,7 +1654,7 @@ describe("calcite-color-picker", () => {
 
             const [rgbModeButton, hsvModeButton] = await page.findAll(`calcite-color-picker >>> .${CSS.colorMode}`);
             const [rInput, gInput, bInput, rgbAInput, hInput, sInput, vInput, hsvAInput] = await page.findAll(
-              `calcite-color-picker >>> calcite-input.${CSS.channel}`
+              `calcite-color-picker >>> .${CSS.channel}`
             );
 
             await rgbModeButton.click();
@@ -1678,7 +1687,7 @@ describe("calcite-color-picker", () => {
             it("restores color to RGBA inputs", async () => {
               const [rgbModeButton] = await page.findAll(`calcite-color-picker >>> .${CSS.colorMode}`);
               const [rInput, gInput, bInput, rgbAInput] = await page.findAll(
-                `calcite-color-picker >>> calcite-input.${CSS.channel}`
+                `calcite-color-picker >>> .${CSS.channel}`
               );
               await rgbModeButton.click();
 
@@ -1691,7 +1700,7 @@ describe("calcite-color-picker", () => {
             it("restores color to HSVA inputs", async () => {
               const [, hsvModeButton] = await page.findAll(`calcite-color-picker >>> .${CSS.colorMode}`);
               const [, , , , hInput, sInput, vInput, hsvAInput] = await page.findAll(
-                `calcite-color-picker >>> calcite-input.${CSS.channel}`
+                `calcite-color-picker >>> .${CSS.channel}`
               );
               await hsvModeButton.click();
 
@@ -1797,7 +1806,7 @@ describe("calcite-color-picker", () => {
 
               const [rgbModeButton] = await page.findAll(`calcite-color-picker >>> .${CSS.colorMode}`);
               const [rInput, gInput, bInput, rgbAInput] = await page.findAll(
-                `calcite-color-picker >>> calcite-input.${CSS.channel}`
+                `calcite-color-picker >>> .${CSS.channel}`
               );
 
               await rgbModeButton.click();
@@ -1822,7 +1831,7 @@ describe("calcite-color-picker", () => {
               const [, hsvModeButton] = await page.findAll(`calcite-color-picker >>> .${CSS.colorMode}`);
 
               const [, , , , hInput, sInput, vInput, hsvAInput] = await page.findAll(
-                `calcite-color-picker >>> calcite-input.${CSS.channel}`
+                `calcite-color-picker >>> .${CSS.channel}`
               );
 
               await hsvModeButton.click();
diff --git a/packages/calcite-components/src/components/color-picker/color-picker.tsx b/packages/calcite-components/src/components/color-picker/color-picker.tsx
index 01d28aaa8ba..76ab2beba24 100644
--- a/packages/calcite-components/src/components/color-picker/color-picker.tsx
+++ b/packages/calcite-components/src/components/color-picker/color-picker.tsx
@@ -439,7 +439,7 @@ export class ColorPicker
   };
 
   private handleChannelInput = (event: CustomEvent): void => {
-    const input = event.currentTarget as HTMLCalciteInputElement;
+    const input = event.currentTarget as HTMLCalciteInputNumberElement;
     const channelIndex = Number(input.getAttribute("data-channel-index"));
     const isAlphaChannel = channelIndex === 3;
 
@@ -462,10 +462,6 @@ export class ColorPicker
     }
 
     input.value = inputValue;
-
-    // TODO: refactor calcite-input so we don't need to sync the internals
-    // https://github.com/Esri/calcite-design-system/issues/6100
-    input.internalSyncChildElValue();
   };
 
   // using @Listen as a workaround for VDOM listener not firing
@@ -503,7 +499,7 @@ export class ColorPicker
   }
 
   private handleChannelChange = (event: CustomEvent): void => {
-    const input = event.currentTarget as HTMLCalciteInputElement;
+    const input = event.currentTarget as HTMLCalciteInputNumberElement;
     const channelIndex = Number(input.getAttribute("data-channel-index"));
     const channels = [...this.channels] as this["channels"];
 
@@ -992,7 +988,7 @@ export class ColorPicker
     suffix?: string
   ): VNode => {
     return (
-      <calcite-input
+      <calcite-input-number
         class={CSS.channel}
         data-channel-index={index}
         dir={direction}
@@ -1001,8 +997,8 @@ export class ColorPicker
         lang={this.effectiveLocale}
         numberButtonType="none"
         numberingSystem={this.numberingSystem}
-        onCalciteInputChange={this.handleChannelChange}
-        onCalciteInputInput={this.handleChannelInput}
+        onCalciteInputNumberChange={this.handleChannelChange}
+        onCalciteInputNumberInput={this.handleChannelInput}
         onKeyDown={this.handleKeyDown}
         scale={this.scale === "l" ? "m" : "s"}
         // workaround to ensure input borders overlap as desired
@@ -1013,7 +1009,6 @@ export class ColorPicker
             index > 0 && !(this.scale === "s" && this.alphaChannel && index === 3) ? "-1px" : "",
         }}
         suffixText={suffix}
-        type="number"
         value={value?.toString()}
       />
     );
diff --git a/packages/calcite-components/src/components/input/input.tsx b/packages/calcite-components/src/components/input/input.tsx
index decb10698e3..b39ede4a990 100644
--- a/packages/calcite-components/src/components/input/input.tsx
+++ b/packages/calcite-components/src/components/input/input.tsx
@@ -592,17 +592,6 @@ export class Input
     }
   }
 
-  // TODO: refactor so we don't need to sync the internals in color-picker
-  // https://github.com/Esri/calcite-design-system/issues/6100
-  /** @internal */
-  @Method()
-  async internalSyncChildElValue(): Promise<void> {
-    if (this.type === "number") {
-      this.childNumberEl.value = this.value;
-    } else {
-      this.childEl.value = this.value;
-    }
-  }
   //--------------------------------------------------------------------------
   //
   //  Private Methods