Commit graph

412 commits

Author SHA1 Message Date
ByteAtATime
9aa77c0b01
test(command-palette): add keyboard navigation tests for ArrowUp and ArrowDown keys 2025-07-06 15:30:36 -07:00
ByteAtATime
25c7f21846
test(command-palette): update tests to use data-testid attributes
This commit modifies the CommandPalette component to include a data-testid attribute for the content container. Corresponding updates are made in the test file to utilize this attribute for selecting elements, replacing the previously brittle class name selections.
2025-07-06 15:27:38 -07:00
ByteAtATime
a26cd8c3fe
test(frontend): add vitest for unit and component testing
This commit introduces a complete testing setup using Vitest. It's configured it to handle both unit tests in a Node environment and component tests using JSDOM. The `vite.config.js` now defines two separate test projects ('client' and 'server') to manage these different environments. Lastly, to ensure the testing environment is setup correctly, it adds tests for the CommandPalette extension
2025-07-06 15:09:06 -07:00
ByteAtATime
4099f7dd9a
refactor(actions): unify action handling into ActionBar
This commit refactors action and keyboard event handling across the application. It moves all key listeners for primary and secondary actions (Enter, Ctrl+Enter, and other shortcuts) into a new, centralized `ActionBar` component. This new approach uses a declarative `actions` prop, which simplifies each view's logic by removing scattered, imperative keydown handlers and the global `actionBus`. It decreases code duplication, allowing each file to simply specify its actions, without needing to worry about adding keydown listeners. Previously, each file had to handle its own actions, so some pages didn't have these actions at all.
2025-07-06 13:53:22 -07:00
ByteAtATime
e11f912708
refactor: extract InfoList component
Many views contain a detail pane that has a list of data-value pairs. This commit extracts that into a separate component, giving it a height of 150 pixels.
2025-07-06 10:51:08 -07:00
ByteAtATime
40eecd78a1
refactor: make Header component reusable
This commit creates a flexible, snippet-based `<Header>` component and refactored all views (`PluginRunner`, `Extensions`, `ClipboardHistoryView`, etc.) to use it within the `MainLayout`.
2025-07-06 10:36:41 -07:00
ByteAtATime
518da848fe
feat(actions): sort keyboard shortcut modifiers 2025-07-06 10:17:46 -07:00
ByteAtATime
51805dbe7e
feat(extensions): add action bar to extensions list
This commit adds an action bar to the extensions list, roughly mirroring Raycast's actions menu. It also migrates the Extensions view to the MainLayout.
2025-07-06 10:16:26 -07:00
ByteAtATime
8c395f0a60
refactor: migrate views to MainLayout 2025-07-06 10:08:04 -07:00
ByteAtATime
3a11a73133
feat(extensions): update links in extension detail view to match raycast 2025-07-06 09:57:05 -07:00
ByteAtATime
e22b9892ed
style: formatting 2025-07-06 09:49:51 -07:00
ByteAtATime
0265fafce7
feat(button): add action size 2025-07-06 09:49:25 -07:00
ByteAtATime
1582f2c9c9
refactor(CommandDeeplinkConfirm): replace custom dialog with AlertDialog component 2025-07-06 09:45:52 -07:00
ByteAtATime
685985b9b3
fix(view-manager): change legacy Datum import to Extension 2025-07-06 09:41:04 -07:00
ByteAtATime
018ee79280
fix(switch): update switch 2025-07-06 09:37:28 -07:00
ByteAtATime
828be15da3
fix(extensions): load data from extension specific endpoint
Originally, we were directly using the data provided by the paginated endoint. This was incorrect, as the endpoint did not provide a list of metadata files. This commit fixes that, as well as updating the store response schema to match.
2025-07-06 09:35:56 -07:00
ByteAtATime
c8b4cb58e0
feat(extensions): add MacOSPathHeuristic for detecting hardcoded macOS paths
This commit introduces a new heuristic, MacOSPathHeuristic, which checks for potential hardcoded macOS paths in file content. The heuristic is added to the existing list of checks in the run_heuristic_checks function, enhancing the compatibility checks for extensions.
2025-07-05 21:13:13 -07:00
ByteAtATime
3ee3787a05
feat(extensions): implement basic heuristic for extension incompatibility
This commit introduces a confirmation dialog for users when installing extensions that may have compatibility issues. It adds a new `ExtensionInstallConfirm` component to display potential violations and allows users to proceed with or cancel the installation. The Rust module has been updated to add these checks and return appropriate results based on user confirmation.

Because many Raycast extensions are built with MacOS in mind, they use Mac APIs not available on other platforms.
2025-07-05 20:33:12 -07:00
ByteAtATime
ba63d094cf
fix(command-palette): tweak invisible spacer sizing
Previously, we had changed the padding and font size of HeaderInput.svelte without updating the invisible spacer used for the placeholder. This commit addresses the issue.
2025-07-05 18:54:26 -07:00
ByteAtATime
629d57bcb4
fix: remove legacy footer import 2025-07-05 18:51:25 -07:00
ByteAtATime
ef510af02a
refactor(actions): combine Footer into ActionBar
Previously, the two components did basically the same thing. This commit removes Footer in favor of ActionBar. It also extracts a Toast.svelte component, which is now used to render the toast and dropdown in ActionBar.
2025-07-05 13:57:09 -07:00
ByteAtATime
6ed4af5ce7
refactor(components): unify accessory prop handling for UI components
This refactoring introduces a new `createSlottedComponent` factory to abstract the repetitive logic for handling "accessory" props like `actions`, `detail`, and `searchBarAccessory`. It replacs the manual, boilerplate implementations in `List`, `Grid`, `Form`, and `Detail` components with a single call to this new factory.
2025-07-04 21:25:45 -07:00
ByteAtATime
a3fe9b6df7
feat(extensions): display command list if plugin is already installed 2025-07-04 14:10:01 -07:00
ByteAtATime
9752afb3e6
feat(extensions): add "Installed" badge to installed extensions 2025-07-04 13:51:02 -07:00
ByteAtATime
faa7063948
feat(extensions): update ExtensionDetailView to match Raycast 2025-07-04 11:06:23 -07:00
ByteAtATime
24e579503d
feat(extensions): support raycast store deeplinks
This commit adds support for deeplinks in the format of `raycast://extensions/author/slug`. It moves the currently selected extension logic into the view manager, which the Extensions component now imports.
2025-07-04 10:03:19 -07:00
ByteAtATime
307d862b3b
chore: correctly include swift so libraries at runtime
This commit changes the build process to include Swift shared object files, allowing users to not need to include them at runtime. However, this requires the files to be present in src-tauri/SoulverWrapper/Vendor/SoulverCore-linux at build time.
2025-07-03 14:38:00 -07:00
ByteAtATime
2b383ea8e6
refactor(rpc): migrate to generic RPC proxy for sidecar commands
This commit replaces the specific, one-off message types for each native function (e.g., clipboard, system) with a single generic `invoke_command` message. The frontend `SidecarService` now acts as a simple proxy, dynamically invoking the specified Rust command from the message payload without needing to know its implementation details. This change significantly reduces boilerplate and decouples the frontend from the backend's RPC interface.
2025-07-03 09:43:27 -07:00
ByteAtATime
674ce27057
feat(actions): detect shortcut match by platform
This commit changes the keyEventMatches logic by making it platform-dependent. Most notably, it matches `ctrl` instead of `cmd` on non-Mac platforms.
2025-07-03 09:11:13 -07:00
ByteAtATime
2091b7391a
feat(plugin): implement keyboard shortcuts for actions 2025-07-03 09:10:05 -07:00
ByteAtATime
7b92259e21
feat(header): clear header input on escape press
This commit changes the `escape` key handler to first clear the HeaderInput, calling `preventDefault()`. Then, we refactor other files to not go back if `preventDefault()` is called. I'm not sure if, in the future, we should use stopPropogation instead.
2025-07-03 08:52:30 -07:00
ByteAtATime
d9d924a40b
fix(build): embed rpath into binary to locate shared object files
The packaged Linux application was failing to launch with a "cannot open shared object file" error because the dynamic linker could not locate the necessary Swift shared libraries (`.so` files).

This was caused by two missing runtime search paths (rpath):
1.  The main `raycast-linux` executable did not have an rpath pointing to the location of `libSoulverWrapper.so`. This is fixed by adding a `-Wl,-rpath,...` linker argument in `build.rs`.

2.  The `libSoulverWrapper.so` library did not have its own rpath to locate its transitive dependency, `libSoulverCoreDynamic.so`. An rpath on an executable is not inherited by the libraries it loads. This is fixed by passing `-Xlinker -rpath` flags to the `swift build` command, embedding the path into the library itself.
2025-07-02 21:41:11 -07:00
ByteAtATime
90a5510e22
feat(settings): clean up settings menu 2025-07-02 15:38:28 -07:00
ByteAtATime
75182dd4aa
test(backend): add unit tests for caching, usage tracking, and snippet management 2025-07-02 15:25:02 -07:00
ByteAtATime
e2f40553ac
test(backend): add initial tests for soulver, encryption, and snippet engine 2025-07-02 15:10:12 -07:00
ByteAtATime
86ac2b845d
feat(grid): update GridItem to use ImageLike schema and integrate Icon component
This commit modifies the GridItem component to utilize the ImageLike schema for the content property, enhancing type safety. Additionally, it replaces the image element with a div that incorporates the Icon component for better rendering and styling.
2025-07-02 12:12:57 -07:00
ByteAtATime
705aac39dc
feat(assets): add tintColor functionality
This commit updates the ImageLike schema to be consistent with the documentation. It also implements logic for tintColor.
2025-07-02 10:06:03 -07:00
ByteAtATime
5f44461a45
fix(environment): update request identifiers for selected finder items and text 2025-07-02 08:59:03 -07:00
ByteAtATime
5c66ba34f1
feat(actions): implement destructive action styles
This commit introduces support for `Action.Style.Destructive` as outlined in the API documentation. The `Action` component and its variants now accept a `style` prop, which can be set to `'destructive'`.
2025-07-01 22:14:28 -07:00
ByteAtATime
c7937e040a
fix(protocol): refactor oauth-authorize to accept an ImageLike when authorizing
This commit moves the image.ts file from the frontend into the protocol package, allowing the argument type to be updated.
2025-07-01 22:11:08 -07:00
ByteAtATime
fa3fbe3044
fix(header-input): initialize ref with default value of null
Previously, it defaulted to undefined, giving an error because we cannot bind with a value of undefined as the `ref` prop in Input defaults to null.
2025-07-01 21:52:37 -07:00
ByteAtATime
1606bb8e72
fix(command-palette): deduplicate command palette items by ID 2025-07-01 20:46:09 -07:00
ByteAtATime
58b593fb81
feat(grid): virtualize grid rows
This commit implements a virtual list in the Grid component, hopefully increasing performance.
2025-07-01 10:26:56 -07:00
ByteAtATime
87a7f946fa
perf(reconciler): implement high-speed prop templating
This commit optimizes the data payload generation by replacing the previous slow, generic fingerprinting logic with a fast, specialized one. The previous method using `JSON.stringify` introduced a 20-50ms latency bottleneck; the new implementation uses a targeted string concatenation method to achieve the same payload reduction in about 10ms.
2025-07-01 10:13:49 -07:00
ByteAtATime
4a36997bb2
perf(reconciler): optimize data payload with prop templating
Implements a props templating system to the sidecar reconciler to significantly reduce the initial data payload size. The system now identifies repeating property sets, defines them as a template once, and then applies this template to multiple components, avoiding redundant data transmission. By writing the payload to a log file, we see that initial payload size for the Pokémon extension decreases from 150k to 30k lines
2025-07-01 09:55:42 -07:00
ByteAtATime
7d5441f538
feat(ipc): add compression for large stdout payloads
This commit implements  zlib compression for large messages sent from the Node.js sidecar to the frontend. A threshold prevents small messages from incurring compression overhead, and a flag in the length-prefix header signals whether a payload is compressed, avoiding protocol changes. By adding a log to the sidecar service, we can measure that the rolling average from loading the Pokémon plugin decreases from 140ms to about 110ms.
2025-06-30 15:58:17 -07:00
ByteAtATime
f79aee4bf6
fix(list): move snippet outside conditional
Because we put the snippet inside an {#if} block, it didn't seem to register as a snippet. Switching the order ("if" inside "snippet") seems to fix it.
2025-06-30 15:37:14 -07:00
ByteAtATime
7050fb3fd8
fix(actions): only register action if not in dropdown
Previously, dropdown items were trying to register themselves as the primary and secondary actions. This would override the previous actions, leading to nothing happening when trying to trigger them.
2025-06-30 15:32:25 -07:00
ByteAtATime
17cb1d5b97
feat(header): move header margin from input to list
Previously, we added a bottom margin to the inputs. However, this created a weird gap, and also didn't address the padding at the bottom. Now, instead of adding this margin in the input, we move it to the `BaseList` so it can handle both while still clipping at the input.
2025-06-30 15:15:33 -07:00
ByteAtATime
32f5409cd6
fix(dropdown): remove letter spacing style from dropdown shortcut 2025-06-30 15:11:45 -07:00