@aglyn/aglyn 1.0.0-beta.215 → 1.0.0-beta.216

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (26) hide show
  1. package/package.json +11 -11
  2. package/src/lib/app-utils/deferred-image.d.ts +3 -3
  3. package/src/lib/app-utils/deferred-image.js +3 -3
  4. package/src/lib/app-utils/deferred-image.js.map +1 -1
  5. package/src/lib/app-utils/docs-index.generated.js +11 -4
  6. package/src/lib/app-utils/docs-index.generated.js.map +1 -1
  7. package/src/lib/app-utils/marketplace-theme.d.ts +9 -4
  8. package/src/lib/app-utils/marketplace-theme.js +11 -1
  9. package/src/lib/app-utils/marketplace-theme.js.map +1 -1
  10. package/src/lib/app-utils/publisher-agreement.d.ts +36 -1
  11. package/src/lib/app-utils/publisher-agreement.js +48 -1
  12. package/src/lib/app-utils/publisher-agreement.js.map +1 -1
  13. package/src/lib/app-utils/realm-host-surface.generated.js +2 -0
  14. package/src/lib/app-utils/realm-host-surface.generated.js.map +1 -1
  15. package/src/lib/app-utils/theme-library.d.ts +206 -0
  16. package/src/lib/app-utils/theme-library.js +566 -0
  17. package/src/lib/app-utils/theme-library.js.map +1 -0
  18. package/src/lib/foundation/definitions/platform.types.js +2 -1
  19. package/src/lib/foundation/definitions/platform.types.js.map +1 -1
  20. package/src/lib/plugin-manager/feature-plugins.d.ts +44 -0
  21. package/src/lib/plugin-manager/feature-plugins.js +25 -0
  22. package/src/lib/plugin-manager/feature-plugins.js.map +1 -1
  23. package/src/lib/plugin-manager/first-party-plugins.generated.js +11 -0
  24. package/src/lib/plugin-manager/first-party-plugins.generated.js.map +1 -1
  25. package/src/lib/plugin-manager/realm-host-aglyn.generated.js +2 -0
  26. package/src/lib/plugin-manager/realm-host-aglyn.generated.js.map +1 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aglyn/aglyn",
3
- "version": "1.0.0-beta.215",
3
+ "version": "1.0.0-beta.216",
4
4
  "license": "Apache-2.0",
5
5
  "homepage": "https://aglyn.com",
6
6
  "repository": {
@@ -33,16 +33,16 @@
33
33
  "./package.json": "./package.json"
34
34
  },
35
35
  "dependencies": {
36
- "@aglyn/shared-data-enums": "1.0.0-beta.215",
37
- "@aglyn/shared-data-mdi": "1.0.0-beta.215",
38
- "@aglyn/shared-data-types": "1.0.0-beta.215",
39
- "@aglyn/shared-util-email": "1.0.0-beta.215",
40
- "@aglyn/shared-util-first-touch": "1.0.0-beta.215",
41
- "@aglyn/shared-util-http": "1.0.0-beta.215",
42
- "@aglyn/shared-util-logger": "1.0.0-beta.215",
43
- "@aglyn/shared-util-timestamp": "1.0.0-beta.215",
44
- "@aglyn/shared-util-tools": "1.0.0-beta.215",
45
- "@aglyn/shared-util-vendor": "1.0.0-beta.215",
36
+ "@aglyn/shared-data-enums": "1.0.0-beta.216",
37
+ "@aglyn/shared-data-mdi": "1.0.0-beta.216",
38
+ "@aglyn/shared-data-types": "1.0.0-beta.216",
39
+ "@aglyn/shared-util-email": "1.0.0-beta.216",
40
+ "@aglyn/shared-util-first-touch": "1.0.0-beta.216",
41
+ "@aglyn/shared-util-http": "1.0.0-beta.216",
42
+ "@aglyn/shared-util-logger": "1.0.0-beta.216",
43
+ "@aglyn/shared-util-timestamp": "1.0.0-beta.216",
44
+ "@aglyn/shared-util-tools": "1.0.0-beta.216",
45
+ "@aglyn/shared-util-vendor": "1.0.0-beta.216",
46
46
  "@data-driven-forms/react-form-renderer": "^4.2.0",
47
47
  "@msgpack/msgpack": "^3.1.3",
48
48
  "@types/unist": "^3.0.3",
@@ -56,9 +56,9 @@
56
56
  * The set only works if it is the same set everywhere: an image with `lazy`
57
57
  * but no `fetchpriority` outranks an image with both, so a partially-applied
58
58
  * hint re-creates a smaller version of the same inversion. Two of the three
59
- * sites in `collection.tsx` were exactly that — `loading="lazy"` and nothing
60
- * else — which is why this is a named thing to spread rather than a habit to
61
- * remember.
59
+ * sites in the collection elements were exactly that — `loading="lazy"` and
60
+ * nothing else — which is why this is a named thing to spread rather than a
61
+ * habit to remember.
62
62
  *
63
63
  * Spread it, never mutate it:
64
64
  *
@@ -55,9 +55,9 @@
55
55
  * The set only works if it is the same set everywhere: an image with `lazy`
56
56
  * but no `fetchpriority` outranks an image with both, so a partially-applied
57
57
  * hint re-creates a smaller version of the same inversion. Two of the three
58
- * sites in `collection.tsx` were exactly that — `loading="lazy"` and nothing
59
- * else — which is why this is a named thing to spread rather than a habit to
60
- * remember.
58
+ * sites in the collection elements were exactly that — `loading="lazy"` and
59
+ * nothing else — which is why this is a named thing to spread rather than a
60
+ * habit to remember.
61
61
  *
62
62
  * Spread it, never mutate it:
63
63
  *
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../libs/aglyn/src/lib/app-utils/deferred-image.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * The three attributes that defer an image to its own turn (AGL-2486).\n *\n * ## What this is for\n *\n * The Image element already ranks itself: the lead image is `eager` and every\n * later one is `lazy` + `low` + `async`. That reasoning is written out at the\n * `fetchPriority` prop in `libs/plugins/mui/src/lib/components/image.tsx` and\n * is not repeated here.\n *\n * What that fix could not reach is every OTHER `<img>` a published page\n * renders: a product grid, a related-products rail, a wishlist, a cart line,\n * an event thumbnail, a Product card. Those carried **no loading hint at\n * all** — which is `eager` at the browser's default priority. So a product\n * grid four sections down was fetched EAGERLY, at a HIGHER priority than the\n * `lazy` + `low` Image element in the section the reader was actually looking\n * at. That is the reported symptom — \"images several sections below the fold\n * load before the current section\" — and it survived the Image-element fix\n * precisely because ranking the Image elements against each other says\n * nothing about the images that opted out of the ranking entirely.\n *\n * Uniformly `lazy` is also what produces the second half of what the item\n * asks for. There is no \"next section\" hint to give a browser: Chrome fetches\n * a `lazy` image once it comes within its viewport-distance threshold, so\n * ordering among deferred images falls out of distance from the viewport on\n * its own — but ONLY once every image is in that scheme. One unhinted image\n * does not merely rank badly, it leaves the scheme.\n *\n * ## Deliberately NOT applied to\n *\n * The image at the top of a page, which is the LCP candidate: the Image\n * element's lead image, and the product-detail gallery hero. Making those\n * `lazy` would re-introduce the ORIGINAL bug this issue opened with — an LCP\n * image not discovered until after layout. Those sites carry a comment\n * saying so, because \"finish the job\" is the obvious next edit and it is\n * wrong.\n *\n * ## Why a shared constant rather than three literals\n *\n * The set only works if it is the same set everywhere: an image with `lazy`\n * but no `fetchpriority` outranks an image with both, so a partially-applied\n * hint re-creates a smaller version of the same inversion. Two of the three\n * sites in `collection.tsx` were exactly that — `loading=\"lazy\"` and nothing\n * else — which is why this is a named thing to spread rather than a habit to\n * remember.\n *\n * Spread it, never mutate it:\n *\n * ```tsx\n * <Box component=\"img\" src={url} alt=\"\" {...DEFERRED_IMAGE_ATTRIBUTES} />\n * ```\n */\nexport const DEFERRED_IMAGE_ATTRIBUTES = Object.freeze({\n /** Not fetched until the browser decides it is near the viewport. */\n loading: 'lazy',\n /**\n * And when it is fetched, it does not compete with the section on screen.\n * One-directional on purpose: deprioritising an image provably not being\n * looked at cannot starve whatever the LCP turns out to be, whereas\n * PROMOTING one is a claim about every other request in flight that no\n * render-time function is in a position to make.\n */\n fetchPriority: 'low',\n /**\n * Decoded off the main thread. A deferred image has no paint deadline, so\n * decoding it synchronously is main-thread time spent on pixels nobody is\n * looking at yet — which is the same budget item 22 is about.\n */\n decoding: 'async',\n} as const)\n"],"names":["DEFERRED_IMAGE_ATTRIBUTES","Object","freeze","loading","fetchPriority","decoding"],"mappings":"AAAA;;;;;;;;;;;;;;;CAeC,GAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmDC,GACD,OAAO,MAAMA,4BAA4BC,OAAOC,MAAM,CAAC;IACrD,mEAAmE,GACnEC,SAAS;IACT;;;;;;GAMC,GACDC,eAAe;IACf;;;;GAIC,GACDC,UAAU;AACZ,GAAW"}
1
+ {"version":3,"sources":["../../../../../../libs/aglyn/src/lib/app-utils/deferred-image.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * The three attributes that defer an image to its own turn (AGL-2486).\n *\n * ## What this is for\n *\n * The Image element already ranks itself: the lead image is `eager` and every\n * later one is `lazy` + `low` + `async`. That reasoning is written out at the\n * `fetchPriority` prop in `libs/plugins/mui/src/lib/components/image.tsx` and\n * is not repeated here.\n *\n * What that fix could not reach is every OTHER `<img>` a published page\n * renders: a product grid, a related-products rail, a wishlist, a cart line,\n * an event thumbnail, a Product card. Those carried **no loading hint at\n * all** — which is `eager` at the browser's default priority. So a product\n * grid four sections down was fetched EAGERLY, at a HIGHER priority than the\n * `lazy` + `low` Image element in the section the reader was actually looking\n * at. That is the reported symptom — \"images several sections below the fold\n * load before the current section\" — and it survived the Image-element fix\n * precisely because ranking the Image elements against each other says\n * nothing about the images that opted out of the ranking entirely.\n *\n * Uniformly `lazy` is also what produces the second half of what the item\n * asks for. There is no \"next section\" hint to give a browser: Chrome fetches\n * a `lazy` image once it comes within its viewport-distance threshold, so\n * ordering among deferred images falls out of distance from the viewport on\n * its own — but ONLY once every image is in that scheme. One unhinted image\n * does not merely rank badly, it leaves the scheme.\n *\n * ## Deliberately NOT applied to\n *\n * The image at the top of a page, which is the LCP candidate: the Image\n * element's lead image, and the product-detail gallery hero. Making those\n * `lazy` would re-introduce the ORIGINAL bug this issue opened with — an LCP\n * image not discovered until after layout. Those sites carry a comment\n * saying so, because \"finish the job\" is the obvious next edit and it is\n * wrong.\n *\n * ## Why a shared constant rather than three literals\n *\n * The set only works if it is the same set everywhere: an image with `lazy`\n * but no `fetchpriority` outranks an image with both, so a partially-applied\n * hint re-creates a smaller version of the same inversion. Two of the three\n * sites in the collection elements were exactly that — `loading=\"lazy\"` and\n * nothing else — which is why this is a named thing to spread rather than a\n * habit to remember.\n *\n * Spread it, never mutate it:\n *\n * ```tsx\n * <Box component=\"img\" src={url} alt=\"\" {...DEFERRED_IMAGE_ATTRIBUTES} />\n * ```\n */\nexport const DEFERRED_IMAGE_ATTRIBUTES = Object.freeze({\n /** Not fetched until the browser decides it is near the viewport. */\n loading: 'lazy',\n /**\n * And when it is fetched, it does not compete with the section on screen.\n * One-directional on purpose: deprioritising an image provably not being\n * looked at cannot starve whatever the LCP turns out to be, whereas\n * PROMOTING one is a claim about every other request in flight that no\n * render-time function is in a position to make.\n */\n fetchPriority: 'low',\n /**\n * Decoded off the main thread. A deferred image has no paint deadline, so\n * decoding it synchronously is main-thread time spent on pixels nobody is\n * looking at yet — which is the same budget item 22 is about.\n */\n decoding: 'async',\n} as const)\n"],"names":["DEFERRED_IMAGE_ATTRIBUTES","Object","freeze","loading","fetchPriority","decoding"],"mappings":"AAAA;;;;;;;;;;;;;;;CAeC,GAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmDC,GACD,OAAO,MAAMA,4BAA4BC,OAAOC,MAAM,CAAC;IACrD,mEAAmE,GACnEC,SAAS;IACT;;;;;;GAMC,GACDC,eAAe;IACf;;;;GAIC,GACDC,UAAU;AACZ,GAAW"}
@@ -2986,6 +2986,13 @@ export const ASSIST_DOCS_INDEX = [
2986
2986
  anchor: '#open-the-editor',
2987
2987
  text: 'Go to Setup → Theme editor. Changes render in a live preview so you see them immediately.'
2988
2988
  },
2989
+ {
2990
+ path: '/building-sites/theme-builder/edit-your-theme',
2991
+ title: 'Edit your theme',
2992
+ heading: 'Choose a theme',
2993
+ anchor: '#choose-a-theme',
2994
+ text: 'The Theme card at the top of the page picks the theme your site runs:\n- Built-in — Material UI (default), Bootstrap, Minimal (neutral, in the style of shadcn/ui) and Material 3, plus any your plugins add. Each one restyles components (buttons, inputs, cards, tabs, switches, alerts) as well as colors and type, in light and dark.\n- Your themes — themes you saved from this site.\n- From the marketplace — themes you installed.\nChoosing a theme shows a preview first, in light and dark; Use this theme applies it to the live site.\nYour edits never change the theme itself. Everything you set in the editor below is stored as your edits on top of the theme you picked, so:\n- Restore drops your edits and brings the theme back exactly as it was.\n- Save as custom theme saves the result — the theme plus your edits — as a new theme of your own under Your themes and switches to it. The theme you started from stays in the list, unchanged.\n- Update (on one of your own themes) folds your edits into that theme.\n- Switching themes keeps your edits. Each theme remembers the edits you made to it, and they come back when you pick it again. Themes marked Edited in the list have some.\nYour Dark scheme setting belongs to the site, not the theme, so it stays as you set it whichever theme you pick.'
2995
+ },
2989
2996
  {
2990
2997
  path: '/building-sites/theme-builder/edit-your-theme',
2991
2998
  title: 'Edit your theme',
@@ -3040,7 +3047,7 @@ export const ASSIST_DOCS_INDEX = [
3040
3047
  title: 'Theme Builder',
3041
3048
  heading: 'Edit your theme',
3042
3049
  anchor: '#edit-your-theme',
3043
- text: '- Open the theme editor under Setup.\n- Set your palette and typography; changes render in a live preview.\n- Configure both light and dark schemes — published sites apply the visitor\'s scheme automatically.\n- Fonts load via a Google Fonts URL builder.\nThe theme you set here is supplied to the Besigner canvas too, so previews match the live site.\nHow-tos\n- Edit your theme'
3050
+ text: '- Pick a theme — Material UI (default), a built-in theme, one of your own, or one from the marketplace — and preview it before it goes live.\n- Open the theme editor under Setup. Your changes are stored on top of the theme you picked, so it can always be restored or saved as a theme of your own.\n- Set your palette and typography; changes render in a live preview.\n- Configure both light and dark schemes — published sites apply the visitor\'s scheme automatically.\n- Fonts load via a Google Fonts URL builder.\nThe theme you set here is supplied to the Besigner canvas too, so previews match the live site.\nHow-tos\n- Edit your theme'
3044
3051
  },
3045
3052
  {
3046
3053
  path: '/building-sites/theme-builder/overview',
@@ -5406,14 +5413,14 @@ export const ASSIST_DOCS_INDEX = [
5406
5413
  title: 'Publisher handbook',
5407
5414
  heading: 'Before your first publish',
5408
5415
  anchor: '#before-your-first-publish',
5409
- text: '1. Publisher profile (Marketplace → Profile) — your handle and display name appear on every listing. Publishing is organization-owned: the listing belongs to your organization, not your personal account.\n2. Publisher agreement (Marketplace → Profile) — accept it once, on behalf of the organization. See The publisher agreement.\n3. Plan: publishing requires a Pro plan.\n4. Payouts (paid listings only): complete Stripe Connect onboarding from Marketplace → Payouts. The platform fee is 20% (30% on free plans).'
5416
+ text: '1. Publisher profile (Marketplace → Profile) — your handle and display name appear on every listing. Publishing is organization-owned: the listing belongs to your organization, not your personal account.\n2. Publisher agreement — accept it once, on behalf of the organization. It is offered wherever you start a publish, and it is always on Marketplace → Profile. See The publisher agreement.\n3. Plan: publishing requires a Pro plan.\n4. Payouts (paid listings only): complete Stripe Connect onboarding from Marketplace → Payouts. The platform fee is 20% (30% on free plans).'
5410
5417
  },
5411
5418
  {
5412
5419
  path: '/developers/plugins/publishing/publisher-handbook',
5413
5420
  title: 'Publisher handbook',
5414
5421
  heading: 'The publisher agreement',
5415
5422
  anchor: '#the-publisher-agreement',
5416
- text: 'Your organization — not you personally — is the publishing party, so the organization accepts the Marketplace Publisher Agreement once, from Marketplace → Profile. Only an owner or admin can accept it, because only they can bind the organization, and we record who accepted it and when.\nYou can read the agreement in full at aglyn.com/legal/marketplace-publisher-agreement, alongside the rest of the legal center. The version in force is stated at the top of that page, and it is the same string the panel records against your acceptance.\nIt is a different thing from the pre-publish checklist, and they are not interchangeable:\n| | Publisher agreement | Pre-publish checklist |\n| About | The relationship | The bytes in this bundle |\n| Scope | Your organization | One version |\n| Asked | Once, and again when the terms change | Every publish, including a republish of the same version number |\nThe summary shown above the accept button is the part that tends to surprise people later — the license you grant us to host, verify and distribute; what you warrant about each version; that you cannot recall code already installed; that we can disable a version everywhere without notice if it looks dangerous; that review is a safety screen and not an endorsement; and that on paid listings we process the sale, pay your share into your own Stripe Connect account less a platform fee, and collect and remit sales tax — while refunds, chargebacks and support on your artifacts stay with you. Read the full agreement before accepting.\nIf we change the agreement, publishing stops until someone who can bind your organization reads and accepts the new version. An older acceptance is never carried forward — that is the whole reason the agreement is versioned. Nothing already published is affected, and re'
5423
+ text: 'Your organization — not you personally — is the publishing party, so the organization accepts the Marketplace Publisher Agreement once. Only an owner or admin can accept it, because only they can bind the organization, and we record who accepted it and when.\nYou do not have to go looking for it. When your organization has not accepted the current version, the agreement opens in a dialog wherever you are publishing — the plugin publish page, or the publish dialog for a component, layout, site template, theme, email template or dataset schema — as soon as you open it, and again if you submit without accepting. Accepting there records the same acceptance as Marketplace → Profile does, and the publish you started then goes ahead with everything you filled in. If you are not an owner or admin, the dialog names the people in your organization who can accept it.\nYou can read the agreement in full at aglyn.com/legal/marketplace-publisher-agreement, alongside the rest of the legal center. The version in force is stated at the top of that page, and it is the same string the panel records against your acceptance.\nIt is a different thing from the pre-publish checklist, and they are not interchangeable:\n| | Publisher agreement | Pre-publish checklist |\n| About | The relationship | The bytes in this bundle |\n| Scope | Your organization | One version |\n| Asked | Once, and again when the terms change | Every publish, including a republish of the same version number |\nThe summary shown above the accept button is the part that tends to surprise people later — the license you grant us to host, verify and distribute; what you warrant about each version; that you cannot recall code already installed; that we can disable a version everywhere without notice if it looks dangerous; that review '
5417
5424
  },
5418
5425
  {
5419
5426
  path: '/developers/plugins/publishing/publisher-handbook',
@@ -5483,7 +5490,7 @@ export const ASSIST_DOCS_INDEX = [
5483
5490
  title: 'Extension-point catalog',
5484
5491
  heading: '',
5485
5492
  anchor: '',
5486
- text: 'Extension-point catalog\nThe surface matrix: what a plugin can extend, from which entry (barrel = client, /server = API process), and when it runs.\n| Extension point | Entry | Reaches | Runs |\n| Canvas components (defineUiFeatureBundle) | barrel (site) | Besigner + published sites | Editor gates / SSR-suspended page load |\n| Console nav + pages (ConsoleExtension.navItems) | barrel (console) | Console host area | After the org resolves, before the shell paints |\n| Widgets (ConsoleExtension.widgets) | barrel (console) | Named console zones (dashboard, org, billing, team, staff, besigner, the assistant dock) — a widget with a column is a column of a shell-owned table | With their host page |\n| Providers (ConsoleExtension.providers) | barrel (console) | Around every console page | Once the registry is populated |\n| Zones a plugin HOSTS (definePluginZone / registerPluginZone) | barrel (console) | A position on a page the plugin owns, with the props it hands each widget carried on the token — so another plugin writes a widget for it without importing the owner | With the page that draws useConsoleWidgetSlot(); the token itself is type-only and ships nothing |\n| Staff pages (ConsoleExtension.staffPages) | barrel (staff) | The staff area — a tab in the staff strip and a page at /admin/{id} | Once the staff area has loaded its plugins, behind the staff guard |\n| Site runtimes (registerSiteRuntime) | barrel (site) | Every published page | Client render, reading enricher props |\n| Redirect resolvers / page resolvers / enrichers | /server | Tenant page pipeline | Per request, in that order; enricher errors isolated |\n| API routes (registerPluginApiRoute) | /server (tenantApi / consoleApi) | /api/ of the app whose surface registered the route: tenantApi routes answer on the published'
5493
+ text: 'Extension-point catalog\nThe surface matrix: what a plugin can extend, from which entry (barrel = client, /server = API process), and when it runs.\n| Extension point | Entry | Reaches | Runs |\n| Canvas components (defineUiFeatureBundle) | barrel (site) | Besigner + published sites | Editor gates / SSR-suspended page load |\n| Console nav + pages (ConsoleExtension.navItems) | barrel (console) | Console host area | After the org resolves, before the shell paints |\n| Widgets (ConsoleExtension.widgets) | barrel (console) | Named console zones (dashboard, org, billing, team, staff, besigner, the assistant dock) — a widget with a column is a column of a shell-owned table | With their host page |\n| Providers (ConsoleExtension.providers) | barrel (console) | Around every console page | Once the registry is populated |\n| Zones a plugin HOSTS (definePluginZone / registerPluginZone) | barrel (console) | A position on a page the plugin owns, with the props it hands each widget carried on the token — so another plugin writes a widget for it without importing the owner | With the page that draws useConsoleWidgetSlot(); the token itself is type-only and ships nothing |\n| Built-in themes (ConsoleExtension.themePresets) | barrel (console) | The theme picker on every site\'s Setup → Theme | When the theme page loads the plugins declaring hostThemePresets |\n| Staff pages (ConsoleExtension.staffPages) | barrel (staff) | The staff area — a tab in the staff strip and a page at /admin/{id} | Once the staff area has loaded its plugins, behind the staff guard |\n| Site runtimes (registerSiteRuntime) | barrel (site) | Every published page | Client render, reading enricher props |\n| Redirect resolvers / page resolvers / enrichers | /server | Tenant page pipeline | Per request, in that order; enricher'
5487
5494
  },
5488
5495
  {
5489
5496
  path: '/developers/plugins/reference/injection-zones',