Changelog
v1.0.0-beta.5 (2025-12-09)
- Table input suggestions are now more visible (with a blueish outline)
- Update
Tableprops and events: use pkey instead of row_key. Imperative handle now exposes scroll_to_row_idx and scroll_to_row_id. All row callbacks now receive row_id first, followed by row_idx, column, etc., and row_id can be None when unset. Adjust your handlers and highlighted-row keys to match. - Dataset explorer factory inputs (metanno/recipes/explorer.py):
- create_table_widget is keyword-only and uses the new Table API and handle (TableWidgetHandle with scroll/filter/highlight helpers). If you passed handlers, update them to the new signatures with row_id.
- New form widget: create_form_widget renders a single record with text, select, and boolean inputs.
- Text handle keys are renamed to set_doc_by_id, get_doc_id, scroll_to_span, set_highlighted_spans, and set_doc_by_id. New on_click_span callback added and hover callback now passes (span_ids, mod_keys).
- Added
begin_key,end_key,primary_key,style_key,label_keyandhighlighted_keyto allow the user to customize the provenance of these attributes in theAnnotatedTextcomponent span data. Breaking API change in
metanno.recipes.explorer:create_table_widget:pkey_column->primary_keyhidden_columns->hidden_keysid_columns->id_keyseditable_columns->editable_keyscategorical_columns->categorical_keysfirst_columns->first_keys
create_text_widget:text_pkey_column->text_primary_keyspans_pkey_column->text_primary_key- new
primary_key - new
begin_key - new
end_key - new
style_key - new
label_key - new
highlighted_key
- Minor documentation fixes.
v1.0.0-beta.4 (2025-11-26)
- Moved
pret.ui.metannotometanno.ui(accessible viafrom metanno import ...) - Renamed
actionsprops tohandleand manage them like true refs (i.e., users should access its content viahandle.current.xxx) - Added
on_mouse_hover_spansandon_mouse_hover_rowprops toAnnotatedTextandTablecomponents, which should offer a more reliable way to highlighted spans/rows on mouse hover - Refactored the
explorerrecipe andexamples/quaero.pyexample to use widgets instead of a complex/monolithic app
v1.0.0-beta.3 (2025-08-21)
- Fix AnnotatedText bug in text selection on desktop browsers
v1.0.0-beta.2 (2025-08-18)
- Improved visibility of highlighted spans and layout of boxes with mixed inset/outset nesting
- Improved autocompletion experience for table suggestion inputs
- Improved tokenization of text, now allowed to split around dashes (-).
- Added theoretical support for touch screens (lightly tested)
- Added tutorials
- Setup
- Run the Quaero Explorer app
- Customize the explorer
v1.0.0-beta.1 (2025-06-06)
- Complete refacto of the framework: the Python-JS synchronized app mechanisms have been moved to a new library: Pret !
- Text and Table components are now callable directly from python, along other components built around MUI Joy. This gives the user the ability to easily build simple apps, and iterate on the design step by step.
- Metanno now features new Image annotation component.
- The tests run in Python 3.7 - 3.10, using playwright in headless Firefox, Chrome and Webkit.
- Metanno now also has a nice interactive documentation !
Metanno v0
Metanno v0 is a JupyterLab extension for building custom annotation interfaces. It focuses on textual documents with structured entities and aims for modularity, customization, and interactivity. Core features include multi-line and nested span annotations, table-based relational annotations, multiple data types (hyperlinks, text, lists), and an immutable state that can be synchronized between the frontend and backend. The project compiles Python app classes to JavaScript using Transcrypt, enabling fast, browser-side execution while keeping Python code on the kernel side. To create an app, the user must modify one of the apps in recipes/*.py, and handle state management using a huge Redux-style reducer in select_state.
Last items in the v0 changelog:
- Almost complete typescript conversion
- Added column filters
- Customizable undo/redo logic
- Editable span annotations from a table view
- Accessible return value of a Python call from front end (async calls)