@webx-ui/module-admin 0.19.0 → 0.21.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.
@@ -24,6 +24,10 @@ import { TypeRegistry } from '@webx-ui/schema';
24
24
  * editor hosting the screen hands it the prefix (`provideRecordAddress`). `wx-category-slug` is
25
25
  * the same field under the name the category screens were first described with.
26
26
  *
27
+ * `wx-select` is the core's select that also takes `source` — a module's list as its options, the
28
+ * way `wx-categories` has it: the stock status of a product, its brand. Over the schema's own
29
+ * `wx-select`, which it is when there is no `source`.
30
+ *
27
31
  * `wx-collection` is a block's window onto another section — the FAQ's questions, a team — and
28
32
  * keeps which part of it to show, never the records (`collections/`).
29
33
  *
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 .wx-input-number{max-width:240px}.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-5921c0dd]{display:flex;flex-direction:column;gap:var(--wx-space-8)}.wx-slug__prefix[data-v-5921c0dd],.wx-slug[data-v-5921c0dd] .wx-input__inner{font-family:var(--wx-font-family-mono)}.wx-slug__prefix[data-v-5921c0dd]{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-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-b9c461a6]{display:flex;flex-direction:column;gap:var(--wx-gap, var(--wx-space-16));container-type:inline-size}.wx-category-editor__ghost[data-v-b9c461a6]{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-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 .wx-input-number{max-width:240px}.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-5921c0dd]{display:flex;flex-direction:column;gap:var(--wx-space-8)}.wx-slug__prefix[data-v-5921c0dd],.wx-slug[data-v-5921c0dd] .wx-input__inner{font-family:var(--wx-font-family-mono)}.wx-slug__prefix[data-v-5921c0dd]{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-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-c245c468]{display:flex;flex-direction:column;gap:var(--wx-gap, var(--wx-space-16));container-type:inline-size}.wx-category-editor__ghost[data-v-c245c468]{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-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
@@ -64,6 +64,14 @@ export interface ManifestGroup {
64
64
  /** A name from the icon set; `null` or absent leaves the branch with the default picture. */
65
65
  icon?: string | null;
66
66
  order: number;
67
+ /** Captions inside the group, in order; a module stands under one by naming its id. */
68
+ sections?: ManifestSection[];
69
+ }
70
+ /** A caption inside a navigation group: the catalogue's «Dictionaries». */
71
+ export interface ManifestSection {
72
+ id: string;
73
+ title: string;
74
+ order: number;
67
75
  }
68
76
  export interface ManifestModule {
69
77
  id: string;
@@ -72,6 +80,8 @@ export interface ManifestModule {
72
80
  order: number;
73
81
  /** The group the section sits under, or null for the top level. */
74
82
  group?: string | null;
83
+ /** The caption inside the group it stands under, or null among the group's plain entries. */
84
+ section?: string | null;
75
85
  permissions: string[];
76
86
  /** Whatever the server-side module wanted to say, in its own room. */
77
87
  meta: Record<string, unknown>;
@@ -164,12 +174,23 @@ export interface NavEntry {
164
174
  path: string;
165
175
  /** Group id, or null at the top level. */
166
176
  group: string | null;
177
+ /** Caption id inside the group, or null among its plain entries. */
178
+ section: string | null;
167
179
  }
168
180
  /** A group with the entries that sit under it, in navigation order. */
169
181
  export interface NavGroup {
170
182
  id: string;
171
183
  title: string;
172
184
  icon: string | null;
185
+ /** The entries under no caption — they come first. */
186
+ entries: NavEntry[];
187
+ /** Captions that have entries, in the order the server declared them. */
188
+ sections: NavSection[];
189
+ }
190
+ /** A caption inside a group with the entries under it. */
191
+ export interface NavSection {
192
+ id: string;
193
+ title: string;
173
194
  entries: NavEntry[];
174
195
  }
175
196
  /**
@@ -0,0 +1,79 @@
1
+ import { Ref } from 'vue';
2
+ import { AdminContext } from './admin';
3
+ /**
4
+ * Large files a piece at a time, through the panel's own four requests (§4 of the video spec):
5
+ *
6
+ * POST uploads { name, size, type, fingerprint, purpose } → { id, offset, size, chunk_size }
7
+ * HEAD uploads/{id} → Upload-Offset
8
+ * PATCH uploads/{id} a piece, Upload-Offset: n → 204, Upload-Offset: n + length
9
+ * DELETE uploads/{id}
10
+ *
11
+ * The server holds the offset and the client follows it: a 409 names where the file really
12
+ * ends, a HEAD asks after a dropped connection, and the same file chosen again after a reload
13
+ * finds its session by the fingerprint. What the server cannot know is the web server's own
14
+ * limit, so a 413 halves the piece — down to 256 KB — and the smaller piece stays for the rest
15
+ * of the file.
16
+ */
17
+ export type ChunkedUploadState = 'idle' | 'uploading' | 'paused' | 'offline' | 'done' | 'failed';
18
+ /** An upload that did not finish, as remembered in this browser for the next visit. */
19
+ export interface UnfinishedUpload {
20
+ fingerprint: string;
21
+ purpose: string;
22
+ name: string;
23
+ size: number;
24
+ offset: number;
25
+ /** Milliseconds since the epoch, of the last piece that landed. */
26
+ updatedAt: number;
27
+ }
28
+ export interface ChunkedUploadOptions {
29
+ /** The panel to talk to; `useAdmin()` when left out. */
30
+ admin?: Pick<AdminContext, 'http' | 'apiPath'>;
31
+ /** Where unfinished uploads are remembered; `localStorage` when left out, `null` for nowhere. */
32
+ storage?: Storage | null;
33
+ /** How many times a piece lost to the network is sent again before the upload fails. */
34
+ retries?: number;
35
+ /** The wait before the first of those, doubled for each after it. */
36
+ retryDelay?: number;
37
+ }
38
+ export interface ChunkedUpload {
39
+ readonly state: Readonly<Ref<ChunkedUploadState>>;
40
+ /** 0 to 1. */
41
+ readonly progress: Readonly<Ref<number>>;
42
+ /** Bytes the server has. */
43
+ readonly uploaded: Readonly<Ref<number>>;
44
+ readonly total: Readonly<Ref<number>>;
45
+ /** Bytes a second, over the last few seconds; 0 until there is something to measure. */
46
+ readonly speed: Readonly<Ref<number>>;
47
+ /** Seconds left at that speed, or null while there is no speed to go by. */
48
+ readonly remaining: Readonly<Ref<number | null>>;
49
+ /** The session's id, which is what the module the file was for claims it by. */
50
+ readonly id: Readonly<Ref<string | null>>;
51
+ readonly error: Readonly<Ref<Error | null>>;
52
+ /**
53
+ * Send a file. Resolves with the session's id once the whole of it is on the server, with
54
+ * null when it is cancelled; rejects when it fails. A pause does neither — the same promise
55
+ * resolves once the upload is resumed and finished.
56
+ */
57
+ start(file: File, purpose: string): Promise<string | null>;
58
+ pause(): void;
59
+ /** Carry on after a pause, going offline or a failure; the promise of the upload. */
60
+ resume(): Promise<string | null>;
61
+ /** Stop and throw away what the server has. */
62
+ cancel(): Promise<void>;
63
+ }
64
+ /** The smallest piece the client falls back to on a 413 (the server never advises less). */
65
+ export declare const MIN_CHUNK: number;
66
+ /**
67
+ * What identifies a file without reading it: the same name, size and date of change is taken
68
+ * for the same file. Cheap on purpose — hashing gigabytes to find out where to resume would take
69
+ * longer than a good part of the upload.
70
+ */
71
+ export declare function uploadFingerprint(file: Pick<File, 'name' | 'size' | 'lastModified'>): string;
72
+ /**
73
+ * The uploads this browser started and did not finish — what a panel offers to continue after a
74
+ * reload ("choose the same file"). Empty wherever storage is refused.
75
+ */
76
+ export declare function unfinishedUploads(purpose?: string, storage?: Storage | null): UnfinishedUpload[];
77
+ /** Stop offering to continue an upload — the person chose not to. */
78
+ export declare function forgetUnfinishedUpload(fingerprint: string, purpose: string, storage?: Storage | null): void;
79
+ export declare function useChunkedUpload(options?: ChunkedUploadOptions): ChunkedUpload;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webx-ui/module-admin",
3
- "version": "0.19.0",
3
+ "version": "0.21.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.34.1",
47
+ "@webx-ui/core": "^0.34.2",
48
48
  "@webx-ui/schema": "^0.6.4",
49
49
  "@webx-ui/tokens": "^0.4.0"
50
50
  },