@webx-ui/module-admin 0.25.0 → 0.26.0

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.
@@ -0,0 +1,220 @@
1
+ import { Component, InjectionKey } from 'vue';
2
+ import { AdminContext } from './admin';
3
+ import { Http } from './http';
4
+ /**
5
+ * What `GET /api/cms/site-bar/context` says about the page in front of the panel on the site —
6
+ * mirrors `WebxUi\Admin\Http\Controllers\SiteBarController::context()`.
7
+ */
8
+ export interface SiteBarContext {
9
+ /** The path that was asked about, without its query. */
10
+ url: string;
11
+ /** The language of the address, when the registry knows it. */
12
+ locale: string | null;
13
+ /** The record behind the address, or null — a page of the site's own code, or none it may open. */
14
+ entity: SiteBarEntity | null;
15
+ /** The tabs this administrator gets here, in order. */
16
+ sections: string[];
17
+ }
18
+ export type SiteBarStatus = 'published' | 'scheduled' | 'unpublished' | 'trashed';
19
+ export interface SiteBarEntity {
20
+ type: string;
21
+ id: number | string;
22
+ /** What the record is, in the panel's language: «Page», «Article». */
23
+ kind: string;
24
+ label: string;
25
+ status: SiteBarStatus;
26
+ /** Absent for a record that keeps no draft. */
27
+ draft: SiteBarDraft | null;
28
+ updatedAt: string | null;
29
+ /** Where the panel edits it, relative to the panel. */
30
+ edit: string | null;
31
+ /** A signed link to the draft shown as the page it will be; only while there is a draft. */
32
+ preview?: string | null;
33
+ /** What the record's editor in the panel calls it — `editing/{editing}/{id}` is its heartbeat. */
34
+ editing?: string | null;
35
+ /** The revision the record's editor holds; sent with «Publish» so an unseen edit is not published. */
36
+ revision?: string | null;
37
+ can: {
38
+ edit: boolean;
39
+ publish: boolean;
40
+ };
41
+ }
42
+ export interface SiteBarDraft {
43
+ differs: boolean;
44
+ by: string | null;
45
+ at: string | null;
46
+ /** How many fields of the record the draft changes. */
47
+ changes?: number;
48
+ /** Whether the last hand on the draft was this administrator's. */
49
+ mine?: boolean;
50
+ }
51
+ /**
52
+ * A tab a section adds to the panel on the site — «SEO» from `module-seo`, «Blocks» from
53
+ * `module-blocks`.
54
+ *
55
+ * The server decides whether the tab is there (`SiteBar::section()` answers per page and per
56
+ * administrator, and `context.sections` lists the ones that said yes); the module brings what
57
+ * it looks like. Split that way so the frame never learns what its tabs are about, and a tab
58
+ * the server offers without a module on this side is simply not drawn.
59
+ */
60
+ export interface SiteBarTab {
61
+ /** The name the server registered the section under — and the tab's own, as `show()` names it. */
62
+ name: string;
63
+ /**
64
+ * More sections the same tab stands for: drawn once when the server offered any of them.
65
+ * «Blocks» is the record's blocks and the layout's regions — two rights, one picker on the page.
66
+ */
67
+ sections?: string[];
68
+ /** What the tab is called, in the panel's language. */
69
+ label: (admin: AdminContext) => string;
70
+ /** Drawn inside the tab, with the page's context as its `context` prop. */
71
+ component: Component;
72
+ }
73
+ /**
74
+ * @param locale The language the page says it is in (`<html lang>`). The address's own row wins
75
+ * over it; it only matters for a page of the site's own code, which has no row.
76
+ */
77
+ export declare function fetchSiteBarContext(http: Http, apiPath: string, url: string, locale?: string | null): Promise<{
78
+ data: SiteBarContext;
79
+ }>;
80
+ /**
81
+ * What the panel can ask of the page it is framed in:
82
+ *
83
+ * - `close` — shut the drawer;
84
+ * - `title` — put this in the browser's tab: the page's `<title>` after an edit, so the editor
85
+ * sees it changed without reloading (the rest of `<head>` waits for the next load);
86
+ * - `reload` — load the page again: after «Publish» and «Discard» it is the site's again;
87
+ * - `tab` — the tab in front, for the page to remember and open the next frame on;
88
+ * - `blocks` — whose blocks may be picked on the page — the record's, a region's — and what each
89
+ * is called;
90
+ * - `mode` — picking blocks on the page on or off (§8);
91
+ * - `select` / `highlight` — frame a block on the page and bring it into view, or stop;
92
+ * - `replace` — put this markup in place of the block's range: the block drawn from the draft;
93
+ * - `insert` — the same when the page has the block, otherwise put it in after the first of
94
+ * `after` the page has, before the first of `before`, or — `top` — at the end of its tree;
95
+ * - `move` — carry the block's range to where `after`/`before` say, `html` if the page lacks it;
96
+ * - `remove` — take the block's range out (removed, or hidden: the site does not draw it);
97
+ * - `assets` — add the styles and script of block types the page did not have.
98
+ *
99
+ * A block is named by its key and its `scope` — `{type}:{id}` of a record, `region:{name}` of a
100
+ * region — since the header and the page are two trees that never promised each other unique keys.
101
+ */
102
+ export type SiteBarMessage = {
103
+ type: 'close';
104
+ } | {
105
+ type: 'title';
106
+ title: string;
107
+ } | {
108
+ type: 'reload';
109
+ } | {
110
+ type: 'tab';
111
+ name: string;
112
+ } | {
113
+ type: 'blocks';
114
+ sources: SiteBarBlockSource[];
115
+ } | {
116
+ type: 'mode';
117
+ on: boolean;
118
+ } | {
119
+ type: 'select';
120
+ key: string | null;
121
+ scope?: string;
122
+ } | {
123
+ type: 'highlight';
124
+ key: string | null;
125
+ scope?: string;
126
+ } | {
127
+ type: 'replace';
128
+ key: string;
129
+ scope?: string;
130
+ html: string;
131
+ } | ({
132
+ type: 'insert' | 'move';
133
+ key: string;
134
+ scope?: string;
135
+ html: string;
136
+ } & SiteBarPlace) | {
137
+ type: 'remove';
138
+ key: string;
139
+ scope?: string;
140
+ } | {
141
+ type: 'assets';
142
+ hash: string;
143
+ css: string | null;
144
+ js: string | null;
145
+ };
146
+ /** Where a block that is not on the page goes: by its neighbours, nearest first. */
147
+ export interface SiteBarPlace {
148
+ after?: string[];
149
+ before?: string[];
150
+ /** It stands at the top level of its tree: with no neighbour on the page, at the tree's end. */
151
+ top?: boolean;
152
+ }
153
+ /** One tree of blocks the page may pick from. */
154
+ export interface SiteBarBlockSource {
155
+ /** `{type}:{id}` of a record (`page:12`), `region:{name}` of a region of the layout. */
156
+ scope: string;
157
+ /** Said on the frame beside the block's type — «Header» — when the block is not the page's own. */
158
+ title?: string;
159
+ items: {
160
+ key: string;
161
+ label: string;
162
+ }[];
163
+ }
164
+ /**
165
+ * What the page says to the panel: a block picked on it, picking switched off there (Esc),
166
+ * «Add below» pressed on the picked block, and the sets of block styles and scripts the page has —
167
+ * sent with an edit, so that a type the page lacks brings its own and one it has brings nothing.
168
+ */
169
+ export type SitePageMessage = {
170
+ type: 'select';
171
+ key: string;
172
+ scope?: string;
173
+ } | {
174
+ type: 'mode';
175
+ on: boolean;
176
+ } | {
177
+ type: 'add';
178
+ key: string;
179
+ scope?: string;
180
+ } | {
181
+ type: 'bundles';
182
+ hashes: string[];
183
+ };
184
+ /**
185
+ * Listen to the page the panel is framed in. Only that page — the parent window, from this
186
+ * origin — and only messages of the bar: anything else on the page can post messages too.
187
+ * Returns the way to stop listening.
188
+ */
189
+ export declare function onSitePage(listener: (message: SitePageMessage) => void): () => void;
190
+ /**
191
+ * What the screen of the bar offers the tabs inside it: bring a tab forward (a block picked on
192
+ * the page opens «Blocks»), and read the page's context again (an edit changes the draft the
193
+ * head counts).
194
+ */
195
+ export interface SiteBarHost {
196
+ show(name: string): void;
197
+ refresh(): Promise<void>;
198
+ }
199
+ export declare const siteBarKey: InjectionKey<SiteBarHost>;
200
+ /** The bar around a tab; null outside one — a tab drawn in a test or a demo. */
201
+ export declare function useSiteBar(): SiteBarHost | null;
202
+ /**
203
+ * «Publish» in the head of the bar: the record's draft on the site. `revision` is the one the bar
204
+ * held; an edit made since is answered 409 with who made it, and nothing is published.
205
+ */
206
+ export declare function publishSiteBarEntity(http: Http, apiPath: string, entity: {
207
+ type: string;
208
+ id: number | string;
209
+ revision?: string | null;
210
+ }): Promise<unknown>;
211
+ /** «Discard»: the record's draft goes, and the record is what the site shows. */
212
+ export declare function discardSiteBarEntity(http: Http, apiPath: string, entity: {
213
+ type: string;
214
+ id: number | string;
215
+ }): Promise<unknown>;
216
+ /**
217
+ * Say something to the page the panel is framed in. Only to that page's own origin: the screen
218
+ * may be opened on its own, or framed by somebody else, and neither should hear it.
219
+ */
220
+ export declare function tellSitePage(message: SiteBarMessage | 'close'): void;
package/dist/style.css CHANGED
@@ -1 +1 @@
1
- .wx-screen__col{display:flex;flex-direction:column;gap:var(--wx-gap, var(--wx-space-16))}.wx-screen__row{max-width:calc(var(--wx-field-max-width, 640px) + var(--wx-row-gutter, 0px))}.wx-screen__unknown{padding:var(--wx-space-8) var(--wx-space-12);border:1px dashed var(--wx-color-danger);border-radius:var(--wx-radius-control);background:var(--wx-color-danger-soft);color:var(--wx-color-danger);font-family:var(--wx-font-family-mono);font-size:var(--wx-font-size-sm)}.wx-categories-field[data-v-640cd836]{display:flex;flex-direction:column;gap:var(--wx-space-8)}.wx-categories-field[data-v-640cd836] .wx-sortable-list__content{display:flex;align-items:center;gap:var(--wx-space-8);min-width:0}.wx-categories-field__name[data-v-640cd836]{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.wx-relations-field[data-v-5ecf0e47]{display:flex;flex-direction:column;gap:var(--wx-space-8);min-width:0}.wx-relations-field[data-v-5ecf0e47] .wx-sortable-list__content{display:flex;align-items:center;gap:var(--wx-space-8);min-width:0}.wx-relations-field__thumb[data-v-5ecf0e47]{flex:none;width:32px;height:32px;min-width:0;object-fit:cover;border-radius:var(--wx-radius-xs);background:var(--wx-bg-fill)}.wx-relations-field__text[data-v-5ecf0e47]{display:flex;flex-direction:column;flex:1 1 auto;min-width:0}.wx-relations-field__title[data-v-5ecf0e47],.wx-relations-field__subtitle[data-v-5ecf0e47]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.wx-relations-field__subtitle[data-v-5ecf0e47],.wx-relations-field__note[data-v-5ecf0e47]{font-size:var(--wx-font-size-sm);color:var(--wx-text-muted)}.wx-relations-field__note[data-v-5ecf0e47]{margin:0}.wx-relations-field.is-unordered[data-v-5ecf0e47] .wx-sortable-list__grip{display:none}.wx-relations-field[data-v-5ecf0e47] .wx-badge{flex:none}.wx-collection-field[data-v-023ad095]{display:flex;flex-direction:column;gap:var(--wx-space-12);min-width:0}.wx-collection-field__row[data-v-023ad095]{display:flex;flex-direction:column;gap:var(--wx-space-4);min-width:0}.wx-collection-field__label[data-v-023ad095]{font-size:var(--wx-font-size-sm);color:var(--wx-text-muted)}.wx-collection-field__limit[data-v-023ad095]{max-width:160px}.wx-collection-field__markup[data-v-023ad095]{display:flex;flex-direction:column;gap:var(--wx-space-4)}.wx-collection-field__reset[data-v-023ad095]{align-self:flex-start}.wx-collection-field__note[data-v-023ad095],.wx-collection-field__hint[data-v-023ad095]{margin:0;font-size:var(--wx-font-size-sm);color:var(--wx-text-muted)}.wx-link-picker[data-v-e54022e5]{display:flex;flex-direction:column;gap:var(--wx-space-8)}.wx-link-picker__entity[data-v-e54022e5]{display:flex;flex-wrap:wrap;gap:var(--wx-space-8)}.wx-link-picker__entity[data-v-e54022e5]>.wx-link-picker__section{flex:0 0 auto;min-width:160px}.wx-link-picker__entity[data-v-e54022e5]>.wx-link-picker__search{flex:1 1 220px;min-width:0}.wx-link-picker__hash[data-v-e54022e5]{display:grid;grid-template-columns:auto 1fr;align-items:center;gap:var(--wx-space-4) var(--wx-space-6)}.wx-link-picker__hash[data-v-e54022e5]>:first-child{grid-column:1 / -1}.wx-link-picker__sign[data-v-e54022e5]{color:var(--wx-text-placeholder)}.wx-link-picker__attributes[data-v-e54022e5]{display:flex;flex-direction:column;gap:var(--wx-space-12)}.wx-link-picker__rel[data-v-e54022e5]{display:flex;flex-direction:column;gap:var(--wx-space-6)}.wx-history[data-v-68eae472]{display:flex;flex-direction:column;gap:var(--wx-space-12);min-width:0;container-type:inline-size}.wx-history__list[data-v-68eae472]{display:flex;flex-direction:column;gap:var(--wx-space-16);margin:0;padding:0;list-style:none}.wx-history-entry[data-v-68eae472]{display:flex;gap:var(--wx-space-8);min-width:0}.wx-history-entry__body[data-v-68eae472]{display:flex;flex-direction:column;gap:var(--wx-space-4);flex:1 1 auto;min-width:0}.wx-history-entry__head[data-v-68eae472],.wx-history-run__head[data-v-68eae472]{display:flex;align-items:center;gap:var(--wx-space-8);min-width:0}.wx-history-entry__head[data-v-68eae472]>:last-child,.wx-history-run__head[data-v-68eae472]>:last-child{margin-inline-start:auto;flex:none}.wx-history-entry__changes[data-v-68eae472]{display:flex;flex-direction:column;gap:var(--wx-space-2);margin:0;padding:0;list-style:none}.wx-history-change[data-v-68eae472]{font-size:var(--wx-font-size-sm);color:var(--wx-text-default);overflow-wrap:anywhere}.wx-history-change__label[data-v-68eae472]{color:var(--wx-text-muted);margin-inline-end:var(--wx-space-4)}.wx-history-change__from[data-v-68eae472]{color:var(--wx-text-muted);text-decoration:line-through}.wx-history-change__arrow[data-v-68eae472]{margin-inline:var(--wx-space-4);color:var(--wx-text-muted)}.wx-history-change__long[data-v-68eae472]{color:var(--wx-text-muted);font-style:italic}.wx-history-entry__run[data-v-68eae472]{align-self:flex-start;margin:0;padding:0;border:0;border-radius:var(--wx-radius-xs);background:none;font:inherit;font-size:var(--wx-font-size-sm);text-align:start;color:var(--wx-text-link);cursor:pointer}.wx-history-entry__run[data-v-68eae472]:hover{text-decoration:underline}.wx-history-entry__run[data-v-68eae472]:focus-visible{outline:none;box-shadow:var(--wx-ring-focus)}.wx-history__more[data-v-68eae472]{display:flex;justify-content:center}.wx-history-run[data-v-68eae472]{display:flex;flex-direction:column;gap:var(--wx-space-8);min-width:0}.wx-history-run__summary[data-v-68eae472]{display:grid;grid-template-columns:max-content 1fr;gap:var(--wx-space-4) var(--wx-space-12);margin:0;font-size:var(--wx-font-size-sm)}.wx-history-run__summary dt[data-v-68eae472]{color:var(--wx-text-muted)}.wx-history-run__summary dd[data-v-68eae472]{margin:0;overflow-wrap:anywhere}.wx-history-run__row[data-v-68eae472]{display:flex;flex-direction:column;gap:var(--wx-space-2)}.wx-row-menu[data-v-cab01f7f]{--wx-action-bg: transparent}.wx-screen-head[data-v-9ebd5372]{--wx-head-line: calc(var(--wx-font-size-2xl) * var(--wx-font-line-height-tight));display:grid;grid-template-columns:auto minmax(0,1fr) auto;grid-template-areas:"back name actions" ". subtitle .";align-items:start;row-gap:var(--wx-space-4);flex:none;min-width:0}.wx-screen-head[data-level="3"][data-v-9ebd5372]{--wx-head-line: calc(var(--wx-font-size-xl) * var(--wx-font-line-height-tight))}.wx-screen-head.has-trail[data-v-9ebd5372]{grid-template-areas:"trail trail trail" "back name actions" ". subtitle ."}.wx-screen-head.has-divider[data-v-9ebd5372]{padding-block-end:var(--wx-space-12);border-block-end:1px solid var(--wx-border-default)}.wx-screen-head__trail[data-v-9ebd5372]{grid-area:trail;min-width:0;overflow-x:auto;overscroll-behavior-x:contain;overflow-anchor:none;scrollbar-width:none;-ms-overflow-style:none}.wx-screen-head__trail[data-v-9ebd5372]::-webkit-scrollbar{display:none}.wx-screen-head__trail[data-v-9ebd5372]>*{flex-wrap:nowrap;white-space:nowrap}.wx-screen-head__trail[data-v-9ebd5372] .wx-breadcrumb__list{flex-wrap:nowrap}.wx-screen-head__trail[data-v-9ebd5372] .wx-breadcrumb-item{flex:none}.wx-screen-head__trail[data-v-9ebd5372] .wx-breadcrumb-item__link{overflow:visible}.wx-screen-head[data-v-9ebd5372]>.wx-screen-head__back{grid-area:back;margin-inline-end:var(--wx-space-8);margin-block-start:calc((var(--wx-head-line) - 30px) / 2)}.wx-screen-head__name[data-v-9ebd5372]{grid-area:name;display:flex;align-items:center;gap:var(--wx-space-8);flex-wrap:wrap;min-width:0}.wx-screen-head__title[data-v-9ebd5372]{min-width:0}.wx-screen-head__subtitle[data-v-9ebd5372]{grid-area:subtitle;min-width:0}.wx-screen-head__actions[data-v-9ebd5372]{grid-area:actions;display:flex;align-items:center;justify-content:flex-end;gap:var(--wx-space-8);flex-wrap:wrap;min-width:0;margin-inline-start:var(--wx-space-12);margin-block-start:calc((var(--wx-head-line) - var(--wx-size-control-md)) / 2)}.wx-screen-head__actions[data-v-9ebd5372] .wx-action{--wx-action-size: var(--wx-size-control-md)}.wx-admin--drawer .wx-screen-head__actions[data-v-9ebd5372]{--wx-size-control-md: 36px}.wx-screen-head.is-narrow.has-button[data-v-9ebd5372]{grid-template-areas:"back name name" ". subtitle subtitle" "actions actions actions"}.wx-screen-head.is-narrow.has-button.has-trail[data-v-9ebd5372]{grid-template-areas:"trail trail trail" "back name name" ". subtitle subtitle" "actions actions actions"}.wx-screen-head.is-narrow.has-button .wx-screen-head__actions[data-v-9ebd5372]{margin-inline-start:0;margin-block-start:var(--wx-space-8)}.wx-screen-head.is-narrow .wx-screen-head__actions[data-v-9ebd5372]>.wx-screen-head__button{flex:1 1 auto}.wx-list-screen[data-v-8c7e5ad1]{display:flex;flex-direction:column;gap:var(--wx-gap, var(--wx-space-16));min-width:0;container-type:inline-size}.wx-list-screen.is-fill[data-v-8c7e5ad1]{min-height:0}.wx-list-screen.is-fill[data-v-8c7e5ad1]>:last-child{flex:1 1 auto;min-height:0}.wx-list-screen.is-fill[data-v-8c7e5ad1] .wx-tabs,.wx-list-screen.is-fill[data-v-8c7e5ad1] .wx-tabs__layout,.wx-list-screen.is-fill[data-v-8c7e5ad1] .wx-tabs__panels{display:flex;flex-direction:column;flex:1 1 auto;min-height:0}.wx-list-screen.is-fill[data-v-8c7e5ad1] .wx-tabs__panel,.wx-list-screen.is-fill[data-v-8c7e5ad1] .wx-tabs__panel>*{flex:1 1 auto;min-height:0}.wx-list-screen.is-fill[data-v-8c7e5ad1] .wx-tabs__bar{flex:0 0 auto}.wx-slug[data-v-2866b684]{display:flex;flex-direction:column;gap:var(--wx-space-8)}.wx-slug__prefix[data-v-2866b684],.wx-slug[data-v-2866b684] .wx-input__inner{font-family:var(--wx-font-family-mono)}.wx-slug__prefix[data-v-2866b684]{color:var(--wx-text-muted)}.wx-admin[data-v-819885ab]{--wx-admin-header-height: 52px;min-height:100dvh;background:var(--wx-bg-body)}.wx-admin--drawer[data-v-819885ab]{--wx-gap: var(--wx-space-8)}.wx-admin--rail[data-v-819885ab]{--wx-gap: var(--wx-space-12)}.wx-admin--sidebar[data-v-819885ab]{--wx-gap: var(--wx-space-16)}.wx-admin__frame[data-v-819885ab]{padding:var(--wx-gap);gap:var(--wx-gap)}.wx-admin__header[data-v-819885ab]{--wx-header-top: var(--wx-gap)}.wx-admin__aside[data-v-819885ab]{--wx-aside-top: var(--wx-gap);--wx-aside-height: calc(100dvh - var(--wx-gap) * 2)}.wx-admin__brand[data-v-819885ab]{display:flex;align-items:center;gap:var(--wx-space-8);box-sizing:border-box;min-height:48px;padding:var(--wx-space-8);border-bottom:1px solid var(--wx-border-muted)}.wx-aside--collapsed .wx-admin__brand[data-v-819885ab]{justify-content:center;padding-inline:var(--wx-space-4)}.wx-admin__brand--stacked[data-v-819885ab]{flex-direction:column;gap:var(--wx-space-4)}.wx-admin__title[data-v-819885ab]{flex:1 1 auto;min-width:0}.wx-admin__brand>.wx-admin__logo[data-v-819885ab]{margin-inline-end:auto}.wx-admin__logo[data-v-819885ab]{flex:0 1 auto;min-width:0;height:28px;width:auto;max-width:100%;object-fit:contain;object-position:left center}.wx-admin__mark[data-v-819885ab]{height:24px;width:24px;object-fit:contain}.wx-admin__user[data-v-819885ab]{display:flex;align-items:center;padding:var(--wx-space-8);border-top:1px solid var(--wx-border-muted)}.wx-aside--collapsed .wx-admin__user[data-v-819885ab]{justify-content:center}.wx-admin__user--drawer[data-v-819885ab]{flex:1 1 auto;justify-content:flex-start;padding:0;border-top:none}.wx-admin__screen[data-v-819885ab]{--wx-fill-height: calc(100dvh - var(--wx-gap) * 2);--wx-action-bar-bottom: var(--wx-gap);min-width:0;min-height:0}.wx-admin--drawer .wx-admin__screen[data-v-819885ab]{--wx-fill-height: calc(100dvh - var(--wx-gap) * 3 - var(--wx-admin-header-height))}.wx-admin-plain[data-v-819885ab]{display:grid;place-items:center;box-sizing:border-box;min-height:100dvh;padding:var(--wx-space-16);background:var(--wx-bg-body)}:root[data-wx-shell],:root[data-wx-shell]>body,html:has(>body>#webx-app),body:has(>#webx-app){margin:0}.wx-admin--drawer .wx-action--md{--wx-action-size: 30px}.wx-admin--drawer .wx-action--lg{--wx-action-size: 36px}.wx-admin__drawer .wx-drawer__content>.wx-menu{padding-inline:0}:root[data-wx-shell=drawer]{--wx-gap: var(--wx-space-8)}:root[data-wx-shell=rail]{--wx-gap: var(--wx-space-12)}:root[data-wx-shell=sidebar]{--wx-gap: var(--wx-space-16)}.wx-address-note[data-v-38e2b4c5]{display:inline-flex;align-items:center;margin-inline-start:var(--wx-space-4);color:var(--wx-text-muted);vertical-align:middle;cursor:help}.wx-address-note[data-v-38e2b4c5]:focus-visible{outline:none;border-radius:var(--wx-radius-xs);box-shadow:var(--wx-ring-focus)}.wx-categories__loading{padding:var(--wx-space-8)}.wx-categories__list.is-plain .wx-sortable-list__row{padding-inline:var(--wx-space-8)}.wx-categories__note{margin-block-start:var(--wx-space-8)}.wx-categories__list .wx-sortable-list__row:hover{background:var(--wx-bg-subtle);border-radius:var(--wx-radius-sm)}.wx-category-row{display:flex;flex-direction:column;gap:var(--wx-space-2);align-items:flex-start;flex:1 1 auto;min-width:0;color:inherit;text-decoration:none}.wx-category-row__name{display:flex;align-items:center;gap:var(--wx-space-6);min-width:0;max-width:100%}.wx-category-row.is-hidden{color:var(--wx-text-muted)}.wx-category-row__count{flex:none;font-variant-numeric:tabular-nums}.wx-save-state[data-v-216e5e44]{display:inline-flex;align-items:center;justify-content:center;flex:none;width:var(--wx-size-control-sm);height:var(--wx-size-control-sm)}.wx-save-state__mark[data-v-216e5e44]{font-size:var(--wx-font-size-lg);color:var(--wx-text-muted)}.wx-save-state__mark.is-saved[data-v-216e5e44]{color:var(--wx-color-success)}.wx-category-editor[data-v-55265992]{display:flex;flex-direction:column;gap:var(--wx-gap, var(--wx-space-16));container-type:inline-size}.wx-category-editor__ghost[data-v-55265992]{max-width:420px}.wx-rename[data-v-d879e8d3]{display:flex;flex-direction:column;gap:var(--wx-space-12)}.wx-rename__footer[data-v-d879e8d3]{display:flex;justify-content:flex-end}.wx-help[data-v-6c280d42]{color:var(--wx-text-default);font-size:var(--wx-font-size-md);line-height:var(--wx-font-line-height-normal)}.wx-help[data-v-6c280d42] h2,.wx-help[data-v-6c280d42] h3,.wx-help[data-v-6c280d42] h4{margin-block:var(--wx-space-18) var(--wx-space-8);font-weight:var(--wx-font-weight-semibold)}.wx-help[data-v-6c280d42] h2{font-size:var(--wx-font-size-lg)}.wx-help[data-v-6c280d42] h3,.wx-help[data-v-6c280d42] h4{font-size:var(--wx-font-size-md)}.wx-help[data-v-6c280d42] :is(h2,h3,h4):first-child{margin-block-start:0}.wx-help[data-v-6c280d42] p,.wx-help[data-v-6c280d42] ul,.wx-help[data-v-6c280d42] ol{margin-block:0 var(--wx-space-12)}.wx-help[data-v-6c280d42] ul,.wx-help[data-v-6c280d42] ol{padding-inline-start:var(--wx-space-24)}.wx-help[data-v-6c280d42] li{margin-block-end:var(--wx-space-4)}.wx-help[data-v-6c280d42] code{padding:0 var(--wx-space-4);border-radius:var(--wx-radius-xs);background:var(--wx-bg-subtle);font-family:var(--wx-font-family-mono);font-size:var(--wx-font-size-sm)}.wx-help[data-v-6c280d42] pre{margin-block:0 var(--wx-space-12);padding:var(--wx-space-12);border-radius:var(--wx-radius-sm);background:var(--wx-bg-subtle);overflow:auto}.wx-help[data-v-6c280d42] pre code{padding:0;background:none}.wx-help[data-v-6c280d42] a{color:var(--wx-color-primary)}.wx-notes[data-v-71004c1a]{display:flex;flex-direction:column;gap:var(--wx-space-12);min-width:0;container-type:inline-size}.wx-notes__list[data-v-71004c1a]{display:flex;flex-direction:column;gap:var(--wx-space-12);margin:0;padding:0;list-style:none}.wx-note[data-v-71004c1a]{display:flex;gap:var(--wx-space-8);min-width:0}.wx-note__body[data-v-71004c1a]{display:flex;flex-direction:column;gap:var(--wx-space-4);flex:1 1 auto;min-width:0}.wx-note__head[data-v-71004c1a]{display:flex;align-items:center;gap:var(--wx-space-8);min-width:0}.wx-note__head[data-v-71004c1a]>:last-child{margin-inline-start:auto}.wx-note__text[data-v-71004c1a]{margin:0;white-space:pre-wrap;overflow-wrap:anywhere;font-size:var(--wx-font-size-sm);color:var(--wx-text-default)}.wx-note__buttons[data-v-71004c1a]{display:flex;align-items:flex-start;gap:var(--wx-space-8)}.wx-notes__new[data-v-71004c1a]{display:flex;flex-direction:column;align-items:stretch;gap:var(--wx-space-8)}.wx-notes__new[data-v-71004c1a]>:first-child{min-width:0}.wx-notes__new[data-v-71004c1a]>:last-child{align-self:flex-start}@container (max-width: 440px){.wx-note__buttons[data-v-71004c1a]{flex-direction:column;align-items:stretch}.wx-notes__new[data-v-71004c1a]>:last-child{align-self:stretch}}.wx-editing-alerts__lead[data-v-4d019f39]{margin:0 0 var(--wx-space-8)}.wx-editing-alerts__list[data-v-4d019f39]{display:flex;flex-direction:column;gap:var(--wx-space-12);margin:0;padding:0;list-style:none}.wx-editing-alerts__item[data-v-4d019f39]{display:flex;flex-direction:column;gap:var(--wx-space-4)}.wx-editing-alerts__place[data-v-4d019f39]{font-weight:var(--wx-font-weight-medium)}.wx-editing-alerts__note[data-v-4d019f39],.wx-editing-alerts__was[data-v-4d019f39],.wx-editing-alerts__side[data-v-4d019f39]{color:var(--wx-text-muted)}.wx-editing-alerts__note[data-v-4d019f39]{margin-inline-start:var(--wx-space-8);font-weight:var(--wx-font-weight-regular)}.wx-editing-alerts__side[data-v-4d019f39]{margin-inline-end:var(--wx-space-6);font-size:var(--wx-font-size-sm)}.wx-editing-alerts__choices[data-v-4d019f39]{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,220px),1fr));gap:var(--wx-space-8)}.wx-editing-alerts__choice[data-v-4d019f39]{display:flex;flex-direction:column;align-items:flex-start;gap:var(--wx-space-2);min-width:0;padding:var(--wx-space-8) var(--wx-space-10);border:1px solid var(--wx-border-default);border-radius:var(--wx-radius-sm);background:var(--wx-bg-surface);color:var(--wx-text-default);font:inherit;text-align:start;cursor:pointer}.wx-editing-alerts__choice.is-chosen[data-v-4d019f39]{border-color:var(--wx-border-focus);box-shadow:0 0 0 1px var(--wx-border-focus)}.wx-editing-alerts__choice[data-v-4d019f39]:focus-visible{outline:2px solid var(--wx-border-focus);outline-offset:2px}.wx-editing-alerts__value[data-v-4d019f39]{overflow-wrap:anywhere}.wx-editing-alerts__others[data-v-4d019f39]{margin:0;color:var(--wx-text-muted);font-size:var(--wx-font-size-sm)}.wx-drafts[data-v-dd9f4601]{display:flex;flex-direction:column;gap:var(--wx-space-8)}.wx-drafts__head[data-v-dd9f4601]{display:flex;flex-direction:column;gap:var(--wx-space-2)}.wx-drafts__list[data-v-dd9f4601]{display:flex;flex-direction:column;border:1px solid var(--wx-border-default);border-radius:var(--wx-radius-md);background:var(--wx-bg-surface);overflow:hidden}.wx-drafts__ghost[data-v-dd9f4601]{padding:var(--wx-space-10) var(--wx-space-12)}.wx-drafts__row[data-v-dd9f4601]{display:flex;align-items:center;flex-wrap:wrap;gap:var(--wx-space-12);padding:var(--wx-space-10) var(--wx-space-12);border-block-end:1px solid var(--wx-border-default)}.wx-drafts__row[data-v-dd9f4601]:last-child{border-block-end:0}.wx-drafts__changed[data-v-dd9f4601]{overflow-wrap:anywhere}.wx-drafts__who[data-v-dd9f4601]{display:flex;flex-direction:column;flex:1;min-width:160px}.wx-backup-note[data-v-beeee67e]{display:flex;flex-wrap:wrap;align-items:baseline;gap:var(--wx-space-4) var(--wx-space-6);margin:0}
1
+ .wx-screen__col{display:flex;flex-direction:column;gap:var(--wx-gap, var(--wx-space-16))}.wx-screen__row{max-width:calc(var(--wx-field-max-width, 640px) + var(--wx-row-gutter, 0px))}.wx-screen__unknown{padding:var(--wx-space-8) var(--wx-space-12);border:1px dashed var(--wx-color-danger);border-radius:var(--wx-radius-control);background:var(--wx-color-danger-soft);color:var(--wx-color-danger);font-family:var(--wx-font-family-mono);font-size:var(--wx-font-size-sm)}.wx-categories-field[data-v-640cd836]{display:flex;flex-direction:column;gap:var(--wx-space-8)}.wx-categories-field[data-v-640cd836] .wx-sortable-list__content{display:flex;align-items:center;gap:var(--wx-space-8);min-width:0}.wx-categories-field__name[data-v-640cd836]{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.wx-relations-field[data-v-5ecf0e47]{display:flex;flex-direction:column;gap:var(--wx-space-8);min-width:0}.wx-relations-field[data-v-5ecf0e47] .wx-sortable-list__content{display:flex;align-items:center;gap:var(--wx-space-8);min-width:0}.wx-relations-field__thumb[data-v-5ecf0e47]{flex:none;width:32px;height:32px;min-width:0;object-fit:cover;border-radius:var(--wx-radius-xs);background:var(--wx-bg-fill)}.wx-relations-field__text[data-v-5ecf0e47]{display:flex;flex-direction:column;flex:1 1 auto;min-width:0}.wx-relations-field__title[data-v-5ecf0e47],.wx-relations-field__subtitle[data-v-5ecf0e47]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.wx-relations-field__subtitle[data-v-5ecf0e47],.wx-relations-field__note[data-v-5ecf0e47]{font-size:var(--wx-font-size-sm);color:var(--wx-text-muted)}.wx-relations-field__note[data-v-5ecf0e47]{margin:0}.wx-relations-field.is-unordered[data-v-5ecf0e47] .wx-sortable-list__grip{display:none}.wx-relations-field[data-v-5ecf0e47] .wx-badge{flex:none}.wx-collection-field[data-v-023ad095]{display:flex;flex-direction:column;gap:var(--wx-space-12);min-width:0}.wx-collection-field__row[data-v-023ad095]{display:flex;flex-direction:column;gap:var(--wx-space-4);min-width:0}.wx-collection-field__label[data-v-023ad095]{font-size:var(--wx-font-size-sm);color:var(--wx-text-muted)}.wx-collection-field__limit[data-v-023ad095]{max-width:160px}.wx-collection-field__markup[data-v-023ad095]{display:flex;flex-direction:column;gap:var(--wx-space-4)}.wx-collection-field__reset[data-v-023ad095]{align-self:flex-start}.wx-collection-field__note[data-v-023ad095],.wx-collection-field__hint[data-v-023ad095]{margin:0;font-size:var(--wx-font-size-sm);color:var(--wx-text-muted)}.wx-link-picker[data-v-e54022e5]{display:flex;flex-direction:column;gap:var(--wx-space-8)}.wx-link-picker__entity[data-v-e54022e5]{display:flex;flex-wrap:wrap;gap:var(--wx-space-8)}.wx-link-picker__entity[data-v-e54022e5]>.wx-link-picker__section{flex:0 0 auto;min-width:160px}.wx-link-picker__entity[data-v-e54022e5]>.wx-link-picker__search{flex:1 1 220px;min-width:0}.wx-link-picker__hash[data-v-e54022e5]{display:grid;grid-template-columns:auto 1fr;align-items:center;gap:var(--wx-space-4) var(--wx-space-6)}.wx-link-picker__hash[data-v-e54022e5]>:first-child{grid-column:1 / -1}.wx-link-picker__sign[data-v-e54022e5]{color:var(--wx-text-placeholder)}.wx-link-picker__attributes[data-v-e54022e5]{display:flex;flex-direction:column;gap:var(--wx-space-12)}.wx-link-picker__rel[data-v-e54022e5]{display:flex;flex-direction:column;gap:var(--wx-space-6)}.wx-history[data-v-68eae472]{display:flex;flex-direction:column;gap:var(--wx-space-12);min-width:0;container-type:inline-size}.wx-history__list[data-v-68eae472]{display:flex;flex-direction:column;gap:var(--wx-space-16);margin:0;padding:0;list-style:none}.wx-history-entry[data-v-68eae472]{display:flex;gap:var(--wx-space-8);min-width:0}.wx-history-entry__body[data-v-68eae472]{display:flex;flex-direction:column;gap:var(--wx-space-4);flex:1 1 auto;min-width:0}.wx-history-entry__head[data-v-68eae472],.wx-history-run__head[data-v-68eae472]{display:flex;align-items:center;gap:var(--wx-space-8);min-width:0}.wx-history-entry__head[data-v-68eae472]>:last-child,.wx-history-run__head[data-v-68eae472]>:last-child{margin-inline-start:auto;flex:none}.wx-history-entry__changes[data-v-68eae472]{display:flex;flex-direction:column;gap:var(--wx-space-2);margin:0;padding:0;list-style:none}.wx-history-change[data-v-68eae472]{font-size:var(--wx-font-size-sm);color:var(--wx-text-default);overflow-wrap:anywhere}.wx-history-change__label[data-v-68eae472]{color:var(--wx-text-muted);margin-inline-end:var(--wx-space-4)}.wx-history-change__from[data-v-68eae472]{color:var(--wx-text-muted);text-decoration:line-through}.wx-history-change__arrow[data-v-68eae472]{margin-inline:var(--wx-space-4);color:var(--wx-text-muted)}.wx-history-change__long[data-v-68eae472]{color:var(--wx-text-muted);font-style:italic}.wx-history-entry__run[data-v-68eae472]{align-self:flex-start;margin:0;padding:0;border:0;border-radius:var(--wx-radius-xs);background:none;font:inherit;font-size:var(--wx-font-size-sm);text-align:start;color:var(--wx-text-link);cursor:pointer}.wx-history-entry__run[data-v-68eae472]:hover{text-decoration:underline}.wx-history-entry__run[data-v-68eae472]:focus-visible{outline:none;box-shadow:var(--wx-ring-focus)}.wx-history__more[data-v-68eae472]{display:flex;justify-content:center}.wx-history-run[data-v-68eae472]{display:flex;flex-direction:column;gap:var(--wx-space-8);min-width:0}.wx-history-run__summary[data-v-68eae472]{display:grid;grid-template-columns:max-content 1fr;gap:var(--wx-space-4) var(--wx-space-12);margin:0;font-size:var(--wx-font-size-sm)}.wx-history-run__summary dt[data-v-68eae472]{color:var(--wx-text-muted)}.wx-history-run__summary dd[data-v-68eae472]{margin:0;overflow-wrap:anywhere}.wx-history-run__row[data-v-68eae472]{display:flex;flex-direction:column;gap:var(--wx-space-2)}.wx-row-menu[data-v-edb66fa9]{--wx-action-bg: transparent}.wx-row-menu__entry[data-v-edb66fa9]{display:flex;flex-direction:column;gap:var(--wx-space-2);white-space:normal}.wx-row-menu__hint[data-v-edb66fa9]{color:var(--wx-text-muted);font-size:var(--wx-font-size-xs);font-weight:var(--wx-font-weight-regular)}.wx-screen-head[data-v-9ebd5372]{--wx-head-line: calc(var(--wx-font-size-2xl) * var(--wx-font-line-height-tight));display:grid;grid-template-columns:auto minmax(0,1fr) auto;grid-template-areas:"back name actions" ". subtitle .";align-items:start;row-gap:var(--wx-space-4);flex:none;min-width:0}.wx-screen-head[data-level="3"][data-v-9ebd5372]{--wx-head-line: calc(var(--wx-font-size-xl) * var(--wx-font-line-height-tight))}.wx-screen-head.has-trail[data-v-9ebd5372]{grid-template-areas:"trail trail trail" "back name actions" ". subtitle ."}.wx-screen-head.has-divider[data-v-9ebd5372]{padding-block-end:var(--wx-space-12);border-block-end:1px solid var(--wx-border-default)}.wx-screen-head__trail[data-v-9ebd5372]{grid-area:trail;min-width:0;overflow-x:auto;overscroll-behavior-x:contain;overflow-anchor:none;scrollbar-width:none;-ms-overflow-style:none}.wx-screen-head__trail[data-v-9ebd5372]::-webkit-scrollbar{display:none}.wx-screen-head__trail[data-v-9ebd5372]>*{flex-wrap:nowrap;white-space:nowrap}.wx-screen-head__trail[data-v-9ebd5372] .wx-breadcrumb__list{flex-wrap:nowrap}.wx-screen-head__trail[data-v-9ebd5372] .wx-breadcrumb-item{flex:none}.wx-screen-head__trail[data-v-9ebd5372] .wx-breadcrumb-item__link{overflow:visible}.wx-screen-head[data-v-9ebd5372]>.wx-screen-head__back{grid-area:back;margin-inline-end:var(--wx-space-8);margin-block-start:calc((var(--wx-head-line) - 30px) / 2)}.wx-screen-head__name[data-v-9ebd5372]{grid-area:name;display:flex;align-items:center;gap:var(--wx-space-8);flex-wrap:wrap;min-width:0}.wx-screen-head__title[data-v-9ebd5372]{min-width:0}.wx-screen-head__subtitle[data-v-9ebd5372]{grid-area:subtitle;min-width:0}.wx-screen-head__actions[data-v-9ebd5372]{grid-area:actions;display:flex;align-items:center;justify-content:flex-end;gap:var(--wx-space-8);flex-wrap:wrap;min-width:0;margin-inline-start:var(--wx-space-12);margin-block-start:calc((var(--wx-head-line) - var(--wx-size-control-md)) / 2)}.wx-screen-head__actions[data-v-9ebd5372] .wx-action{--wx-action-size: var(--wx-size-control-md)}.wx-admin--drawer .wx-screen-head__actions[data-v-9ebd5372]{--wx-size-control-md: 36px}.wx-screen-head.is-narrow.has-button[data-v-9ebd5372]{grid-template-areas:"back name name" ". subtitle subtitle" "actions actions actions"}.wx-screen-head.is-narrow.has-button.has-trail[data-v-9ebd5372]{grid-template-areas:"trail trail trail" "back name name" ". subtitle subtitle" "actions actions actions"}.wx-screen-head.is-narrow.has-button .wx-screen-head__actions[data-v-9ebd5372]{margin-inline-start:0;margin-block-start:var(--wx-space-8)}.wx-screen-head.is-narrow .wx-screen-head__actions[data-v-9ebd5372]>.wx-screen-head__button{flex:1 1 auto}.wx-list-screen[data-v-8c7e5ad1]{display:flex;flex-direction:column;gap:var(--wx-gap, var(--wx-space-16));min-width:0;container-type:inline-size}.wx-list-screen.is-fill[data-v-8c7e5ad1]{min-height:0}.wx-list-screen.is-fill[data-v-8c7e5ad1]>:last-child{flex:1 1 auto;min-height:0}.wx-list-screen.is-fill[data-v-8c7e5ad1] .wx-tabs,.wx-list-screen.is-fill[data-v-8c7e5ad1] .wx-tabs__layout,.wx-list-screen.is-fill[data-v-8c7e5ad1] .wx-tabs__panels{display:flex;flex-direction:column;flex:1 1 auto;min-height:0}.wx-list-screen.is-fill[data-v-8c7e5ad1] .wx-tabs__panel,.wx-list-screen.is-fill[data-v-8c7e5ad1] .wx-tabs__panel>*{flex:1 1 auto;min-height:0}.wx-list-screen.is-fill[data-v-8c7e5ad1] .wx-tabs__bar{flex:0 0 auto}.wx-slug[data-v-2866b684]{display:flex;flex-direction:column;gap:var(--wx-space-8)}.wx-slug__prefix[data-v-2866b684],.wx-slug[data-v-2866b684] .wx-input__inner{font-family:var(--wx-font-family-mono)}.wx-slug__prefix[data-v-2866b684]{color:var(--wx-text-muted)}.wx-admin[data-v-0105c429]{--wx-admin-header-height: 52px;min-height:100dvh;background:var(--wx-bg-body)}.wx-admin--drawer[data-v-0105c429]{--wx-gap: var(--wx-space-8)}.wx-admin--rail[data-v-0105c429]{--wx-gap: var(--wx-space-12)}.wx-admin--sidebar[data-v-0105c429]{--wx-gap: var(--wx-space-16)}.wx-admin__frame[data-v-0105c429]{padding:var(--wx-gap);gap:var(--wx-gap)}.wx-admin__header[data-v-0105c429]{--wx-header-top: var(--wx-gap)}.wx-admin__aside[data-v-0105c429]{--wx-aside-top: var(--wx-gap);--wx-aside-height: calc(100dvh - var(--wx-gap) * 2)}.wx-admin__brand[data-v-0105c429]{display:flex;align-items:center;gap:var(--wx-space-8);box-sizing:border-box;min-height:48px;padding:var(--wx-space-8);border-bottom:1px solid var(--wx-border-muted)}.wx-aside--collapsed .wx-admin__brand[data-v-0105c429]{justify-content:center;padding-inline:var(--wx-space-4)}.wx-admin__brand--stacked[data-v-0105c429]{flex-direction:column;gap:var(--wx-space-4)}.wx-admin__title[data-v-0105c429]{flex:1 1 auto;min-width:0}.wx-admin__brand>.wx-admin__logo[data-v-0105c429]{margin-inline-end:auto}.wx-admin__logo[data-v-0105c429]{flex:0 1 auto;min-width:0;height:28px;width:auto;max-width:100%;object-fit:contain;object-position:left center}.wx-admin__mark[data-v-0105c429]{height:24px;width:24px;object-fit:contain}.wx-admin__user[data-v-0105c429]{display:flex;align-items:center;padding:var(--wx-space-8);border-top:1px solid var(--wx-border-muted)}.wx-aside--collapsed .wx-admin__user[data-v-0105c429]{justify-content:center}.wx-admin__user--drawer[data-v-0105c429]{flex:1 1 auto;justify-content:flex-start;padding:0;border-top:none}.wx-admin__screen[data-v-0105c429]{--wx-fill-height: calc(100dvh - var(--wx-gap) * 2);--wx-action-bar-bottom: var(--wx-gap);min-width:0;min-height:0}.wx-admin--drawer .wx-admin__screen[data-v-0105c429]{--wx-fill-height: calc(100dvh - var(--wx-gap) * 3 - var(--wx-admin-header-height))}.wx-admin-plain[data-v-0105c429]{display:grid;place-items:center;box-sizing:border-box;min-height:100dvh;padding:var(--wx-space-16);background:var(--wx-bg-body)}:root[data-wx-shell],:root[data-wx-shell]>body,html:has(>body>#webx-app),body:has(>#webx-app){margin:0}.wx-admin--drawer .wx-action--md{--wx-action-size: 30px}.wx-admin--drawer .wx-action--lg{--wx-action-size: 36px}.wx-admin__drawer .wx-drawer__content>.wx-menu{padding-inline:0}:root[data-wx-shell=drawer]{--wx-gap: var(--wx-space-8)}:root[data-wx-shell=rail]{--wx-gap: var(--wx-space-12)}:root[data-wx-shell=sidebar]{--wx-gap: var(--wx-space-16)}.wx-site-bar[data-v-765f808b]{display:flex;flex-direction:column;min-height:100vh;background:var(--wx-bg-surface);color:var(--wx-text-default)}.wx-site-bar__head[data-v-765f808b]{display:flex;align-items:flex-start;gap:var(--wx-space-4);padding:var(--wx-space-12) var(--wx-space-12) var(--wx-space-8) var(--wx-space-16);border-bottom:1px solid var(--wx-border-default)}.wx-site-bar__what[data-v-765f808b]{display:flex;flex:1 1 auto;flex-direction:column;gap:var(--wx-space-4);min-width:0}.wx-site-bar__state[data-v-765f808b]{display:flex;flex-wrap:wrap;align-items:center;gap:var(--wx-space-8)}.wx-site-bar__draft[data-v-765f808b]{margin:var(--wx-space-12) var(--wx-space-16) 0}.wx-site-bar__tabs[data-v-765f808b]{padding:var(--wx-space-8) var(--wx-space-16) 0}.wx-site-bar__body[data-v-765f808b]{display:flex;flex-direction:column;gap:var(--wx-space-16);padding:var(--wx-space-16) 0}.wx-site-bar>.wx-site-bar__body[data-v-765f808b]{padding:var(--wx-space-16)}.wx-site-bar__url[data-v-765f808b]{word-break:break-all}.wx-address-note[data-v-38e2b4c5]{display:inline-flex;align-items:center;margin-inline-start:var(--wx-space-4);color:var(--wx-text-muted);vertical-align:middle;cursor:help}.wx-address-note[data-v-38e2b4c5]:focus-visible{outline:none;border-radius:var(--wx-radius-xs);box-shadow:var(--wx-ring-focus)}.wx-categories__loading{padding:var(--wx-space-8)}.wx-categories__list.is-plain .wx-sortable-list__row{padding-inline:var(--wx-space-8)}.wx-categories__note{margin-block-start:var(--wx-space-8)}.wx-categories__list .wx-sortable-list__row:hover{background:var(--wx-bg-subtle);border-radius:var(--wx-radius-sm)}.wx-category-row{display:flex;flex-direction:column;gap:var(--wx-space-2);align-items:flex-start;flex:1 1 auto;min-width:0;color:inherit;text-decoration:none}.wx-category-row__name{display:flex;align-items:center;gap:var(--wx-space-6);min-width:0;max-width:100%}.wx-category-row.is-hidden{color:var(--wx-text-muted)}.wx-category-row__count{flex:none;font-variant-numeric:tabular-nums}.wx-save-state[data-v-216e5e44]{display:inline-flex;align-items:center;justify-content:center;flex:none;width:var(--wx-size-control-sm);height:var(--wx-size-control-sm)}.wx-save-state__mark[data-v-216e5e44]{font-size:var(--wx-font-size-lg);color:var(--wx-text-muted)}.wx-save-state__mark.is-saved[data-v-216e5e44]{color:var(--wx-color-success)}.wx-category-editor[data-v-55265992]{display:flex;flex-direction:column;gap:var(--wx-gap, var(--wx-space-16));container-type:inline-size}.wx-category-editor__ghost[data-v-55265992]{max-width:420px}.wx-rename[data-v-d879e8d3]{display:flex;flex-direction:column;gap:var(--wx-space-12)}.wx-rename__footer[data-v-d879e8d3]{display:flex;justify-content:flex-end}.wx-help[data-v-6c280d42]{color:var(--wx-text-default);font-size:var(--wx-font-size-md);line-height:var(--wx-font-line-height-normal)}.wx-help[data-v-6c280d42] h2,.wx-help[data-v-6c280d42] h3,.wx-help[data-v-6c280d42] h4{margin-block:var(--wx-space-18) var(--wx-space-8);font-weight:var(--wx-font-weight-semibold)}.wx-help[data-v-6c280d42] h2{font-size:var(--wx-font-size-lg)}.wx-help[data-v-6c280d42] h3,.wx-help[data-v-6c280d42] h4{font-size:var(--wx-font-size-md)}.wx-help[data-v-6c280d42] :is(h2,h3,h4):first-child{margin-block-start:0}.wx-help[data-v-6c280d42] p,.wx-help[data-v-6c280d42] ul,.wx-help[data-v-6c280d42] ol{margin-block:0 var(--wx-space-12)}.wx-help[data-v-6c280d42] ul,.wx-help[data-v-6c280d42] ol{padding-inline-start:var(--wx-space-24)}.wx-help[data-v-6c280d42] li{margin-block-end:var(--wx-space-4)}.wx-help[data-v-6c280d42] code{padding:0 var(--wx-space-4);border-radius:var(--wx-radius-xs);background:var(--wx-bg-subtle);font-family:var(--wx-font-family-mono);font-size:var(--wx-font-size-sm)}.wx-help[data-v-6c280d42] pre{margin-block:0 var(--wx-space-12);padding:var(--wx-space-12);border-radius:var(--wx-radius-sm);background:var(--wx-bg-subtle);overflow:auto}.wx-help[data-v-6c280d42] pre code{padding:0;background:none}.wx-help[data-v-6c280d42] a{color:var(--wx-color-primary)}.wx-notes[data-v-71004c1a]{display:flex;flex-direction:column;gap:var(--wx-space-12);min-width:0;container-type:inline-size}.wx-notes__list[data-v-71004c1a]{display:flex;flex-direction:column;gap:var(--wx-space-12);margin:0;padding:0;list-style:none}.wx-note[data-v-71004c1a]{display:flex;gap:var(--wx-space-8);min-width:0}.wx-note__body[data-v-71004c1a]{display:flex;flex-direction:column;gap:var(--wx-space-4);flex:1 1 auto;min-width:0}.wx-note__head[data-v-71004c1a]{display:flex;align-items:center;gap:var(--wx-space-8);min-width:0}.wx-note__head[data-v-71004c1a]>:last-child{margin-inline-start:auto}.wx-note__text[data-v-71004c1a]{margin:0;white-space:pre-wrap;overflow-wrap:anywhere;font-size:var(--wx-font-size-sm);color:var(--wx-text-default)}.wx-note__buttons[data-v-71004c1a]{display:flex;align-items:flex-start;gap:var(--wx-space-8)}.wx-notes__new[data-v-71004c1a]{display:flex;flex-direction:column;align-items:stretch;gap:var(--wx-space-8)}.wx-notes__new[data-v-71004c1a]>:first-child{min-width:0}.wx-notes__new[data-v-71004c1a]>:last-child{align-self:flex-start}@container (max-width: 440px){.wx-note__buttons[data-v-71004c1a]{flex-direction:column;align-items:stretch}.wx-notes__new[data-v-71004c1a]>:last-child{align-self:stretch}}.wx-editing-alerts__lead[data-v-4d019f39]{margin:0 0 var(--wx-space-8)}.wx-editing-alerts__list[data-v-4d019f39]{display:flex;flex-direction:column;gap:var(--wx-space-12);margin:0;padding:0;list-style:none}.wx-editing-alerts__item[data-v-4d019f39]{display:flex;flex-direction:column;gap:var(--wx-space-4)}.wx-editing-alerts__place[data-v-4d019f39]{font-weight:var(--wx-font-weight-medium)}.wx-editing-alerts__note[data-v-4d019f39],.wx-editing-alerts__was[data-v-4d019f39],.wx-editing-alerts__side[data-v-4d019f39]{color:var(--wx-text-muted)}.wx-editing-alerts__note[data-v-4d019f39]{margin-inline-start:var(--wx-space-8);font-weight:var(--wx-font-weight-regular)}.wx-editing-alerts__side[data-v-4d019f39]{margin-inline-end:var(--wx-space-6);font-size:var(--wx-font-size-sm)}.wx-editing-alerts__choices[data-v-4d019f39]{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,220px),1fr));gap:var(--wx-space-8)}.wx-editing-alerts__choice[data-v-4d019f39]{display:flex;flex-direction:column;align-items:flex-start;gap:var(--wx-space-2);min-width:0;padding:var(--wx-space-8) var(--wx-space-10);border:1px solid var(--wx-border-default);border-radius:var(--wx-radius-sm);background:var(--wx-bg-surface);color:var(--wx-text-default);font:inherit;text-align:start;cursor:pointer}.wx-editing-alerts__choice.is-chosen[data-v-4d019f39]{border-color:var(--wx-border-focus);box-shadow:0 0 0 1px var(--wx-border-focus)}.wx-editing-alerts__choice[data-v-4d019f39]:focus-visible{outline:2px solid var(--wx-border-focus);outline-offset:2px}.wx-editing-alerts__value[data-v-4d019f39]{overflow-wrap:anywhere}.wx-editing-alerts__others[data-v-4d019f39]{margin:0;color:var(--wx-text-muted);font-size:var(--wx-font-size-sm)}.wx-drafts[data-v-dd9f4601]{display:flex;flex-direction:column;gap:var(--wx-space-8)}.wx-drafts__head[data-v-dd9f4601]{display:flex;flex-direction:column;gap:var(--wx-space-2)}.wx-drafts__list[data-v-dd9f4601]{display:flex;flex-direction:column;border:1px solid var(--wx-border-default);border-radius:var(--wx-radius-md);background:var(--wx-bg-surface);overflow:hidden}.wx-drafts__ghost[data-v-dd9f4601]{padding:var(--wx-space-10) var(--wx-space-12)}.wx-drafts__row[data-v-dd9f4601]{display:flex;align-items:center;flex-wrap:wrap;gap:var(--wx-space-12);padding:var(--wx-space-10) var(--wx-space-12);border-block-end:1px solid var(--wx-border-default)}.wx-drafts__row[data-v-dd9f4601]:last-child{border-block-end:0}.wx-drafts__changed[data-v-dd9f4601]{overflow-wrap:anywhere}.wx-drafts__who[data-v-dd9f4601]{display:flex;flex-direction:column;flex:1;min-width:160px}.wx-backup-note[data-v-beeee67e]{display:flex;flex-wrap:wrap;align-items:baseline;gap:var(--wx-space-4) var(--wx-space-6);margin:0}
package/dist/types.d.ts CHANGED
@@ -4,6 +4,7 @@ import { TypeRegistry } from '@webx-ui/schema';
4
4
  import { ThemePreference } from '@webx-ui/tokens';
5
5
  import { AdminContext } from './admin';
6
6
  import { LocaleDescriptor } from './i18n';
7
+ import { SiteBarTab } from './siteBar';
7
8
  /**
8
9
  * What `GET /api/cms/manifest` answers with — the panel's own description of itself, and the
9
10
  * first thing the front end asks for. Mirrors `WebxUi\Admin\Manifest\ManifestBuilder`.
@@ -110,6 +111,11 @@ export interface AdminUser {
110
111
  * and then this browser's own choice stands.
111
112
  */
112
113
  theme?: ThemePreference | null;
114
+ /**
115
+ * Whether the panel on the site is shown to them on the site's own pages. Absent from an older
116
+ * server, which has no such panel.
117
+ */
118
+ siteBar?: boolean;
113
119
  /** The key their photograph is stored under — not an address; the panel resolves it. */
114
120
  avatar?: string | null;
115
121
  [key: string]: unknown;
@@ -173,6 +179,12 @@ export interface AdminModule {
173
179
  * cannot depend on the module that has the block library, so that module supplies this.
174
180
  */
175
181
  blockLabels?: (admin: AdminContext) => Promise<BlockLabels>;
182
+ /**
183
+ * Tabs this module adds to the panel on the site (WEBX_UI_SITE_BAR.md). Each is drawn only
184
+ * where the server listed its name for the page — the server half of the module registers
185
+ * the same name with `SiteBar::section()`.
186
+ */
187
+ siteBarTabs?: SiteBarTab[];
176
188
  }
177
189
  /** Names of block types and of their fields, as the block library has them. */
178
190
  export interface BlockLabels {
@@ -240,6 +252,11 @@ export interface RowAction {
240
252
  danger?: boolean;
241
253
  /** Offered but not possible right now — an address that does not exist yet. */
242
254
  disabled?: boolean;
255
+ /**
256
+ * Why it is not possible right now, said on the line itself: «Already first», «No room». A
257
+ * greyed line with no reason reads as broken.
258
+ */
259
+ hint?: string;
243
260
  /** Renders the line as a link. Opens in a new tab unless `target` says otherwise. */
244
261
  href?: string;
245
262
  target?: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webx-ui/module-admin",
3
- "version": "0.25.0",
3
+ "version": "0.26.0",
4
4
  "description": "The frame a WebX UI admin panel runs in: bootstrap, the shell, the HTTP client and the module registry that pairs with webx-ui/module-admin on the server.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -44,7 +44,7 @@
44
44
  "vue-router": "^4.5.0"
45
45
  },
46
46
  "dependencies": {
47
- "@webx-ui/core": "^0.40.0",
47
+ "@webx-ui/core": "^0.40.2",
48
48
  "@webx-ui/schema": "^0.9.0",
49
49
  "@webx-ui/tokens": "^0.6.0"
50
50
  },