Skip to content

Releases: pilotiqjs/pilotiq

@pilotiq/tiptap@4.5.0

Choose a tag to compare

@github-actions github-actions released this 22 Jun 17:16
5eee87d

Minor Changes

  • 18b9794: Add SuggestionReviewPopover — a single floating popover wizard that steps through pending inline-diff suggestions one at a time, replacing the scattered per-region ✓/✕ overlay. The popover anchors to each suggestion's DOM element, shows a step counter (1 of 3), a before/after text preview, and Accept/Reject buttons that advance to the next suggestion automatically. Clicking a diff region in the editor jumps the popover to that suggestion. Dismiss (×) collapses the card without resolving. DiffRegionControls remains exported for backward compatibility but is no longer used internally.

@pilotiq/tiptap@4.4.2

Choose a tag to compare

@github-actions github-actions released this 19 Jun 14:51
9a3c12c

Patch Changes

  • c858821: Fix inline diff regions not reverting when rejected from the pending-suggestions pill. The context→editor cleanup in useInlineDiff now calls rejectInlineDiffRegion when a suggestion is dismissed externally (e.g. via the chat sidebar pill), so the editor's green/red highlights revert correctly instead of remaining as orphaned regions.

@pilotiq/pilotiq@0.46.0

Choose a tag to compare

@github-actions github-actions released this 18 Jun 20:16
9ea9c87

Minor Changes

  • bad1541: FileUpload: metaColumn() escape hatch — writes meta to a separate database column

    .metaFields([...]).metaColumn('col') now splits the stored value into two columns:
    the primary column holds just the bare URL (or string[] for multi), and the
    companion column holds only the meta object (or an array of them for multi).

    The wire format between server and browser remains { url, ...meta } in both
    directions — the split/merge is transparent to the renderer.

    Model setup: declare static casts = { col: 'json' } for the meta column.
    For multi-file mode, also declare static casts = { field: 'json' } if the
    ORM requires it to persist string[].

@pilotiq/pilotiq@0.45.0

Choose a tag to compare

@github-actions github-actions released this 18 Jun 18:35
e3f670c

Minor Changes

  • 3aae0d4: FileUpload: editable per-file metadata via metaFields([...]) (#237)

    FileUpload.make('image').metaFields([TextField.make('alt')]) collects editable per-file metadata (alt text, caption, …) alongside each upload. Pass core field instances; their config (label / placeholder / options / helper text) travels to the renderer, which mounts the inputs in a row beneath every uploaded file.

    • Inline rich value. Opting in widens the stored value from a bare URL string to a rich object in the same column — { url, …meta } for single-file, [{ url, … }] for multiple(). Declare a 'json' cast on the model column.
    • Back-compat. Without metaFields() the field is byte-identical to before (zero cost). Legacy plain-string values still read back — coerced to { url } on load.
    • Coercion normalizes the JSON the client serializes (object / array / legacy string); entries without a usable url are dropped.

    The separate-column escape hatch (.metaColumn()) is tracked separately. @pilotiq/media metadata editing follows in a second PR.

@pilotiq/media@0.7.0

Choose a tag to compare

@github-actions github-actions released this 18 Jun 20:16
9ea9c87

Minor Changes

  • bad1541: Media: panel-scoped library registry — two panels with the same library name no longer clobber each other (#244)

    The library registry is now keyed by both panel path and library name. Two panels can register a 'default' library (or any named library) with different metaFields, conversions, disk, or acceptedMimes without the last registration silently winning.

    Upgrade notes: registerLibrary, getLibrary, getDefaultLibrary, and getLibraryNames all accept an optional leading panelPath argument (e.g. '/admin'). The old single-argument forms remain valid and fall back to an unscoped registry bucket — backward-compatible for code that doesn't have panel context (e.g. mediaUpload()). mediaUpload() now also accepts panelPath?: string in its config to opt into scoped lookup when panels have different storage configs.

@pilotiq/media@0.6.0

Choose a tag to compare

@github-actions github-actions released this 18 Jun 19:31
4d59995

Minor Changes

  • 29d24a2: Media: panel-scoped library registry — two panels with the same library name no longer clobber each other (#244)

    The library registry is now keyed by both panel path and library name. Two panels can register a 'default' library (or any named library) with different metaFields, conversions, disk, or acceptedMimes without the last registration silently winning.

    Upgrade notes: registerLibrary, getLibrary, getDefaultLibrary, and getLibraryNames all accept an optional leading panelPath argument (e.g. '/admin'). The old single-argument forms remain valid and fall back to an unscoped registry bucket — backward-compatible for code that doesn't have panel context (e.g. mediaUpload()). mediaUpload() now also accepts panelPath?: string in its config to opt into scoped lookup when panels have different storage configs.

@pilotiq/media@0.5.0

Choose a tag to compare

@github-actions github-actions released this 18 Jun 18:35
e3f670c

Minor Changes

  • 2257b07: Media: editable per-file metadata — alt text + custom meta fields (#237)

    The library browser's detail panel now edits each file's alt text and any custom metadata fields the library declares, persisted and round-tripping end-to-end.

    • metaFields config. media({ metaFields: [TextField.make('credit'), …] }) declares custom fields (core @pilotiq/pilotiq field instances — consistent with core FileUpload.metaFields([...])). Serialized to FieldMeta at registration and rendered in the detail panel.
    • Alt editable post-upload. Alt text (its own column) is editable in the panel, not just at upload time.
    • meta json column is now live. Previously dead weight (hardcoded {}, never read/edited) — custom fields write to it via the new updateMetadata store fn + POST {base}/_media/:id/metadata route.
    • MediaRef round-trips meta. toMediaRef now carries the custom meta so a file picked through MediaField keeps its metadata in the form value.

    Note: the library registry is keyed by library name across panels — panels sharing the default library should declare the same metaFields.

@pilotiq/media@0.4.0

Choose a tag to compare

@github-actions github-actions released this 18 Jun 16:06
91c54bd

Minor Changes

  • 71ac6cc: Media browser: richer interactions — list view, context menu, multi-select, richer drag-and-drop (#231)

    Rounds out the library browser (@pilotiq/media):

    • List view — a grid ⇄ list toggle in the header with a Name / Type / Size / Modified table. The preference persists across sessions (localStorage), applied in a mount effect so it doesn't trip an SSR hydration mismatch.
    • Context menu — right-click any item (grid tile or list row) for Rename, Move… (folder picker), Download (files), and Delete, backed by the existing _media/:id/rename + :id/move routes.
    • Multi-select — checkbox affordance on tiles + rows, plus cmd/ctrl-click to toggle and shift-click to range-select; a bulk-action toolbar (Move / Delete / Clear) drives bulk delete and bulk move.
    • Richer drag-and-drop — drop a folder (recurses the webkitGetAsEntry tree, recreating subfolders), drop a URL (fetched → uploaded), and drag a tile/row onto a folder to reparent it.

    All client-side — no new routes. Cluster-prefixed mounts resolve the _media base from the server-passed apiBase (the URL-stripping deriveApiBase is a standalone-page fallback only).

@pilotiq/tiptap@4.4.1

Choose a tag to compare

@github-actions github-actions released this 17 Jun 19:10
9949096

Patch Changes

  • 37ace3b: Inline diff: preserve inline marks on the deleted (red) side

    The deleted side of a whole-field AI inline diff now keeps its inline formatting (bold / italic / link / code) instead of flattening to plain text. Previously the single-paragraph branch of the deleted widget extracted the old text via node.textContent, dropping every mark, so a removed <strong>/<em>/<a> run rendered as plain struck text while the inserted side stayed formatted — the diff read as broken. The deleted run is now serialized through the schema's DOMSerializer (inline content only, so the inline look is kept), matching the inserted side.

    Also documents a known limitation: a formatting-only change (same text, a mark toggled) is not surfaced, because prosemirror-changeset is driven by step position maps and mark steps have identity maps.

@pilotiq/pilotiq@0.44.0

Choose a tag to compare

@github-actions github-actions released this 17 Jun 23:48
ace416e

Minor Changes

  • 528efac: Add a media coerce branch to the form pipeline (#208)

    coerceFormValues now handles fieldType: 'media' (used by @pilotiq/media's new MediaField): the JSON-encoded media reference posted via the field's hidden input is parsed back into a real object (single) or array (multiple) so a 'json'-cast column persists it; empty / unparseable values coerce to null. Mirrors the existing richtext / keyValue branches — no impact on panels that don't use the media field.

Patch Changes

  • ef03cdb: Title (and other single-line collab/AI) fields grow to fit wrapped content

    The Tiptap-backed single-line text field (used when a field has AI agents or a collab room attached) was chromed for a strict one line: a fixed h-8 height, items-center, and whitespace-nowrap overflow-x-clip. When a long title wrapped to a second line the box looked cramped and the padding/line-height no longer matched the content. The variant now grows gracefully — min-h-8 keeps the compact resting height for short titles, while whitespace-pre-wrap break-words + balanced py-1.5 / leading-snug let the border hug multi-line content. Both axes stay overflow: visible, so the collaboration caret's presence label still renders above the line.