Install
This is the repository archive. It installs, but the folder name will carry the branch suffix and updates will not flow.
Install straight from GitHub with WP-CLI:
wp plugin install https://github.com/aparatofan/tbt-hub/archive/refs/heads/main.zipCentral admin menu and index page for all TBT plugins, and the canonical source of the shared TBT design system.
Other plugins add themselves to the Overview page through the tbt_hub_items
filter, so the index always reflects what is actually installed and active.
The shared design system
TBT Hub owns four stylesheet handles:
| Handle | File | Depends on |
|---|---|---|
tbt-tokens |
assets/css/tbt-tokens.css |
— |
tbt-components |
assets/css/tbt-components.css |
tbt-tokens |
tbt-tree |
assets/css/tbt-tree.css |
tbt-tokens |
tbt-rail |
assets/css/tbt-rail.css |
— (deliberate — see below) |
tbt-tree is deliberately not folded into tbt-components: a page that wants
the mark rarely wants the whole component library. It reads --tbt-blue for
the leaf stroke, which is why it depends on the tokens.
tbt-rail follows the same precedent for the same reason, and goes one step
further: it declares no dependency, because every custom property in it
carries a literal fallback and it is meant to render in a plugin that does not
load tbt-tokens. See The navigation rail.
All four are registered, never enqueued, on wp_enqueue_scripts at
priority 5. A registered handle costs nothing on a page that does not ask
for it, so the design system reaches exactly the pages a tool renders on.
Priority 5 is what lets consumers on the default priority of 10 find the
handles already present.
Who consumes them
Keep this table current. It is what makes the blast radius of an edit to
tbt-tokens.css visible from the Hub itself.
| Plugin | Handles used | Vendored fallback | Container |
|---|---|---|---|
| TBT Notes | tbt-components (and tbt-tokens through it) |
assets/vendor/tbt/ — both files |
.tbt-tool |
| TBT Matching Games | tbt-tokens |
assets/vendor/tbt/ — tokens only |
.tbt-tool |
| TBT Swipe | none — private vocabulary, private handle | n/a | .tbt |
TBT Swipe is deliberately outside this system. It is isolated behind its own handle and cannot be affected by a change here. Migrating it is a separate piece of work with open design questions.
The tree mark
The animated TBT tree is inlined by the [tbt_tree] shortcode, so the Divi
header row and any plugin hero render one mark from one source instead of a
pasted copy per surface.
[tbt_tree] 190px, blooms on load
[tbt_tree width="240px"] wider
[tbt_tree animate="no"] settled tree, no bloom
[tbt_tree class="tbtmg-hero__mark"] extra host class
The shortcode enqueues tbt-tree itself and emits
<span class="tbt-tree-host …"><svg class="tbt-tree" …>. The SVG carries no
ids, so two marks on one page stay valid markup. The bloom is pure CSS: each
leaf carries a baked --tbt-tree-wave index, six waves centre outward, so
there is no script to load and no flash of an unstyled mark.
Maintenance. assets/img/tbt-tree.svg is a transformed export, not a raw
one. If the tree is re-exported from Illustrator, two steps must be re-applied
or the mark renders unstyled and unanimated:
- Rename the export's
.cls-Nclasses to the semantic onestbt-tree__leaf(--89/--81for the two translucent variants),tbt-tree__figure--le/--gi/--pd, plustbt-tree__eoon thefill-rule: evenoddpaths — and strip the `