@done-coding/admin-core 0.10.0 → 0.11.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.
Files changed (46) hide show
  1. package/es/bridge/config-hook.mjs +32 -26
  2. package/es/bridge/index.mjs +129 -83
  3. package/es/bridge/theme/index.mjs +103 -0
  4. package/es/bridge/theme/persist.mjs +14 -0
  5. package/es/bridge/theme/system-dark.mjs +11 -0
  6. package/es/components/app-layout/AppAside.vue.mjs +7 -0
  7. package/es/components/app-layout/AppAside.vue2.mjs +22 -0
  8. package/es/components/app-layout/AppFooter.vue.mjs +2 -2
  9. package/es/components/app-layout/AppHeader.vue.mjs +2 -2
  10. package/es/components/app-layout/AppHeader.vue2.mjs +35 -41
  11. package/es/components/app-layout/AppLayout.vue.mjs +2 -2
  12. package/es/components/app-layout/AppLayout.vue2.mjs +106 -88
  13. package/es/components/app-layout/AppShell.vue.mjs +60 -0
  14. package/es/components/app-layout/AppShell.vue2.mjs +4 -0
  15. package/es/components/app-layout/AppSidebar.vue.mjs +2 -2
  16. package/es/components/app-layout/AppSidebar.vue2.mjs +44 -47
  17. package/es/components/app-layout/AppTheme.vue.mjs +2 -2
  18. package/es/components/app-layout/AppTheme.vue2.mjs +55 -25
  19. package/es/components/app-layout/viewport.mjs +5 -0
  20. package/es/components/form/FormItemNestForm.vue.mjs +1 -1
  21. package/es/components/form/FormItemNestFormList.vue.mjs +1 -1
  22. package/es/components/form/FormSearch.vue.mjs +2 -2
  23. package/es/components/form/FormSearch.vue2.mjs +1 -1
  24. package/es/hooks/use-admin-theme-apply.mjs +16 -15
  25. package/es/hooks/use-admin-viewport-apply.mjs +29 -17
  26. package/es/index.mjs +182 -175
  27. package/es/store/app.mjs +133 -77
  28. package/es/style.css +1 -1
  29. package/package.json +2 -2
  30. package/types/bridge/config-hook.d.ts +10 -2
  31. package/types/bridge/index.d.ts +105 -5
  32. package/types/bridge/theme/index.d.ts +10 -0
  33. package/types/bridge/theme/persist.d.ts +23 -0
  34. package/types/bridge/theme/system-dark.d.ts +14 -0
  35. package/types/bridge/theme/types.d.ts +258 -0
  36. package/types/components/app-layout/AppAside.vue.d.ts +21 -0
  37. package/types/components/app-layout/AppLayout.vue.d.ts +2 -7
  38. package/types/components/app-layout/AppShell.vue.d.ts +27 -0
  39. package/types/components/app-layout/index.d.ts +4 -1
  40. package/types/components/app-layout/types.d.ts +117 -1
  41. package/types/components/app-layout/viewport.d.ts +30 -0
  42. package/types/hooks/use-admin-viewport-apply.d.ts +6 -1
  43. package/types/store/app.d.ts +24 -83
  44. package/types/types/route.d.ts +2 -0
  45. package/es/bridge/theme.mjs +0 -65
  46. package/types/bridge/theme.d.ts +0 -85
package/es/style.css CHANGED
@@ -1 +1 @@
1
- .confirm-modal[data-v-26598cb2] .el-dialog__header{margin-right:0;padding:16px 20px;border-bottom:1px solid var(--el-border-color-lighter)}.confirm-modal__title[data-v-26598cb2]{font-size:16px;font-weight:600;line-height:24px;color:var(--el-text-color-primary);text-align:left}.confirm-modal[data-v-26598cb2] .el-dialog__body{padding:20px}.confirm-modal__content[data-v-26598cb2]{overflow-x:hidden;overflow-y:auto;max-height:calc(100vh - 200px);font-size:14px;line-height:22px;color:var(--el-text-color-regular);text-align:left;word-break:break-word}.confirm-modal[data-v-26598cb2] .el-dialog__footer{padding:12px 20px;border-top:1px solid var(--el-border-color-lighter)}.confirm-modal__footer[data-v-26598cb2]{display:flex;justify-content:flex-end;align-items:center;gap:8px}.confirm-modal__footer[data-v-26598cb2] .el-button{min-width:72px}.confirm-modal__footer[reverse=true][data-v-26598cb2]{flex-direction:row-reverse}.action-confirm__title[data-v-88119b35]{font-weight:600;margin-bottom:6px}.action-confirm__content[data-v-88119b35]{margin-bottom:12px;color:var(--el-text-color-regular)}.action-confirm__actions[data-v-88119b35]{display:flex;justify-content:flex-end;gap:8px}.form-item-tip[data-v-8b508d64]{text-align:left;line-height:1.5;font-size:12px}.form-item-label-hide[data-v-8b508d64] .el-form-item__label-wrap{display:none}[data-v-8ad14c45] .el-row>.el-col>.el-form-item{margin-bottom:18px}.form-submit-panel[data-v-93bc9096]{display:flex;flex-direction:column}.form-submit-panel .form-submit-panel-form[data-v-93bc9096]{order:1}.form-submit-panel .form-submit-panel-operation[data-v-93bc9096]{order:2}.form-submit-panel .form-submit-panel-operation-inner[data-v-93bc9096]{display:flex;align-items:center;gap:8px;padding:10px 12px}.form-submit-panel .el-affix--fixed .form-submit-panel-operation-inner[data-v-93bc9096]{background-color:var(--admin-core-body-color)}.form-submit-panel_bottom-center .form-submit-panel-operation-inner[data-v-93bc9096],.form-submit-panel_bottom-right .form-submit-panel-operation-inner[data-v-93bc9096]{border-top:1px solid var(--el-border-color-light);border-bottom-left-radius:var(--admin-core-radius, var(--el-border-radius-base));border-bottom-right-radius:var(--admin-core-radius, var(--el-border-radius-base))}.form-submit-panel_bottom-center .form-submit-panel-operation-inner[data-v-93bc9096]{justify-content:center}.form-submit-panel_bottom-right .form-submit-panel-operation-inner[data-v-93bc9096]{justify-content:flex-end}.form-submit-panel_top-right .form-submit-panel-operation[data-v-93bc9096]{order:0}.form-submit-panel_top-right .form-submit-panel-operation-inner[data-v-93bc9096]{justify-content:flex-end;border-bottom:1px solid var(--el-border-color-light);border-top-left-radius:var(--admin-core-radius, var(--el-border-radius-base));border-top-right-radius:var(--admin-core-radius, var(--el-border-radius-base))}.form-submit-panel_no-divider .form-submit-panel-operation-inner[data-v-93bc9096]{border:none;border-radius:0}.form-submit-panel_bare .form-submit-panel-operation-inner[data-v-93bc9096]{padding:0}.panel-edit-switch[data-v-65f056ab]{position:relative}.panel-edit-switch:hover .panel-edit-switch-edit-btn[data-v-65f056ab]{display:block}.panel-edit-switch-edit-btn[data-v-65f056ab]{position:absolute;top:0;right:0;z-index:1;display:none}.panel-edit-switch-actions[data-v-65f056ab]{display:flex;justify-content:flex-end;gap:8px;margin-top:8px}.panel-main-item-col:not(:last-of-type) .panel-main-item-col-wrap_card[data-v-9c14b584]{margin-bottom:var(--v5b714e11)}.form-search_show[data-v-9a9f48af]{margin-bottom:10px}.form-search .btn-box[data-v-9a9f48af]{display:flex;align-items:center;gap:8px;justify-content:flex-end}.form-search .btn-box-expand-icon[data-v-9a9f48af]{margin-right:2px}.form-verify-image[data-v-669b7ad9] .el-input__suffix-inner *{margin:0}.form-verify-image-suffix[data-v-669b7ad9]{position:absolute;height:100%;border-radius:var(--el-input-border-radius, var(--admin-core-radius, var(--el-border-radius-base)));top:50%;transform:translateY(-50%);overflow:hidden;cursor:pointer}.form-verify-image-suffix-main[data-v-669b7ad9]{position:absolute;left:0;top:0;width:100%;height:100%;background-color:#f4f4f4}.tabs-main-bar[data-v-3faa57f5]{position:relative;display:flex;align-items:center}.tabs-main-bar-item[data-v-3faa57f5]{border:none;background:transparent;cursor:pointer;color:var(--el-text-color-regular);transition:background .2s,color .2s,box-shadow .2s}.tabs-main-bar-indicator[data-v-3faa57f5]{position:absolute;left:0;background:var(--admin-core-primary-color);transition:transform .2s,width .2s}.tabs-main-bar--l1 .tabs-main-bar-item[data-v-3faa57f5]{font-size:16px}.tabs-main-bar--l2 .tabs-main-bar-item[data-v-3faa57f5]{font-size:14px}.tabs-main-bar--l3 .tabs-main-bar-item[data-v-3faa57f5],.tabs-main-bar--l4 .tabs-main-bar-item[data-v-3faa57f5]{font-size:12px}.tabs-main-bar--variant-card[data-v-3faa57f5]{position:relative;overflow:hidden;gap:2px}.tabs-main-bar--variant-card .tabs-main-bar-item[data-v-3faa57f5]{position:relative;padding:8px 20px;line-height:1.4;border:1px solid transparent;border-bottom:0;border-radius:6px 6px 0 0}.tabs-main-bar--variant-card .tabs-main-bar-item[data-v-3faa57f5]:hover:not(.tabs-main-bar-item_active){color:var(--admin-core-primary-color)}.tabs-main-bar--variant-card .tabs-main-bar-item_active[data-v-3faa57f5]{color:var(--admin-core-primary-color);border-color:var(--el-border-color-light)}.tabs-main-bar--variant-card .tabs-main-bar-item_active[data-v-3faa57f5]:before,.tabs-main-bar--variant-card .tabs-main-bar-item_active[data-v-3faa57f5]:after{content:"";position:absolute;bottom:0;width:100vw;height:1px;background:var(--el-border-color-light)}.tabs-main-bar--variant-card .tabs-main-bar-item_active[data-v-3faa57f5]:before{right:100%}.tabs-main-bar--variant-card .tabs-main-bar-item_active[data-v-3faa57f5]:after{left:100%}.tabs-main-bar--variant-indicator .tabs-main-bar-item[data-v-3faa57f5]{padding:8px 16px}.tabs-main-bar--variant-indicator .tabs-main-bar-item_active[data-v-3faa57f5]{color:var(--admin-core-primary-color)}.tabs-main-bar--variant-indicator .tabs-main-bar-indicator[data-v-3faa57f5]{bottom:0;height:2px}.tabs-main-bar--variant-indicator-compact .tabs-main-bar-item[data-v-3faa57f5]{padding:6px 10px}.tabs-main-bar--variant-indicator-compact .tabs-main-bar-item_active[data-v-3faa57f5]{color:var(--admin-core-primary-color)}.tabs-main-bar--variant-indicator-compact .tabs-main-bar-indicator[data-v-3faa57f5]{bottom:0;height:1px}.tabs-main-bar--variant-plain .tabs-main-bar-item[data-v-3faa57f5]{padding:4px 8px}.tabs-main-bar--variant-plain .tabs-main-bar-item_active[data-v-3faa57f5]{color:var(--admin-core-primary-color);font-weight:600}.app-breadcrumb[data-v-9bbe0b05]{display:flex;align-items:center;justify-content:flex-start}.app-body[data-v-ae442089]{transition-duration:.3s;transition-property:padding;transition-timing-function:linear;min-height:100vh}.app-body-shim[data-v-ae442089]{width:100%;--app-viewport-max-height: var(--ae6fc168)}.app-footer[data-v-bba5d0e4]{transition-duration:.3s;transition-property:height;transition-timing-function:linear;overflow:hidden;width:100%;box-shadow:-5px 0 5px #0000001a}.app-footer-shim[data-v-bba5d0e4]{width:100%;height:100%;padding:0 20px}.app-theme[data-v-1f068b22]{display:inline-flex;align-items:center;gap:12px;margin-right:12px}.app-theme__style-select[data-v-1f068b22]{width:120px}.app-header[data-v-b47543cd]{transition-duration:.3s;transition-property:height;transition-timing-function:linear;overflow:hidden;position:fixed;left:var(--ae6f6fe0);top:var(--v4782742c);right:var(--v70971b33);box-shadow:5px 0 5px #0000001a;z-index:1}.app-header-module[data-v-b47543cd]{display:flex;flex:1;height:100%;overflow-x:auto}.app-header-module-item[data-v-b47543cd]{display:flex;justify-content:center;align-items:center;padding:0 20px;white-space:nowrap;height:100%;color:var(--fcf1a792)}.app-header-module-item[data-v-b47543cd]:hover,.app-header-module-item_active[data-v-b47543cd]{color:var(--d3910988)}.app-header-module-item_active[data-v-b47543cd]{position:relative}.app-header-module-item_active[data-v-b47543cd]:before{content:"";position:absolute;left:50%;top:0;width:100%;height:3px;background-color:var(--d3910988);transform:translate(-50%)}.app-header-shim[data-v-b47543cd]{width:100%;height:100%;display:flex;align-items:center;justify-content:space-between;padding:0 20px;font-size:18px;font-weight:700}.app-header-module-item__icon[data-v-b47543cd]{margin-right:8px}.app-header-userInfo[data-v-b47543cd]{padding-left:80px}.app-sidebar[data-v-2499f12e]{transition-duration:.3s;transition-property:width;transition-timing-function:linear;position:fixed;left:var(--f2149ac0);top:var(--v6fb5779c);bottom:var(--e0532af8);box-shadow:0 5px 5px #0000001a;overflow:visible;z-index:var(--v36eef49e)}.app-sidebar-top[data-v-2499f12e]{position:absolute;left:0;right:0;top:0;overflow:hidden}.app-sidebar-bottom[data-v-2499f12e]{position:absolute;left:0;right:0;bottom:0;overflow:hidden}.app-sidebar-shim[data-v-2499f12e]{position:absolute;left:0;right:0;top:var(--v7a209d86);bottom:var(--v0a70f74c);overflow-x:hidden;overflow-y:auto;--el-menu-border-color: transparent;-webkit-user-select:none;user-select:none}.app-sidebar-toggle[data-v-2499f12e]{position:absolute;left:100%;top:50%;transform:translate(-50%,-50%);cursor:pointer;width:22px;height:22px;border-radius:50%;background-color:var(--v1ffafb76);color:var(--v738d1dcc);border:1px solid var(--v738d1dcc);box-shadow:0 1px 2px #0000000f;display:flex;align-items:center;justify-content:center;font-size:12px;z-index:1;isolation:isolate;transition:color .3s,border-color .3s,box-shadow .3s}.app-sidebar-toggle[data-v-2499f12e]:before{content:"";position:absolute;top:-3px;right:-3px;bottom:-3px;left:-3px;border-radius:50%;background-color:var(--v738d1dcc);opacity:.18;z-index:-1;pointer-events:none;transition:opacity .3s,inset .3s}.app-sidebar-toggle[data-v-2499f12e]:active,.app-sidebar-toggle[data-v-2499f12e]:focus,.app-sidebar-toggle[data-v-2499f12e]:hover{box-shadow:0 2px 6px #0000001f}.app-sidebar-toggle[data-v-2499f12e]:active:before,.app-sidebar-toggle[data-v-2499f12e]:focus:before,.app-sidebar-toggle[data-v-2499f12e]:hover:before{opacity:.32;top:-5px;right:-5px;bottom:-5px;left:-5px}.app-sidebar-toggle-icon[data-v-2499f12e]{transition:transform .3s}.app-layout[data-v-7aeee1b9]{position:relative}.app-layout_noLogin[data-v-7aeee1b9] .app-body,.app-layout_noLogin[data-v-7aeee1b9] .app-sidebar,.app-layout_noLogin[data-v-7aeee1b9] .app-header,.app-layout_noLogin[data-v-7aeee1b9] .app-footer{transition:none!important}.app-page-shim[data-v-fda19616]{--app-viewport-max-height: var(--v54888f0e)}[data-v-64f355fe] .auto-refresh-label{display:flex;font-size:13px;color:var(--el-text-color-regular);margin-bottom:8px}.auto-refresh-group-icon--rotating[data-v-e608ff06]{animation:auto-refresh-rotating-e608ff06 1s linear infinite}@keyframes auto-refresh-rotating-e608ff06{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.form-item-nest-form[data-v-9c251e76],.form-item-nest-form-list[data-v-f424fc36]{padding:16px;border:1px solid var(--admin-core-border-color);border-radius:8px;box-shadow:var(--admin-core-shadow)}.form-item-nest-form-list-row[data-v-f424fc36]{display:flex;align-items:flex-start;gap:8px;margin-bottom:12px}.form-item-nest-form-list-row-body[data-v-f424fc36]{flex:1;min-width:0;padding:12px 16px;border:1px solid var(--el-border-color-lighter);border-radius:6px;box-shadow:var(--el-box-shadow-lighter)}.table-toolbar[data-v-6f2937e1]{display:flex;justify-content:space-between;align-items:center;padding-bottom:8px;gap:20px}.table-toolbar-left[data-v-6f2937e1],.table-toolbar-right[data-v-6f2937e1]{display:flex;align-items:center;gap:10px}.table-toolbar-switch-view[data-v-6f2937e1]{--el-switch-off-color: var(--admin-core-primary-color);--el-switch-on-color: var(--admin-core-warning-color)}.data-list-view[data-v-708af83f]{width:100%}.data-list-view-empty[data-v-708af83f]{display:flex;justify-content:center;align-items:center;width:100%;min-height:60px}.table-main-pagination[data-v-132febbc]{margin-top:10px;display:flex;justify-content:flex-end}.list-page[data-v-fc41e3d4]{min-height:var(--c6e708aa)}.list-page-header[data-v-fc41e3d4],.list-page-operation[data-v-fc41e3d4]{margin-bottom:10px}.list-page[data-v-fc41e3d4] .el-loading-mask{left:-10px;top:-10px;right:-10px;bottom:-10px}.panel-item-nest-form-actions[data-v-3af1d77a]{display:flex;justify-content:flex-end;gap:8px;margin-top:8px}
1
+ .confirm-modal[data-v-26598cb2] .el-dialog__header{margin-right:0;padding:16px 20px;border-bottom:1px solid var(--el-border-color-lighter)}.confirm-modal__title[data-v-26598cb2]{font-size:16px;font-weight:600;line-height:24px;color:var(--el-text-color-primary);text-align:left}.confirm-modal[data-v-26598cb2] .el-dialog__body{padding:20px}.confirm-modal__content[data-v-26598cb2]{overflow-x:hidden;overflow-y:auto;max-height:calc(100vh - 200px);font-size:14px;line-height:22px;color:var(--el-text-color-regular);text-align:left;word-break:break-word}.confirm-modal[data-v-26598cb2] .el-dialog__footer{padding:12px 20px;border-top:1px solid var(--el-border-color-lighter)}.confirm-modal__footer[data-v-26598cb2]{display:flex;justify-content:flex-end;align-items:center;gap:8px}.confirm-modal__footer[data-v-26598cb2] .el-button{min-width:72px}.confirm-modal__footer[reverse=true][data-v-26598cb2]{flex-direction:row-reverse}.action-confirm__title[data-v-88119b35]{font-weight:600;margin-bottom:6px}.action-confirm__content[data-v-88119b35]{margin-bottom:12px;color:var(--el-text-color-regular)}.action-confirm__actions[data-v-88119b35]{display:flex;justify-content:flex-end;gap:8px}.form-item-tip[data-v-8b508d64]{text-align:left;line-height:1.5;font-size:12px}.form-item-label-hide[data-v-8b508d64] .el-form-item__label-wrap{display:none}[data-v-8ad14c45] .el-row>.el-col>.el-form-item{margin-bottom:18px}.form-submit-panel[data-v-93bc9096]{display:flex;flex-direction:column}.form-submit-panel .form-submit-panel-form[data-v-93bc9096]{order:1}.form-submit-panel .form-submit-panel-operation[data-v-93bc9096]{order:2}.form-submit-panel .form-submit-panel-operation-inner[data-v-93bc9096]{display:flex;align-items:center;gap:8px;padding:10px 12px}.form-submit-panel .el-affix--fixed .form-submit-panel-operation-inner[data-v-93bc9096]{background-color:var(--admin-core-body-color)}.form-submit-panel_bottom-center .form-submit-panel-operation-inner[data-v-93bc9096],.form-submit-panel_bottom-right .form-submit-panel-operation-inner[data-v-93bc9096]{border-top:1px solid var(--el-border-color-light);border-bottom-left-radius:var(--admin-core-radius, var(--el-border-radius-base));border-bottom-right-radius:var(--admin-core-radius, var(--el-border-radius-base))}.form-submit-panel_bottom-center .form-submit-panel-operation-inner[data-v-93bc9096]{justify-content:center}.form-submit-panel_bottom-right .form-submit-panel-operation-inner[data-v-93bc9096]{justify-content:flex-end}.form-submit-panel_top-right .form-submit-panel-operation[data-v-93bc9096]{order:0}.form-submit-panel_top-right .form-submit-panel-operation-inner[data-v-93bc9096]{justify-content:flex-end;border-bottom:1px solid var(--el-border-color-light);border-top-left-radius:var(--admin-core-radius, var(--el-border-radius-base));border-top-right-radius:var(--admin-core-radius, var(--el-border-radius-base))}.form-submit-panel_no-divider .form-submit-panel-operation-inner[data-v-93bc9096]{border:none;border-radius:0}.form-submit-panel_bare .form-submit-panel-operation-inner[data-v-93bc9096]{padding:0}.panel-edit-switch[data-v-65f056ab]{position:relative}.panel-edit-switch:hover .panel-edit-switch-edit-btn[data-v-65f056ab]{display:block}.panel-edit-switch-edit-btn[data-v-65f056ab]{position:absolute;top:0;right:0;z-index:1;display:none}.panel-edit-switch-actions[data-v-65f056ab]{display:flex;justify-content:flex-end;gap:8px;margin-top:8px}.panel-main-item-col:not(:last-of-type) .panel-main-item-col-wrap_card[data-v-9c14b584]{margin-bottom:var(--v5b714e11)}.form-search_show[data-v-4d4d2642]{margin-bottom:10px}.form-search .btn-box[data-v-4d4d2642]{display:flex;align-items:center;gap:8px;justify-content:flex-end}.form-search .btn-box-expand-icon[data-v-4d4d2642]{margin-right:2px}.form-verify-image[data-v-669b7ad9] .el-input__suffix-inner *{margin:0}.form-verify-image-suffix[data-v-669b7ad9]{position:absolute;height:100%;border-radius:var(--el-input-border-radius, var(--admin-core-radius, var(--el-border-radius-base)));top:50%;transform:translateY(-50%);overflow:hidden;cursor:pointer}.form-verify-image-suffix-main[data-v-669b7ad9]{position:absolute;left:0;top:0;width:100%;height:100%;background-color:#f4f4f4}.tabs-main-bar[data-v-3faa57f5]{position:relative;display:flex;align-items:center}.tabs-main-bar-item[data-v-3faa57f5]{border:none;background:transparent;cursor:pointer;color:var(--el-text-color-regular);transition:background .2s,color .2s,box-shadow .2s}.tabs-main-bar-indicator[data-v-3faa57f5]{position:absolute;left:0;background:var(--admin-core-primary-color);transition:transform .2s,width .2s}.tabs-main-bar--l1 .tabs-main-bar-item[data-v-3faa57f5]{font-size:16px}.tabs-main-bar--l2 .tabs-main-bar-item[data-v-3faa57f5]{font-size:14px}.tabs-main-bar--l3 .tabs-main-bar-item[data-v-3faa57f5],.tabs-main-bar--l4 .tabs-main-bar-item[data-v-3faa57f5]{font-size:12px}.tabs-main-bar--variant-card[data-v-3faa57f5]{position:relative;overflow:hidden;gap:2px}.tabs-main-bar--variant-card .tabs-main-bar-item[data-v-3faa57f5]{position:relative;padding:8px 20px;line-height:1.4;border:1px solid transparent;border-bottom:0;border-radius:6px 6px 0 0}.tabs-main-bar--variant-card .tabs-main-bar-item[data-v-3faa57f5]:hover:not(.tabs-main-bar-item_active){color:var(--admin-core-primary-color)}.tabs-main-bar--variant-card .tabs-main-bar-item_active[data-v-3faa57f5]{color:var(--admin-core-primary-color);border-color:var(--el-border-color-light)}.tabs-main-bar--variant-card .tabs-main-bar-item_active[data-v-3faa57f5]:before,.tabs-main-bar--variant-card .tabs-main-bar-item_active[data-v-3faa57f5]:after{content:"";position:absolute;bottom:0;width:100vw;height:1px;background:var(--el-border-color-light)}.tabs-main-bar--variant-card .tabs-main-bar-item_active[data-v-3faa57f5]:before{right:100%}.tabs-main-bar--variant-card .tabs-main-bar-item_active[data-v-3faa57f5]:after{left:100%}.tabs-main-bar--variant-indicator .tabs-main-bar-item[data-v-3faa57f5]{padding:8px 16px}.tabs-main-bar--variant-indicator .tabs-main-bar-item_active[data-v-3faa57f5]{color:var(--admin-core-primary-color)}.tabs-main-bar--variant-indicator .tabs-main-bar-indicator[data-v-3faa57f5]{bottom:0;height:2px}.tabs-main-bar--variant-indicator-compact .tabs-main-bar-item[data-v-3faa57f5]{padding:6px 10px}.tabs-main-bar--variant-indicator-compact .tabs-main-bar-item_active[data-v-3faa57f5]{color:var(--admin-core-primary-color)}.tabs-main-bar--variant-indicator-compact .tabs-main-bar-indicator[data-v-3faa57f5]{bottom:0;height:1px}.tabs-main-bar--variant-plain .tabs-main-bar-item[data-v-3faa57f5]{padding:4px 8px}.tabs-main-bar--variant-plain .tabs-main-bar-item_active[data-v-3faa57f5]{color:var(--admin-core-primary-color);font-weight:600}.app-aside[data-v-d07cb9ed]{transition-duration:.3s;transition-property:width;transition-timing-function:linear;box-shadow:var(--admin-core-shadow, var(--el-box-shadow));overflow-x:hidden;overflow-y:auto;z-index:0}.app-breadcrumb[data-v-9bbe0b05]{display:flex;align-items:center;justify-content:flex-start}.app-body[data-v-ae442089]{transition-duration:.3s;transition-property:padding;transition-timing-function:linear;min-height:100vh}.app-body-shim[data-v-ae442089]{width:100%;--app-viewport-max-height: var(--ae6fc168)}.app-footer[data-v-71b2892d]{transition-duration:.3s;transition-property:height;transition-timing-function:linear;overflow:hidden;width:100%;box-shadow:var(--admin-core-shadow, var(--el-box-shadow))}.app-footer-shim[data-v-71b2892d]{width:100%;height:100%;padding:0 20px}.app-header[data-v-ef6c4b9f]{transition-duration:.3s;transition-property:height;transition-timing-function:linear;overflow:hidden;box-shadow:var(--admin-core-shadow, var(--el-box-shadow));z-index:1}.app-header-module[data-v-ef6c4b9f]{display:flex;flex:1;height:100%;overflow-x:auto}.app-header-module-item[data-v-ef6c4b9f]{display:flex;justify-content:center;align-items:center;padding:0 20px;white-space:nowrap;height:100%}.app-header-module-item[data-v-ef6c4b9f]:hover,.app-header-module-item_active[data-v-ef6c4b9f]{color:var(--v1eee7516)}.app-header-module-item_active[data-v-ef6c4b9f]{position:relative}.app-header-module-item_active[data-v-ef6c4b9f]:before{content:"";position:absolute;left:50%;top:0;width:100%;height:3px;background-color:var(--v1eee7516);transform:translate(-50%)}.app-header-shim[data-v-ef6c4b9f]{width:100%;height:100%;display:flex;align-items:center;justify-content:space-between;padding:0 20px;font-size:18px;font-weight:700}.app-header-module-item__icon[data-v-ef6c4b9f]{margin-right:8px}.app-header-right[data-v-ef6c4b9f]{padding-left:80px;display:flex;align-items:center}.app-sidebar[data-v-1dee248d]{transition-duration:.3s;transition-property:width;transition-timing-function:linear;box-shadow:var(--admin-core-shadow, var(--el-box-shadow));overflow:visible;z-index:var(--v368510bd)}.app-sidebar-top[data-v-1dee248d]{position:absolute;left:0;right:0;top:0;overflow:hidden}.app-sidebar-bottom[data-v-1dee248d]{position:absolute;left:0;right:0;bottom:0;overflow:hidden}.app-sidebar-shim[data-v-1dee248d]{position:absolute;left:0;right:0;top:var(--v7b09fce5);bottom:var(--v1098f49b);overflow-x:hidden;overflow-y:auto;--el-menu-border-color: transparent;-webkit-user-select:none;user-select:none}.app-sidebar-toggle[data-v-1dee248d]{position:absolute;left:100%;top:50%;transform:translate(-50%,-50%);cursor:pointer;width:22px;height:22px;border-radius:50%;background-color:var(--cc02eed6);color:var(--v56d0884d);border:1px solid var(--v56d0884d);box-shadow:0 1px 2px #0000000f;display:flex;align-items:center;justify-content:center;font-size:12px;z-index:1;isolation:isolate;transition:color .3s,border-color .3s,box-shadow .3s}.app-sidebar-toggle[data-v-1dee248d]:before{content:"";position:absolute;top:-3px;right:-3px;bottom:-3px;left:-3px;border-radius:50%;background-color:var(--v56d0884d);opacity:.18;z-index:-1;pointer-events:none;transition:opacity .3s,inset .3s}.app-sidebar-toggle[data-v-1dee248d]:active,.app-sidebar-toggle[data-v-1dee248d]:focus,.app-sidebar-toggle[data-v-1dee248d]:hover{box-shadow:0 2px 6px #0000001f}.app-sidebar-toggle[data-v-1dee248d]:active:before,.app-sidebar-toggle[data-v-1dee248d]:focus:before,.app-sidebar-toggle[data-v-1dee248d]:hover:before{opacity:.32;top:-5px;right:-5px;bottom:-5px;left:-5px}.app-sidebar-toggle-icon[data-v-1dee248d]{transition:transform .3s}.app-theme[data-v-89d81e34]{display:inline-flex;align-items:center;gap:12px;margin-right:12px}.app-theme__style-select[data-v-89d81e34]{width:120px}.app-layout[data-v-646eac1d]{position:relative}.app-layout_noLogin[data-v-646eac1d] .app-body,.app-layout_noLogin[data-v-646eac1d] .app-sidebar,.app-layout_noLogin[data-v-646eac1d] .app-header,.app-layout_noLogin[data-v-646eac1d] .app-footer{transition:none!important}.app-page-shim[data-v-fda19616]{--app-viewport-max-height: var(--v54888f0e)}[data-v-64f355fe] .auto-refresh-label{display:flex;font-size:13px;color:var(--el-text-color-regular);margin-bottom:8px}.auto-refresh-group-icon--rotating[data-v-e608ff06]{animation:auto-refresh-rotating-e608ff06 1s linear infinite}@keyframes auto-refresh-rotating-e608ff06{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.form-item-nest-form[data-v-12b77b02],.form-item-nest-form-list[data-v-9fa02cbe]{padding:16px;border:1px solid var(--admin-core-border-color);border-radius:8px;box-shadow:var(--admin-core-shadow, var(--el-box-shadow-lighter))}.form-item-nest-form-list-row[data-v-9fa02cbe]{display:flex;align-items:flex-start;gap:8px;margin-bottom:12px}.form-item-nest-form-list-row-body[data-v-9fa02cbe]{flex:1;min-width:0;padding:12px 16px;border:1px solid var(--el-border-color-lighter);border-radius:6px;box-shadow:var(--el-box-shadow-lighter)}.table-toolbar[data-v-6f2937e1]{display:flex;justify-content:space-between;align-items:center;padding-bottom:8px;gap:20px}.table-toolbar-left[data-v-6f2937e1],.table-toolbar-right[data-v-6f2937e1]{display:flex;align-items:center;gap:10px}.table-toolbar-switch-view[data-v-6f2937e1]{--el-switch-off-color: var(--admin-core-primary-color);--el-switch-on-color: var(--admin-core-warning-color)}.data-list-view[data-v-708af83f]{width:100%}.data-list-view-empty[data-v-708af83f]{display:flex;justify-content:center;align-items:center;width:100%;min-height:60px}.table-main-pagination[data-v-132febbc]{margin-top:10px;display:flex;justify-content:flex-end}.list-page[data-v-fc41e3d4]{min-height:var(--c6e708aa)}.list-page-header[data-v-fc41e3d4],.list-page-operation[data-v-fc41e3d4]{margin-bottom:10px}.list-page[data-v-fc41e3d4] .el-loading-mask{left:-10px;top:-10px;right:-10px;bottom:-10px}.panel-item-nest-form-actions[data-v-3af1d77a]{display:flex;justify-content:flex-end;gap:8px;margin-top:8px}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@done-coding/admin-core",
3
- "version": "0.10.0",
3
+ "version": "0.11.0",
4
4
  "description": "后台管理核心",
5
5
  "private": false,
6
6
  "main": "lib/index.cjs",
@@ -79,5 +79,5 @@
79
79
  "node": ">=18.0.0",
80
80
  "pnpm": ">=9.0.0"
81
81
  },
82
- "gitHead": "a178e085b87b9c2fd6ddbbea5065bf2a338c9931"
82
+ "gitHead": "a02bf1be515a9ed026b48573c3036fdb42f38dcc"
83
83
  }
@@ -1,5 +1,5 @@
1
1
  import { DeepReadonly } from 'vue';
2
- import { AppBaseInfo, AppLayoutHeaderConfig, AppLayoutFooterConfig, AppLayoutSidebarConfig, AppLayoutBreadcrumbConfig, AppLayoutBodyConfig, AppLayoutViewportConfig, AppThemeConfig, AppLayoutConfig } from './index';
2
+ import { AppBaseInfo, AppLayoutHeaderConfig, AppLayoutFooterConfig, AppLayoutSidebarConfig, AppLayoutAsideConfig, AppLayoutBreadcrumbConfig, AppLayoutBodyConfig, AppLayoutViewportConfig, AppLayoutGapConfig, AppThemeConfig, AppLayoutConfig } from './index';
3
3
  /**
4
4
  * 可 update 的响应式配置字段 key 联合(插件系统一期 7 个 + viewport 边框期补 1 = 8 个)。
5
5
  *
@@ -8,7 +8,7 @@ import { AppBaseInfo, AppLayoutHeaderConfig, AppLayoutFooterConfig, AppLayoutSid
8
8
  * `APP_LAYOUT_VIEWPORT_CONFIG`(同属布局子,纳入本联合 + layoutAggregate)。
9
9
  * 其余 init 字段(env / cache / router 族 / userInfoAccess)非响应式范围,[MUST NOT] 纳入本联合。
10
10
  */
11
- export type UpdatableConfigKey = "APP_BASE_INFO" | "APP_LAYOUT_HEADER_CONFIG" | "APP_LAYOUT_FOOTER_CONFIG" | "APP_LAYOUT_SIDEBAR_CONFIG" | "APP_LAYOUT_BREADCRUMB_CONFIG" | "APP_LAYOUT_BODY_CONFIG" | "APP_LAYOUT_VIEWPORT_CONFIG" | "APP_THEME_CONFIG";
11
+ export type UpdatableConfigKey = "APP_BASE_INFO" | "APP_LAYOUT_HEADER_CONFIG" | "APP_LAYOUT_FOOTER_CONFIG" | "APP_LAYOUT_SIDEBAR_CONFIG" | "APP_LAYOUT_ASIDE_CONFIG" | "APP_LAYOUT_BREADCRUMB_CONFIG" | "APP_LAYOUT_BODY_CONFIG" | "APP_LAYOUT_VIEWPORT_CONFIG" | "APP_LAYOUT_GAP_CONFIG" | "APP_THEME_CONFIG";
12
12
  /**
13
13
  * 7 个可 update 字段 key → 值类型映射。
14
14
  *
@@ -24,12 +24,16 @@ export interface UpdatableConfigMap {
24
24
  APP_LAYOUT_FOOTER_CONFIG: AppLayoutFooterConfig;
25
25
  /** 应用布局-sidebar 配置 */
26
26
  APP_LAYOUT_SIDEBAR_CONFIG: AppLayoutSidebarConfig;
27
+ /** 应用布局-aside 右侧补充区配置(P1' additive) */
28
+ APP_LAYOUT_ASIDE_CONFIG: AppLayoutAsideConfig;
27
29
  /** 应用布局-面包屑配置 */
28
30
  APP_LAYOUT_BREADCRUMB_CONFIG: AppLayoutBreadcrumbConfig;
29
31
  /** 应用布局-页面主体配置 */
30
32
  APP_LAYOUT_BODY_CONFIG: AppLayoutBodyConfig;
31
33
  /** 应用布局-视口边框配置 */
32
34
  APP_LAYOUT_VIEWPORT_CONFIG: AppLayoutViewportConfig;
35
+ /** 应用布局-模块间距配置(内缝 gap) */
36
+ APP_LAYOUT_GAP_CONFIG: AppLayoutGapConfig;
33
37
  /** 应用主题配置 */
34
38
  APP_THEME_CONFIG: AppThemeConfig;
35
39
  }
@@ -63,12 +67,16 @@ export interface BridgeConfigHook {
63
67
  roFooter: DeepReadonly<AppLayoutFooterConfig>;
64
68
  /** 应用布局-sidebar 配置对外只读视图 */
65
69
  roSidebar: DeepReadonly<AppLayoutSidebarConfig>;
70
+ /** 应用布局-aside 右侧补充区配置对外只读视图(P1' additive) */
71
+ roAside: DeepReadonly<AppLayoutAsideConfig>;
66
72
  /** 应用布局-面包屑配置对外只读视图 */
67
73
  roBreadcrumb: DeepReadonly<AppLayoutBreadcrumbConfig>;
68
74
  /** 应用布局-页面主体配置对外只读视图 */
69
75
  roBody: DeepReadonly<AppLayoutBodyConfig>;
70
76
  /** 应用布局-视口边框配置对外只读视图 */
71
77
  roViewport: DeepReadonly<AppLayoutViewportConfig>;
78
+ /** 应用布局-模块间距配置对外只读视图(内缝 gap) */
79
+ roGap: DeepReadonly<AppLayoutGapConfig>;
72
80
  /** 应用主题配置对外只读视图 */
73
81
  roTheme: DeepReadonly<AppThemeConfig>;
74
82
  /**
@@ -1,13 +1,14 @@
1
- import { App, DeepReadonly, Ref } from 'vue';
1
+ import { App, CSSProperties, DeepReadonly, Ref } from 'vue';
2
2
  import { RouteRecordRaw } from 'vue-router';
3
3
  import { createUseState } from './state';
4
4
  import { createGenerateRouteMetaRawTree } from './route';
5
5
  import { UpdatableConfigKey, UpdatableConfigMap } from './config-hook';
6
6
  import { AdminBridgePluginLike } from './plugin';
7
- import { AdminThemeModule } from './theme';
7
+ import { AdminThemeModule, AdminThemeMode, BridgeThemeLayoutState } from './theme';
8
8
  export { createUseState, type UseStateOptions } from './state';
9
9
  export { createGenerateRouteMetaRawTree, type RouteMetaDefaultConfig, } from './route';
10
10
  export { createStorageWithNamespace } from './storage';
11
+ export type { AdminThemeEntry, AdminThemeLifecycleContext, AdminThemeLifecycleHooks, AdminConfigDescription, AdminThemeModule, AdminThemeMode, AdminThemePresetLayout, BridgeThemeLayoutState, BridgeThemeLayoutBaseline, BridgeThemeHook, } from './theme';
11
12
  /**
12
13
  * 认证桥接无状态纯工厂。
13
14
  *
@@ -99,6 +100,26 @@ export interface AppThemeColor {
99
100
  /** 表面色(风格可选;core 仅挂 --admin-core-surface,EP 无对应) */
100
101
  surface?: string;
101
102
  }
103
+ /**
104
+ * 布局模块 `style` 逃生舱排除的「引擎托管键」联合(甲方终锁键集)。
105
+ *
106
+ * 这些 CSS 属性由布局引擎(store/app 几何 calc + 主题色兜底 + fixed 定位 + sidebar/aside
107
+ * 让位)独占计算,消费方 `style` [MUST NOT] 染指——否则破布局。分类:
108
+ * - 尺寸:width / height(几何算)
109
+ * - 定位:position / top / right / bottom / left / inset(fixed 锚点)
110
+ * - 显示 / 盒外:display(破布局流)/ margin 家族(破 fixed 定位)
111
+ * - 盒内:padding 家族(sidebar/aside 用 paddingTop 让位 header,整族锁防破让位)
112
+ * - 颜色:color / background / backgroundColor(走 config.color|background + --admin-core-* 兜底,规则 14)
113
+ */
114
+ type AppLayoutManagedStyleKey = "width" | "height" | "position" | "top" | "right" | "bottom" | "left" | "inset" | "display" | "margin" | "marginTop" | "marginRight" | "marginBottom" | "marginLeft" | "padding" | "paddingTop" | "paddingRight" | "paddingBottom" | "paddingLeft" | "color" | "background" | "backgroundColor";
115
+ /**
116
+ * 布局模块(Header/Footer/Sidebar/Aside)`style` 逃生舱类型。
117
+ *
118
+ * = `Omit<CSSProperties, 托管键>`——消费方显式自定义装饰(borderRadius / boxShadow /
119
+ * border / backdropFilter / opacity / transition 等),走规则 14「组件 prop 显式自定义值
120
+ * → 内联 :style 直值」例外条款。托管键经类型 `Omit` 编译期拦截 + store 合并运行时压过(双保险)。
121
+ */
122
+ export type AppLayoutModuleStyle = Omit<CSSProperties, AppLayoutManagedStyleKey>;
102
123
  /**
103
124
  * `store/app.ts` 实际消费的 app config 子集结构。
104
125
  *
@@ -112,15 +133,27 @@ export interface AppConfig {
112
133
  /** 应用名称 */
113
134
  name: string;
114
135
  };
115
- /** 应用布局-header 配置(store/app 仅取 height) */
136
+ /** 应用布局-header 配置 */
116
137
  APP_LAYOUT_HEADER_CONFIG: {
117
138
  /** header 高度(px) */
118
139
  height: number;
140
+ /** 字体色;缺省 → 不写 color、CSS 继承 :root 全局 color(= baseColor);[MUST NOT] 写死字面量 */
141
+ color?: string;
142
+ /** 背景(color / image / gradient 等 CSS background);缺省 → bodyColor(经 --admin-core-* var);[MUST NOT] 写死字面量 */
143
+ background?: string;
144
+ /** 装饰逃生舱(borderRadius/boxShadow/... ;排除引擎托管键,见 {@link AppLayoutModuleStyle}) */
145
+ style?: AppLayoutModuleStyle;
119
146
  };
120
- /** 应用布局-footer 配置(store/app 仅取 height) */
147
+ /** 应用布局-footer 配置 */
121
148
  APP_LAYOUT_FOOTER_CONFIG: {
122
149
  /** footer 高度(px) */
123
150
  height: number;
151
+ /** 字体色;缺省 → 继承 :root color(baseColor) */
152
+ color?: string;
153
+ /** 背景(color / image / gradient 等 CSS background);缺省 → bodyColor */
154
+ background?: string;
155
+ /** 装饰逃生舱(见 {@link AppLayoutModuleStyle}) */
156
+ style?: AppLayoutModuleStyle;
124
157
  };
125
158
  /** 应用布局-sidebar 配置(store/app 取 collapseWidth / width) */
126
159
  APP_LAYOUT_SIDEBAR_CONFIG: {
@@ -128,12 +161,44 @@ export interface AppConfig {
128
161
  width: number;
129
162
  /** 折叠起来的宽度(px) */
130
163
  collapseWidth: number;
164
+ /** 字体色;缺省 → 继承 :root color(baseColor) */
165
+ color?: string;
166
+ /** 背景(color / image / gradient 等 CSS background);缺省 → bodyColor */
167
+ background?: string;
168
+ /** 装饰逃生舱(见 {@link AppLayoutModuleStyle}) */
169
+ style?: AppLayoutModuleStyle;
170
+ };
171
+ /**
172
+ * 应用布局-aside 右侧补充区配置(P1' 新增 additive,对称 sidebar)。
173
+ * 仅自定义 shell 渲染右侧区时生效;不配则 aside 不存在(经典布局零影响)。
174
+ */
175
+ APP_LAYOUT_ASIDE_CONFIG: {
176
+ /** aside 宽度(px) */
177
+ width: number;
178
+ /** 字体色;缺省 → 继承 :root color(baseColor) */
179
+ color?: string;
180
+ /** 背景(color / image / gradient 等 CSS background);缺省 → bodyColor */
181
+ background?: string;
182
+ /** 装饰逃生舱(见 {@link AppLayoutModuleStyle}) */
183
+ style?: AppLayoutModuleStyle;
131
184
  };
132
185
  /** 应用布局-页面主体配置(store/app 仅取 shimPadding) */
133
186
  APP_LAYOUT_BODY_CONFIG: {
134
187
  /** 页面主体 padding - 默认值(px) */
135
188
  shimPadding: number;
136
189
  };
190
+ /**
191
+ * 应用布局-模块间距配置(内缝;模块间露 size px 底色条带,漏出 .app-body 的 bodyColor)。
192
+ *
193
+ * 与 viewport 边框(整体外框)正交:gap 是模块**之间**的缝。默认 `{ size: 0 }` = 模块贴合、
194
+ * 现状不变;`size>0` 时 store 几何 calc 在相邻模块间叠加该间距(缺位侧不留悬空缝)。
195
+ * 分离观感需模块 `background` 为 surface 色(≠ bodyColor),由 preset/消费方设。
196
+ * 布局插件经 `bridge.update("APP_LAYOUT_GAP_CONFIG", { size })` 设值。
197
+ */
198
+ APP_LAYOUT_GAP_CONFIG: {
199
+ /** 模块间距(px);缺省 0 = 贴合 */
200
+ size: number;
201
+ };
137
202
  /**
138
203
  * 应用布局-视口边框配置(整个 app-shell 相对浏览器视口四边内缩,套"边框"留白观感)。
139
204
  *
@@ -166,6 +231,8 @@ export interface AppConfig {
166
231
  showFooter: boolean;
167
232
  /** 各路由[未配置情况下]默认是否展示 sidebar */
168
233
  showSidebar: boolean;
234
+ /** 各路由[未配置情况下]默认是否展示右侧 aside(additive 可选;缺省 false,store `?? false` 兜底) */
235
+ showAside?: boolean;
169
236
  /** 默认是否展示 breadcrumb */
170
237
  showBreadcrumb: boolean;
171
238
  /** 各路由[未配置情况下]默认是否展示在菜单 */
@@ -214,12 +281,16 @@ export interface AppLayoutConfig {
214
281
  footer: AppConfig["APP_LAYOUT_FOOTER_CONFIG"];
215
282
  /** sidebar 配置 */
216
283
  sidebar: AppConfig["APP_LAYOUT_SIDEBAR_CONFIG"];
284
+ /** aside 右侧补充区配置(P1' additive) */
285
+ aside: AppConfig["APP_LAYOUT_ASIDE_CONFIG"];
217
286
  /** 面包屑配置 */
218
287
  breadcrumb: AppLayoutBreadcrumbConfig;
219
288
  /** 页面主体配置 */
220
289
  body: AppConfig["APP_LAYOUT_BODY_CONFIG"];
221
290
  /** 视口边框配置 */
222
291
  viewport: AppConfig["APP_LAYOUT_VIEWPORT_CONFIG"];
292
+ /** 模块间距配置(内缝 gap) */
293
+ gap: AppConfig["APP_LAYOUT_GAP_CONFIG"];
223
294
  }
224
295
  /**
225
296
  * 应用路由配置(#2.5 期新增,per ADR-6)。
@@ -272,10 +343,14 @@ export type AppLayoutHeaderConfig = AppConfig["APP_LAYOUT_HEADER_CONFIG"];
272
343
  export type AppLayoutFooterConfig = AppConfig["APP_LAYOUT_FOOTER_CONFIG"];
273
344
  /** 应用布局-sidebar 配置 type 别名 */
274
345
  export type AppLayoutSidebarConfig = AppConfig["APP_LAYOUT_SIDEBAR_CONFIG"];
346
+ /** 应用布局-aside 右侧补充区配置 type 别名(P1' additive) */
347
+ export type AppLayoutAsideConfig = AppConfig["APP_LAYOUT_ASIDE_CONFIG"];
275
348
  /** 应用布局-页面主体配置 type 别名 */
276
349
  export type AppLayoutBodyConfig = AppConfig["APP_LAYOUT_BODY_CONFIG"];
277
350
  /** 应用布局-视口边框配置 type 别名 */
278
351
  export type AppLayoutViewportConfig = AppConfig["APP_LAYOUT_VIEWPORT_CONFIG"];
352
+ /** 应用布局-模块间距配置 type 别名(内缝 gap) */
353
+ export type AppLayoutGapConfig = AppConfig["APP_LAYOUT_GAP_CONFIG"];
279
354
  /** 应用主题配置 type 别名 */
280
355
  export type AppThemeConfig = AppConfig["APP_THEME_CONFIG"];
281
356
  /** 应用路由元信息默认配置 type 别名 */
@@ -351,6 +426,11 @@ export interface AdminBridgeInitOptions<UserInfo = unknown> {
351
426
  APP_LAYOUT_FOOTER_CONFIG: AppLayoutFooterConfig;
352
427
  /** 应用布局-sidebar 配置 */
353
428
  APP_LAYOUT_SIDEBAR_CONFIG: AppLayoutSidebarConfig;
429
+ /**
430
+ * 应用布局-aside 右侧补充区配置(P1' 新增 additive,可选;app 不传时核内默认 width 0)。
431
+ * 默认 shell 也渲染 AppAside(宽 0 不可见);app/preset 加宽即启用,经典布局零影响。
432
+ */
433
+ APP_LAYOUT_ASIDE_CONFIG?: Partial<AppLayoutAsideConfig>;
354
434
  /** 应用布局-面包屑配置(#2.5 期新增字段) */
355
435
  APP_LAYOUT_BREADCRUMB_CONFIG: AppLayoutBreadcrumbConfig;
356
436
  /** 应用布局-页面主体配置 */
@@ -360,6 +440,11 @@ export interface AdminBridgeInitOptions<UserInfo = unknown> {
360
440
  * 传部分字段时与默认四边 0 浅合并(见 createAdminBridge 内 DEFAULT 合并)。
361
441
  */
362
442
  APP_LAYOUT_VIEWPORT_CONFIG?: Partial<AppLayoutViewportConfig>;
443
+ /**
444
+ * 应用布局-模块间距配置(可选;app 不传时核内默认 `{ size: 0 }` = 模块贴合、现状不变)。
445
+ * 布局插件经 preset.layout.gap 或 `bridge.update` 设值。
446
+ */
447
+ APP_LAYOUT_GAP_CONFIG?: Partial<AppLayoutGapConfig>;
363
448
  /** 应用路由元信息默认配置(bridge 内部 generateRouteMetaRawTree 派生) */
364
449
  APP_ROUTER_META_DEFAULT_CONFIG: AppRouterMetaDefaultConfig;
365
450
  /** 应用路由配置(#2.5 期新增字段) */
@@ -423,12 +508,16 @@ export interface AdminBridge<UserInfo = unknown, LoginParams = unknown> {
423
508
  readonly APP_LAYOUT_FOOTER_CONFIG: DeepReadonly<AppLayoutFooterConfig>;
424
509
  /** 应用布局-sidebar 配置(per #2.5 期 REQ-1) */
425
510
  readonly APP_LAYOUT_SIDEBAR_CONFIG: DeepReadonly<AppLayoutSidebarConfig>;
511
+ /** 应用布局-aside 右侧补充区配置(P1' additive,响应式只读视图) */
512
+ readonly APP_LAYOUT_ASIDE_CONFIG: DeepReadonly<AppLayoutAsideConfig>;
426
513
  /** 应用布局-面包屑配置(per #2.5 期 REQ-1) */
427
514
  readonly APP_LAYOUT_BREADCRUMB_CONFIG: DeepReadonly<AppLayoutBreadcrumbConfig>;
428
515
  /** 应用布局-页面主体配置(per #2.5 期 REQ-1) */
429
516
  readonly APP_LAYOUT_BODY_CONFIG: DeepReadonly<AppLayoutBodyConfig>;
430
517
  /** 应用布局-视口边框配置(响应式只读视图,经 bridge.update 跟随) */
431
518
  readonly APP_LAYOUT_VIEWPORT_CONFIG: DeepReadonly<AppLayoutViewportConfig>;
519
+ /** 应用布局-模块间距配置(内缝 gap;响应式只读视图,经 bridge.update 跟随) */
520
+ readonly APP_LAYOUT_GAP_CONFIG: DeepReadonly<AppLayoutGapConfig>;
432
521
  /** 应用布局聚合配置(per #2.5 期 ADR-3 bridge 内部聚合派生) */
433
522
  readonly APP_LAYOUT_CONFIG: DeepReadonly<AppLayoutConfig>;
434
523
  /** 应用路由元信息默认配置(per #2.5 期 REQ-1) */
@@ -449,8 +538,19 @@ export interface AdminBridge<UserInfo = unknown, LoginParams = unknown> {
449
538
  readonly theme: AdminThemeModule;
450
539
  /** 当前风格名(响应式只读真相源;[MUST NOT] 解构/快照取值,⚠️ 切换后定格) */
451
540
  readonly themeStyle: DeepReadonly<Ref<string>>;
452
- /** 是否暗色(响应式只读真相源;appStore.isDarkTheme 读此、挂值 composable toggle .dark 读此) */
541
+ /** 明暗模式三态真相源(响应式只读;亮/暗/跟随系统)。`theme.setMode` 切换;themeIsDark 由本 mode 派生。 */
542
+ readonly themeMode: DeepReadonly<Ref<AdminThemeMode>>;
543
+ /** 是否暗色(响应式只读 **派生**;= mode==='system'?系统偏暗:mode==='dark'。appStore.isDarkTheme / 挂值 composable 读此) */
453
544
  readonly themeIsDark: DeepReadonly<Ref<boolean>>;
545
+ /**
546
+ * 当前 preset 的 layout 运行时维度(响应式只读真相源)。
547
+ *
548
+ * = `{ shell?, extractLevel1ToHeader }`——AppLayout 直读:`shell` 缺省回退内置默认
549
+ * AppShell(经典布局);`extractLevel1ToHeader` 驱动菜单分流。尺寸 / 套框纯数据维度
550
+ * 经 `theme.setStyle` 灌进 bridge 响应式布局 config(基线复位 + 叠加),不在此重复。
551
+ * [MUST NOT] 解构/快照(⚠️ 切换 preset 后定格)。
552
+ */
553
+ readonly themeLayout: DeepReadonly<Ref<BridgeThemeLayoutState>>;
454
554
  /**
455
555
  * 当前生效的 JS 主题色(输出 B:JS 色值直给,与挂值 composable 的 cssvar 输出 A 对称)。
456
556
  *
@@ -0,0 +1,10 @@
1
+ import { BridgeThemeHook, BridgeThemeInit } from './types';
2
+ /**
3
+ * bridge 主题 hook 工厂。
4
+ *
5
+ * 每次 `createAdminBridge` 调用各自闭包内构造一份(零模块级单例,守实例隔离)。
6
+ * init:自动 `add('default', initConfig)`;读持久化恢复 `themeMode` 即时生效、
7
+ * `themeStyle` 走「desiredStyle 命中再 apply」时序(插件后注册风格亦能恢复)。
8
+ */
9
+ export declare function createBridgeThemeHook(init: BridgeThemeInit): BridgeThemeHook;
10
+ export type { AdminThemePresetLayout, AdminConfigDescription, AdminThemeLifecycleContext, AdminThemeLifecycleHooks, AdminThemeEntry, AdminThemeMode, AdminThemeModule, BridgeThemeLayoutState, BridgeThemeHook, BridgeThemeLayoutBaseline, BridgeThemeInit, } from './types';
@@ -0,0 +1,23 @@
1
+ import { StorageLike } from '../index';
2
+ import { AdminThemeMode } from './types';
3
+ /**
4
+ * bridge 主题模块**持久化**子模块(升级目录拆出)。
5
+ *
6
+ * 负责 localStorage 形态的读取 / 兼容迁移:v2 存 `{themeStyle,themeMode}`,读时兼容
7
+ * 旧 v1 `themeIsDark` 布尔。写入(`persist()`)在工厂内闭包,复用本文件的 shape 类型。
8
+ */
9
+ /** core 主题持久化的命名空间 key(命名空间前缀已由 storage 加);缺省值。 */
10
+ export declare const DEFAULT_STORAGE_KEY = "admin-core-theme";
11
+ /** 持久化载荷(v2:明暗存 mode 三态,取代旧 themeIsDark 布尔)。 */
12
+ export interface ThemePersistShape {
13
+ /** 当前风格名 */
14
+ themeStyle: string;
15
+ /** 明暗模式三态(亮/暗/跟随系统) */
16
+ themeMode: AdminThemeMode;
17
+ }
18
+ /** 读持久化的兼容形态:除 v2 字段外,兼容旧 v1 `themeIsDark` 布尔(迁移用)。 */
19
+ export type ThemePersistRead = Partial<ThemePersistShape & {
20
+ themeIsDark: boolean;
21
+ }>;
22
+ /** 读持久化(JSON.parse 容错;非法/缺失返 null)。返回兼容形态(含旧 themeIsDark)。 */
23
+ export declare const readPersist: (storage: StorageLike, key: string) => ThemePersistRead | null;
@@ -0,0 +1,14 @@
1
+ /**
2
+ * bridge 主题模块**系统明暗探测**子模块(升级目录拆出)。
3
+ *
4
+ * `prefers-color-scheme: dark` 的一次性读取 + 变更监听;无 matchMedia(SSR / 老环境)
5
+ * 安全降级。`system` 明暗态下 `themeIsDark` 经此派生。
6
+ */
7
+ /** 读系统是否偏暗(`prefers-color-scheme: dark`);无 matchMedia(SSR / 老环境)→ false。 */
8
+ export declare const readSystemPrefersDark: () => boolean;
9
+ /**
10
+ * 监听系统明暗变化,变更时回调最新值;返回清理函数。
11
+ * bridge 为 app 单例无 teardown,当前不主动清理(listener 随 app 常驻,可接受);
12
+ * 返回清理函数留作未来 dispose / 测试用。无 matchMedia → noop。
13
+ */
14
+ export declare const watchSystemPrefersDark: (cb: (isDark: boolean) => void) => (() => void);