# blockr.core 0.1.3

* Block-server construction is now ordered by visibility -- on-screen blocks
  and their upstream closure build first, the rest in the background (option
  `background_construction_delay`, default 50 ms; 0 opts out).
* Blocks now carry an eval status (`dormant`, `waiting`, `unset`, `failed`,
  `ready`) that gates evaluation, rendering and downstream data, so a block
  never evaluates against missing inputs or shows a stale result.
* Code export (`generate_code()`) now waits until every block is settled,
  showing a "board not ready" note instead of a partial script.
* Block conditions (errors, warnings, messages) are exposed as tidy data frames
  via `server$conditions` and `board$conditions()`; the block server no longer
  returns its raw `cond` object.
* The `notify()` helper gains `glue` and `log` arguments for literal
  (brace-safe) text and skipping redundant logging.
* The `allow_empty_state` argument of `new_block()` now accepts a structured
  `list(input = ..., data = ...)` form to relax required inputs and the
  variadic minimum per input kind.
* Boards for incoming requests are now resolved by an app-level `loader`
  argument to `serve()` (default `local_loader()`); this drops the
  process-global staging slot, so `get_serve_obj()` and `restore_board()`'s
  `meta` argument are gone.
* Block- and registry-contributed board options (e.g. the table preview
  `page_size`, `n_rows`, `filter_rows`) are now saved and restored, not reset
  to defaults on reload.
* Boards can be deployed read-only via the server-enforced `blockr.locked`
  option, which refuses every mutation while set.
* Block registration metadata can now be declared with roxygen2 tags
  (`@block`, `@blockArg`, ...), collected by the new
  `block_registration_roclet()`; extension packages register via the exported
  `register_package_blocks()`.
* Block registry entries gain a structured argument spec (`new_block_args()`,
  `new_block_arg()`) with JSON-Schema-subset `type` descriptors (`arg_string()`,
  `arg_enum()`, ...), read via `block_metadata()`; `registry_metadata()` is
  deprecated.
* The manage-links and manage-stacks plugins no longer flicker cell inputs,
  clobber staged edits, or needlessly re-render on a board re-emit.
* Board accessors (`board_blocks()`, `board_links()`, `board_stacks()`) are now
  pure reads, removing quadratic re-validation that dominated large-board
  startup.
* New exported generic `external_ctrl_vars()` and predicate
  `has_external_ctrl()` expose a component's externally controllable variables.
* New exported `trim_rv()` fully removes entries from a `reactiveValues` object
  (assigning `NULL` leaves the key behind); unlinking a variadic argument now
  drops it outright.
* The `str_value()` compact printer, with matching `utils::str()` methods, now
  covers all remaining domain classes and containers.
* The `blockr_deser.list()` method now forwards `...` to per-class
  deserializers, letting callers thread context to nested deserializers.

# blockr.core 0.1.2

* The `mod` slots in `update(...)` payloads for **blocks, links and
  stacks** now uniformly expect a **delta** shape: a named list keyed
  by entry ID, where each entry is a named list of argument values to
  apply on top of the live entry.
  - For `blocks`, keys must be in `block_external_ctrl_vars(blk)` —
    non-ctrl-able changes go through `rm` + `add`. Ctrl-arg writes hit
    the corresponding `reactiveVal` in place; `block_name` (always
    treated as ctrl-able) updates the block's registry attribute.
  - For `links` and `stacks`, deltas are merged onto the current entry
    via the new `update_link()` / `update_stack()` S3 generics. The
    default methods reconstruct the entry through its stored
    constructor, preserving sub-class attributes. Sub-class owners
    (e.g. `dock_stack` adding `color`) only need to register a method
    when their constructor deviates from the convention (#175).
* `block_external_ctrl_vars()` always includes `"block_name"` — every
  block can be renamed through `update(...)` regardless of its
  `external_ctrl` opt-in. The default ctrl plugin panel renders a
  `block_name` field on every block card alongside any opted-in ctrl
  vars. `block_supports_external_ctrl()` (which would now be `TRUE` for
  every block) has been removed; the gates that used to call it have
  been simplified accordingly.
* The default `block_server.block` now constructs a `block_name`
  `reactiveVal` per block and appends it to the `vars` list passed to the
  ctrl plugin. Two guarded observers keep that `reactiveVal` in sync with
  the block's `block_name` attribute on the board (one emits an
  `update(mod = ...)` when the ctrl plugin writes the rv; the other
  pulls registry-attr changes back into the rv). The `ctrl_block_server`
  plugin signature is unchanged — block authors and custom ctrl plugins
  see uniform `vars` reactiveVals.
* A blockr option `attach_default_packages` can be set to opt into evaluating
  block expressions with objects from default packages directly available.
* Add `ctrl_block()` plugin for external block control, allowing blocks to be
  driven programmatically from outside the standard block UI.
* Add `clear_board()` for removing all blocks/stacks from a board.
* Add `bbquote()` and helpers (`.`, `..`) for cleaner code generation via
  `bquote()`-based quasiquotation.
* Export `custom_plugins()` and `custom_options()` for easier board
  customization.
* Add `block_metadata()` for retrieving per-block metadata and attach block
  metadata with defaults to block objects.
* Export test utilities (`blockr_test_exports()`, `new_mock_session()`,
  `export_safely()`) for use in downstream package tests.

# blockr.core 0.1.1

* Add Block-level notifications via (optional) `expr` server return value
  component `cond`.
* Export `get_board_option_value()` to make available current option settings
  via `session$UserData`.
* Introduce (optional) dependency on [thematic](
  https://rstudio.github.io/thematic/) to auto-style plots.
* Export `toolbar_ui()` which takes case of the "core" toolbar UI component.
* Utility functions `chr_ply()` and related, as well as miscellaneous utilities
  such as `set_names()`, `coal()`, etc. are now exported for use in dependent
  packages.
* Export `export_code()` to make it easier for third-party `generate_code()`
  plugin implementations.
* Use `evaluate::evaluate()` to capture plots.
* Add `new_fixed_block()` for applying a fixed (i.e. non-paramtetrized)
  transformation to data input.
* Board server callbacks are invoked with an additional argument `session`.
* Export assertion utilities such as `is_string()`, `is_count()`, etc.
* Improved ser/des, which now includes package/constructor information for all
  board, blocks, stacks and options. The corresponding infra
* Board options now contain UI/server components to provide more options for
  customization. Also blocks can require certain options to be available.
* Introduces `block_render_trigger()` to control per block class when to
  re-render the block output.
* Rework of block notifications to provide a `reactiveValues()` object
  containing notification types a separate components.
* Auto-ID generation can now be customized with a default provided by the ids
  package (if available).
* Use the glue package for logging/block notifications; add a glue-based text
  block.
* New board restore mechanism based on `session$reload()`.
* Improvements to the registry: block icons and a fixed set of categories.

# blockr.core 0.1.0

* Initial CRAN submission
