Calls stated that a value needs no delimiters if it contains no spaces or
quotes. A colon also requires them: name:value is call syntax, so the text
before the colon is read as a parameter name and the positional parameter
receives nothing, silently.
Call Syntax already has this right - param-name ":" value is one of its
productions - so this brings the prose into line with the grammar, and adds
a warning naming the two ways round it.
* Add $:/core/templates/plain-text core template
This template renders a single `text` variable as plain text using the
<$text> widget. It enables exporting and downloading dynamic strings
via messages like `tm-download-file` using the `variables` paramObject,
eliminating the need to create temporary tiddlers in the wiki store
purely for rendering purposes.
* add release note
* add rendered text template
* update change note
* Fix race condition in plugin library iframe message handling
Introduce a PLUGIN-LIBRARY-READY handshake verb for plugin library iframes.
This ensures that postMessage commands are not prematurely dropped before
the iframe's internal script has fully bound its message listeners.
Retains iframe.onload as a backward-compatible fallback for legacy or
external libraries that do not emit the ready signal.
* add changenote
* feat(plugin-library): add PLUGIN-LIBRARY-READY handshake to plugin library iframe
Add PLUGIN-LIBRARY-READY message emission in libraryserver.js
Signals to parent window when iframe is ready to receive messages
Complements browser-messaging.js PLUGIN-LIBRARY-READY handler
Includes comprehensive tests for callback queueing and handshake flow
Fixes race condition in plugin library iframe message handling
* fix(plugin-library): emit PLUGIN-LIBRARY-READY message on iframe initialization
Emit the PLUGIN-LIBRARY-READY message after the message listener is bound,
signaling to the parent window that the iframe is ready to receive postMessage
commands. This completes the handshake implementation to eliminate the race
condition where messages could be lost before the iframe's script initialization
completes.
* fix indentation
* remove extra space
* remove typo
* refactor(test-browser-messaging): update test descriptions and remove unused code
* lint fix
* fix: correct the update note
Accept a colon in the variable name of a `<<...>>` call and of an
`((...))` attribute reference, restoring the v5.3.8 name character
class. Call Syntax already describes the callee name as any
non-whitespace character other than `(` or `>`, and the colon is only
meaningful at the parameter name position.
* Add test cases for a colon name standalone, as an attribute value, as
an =-separated parameter value, and with named parameters
* Add the 5.5.0 change note
Document the button widget with runnable test cases and explain how its
attributes combine.
* Add eleven test case tiddlers, listed by title prefix so a new one needs
no edit to the widget page
* Describe the order in which a button runs body actions, to, message,
popup, set and actions, whatever order they are written in
* Prefer class over a hardcoded style
* Add GroupedLists examples
Document grouped lists with runnable test cases over a shared
bibliography sample.
* Cover plain grouping, search, tabs by first character, both combined,
and grouping on one field while searching another
* Name the grouped field in one procedure, so the grouping changes in
one line
* Import it with import-compound, and list the examples by tag so a new
one needs no page edit
* Rewrite the opening paragraph, which described only the sidebar tabs
* Replace GroupedLists code dumps with examples
Turn the two sidebar tabs the page describes into runnable test cases,
and tighten how the examples handle an empty result.
* Give each new example its own dummy payload, and point the page at the
live tabs instead of quoting core source
* Carry the values through the filter from the start, so an All tab with
no matches yields nothing rather than the literal All
* Use the list-empty widget
* use tc-tiny-gap instead of -left -right
* Refactor class attributes for edit field wrapper
The problem here is, that if we have an existing field with name - say - "field1" and we want to add a field with name "field12345", at the moment we insert "field1" the edit-text widget re-renders because its classes change. The `tc-edit-field-exists` class must go outside to the container div.
* Add changenote for bugfix in field-name inputs
Fixes the field-name input re-rendering issue that caused loss of focus when inserting existing field-names.
* Add class assignment to DOM node in editor
* Fix indentation in assignDomNodeClasses method
* Fix conditional check for changedAttributes class
* Improve class assignment in EditTextWidget
Refactor class assignment logic to avoid duplicates and handle whitespace.
* Refactor DOM class assignment in EditTextWidget
* Refactor updateDomNodeClasses for clarity and efficiency
* Add changenote for enhancement in editor refresh behavior
* make sort order more consistent
* Fix tests, as they are to be different due to the change.
* Add ChangeNote
* sortby: add "end" operand to place unlisted last
Give the sortby filter operator an optional second operand `end` that
places input titles missing from the reference list after the listed
ones, while the default still keeps them at the start.
* x-listops: read a second operand; `end` sorts unlisted titles to the
end of the list, the default (no operand) leaves them at the start
* Document the optional `place` parameter on the sortby operator and
rename the operator and examples tiddlers to match their titles
* Add a `sortby[...],[end]` example to the operator examples
* Replace the 5.5.0 change note with one describing the new `end`
operand and its unchanged default
* Extend the sortby tests to cover both default (unlisted first) and
`end` (unlisted last) placement
* Make the sortby end flag a suffix
Specify the placement of unlisted titles with an operator suffix.
Eg: `sortby:end[a b c]`
* Read the flag from `operator.suffix`
* Move the example and the change note to the suffix syntax
* Switch the sortby tests to the suffix syntax
* Cover the sortby guard and unlisted ordering
Close gaps found by mutating the sortby operator
* Sort two titles to catch an off-by-one in the length guard
* Keep unlisted titles in input order under the `end` suffix to catch a
comparator tie break
* Return a single title untouched, exercising the early return
* Touch a temp tiddler when removing a tag
Like that removing a tag doesn't make TiddlyWiki5 wait for the Typing timeout to remove it but removes it instantly, because also a non-draft Tiddler has changed
* Add release notes for bugfix in Edit Mode tags
Fixes an issue where tags of Tiddlers in Edit Mode don't animate instantly when they get removed.
* Add inline comment
* Update release version to 5.5.0 in changenote
* [DOCS] Update [[Custom Widgets]] with new example for overriding LinkWidget
* fix: non-svg link icon are now sizing properly
* replace HelloThere by list-link in the example for robustness
* Add class to span for better styling in Custom Widgets
* Fix typo in Custom Widgets.tid documentation
* Improve doc by using the proper macro to link widgets
* Change font size style to important for title icon
Updated the font size style for the title icon to be important.
* Update transclude and slot elements in Custom Widgets
Provide a fallback if no body for the link is given
* Enhance link widget to show icons conditionally
Updated the link widget to conditionally display an icon next to the link based on the target tiddler's icon field. Modified the rendering logic to use a conditional statement for the icon display.
* Change transclude height to size in Custom Widgets
* Fix $tw.utils.pulseElement() by replacing missing $tw.browser.animationEnd
Use $tw.utils.convertEventName("animationEnd") and add pulse CSS animation
Fixes#6835
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* Add ChangeNote
* add tc- prefix to pulse class
---------
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* Keep retained tiddler subdirectories on save
Make generateTiddlerFilepath keep a retained tiddler's recorded subdirectory
and produce a valid filename for every path segment.
* Normalise originalpath separators to "/" before the sanitiser, so recorded
subdirectories survive
* Validate each path segment (reserved names, trailing dots or spaces), so
"sub/CON" is valid on every OS
* Run that pass after transliteration, which can itself create a reserved name
* Add filesystem and adversarial specs, covering generateTiddlerFileInfo and
generateTiddlerExtension
* update changenote
Make the button widget apply selectedClass correctly when the state is
addressed with setTitle instead of set.
Issue #9949, the button could not be rendered at all
* Guard the setField read in isSelected(), which dereferenced the result of
getTiddler() directly. A missing state tiddler threw a TypeError, and that
tiddler is normally only created by the first click
Issue #9950, every button of a set reported itself as selected
* Rewrite isSelected() as an if/else. The nested ternary mixed `||` with
`?:`, so the setTitle branch returned a fallback value instead of a
comparison
* Watch the setTitle state tiddler in refresh(), so the selected class
follows the state as it already does for set
Documentation and tests
* Document that setField takes preference over setIndex. That has always
been the behaviour, it was never written down
* Document that selectedClass and default apply to setTitle as well as to set
* Add wiki based test cases for the set, setTitle, setField and setIndex
selection paths. Six of the seven fail against v5.4.1, the one that passes
uses set, which was never broken
Fixes#9949Fixes#9950
* feat: enhance makepatches function to support multiple suffixes and JSON output format
* feat: add release notes for makepatches JSON output enhancement
* doc: update makepatches operator documentation to document new json output
* doc: add JSON output examples to makepatches and applypatches documentation
* chore: convert space indentations to tabs
* test: add tests for makepatches operator with JSON output support
* chore: change space to tab indentation
* test: add DiffMergePatch4 integration test for testing makepatches json output
* fix: remove superfluous heading character
* refactor the parsing of the makepatches suffixes
Co-authored-by: Saq Imtiaz <saq.imtiaz@gmail.com>
* refactor: improve makepatches function for better readability and performance
* chore: apply style guide by collapsing consecutive variable assignments
* chore: remove extraneous tabs
---------
Co-authored-by: Saq Imtiaz <saq.imtiaz@gmail.com>
The panel is now chosen from the current palette's own customisations field
before falling back to the consolidated palette, so AutoToggle keeps its
panel after a palette has been chosen in it. Also mirrors the colour scheme
inheritance hop in the palette preview, and removes two leftover DeltaPhi
suffixes
Customisations no longer modify the palette tiddler. They are stored in a
tiddler titled $:/config/PaletteCustomisations/<palette-title> that imports
the palette and is compiled in its place, so plugin palettes continue to
receive updates. Adds a reset button to the palette chooser, and a warning
banner and per-entry markers to the palette editor. Also excludes the type
field from palette field inheritance, which previously broke compilation of
JSON data tiddler palettes