From b041d70991f099f408b2b50aaad3a1c3c9dbaadf Mon Sep 17 00:00:00 2001 From: Keavon Chambers Date: Sat, 29 Nov 2025 16:46:56 -0800 Subject: [PATCH 1/5] Replace the title attribute with custom FloatingMenu tooltips --- editor/src/node_graph_executor/runtime.rs | 2 +- frontend/src/README.md | 2 +- frontend/src/components/Editor.svelte | 5 +- .../floating-menus/ColorPicker.svelte | 29 ++++---- .../components/floating-menus/Tooltip.svelte | 38 +++++++++++ .../src/components/layout/FloatingMenu.svelte | 67 ++++++++++++------- .../src/components/layout/LayoutCol.svelte | 2 +- .../src/components/layout/LayoutRow.svelte | 2 +- frontend/src/components/panels/Layers.svelte | 2 +- frontend/src/components/views/Graph.svelte | 32 ++++----- .../widgets/buttons/IconButton.svelte | 2 +- .../widgets/buttons/ImageButton.svelte | 2 +- .../buttons/ParameterExposeButton.svelte | 2 +- .../widgets/buttons/TextButton.svelte | 2 +- .../widgets/inputs/CheckboxInput.svelte | 2 +- .../widgets/inputs/RadioInput.svelte | 8 ++- .../widgets/inputs/ReferencePointInput.svelte | 2 +- .../widgets/labels/ImageLabel.svelte | 2 +- .../widgets/labels/TextLabel.svelte | 2 +- .../src/components/window/MainWindow.svelte | 14 +++- .../window/workspace/Workspace.svelte | 6 -- .../{hyperlinks.ts => hyperlink.ts} | 0 frontend/src/state-providers/tooltip.ts | 61 +++++++++++++++++ 23 files changed, 211 insertions(+), 75 deletions(-) create mode 100644 frontend/src/components/floating-menus/Tooltip.svelte rename frontend/src/io-managers/{hyperlinks.ts => hyperlink.ts} (100%) create mode 100644 frontend/src/state-providers/tooltip.ts diff --git a/editor/src/node_graph_executor/runtime.rs b/editor/src/node_graph_executor/runtime.rs index 3be389f7c0..5d0fab94ff 100644 --- a/editor/src/node_graph_executor/runtime.rs +++ b/editor/src/node_graph_executor/runtime.rs @@ -465,7 +465,7 @@ impl NodeRuntime { if old.is_none_or(|v| !v.is_empty()) { responses.push_back(FrontendMessage::UpdateNodeThumbnail { id: parent_network_node_id, - value: "Dense thumbnail omitted for performance".to_string(), + value: "".to_string(), }); } return; diff --git a/frontend/src/README.md b/frontend/src/README.md index 71bc2927a7..306a3ce977 100644 --- a/frontend/src/README.md +++ b/frontend/src/README.md @@ -16,7 +16,7 @@ During development when HMR (hot-module replacement) occurs, these are also unmo TypeScript files which provide reactive state and importable functions to Svelte components. Each module defines a Svelte writable store `const { subscribe, update } = writable({ .. });` and exports the `subscribe` method from the module in the returned object. Other functions may also be defined in the module and exported after `subscribe`, which provide a way for Svelte components to call functions to manipulate the state. -In `Editor.svelte`, an instance of each of these are given to Svelte's [`setContext()`](https://svelte.dev/docs#run-time-svelte-setcontext) function. This allows any component to access the state provider instance using `const exampleStateProvider = getContext("exampleStateProvider");`. +In `Editor.svelte`, an instance of each of these are given to Svelte's `setContext()` function. This allows any component to access the state provider instance using `const exampleStateProvider = getContext("exampleStateProvider");`. ## _I/O managers vs. state providers_ diff --git a/frontend/src/components/Editor.svelte b/frontend/src/components/Editor.svelte index f8401061f6..454b80983c 100644 --- a/frontend/src/components/Editor.svelte +++ b/frontend/src/components/Editor.svelte @@ -3,7 +3,7 @@ import { type Editor } from "@graphite/editor"; import { createClipboardManager } from "@graphite/io-managers/clipboard"; - import { createHyperlinkManager } from "@graphite/io-managers/hyperlinks"; + import { createHyperlinkManager } from "@graphite/io-managers/hyperlink"; import { createInputManager } from "@graphite/io-managers/input"; import { createLocalizationManager } from "@graphite/io-managers/localization"; import { createPanicManager } from "@graphite/io-managers/panic"; @@ -15,6 +15,7 @@ import { createFullscreenState } from "@graphite/state-providers/fullscreen"; import { createNodeGraphState } from "@graphite/state-providers/node-graph"; import { createPortfolioState } from "@graphite/state-providers/portfolio"; + import { createTooltipState } from "@graphite/state-providers/tooltip"; import { operatingSystem } from "@graphite/utility-functions/platform"; import MainWindow from "@graphite/components/window/MainWindow.svelte"; @@ -26,6 +27,8 @@ // State provider systems let dialog = createDialogState(editor); setContext("dialog", dialog); + let tooltip = createTooltipState(editor); + setContext("tooltip", tooltip); let document = createDocumentState(editor); setContext("document", document); let fonts = createFontsState(editor); diff --git a/frontend/src/components/floating-menus/ColorPicker.svelte b/frontend/src/components/floating-menus/ColorPicker.svelte index 7e221eac7b..1f9747f97d 100644 --- a/frontend/src/components/floating-menus/ColorPicker.svelte +++ b/frontend/src/components/floating-menus/ColorPicker.svelte @@ -420,7 +420,12 @@ > - + {#if !isNone}
{/if} @@ -434,12 +439,12 @@ /> {/if} - + {#if !isNone}
{/if} - + {#if !isNone}
{/if} @@ -600,20 +605,20 @@ {#if allowNone && !gradient} - + {/if} - + - + diff --git a/frontend/src/components/floating-menus/Tooltip.svelte b/frontend/src/components/floating-menus/Tooltip.svelte new file mode 100644 index 0000000000..81bdded639 --- /dev/null +++ b/frontend/src/components/floating-menus/Tooltip.svelte @@ -0,0 +1,38 @@ + + +
+ + {@const text = $tooltip.element?.getAttribute("data-tooltip")} + {#if text} + {text} + {/if} + +
+ + diff --git a/frontend/src/components/layout/FloatingMenu.svelte b/frontend/src/components/layout/FloatingMenu.svelte index 6c18cf5168..d31e11c509 100644 --- a/frontend/src/components/layout/FloatingMenu.svelte +++ b/frontend/src/components/layout/FloatingMenu.svelte @@ -1,5 +1,5 @@ - +