Add mouse support#8131
Conversation
27361fb to
9e86d33
Compare
|
/snapit |
|
🫰✨ Thanks @gonzaloriestra! Your snapshot has been published to npm. Test the snapshot by installing your package globally: pnpm i -g --@shopify:registry=https://registry.npmjs.org @shopify/cli@0.0.0-snapshot-20260720151107Caution After installing, validate the version by running |
9e86d33 to
65f7aff
Compare
|
Warning This pull request is not mergeable via GitHub because a downstack PR is open. Once all requirements are satisfied, merge this PR as a stack on Graphite.
This stack of pull requests is managed by Graphite. Learn more about stacking. |
65f7aff to
692317a
Compare
a23f004 to
0427849
Compare
Differences in type declarationsWe detected differences in the type declarations generated by Typescript for this branch compared to the baseline ('main' branch). Please, review them to ensure they are backward-compatible. Here are some important things to keep in mind:
New type declarationspackages/cli-kit/dist/public/node/mouse.d.tsimport { getMouseEnabled, setMouseEnabled } from '../../private/node/conf-store.js';
export { getMouseEnabled, setMouseEnabled };
packages/cli-kit/dist/private/node/ui/components/Mouse.d.tsimport React from 'react';
import { type ClickHandler, type ElementRef, type MouseEnterHandler } from '@ink-tools/ink-mouse';
interface MouseProviderProps extends React.PropsWithChildren {
allowTerminalScrolling?: boolean;
trackMouseMovement?: boolean;
}
export declare function removeTerminalInputResponses(input: string): string;
export declare function MouseProvider({ children, ...mouseProviderProps }: MouseProviderProps): React.ReactElement;
export declare function useOnClick(ref: ElementRef, handler: ClickHandler | null | undefined): void;
export declare function useOnMouseEnter(ref: ElementRef, handler: MouseEnterHandler | null | undefined): void;
export {};
Existing type declarationspackages/cli-kit/dist/private/node/conf-store.d.ts@@ -25,6 +25,7 @@ export interface ConfSchema {
currentDevSessionId?: string;
cache?: Cache;
autoUpgradeEnabled?: boolean;
+ mouseEnabled?: boolean;
}
/**
* Get session.
@@ -139,6 +140,19 @@ export declare function getAutoUpgradeEnabled(config?: LocalStorage<ConfSchema>)
* @param enabled - Whether auto-upgrade should be enabled.
*/
export declare function setAutoUpgradeEnabled(enabled: boolean, config?: LocalStorage<ConfSchema>): void;
+/**
+ * Get mouse interaction preference.
+ * Defaults to true if the preference has never been explicitly set.
+ *
+ * @returns Whether mouse interactions are enabled.
+ */
+export declare function getMouseEnabled(config?: LocalStorage<ConfSchema>): boolean;
+/**
+ * Set mouse interaction preference.
+ *
+ * @param enabled - Whether mouse interactions should be enabled.
+ */
+export declare function setMouseEnabled(enabled: boolean, config?: LocalStorage<ConfSchema>): void;
export declare function getConfigStoreForPartnerStatus(): LocalStorage<Record<string, {
status: true;
checkedAt: string;
packages/cli-kit/dist/public/node/analytics.d.ts@@ -6,6 +6,7 @@ interface ReportAnalyticsEventOptions {
errorMessage?: string;
exitMode: CommandExitMode;
}
+export declare function sendAnalyticsEventFromFile(payloadFile: string): Promise<void>;
/**
* Report an analytics event, sending it off to Monorail -- Shopify's internal analytics service.
*
packages/cli-kit/dist/public/node/ink.d.ts@@ -1 +1,3 @@
-export { Box, Text, Static, useInput, useStdin, useStdout, measureElement } from 'ink';
\ No newline at end of file
+export { Box, Text, Static, useInput, useStdin, useStdout, measureElement } from 'ink';
+export type { DOMElement } from 'ink';
+export { MouseProvider, useOnClick, useOnMouseEnter } from '../../private/node/ui/components/Mouse.js';
\ No newline at end of file
packages/cli-kit/dist/public/node/ui.d.ts@@ -220,7 +220,8 @@ export interface RenderSelectPromptOptions<T> extends Omit<SelectPromptProps<T>,
* seventh
* tenth
*
- * Press ↑↓ arrows to select, enter to confirm.
+ * Press ↑↓ arrows to select, enter to confirm, or click an
+ * option.
*
*/
export declare function renderSelectPrompt<T>({ renderOptions, isConfirmationPrompt, ...props }: RenderSelectPromptOptions<T>, uiDebugOptions?: UIDebugOptions): Promise<T>;
@@ -245,8 +246,8 @@ export interface RenderConfirmationPromptOptions extends Pick<SelectPromptProps<
* > (y) Yes, confirm changes
* (n) Cancel
*
- * Press ↑↓ arrows to select, enter or a shortcut to
- * confirm.
+ * Use ↑↓ to select; press enter, use a shortcut, or click
+ * an option.
*
*/
export declare function renderConfirmationPrompt({ message, infoTable, confirmationMessage, cancellationMessage, renderOptions, defaultValue, abortSignal, infoMessage, }: RenderConfirmationPromptOptions): Promise<boolean>;
@@ -288,7 +289,8 @@ export interface RenderAutocompleteOptions<T> extends PartialBy<Omit<Autocomplet
* twenty-fourth
* twenty-fifth
*
- * Press ↑↓ arrows to select, enter to confirm.
+ * Press ↑↓ arrows to select, enter to confirm, or click an
+ * option.
*
*/
export declare function renderAutocompletePrompt<T>({ renderOptions, ...props }: RenderAutocompleteOptions<T>, uiDebugOptions?: UIDebugOptions): Promise<T>;
packages/cli-kit/dist/private/node/testing/ui.d.ts@@ -9,13 +9,16 @@ declare class Stderr extends EventEmitter {
}
export declare class Stdin extends EventEmitter {
isTTY: boolean;
+ isRaw: boolean;
data: string | null;
constructor(options?: {
isTTY?: boolean;
});
write: (data: string) => void;
setEncoding(): void;
- setRawMode(): void;
+ setRawMode(isRaw: boolean): void;
+ pause(): void;
+ resume(): void;
ref(): void;
unref(): void;
read: () => string | null;
@@ -35,6 +38,7 @@ interface RenderOptions {
stdout?: EventEmitter;
stderr?: EventEmitter;
stdin?: EventEmitter;
+ stdoutIsTTY?: boolean;
}
export declare const render: (tree: ReactElement, options?: RenderOptions) => Instance;
/**
|

WHY are these changes introduced?
HackDays project: https://vault.shopify.io/hackdays/154/projects/24279-Shopify-CLI-UX-improvements
Shopify CLI prompts and app dev tabs are keyboard-only, making common interactions less direct.
WHAT is this pull request doing?
Adds shared mouse handling for prompts and app dev tabs, including terminal scrolling support and
shopify config mouse on|offcontrols.demo.mp4
How to test your changes?
pnpm i -g @shopify/cli@0.0.0-snapshot-20260724084707shopify app initshopify app devChecklist
patchfor bug fixes ·minorfor new features ·majorfor breaking changes) and added a changeset withpnpm changeset add