Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
72 changes: 24 additions & 48 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,68 +20,44 @@ and **bold**.
## 1.3.1 - 5 September 2026

### KQL joins DAX and SQL in text containers
A text container can now be Kusto Query Language. Paste a query or drop a `.kql` file,
choose **KQL** from the title-bar chip, and it is highlighted like the rest: operators,
functions, columns, string literals, and the comments between them. **F6** formats it,
and a query that does not parse is left exactly as it was rather than half rewritten.
The spacing you chose around a join hint, as in `kind=inner`, survives formatting, because
that is how the queries people bring to a session are usually written. Highlighting and
formatting both read Kusto through Microsoft's own parser, and both run locally.
A text container can now be KQL: paste a query or drop a `.kql` file and choose **KQL**
from the title-bar chip. It is highlighted, **F6** formats it, and a query that does not
parse is left unchanged. Both use Microsoft's Kusto parser and run locally.

## 1.3.0 - 3 September 2026

### Export a board to PowerPoint
**File → Export** (Ctrl+E) turns the board into a deck. The board is cut into areas
wherever it is empty: a picture or a note keeps the ink drawn on it, and a stroke that
spans two of them keeps them together. Each area becomes a slide, drawn exactly as the
screen draws it, with the text containers in the speaker notes so that DAX and SQL can be
copied, and an overview slide first shows where every slide sits on the board. The dialog
previews the areas, numbered, and updates as you move the gap and text-size settings.
[How areas are chosen](https://github.com/sql-bi/SQLBI-Whiteboard/blob/main/docs/export.md)
is written down, with the alternatives.
**File → Export** (Ctrl+E) turns the board into a deck. The board is cut into areas where
it is empty, one slide per area, with an overview slide first. Text containers go in the
speaker notes. The dialog shows the areas on the board and updates as you change the
settings.

### Export a board to PDF
Choose **PDF** in the same dialog for a document: the same areas, one per A4 or Letter
page in landscape, each with a bookmark and a footer with the board name, the date, and
the page number. **Whole board on one page** writes a single page the shape of the board,
to be read by zooming, for a board that is one drawing.
Choose **PDF** in the same dialog: one A4 or Letter page per area, with a bookmark and a
footer, or the whole board on one page to zoom into.

### A deck you can rework
**Slide content → Editable** puts images and text containers on the slide as PowerPoint
objects, keeps the DAX and SQL colors as text runs, and lays all the ink over them as one
transparent picture. It is the default; Picture, one choice away, is the exact rendering
for a deck that will be shown as is.
**Slide content → Editable**, the default, puts images and text containers on the slide
as objects, keeps DAX and SQL colors, and lays the ink over them as one picture.
**Picture** is one exact picture of the area.

### PDF pages that stay sharp
**Page content → Vector** draws the ink as paths and the text as text, so a page stays
sharp at any zoom and DAX or SQL can be selected and copied from it. The fonts travel with
the file.
**Page content → Vector** draws the ink as paths and the text as text, so the page stays
sharp at any zoom and code can be selected and copied.

### Slides drawn on the board
**View → Frame** adds a frame the size of the screen: a slide drawn by hand. Whatever sits
inside a frame is that slide, frames come first, and the rest of the board is still cut
automatically. A frame is selected by its edge or its title tab, never by its inside, so
everything in it stays reachable; F2 renames it. A board with a frame is saved in a new
format version, so it needs this release to open; a board without one still opens in the
releases before it.

### An SVG with pictures inside draws them where, and as large as, the author placed them
An SVG that embeds a bitmap and clips it, the way an illustration frames a screenshot,
drew the bitmap shifted and partly missing. The renderer applied the clip inside the
scaling it builds for the picture, so a clip written in page coordinates moved with the
picture. The clip is now lifted onto a group around the picture before drawing, which is
what the markup means, and the picture lands where the author put it.

An embedded logo saved at 72 or 216 DPI came out a third larger, or less than half the
size, of the box the SVG gave it, because the renderer measured the picture in screen
units rather than pixels. The pictures are now measured in pixels, as browsers do, so a
logo fills exactly the box it was given.
**View → Frame** adds a frame the size of the screen. Whatever is inside a frame is that
slide; the rest of the board is still cut automatically. Select a frame by its edge or its
title tab, and press F2 to rename it. A board with a frame needs this release to open.

### SVG pictures land where the author put them
An SVG with an embedded, clipped bitmap drew it shifted and partly missing, and an
embedded picture saved at a DPI other than 96 came out the wrong size. Both now draw where,
and as large as, the SVG says.

### A centred, letter-spaced label no longer collapses
A heading such as `THE INTERFACE` set with `letter-spacing` and centred with
`text-anchor="middle"` piled its letters up in half the width, or all on one spot when
anchored at the end. The letter-spacing is dropped for such text before drawing, so the
label appears where it was placed, set a little tighter than the author asked.
A label with `letter-spacing` and `text-anchor="middle"` or `end` piled its letters up.
It now appears where it was placed, set slightly tighter.

## 1.2.2 - 2 September 2026

Expand Down
19 changes: 19 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,25 @@ channels and a tested build can be promoted without rebuilding.
anything else naming internal infrastructure. Signing coordinates belong in the team's
internal notes, not here.

## Writing for people

Three places carry text read by people who did not write the code, and each has its own
length. Internal documentation under `docs/` is where reasoning, alternatives, and
mechanism belong, at whatever length they need. The other two are short:

- **The site (`site/*.html`)** speaks to the person using the application: what they do
and what they get. A feature is one paragraph of two to four sentences, in the voice
and at the length of the paragraphs around it. No reasoning, no alternatives, no
mechanism, no history.
- **`CHANGELOG.md`**, which becomes the GitHub release body and the What's new page, is
plain and technically accurate: one `###` per thing a person notices, two to four lines
each, saying what changed and what it is for. A bug entry names the symptom and the fix,
not the diagnosis. Link to `docs/` for anything longer.

The test is the neighbours: if a new paragraph is noticeably longer than the ones beside
it, cut it. This has been asked for twice; the 1.3.0 notes as first written are what it
looks like when it slips, and their shortened form is what was wanted.

## Code style

Match the surrounding code. Nullable reference types and implicit usings are enabled.
Expand Down
8 changes: 4 additions & 4 deletions site/guide.html
Original file line number Diff line number Diff line change
Expand Up @@ -691,7 +691,7 @@ <h3>Drawing with a mouse</h3>
<h3>Containers</h3>
<p>Images, LiveViews, and text blocks are containers. With a mouse, click to move, drag the circular handle to resize while keeping aspect ratio — hold <kbd>Ctrl</kbd> too with <span class="ui">Mouse drawing</span> on. Releasing the mouse returns to the drawing tool you had. Imported images accept PNG, JPEG, BMP, GIF, and SVG, including clipboard paste and Explorer drag-and-drop. An SVG is kept as its markup and redrawn at every size, so enlarging one costs it nothing.</p>
<p><span class="ui">View → Bring to front</span> and <span class="ui">View → Send to back</span> reorder the selected container and its linked strokes. Strokes cannot be reordered on their own.</p>
<p><span class="ui">View → Frame</span> adds a frame the size of the screen: a slide drawn on the board. A frame is selected by its dashed edge or by its title tab, never by its inside, so everything in it stays reachable; drag it to move it, drag the handle to resize it, press <kbd>F2</kbd> to rename it, and <span class="ui">Delete</span> removes the frame alone. Moving a frame moves nothing inside it: it is a label over content. <span class="ui">Export</span> takes frames as they are, first and in the order they were added, and cuts the rest of the board automatically. Frames never appear in an export or in a preview.</p>
<p><span class="ui">View → Frame</span> adds a frame the size of the screen: a slide drawn on the board. Select it by its dashed edge or its title tab, drag to move or resize it, and press <kbd>F2</kbd> to rename it. <span class="ui">Export</span> uses frames as they are, first, and cuts the rest of the board automatically. Frames never appear in an export.</p>

<h3>Text, DAX, SQL, and KQL</h3>
<p>Paste prefers an image when the clipboard has one, including a file SnagIt or another capture tool left on the clipboard. Paste plain text to create a selected text container.</p>
Expand Down Expand Up @@ -764,9 +764,9 @@ <h3 id="liveview">LiveView</h3>

<h3>Files</h3>
<p>The <span class="ui">File</span> row holds five commands: <span class="ui">New</span>, <span class="ui">Open</span>, <span class="ui">Save</span>, <span class="ui">Save As</span>, and <span class="ui">Export</span>. <kbd>Ctrl</kbd><span class="plus">+</span><kbd>S</kbd> and <kbd>Ctrl</kbd><span class="plus">+</span><kbd>O</kbd> save and open a <code>.wboard</code> without opening the row at all.</p>
<p><span class="ui">Export</span> (<kbd>Ctrl</kbd><span class="plus">+</span><kbd>E</kbd>) writes the board as a PowerPoint deck. The board is cut into areas wherever it is empty: a picture or a note keeps the ink drawn on it, and a stroke that spans two of them keeps them together. Each area becomes a slide, with the text containers in the speaker notes so that DAX and SQL can be copied, and an overview slide first shows where every slide sits on the board. The dialog previews the areas, numbered, and the <span class="ui">Gap between areas</span> slider and <span class="ui">Smallest text on a slide</span> change the cut as you move them. <span class="ui">Drawing order</span> puts slides in the order the areas were begun; <span class="ui">Reading order</span> goes top-left to bottom-right.</p>
<p><span class="ui">Slide content</span> chooses between <span class="ui">Picture</span>, one exact picture of the area, and <span class="ui">Editable</span>, which puts images and text containers on the slide as PowerPoint objects, keeps the DAX and SQL colors as text runs, and lays all the ink over them as one transparent picture. Editable is for a deck that will be reworked; Picture is for one that will be shown.</p>
<p>Choose <span class="ui">PDF</span> in the same dialog for a document instead: the same areas, one per A4 or Letter page in landscape, each with a bookmark, and a footer with the board name, the date, and the page number. <span class="ui">Whole board on one page</span> writes a single page the shape of the board, to be read by zooming, which suits a board that is one drawing. <span class="ui">Page content</span> chooses between <span class="ui">Picture</span>, exact, and <span class="ui">Vector</span>, which draws the ink as paths and the text as text, so the page stays sharp at any zoom and DAX or SQL can be selected and copied from it.</p>
<p><span class="ui">Export</span> (<kbd>Ctrl</kbd><span class="plus">+</span><kbd>E</kbd>) writes the board as a PowerPoint deck or a PDF. The board is cut into areas where it is empty, one slide or page per area, with an overview first. The dialog shows the areas numbered on the board; the gap and text-size settings change the cut as you move them, and the order can follow the drawing or the reading direction.</p>
<p><span class="ui">Slide content → Editable</span>, the default, puts images and text containers on the slide as objects with the ink over them; <span class="ui">Picture</span> is one exact picture of the area. Text containers also go in the speaker notes.</p>
<p><span class="ui">PDF</span> writes one A4 or Letter page per area, each with a bookmark and a footer, or the whole board on one page. <span class="ui">Vector</span> pages keep the ink as paths and the text selectable.</p>
<p>The released installer registers that type and <code>.wimport</code>. The pre-release (Dev) channel does not, so it can sit beside a released copy without stealing the file association.</p>

<figure class="fig">
Expand Down