Commit Graph
2702 Commits
Author SHA1 Message Date
aiongg 8b5e1a909d Merge #147: PDF: a damaged PNG, GIF or WebP is skipped, not fatal
Conflict: crates/pdf/src/export.rs: kept #223's lossless() (RasterMode, sRGB tagging) with #147's full-decode check at its top; the fallback reuses the decoded raster
2026-10-09 22:16:33 +00:00
aiongg 7b813d70ad Merge #223: PDF/X-4: RGB images carry sRGB, no image interpolation, pdf:Trapped in XMP 2026-10-09 22:16:16 +00:00
aiongg ff38aede13 Merge #127: CLI: export options after the last export are an error; MCP and README docs match the code 2026-10-09 22:16:13 +00:00
aiongg 7a0407f8a7 Merge #118: Honor MCP typing, story, and page contracts 2026-10-09 22:16:13 +00:00
aiongg 8cd7bdc88b Merge #117: Fix browser printing, startup flags, and document MIME 2026-10-09 22:16:13 +00:00
aiongg e46e173d90 Merge #120: Preserve typed values in generic command dialogs 2026-10-09 22:16:13 +00:00
aiongg 800b2332f6 Merge #139: Docs, About: the Illustrator-class sibling is VectorCraft (#59) 2026-10-09 22:16:13 +00:00
aiongg 40a8ba3c53 Merge #138: Web: AltGr and other named keys no longer type their names (#134) 2026-10-09 22:16:13 +00:00
aiongg 8300519bd5 Merge #249: Make menu entries selectable across the full row 2026-10-09 22:16:13 +00:00
aiongg 9b3b085770 Merge #248: Add A6 sheet preset to the welcome page 2026-10-09 22:16:13 +00:00
aiongg 8fe589586b Merge #224: Distribute selected table rows evenly and keep the edit undoable 2026-10-09 22:16:13 +00:00
aiongg 5729796705 Merge #122: Desktop: write log records to standard error and a rotating log file
Conflict: apps/designcraft/src/main.rs: kept both module declarations (#168's graphics, #122's logging)
2026-10-09 22:16:13 +00:00
aiongg 6e8f33c386 Merge #168: Fix Windows startup crash by defaulting to DirectX 12 2026-10-09 22:15:59 +00:00
aiongg de5d32c90f Merge #244: Rebind embedded image links when opening relocated packages (#235) 2026-10-09 22:15:59 +00:00
aiongg 553d017065 Merge #229: Prevent mixed gradient color spaces from aborting PDF export 2026-10-09 22:15:59 +00:00
aiongg 29e33dde3d Merge #152: Apply contextual escaping to HTML and EPUB exports 2026-10-09 22:15:59 +00:00
aiongg eedbaf6717 Merge #137: Commands: huge row and column counts can't exhaust memory 2026-10-09 22:15:59 +00:00
aiongg 997d18dcac Merge #149: Import: RTF and Tagged Text keep characters past U+FFFF 2026-10-09 22:15:59 +00:00
aiongg 69fc1c381f Merge #116: Images: set SVG text in the shared fonts when the bundled ones lack it 2026-10-09 22:15:59 +00:00
aiongg 13cc11b041 Merge #115: Compose: don't panic when a hyphenated paragraph starts with a no-break letter 2026-10-09 22:15:59 +00:00
aiongg c64e703495 Merge #136: Images: PSD decode passes clippy on Rust 1.98 2026-10-09 22:15:59 +00:00
aiongg ea4740cbc8 Control channel: a failed app.open answers with the error and opens no alert
An alert waits for a click that a control client can't give. app.open
reports the error in its response, as engine.execute does; File › Open,
drops and the command line still show the alert.
2026-10-09 22:13:15 +00:00
moppeeer 218dc42e5d Make menu entries selectable across the full row 2026-10-09 23:33:42 +02:00
moppeeer 84be68d9c2 Add A6 sheet preset to the welcome page 2026-10-09 23:28:49 +02:00
DWAA1660andCodex 658d8e1784 M5: rebind embedded image links when opening relocated packages (#235)
Reuse packaged-link candidates for embedded IDML images and native files.
Resolve missing original paths beside the opened document, retaining the
embedded image bytes and any original link that still exists. Bound path
lookup allocations and cover actual package relocation through commands.

Make existing data-merge test path assertions portable to Windows.

Co-authored-by: Codex <noreply@openai.com>
2026-10-09 15:07:20 -06:00
aiongg fd825af133 Copy and paste keys: copied objects paste with Ctrl+V on Linux and Windows
Copying or cutting objects without a native menu bar puts plain text on the
system clipboard (the copied text frames' stories, or U+FFFC), so the paste
key produces a paste event. Pasting into text ignores that placeholder and
pastes the copied objects as before.
2026-10-09 21:03:04 +00:00
aiongg 40eaaea9db Fonts: a family named with a format suffix such as (OTF) resolves to the installed family 2026-10-09 20:49:09 +00:00
aiongg 699d89c0ce IDML: layers import and export in stacking order 2026-10-09 20:44:57 +00:00
aiongg bd1618f131 UI: Quick Apply rows are left-aligned
Rows without a shortcut or style kind were drawn with their label
centred, because add_sized lays a button out centred and only the rows
with a shortcut have an element that fills the remaining width. Each
row is now laid out left to right in a fixed 460×22 area.
2026-10-09 20:30:23 +00:00
Dmytro MatviichukandCodex bb091b924a UK1: add Ukrainian interface translation
Translate existing interface catalogs and wire Ukrainian menu selection, contextual publishing labels and grammatical counters. Validate persisted selection, untouched document data, placeholder/key coverage and bundled Cyrillic glyphs.

Co-Authored-By: Codex <noreply@openai.com>
2026-10-09 22:15:53 +02:00
aiongg 68feb00f29 UI: the Quick Apply shortcut doesn't also run its first entry
Cmd+Return opened Quick Apply, and in the same frame the list saw the
same press as Enter and ran its first entry (New Document). A key press
that fires a command shortcut is now consumed, so nothing else handles
it that frame. This also stops Cmd+Return from inserting a paragraph
break while typing.
2026-10-09 18:55:25 +00:00
Skylar Taylor-Barrick a45375c335 FID2: preserve decoration color resets, geometry and paint order 2026-10-09 17:39:08 +00:00
Vikram Bhaskaran 6aaa4f0b75 Distribute selected table rows evenly and keep the edit undoable.
The rows share one fixed height that preserves their composed total. Merged rows and rows that are not laid out are refused, and the table stays unchanged.
2026-10-10 04:37:44 +11:00
Skylar Taylor-Barrick ee33fe3c35 FID1: prevent mixed gradient color spaces from aborting PDF export 2026-10-09 17:33:18 +00:00
ROSSAandClaude Opus 5.5 6aa92e70b4 PDF/X-4: RGB images carry sRGB, no image interpolation, pdf:Trapped in XMP
- An RGB image with no ICC profile of its own was written as DeviceRGB
  under the CMYK output intent, and the export only warned. In PDF/X-4
  it now carries the sRGB profile (assets/icc/sRGB-v2-magic.icc, ICC
  v2.1, CC0). JPEGs stay passed through. Untagged PNG, GIF and WebP,
  and the decoded TIFF, BMP and PSD fallback, go in as RGB with the
  profile. A re-encoded JPEG keeps the source's RGB profile or gets
  sRGB. Grey images and images with their own profile are unchanged.
- Every image constructor asked for interpolation. PDF/X-4 and PDF/A
  exports now write images without it, which also removes the
  ImageInterpolation error that stopped PDF/A exports with a placed
  image. Plain exports keep it.
- make_pdfx4 writes pdf:Trapped False into the XMP, matching
  /Trapped/False in the document information.
- check_pdfx4 reports an image that asks for interpolation.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 12:18:18 -05:00
insanityxoff df03057b70 contributors: add emanuelebonaventura (display name insanityxoff) 2026-10-09 18:41:33 +02:00
insanityxoffandClaude Opus 5.5 4e333c652f i18n: add Italian (it) UI translation
Adds an Italian interface catalog (crates/ui-egui/src/i18n/it.rs) covering every
key of the shared table and of the Arabic table (1,430 strings), written from the
English source using ordinary Italian desktop-publishing vocabulary.

Registers "Italiano" in Edit > Interface Language, wires it into tr(), and extends
the i18n and menu tests (lookup, no duplicates, full key coverage, translated menu
titles, language switch frames).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 18:36:55 +02:00
Ville-Pekka Koskinen aeaa9f9818 Swatch menus: make the whole row (chip included) clickable and show chips in the Contextual Task Bar
Add one shared swatch_menu_row (full-width clickable chip + name, current
highlight, hover) and use it in the Properties Appearance/text menus, the
shared swatch_picker (Control bar, Stroke, Character, Paragraph Border/
Shading) and both Contextual Task Bar fill/stroke menus. The Task Bar popups
gain a colour chip per swatch, and every swatch menu now applies on a click
anywhere on the row, including the chip.

Cap the popups at 280 pt so a full-width row keeps the menus InDesign-sized.
Label the chip controls and rows for accessibility.

Test: clicking a swatch chip in the Appearance Fill menu applies it (the Task
Bar uses the same swatch_menu_row helper).
2026-10-09 17:37:23 +03:00
Brandon Thomas 66c7ce7e96 Merge pull request #131 from XusBadia/dmg-background
macOS DMG: branded window background and icon layout
2026-10-09 09:20:37 -04:00
Xus BadiaandClaude Opus 5.5 ec42e542e9 macOS DMG: branded window background and icon layout
The DMG opened as a plain Finder window. It now shows the app icon's figure on
the DesignCraft colour, with DesignCraft.app and the Applications link side by side.
Same approach as PhotoCraft's and VectorCraft's (storytold/photocraft#1201,
storytold/vectorcraft#493).

- packaging/macos/dmg/: background.svg (source; text outlined, no paper grain,
  the figure an <image> of assets/app-icon), background.tiff (1x + 2x HiDPI,
  16-colour palette, Deflate, sRGB; ~90 KB)
  and dmg-layout.DS_Store (Finder view settings: window, icon size 128,
  positions, background).
- generate.py writes the TIFF and the layout on any OS, byte-for-byte
  reproducible, with nothing from the machine that ran it (no paths, users,
  disk names or volume UUIDs).
- package.sh copies them into the staging folder; the image is still built with
  hdiutil makehybrid. Nothing extra runs in the signing job.
- The volume name drops the version: the layout finds the background through
  an alias that includes the volume name. The DMG file name keeps the version.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 07:43:40 +02:00
zydvc26s67-webandCopilot App 3018c56e0c Character Styles: wire save and delete into the UI
Mirrors the Paragraph Styles fix (#169): Character Styles had no save
or delete affordance at all — not even an edit dialog existed.

- Add a new characterStyleOptions dialog (General: rename/based-on,
  Basic Character Formats, Character Color) reachable by double-click
  or the row's new "Edit Character Style…" context-menu entry.
- Add a style.character.delete engine command (mirrors
  style.paragraph.delete): rejects built-in styles, reassigns any text
  runs using the deleted style to a replacement (default [None]).
- Add rename and basedOn (with cycle rejection via the existing
  char_based_on_cycles) support to style.character.edit, matching
  style.paragraph.edit.
- Add a deleteCharacterStyle confirmation dialog with the same
  in-use detection and replacement-style picker as the paragraph one,
  wired via a new "Delete Character Style…" context-menu entry.
- Add Styles::resolve_char_style to resolve a character style's
  effective attributes for display, mirroring resolve_para_style.
- Add engine tests (edit persistence/rename, based-on cycle rejection,
  delete with run reassignment, built-in rejection) and UI-level
  dialog tests for both new dialogs.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
2026-10-08 17:01:14 -07:00
zydvc26s67-webandCopilot App fde78978a4 Paragraph Styles: wire save and delete into the UI (#169)
The engine already supported style.paragraph.edit and
style.paragraph.delete, but the UI never exposed a delete action and
edit was only reachable by double-clicking a style row, with no
visible affordance.

- Add "Edit Paragraph Style…" and "Delete Paragraph Style…" entries to
  the paragraph style row context menu (hidden for built-in styles).
- Add a new deleteParagraphStyle confirmation dialog that detects
  whether the style is currently in use and, if so, lets the user pick
  a replacement style (defaulting to [Basic Paragraph]) for affected
  text before deleting.
- Add engine tests covering paragraph style edit (attribute merge and
  rename propagation), based-on cycle rejection, delete with text
  reassignment, and rejection of built-in style deletion.
- Add UI-level tests covering the edit dialog persisting changes and
  the delete dialog removing a style and reassigning text, including
  the default replacement style.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
2026-10-08 14:55:11 -07:00
Philipp Krüger a075efccd8 chore: add contributor name for PhilippKrueger 2026-10-08 23:38:08 +02:00
skylar taylor-barrick 4e4eaad1c8 PERF-MEM: release retired layouts and trim edit-history capacity 2026-10-08 15:35:20 -06:00
Philipp Krüger a11bd021cd feat(pptx): export documents as editable PowerPoint presentations
New designcraft-pptx crate (L3) and file.exportPptx command (File ›
Export PowerPoint…, CLI --export x.pptx). Each page becomes a slide of
native objects: shapes with fills, gradients, strokes and effects,
pictures cropped like their frames, native tables, and text boxes.

Text keeps DesignCraft's composition by default: composed lines end in
line breaks, justified spacing becomes character spacing, and leading
becomes percentage line spacing (PowerPoint rounds exact spacing to
whole points; its 100% line is 1.2 em for every font). Threaded
stories split at their frames and wrapped lines get their own boxes.
lineBreaks: reflow writes one box per frame in native columns instead.

TrueType fonts are embedded as Embedded OpenType when their licences
allow. Objects PowerPoint can't represent (placed PDF/EPS, type on a
path, some effects) are rasterised through the existing
rasterize_where path.

Checked in PowerPoint for Mac and LibreOffice: on the sample magazine,
word positions match DesignCraft's PDF to within 0.8 pt horizontally
and 1.6 pt vertically.
2026-10-08 23:32:53 +02:00
skylar taylor-barrick abf9a40dc0 PERF-CI: use fixed-size chunks in PSD decoding 2026-10-08 15:29:32 -06:00
DWAA1660 412962d9f8 Fix #167: default Windows startup to DirectX 12 2026-10-08 14:56:37 -06:00
skylar taylor-barrick b050343a6c links.relink: make replacements atomic and retain EPS sources 2026-10-08 11:13:17 -06:00
Jan Hallvard LarsenandClaude Opus 5.5 c63ca54227 Import: RTF and Tagged Text keep characters past U+FFFF
Placing an RTF or Tagged Text file dropped every character outside the
Basic Multilingual Plane: emoji, mathematical letters and the rarer CJK
ideographs such as 𠮷 (U+20BB7, used in Japanese names). The text
around them came in, so the loss was silent. It also broke our own round
trip: Export Text writes these characters correctly and Place lost them.

Both formats carry such a character as a UTF-16 surrogate pair, two
units in a row: \u-10179?\u-8704? in RTF, <0xD83D><0xDE00> in Tagged
Text. Both readers passed each unit to char::from_u32 on its own. Half a
pair is not a character, so each half was dropped.

A small shared Utf16Units joins the units: a first half waits for the
second, and the pair becomes one character. Half a pair with no partner
is still left out, as before.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-08 16:33:44 +01:00
Skylar Taylor-Barrick 6a53d95895 Security: escape HTML and EPUB metadata 2026-10-08 15:31:35 +00:00