@kywi-software/core 0.2.0 → 0.3.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.
- package/README.md +57 -2
- package/dist/admin/app.d.ts +10 -1
- package/dist/admin/app.d.ts.map +1 -1
- package/dist/admin/app.js +2 -2
- package/dist/admin/app.js.map +1 -1
- package/dist/admin/approval-queue.d.ts +3 -1
- package/dist/admin/approval-queue.d.ts.map +1 -1
- package/dist/admin/approval-queue.js +2 -2
- package/dist/admin/approval-queue.js.map +1 -1
- package/dist/admin/audience-list.d.ts.map +1 -1
- package/dist/admin/audience-list.js +9 -1
- package/dist/admin/audience-list.js.map +1 -1
- package/dist/admin/chrome.d.ts +7 -1
- package/dist/admin/chrome.d.ts.map +1 -1
- package/dist/admin/chrome.js +2 -1
- package/dist/admin/chrome.js.map +1 -1
- package/dist/admin/content-editor-api.d.ts +27 -1
- package/dist/admin/content-editor-api.d.ts.map +1 -1
- package/dist/admin/content-editor-api.js +60 -2
- package/dist/admin/content-editor-api.js.map +1 -1
- package/dist/admin/content-form.d.ts +62 -6
- package/dist/admin/content-form.d.ts.map +1 -1
- package/dist/admin/content-form.js +118 -13
- package/dist/admin/content-form.js.map +1 -1
- package/dist/admin/content-permissions-tab.d.ts +13 -0
- package/dist/admin/content-permissions-tab.d.ts.map +1 -0
- package/dist/admin/content-permissions-tab.js +90 -0
- package/dist/admin/content-permissions-tab.js.map +1 -0
- package/dist/admin/context.d.ts +8 -0
- package/dist/admin/context.d.ts.map +1 -1
- package/dist/admin/context.js.map +1 -1
- package/dist/admin/feed-builder.d.ts.map +1 -1
- package/dist/admin/feed-builder.js +20 -1
- package/dist/admin/feed-builder.js.map +1 -1
- package/dist/admin/field-components.d.ts.map +1 -1
- package/dist/admin/field-components.js +26 -1
- package/dist/admin/field-components.js.map +1 -1
- package/dist/admin/form-builder.js +6 -1
- package/dist/admin/form-builder.js.map +1 -1
- package/dist/admin/form-helpers.d.ts.map +1 -1
- package/dist/admin/form-helpers.js +2 -0
- package/dist/admin/form-helpers.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/layout-editor/component-actions.d.ts +18 -0
- package/dist/admin/layout-editor/component-actions.d.ts.map +1 -1
- package/dist/admin/layout-editor/component-actions.js +19 -0
- package/dist/admin/layout-editor/component-actions.js.map +1 -1
- package/dist/admin/layout-editor/component-picker-field.d.ts +20 -0
- package/dist/admin/layout-editor/component-picker-field.d.ts.map +1 -0
- package/dist/admin/layout-editor/component-picker-field.js +16 -0
- package/dist/admin/layout-editor/component-picker-field.js.map +1 -0
- package/dist/admin/layout-editor/drag-utils.d.ts +48 -0
- package/dist/admin/layout-editor/drag-utils.d.ts.map +1 -1
- package/dist/admin/layout-editor/drag-utils.js +43 -0
- package/dist/admin/layout-editor/drag-utils.js.map +1 -1
- package/dist/admin/layout-editor/editor-canvas.d.ts +9 -1
- package/dist/admin/layout-editor/editor-canvas.d.ts.map +1 -1
- package/dist/admin/layout-editor/editor-canvas.js +41 -15
- package/dist/admin/layout-editor/editor-canvas.js.map +1 -1
- package/dist/admin/layout-editor/editor-state.d.ts +9 -1
- package/dist/admin/layout-editor/editor-state.d.ts.map +1 -1
- package/dist/admin/layout-editor/editor-state.js +34 -0
- package/dist/admin/layout-editor/editor-state.js.map +1 -1
- package/dist/admin/layout-editor/editor.css +83 -0
- package/dist/admin/layout-editor/form-picker-field.d.ts +17 -0
- package/dist/admin/layout-editor/form-picker-field.d.ts.map +1 -0
- package/dist/admin/layout-editor/form-picker-field.js +35 -0
- package/dist/admin/layout-editor/form-picker-field.js.map +1 -0
- package/dist/admin/layout-editor/layout-editor.d.ts.map +1 -1
- package/dist/admin/layout-editor/layout-editor.js +95 -28
- package/dist/admin/layout-editor/layout-editor.js.map +1 -1
- package/dist/admin/layout-editor/mode-toggle.d.ts.map +1 -1
- package/dist/admin/layout-editor/mode-toggle.js +1 -1
- package/dist/admin/layout-editor/mode-toggle.js.map +1 -1
- package/dist/admin/layout-editor/module-overlay.d.ts +10 -1
- package/dist/admin/layout-editor/module-overlay.d.ts.map +1 -1
- package/dist/admin/layout-editor/module-overlay.js +3 -3
- package/dist/admin/layout-editor/module-overlay.js.map +1 -1
- package/dist/admin/layout-editor/props-panel.d.ts +10 -1
- package/dist/admin/layout-editor/props-panel.d.ts.map +1 -1
- package/dist/admin/layout-editor/props-panel.js +25 -2
- package/dist/admin/layout-editor/props-panel.js.map +1 -1
- package/dist/admin/layout-editor/section-insert-line.d.ts.map +1 -1
- package/dist/admin/layout-editor/section-insert-line.js +1 -1
- package/dist/admin/layout-editor/section-insert-line.js.map +1 -1
- package/dist/admin/layout-editor/section-overlay.d.ts.map +1 -1
- package/dist/admin/layout-editor/section-overlay.js +1 -1
- package/dist/admin/layout-editor/section-overlay.js.map +1 -1
- package/dist/admin/layout-editor/section-template-picker.d.ts +9 -1
- package/dist/admin/layout-editor/section-template-picker.d.ts.map +1 -1
- package/dist/admin/layout-editor/section-template-picker.js +45 -2
- package/dist/admin/layout-editor/section-template-picker.js.map +1 -1
- package/dist/admin/registry.d.ts.map +1 -1
- package/dist/admin/registry.js +11 -0
- package/dist/admin/registry.js.map +1 -1
- package/dist/admin/server.d.ts +15 -2
- package/dist/admin/server.d.ts.map +1 -1
- package/dist/admin/server.js +37 -1
- package/dist/admin/server.js.map +1 -1
- package/dist/admin/shell.d.ts.map +1 -1
- package/dist/admin/shell.js +62 -3
- package/dist/admin/shell.js.map +1 -1
- package/dist/admin/styles/admin.css +105 -27
- package/dist/admin/surface-matcher.d.ts +27 -0
- package/dist/admin/surface-matcher.d.ts.map +1 -1
- package/dist/admin/surface-matcher.js +11 -0
- package/dist/admin/surface-matcher.js.map +1 -1
- package/dist/admin/surfaces/approvals/approvals-data.d.ts +29 -9
- package/dist/admin/surfaces/approvals/approvals-data.d.ts.map +1 -1
- package/dist/admin/surfaces/approvals/approvals-data.js +65 -22
- package/dist/admin/surfaces/approvals/approvals-data.js.map +1 -1
- package/dist/admin/surfaces/approvals/approvals-index.d.ts.map +1 -1
- package/dist/admin/surfaces/approvals/approvals-index.js +47 -14
- package/dist/admin/surfaces/approvals/approvals-index.js.map +1 -1
- package/dist/admin/surfaces/content/content-edit.d.ts.map +1 -1
- package/dist/admin/surfaces/content/content-edit.js +34 -8
- package/dist/admin/surfaces/content/content-edit.js.map +1 -1
- package/dist/admin/surfaces/content/content-index.d.ts.map +1 -1
- package/dist/admin/surfaces/content/content-index.js +29 -2
- package/dist/admin/surfaces/content/content-index.js.map +1 -1
- package/dist/admin/surfaces/content/content-new.d.ts.map +1 -1
- package/dist/admin/surfaces/content/content-new.js +6 -4
- package/dist/admin/surfaces/content/content-new.js.map +1 -1
- package/dist/admin/surfaces/contentTree/content-tree.d.ts.map +1 -1
- package/dist/admin/surfaces/contentTree/content-tree.js +25 -2
- package/dist/admin/surfaces/contentTree/content-tree.js.map +1 -1
- package/dist/admin/surfaces/contentTypes/content-types-designer.d.ts.map +1 -1
- package/dist/admin/surfaces/contentTypes/content-types-designer.js +78 -47
- package/dist/admin/surfaces/contentTypes/content-types-designer.js.map +1 -1
- package/dist/admin/surfaces/feeds/feed-editor.d.ts.map +1 -1
- package/dist/admin/surfaces/feeds/feed-editor.js +21 -4
- package/dist/admin/surfaces/feeds/feed-editor.js.map +1 -1
- package/dist/admin/surfaces/layouts/layout-editor-client.d.ts.map +1 -1
- package/dist/admin/surfaces/layouts/layout-editor-client.js +7 -4
- package/dist/admin/surfaces/layouts/layout-editor-client.js.map +1 -1
- package/dist/admin/surfaces/login.d.ts.map +1 -1
- package/dist/admin/surfaces/login.js +2 -1
- package/dist/admin/surfaces/login.js.map +1 -1
- package/dist/admin/surfaces/media/media-client.d.ts.map +1 -1
- package/dist/admin/surfaces/media/media-client.js +10 -2
- package/dist/admin/surfaces/media/media-client.js.map +1 -1
- package/dist/admin/surfaces/settings/settings-site.d.ts.map +1 -1
- package/dist/admin/surfaces/settings/settings-site.js +39 -2
- package/dist/admin/surfaces/settings/settings-site.js.map +1 -1
- package/dist/admin/surfaces/settings/settings-sites.js +18 -0
- package/dist/admin/surfaces/settings/settings-sites.js.map +1 -1
- package/dist/admin/surfaces/trash/trash-index.d.ts.map +1 -1
- package/dist/admin/surfaces/trash/trash-index.js +45 -8
- package/dist/admin/surfaces/trash/trash-index.js.map +1 -1
- package/dist/admin/surfaces/users/users-data.d.ts +11 -0
- package/dist/admin/surfaces/users/users-data.d.ts.map +1 -1
- package/dist/admin/surfaces/users/users-data.js +20 -1
- package/dist/admin/surfaces/users/users-data.js.map +1 -1
- package/dist/admin/surfaces/webServices/web-services-data.d.ts +11 -1
- package/dist/admin/surfaces/webServices/web-services-data.d.ts.map +1 -1
- package/dist/admin/surfaces/webServices/web-services-data.js +13 -0
- package/dist/admin/surfaces/webServices/web-services-data.js.map +1 -1
- package/dist/admin/surfaces/webServices/webhooks.d.ts +3 -0
- package/dist/admin/surfaces/webServices/webhooks.d.ts.map +1 -0
- package/dist/admin/surfaces/webServices/webhooks.js +69 -0
- package/dist/admin/surfaces/webServices/webhooks.js.map +1 -0
- package/dist/admin/webhook-manager.d.ts +32 -0
- package/dist/admin/webhook-manager.d.ts.map +1 -0
- package/dist/admin/webhook-manager.js +62 -0
- package/dist/admin/webhook-manager.js.map +1 -0
- package/dist/api/admin-features-routes.d.ts.map +1 -1
- package/dist/api/admin-features-routes.js +30 -0
- package/dist/api/admin-features-routes.js.map +1 -1
- package/dist/api/api-key-routes.d.ts.map +1 -1
- package/dist/api/api-key-routes.js +6 -1
- package/dist/api/api-key-routes.js.map +1 -1
- package/dist/api/auth.d.ts +8 -0
- package/dist/api/auth.d.ts.map +1 -1
- package/dist/api/auth.js +11 -1
- package/dist/api/auth.js.map +1 -1
- package/dist/api/comment-routes.d.ts.map +1 -1
- package/dist/api/comment-routes.js +102 -47
- package/dist/api/comment-routes.js.map +1 -1
- package/dist/api/config-routes.d.ts +10 -2
- package/dist/api/config-routes.d.ts.map +1 -1
- package/dist/api/config-routes.js +46 -25
- package/dist/api/config-routes.js.map +1 -1
- package/dist/api/content-routes.d.ts.map +1 -1
- package/dist/api/content-routes.js +41 -0
- package/dist/api/content-routes.js.map +1 -1
- package/dist/api/content-schemas.d.ts.map +1 -1
- package/dist/api/content-schemas.js +34 -1
- package/dist/api/content-schemas.js.map +1 -1
- package/dist/api/content-type-routes.d.ts.map +1 -1
- package/dist/api/content-type-routes.js +58 -3
- package/dist/api/content-type-routes.js.map +1 -1
- package/dist/api/feed-routes.d.ts +180 -0
- package/dist/api/feed-routes.d.ts.map +1 -1
- package/dist/api/feed-routes.js +10 -2
- package/dist/api/feed-routes.js.map +1 -1
- package/dist/api/form-routes.d.ts +6 -0
- package/dist/api/form-routes.d.ts.map +1 -1
- package/dist/api/form-routes.js +93 -14
- package/dist/api/form-routes.js.map +1 -1
- package/dist/api/graphql/resolvers.d.ts +4 -4
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.js +12 -1
- package/dist/api/index.js.map +1 -1
- package/dist/api/media-routes.d.ts.map +1 -1
- package/dist/api/media-routes.js +18 -1
- package/dist/api/media-routes.js.map +1 -1
- package/dist/api/webhook-routes.d.ts.map +1 -1
- package/dist/api/webhook-routes.js +19 -2
- package/dist/api/webhook-routes.js.map +1 -1
- package/dist/api/workflow-routes.d.ts.map +1 -1
- package/dist/api/workflow-routes.js +163 -4
- package/dist/api/workflow-routes.js.map +1 -1
- package/dist/auth/roles.d.ts +28 -0
- package/dist/auth/roles.d.ts.map +1 -1
- package/dist/auth/roles.js +49 -0
- package/dist/auth/roles.js.map +1 -1
- package/dist/config/reserved-field-names.d.ts +29 -0
- package/dist/config/reserved-field-names.d.ts.map +1 -0
- package/dist/config/reserved-field-names.js +59 -0
- package/dist/config/reserved-field-names.js.map +1 -0
- package/dist/config/types.d.ts +31 -2
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/types.js.map +1 -1
- package/dist/db/analytics-queries.d.ts +1 -1
- package/dist/db/api-key-queries.d.ts +7 -2
- package/dist/db/api-key-queries.d.ts.map +1 -1
- package/dist/db/api-key-queries.js +8 -2
- package/dist/db/api-key-queries.js.map +1 -1
- package/dist/db/apply-snapshot.d.ts +58 -0
- package/dist/db/apply-snapshot.d.ts.map +1 -0
- package/dist/db/apply-snapshot.js +142 -0
- package/dist/db/apply-snapshot.js.map +1 -0
- package/dist/db/audit-queries.d.ts +3 -3
- package/dist/db/category-queries.d.ts +3 -3
- package/dist/db/changeset-audit-queries.d.ts +2 -2
- package/dist/db/changeset-queries.d.ts +5 -5
- package/dist/db/changeset-queries.d.ts.map +1 -1
- package/dist/db/changeset-queries.js +24 -7
- package/dist/db/changeset-queries.js.map +1 -1
- package/dist/db/content-queries.d.ts +6 -0
- package/dist/db/content-queries.d.ts.map +1 -1
- package/dist/db/content-queries.js +8 -0
- package/dist/db/content-queries.js.map +1 -1
- package/dist/db/content-type-queries.d.ts +20 -0
- package/dist/db/content-type-queries.d.ts.map +1 -1
- package/dist/db/content-type-queries.js +32 -0
- package/dist/db/content-type-queries.js.map +1 -1
- package/dist/db/dashboard-queries.d.ts.map +1 -1
- package/dist/db/dashboard-queries.js +5 -1
- package/dist/db/dashboard-queries.js.map +1 -1
- package/dist/db/dynamic-schema.d.ts.map +1 -1
- package/dist/db/dynamic-schema.js +2 -0
- package/dist/db/dynamic-schema.js.map +1 -1
- package/dist/db/extension-queries.d.ts +8 -8
- package/dist/db/feed-queries.d.ts +3 -3
- package/dist/db/index.d.ts +3 -0
- package/dist/db/index.d.ts.map +1 -1
- package/dist/db/index.js +7 -0
- package/dist/db/index.js.map +1 -1
- package/dist/db/media-queries.d.ts +31 -7
- package/dist/db/media-queries.d.ts.map +1 -1
- package/dist/db/media-queries.js +13 -1
- package/dist/db/media-queries.js.map +1 -1
- package/dist/db/membership-dedupe.d.ts +26 -0
- package/dist/db/membership-dedupe.d.ts.map +1 -0
- package/dist/db/membership-dedupe.js +68 -0
- package/dist/db/membership-dedupe.js.map +1 -0
- package/dist/db/revision-queries.d.ts +122 -0
- package/dist/db/revision-queries.d.ts.map +1 -0
- package/dist/db/revision-queries.js +213 -0
- package/dist/db/revision-queries.js.map +1 -0
- package/dist/db/schema-apply.d.ts +8 -0
- package/dist/db/schema-apply.d.ts.map +1 -1
- package/dist/db/schema-apply.js +17 -0
- package/dist/db/schema-apply.js.map +1 -1
- package/dist/db/schema-field-queries.d.ts +2 -0
- package/dist/db/schema-field-queries.d.ts.map +1 -1
- package/dist/db/schema-field-queries.js +4 -0
- package/dist/db/schema-field-queries.js.map +1 -1
- package/dist/db/site-plugin-queries.d.ts +2 -2
- package/dist/db/user-queries.d.ts +12 -0
- package/dist/db/user-queries.d.ts.map +1 -1
- package/dist/db/user-queries.js +18 -4
- package/dist/db/user-queries.js.map +1 -1
- package/dist/db/version-queries.d.ts +37 -0
- package/dist/db/version-queries.d.ts.map +1 -1
- package/dist/db/version-queries.js +36 -0
- package/dist/db/version-queries.js.map +1 -1
- package/dist/db/webhook-queries.d.ts +27 -5
- package/dist/db/webhook-queries.d.ts.map +1 -1
- package/dist/db/webhook-queries.js +17 -0
- package/dist/db/webhook-queries.js.map +1 -1
- package/dist/db/workflow-queries.d.ts +2 -2
- package/dist/experiments/schema.d.ts +1 -1
- package/dist/hooks/index.d.ts +1 -1
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +1 -1
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/webhook-retry.d.ts +22 -1
- package/dist/hooks/webhook-retry.d.ts.map +1 -1
- package/dist/hooks/webhook-retry.js +38 -1
- package/dist/hooks/webhook-retry.js.map +1 -1
- package/dist/host/index.d.ts +28 -0
- package/dist/host/index.d.ts.map +1 -1
- package/dist/host/index.js +56 -1
- package/dist/host/index.js.map +1 -1
- package/dist/layout/comments-module.d.ts +18 -0
- package/dist/layout/comments-module.d.ts.map +1 -0
- package/dist/layout/comments-module.js +130 -0
- package/dist/layout/comments-module.js.map +1 -0
- package/dist/layout/feed-hydration.d.ts +75 -0
- package/dist/layout/feed-hydration.d.ts.map +1 -0
- package/dist/layout/feed-hydration.js +158 -0
- package/dist/layout/feed-hydration.js.map +1 -0
- package/dist/layout/index.d.ts +2 -1
- package/dist/layout/index.d.ts.map +1 -1
- package/dist/layout/index.js +2 -1
- package/dist/layout/index.js.map +1 -1
- package/dist/layout/module-render-context.d.ts +13 -0
- package/dist/layout/module-render-context.d.ts.map +1 -0
- package/dist/layout/module-render-context.js +15 -0
- package/dist/layout/module-render-context.js.map +1 -0
- package/dist/layout/modules-extended.d.ts.map +1 -1
- package/dist/layout/modules-extended.js +92 -13
- package/dist/layout/modules-extended.js.map +1 -1
- package/dist/layout/registry.d.ts.map +1 -1
- package/dist/layout/registry.js +22 -6
- package/dist/layout/registry.js.map +1 -1
- package/dist/layout/renderer.d.ts +17 -1
- package/dist/layout/renderer.d.ts.map +1 -1
- package/dist/layout/renderer.js +11 -4
- package/dist/layout/renderer.js.map +1 -1
- package/dist/nav/index.d.ts +1 -0
- package/dist/nav/index.d.ts.map +1 -1
- package/dist/nav/index.js +4 -0
- package/dist/nav/index.js.map +1 -1
- package/dist/nav/url-resolver.d.ts +10 -2
- package/dist/nav/url-resolver.d.ts.map +1 -1
- package/dist/nav/url-resolver.js +17 -3
- package/dist/nav/url-resolver.js.map +1 -1
- package/dist/schema/base.d.ts +37 -1
- package/dist/schema/base.d.ts.map +1 -1
- package/dist/schema/base.js +20 -2
- package/dist/schema/base.js.map +1 -1
- package/dist/schema/generate.d.ts +8 -0
- package/dist/schema/generate.d.ts.map +1 -1
- package/dist/schema/generate.js +7 -4
- package/dist/schema/generate.js.map +1 -1
- package/dist/schema/mapper.d.ts.map +1 -1
- package/dist/schema/mapper.js +2 -0
- package/dist/schema/mapper.js.map +1 -1
- package/dist/schema/mysql-tables.d.ts +34 -0
- package/dist/schema/mysql-tables.d.ts.map +1 -1
- package/dist/schema/mysql-tables.js +14 -2
- package/dist/schema/mysql-tables.js.map +1 -1
- package/dist/server.d.ts +1 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +1 -0
- package/dist/server.js.map +1 -1
- package/dist/site/styles.css +384 -0
- package/package.json +2 -1
package/dist/admin/shell.js
CHANGED
|
@@ -2,9 +2,35 @@
|
|
|
2
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
35
|
export function AdminShell({ config, role, flags, pluginNav, currentPath, children }) {
|
|
10
36
|
// Role/flags (when provided) narrow the derived tree beyond the config ceiling.
|
|
@@ -19,6 +45,39 @@ export function AdminShell({ config, role, flags, pluginNav, currentPath, childr
|
|
|
19
45
|
// sidebar is always visible. Close the drawer whenever the route changes.
|
|
20
46
|
const [sidebarOpen, setSidebarOpen] = useState(false);
|
|
21
47
|
useEffect(() => { setSidebarOpen(false); }, [currentPath]);
|
|
22
|
-
|
|
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] })] }));
|
|
23
82
|
}
|
|
24
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;AAGlD,OAAO,EAAE,aAAa,EAAqB,MAAM,UAAU,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); }
|
|
@@ -362,6 +365,61 @@
|
|
|
362
365
|
.kywi-admin-sidebar .kywi-nav-children .kywi-nav-link { font-size: var(--kywi-text-xs); padding-top: 5px; padding-bottom: 5px; }
|
|
363
366
|
.kywi-admin-sidebar :focus-visible { box-shadow: 0 0 0 2px var(--kywi-sidebar-accent); }
|
|
364
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
|
+
|
|
365
423
|
/* ---- Main + topbar ---------------------------------------------------- */
|
|
366
424
|
.kywi-admin-main {
|
|
367
425
|
flex: 1;
|
|
@@ -467,13 +525,15 @@
|
|
|
467
525
|
justify-content: center;
|
|
468
526
|
gap: var(--kywi-space-2);
|
|
469
527
|
}
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
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;
|
|
476
535
|
}
|
|
536
|
+
.kywi-admin-shell .kywi-admin-login-logo > svg { display: block; width: 100%; height: 100%; }
|
|
477
537
|
.kywi-admin-shell .kywi-admin-login-subtitle {
|
|
478
538
|
margin: calc(var(--kywi-space-2) * -1) 0 var(--kywi-space-2);
|
|
479
539
|
text-align: center;
|
|
@@ -507,6 +567,7 @@
|
|
|
507
567
|
.kywi-admin-extension-header,
|
|
508
568
|
.kywi-admin-oauth-header,
|
|
509
569
|
.kywi-admin-apikey-header,
|
|
570
|
+
.kywi-admin-webhook-header,
|
|
510
571
|
.kywi-form-builder-header,
|
|
511
572
|
.kywi-feed-builder-actions,
|
|
512
573
|
.kywi-changeset-detail-header,
|
|
@@ -929,6 +990,7 @@
|
|
|
929
990
|
.kywi-admin-shell .kywi-admin-extension-title,
|
|
930
991
|
.kywi-admin-shell .kywi-admin-oauth-title,
|
|
931
992
|
.kywi-admin-shell .kywi-admin-apikey-title,
|
|
993
|
+
.kywi-admin-shell .kywi-admin-webhook-title,
|
|
932
994
|
.kywi-admin-shell .kywi-form-builder-title,
|
|
933
995
|
.kywi-admin-shell .kywi-feed-builder-title,
|
|
934
996
|
.kywi-admin-shell .kywi-form-builder-palette-title,
|
|
@@ -948,6 +1010,7 @@
|
|
|
948
1010
|
.kywi-admin-shell .kywi-admin-form-actions,
|
|
949
1011
|
.kywi-admin-shell .kywi-admin-oauth-form-actions,
|
|
950
1012
|
.kywi-admin-shell .kywi-admin-apikey-form-actions,
|
|
1013
|
+
.kywi-admin-shell .kywi-admin-webhook-form-actions,
|
|
951
1014
|
.kywi-admin-shell .kywi-changeset-actions,
|
|
952
1015
|
.kywi-admin-shell .kywi-approval-actions,
|
|
953
1016
|
.kywi-admin-shell .kywi-approval-buttons,
|
|
@@ -982,6 +1045,8 @@
|
|
|
982
1045
|
.kywi-admin-shell .kywi-version-table,
|
|
983
1046
|
.kywi-admin-shell .kywi-admin-oauth-table,
|
|
984
1047
|
.kywi-admin-shell .kywi-admin-apikey-table,
|
|
1048
|
+
.kywi-admin-shell .kywi-admin-webhook-table,
|
|
1049
|
+
.kywi-admin-shell .kywi-admin-webhook-deliveries-table,
|
|
985
1050
|
.kywi-admin-shell .kywi-permissions-matrix,
|
|
986
1051
|
.kywi-admin-shell .kywi-site-tree-table {
|
|
987
1052
|
width: 100%;
|
|
@@ -1005,7 +1070,9 @@
|
|
|
1005
1070
|
.kywi-admin-shell .kywi-submission-table thead th,
|
|
1006
1071
|
.kywi-admin-shell .kywi-version-table thead th,
|
|
1007
1072
|
.kywi-admin-shell .kywi-admin-oauth-table thead th,
|
|
1008
|
-
.kywi-admin-shell .kywi-admin-apikey-table thead th
|
|
1073
|
+
.kywi-admin-shell .kywi-admin-apikey-table thead th,
|
|
1074
|
+
.kywi-admin-shell .kywi-admin-webhook-table thead th,
|
|
1075
|
+
.kywi-admin-shell .kywi-admin-webhook-deliveries-table thead th {
|
|
1009
1076
|
padding: 10px var(--kywi-space-4);
|
|
1010
1077
|
text-align: left;
|
|
1011
1078
|
background: var(--kywi-surface-2);
|
|
@@ -1032,7 +1099,9 @@
|
|
|
1032
1099
|
.kywi-admin-shell .kywi-submission-table tbody td,
|
|
1033
1100
|
.kywi-admin-shell .kywi-version-table tbody td,
|
|
1034
1101
|
.kywi-admin-shell .kywi-admin-oauth-table tbody td,
|
|
1035
|
-
.kywi-admin-shell .kywi-admin-apikey-table tbody td
|
|
1102
|
+
.kywi-admin-shell .kywi-admin-apikey-table tbody td,
|
|
1103
|
+
.kywi-admin-shell .kywi-admin-webhook-table tbody td,
|
|
1104
|
+
.kywi-admin-shell .kywi-admin-webhook-deliveries-table tbody td {
|
|
1036
1105
|
padding: 11px var(--kywi-space-4);
|
|
1037
1106
|
border-bottom: 1px solid var(--kywi-border);
|
|
1038
1107
|
color: var(--kywi-text);
|
|
@@ -1259,6 +1328,7 @@
|
|
|
1259
1328
|
.kywi-admin-shell .kywi-admin-extension-empty,
|
|
1260
1329
|
.kywi-admin-shell .kywi-admin-oauth-empty,
|
|
1261
1330
|
.kywi-admin-shell .kywi-admin-apikey-empty,
|
|
1331
|
+
.kywi-admin-shell .kywi-admin-webhook-empty,
|
|
1262
1332
|
.kywi-admin-shell .kywi-admin-plugin-empty,
|
|
1263
1333
|
.kywi-admin-shell .kywi-admin-picker-empty,
|
|
1264
1334
|
.kywi-admin-shell .kywi-admin-empty-conditions,
|
|
@@ -1906,7 +1976,8 @@
|
|
|
1906
1976
|
.kywi-admin-shell .kywi-admin-extension-attribute,
|
|
1907
1977
|
.kywi-admin-shell .kywi-admin-extension-set,
|
|
1908
1978
|
.kywi-admin-shell .kywi-admin-oauth-scope-label,
|
|
1909
|
-
.kywi-admin-shell .kywi-admin-apikey-scope-label
|
|
1979
|
+
.kywi-admin-shell .kywi-admin-apikey-scope-label,
|
|
1980
|
+
.kywi-admin-shell .kywi-admin-webhook-event-label {
|
|
1910
1981
|
display: inline-flex; align-items: center; gap: 5px; padding: 2px 8px;
|
|
1911
1982
|
background: var(--kywi-surface-sunken); border: 1px solid var(--kywi-border);
|
|
1912
1983
|
border-radius: var(--kywi-radius-sm); font-size: var(--kywi-text-xs); color: var(--kywi-text-muted);
|
|
@@ -1921,7 +1992,8 @@
|
|
|
1921
1992
|
.kywi-admin-shell .kywi-admin-extension-subtype-name,
|
|
1922
1993
|
.kywi-admin-shell .kywi-admin-audience-name,
|
|
1923
1994
|
.kywi-admin-shell .kywi-admin-oauth-count,
|
|
1924
|
-
.kywi-admin-shell .kywi-admin-apikey-count
|
|
1995
|
+
.kywi-admin-shell .kywi-admin-apikey-count,
|
|
1996
|
+
.kywi-admin-shell .kywi-admin-webhook-count { font-weight: var(--kywi-weight-semibold); }
|
|
1925
1997
|
.kywi-admin-shell .kywi-admin-plugin-count,
|
|
1926
1998
|
.kywi-admin-shell .kywi-admin-extension-count,
|
|
1927
1999
|
.kywi-admin-shell .kywi-admin-condition-count { font-size: var(--kywi-text-xs); color: var(--kywi-text-muted); }
|
|
@@ -2638,12 +2710,18 @@
|
|
|
2638
2710
|
background: var(--kywi-text);
|
|
2639
2711
|
border-radius: 2px;
|
|
2640
2712
|
}
|
|
2713
|
+
/* On the light mobile bar the wordmark reads directly — no chip needed. */
|
|
2641
2714
|
.kywi-admin-shell .kywi-admin-mobile-brand {
|
|
2642
|
-
|
|
2643
|
-
|
|
2644
|
-
letter-spacing: var(--kywi-tracking-tight);
|
|
2715
|
+
display: inline-flex;
|
|
2716
|
+
align-items: center;
|
|
2645
2717
|
text-decoration: none;
|
|
2646
2718
|
}
|
|
2719
|
+
.kywi-admin-shell .kywi-admin-mobile-logo {
|
|
2720
|
+
display: block;
|
|
2721
|
+
width: 128px;
|
|
2722
|
+
aspect-ratio: 1638 / 382;
|
|
2723
|
+
}
|
|
2724
|
+
.kywi-admin-shell .kywi-admin-mobile-logo > svg { display: block; width: 100%; height: 100%; }
|
|
2647
2725
|
|
|
2648
2726
|
/* Full-width content column with tighter gutters. */
|
|
2649
2727
|
.kywi-admin-shell .kywi-admin-main {
|
|
@@ -32,6 +32,33 @@ export declare function isSurfaceEnabled(surface: AdminSurface, adminConfig?: Ad
|
|
|
32
32
|
* denylist (escape hatch) — only the master `enabled: false` switch can 404 it.
|
|
33
33
|
*/
|
|
34
34
|
export declare function resolveSurface(segments: string[], adminConfig?: AdminConfigCeiling): SurfaceMatch | null;
|
|
35
|
+
/**
|
|
36
|
+
* Three-state resolution that distinguishes a genuinely UNKNOWN admin path from
|
|
37
|
+
* a KNOWN surface held off by the config ceiling (#58). `resolveSurface` folds
|
|
38
|
+
* both into `null`, which is why the host page's `resolveSurface(...) === null →
|
|
39
|
+
* notFound()` pre-check turned a config-disabled surface into a hard Next 404
|
|
40
|
+
* while a merely runtime-disabled surface got the soft in-shell "disabled"
|
|
41
|
+
* message — same user intent, two different outcomes.
|
|
42
|
+
*
|
|
43
|
+
* With this, the host 404s ONLY `'not-found'` (a real unknown route) and lets a
|
|
44
|
+
* `'config-disabled'` surface fall through to `KywiAdminApp`, which renders the
|
|
45
|
+
* same in-shell message a runtime-disabled surface gets — so both disable paths
|
|
46
|
+
* present consistently in the admin shell. The config ceiling stays a hard
|
|
47
|
+
* ceiling everywhere else: the surface is still hidden from nav, still refuses to
|
|
48
|
+
* mount, and the PUT /admin-features API still rejects re-enabling it.
|
|
49
|
+
*/
|
|
50
|
+
export type SurfaceResolution = {
|
|
51
|
+
status: 'ok';
|
|
52
|
+
surface: AdminSurface;
|
|
53
|
+
params: Record<string, string>;
|
|
54
|
+
} | {
|
|
55
|
+
status: 'config-disabled';
|
|
56
|
+
surface: AdminSurface;
|
|
57
|
+
params: Record<string, string>;
|
|
58
|
+
} | {
|
|
59
|
+
status: 'not-found';
|
|
60
|
+
};
|
|
61
|
+
export declare function resolveSurfaceState(segments: string[], adminConfig?: AdminConfigCeiling): SurfaceResolution;
|
|
35
62
|
/**
|
|
36
63
|
* The visibility gate used by BOTH the nav derivation (`buildAdminNav`) and the
|
|
37
64
|
* router's client-side surface gate (`KywiAdminApp`): identical to
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"surface-matcher.d.ts","sourceRoot":"","sources":["../../src/admin/surface-matcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC5D,OAAO,EAGL,KAAK,YAAY,EACjB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACvB,MAAM,eAAe,CAAA;AA+EtB,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,YAAY,CAAA;IACrB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAC/B;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,YAAY,GAAG,IAAI,CASpE;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,YAAY,EACrB,WAAW,CAAC,EAAE,kBAAkB,EAChC,KAAK,CAAC,EAAE,iBAAiB,EACzB,IAAI,CAAC,EAAE,QAAQ,GACd,OAAO,CAeT;AAkBD;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,WAAW,CAAC,EAAE,kBAAkB,GAAG,YAAY,GAAG,IAAI,CASxG;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,YAAY,EACrB,WAAW,CAAC,EAAE,kBAAkB,EAChC,KAAK,CAAC,EAAE,iBAAiB,EACzB,IAAI,CAAC,EAAE,QAAQ,GACd,OAAO,CAOT"}
|
|
1
|
+
{"version":3,"file":"surface-matcher.d.ts","sourceRoot":"","sources":["../../src/admin/surface-matcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC5D,OAAO,EAGL,KAAK,YAAY,EACjB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACvB,MAAM,eAAe,CAAA;AA+EtB,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,YAAY,CAAA;IACrB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAC/B;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,YAAY,GAAG,IAAI,CASpE;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,YAAY,EACrB,WAAW,CAAC,EAAE,kBAAkB,EAChC,KAAK,CAAC,EAAE,iBAAiB,EACzB,IAAI,CAAC,EAAE,QAAQ,GACd,OAAO,CAeT;AAkBD;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,WAAW,CAAC,EAAE,kBAAkB,GAAG,YAAY,GAAG,IAAI,CASxG;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,MAAM,iBAAiB,GACzB;IAAE,MAAM,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,YAAY,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GACvE;IAAE,MAAM,EAAE,iBAAiB,CAAC;IAAC,OAAO,EAAE,YAAY,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GACpF;IAAE,MAAM,EAAE,WAAW,CAAA;CAAE,CAAA;AAE3B,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,MAAM,EAAE,EAClB,WAAW,CAAC,EAAE,kBAAkB,GAC/B,iBAAiB,CAWnB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,YAAY,EACrB,WAAW,CAAC,EAAE,kBAAkB,EAChC,KAAK,CAAC,EAAE,iBAAiB,EACzB,IAAI,CAAC,EAAE,QAAQ,GACd,OAAO,CAOT"}
|
|
@@ -153,6 +153,17 @@ export function resolveSurface(segments, adminConfig) {
|
|
|
153
153
|
return null;
|
|
154
154
|
return match;
|
|
155
155
|
}
|
|
156
|
+
export function resolveSurfaceState(segments, adminConfig) {
|
|
157
|
+
const match = matchSurface(segments);
|
|
158
|
+
if (!match)
|
|
159
|
+
return { status: 'not-found' };
|
|
160
|
+
const gated = isAdminFeaturesSurface(match.surface)
|
|
161
|
+
? adminConfig?.enabled !== false // escape hatch: only the master switch removes it
|
|
162
|
+
: isSurfaceEnabled(match.surface, adminConfig);
|
|
163
|
+
return gated
|
|
164
|
+
? { status: 'ok', surface: match.surface, params: match.params }
|
|
165
|
+
: { status: 'config-disabled', surface: match.surface, params: match.params };
|
|
166
|
+
}
|
|
156
167
|
/**
|
|
157
168
|
* The visibility gate used by BOTH the nav derivation (`buildAdminNav`) and the
|
|
158
169
|
* router's client-side surface gate (`KywiAdminApp`): identical to
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"surface-matcher.js","sourceRoot":"","sources":["../../src/admin/surface-matcher.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"surface-matcher.js","sourceRoot":"","sources":["../../src/admin/surface-matcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,17 +1,37 @@
|
|
|
1
1
|
import type { ApprovalQueueItem } from '../../approval-queue.js';
|
|
2
|
-
/** A
|
|
2
|
+
/** A single field-level change shown in the queue's diff view. */
|
|
3
|
+
export interface DiffField {
|
|
4
|
+
field: string;
|
|
5
|
+
oldValue: unknown;
|
|
6
|
+
newValue: unknown;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* A queue item plus the routing metadata the actions need. `revisionVersionId`
|
|
10
|
+
* distinguishes a pending revision (applies to a live page) from a plain draft
|
|
11
|
+
* submission; `changedFields`, when present, is the ready-to-render diff.
|
|
12
|
+
*/
|
|
3
13
|
export interface ApprovalItem extends ApprovalQueueItem {
|
|
4
14
|
contentTypeName: string;
|
|
15
|
+
/** Real content id (for a revision the queue `id` is composite, so keep this). */
|
|
16
|
+
contentId: string;
|
|
17
|
+
/** Present iff this row is a pending revision of published content. */
|
|
18
|
+
revisionVersionId?: string;
|
|
19
|
+
/** Field-level diff (proposed vs current) — inline for revisions. */
|
|
20
|
+
changedFields?: DiffField[];
|
|
5
21
|
}
|
|
6
22
|
/**
|
|
7
|
-
* Load the
|
|
8
|
-
* names
|
|
9
|
-
* degrades to the raw id so the queue still renders. (The Site column value
|
|
10
|
-
* doubles as its filter key, so resolving it in place keeps the filter human.)
|
|
23
|
+
* Load the review queue: draft submissions and pending revisions, resolved to
|
|
24
|
+
* human names where possible (a failed lookup degrades to the raw id).
|
|
11
25
|
*/
|
|
12
26
|
export declare function loadApprovals(): Promise<ApprovalItem[]>;
|
|
13
|
-
/**
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
27
|
+
/**
|
|
28
|
+
* Load the field-level diff for a plain draft submission on demand — the two
|
|
29
|
+
* most recent versions (submitted state vs the prior one). Returns [] when there
|
|
30
|
+
* is nothing to compare (a first submission with a single version).
|
|
31
|
+
*/
|
|
32
|
+
export declare function loadSubmissionDiff(contentTypeName: string, contentId: string): Promise<DiffField[]>;
|
|
33
|
+
/** Approve an item: apply the revision, or version+publish the draft submission. */
|
|
34
|
+
export declare function approveSubmission(item: ApprovalItem, comment?: string): Promise<void>;
|
|
35
|
+
/** Reject an item, recording the comment as the reason the editor will see. */
|
|
36
|
+
export declare function rejectSubmission(item: ApprovalItem, comment?: string): Promise<void>;
|
|
17
37
|
//# sourceMappingURL=approvals-data.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"approvals-data.d.ts","sourceRoot":"","sources":["../../../../src/admin/surfaces/approvals/approvals-data.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"approvals-data.d.ts","sourceRoot":"","sources":["../../../../src/admin/surfaces/approvals/approvals-data.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAEhE,kEAAkE;AAClE,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,OAAO,CAAA;IACjB,QAAQ,EAAE,OAAO,CAAA;CAClB;AAkCD;;;;GAIG;AACH,MAAM,WAAW,YAAa,SAAQ,iBAAiB;IACrD,eAAe,EAAE,MAAM,CAAA;IACvB,kFAAkF;IAClF,SAAS,EAAE,MAAM,CAAA;IACjB,uEAAuE;IACvE,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,qEAAqE;IACrE,aAAa,CAAC,EAAE,SAAS,EAAE,CAAA;CAC5B;AAED;;;GAGG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC,CA4C7D;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CACtC,eAAe,EAAE,MAAM,EACvB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,SAAS,EAAE,CAAC,CAWtB;AAED,oFAAoF;AACpF,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAa3F;AAED,+EAA+E;AAC/E,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAY1F"}
|
|
@@ -1,34 +1,38 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Data helpers for the Approvals surface (`/admin/approvals`)
|
|
3
|
-
* migration.
|
|
2
|
+
* Data helpers for the Approvals surface (`/admin/approvals`).
|
|
4
3
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
4
|
+
* The queue has two sources, both editor+:
|
|
5
|
+
* - GET /content/pending — draft content submitted for review (draft→pending).
|
|
6
|
+
* - GET /content/revisions/pending — pending REVISIONS of already-published
|
|
7
|
+
* content (#42): the live page keeps serving while the proposed edit waits
|
|
8
|
+
* here. Each revision carries the field-level diff (proposed vs live) so the
|
|
9
|
+
* approver is never approving blind (#45.1).
|
|
9
10
|
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
11
|
+
* Approving a draft submission publishes it in one engine transition (approve
|
|
12
|
+
* with `{ publish: true }`); approving a revision applies its snapshot to the
|
|
13
|
+
* live content. Rejecting either records the comment as the reason the editor
|
|
14
|
+
* then sees on the edit screen (#45.2).
|
|
14
15
|
*/
|
|
15
16
|
import { getJson, sendJson, loadUserDisplayMap, loadSiteDisplayMap } from '../../../host-client/index.js';
|
|
16
17
|
/**
|
|
17
|
-
* Load the
|
|
18
|
-
* names
|
|
19
|
-
* degrades to the raw id so the queue still renders. (The Site column value
|
|
20
|
-
* doubles as its filter key, so resolving it in place keeps the filter human.)
|
|
18
|
+
* Load the review queue: draft submissions and pending revisions, resolved to
|
|
19
|
+
* human names where possible (a failed lookup degrades to the raw id).
|
|
21
20
|
*/
|
|
22
21
|
export async function loadApprovals() {
|
|
23
|
-
const [rows, userMap, siteMap] = await Promise.all([
|
|
22
|
+
const [rows, revisions, userMap, siteMap] = await Promise.all([
|
|
23
|
+
// The draft-submission source drives the surface's error state (unchanged);
|
|
24
|
+
// the revisions source degrades to empty so an unavailable endpoint (older
|
|
25
|
+
// host, forbidden) never blanks the whole queue.
|
|
24
26
|
getJson('/api/v1/content/pending'),
|
|
27
|
+
getJson('/api/v1/content/revisions/pending').catch(() => []),
|
|
25
28
|
loadUserDisplayMap(),
|
|
26
29
|
loadSiteDisplayMap(),
|
|
27
30
|
]);
|
|
28
|
-
|
|
31
|
+
const drafts = rows.map(row => {
|
|
29
32
|
const submitterId = row.updatedBy ?? row.createdBy ?? '';
|
|
30
33
|
return {
|
|
31
34
|
id: row.id,
|
|
35
|
+
contentId: row.id,
|
|
32
36
|
title: row.title,
|
|
33
37
|
contentType: row.contentTypeName,
|
|
34
38
|
contentTypeName: row.contentTypeName,
|
|
@@ -38,17 +42,56 @@ export async function loadApprovals() {
|
|
|
38
42
|
status: 'pending',
|
|
39
43
|
};
|
|
40
44
|
});
|
|
45
|
+
const revs = revisions.map(rev => {
|
|
46
|
+
const submitterId = rev.submittedBy ?? '';
|
|
47
|
+
return {
|
|
48
|
+
id: `rev:${rev.versionId}`,
|
|
49
|
+
contentId: rev.contentId,
|
|
50
|
+
title: `${rev.title} (revision)`,
|
|
51
|
+
contentType: rev.contentTypeName,
|
|
52
|
+
contentTypeName: rev.contentTypeName,
|
|
53
|
+
siteId: siteMap.get(rev.siteId) ?? rev.siteId,
|
|
54
|
+
submittedBy: userMap.get(submitterId) ?? submitterId,
|
|
55
|
+
submittedAt: rev.submittedAt,
|
|
56
|
+
status: 'pending',
|
|
57
|
+
revisionVersionId: rev.versionId,
|
|
58
|
+
changedFields: rev.changedFields ?? [],
|
|
59
|
+
};
|
|
60
|
+
});
|
|
61
|
+
return [...revs, ...drafts];
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Load the field-level diff for a plain draft submission on demand — the two
|
|
65
|
+
* most recent versions (submitted state vs the prior one). Returns [] when there
|
|
66
|
+
* is nothing to compare (a first submission with a single version).
|
|
67
|
+
*/
|
|
68
|
+
export async function loadSubmissionDiff(contentTypeName, contentId) {
|
|
69
|
+
const versions = await getJson(`/api/v1/content/${contentTypeName}/${contentId}/versions`).catch(() => []);
|
|
70
|
+
if (versions.length < 2)
|
|
71
|
+
return [];
|
|
72
|
+
const sorted = [...versions].sort((a, b) => b.version - a.version);
|
|
73
|
+
const to = sorted[0].version;
|
|
74
|
+
const from = sorted[1].version;
|
|
75
|
+
return getJson(`/api/v1/content/${contentTypeName}/${contentId}/versions/diff?from=${from}&to=${to}`).catch(() => []);
|
|
41
76
|
}
|
|
42
|
-
/** Approve
|
|
43
|
-
export async function approveSubmission(
|
|
44
|
-
|
|
77
|
+
/** Approve an item: apply the revision, or version+publish the draft submission. */
|
|
78
|
+
export async function approveSubmission(item, comment) {
|
|
79
|
+
if (item.revisionVersionId) {
|
|
80
|
+
await sendJson(`/api/v1/content/${item.contentTypeName}/${item.contentId}/revisions/${item.revisionVersionId}/approve`, 'POST', {});
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
await sendJson(`/api/v1/content/${item.contentTypeName}/${item.contentId}/approve`, 'POST', {
|
|
45
84
|
publish: true,
|
|
46
85
|
...(comment ? { comment } : {}),
|
|
47
86
|
});
|
|
48
87
|
}
|
|
49
|
-
/** Reject
|
|
50
|
-
export async function rejectSubmission(
|
|
51
|
-
|
|
88
|
+
/** Reject an item, recording the comment as the reason the editor will see. */
|
|
89
|
+
export async function rejectSubmission(item, comment) {
|
|
90
|
+
if (item.revisionVersionId) {
|
|
91
|
+
await sendJson(`/api/v1/content/${item.contentTypeName}/${item.contentId}/revisions/${item.revisionVersionId}/reject`, 'POST', { ...(comment ? { reason: comment } : {}) });
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
await sendJson(`/api/v1/content/${item.contentTypeName}/${item.contentId}/reject`, 'POST', {
|
|
52
95
|
...(comment ? { reason: comment } : {}),
|
|
53
96
|
});
|
|
54
97
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"approvals-data.js","sourceRoot":"","sources":["../../../../src/admin/surfaces/approvals/approvals-data.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"approvals-data.js","sourceRoot":"","sources":["../../../../src/admin/surfaces/approvals/approvals-data.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAA;AAyDzG;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAC5D,4EAA4E;QAC5E,2EAA2E;QAC3E,iDAAiD;QACjD,OAAO,CAAsB,yBAAyB,CAAC;QACvD,OAAO,CAAuB,mCAAmC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAA0B,CAAC;QAC1G,kBAAkB,EAAE;QACpB,kBAAkB,EAAE;KACrB,CAAC,CAAA;IAEF,MAAM,MAAM,GAAmB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;QAC5C,MAAM,WAAW,GAAG,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,SAAS,IAAI,EAAE,CAAA;QACxD,OAAO;YACL,EAAE,EAAE,GAAG,CAAC,EAAE;YACV,SAAS,EAAE,GAAG,CAAC,EAAE;YACjB,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,WAAW,EAAE,GAAG,CAAC,eAAe;YAChC,eAAe,EAAE,GAAG,CAAC,eAAe;YACpC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,MAAM;YAC7C,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,WAAW;YACpD,WAAW,EAAE,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,SAAS;YAC3C,MAAM,EAAE,SAAkB;SAC3B,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,MAAM,IAAI,GAAmB,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;QAC/C,MAAM,WAAW,GAAG,GAAG,CAAC,WAAW,IAAI,EAAE,CAAA;QACzC,OAAO;YACL,EAAE,EAAE,OAAO,GAAG,CAAC,SAAS,EAAE;YAC1B,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,KAAK,EAAE,GAAG,GAAG,CAAC,KAAK,aAAa;YAChC,WAAW,EAAE,GAAG,CAAC,eAAe;YAChC,eAAe,EAAE,GAAG,CAAC,eAAe;YACpC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,MAAM;YAC7C,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,WAAW;YACpD,WAAW,EAAE,GAAG,CAAC,WAAW;YAC5B,MAAM,EAAE,SAAkB;YAC1B,iBAAiB,EAAE,GAAG,CAAC,SAAS;YAChC,aAAa,EAAE,GAAG,CAAC,aAAa,IAAI,EAAE;SACvC,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,OAAO,CAAC,GAAG,IAAI,EAAE,GAAG,MAAM,CAAC,CAAA;AAC7B,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,eAAuB,EACvB,SAAiB;IAEjB,MAAM,QAAQ,GAAG,MAAM,OAAO,CAC5B,mBAAmB,eAAe,IAAI,SAAS,WAAW,CAC3D,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAkB,CAAC,CAAA;IACjC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,EAAE,CAAA;IAClC,MAAM,MAAM,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,CAAA;IAClE,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAE,CAAC,OAAO,CAAA;IAC7B,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAE,CAAC,OAAO,CAAA;IAC/B,OAAO,OAAO,CACZ,mBAAmB,eAAe,IAAI,SAAS,uBAAuB,IAAI,OAAO,EAAE,EAAE,CACtF,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAiB,CAAC,CAAA;AAClC,CAAC;AAED,oFAAoF;AACpF,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,IAAkB,EAAE,OAAgB;IAC1E,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC3B,MAAM,QAAQ,CACZ,mBAAmB,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,SAAS,cAAc,IAAI,CAAC,iBAAiB,UAAU,EACvG,MAAM,EACN,EAAE,CACH,CAAA;QACD,OAAM;IACR,CAAC;IACD,MAAM,QAAQ,CAAC,mBAAmB,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,SAAS,UAAU,EAAE,MAAM,EAAE;QAC1F,OAAO,EAAE,IAAI;QACb,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAChC,CAAC,CAAA;AACJ,CAAC;AAED,+EAA+E;AAC/E,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAkB,EAAE,OAAgB;IACzE,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC3B,MAAM,QAAQ,CACZ,mBAAmB,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,SAAS,cAAc,IAAI,CAAC,iBAAiB,SAAS,EACtG,MAAM,EACN,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAC5C,CAAA;QACD,OAAM;IACR,CAAC;IACD,MAAM,QAAQ,CAAC,mBAAmB,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,SAAS,SAAS,EAAE,MAAM,EAAE;QACzF,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACxC,CAAC,CAAA;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"approvals-index.d.ts","sourceRoot":"","sources":["../../../../src/admin/surfaces/approvals/approvals-index.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"approvals-index.d.ts","sourceRoot":"","sources":["../../../../src/admin/surfaces/approvals/approvals-index.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AA6BrD,MAAM,CAAC,OAAO,UAAU,qBAAqB,CAAC,MAAM,EAAE,YAAY,2CA2KjE"}
|