@kywi-software/core 0.1.0 → 0.2.1
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.
- package/dist/admin/app.d.ts +69 -0
- package/dist/admin/app.d.ts.map +1 -0
- package/dist/admin/app.js +98 -0
- package/dist/admin/app.js.map +1 -0
- package/dist/admin/chrome.d.ts +37 -0
- package/dist/admin/chrome.d.ts.map +1 -0
- package/dist/admin/chrome.js +162 -0
- package/dist/admin/chrome.js.map +1 -0
- package/dist/admin/context.d.ts +58 -0
- package/dist/admin/context.d.ts.map +1 -0
- package/dist/admin/context.js +31 -0
- package/dist/admin/context.js.map +1 -0
- package/dist/admin/index.d.ts +9 -1
- package/dist/admin/index.d.ts.map +1 -1
- package/dist/admin/index.js +12 -0
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/kywi-logo.d.ts +21 -0
- package/dist/admin/kywi-logo.d.ts.map +1 -0
- package/dist/admin/kywi-logo.js +123 -0
- package/dist/admin/kywi-logo.js.map +1 -0
- package/dist/admin/nav.d.ts +21 -1
- package/dist/admin/nav.d.ts.map +1 -1
- package/dist/admin/nav.js +45 -88
- package/dist/admin/nav.js.map +1 -1
- package/dist/admin/primitives.d.ts +52 -0
- package/dist/admin/primitives.d.ts.map +1 -0
- package/dist/admin/primitives.js +78 -0
- package/dist/admin/primitives.js.map +1 -0
- package/dist/admin/registry.d.ts +130 -0
- package/dist/admin/registry.d.ts.map +1 -0
- package/dist/admin/registry.js +456 -0
- package/dist/admin/registry.js.map +1 -0
- package/dist/admin/server.d.ts +154 -0
- package/dist/admin/server.d.ts.map +1 -0
- package/dist/admin/server.js +121 -0
- package/dist/admin/server.js.map +1 -0
- package/dist/admin/shell.d.ts +27 -1
- package/dist/admin/shell.d.ts.map +1 -1
- package/dist/admin/shell.js +71 -6
- package/dist/admin/shell.js.map +1 -1
- package/dist/admin/styles/admin.css +113 -23
- package/dist/admin/surface-matcher.d.ts +51 -0
- package/dist/admin/surface-matcher.d.ts.map +1 -0
- package/dist/admin/surface-matcher.js +181 -0
- package/dist/admin/surface-matcher.js.map +1 -0
- package/dist/admin/surfaces/approvals/approvals-data.d.ts +17 -0
- package/dist/admin/surfaces/approvals/approvals-data.d.ts.map +1 -0
- package/dist/admin/surfaces/approvals/approvals-data.js +55 -0
- package/dist/admin/surfaces/approvals/approvals-data.js.map +1 -0
- package/dist/admin/surfaces/approvals/approvals-index.d.ts +3 -0
- package/dist/admin/surfaces/approvals/approvals-index.d.ts.map +1 -0
- package/dist/admin/surfaces/approvals/approvals-index.js +75 -0
- package/dist/admin/surfaces/approvals/approvals-index.js.map +1 -0
- package/dist/admin/surfaces/audiences/audiences-data.d.ts +107 -0
- package/dist/admin/surfaces/audiences/audiences-data.d.ts.map +1 -0
- package/dist/admin/surfaces/audiences/audiences-data.js +216 -0
- package/dist/admin/surfaces/audiences/audiences-data.js.map +1 -0
- package/dist/admin/surfaces/audiences/audiences-detail.d.ts +3 -0
- package/dist/admin/surfaces/audiences/audiences-detail.d.ts.map +1 -0
- package/dist/admin/surfaces/audiences/audiences-detail.js +78 -0
- package/dist/admin/surfaces/audiences/audiences-detail.js.map +1 -0
- package/dist/admin/surfaces/audiences/audiences-edit.d.ts +3 -0
- package/dist/admin/surfaces/audiences/audiences-edit.d.ts.map +1 -0
- package/dist/admin/surfaces/audiences/audiences-edit.js +55 -0
- package/dist/admin/surfaces/audiences/audiences-edit.js.map +1 -0
- package/dist/admin/surfaces/audiences/audiences-fields.d.ts +3 -0
- package/dist/admin/surfaces/audiences/audiences-fields.d.ts.map +1 -0
- package/dist/admin/surfaces/audiences/audiences-fields.js +56 -0
- package/dist/admin/surfaces/audiences/audiences-fields.js.map +1 -0
- package/dist/admin/surfaces/audiences/audiences-list.d.ts +3 -0
- package/dist/admin/surfaces/audiences/audiences-list.d.ts.map +1 -0
- package/dist/admin/surfaces/audiences/audiences-list.js +50 -0
- package/dist/admin/surfaces/audiences/audiences-list.js.map +1 -0
- package/dist/admin/surfaces/audiences/audiences-new.d.ts +3 -0
- package/dist/admin/surfaces/audiences/audiences-new.d.ts.map +1 -0
- package/dist/admin/surfaces/audiences/audiences-new.js +54 -0
- package/dist/admin/surfaces/audiences/audiences-new.js.map +1 -0
- package/dist/admin/surfaces/audiences/audiences-preview-tokens.d.ts +3 -0
- package/dist/admin/surfaces/audiences/audiences-preview-tokens.d.ts.map +1 -0
- package/dist/admin/surfaces/audiences/audiences-preview-tokens.js +123 -0
- package/dist/admin/surfaces/audiences/audiences-preview-tokens.js.map +1 -0
- package/dist/admin/surfaces/audiences/audiences-selfid-widget.d.ts +3 -0
- package/dist/admin/surfaces/audiences/audiences-selfid-widget.d.ts.map +1 -0
- package/dist/admin/surfaces/audiences/audiences-selfid-widget.js +50 -0
- package/dist/admin/surfaces/audiences/audiences-selfid-widget.js.map +1 -0
- package/dist/admin/surfaces/audiences/audiences-test.d.ts +3 -0
- package/dist/admin/surfaces/audiences/audiences-test.d.ts.map +1 -0
- package/dist/admin/surfaces/audiences/audiences-test.js +39 -0
- package/dist/admin/surfaces/audiences/audiences-test.js.map +1 -0
- package/dist/admin/surfaces/audiences/states.d.ts +10 -0
- package/dist/admin/surfaces/audiences/states.d.ts.map +1 -0
- package/dist/admin/surfaces/audiences/states.js +11 -0
- package/dist/admin/surfaces/audiences/states.js.map +1 -0
- package/dist/admin/surfaces/changesets/changesets-data.d.ts +35 -0
- package/dist/admin/surfaces/changesets/changesets-data.d.ts.map +1 -0
- package/dist/admin/surfaces/changesets/changesets-data.js +151 -0
- package/dist/admin/surfaces/changesets/changesets-data.js.map +1 -0
- package/dist/admin/surfaces/changesets/changesets-detail.d.ts +3 -0
- package/dist/admin/surfaces/changesets/changesets-detail.d.ts.map +1 -0
- package/dist/admin/surfaces/changesets/changesets-detail.js +84 -0
- package/dist/admin/surfaces/changesets/changesets-detail.js.map +1 -0
- package/dist/admin/surfaces/changesets/changesets-index.d.ts +3 -0
- package/dist/admin/surfaces/changesets/changesets-index.d.ts.map +1 -0
- package/dist/admin/surfaces/changesets/changesets-index.js +62 -0
- package/dist/admin/surfaces/changesets/changesets-index.js.map +1 -0
- package/dist/admin/surfaces/comments/comment-moderation.d.ts +18 -0
- package/dist/admin/surfaces/comments/comment-moderation.d.ts.map +1 -0
- package/dist/admin/surfaces/comments/comment-moderation.js +36 -0
- package/dist/admin/surfaces/comments/comment-moderation.js.map +1 -0
- package/dist/admin/surfaces/comments/comments-data.d.ts +23 -0
- package/dist/admin/surfaces/comments/comments-data.d.ts.map +1 -0
- package/dist/admin/surfaces/comments/comments-data.js +81 -0
- package/dist/admin/surfaces/comments/comments-data.js.map +1 -0
- package/dist/admin/surfaces/comments/comments-index.d.ts +3 -0
- package/dist/admin/surfaces/comments/comments-index.d.ts.map +1 -0
- package/dist/admin/surfaces/comments/comments-index.js +73 -0
- package/dist/admin/surfaces/comments/comments-index.js.map +1 -0
- package/dist/admin/surfaces/content/content-edit.d.ts +3 -0
- package/dist/admin/surfaces/content/content-edit.d.ts.map +1 -0
- package/dist/admin/surfaces/content/content-edit.js +321 -0
- package/dist/admin/surfaces/content/content-edit.js.map +1 -0
- package/dist/admin/surfaces/content/content-index.d.ts +3 -0
- package/dist/admin/surfaces/content/content-index.d.ts.map +1 -0
- package/dist/admin/surfaces/content/content-index.js +21 -0
- package/dist/admin/surfaces/content/content-index.js.map +1 -0
- package/dist/admin/surfaces/content/content-list.d.ts +3 -0
- package/dist/admin/surfaces/content/content-list.d.ts.map +1 -0
- package/dist/admin/surfaces/content/content-list.js +70 -0
- package/dist/admin/surfaces/content/content-list.js.map +1 -0
- package/dist/admin/surfaces/content/content-new.d.ts +3 -0
- package/dist/admin/surfaces/content/content-new.d.ts.map +1 -0
- package/dist/admin/surfaces/content/content-new.js +109 -0
- package/dist/admin/surfaces/content/content-new.js.map +1 -0
- package/dist/admin/surfaces/content/content-translation-bar.d.ts +12 -0
- package/dist/admin/surfaces/content/content-translation-bar.d.ts.map +1 -0
- package/dist/admin/surfaces/content/content-translation-bar.js +65 -0
- package/dist/admin/surfaces/content/content-translation-bar.js.map +1 -0
- package/dist/admin/surfaces/content/runtime-content-types.d.ts +41 -0
- package/dist/admin/surfaces/content/runtime-content-types.d.ts.map +1 -0
- package/dist/admin/surfaces/content/runtime-content-types.js +51 -0
- package/dist/admin/surfaces/content/runtime-content-types.js.map +1 -0
- package/dist/admin/surfaces/contentTree/content-tree.d.ts +3 -0
- package/dist/admin/surfaces/contentTree/content-tree.d.ts.map +1 -0
- package/dist/admin/surfaces/contentTree/content-tree.js +179 -0
- package/dist/admin/surfaces/contentTree/content-tree.js.map +1 -0
- package/dist/admin/surfaces/contentTree/move-to-picker.d.ts +12 -0
- package/dist/admin/surfaces/contentTree/move-to-picker.d.ts.map +1 -0
- package/dist/admin/surfaces/contentTree/move-to-picker.js +77 -0
- package/dist/admin/surfaces/contentTree/move-to-picker.js.map +1 -0
- package/dist/admin/surfaces/contentTypes/content-types-designer.d.ts +3 -0
- package/dist/admin/surfaces/contentTypes/content-types-designer.d.ts.map +1 -0
- package/dist/admin/surfaces/contentTypes/content-types-designer.js +260 -0
- package/dist/admin/surfaces/contentTypes/content-types-designer.js.map +1 -0
- package/dist/admin/surfaces/contentTypes/content-types-list.d.ts +3 -0
- package/dist/admin/surfaces/contentTypes/content-types-list.d.ts.map +1 -0
- package/dist/admin/surfaces/contentTypes/content-types-list.js +69 -0
- package/dist/admin/surfaces/contentTypes/content-types-list.js.map +1 -0
- package/dist/admin/surfaces/dashboard/dashboard-index.d.ts +3 -0
- package/dist/admin/surfaces/dashboard/dashboard-index.d.ts.map +1 -0
- package/dist/admin/surfaces/dashboard/dashboard-index.js +100 -0
- package/dist/admin/surfaces/dashboard/dashboard-index.js.map +1 -0
- package/dist/admin/surfaces/experiments/experiments-data.d.ts +12 -0
- package/dist/admin/surfaces/experiments/experiments-data.d.ts.map +1 -0
- package/dist/admin/surfaces/experiments/experiments-data.js +89 -0
- package/dist/admin/surfaces/experiments/experiments-data.js.map +1 -0
- package/dist/admin/surfaces/experiments/experiments-detail.d.ts +3 -0
- package/dist/admin/surfaces/experiments/experiments-detail.d.ts.map +1 -0
- package/dist/admin/surfaces/experiments/experiments-detail.js +87 -0
- package/dist/admin/surfaces/experiments/experiments-detail.js.map +1 -0
- package/dist/admin/surfaces/experiments/experiments-list.d.ts +3 -0
- package/dist/admin/surfaces/experiments/experiments-list.d.ts.map +1 -0
- package/dist/admin/surfaces/experiments/experiments-list.js +37 -0
- package/dist/admin/surfaces/experiments/experiments-list.js.map +1 -0
- package/dist/admin/surfaces/experiments/experiments-new.d.ts +3 -0
- package/dist/admin/surfaces/experiments/experiments-new.d.ts.map +1 -0
- package/dist/admin/surfaces/experiments/experiments-new.js +33 -0
- package/dist/admin/surfaces/experiments/experiments-new.js.map +1 -0
- package/dist/admin/surfaces/experiments/states.d.ts +10 -0
- package/dist/admin/surfaces/experiments/states.d.ts.map +1 -0
- package/dist/admin/surfaces/experiments/states.js +11 -0
- package/dist/admin/surfaces/experiments/states.js.map +1 -0
- package/dist/admin/surfaces/extensions/extensions-data.d.ts +59 -0
- package/dist/admin/surfaces/extensions/extensions-data.d.ts.map +1 -0
- package/dist/admin/surfaces/extensions/extensions-data.js +71 -0
- package/dist/admin/surfaces/extensions/extensions-data.js.map +1 -0
- package/dist/admin/surfaces/extensions/extensions-import-export.d.ts +3 -0
- package/dist/admin/surfaces/extensions/extensions-import-export.d.ts.map +1 -0
- package/dist/admin/surfaces/extensions/extensions-import-export.js +77 -0
- package/dist/admin/surfaces/extensions/extensions-import-export.js.map +1 -0
- package/dist/admin/surfaces/extensions/extensions-list.d.ts +3 -0
- package/dist/admin/surfaces/extensions/extensions-list.d.ts.map +1 -0
- package/dist/admin/surfaces/extensions/extensions-list.js +106 -0
- package/dist/admin/surfaces/extensions/extensions-list.js.map +1 -0
- package/dist/admin/surfaces/extensions/form-modal.d.ts +17 -0
- package/dist/admin/surfaces/extensions/form-modal.d.ts.map +1 -0
- package/dist/admin/surfaces/extensions/form-modal.js +27 -0
- package/dist/admin/surfaces/extensions/form-modal.js.map +1 -0
- package/dist/admin/surfaces/feeds/feed-editor.d.ts +8 -0
- package/dist/admin/surfaces/feeds/feed-editor.d.ts.map +1 -0
- package/dist/admin/surfaces/feeds/feed-editor.js +120 -0
- package/dist/admin/surfaces/feeds/feed-editor.js.map +1 -0
- package/dist/admin/surfaces/feeds/feeds-data.d.ts +35 -0
- package/dist/admin/surfaces/feeds/feeds-data.d.ts.map +1 -0
- package/dist/admin/surfaces/feeds/feeds-data.js +81 -0
- package/dist/admin/surfaces/feeds/feeds-data.js.map +1 -0
- package/dist/admin/surfaces/feeds/feeds-detail.d.ts +3 -0
- package/dist/admin/surfaces/feeds/feeds-detail.d.ts.map +1 -0
- package/dist/admin/surfaces/feeds/feeds-detail.js +36 -0
- package/dist/admin/surfaces/feeds/feeds-detail.js.map +1 -0
- package/dist/admin/surfaces/feeds/feeds-list.d.ts +3 -0
- package/dist/admin/surfaces/feeds/feeds-list.d.ts.map +1 -0
- package/dist/admin/surfaces/feeds/feeds-list.js +49 -0
- package/dist/admin/surfaces/feeds/feeds-list.js.map +1 -0
- package/dist/admin/surfaces/feeds/feeds-new.d.ts +3 -0
- package/dist/admin/surfaces/feeds/feeds-new.d.ts.map +1 -0
- package/dist/admin/surfaces/feeds/feeds-new.js +7 -0
- package/dist/admin/surfaces/feeds/feeds-new.js.map +1 -0
- package/dist/admin/surfaces/forms/form-editor.d.ts +5 -0
- package/dist/admin/surfaces/forms/form-editor.d.ts.map +1 -0
- package/dist/admin/surfaces/forms/form-editor.js +59 -0
- package/dist/admin/surfaces/forms/form-editor.js.map +1 -0
- package/dist/admin/surfaces/forms/forms-data.d.ts +52 -0
- package/dist/admin/surfaces/forms/forms-data.d.ts.map +1 -0
- package/dist/admin/surfaces/forms/forms-data.js +106 -0
- package/dist/admin/surfaces/forms/forms-data.js.map +1 -0
- package/dist/admin/surfaces/forms/forms-edit.d.ts +3 -0
- package/dist/admin/surfaces/forms/forms-edit.d.ts.map +1 -0
- package/dist/admin/surfaces/forms/forms-edit.js +40 -0
- package/dist/admin/surfaces/forms/forms-edit.js.map +1 -0
- package/dist/admin/surfaces/forms/forms-list.d.ts +3 -0
- package/dist/admin/surfaces/forms/forms-list.d.ts.map +1 -0
- package/dist/admin/surfaces/forms/forms-list.js +53 -0
- package/dist/admin/surfaces/forms/forms-list.js.map +1 -0
- package/dist/admin/surfaces/forms/forms-new.d.ts +3 -0
- package/dist/admin/surfaces/forms/forms-new.d.ts.map +1 -0
- package/dist/admin/surfaces/forms/forms-new.js +7 -0
- package/dist/admin/surfaces/forms/forms-new.js.map +1 -0
- package/dist/admin/surfaces/forms/forms-submissions.d.ts +3 -0
- package/dist/admin/surfaces/forms/forms-submissions.d.ts.map +1 -0
- package/dist/admin/surfaces/forms/forms-submissions.js +125 -0
- package/dist/admin/surfaces/forms/forms-submissions.js.map +1 -0
- package/dist/admin/surfaces/layouts/layout-editor-client.d.ts +8 -0
- package/dist/admin/surfaces/layouts/layout-editor-client.d.ts.map +1 -0
- package/dist/admin/surfaces/layouts/layout-editor-client.js +77 -0
- package/dist/admin/surfaces/layouts/layout-editor-client.js.map +1 -0
- package/dist/admin/surfaces/layouts/layouts-data.d.ts +53 -0
- package/dist/admin/surfaces/layouts/layouts-data.d.ts.map +1 -0
- package/dist/admin/surfaces/layouts/layouts-data.js +61 -0
- package/dist/admin/surfaces/layouts/layouts-data.js.map +1 -0
- package/dist/admin/surfaces/layouts/layouts-detail.d.ts +3 -0
- package/dist/admin/surfaces/layouts/layouts-detail.d.ts.map +1 -0
- package/dist/admin/surfaces/layouts/layouts-detail.js +38 -0
- package/dist/admin/surfaces/layouts/layouts-detail.js.map +1 -0
- package/dist/admin/surfaces/layouts/layouts-list.d.ts +3 -0
- package/dist/admin/surfaces/layouts/layouts-list.d.ts.map +1 -0
- package/dist/admin/surfaces/layouts/layouts-list.js +62 -0
- package/dist/admin/surfaces/layouts/layouts-list.js.map +1 -0
- package/dist/admin/surfaces/layouts/layouts-new.d.ts +3 -0
- package/dist/admin/surfaces/layouts/layouts-new.d.ts.map +1 -0
- package/dist/admin/surfaces/layouts/layouts-new.js +7 -0
- package/dist/admin/surfaces/layouts/layouts-new.js.map +1 -0
- package/dist/admin/surfaces/login.d.ts +20 -0
- package/dist/admin/surfaces/login.d.ts.map +1 -0
- package/dist/admin/surfaces/login.js +93 -0
- package/dist/admin/surfaces/login.js.map +1 -0
- package/dist/admin/surfaces/media/library.d.ts +3 -0
- package/dist/admin/surfaces/media/library.d.ts.map +1 -0
- package/dist/admin/surfaces/media/library.js +7 -0
- package/dist/admin/surfaces/media/library.js.map +1 -0
- package/dist/admin/surfaces/media/media-client.d.ts +4 -0
- package/dist/admin/surfaces/media/media-client.d.ts.map +1 -0
- package/dist/admin/surfaces/media/media-client.js +203 -0
- package/dist/admin/surfaces/media/media-client.js.map +1 -0
- package/dist/admin/surfaces/media/upload.d.ts +3 -0
- package/dist/admin/surfaces/media/upload.d.ts.map +1 -0
- package/dist/admin/surfaces/media/upload.js +7 -0
- package/dist/admin/surfaces/media/upload.js.map +1 -0
- package/dist/admin/surfaces/plugins/plugins-data.d.ts +37 -0
- package/dist/admin/surfaces/plugins/plugins-data.d.ts.map +1 -0
- package/dist/admin/surfaces/plugins/plugins-data.js +31 -0
- package/dist/admin/surfaces/plugins/plugins-data.js.map +1 -0
- package/dist/admin/surfaces/plugins/plugins-index.d.ts +3 -0
- package/dist/admin/surfaces/plugins/plugins-index.d.ts.map +1 -0
- package/dist/admin/surfaces/plugins/plugins-index.js +72 -0
- package/dist/admin/surfaces/plugins/plugins-index.js.map +1 -0
- package/dist/admin/surfaces/search/search-index.d.ts +3 -0
- package/dist/admin/surfaces/search/search-index.d.ts.map +1 -0
- package/dist/admin/surfaces/search/search-index.js +76 -0
- package/dist/admin/surfaces/search/search-index.js.map +1 -0
- package/dist/admin/surfaces/settings/admin-features.d.ts +3 -0
- package/dist/admin/surfaces/settings/admin-features.d.ts.map +1 -0
- package/dist/admin/surfaces/settings/admin-features.js +138 -0
- package/dist/admin/surfaces/settings/admin-features.js.map +1 -0
- package/dist/admin/surfaces/settings/settings-ax.d.ts +3 -0
- package/dist/admin/surfaces/settings/settings-ax.d.ts.map +1 -0
- package/dist/admin/surfaces/settings/settings-ax.js +63 -0
- package/dist/admin/surfaces/settings/settings-ax.js.map +1 -0
- package/dist/admin/surfaces/settings/settings-cache.d.ts +3 -0
- package/dist/admin/surfaces/settings/settings-cache.d.ts.map +1 -0
- package/dist/admin/surfaces/settings/settings-cache.js +64 -0
- package/dist/admin/surfaces/settings/settings-cache.js.map +1 -0
- package/dist/admin/surfaces/settings/settings-email.d.ts +3 -0
- package/dist/admin/surfaces/settings/settings-email.d.ts.map +1 -0
- package/dist/admin/surfaces/settings/settings-email.js +89 -0
- package/dist/admin/surfaces/settings/settings-email.js.map +1 -0
- package/dist/admin/surfaces/settings/settings-general.d.ts +3 -0
- package/dist/admin/surfaces/settings/settings-general.d.ts.map +1 -0
- package/dist/admin/surfaces/settings/settings-general.js +91 -0
- package/dist/admin/surfaces/settings/settings-general.js.map +1 -0
- package/dist/admin/surfaces/settings/settings-site.d.ts +3 -0
- package/dist/admin/surfaces/settings/settings-site.d.ts.map +1 -0
- package/dist/admin/surfaces/settings/settings-site.js +14 -0
- package/dist/admin/surfaces/settings/settings-site.js.map +1 -0
- package/dist/admin/surfaces/settings/settings-sites.d.ts +3 -0
- package/dist/admin/surfaces/settings/settings-sites.d.ts.map +1 -0
- package/dist/admin/surfaces/settings/settings-sites.js +134 -0
- package/dist/admin/surfaces/settings/settings-sites.js.map +1 -0
- package/dist/admin/surfaces/settings/states.d.ts +33 -0
- package/dist/admin/surfaces/settings/states.d.ts.map +1 -0
- package/dist/admin/surfaces/settings/states.js +33 -0
- package/dist/admin/surfaces/settings/states.js.map +1 -0
- package/dist/admin/surfaces/taxonomy/categories.d.ts +3 -0
- package/dist/admin/surfaces/taxonomy/categories.d.ts.map +1 -0
- package/dist/admin/surfaces/taxonomy/categories.js +162 -0
- package/dist/admin/surfaces/taxonomy/categories.js.map +1 -0
- package/dist/admin/surfaces/taxonomy/tags.d.ts +3 -0
- package/dist/admin/surfaces/taxonomy/tags.d.ts.map +1 -0
- package/dist/admin/surfaces/taxonomy/tags.js +112 -0
- package/dist/admin/surfaces/taxonomy/tags.js.map +1 -0
- package/dist/admin/surfaces/taxonomy/taxonomy-ui.d.ts +39 -0
- package/dist/admin/surfaces/taxonomy/taxonomy-ui.d.ts.map +1 -0
- package/dist/admin/surfaces/taxonomy/taxonomy-ui.js +66 -0
- package/dist/admin/surfaces/taxonomy/taxonomy-ui.js.map +1 -0
- package/dist/admin/surfaces/translations/states.d.ts +10 -0
- package/dist/admin/surfaces/translations/states.d.ts.map +1 -0
- package/dist/admin/surfaces/translations/states.js +11 -0
- package/dist/admin/surfaces/translations/states.js.map +1 -0
- package/dist/admin/surfaces/translations/translations-index.d.ts +3 -0
- package/dist/admin/surfaces/translations/translations-index.d.ts.map +1 -0
- package/dist/admin/surfaces/translations/translations-index.js +99 -0
- package/dist/admin/surfaces/translations/translations-index.js.map +1 -0
- package/dist/admin/surfaces/trash/trash-index.d.ts +3 -0
- package/dist/admin/surfaces/trash/trash-index.d.ts.map +1 -0
- package/dist/admin/surfaces/trash/trash-index.js +96 -0
- package/dist/admin/surfaces/trash/trash-index.js.map +1 -0
- package/dist/admin/surfaces/users/users-data.d.ts +51 -0
- package/dist/admin/surfaces/users/users-data.d.ts.map +1 -0
- package/dist/admin/surfaces/users/users-data.js +60 -0
- package/dist/admin/surfaces/users/users-data.js.map +1 -0
- package/dist/admin/surfaces/users/users-detail.d.ts +3 -0
- package/dist/admin/surfaces/users/users-detail.d.ts.map +1 -0
- package/dist/admin/surfaces/users/users-detail.js +148 -0
- package/dist/admin/surfaces/users/users-detail.js.map +1 -0
- package/dist/admin/surfaces/users/users-groups.d.ts +3 -0
- package/dist/admin/surfaces/users/users-groups.d.ts.map +1 -0
- package/dist/admin/surfaces/users/users-groups.js +136 -0
- package/dist/admin/surfaces/users/users-groups.js.map +1 -0
- package/dist/admin/surfaces/users/users-list.d.ts +3 -0
- package/dist/admin/surfaces/users/users-list.d.ts.map +1 -0
- package/dist/admin/surfaces/users/users-list.js +119 -0
- package/dist/admin/surfaces/users/users-list.js.map +1 -0
- package/dist/admin/surfaces/users/users-new.d.ts +3 -0
- package/dist/admin/surfaces/users/users-new.d.ts.map +1 -0
- package/dist/admin/surfaces/users/users-new.js +78 -0
- package/dist/admin/surfaces/users/users-new.js.map +1 -0
- package/dist/admin/surfaces/users/users-permissions.d.ts +3 -0
- package/dist/admin/surfaces/users/users-permissions.d.ts.map +1 -0
- package/dist/admin/surfaces/users/users-permissions.js +135 -0
- package/dist/admin/surfaces/users/users-permissions.js.map +1 -0
- package/dist/admin/surfaces/webServices/api-keys.d.ts +3 -0
- package/dist/admin/surfaces/webServices/api-keys.d.ts.map +1 -0
- package/dist/admin/surfaces/webServices/api-keys.js +65 -0
- package/dist/admin/surfaces/webServices/api-keys.js.map +1 -0
- package/dist/admin/surfaces/webServices/oauth.d.ts +3 -0
- package/dist/admin/surfaces/webServices/oauth.d.ts.map +1 -0
- package/dist/admin/surfaces/webServices/oauth.js +75 -0
- package/dist/admin/surfaces/webServices/oauth.js.map +1 -0
- package/dist/admin/surfaces/webServices/secret-reveal-modal.d.ts +8 -0
- package/dist/admin/surfaces/webServices/secret-reveal-modal.d.ts.map +1 -0
- package/dist/admin/surfaces/webServices/secret-reveal-modal.js +30 -0
- package/dist/admin/surfaces/webServices/secret-reveal-modal.js.map +1 -0
- package/dist/admin/surfaces/webServices/web-services-data.d.ts +38 -0
- package/dist/admin/surfaces/webServices/web-services-data.d.ts.map +1 -0
- package/dist/admin/surfaces/webServices/web-services-data.js +52 -0
- package/dist/admin/surfaces/webServices/web-services-data.js.map +1 -0
- package/dist/api/admin-features-routes.d.ts +10 -0
- package/dist/api/admin-features-routes.d.ts.map +1 -0
- package/dist/api/admin-features-routes.js +61 -0
- package/dist/api/admin-features-routes.js.map +1 -0
- package/dist/api/graphql/resolvers.d.ts +6 -6
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.js +2 -0
- package/dist/api/index.js.map +1 -1
- package/dist/config/define.d.ts +22 -1
- package/dist/config/define.d.ts.map +1 -1
- package/dist/config/define.js +44 -0
- package/dist/config/define.js.map +1 -1
- package/dist/config/parse.d.ts.map +1 -1
- package/dist/config/parse.js +8 -2
- package/dist/config/parse.js.map +1 -1
- package/dist/config/types.d.ts +60 -1
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/types.js +20 -1
- package/dist/config/types.js.map +1 -1
- package/dist/config/validate.d.ts.map +1 -1
- package/dist/config/validate.js +60 -0
- package/dist/config/validate.js.map +1 -1
- package/dist/db/admin-features-queries.d.ts +29 -0
- package/dist/db/admin-features-queries.d.ts.map +1 -0
- package/dist/db/admin-features-queries.js +46 -0
- package/dist/db/admin-features-queries.js.map +1 -0
- package/dist/db/analytics-queries.d.ts +2 -2
- package/dist/db/audit-queries.d.ts +3 -3
- package/dist/db/category-queries.d.ts +6 -6
- package/dist/db/changeset-audit-queries.d.ts +2 -2
- package/dist/db/changeset-queries.d.ts +8 -8
- package/dist/db/extension-queries.d.ts +17 -17
- package/dist/db/feed-queries.d.ts +6 -6
- package/dist/db/media-queries.d.ts +12 -12
- package/dist/db/site-admin-queries.d.ts +1 -1
- package/dist/db/site-queries.d.ts +3 -3
- package/dist/db/tag-queries.d.ts +4 -4
- package/dist/db/webhook-queries.d.ts +8 -8
- package/dist/db/workflow-queries.d.ts +5 -5
- package/dist/experiments/schema.d.ts +1 -1
- package/dist/host-client/index.d.ts +1 -0
- package/dist/host-client/index.d.ts.map +1 -1
- package/dist/host-client/index.js +4 -0
- package/dist/host-client/index.js.map +1 -1
- package/dist/host-client/json.d.ts +36 -0
- package/dist/host-client/json.d.ts.map +1 -0
- package/dist/host-client/json.js +106 -0
- package/dist/host-client/json.js.map +1 -0
- package/dist/layout/modules-extended.d.ts.map +1 -1
- package/dist/layout/modules-extended.js +9 -8
- package/dist/layout/modules-extended.js.map +1 -1
- package/dist/layout/modules.js +5 -5
- package/dist/layout/modules.js.map +1 -1
- package/dist/schema/base.d.ts +1 -1
- package/dist/scope/breadcrumbs.d.ts.map +1 -1
- package/dist/scope/breadcrumbs.js +4 -1
- package/dist/scope/breadcrumbs.js.map +1 -1
- package/dist/scope/head-foot.d.ts +12 -4
- package/dist/scope/head-foot.d.ts.map +1 -1
- package/dist/scope/head-foot.js +14 -6
- package/dist/scope/head-foot.js.map +1 -1
- package/dist/scope/jsonld.d.ts.map +1 -1
- package/dist/scope/jsonld.js +1 -11
- package/dist/scope/jsonld.js.map +1 -1
- package/dist/scope/kywi-form.d.ts.map +1 -1
- package/dist/scope/kywi-form.js +3 -3
- package/dist/scope/kywi-form.js.map +1 -1
- package/dist/scope/kywi-wizard-form.d.ts.map +1 -1
- package/dist/scope/kywi-wizard-form.js +3 -3
- package/dist/scope/kywi-wizard-form.js.map +1 -1
- package/dist/scope/rendering.d.ts.map +1 -1
- package/dist/scope/rendering.js +7 -6
- package/dist/scope/rendering.js.map +1 -1
- package/dist/util/jsonld.d.ts +13 -0
- package/dist/util/jsonld.d.ts.map +1 -0
- package/dist/util/jsonld.js +15 -0
- package/dist/util/jsonld.js.map +1 -0
- package/dist/util/sanitize.d.ts +6 -0
- package/dist/util/sanitize.d.ts.map +1 -0
- package/dist/util/sanitize.js +156 -0
- package/dist/util/sanitize.js.map +1 -0
- package/package.json +12 -3
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Server-only helpers for the configurable admin app (design
|
|
3
|
+
* `docs/orchestration/plans/admin-app-configurable.md` §1.1, §3).
|
|
4
|
+
*
|
|
5
|
+
* `toAdminRuntimeConfig` is what the generated catch-all page
|
|
6
|
+
* (`app/admin/[[...admin]]/page.tsx`, T14) calls to turn a full, server-side
|
|
7
|
+
* `KywiConfig` (secrets and all — db url, auth secret, SMTP/S3 credentials,
|
|
8
|
+
* content-type hooks/access functions) into the small, JSON-serializable,
|
|
9
|
+
* SECRET-FREE `AdminRuntimeConfig` that is safe to pass as a prop into the
|
|
10
|
+
* client component tree. This is the fix for the current fragile pattern
|
|
11
|
+
* (`AdminShell` takes the full `KywiConfig` as a client prop, verified in
|
|
12
|
+
* `apps/reference/lib/config.ts` + `components/admin-shell-wrapper.tsx`) —
|
|
13
|
+
* the projection below is the *only* shape that may ever cross that boundary.
|
|
14
|
+
*
|
|
15
|
+
* Import via `@kywi-software/core/admin/server` (see `packages/core/package.json`
|
|
16
|
+
* `exports["./admin/server"]`) — a separate entry point from `@kywi-software/core/admin`
|
|
17
|
+
* (the client-component barrel, `admin/index.ts`) so a server module never
|
|
18
|
+
* accidentally pulls in React admin components, and vice versa.
|
|
19
|
+
*
|
|
20
|
+
* ── Security invariant ────────────────────────────────────────────────────────
|
|
21
|
+
* Every field is a CURATED, per-field-vetted copy of a known-safe, display-only
|
|
22
|
+
* scalar/struct. The projection NEVER copies: db url/connection string, auth
|
|
23
|
+
* secret, S3 access/secret keys or endpoint, cache (redis) connection string,
|
|
24
|
+
* SMTP/sendgrid credentials, per-site free-form `settings`, or any server
|
|
25
|
+
* function (content-type/plugin hooks, access-control predicates, field-level
|
|
26
|
+
* ACLs, JSON-LD transforms). Enforced structurally by the copy-only-known-fields
|
|
27
|
+
* shape below and asserted by the deep-scan leak test in
|
|
28
|
+
* `admin/__tests__/server.test.ts` (key scan + value scan + no-functions scan).
|
|
29
|
+
*/
|
|
30
|
+
import type { DeploymentMode, KywiConfig, FieldType, FieldValidation, DbProvider, AuthProvider, CacheProvider } from '../config/types.js';
|
|
31
|
+
import { ADMIN_FEATURES_SURFACE_ID, type ResolvedAdminConfig } from '../config/types.js';
|
|
32
|
+
import type { ImageSizeConfig, MediaConfig } from '../media/types.js';
|
|
33
|
+
/**
|
|
34
|
+
* Client-safe subset of a `FieldDefinition` — the data-only members the admin
|
|
35
|
+
* list/edit forms and the content-type reference read. Recurses `fields` for
|
|
36
|
+
* `group` fields.
|
|
37
|
+
*
|
|
38
|
+
* OMITS `access` (`FieldAccessConfig`): it is FUNCTION-valued (read/write
|
|
39
|
+
* predicates) so it can never serialize, and no admin surface reads it (the
|
|
40
|
+
* server enforces field ACLs regardless — exposing the rule set is both unsafe
|
|
41
|
+
* to serialize and unnecessary). `source` IS included: it is a harmless
|
|
42
|
+
* `'config' | 'admin'` provenance flag the designer UI uses to distinguish
|
|
43
|
+
* config-defined from runtime-added fields. `validation` is declarative
|
|
44
|
+
* (`min`/`max`/length/`pattern`) — no functions, safe to serialize.
|
|
45
|
+
*/
|
|
46
|
+
export interface AdminRuntimeField {
|
|
47
|
+
name: string;
|
|
48
|
+
type: FieldType;
|
|
49
|
+
label: string;
|
|
50
|
+
required?: boolean;
|
|
51
|
+
/** For `select` / `multiSelect`. */
|
|
52
|
+
options?: string[];
|
|
53
|
+
/** For `relationship`. */
|
|
54
|
+
relatedType?: string;
|
|
55
|
+
/** Field's default value (declarative config data; already rendered client-side into forms). */
|
|
56
|
+
defaultValue?: unknown;
|
|
57
|
+
/** Declarative value-level validation (min/max/length/pattern) — no functions. */
|
|
58
|
+
validation?: FieldValidation;
|
|
59
|
+
/** Provenance flag ('config' = kywi.config.ts, 'admin' = runtime designer). */
|
|
60
|
+
source?: 'config' | 'admin';
|
|
61
|
+
/** Sub-fields when `type` is `group`. */
|
|
62
|
+
fields?: AdminRuntimeField[];
|
|
63
|
+
}
|
|
64
|
+
/** Client-safe subset of `ContentTypeConfig` — labels/names/icons + the data-only `fields`. No hooks, no access functions, no field validators-as-functions. */
|
|
65
|
+
export interface AdminRuntimeContentType {
|
|
66
|
+
name: string;
|
|
67
|
+
label: string;
|
|
68
|
+
pluralLabel?: string;
|
|
69
|
+
baseType: KywiConfig['contentTypes'][number]['baseType'];
|
|
70
|
+
icon?: string;
|
|
71
|
+
/** The client-safe projection of this type's fields (see `AdminRuntimeField`). */
|
|
72
|
+
fields?: AdminRuntimeField[];
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Client-safe subset of `SiteConfig` — id/name/domain/locales + the display
|
|
76
|
+
* metadata (`defaultLocale`, `theme`) the settings reference renders. STILL NO
|
|
77
|
+
* `settings` object (free-form, may hold secrets — kept excluded as T2
|
|
78
|
+
* documented) and no pool-sharing wiring. `slug` is deliberately absent: it is
|
|
79
|
+
* not a `SiteConfig` member at all — it is a per-site runtime DB identifier
|
|
80
|
+
* surfaced via `GET /api/v1/sites`, so there is no config-as-code source to
|
|
81
|
+
* project it from.
|
|
82
|
+
*/
|
|
83
|
+
export interface AdminRuntimeSite {
|
|
84
|
+
id: string;
|
|
85
|
+
name: string;
|
|
86
|
+
domain: string;
|
|
87
|
+
locales?: string[];
|
|
88
|
+
/** Default locale (display metadata). */
|
|
89
|
+
defaultLocale: string;
|
|
90
|
+
/** Configured theme name (display metadata). */
|
|
91
|
+
theme: string;
|
|
92
|
+
}
|
|
93
|
+
/** A theme, projected to its display-safe identity: name + region names. Tokens are omitted (no surface reads them; add here if one ever does — they are display data). */
|
|
94
|
+
export interface AdminRuntimeTheme {
|
|
95
|
+
name: string;
|
|
96
|
+
regions: Array<{
|
|
97
|
+
name: string;
|
|
98
|
+
}>;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Display-only overview of the resolved platform configuration for the
|
|
102
|
+
* `settings.site` reference surface. Provider NAMES and non-sensitive display
|
|
103
|
+
* knobs only — NEVER connection strings, keys, or secrets.
|
|
104
|
+
*/
|
|
105
|
+
export interface AdminRuntimeOverview {
|
|
106
|
+
/** DB provider NAME only (e.g. `'postgresql'`). NEVER `db.url`. */
|
|
107
|
+
db: {
|
|
108
|
+
provider: DbProvider;
|
|
109
|
+
};
|
|
110
|
+
/** Auth provider NAMES only (e.g. `['credentials','google']`). NEVER `auth.secret` or client secrets. */
|
|
111
|
+
auth: {
|
|
112
|
+
providers: AuthProvider[];
|
|
113
|
+
};
|
|
114
|
+
/** Media provider + non-sensitive display knobs. NEVER S3 bucket/region/keys/endpoint or `localPath`. */
|
|
115
|
+
media: {
|
|
116
|
+
provider: MediaConfig['provider'];
|
|
117
|
+
maxUploadSizeMb?: number;
|
|
118
|
+
imageSizes?: Record<string, ImageSizeConfig>;
|
|
119
|
+
};
|
|
120
|
+
/** Cache provider NAME + default TTL. NEVER the redis connection string. */
|
|
121
|
+
cache: {
|
|
122
|
+
provider: CacheProvider;
|
|
123
|
+
defaultTtl?: number;
|
|
124
|
+
};
|
|
125
|
+
/** Configured themes (names + region names). */
|
|
126
|
+
themes: AdminRuntimeTheme[];
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* The projection passed from the server-rendered catch-all page into
|
|
130
|
+
* `KywiAdminApp` (T14). Every field here is safe to serialize into the client
|
|
131
|
+
* bundle: no `db`.url, no `auth`.secret, no `email`/SMTP/S3 credentials, no
|
|
132
|
+
* cache connection string, no server functions (hooks, access control,
|
|
133
|
+
* validators). Enforced by `toAdminRuntimeConfig`'s shape (only ever copies
|
|
134
|
+
* known-safe scalar fields) and asserted by the deep-scan test in
|
|
135
|
+
* `admin/__tests__/server.test.ts`.
|
|
136
|
+
*/
|
|
137
|
+
export interface AdminRuntimeConfig {
|
|
138
|
+
mode: DeploymentMode;
|
|
139
|
+
admin: ResolvedAdminConfig;
|
|
140
|
+
contentTypes: AdminRuntimeContentType[];
|
|
141
|
+
sites: AdminRuntimeSite[];
|
|
142
|
+
/** Display-only overview of platform config (provider names, no secrets). */
|
|
143
|
+
overview: AdminRuntimeOverview;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Build the secret-free `AdminRuntimeConfig` from a full `KywiConfig`. Calls
|
|
147
|
+
* `resolveAdminConfig` itself (rather than trusting `config.admin` to already
|
|
148
|
+
* be resolved) so this stays correct even if a caller hand-builds a
|
|
149
|
+
* `KywiConfig` object literal instead of going through `defineKywiConfig`.
|
|
150
|
+
*/
|
|
151
|
+
export declare function toAdminRuntimeConfig(config: KywiConfig): AdminRuntimeConfig;
|
|
152
|
+
export { ADMIN_FEATURES_SURFACE_ID };
|
|
153
|
+
export { resolveSurface, type SurfaceMatch } from './surface-matcher.js';
|
|
154
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/admin/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { ADMIN_FEATURES_SURFACE_ID } from '../config/types.js';
|
|
2
|
+
import { resolveAdminConfig } from '../config/define.js';
|
|
3
|
+
/** Project one `FieldDefinition` to its client-safe subset, recursing group sub-fields. */
|
|
4
|
+
function toAdminRuntimeField(f) {
|
|
5
|
+
const rf = { name: f.name, type: f.type, label: f.label };
|
|
6
|
+
if (f.required !== undefined)
|
|
7
|
+
rf.required = f.required;
|
|
8
|
+
if (f.options !== undefined)
|
|
9
|
+
rf.options = [...f.options];
|
|
10
|
+
if (f.relatedType !== undefined)
|
|
11
|
+
rf.relatedType = f.relatedType;
|
|
12
|
+
if (f.defaultValue !== undefined)
|
|
13
|
+
rf.defaultValue = f.defaultValue;
|
|
14
|
+
if (f.validation !== undefined) {
|
|
15
|
+
// Copy ONLY the known declarative members — never spread an unknown-shaped
|
|
16
|
+
// object into the client projection.
|
|
17
|
+
const v = {};
|
|
18
|
+
if (f.validation.min !== undefined)
|
|
19
|
+
v.min = f.validation.min;
|
|
20
|
+
if (f.validation.max !== undefined)
|
|
21
|
+
v.max = f.validation.max;
|
|
22
|
+
if (f.validation.minLength !== undefined)
|
|
23
|
+
v.minLength = f.validation.minLength;
|
|
24
|
+
if (f.validation.maxLength !== undefined)
|
|
25
|
+
v.maxLength = f.validation.maxLength;
|
|
26
|
+
if (f.validation.pattern !== undefined)
|
|
27
|
+
v.pattern = f.validation.pattern;
|
|
28
|
+
rf.validation = v;
|
|
29
|
+
}
|
|
30
|
+
if (f.source !== undefined)
|
|
31
|
+
rf.source = f.source;
|
|
32
|
+
if (f.fields !== undefined)
|
|
33
|
+
rf.fields = f.fields.map(toAdminRuntimeField);
|
|
34
|
+
// NOTE: `access` (FieldAccessConfig) is intentionally NOT copied — it is
|
|
35
|
+
// function-valued and the server enforces field ACLs anyway.
|
|
36
|
+
return rf;
|
|
37
|
+
}
|
|
38
|
+
/** Project the media config to its display-safe subset — provider + size knobs only, never S3 credentials/bucket/endpoint or localPath. */
|
|
39
|
+
function toAdminRuntimeMedia(media) {
|
|
40
|
+
const out = { provider: media.provider };
|
|
41
|
+
if (media.maxUploadSizeMb !== undefined)
|
|
42
|
+
out.maxUploadSizeMb = media.maxUploadSizeMb;
|
|
43
|
+
if (media.imageSizes !== undefined) {
|
|
44
|
+
const sizes = {};
|
|
45
|
+
for (const [key, cfg] of Object.entries(media.imageSizes)) {
|
|
46
|
+
const size = { width: cfg.width };
|
|
47
|
+
if (cfg.height !== undefined)
|
|
48
|
+
size.height = cfg.height;
|
|
49
|
+
if (cfg.fit !== undefined)
|
|
50
|
+
size.fit = cfg.fit;
|
|
51
|
+
sizes[key] = size;
|
|
52
|
+
}
|
|
53
|
+
out.imageSizes = sizes;
|
|
54
|
+
}
|
|
55
|
+
return out;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Build the secret-free `AdminRuntimeConfig` from a full `KywiConfig`. Calls
|
|
59
|
+
* `resolveAdminConfig` itself (rather than trusting `config.admin` to already
|
|
60
|
+
* be resolved) so this stays correct even if a caller hand-builds a
|
|
61
|
+
* `KywiConfig` object literal instead of going through `defineKywiConfig`.
|
|
62
|
+
*/
|
|
63
|
+
export function toAdminRuntimeConfig(config) {
|
|
64
|
+
const cache = { provider: config.cache.provider };
|
|
65
|
+
if (config.cache.defaultTtl !== undefined)
|
|
66
|
+
cache.defaultTtl = config.cache.defaultTtl;
|
|
67
|
+
return {
|
|
68
|
+
mode: config.mode,
|
|
69
|
+
admin: resolveAdminConfig(config.admin),
|
|
70
|
+
contentTypes: config.contentTypes.map(ct => {
|
|
71
|
+
const runtime = {
|
|
72
|
+
name: ct.name,
|
|
73
|
+
label: ct.label,
|
|
74
|
+
baseType: ct.baseType,
|
|
75
|
+
};
|
|
76
|
+
if (ct.pluralLabel !== undefined)
|
|
77
|
+
runtime.pluralLabel = ct.pluralLabel;
|
|
78
|
+
if (ct.icon !== undefined)
|
|
79
|
+
runtime.icon = ct.icon;
|
|
80
|
+
runtime.fields = ct.fields.map(toAdminRuntimeField);
|
|
81
|
+
return runtime;
|
|
82
|
+
}),
|
|
83
|
+
sites: config.sites.map(s => {
|
|
84
|
+
const runtime = {
|
|
85
|
+
id: s.id,
|
|
86
|
+
name: s.name,
|
|
87
|
+
domain: s.domain,
|
|
88
|
+
defaultLocale: s.defaultLocale,
|
|
89
|
+
theme: s.theme,
|
|
90
|
+
};
|
|
91
|
+
if (s.locales !== undefined)
|
|
92
|
+
runtime.locales = s.locales;
|
|
93
|
+
return runtime;
|
|
94
|
+
}),
|
|
95
|
+
overview: {
|
|
96
|
+
db: { provider: config.db.provider },
|
|
97
|
+
auth: { providers: [...config.auth.providers] },
|
|
98
|
+
media: toAdminRuntimeMedia(config.media),
|
|
99
|
+
cache,
|
|
100
|
+
themes: config.themes.map(t => ({
|
|
101
|
+
name: t.name,
|
|
102
|
+
regions: t.regions.map(r => ({ name: r.name })),
|
|
103
|
+
})),
|
|
104
|
+
},
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
// Re-exported for T16: the stable id of the superAdmin "Admin Features"
|
|
108
|
+
// surface that must stay reachable even when the `settings` area is
|
|
109
|
+
// disabled — see the full contract documented on the constant in
|
|
110
|
+
// `config/types.ts`.
|
|
111
|
+
export { ADMIN_FEATURES_SURFACE_ID };
|
|
112
|
+
// Re-exported for T18: the generated `/admin` catch-all page is a server
|
|
113
|
+
// component that pre-checks the matched surface against the CONFIG CEILING and
|
|
114
|
+
// calls Next's `notFound()` for a real HTTP 404 on unknown/config-disabled
|
|
115
|
+
// paths (plan §1.1, §49). It surfaces here — rather than the host importing the
|
|
116
|
+
// client-heavy `@kywi-software/core/admin` index — so the pure, `next`-free
|
|
117
|
+
// matcher can be used from a server component without pulling any client
|
|
118
|
+
// component into the server graph. `runtime.admin` (a `ResolvedAdminConfig`) is
|
|
119
|
+
// a valid `AdminConfigCeiling`.
|
|
120
|
+
export { resolveSurface } from './surface-matcher.js';
|
|
121
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/admin/server.ts"],"names":[],"mappings":"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"}
|
package/dist/admin/shell.d.ts
CHANGED
|
@@ -1,10 +1,36 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import type { KywiConfig } from '../config/types.js';
|
|
3
|
+
import type { KywiRole } from '../auth/roles.js';
|
|
4
|
+
import { type AdminNavItem } from './nav.js';
|
|
5
|
+
import type { AdminFeatureFlags } from './registry.js';
|
|
3
6
|
interface AdminShellProps {
|
|
7
|
+
/**
|
|
8
|
+
* Config source for nav derivation. `buildAdminNav` only ever reads `.admin`
|
|
9
|
+
* (the config ceiling), so a caller that has just the secret-free projection
|
|
10
|
+
* may pass a minimal `{ admin }` shim instead of a full `KywiConfig` — that is
|
|
11
|
+
* exactly what `AdminChrome` does with `runtime.admin` so the full config never
|
|
12
|
+
* crosses into the client. The reference `AdminShellWrapper` still passes its
|
|
13
|
+
* full `KywiConfig` unchanged (back-compat).
|
|
14
|
+
*/
|
|
4
15
|
config: KywiConfig;
|
|
16
|
+
/**
|
|
17
|
+
* Signed-in user's role — when provided, filters nav to the surfaces the user
|
|
18
|
+
* can reach. Optional/additive: omitting it preserves the previous
|
|
19
|
+
* config-ceiling-only nav (the reference wrapper passes no role).
|
|
20
|
+
*/
|
|
21
|
+
role?: KywiRole | undefined;
|
|
22
|
+
/** Runtime feature flags (T16). Omitted ⇒ no flag filtering. */
|
|
23
|
+
flags?: AdminFeatureFlags | undefined;
|
|
24
|
+
/**
|
|
25
|
+
* Plugin-contributed nav items (T17, from `GET /plugins/nav`). Rendered as
|
|
26
|
+
* an additional "Plugins" section beneath the core nav, reusing `NavItem` so
|
|
27
|
+
* markup/classes match the core sections exactly. Omitted/empty ⇒ no
|
|
28
|
+
* section rendered (back-compat with callers that don't fetch plugin nav).
|
|
29
|
+
*/
|
|
30
|
+
pluginNav?: AdminNavItem[] | undefined;
|
|
5
31
|
currentPath: string;
|
|
6
32
|
children: React.ReactNode;
|
|
7
33
|
}
|
|
8
|
-
export declare function AdminShell({ config, currentPath, children }: AdminShellProps): import("react/jsx-runtime").JSX.Element;
|
|
34
|
+
export declare function AdminShell({ config, role, flags, pluginNav, currentPath, children }: AdminShellProps): import("react/jsx-runtime").JSX.Element;
|
|
9
35
|
export {};
|
|
10
36
|
//# sourceMappingURL=shell.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shell.d.ts","sourceRoot":"","sources":["../../src/admin/shell.tsx"],"names":[],"mappings":"AAEA,OAAO,KAA8B,MAAM,OAAO,CAAA;AAClD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;
|
|
1
|
+
{"version":3,"file":"shell.d.ts","sourceRoot":"","sources":["../../src/admin/shell.tsx"],"names":[],"mappings":"AAEA,OAAO,KAA8B,MAAM,OAAO,CAAA;AAClD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAChD,OAAO,EAAiB,KAAK,YAAY,EAAE,MAAM,UAAU,CAAA;AAC3D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AAGtD,UAAU,eAAe;IACvB;;;;;;;OAOG;IACH,MAAM,EAAE,UAAU,CAAA;IAClB;;;;OAIG;IACH,IAAI,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAA;IAC3B,gEAAgE;IAChE,KAAK,CAAC,EAAE,iBAAiB,GAAG,SAAS,CAAA;IACrC;;;;;OAKG;IACH,SAAS,CAAC,EAAE,YAAY,EAAE,GAAG,SAAS,CAAA;IACtC,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAC1B;AA+GD,wBAAgB,UAAU,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,eAAe,2CA8GpG"}
|
package/dist/admin/shell.js
CHANGED
|
@@ -1,18 +1,83 @@
|
|
|
1
1
|
'use client';
|
|
2
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
3
|
import { useState, useEffect } from 'react';
|
|
4
4
|
import { buildAdminNav } from './nav.js';
|
|
5
|
-
|
|
5
|
+
import { KywiLogo, KywiLogoDark } from './kywi-logo.js';
|
|
6
|
+
/** localStorage key persisting per-group expand/collapse overrides. */
|
|
7
|
+
const NAV_COLLAPSE_KEY = 'kywi-admin-nav-groups';
|
|
8
|
+
/**
|
|
9
|
+
* Does `currentPath` fall inside this group — either under the group's own href
|
|
10
|
+
* or under any of its child hrefs (some children, e.g. Settings → Content Types,
|
|
11
|
+
* live outside the group's href prefix)? Drives the active-group-expanded default.
|
|
12
|
+
*/
|
|
13
|
+
function isGroupActive(item, currentPath) {
|
|
14
|
+
const within = (href) => currentPath === href || currentPath.startsWith(href + '/');
|
|
15
|
+
if (within(item.href))
|
|
16
|
+
return true;
|
|
17
|
+
return (item.children ?? []).some(c => within(c.href));
|
|
18
|
+
}
|
|
19
|
+
/** Down-chevron disclosure glyph; rotates via CSS from the group's data-expanded. */
|
|
20
|
+
function NavChevron() {
|
|
21
|
+
return (_jsx("svg", { className: "kywi-nav-chevron", width: "14", height: "14", viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", strokeWidth: "1.7", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", focusable: "false", children: _jsx("path", { d: "M4 6l4 4 4-4" }) }));
|
|
22
|
+
}
|
|
23
|
+
function NavItem({ item, currentPath, depth = 0, expanded, onToggle, }) {
|
|
6
24
|
const isActive = currentPath === item.href || currentPath.startsWith(item.href + '/');
|
|
7
|
-
|
|
25
|
+
const hasChildren = Array.isArray(item.children) && item.children.length > 0;
|
|
26
|
+
// Only top-level groups (depth 0) with children AND a toggle handler collapse.
|
|
27
|
+
const collapsible = depth === 0 && hasChildren && typeof onToggle === 'function';
|
|
28
|
+
const isExpanded = collapsible ? expanded !== false : true;
|
|
29
|
+
const childrenId = collapsible
|
|
30
|
+
? `kywi-nav-group-${item.href.replace(/[^a-z0-9]+/gi, '-').replace(/^-+|-+$/g, '')}`
|
|
31
|
+
: undefined;
|
|
32
|
+
const link = (_jsx("a", { href: item.href, className: `kywi-nav-link ${isActive ? 'kywi-nav-active' : ''}`, style: { paddingLeft: `${(depth + 1) * 16}px` }, children: item.label }));
|
|
33
|
+
return (_jsxs("li", { className: `kywi-nav-item${collapsible ? ' kywi-nav-group' : ''}`, "data-active": isActive, ...(collapsible ? { 'data-expanded': isExpanded } : {}), children: [collapsible ? (_jsxs("div", { className: "kywi-nav-group-row", children: [link, _jsx("button", { type: "button", className: "kywi-nav-toggle", "aria-expanded": isExpanded, "aria-controls": childrenId, "aria-label": `${isExpanded ? 'Collapse' : 'Expand'} ${item.label}`, onClick: () => onToggle(item), children: _jsx(NavChevron, {}) })] })) : (link), hasChildren && (_jsx("div", { className: "kywi-nav-children-wrap", children: _jsx("ul", { id: childrenId, className: "kywi-nav-children", ...(collapsible ? { 'aria-hidden': !isExpanded } : {}), children: item.children.map(child => (_jsx(NavItem, { item: child, currentPath: currentPath, depth: depth + 1 }, child.href))) }) }))] }));
|
|
8
34
|
}
|
|
9
|
-
export function AdminShell({ config, currentPath, children }) {
|
|
10
|
-
|
|
35
|
+
export function AdminShell({ config, role, flags, pluginNav, currentPath, children }) {
|
|
36
|
+
// Role/flags (when provided) narrow the derived tree beyond the config ceiling.
|
|
37
|
+
const opts = {};
|
|
38
|
+
if (role !== undefined)
|
|
39
|
+
opts.role = role;
|
|
40
|
+
if (flags !== undefined)
|
|
41
|
+
opts.flags = flags;
|
|
42
|
+
const nav = buildAdminNav(config, opts);
|
|
11
43
|
// Below the responsive breakpoint the sidebar is an off-canvas drawer toggled
|
|
12
44
|
// by the topbar hamburger; on desktop these controls are hidden by CSS and the
|
|
13
45
|
// sidebar is always visible. Close the drawer whenever the route changes.
|
|
14
46
|
const [sidebarOpen, setSidebarOpen] = useState(false);
|
|
15
47
|
useEffect(() => { setSidebarOpen(false); }, [currentPath]);
|
|
16
|
-
|
|
48
|
+
// Per-group expand/collapse overrides (href → user's explicit choice). Empty
|
|
49
|
+
// until hydrated from localStorage so the server render and the first client
|
|
50
|
+
// render agree (both fall back to the active-group-expanded default); the
|
|
51
|
+
// effect then applies any persisted choices. A group with no override follows
|
|
52
|
+
// the default, so navigating auto-expands the newly-active section.
|
|
53
|
+
const [overrides, setOverrides] = useState({});
|
|
54
|
+
useEffect(() => {
|
|
55
|
+
try {
|
|
56
|
+
const raw = window.localStorage.getItem(NAV_COLLAPSE_KEY);
|
|
57
|
+
if (raw) {
|
|
58
|
+
const parsed = JSON.parse(raw);
|
|
59
|
+
if (parsed && typeof parsed === 'object')
|
|
60
|
+
setOverrides(parsed);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
// Best-effort: a storage hiccup just leaves the active-default layout.
|
|
65
|
+
}
|
|
66
|
+
}, []);
|
|
67
|
+
const isExpanded = (item) => item.href in overrides ? overrides[item.href] : isGroupActive(item, currentPath);
|
|
68
|
+
const toggleGroup = (item) => {
|
|
69
|
+
setOverrides(prev => {
|
|
70
|
+
const current = item.href in prev ? prev[item.href] : isGroupActive(item, currentPath);
|
|
71
|
+
const next = { ...prev, [item.href]: !current };
|
|
72
|
+
try {
|
|
73
|
+
window.localStorage.setItem(NAV_COLLAPSE_KEY, JSON.stringify(next));
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
// Non-fatal: the toggle still takes effect for this session.
|
|
77
|
+
}
|
|
78
|
+
return next;
|
|
79
|
+
});
|
|
80
|
+
};
|
|
81
|
+
return (_jsxs("div", { className: "kywi-admin-shell", "data-sidebar-open": sidebarOpen ? 'true' : 'false', children: [_jsx("button", { type: "button", className: "kywi-admin-scrim", "aria-label": "Close navigation", tabIndex: sidebarOpen ? 0 : -1, onClick: () => setSidebarOpen(false) }), _jsx("aside", { id: "kywi-admin-sidebar", className: "kywi-admin-sidebar", children: _jsxs("div", { className: "kywi-admin-sidebar-sticky", children: [_jsx("div", { className: "kywi-admin-logo", children: _jsx("a", { href: "/admin/dashboard", className: "kywi-admin-logo-link", "aria-label": "Kywi \u2014 go to dashboard", children: _jsx(KywiLogo, { className: "kywi-admin-logo-mark" }) }) }), _jsxs("nav", { className: "kywi-admin-nav", children: [_jsx("ul", { children: nav.map(item => (_jsx(NavItem, { item: item, currentPath: currentPath, expanded: isExpanded(item), onToggle: toggleGroup }, item.href))) }), pluginNav && pluginNav.length > 0 && (_jsxs(_Fragment, { children: [_jsx("div", { className: "kywi-admin-nav-section-label", children: "Plugins" }), _jsx("ul", { children: pluginNav.map(item => _jsx(NavItem, { item: item, currentPath: currentPath }, item.href)) })] }))] })] }) }), _jsxs("main", { className: "kywi-admin-main", children: [_jsxs("div", { className: "kywi-admin-mobile-bar", children: [_jsxs("button", { type: "button", className: "kywi-admin-hamburger", "aria-label": "Open navigation", "aria-controls": "kywi-admin-sidebar", "aria-expanded": sidebarOpen, onClick: () => setSidebarOpen(open => !open), children: [_jsx("span", { className: "kywi-admin-hamburger-bar" }), _jsx("span", { className: "kywi-admin-hamburger-bar" }), _jsx("span", { className: "kywi-admin-hamburger-bar" })] }), _jsx("a", { href: "/admin/dashboard", className: "kywi-admin-mobile-brand", "aria-label": "Kywi \u2014 go to dashboard", children: _jsx(KywiLogoDark, { className: "kywi-admin-mobile-logo" }) })] }), children] })] }));
|
|
17
82
|
}
|
|
18
83
|
//# sourceMappingURL=shell.js.map
|
package/dist/admin/shell.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shell.js","sourceRoot":"","sources":["../../src/admin/shell.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAc,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"shell.js","sourceRoot":"","sources":["../../src/admin/shell.tsx"],"names":[],"mappings":"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"}
|
|
@@ -287,29 +287,32 @@
|
|
|
287
287
|
}
|
|
288
288
|
.kywi-admin-sidebar-sticky::-webkit-scrollbar-thumb { background: rgba(255, 255, 255, 0.16); background-clip: content-box; }
|
|
289
289
|
|
|
290
|
+
/* ---- Brand mark ------------------------------------------------------- */
|
|
291
|
+
/* The wordmark sits directly on the dark sidebar (no plate). Its type inherits
|
|
292
|
+
`currentColor`, which we drive to the muted nav-link colour so the wordmark
|
|
293
|
+
reads uniformly muted — exactly like the nav text beside it — while the kiwi
|
|
294
|
+
icon keeps its lime/cream accent as the single pop of colour. */
|
|
290
295
|
.kywi-admin-logo {
|
|
291
296
|
padding: var(--kywi-space-2) var(--kywi-space-5) var(--kywi-space-5);
|
|
292
297
|
margin-bottom: var(--kywi-space-2);
|
|
293
298
|
}
|
|
294
|
-
.kywi-admin-logo
|
|
299
|
+
.kywi-admin-sidebar .kywi-admin-logo-link {
|
|
295
300
|
display: inline-flex;
|
|
296
301
|
align-items: center;
|
|
297
|
-
|
|
298
|
-
color: #fff;
|
|
299
|
-
font-size: var(--kywi-text-md);
|
|
300
|
-
font-weight: var(--kywi-weight-bold);
|
|
301
|
-
letter-spacing: var(--kywi-tracking-tight);
|
|
302
|
+
color: var(--kywi-sidebar-fg-muted);
|
|
302
303
|
text-decoration: none;
|
|
304
|
+
transition: color var(--kywi-dur) var(--kywi-ease), opacity var(--kywi-dur) var(--kywi-ease);
|
|
303
305
|
}
|
|
304
|
-
.kywi-admin-logo
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
height: 10px;
|
|
308
|
-
border-radius: var(--kywi-radius-pill);
|
|
309
|
-
background: var(--kywi-sidebar-accent);
|
|
310
|
-
box-shadow: 0 0 0 3px rgba(87, 201, 156, 0.22);
|
|
311
|
-
flex-shrink: 0;
|
|
306
|
+
.kywi-admin-sidebar .kywi-admin-logo-link:hover {
|
|
307
|
+
text-decoration: none;
|
|
308
|
+
color: var(--kywi-sidebar-fg);
|
|
312
309
|
}
|
|
310
|
+
.kywi-admin-logo-mark {
|
|
311
|
+
display: block;
|
|
312
|
+
width: 156px;
|
|
313
|
+
aspect-ratio: 1638 / 382;
|
|
314
|
+
}
|
|
315
|
+
.kywi-admin-logo-mark > svg { display: block; width: 100%; height: 100%; }
|
|
313
316
|
|
|
314
317
|
.kywi-admin-nav ul { list-style: none; margin: 0; padding: 0; }
|
|
315
318
|
.kywi-admin-nav > ul { padding: 0 var(--kywi-space-3); }
|
|
@@ -349,10 +352,74 @@
|
|
|
349
352
|
border-radius: var(--kywi-radius-pill);
|
|
350
353
|
background: var(--kywi-sidebar-accent);
|
|
351
354
|
}
|
|
355
|
+
.kywi-admin-nav-section-label {
|
|
356
|
+
padding: var(--kywi-space-3) var(--kywi-space-3) 4px;
|
|
357
|
+
font-size: var(--kywi-text-xs);
|
|
358
|
+
font-weight: var(--kywi-weight-semibold);
|
|
359
|
+
letter-spacing: var(--kywi-tracking-tight);
|
|
360
|
+
text-transform: uppercase;
|
|
361
|
+
color: var(--kywi-sidebar-fg-muted);
|
|
362
|
+
opacity: 0.7;
|
|
363
|
+
}
|
|
352
364
|
.kywi-admin-sidebar .kywi-nav-children { margin: 1px 0 var(--kywi-space-1); }
|
|
353
365
|
.kywi-admin-sidebar .kywi-nav-children .kywi-nav-link { font-size: var(--kywi-text-xs); padding-top: 5px; padding-bottom: 5px; }
|
|
354
366
|
.kywi-admin-sidebar :focus-visible { box-shadow: 0 0 0 2px var(--kywi-sidebar-accent); }
|
|
355
367
|
|
|
368
|
+
/* ---- Collapsible groups ----------------------------------------------- */
|
|
369
|
+
/* A group row = the label link (navigates to group.href) + a chevron button
|
|
370
|
+
that toggles its children. Keeping the label a real link preserves keyboard
|
|
371
|
+
access to the group landing page; the separate button owns the disclosure. */
|
|
372
|
+
.kywi-admin-sidebar .kywi-nav-group-row { display: flex; align-items: center; gap: 2px; }
|
|
373
|
+
.kywi-admin-sidebar .kywi-nav-group-row .kywi-nav-link { flex: 1 1 auto; min-width: 0; }
|
|
374
|
+
.kywi-admin-sidebar .kywi-nav-toggle {
|
|
375
|
+
display: inline-flex;
|
|
376
|
+
align-items: center;
|
|
377
|
+
justify-content: center;
|
|
378
|
+
flex: 0 0 auto;
|
|
379
|
+
width: 28px;
|
|
380
|
+
height: 28px;
|
|
381
|
+
padding: 0;
|
|
382
|
+
margin: 0;
|
|
383
|
+
background: transparent;
|
|
384
|
+
border: 0;
|
|
385
|
+
border-radius: var(--kywi-radius);
|
|
386
|
+
color: var(--kywi-sidebar-fg-muted);
|
|
387
|
+
cursor: pointer;
|
|
388
|
+
transition: background var(--kywi-dur) var(--kywi-ease), color var(--kywi-dur) var(--kywi-ease);
|
|
389
|
+
}
|
|
390
|
+
.kywi-admin-sidebar .kywi-nav-toggle:hover {
|
|
391
|
+
background: var(--kywi-sidebar-hover-bg);
|
|
392
|
+
color: var(--kywi-sidebar-fg);
|
|
393
|
+
}
|
|
394
|
+
.kywi-admin-sidebar .kywi-nav-chevron {
|
|
395
|
+
display: block;
|
|
396
|
+
transition: transform var(--kywi-dur) var(--kywi-ease);
|
|
397
|
+
}
|
|
398
|
+
/* Chevron points down when open, rotates to point right when collapsed. */
|
|
399
|
+
.kywi-admin-sidebar .kywi-nav-group[data-expanded="false"] .kywi-nav-chevron { transform: rotate(-90deg); }
|
|
400
|
+
|
|
401
|
+
/* Children collapse via an animatable grid row (0fr → 1fr) so variable-height
|
|
402
|
+
groups slide cleanly; `overflow:hidden` on the list clips them at 0 height.
|
|
403
|
+
The section-8 prefers-reduced-motion block already zeroes these transitions. */
|
|
404
|
+
.kywi-admin-sidebar .kywi-nav-children-wrap {
|
|
405
|
+
display: grid;
|
|
406
|
+
grid-template-rows: 1fr;
|
|
407
|
+
transition: grid-template-rows var(--kywi-dur-slow) var(--kywi-ease);
|
|
408
|
+
}
|
|
409
|
+
.kywi-admin-sidebar .kywi-nav-group[data-expanded="false"] .kywi-nav-children-wrap { grid-template-rows: 0fr; }
|
|
410
|
+
.kywi-admin-sidebar .kywi-nav-children-wrap > .kywi-nav-children { overflow: hidden; min-height: 0; }
|
|
411
|
+
/* When collapsed, drop the children from the tab order + a11y tree (kept in the
|
|
412
|
+
DOM and query-able). Delay hiding until the collapse animation finishes;
|
|
413
|
+
reveal immediately on expand. */
|
|
414
|
+
.kywi-admin-sidebar .kywi-nav-group[data-expanded="false"] .kywi-nav-children {
|
|
415
|
+
visibility: hidden;
|
|
416
|
+
transition: visibility 0s linear var(--kywi-dur-slow);
|
|
417
|
+
}
|
|
418
|
+
.kywi-admin-sidebar .kywi-nav-group[data-expanded="true"] .kywi-nav-children {
|
|
419
|
+
visibility: visible;
|
|
420
|
+
transition: visibility 0s;
|
|
421
|
+
}
|
|
422
|
+
|
|
356
423
|
/* ---- Main + topbar ---------------------------------------------------- */
|
|
357
424
|
.kywi-admin-main {
|
|
358
425
|
flex: 1;
|
|
@@ -361,6 +428,21 @@
|
|
|
361
428
|
background: var(--kywi-bg);
|
|
362
429
|
}
|
|
363
430
|
|
|
431
|
+
/* T14: core 404 / 403 surface fallbacks (KywiAdminApp SurfaceNotFound/Forbidden). */
|
|
432
|
+
.kywi-admin-surface-message {
|
|
433
|
+
max-width: 32rem;
|
|
434
|
+
margin: var(--kywi-space-10) auto;
|
|
435
|
+
text-align: center;
|
|
436
|
+
color: var(--kywi-text);
|
|
437
|
+
}
|
|
438
|
+
.kywi-admin-surface-message h1 {
|
|
439
|
+
margin-bottom: var(--kywi-space-3);
|
|
440
|
+
}
|
|
441
|
+
.kywi-admin-surface-message p {
|
|
442
|
+
margin-bottom: var(--kywi-space-3);
|
|
443
|
+
color: var(--kywi-text-muted, var(--kywi-text));
|
|
444
|
+
}
|
|
445
|
+
|
|
364
446
|
.kywi-admin-topbar {
|
|
365
447
|
display: flex;
|
|
366
448
|
justify-content: flex-end;
|
|
@@ -443,13 +525,15 @@
|
|
|
443
525
|
justify-content: center;
|
|
444
526
|
gap: var(--kywi-space-2);
|
|
445
527
|
}
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
528
|
+
/* The login card is the hero of the sign-in screen, on a light surface — the
|
|
529
|
+
dark-inked wordmark reads as-is, sized a touch larger than the sidebar. */
|
|
530
|
+
.kywi-admin-shell .kywi-admin-login-logo {
|
|
531
|
+
display: block;
|
|
532
|
+
width: 200px;
|
|
533
|
+
max-width: 72%;
|
|
534
|
+
aspect-ratio: 1638 / 382;
|
|
452
535
|
}
|
|
536
|
+
.kywi-admin-shell .kywi-admin-login-logo > svg { display: block; width: 100%; height: 100%; }
|
|
453
537
|
.kywi-admin-shell .kywi-admin-login-subtitle {
|
|
454
538
|
margin: calc(var(--kywi-space-2) * -1) 0 var(--kywi-space-2);
|
|
455
539
|
text-align: center;
|
|
@@ -2614,12 +2698,18 @@
|
|
|
2614
2698
|
background: var(--kywi-text);
|
|
2615
2699
|
border-radius: 2px;
|
|
2616
2700
|
}
|
|
2701
|
+
/* On the light mobile bar the wordmark reads directly — no chip needed. */
|
|
2617
2702
|
.kywi-admin-shell .kywi-admin-mobile-brand {
|
|
2618
|
-
|
|
2619
|
-
|
|
2620
|
-
letter-spacing: var(--kywi-tracking-tight);
|
|
2703
|
+
display: inline-flex;
|
|
2704
|
+
align-items: center;
|
|
2621
2705
|
text-decoration: none;
|
|
2622
2706
|
}
|
|
2707
|
+
.kywi-admin-shell .kywi-admin-mobile-logo {
|
|
2708
|
+
display: block;
|
|
2709
|
+
width: 128px;
|
|
2710
|
+
aspect-ratio: 1638 / 382;
|
|
2711
|
+
}
|
|
2712
|
+
.kywi-admin-shell .kywi-admin-mobile-logo > svg { display: block; width: 100%; height: 100%; }
|
|
2623
2713
|
|
|
2624
2714
|
/* Full-width content column with tighter gutters. */
|
|
2625
2715
|
.kywi-admin-shell .kywi-admin-main {
|