Skip to content

Beta to main#507

Merged
phurpa-tsering merged 61 commits into
mainfrom
beta
Jul 17, 2026
Merged

Beta to main#507
phurpa-tsering merged 61 commits into
mainfrom
beta

Conversation

@phurpa-tsering

Copy link
Copy Markdown
Collaborator

No description provided.

phurpa-tsering and others added 30 commits June 25, 2026 17:10
The saved-content snapshot used for dirty-checking was never stripped
of uid attrs, while the live editor snapshot was — so any file with
real uid values in its blocks (all importer-generated files) or a
node that gets its uid backfilled on load (e.g. the title heading)
compared unequal from the moment it opened, and could never clear.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
VoidenEditor's content prop is typed as string but docTab.content can
legitimately be null (e.g. a fresh tab racing the file read, or a
large file still being written) — files:read returns null on ENOENT.
The sibling CodeEditor branch two lines below already guards this
with `?? ""`; VoidenEditor was missing the same fallback, so
`content.length` threw "Cannot read properties of null" on mount.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Every Find keypress is intercepted at the OS input level
(before-input-event in apps/electron main process) so the real
browser keydown never reaches the renderer — it's replayed via a
synthetic KeyboardEvent instead. That synthetic event was missing
`code: 'KeyF'` (matchesShortcut() matches on event.code) and set
both metaKey and ctrlKey simultaneously (matchesShortcut() compares
an exact modifier bitmask, so Meta+Ctrl together never equals the
platform's single expected modifier). Both bugs made the replayed
event fail to match in every editor that relies on it.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Covers hierarchical request inheritance, preview tabs, plugin update
notifications, cURL extenders, and the editor reliability fixes
shipped since v2.1.1 (Cmd+F, backspace, huge-line freeze, scroll
flicker, GraphQL false-dirty indicator, null-content crash, and more).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
The custom Backspace handler for table cells/registered blocks always
deleted exactly 1 position backward, correct for plain text but not
for atom nodes — fileLink has content: "inline*", so even empty it
occupies 2 positions (open + close boundary). Deleting only 1 left
the node stuck. Now deletes the full nodeSize when the node before
the cursor is an atom.
The check that strips a user-set Content-Type header for multipart
requests (so the real FormData boundary is used instead) only matched
the exact literal string "multipart/form-data" — no trimming, no
case-insensitivity, no tolerance for a stray/stale boundary param. Any
deviation (leading space from curl-style header parsing, different
casing, a leftover boundary copied from elsewhere) left the wrong
header in place alongside the auto-generated multipart body, causing
a boundary mismatch that breaks server-side parsing. Now trims and
matches case-insensitively with startsWith to catch these cases.
Phurpa10923 and others added 28 commits July 9, 2026 16:28
…tion (#203) (#487)

* feat(nix): add flake.nix with reproducible devShell

* feat: implement panel store and content layout components while updating project dependencies

* feat: add @voiden/executors workspace dependency to ui package
…#491)

* feat: add documentation links and helper tooltips to block headers with system browser integration

* fix: ensure proper pointer interaction for Whats-New modal and overlay elements

* Beta to main merge for 2.2.1 release (#492)

* dev : [Feature] Import blocks that don't do anything
Fixes #321

* dev : Linked blocks are not visible when linking a file with linked blocks in it
Fixes #265

* dev : Suggestion: Add Description Column for Headers, Params, and Options
Fixes #261

* dev : fixed app update direct quit prevention and also edit environment change

* dev : cursor IDE font aliasing

* dev : [Bug] Display Platform-Specific Keyboard Shortcut
Fixes #484

* dev : [Bug] Prevent UI Flickering While Scrolling in the Editor
Fixes #483

* dev : [Feature] Hierarchical Inheritance for Request Configuration
Fixes #469

* swv : pending tabs features

* dev : extend curl

* dev : Feature Request - Improve discoverability of toggleable headers
Fixes #130

* dev : [Enhancement] Notify users when plug-in updates are available
Fixes #486

* dev : Electron App Ignores macOS Custom Keyboard Remapping

* dev : core changes for voiden editor and code editor

* fix: enable request history by default

* fix: request history never recorded — read file path from editor.storage.source

* dev : seamless navigation arrow up/down  on tippy

* dev : backspace fix

* dev : setting page right panel and plugin update available tab change on left panel

* dev : huge line handle in code editor

* fix: false unsaved-changes indicator on generator-written .void files

The saved-content snapshot used for dirty-checking was never stripped
of uid attrs, while the live editor snapshot was — so any file with
real uid values in its blocks (all importer-generated files) or a
node that gets its uid backfilled on load (e.g. the title heading)
compared unequal from the moment it opened, and could never clear.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* fix: crash opening a .void tab when content is null

VoidenEditor's content prop is typed as string but docTab.content can
legitimately be null (e.g. a fresh tab racing the file read, or a
large file still being written) — files:read returns null on ENOENT.
The sibling CodeEditor branch two lines below already guards this
with `?? ""`; VoidenEditor was missing the same fallback, so
`content.length` threw "Cannot read properties of null" on mount.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* fix: Cmd/Ctrl+F not working in Voiden editor or code editor

Every Find keypress is intercepted at the OS input level
(before-input-event in apps/electron main process) so the real
browser keydown never reaches the renderer — it's replayed via a
synthetic KeyboardEvent instead. That synthetic event was missing
`code: 'KeyF'` (matchesShortcut() matches on event.code) and set
both metaKey and ctrlKey simultaneously (matchesShortcut() compares
an exact modifier bitmask, so Meta+Ctrl together never equals the
platform's single expected modifier). Both bugs made the replayed
event fail to match in every editor that relies on it.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* docs: add changelog for v2.2.0

Covers hierarchical request inheritance, preview tabs, plugin update
notifications, cURL extenders, and the editor reliability fixes
shipped since v2.1.1 (Cmd+F, backspace, huge-line freeze, scroll
flicker, GraphQL false-dirty indicator, null-content crash, and more).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* fix: quit no longer silently saves over unsaved tabs

* docs: fold quit-confirmation fix into unreleased v2.2.0 changelog

* fix: atom nodes (fileLink) undeletable via Backspace in table cells

The custom Backspace handler for table cells/registered blocks always
deleted exactly 1 position backward, correct for plain text but not
for atom nodes — fileLink has content: "inline*", so even empty it
occupies 2 positions (open + close boundary). Deleting only 1 left
the node stuck. Now deletes the full nodeSize when the node before
the cursor is an atom.

* fix: harden multipart/form-data content-type header stripping

The check that strips a user-set Content-Type header for multipart
requests (so the real FormData boundary is used instead) only matched
the exact literal string "multipart/form-data" — no trimming, no
case-insensitivity, no tolerance for a stray/stale boundary param. Any
deviation (leading space from curl-style header parsing, different
casing, a leftover boundary copied from elsewhere) left the wrong
header in place alongside the auto-generated multipart body, causing
a boundary mismatch that breaks server-side parsing. Now trims and
matches case-insensitively with startsWith to catch these cases.

* fix: CSV file uploads sent with wrong Content-Type in multipart body

getFileMimeType()'s hardcoded extension table didn't include .csv, so
any CSV attached via multipart-table or a binary body part got sent
as application/octet-stream instead of text/csv. APIs that validate
the uploaded file's declared content type (e.g. "please provide a
valid CSV file") rejected it even though the file bytes were correct
— Postman sends the real text/csv type via the OS MIME database, so
the same request worked there. Added csv/tsv to the table.

* fix: false unsaved-changes indicator from structural JSON asymmetries

stripUidAttrs compared a live ProseMirror doc against raw
parsed-from-disk JSON, but the two representations differ
structurally in ways that don't reflect a real edit:

- A live node materializes every schema-declared attr, including ones
  defaulting to undefined (e.g. gqlquery's importedFrom), while parsed
  JSON only has keys actually present in the source — now dropped
  before comparing.
- A live node always serializes an empty content array as content:[],
  while parsed JSON for content-less nodes omits the key entirely —
  now normalized to omitted on both sides.
- gqlvariables.body gets regenerated in query-declaration key order
  by the GraphQL plugin, which can differ from the source file's
  original key order — now canonicalized (sorted keys) before
  comparing so a key-order-only difference never shows as dirty.

* fix: add RefreshCw to the dev-mode lucide-react plugin build shim

Needed for voiden-graphql's new Resync button icon — this shim list
is a separate copy from each plugin's own build.mjs, used specifically
by the centralized dev build/watch script.

* dev : small bug fixes

* dev : mime type change and curl parser and changelog update

* dev : updated changelog

* dev : table filelink backspace fix

* dev : pending tab fix and window os focus fix on pending tab

* dev : pending file activation on cmd+enter press

* dev : custom dialog for saving file in pending dirty tab close

* chore : 2.2.1 release

---------

Co-authored-by: phurpa-tsering <Phutsering10923@gmail.com>

* refactor: enable dynamic documentation URL resolution in RequestBlockHeader using block-specific attributes and plugin registry lookups.

---------

Co-authored-by: Phurpa Tsering <phurpa@apyhub.com>
Co-authored-by: phurpa-tsering <Phutsering10923@gmail.com>
* dev : cursor like ui change

* dev : new change on the cursor look alike

---------

Co-authored-by: phurpa-tsering <Phutsering10923@gmail.com>
@phurpa-tsering
phurpa-tsering merged commit 205c8a0 into main Jul 17, 2026
5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants