Commit Graph
314 Commits
Author SHA1 Message Date
Zef Hemel dbcef9e8aa Fix: make sure Edit buttons work even for Lua expressions and code
widgets whose bodies appear multiple times in the same page (previously
always jumped to first).
2026-03-12 14:13:18 +01:00
Matouš Jan FialkaandGitHub 1f7a4d7d66 Fix attribute rendering (#1880)
* Fix table row parser

Signed-off-by: Matouš Jan Fialka <mjf@mjf.cz>

* Remove all `{[command button]}` remnants

Signed-off-by: Matouš Jan Fialka <mjf@mjf.cz>

* Render `Attribute` nodes in HTML like CodeMirror does

This patch

- ensures always render `Attribute`,
- produces `sb-attribute` span with sub-spans matching CodeMirror DOM,
- removee `preserveAttributes` from Markdown render options and callers.

Finally the attributes looks the same everywhere (table, text, widget).

Signed-off-by: Matouš Jan Fialka <mjf@mjf.cz>

---------

Signed-off-by: Matouš Jan Fialka <mjf@mjf.cz>
2026-03-12 13:50:09 +01:00
Matouš Jan FialkaandGitHub b83c1e03d2 Fix Markdown table rendering and remove deprecated command button remnants (#1879)
* Fix table row parser

Signed-off-by: Matouš Jan Fialka <mjf@mjf.cz>

* Remove all `{[command button]}` remnants

Signed-off-by: Matouš Jan Fialka <mjf@mjf.cz>

* Add tests

Signed-off-by: Matouš Jan Fialka <mjf@mjf.cz>

* Fix extended task rendering in case of following EoL

Signed-off-by: Matouš Jan Fialka <mjf@mjf.cz>

---------

Signed-off-by: Matouš Jan Fialka <mjf@mjf.cz>
2026-03-12 13:46:48 +01:00
Zef HemelandGitHub 3df11ccf3d Implements custom markdown syntax extensions (EXPERIMENTAL) (#1881)
Alternative implemention of #1727
2026-03-12 13:40:20 +01:00
Matouš Jan FialkaandGitHub fea7e5a508 Merge branch 'main' into liq-implement-offset 2026-03-11 18:49:29 +01:00
Zef HemelandGitHub f898c44196 Merge pull request #1877 from mjf/liq-implement-order-by-for-aggregates
[LIQ] Implement `order by` for aggregates
2026-03-11 16:54:07 +01:00
Matouš Jan FialkaandGitHub 9104231132 Merge branch 'silverbulletmd:main' into liq-implement-offset 2026-03-11 15:23:16 +01:00
Zef Hemel 1beb13a134 Fix: regression where multi-line markdown results from Lua directives
would _always_ be rendered as inline.

Added back the old heuristic check.
2026-03-11 14:55:02 +01:00
Zef Hemel e799d30c63 Some more build cleanup 2026-03-11 14:28:45 +01:00
Matouš Jan Fialka 5205ab5154 [LIQ] Implement offset (4: add tests)
Signed-off-by: Matouš Jan Fialka <mjf@mjf.cz>
2026-03-11 11:47:11 +01:00
Matouš Jan Fialka 11a5fb1a5a Merge branch 'main' into liq-implement-offset 2026-03-11 11:38:52 +01:00
Matouš Jan Fialka 6970c41a4e [LIQ] Implement offset (1: make generate)
Signed-off-by: Matouš Jan Fialka <mjf@mjf.cz>
2026-03-11 11:36:46 +01:00
Matouš Jan Fialka 76fe46e590 [LIQ] Implement offset (2: update AST, parser and eval)
Signed-off-by: Matouš Jan Fialka <mjf@mjf.cz>
2026-03-11 11:35:19 +01:00
Matouš Jan Fialka a8c0538627 [LIQ] Implement offset (1: grammar)
Signed-off-by: Matouš Jan Fialka <mjf@mjf.cz>
2026-03-11 11:34:26 +01:00
Zef Hemel 0cc7091b7d Remove vim mode from mini-editor, which didn't really work anyway 2026-03-11 10:15:46 +01:00
Zef Hemel a080ee3b15 Optimize bundle size + chunked builds + JIT loading
* Replaced AJV with other JSON schema library
* Turndown and Vim mode (very large) now only loaded when used
* Chunked builds with ESBuild
2026-03-11 10:04:13 +01:00
Matouš Jan Fialka a1b3c7f083 Reformat
Signed-off-by: Matouš Jan Fialka <mjf@mjf.cz>
2026-03-11 09:43:08 +01:00
Matouš Jan Fialka 9be3490575 Resolve merge conflicts with main branch
Signed-off-by: Matouš Jan Fialka <mjf@mjf.cz>
2026-03-11 09:37:37 +01:00
Matouš Jan Fialka 7eca1562e0 [LIQ] Implement intra-aggregate order by (4: add Space Lua tests)
Signed-off-by: Matouš Jan Fialka <mjf@mjf.cz>
2026-03-11 08:43:16 +01:00
Matouš Jan Fialka 10f7d5d1b4 [LIQ] Implement intra-aggregate order by (3: add TS tests)
Signed-off-by: Matouš Jan Fialka <mjf@mjf.cz>
2026-03-11 08:42:23 +01:00
Matouš Jan Fialka 8fdc61aa7a [LIQ] Implement intra-aggregate order by (2: make generate-ed files)
* Add files generated by `make generate` from `lua.grammar`.

Signed-off-by: Matouš Jan Fialka <mjf@mjf.cz>
2026-03-11 08:41:14 +01:00
Matouš Jan Fialka af6c0e338b [LIQ] Implement intra-aggregate order by (1)
* Add support for `order by ...` inside aggregate function calls, e.g.,
  `array_agg(p.name order by p.name asc)` matching Postgres
  per-aggregate ordering semantics.

* Add support for extra arguments for aggregates.

Signed-off-by: Matouš Jan Fialka <mjf@mjf.cz>
2026-03-11 08:35:48 +01:00
Zef Hemel 81408ed5cf Refactor TopBar component
Extracts various part into separate components
2026-03-10 16:11:33 +01:00
Zef Hemel ec40aa0838 Add action buttons to flashNotification
Used by upgrade notification
2026-03-10 16:07:25 +01:00
Zef Hemel d9f4b93795 Eliminate (most) uses of the client global
Also an opportunity to refactor the transclusion code, which had become
very messy
2026-03-10 14:02:05 +01:00
Zef Hemel fd1a81b8d8 Client refactor: move UI related APIs to editor_ui.ts 2026-03-10 12:42:26 +01:00
Zef Hemel 6d33d3d8ac Refactor: extract page/document manager into separate class 2026-03-10 12:33:34 +01:00
Zef Hemel cb9f954bc7 Refactor: extract widget cache from Client class 2026-03-10 12:17:02 +01:00
Zef Hemel 822997fd5e Client available upgrade notification
If the server is updated, but the client doesn't match the server
version, a notification will appear instructing the user to reload.
2026-03-10 12:05:33 +01:00
Zef Hemel c2d42849a9 A few more format and type fixes 2026-03-10 09:42:48 +01:00
Zef Hemel 799e27a9b4 Enable biome based formatter and reformat 2026-03-10 09:38:59 +01:00
Zef Hemel cce5b669f6 Merge branch 'main' into to-node 2026-03-10 08:57:58 +01:00
Matouš Jan Fialka 9c9ca047f0 Fix: Handle tagged floats before plain object check in renderCellContent
Tagged floats (`{value: N, isFloat: true}`) were matched by
`isPlainObject` and rendered as a two-column table with "value" and
"isFloat" headers instead of as a formatted number. This is now fixed.

Signed-off-by: Matouš Jan Fialka <mjf@mjf.cz>
2026-03-09 12:57:53 +01:00
Matouš Jan Fialka 2aaa797bda Improve Lua Widget Rendering
Lua `${...}` expression results are rendered using two parallel paths:

- **HTML path** (display path) for visual display in the editor and
- **Markdown path** (copy path) for the *copy button* output.

Every Lua value is classified as one of:

- **Scalar:** number, string, boolean, or `nil`
- **Empty table:** `{}`
- **Array:** a `LuaTable` with only sequential integer keys (no string keys)
- **Array of tables:** an array where every element is a `LuaTable`
- **Record:** a `LuaTable` with any string key (may also have integer keys)

Scalars are rendered as inline Markdown - wiki links, tags, bold, and
other inline syntax are resolved, `nil` renders as `<span data-empty>`.

Empty tables render as `<table data-table-empty>`.

An array of tables renders as a multi-row `<table>`. Column headers
are the union of all element keys. Each cell value recurses through
the same classification.

An array of scalars (or a mix of scalars and tables) renders as `<ul>`
with one `<li>` per element. Each item value recurses.

A record renders as a single-row `<table>` with one column per key.
Cell values recurse.

Every `<td>` carries `data-table-cell-type` and optionally
`data-table-cell-empty`.  Every `<li>` carries `data-list-item-type` and
optionally `data-list-item-empty`.  The outermost element carries
`data-type`.  These attributes allow CSS styling of rendered widgets.

Nesting is **unlimited**. Tables inside cells, lists inside cells,
tables inside list items all render correctly in HTML.

Scalars render as plain text. Lua `nil` renders as `nil`. Empty tables
render as `*(empty table)*`.

An array of tables renders as a pipe-delimited Markdown table. Nested
values in cells are rendered as Lua literals via `toStringAsync()`
(e.g. `{1, 2, 3}` or `{a = 1}`), since Markdown table cells cannot
contain block-level content.

An array of scalars renders as a Markdown list (`- item`). When a list
item is itself multi-line (a sublist) it uses an empty bullet with
two-space indented content on the next line:

```
- 1
- 2
-
  - nested 1
  - nested 2
```

Nested tables or arrays **beyond the first list nesting** level are
rendered as Lua literals.

A record renders as a single-row Markdown table.

Column headers follow the order returned by `LuaTable.keys`: string keys
in their insertion order, followed by integer keys in ascending order.
For example, `{a = 1, b = 2, 3, d = 4}` produces columns `a
| b | d | 1`. This is consequence of `LuaTable` storing string keys
and the array part separately (for performance).

Arrays mixing plain scalars and record-like tables (e.g.  `{1, 2, 3,
{a=3}}`) were previously rendered as a single flat table due to an
internal JS conversion (`toJS`). They now render as a list, with record
elements shown as nested tables - which more accurately reflects their
Lua structure. This is the only divergence from the original
presentation.

To restore the old tabular layout, wrap all elements as records with
a consistent key:

```lua
-- Before (was a flat table, now a list with nested table):
${{1, 2, 3, {a=3}}}

-- After (explicit records, renders as a table):
${{{value=1}, {value=2}, {value=3}, {a=3}}}
```

Signed-off-by: Matouš Jan Fialka <mjf@mjf.cz>
2026-03-09 11:45:04 +01:00
Zef Hemel a5c9227499 deno fmt 2026-03-08 16:11:29 +01:00
Zef Hemel 0452910b0b Fixes #1777 2026-03-08 16:00:18 +01:00
Zef Hemel bbcd9ac6aa Introduce new noFloatingPromises lint rule and fix violiations 2026-03-08 15:49:45 +01:00
Zef Hemel 5c9dba30de Merge branch 'main' into to-node 2026-03-06 14:37:03 +01:00
Zef Hemel 82f1c9dd74 Cleaned up imports/exports 2026-03-06 14:36:23 +01:00
Matouš Jan Fialka 81f5ec7f67 Fix table cell alignment for missing and misaligned cells
The table style is determined by the header row. After normalizing the
header (filling empty cells between consecutive delimiters), extract
two properties: the column count and whether the header starts with
a delimiter.

For each data row, normalization proceeds in three steps. First, fill in
empty cells between consecutive delimiters (this handles empty cells in
the middle of a row). Second, if the header has no leading delimiter but
the row does, insert an empty cell after the row's leading delimiter (this
corrects the one-position shift caused by the row having a leading pipe
that the header lacks. Third, if the row has fewer cells than the header
column count, pad with empty cells at the end (this handles rows that
are shorter than the header because trailing pipes or cells were
omitted).

The same normalization is applied both in the renderer and the indexer.

Signed-off-by: Matouš Jan Fialka <mjf@mjf.cz>
2026-03-06 14:20:48 +01:00
Zef Hemel 947edf52c8 Remove redundant type argument 2026-03-06 13:59:37 +01:00
Zef Hemel 3859af0260 Remove redundant Deno global vars 2026-03-06 13:57:28 +01:00
Zef Hemel adfa5e5596 Bring autofocus back in auth 2026-03-06 13:53:57 +01:00
Zef Hemel 8a2424f27f Fix mini editor regressions 2026-03-06 13:50:29 +01:00
Zef Hemel d6424b714a Merge branch 'main' into to-node 2026-03-06 13:38:23 +01:00
Zef HemelandGitHub c75f48d8a3 Merge pull request #1819 from onespaceman/panels
Panels - strings to elements
2026-03-06 13:30:03 +01:00
Matouš Jan FialkaandGitHub b5fadf4dc2 Merge branch 'silverbulletmd:main' into fix-table-indexer-empty-cells 2026-03-06 08:58:08 +01:00
Matouš Jan Fialka 9b37060d9f Extract normalizer to helper shared by both parser and renderer
Signed-off-by: Matouš Jan Fialka <mjf@mjf.cz>
2026-03-06 08:45:16 +01:00
Zef Hemel 06e4a4c7ed Fixes #1869 2026-03-06 08:20:45 +01:00
Zef Hemel dbf275d75b Introduce biome as linter with lint fixes 2026-03-06 08:05:13 +01:00