umbraco-modals by umbraco/umbraco-cms-backoffice-skills
npx skills add https://github.com/umbraco/umbraco-cms-backoffice-skills --skill umbraco-modals模态框是一种弹出层,它会变暗周围环境并带有焦点锁定功能。模态框扩展类型用于在 Umbraco 后台配置和呈现对话框和侧边栏。模态框可以通过路由(用于深度链接)或使用模态框管理器上下文在运行时打开,并且它们使用基于令牌的系统进行类型安全的通信。
在实现之前,请务必获取最新的文档:
Umbraco 源代码包含可运行的示例:
自定义模态框位置 : /Umbraco-CMS/src/Umbraco.Web.UI.Client/examples/custom-modal/
广告位招租
在这里展示您的产品或服务
触达数万 AI 开发者,精准高效
此示例演示了一个包含令牌、元素和清单的基本自定义模态框。
路由模态框位置 : /Umbraco-CMS/src/Umbraco.Web.UI.Client/examples/modal-routed/
此示例演示了可以通过 URL 路由打开以支持深度链接的模态框。
如果在实现模态框时需要解释这些基础概念,请参考以下技能:
上下文 API : 当实现模态框管理器上下文、使用 consumeContext 模式或解释如何打开模态框时
umbraco-context-apiUmbraco 元素 : 当实现模态框元素、解释 UmbLitElement 或创建模态框组件时
umbraco-umbraco-element状态管理 : 当实现模态框数据流、模态框值或模态框与调用者之间的状态管理时
umbraco-state-managementimport { UmbModalToken } from '@umbraco-cms/backoffice/modal';
export interface MyModalData {
title: string;
}
export interface MyModalValue {
confirmed: boolean;
}
export const MY_MODAL_TOKEN = new UmbModalToken<MyModalData, MyModalValue>(
'My.Modal',
{
modal: {
type: 'sidebar',
size: 'small',
},
}
);
import { html, customElement } from '@umbraco-cms/backoffice/external/lit';
import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element';
import { UmbModalExtensionElement } from '@umbraco-cms/backoffice/modal';
@customElement('my-modal')
export class MyModalElement extends UmbLitElement
implements UmbModalExtensionElement<MyModalData, MyModalValue> {
modalContext: any;
#handleSubmit() {
this.modalContext.updateValue({ confirmed: true });
this.modalContext.submit();
}
render() {
return html`
<umb-body-layout headline="${this.modalContext?.data?.title}">
<uui-box>
<p>模态框内容在此</p>
<uui-button @click="${this.#handleSubmit}">
确认
</uui-button>
</uui-box>
</umb-body-layout>
`;
}
}
export default MyModalElement;
export const manifests = [
{
type: 'modal',
alias: 'My.Modal',
name: '我的模态框',
element: () => import('./modal.element.js'),
},
];
import { UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal';
import { MY_MODAL_TOKEN } from './modal-token.js';
// 在你的元素中:
constructor() {
super();
this.consumeContext(UMB_MODAL_MANAGER_CONTEXT, (context) => {
this._modalManager = context;
});
}
async openModal() {
const result = await this._modalManager?.open(this, MY_MODAL_TOKEN, {
data: { title: '我的模态框' }
});
if (result?.confirmed) {
console.log('用户已确认!');
}
}
就是这样!请务必获取最新的文档,保持示例简洁,并生成完整可运行的代码。
每周安装量
76
代码仓库
GitHub 星标数
17
首次出现
2026年2月4日
安全审计
安装于
github-copilot56
cursor25
opencode24
codex24
gemini-cli22
amp22
A modal is a popup layer that darkens the surroundings and comes with a focus lock. The modal extension type is used to configure and present dialogs and sidebars within the Umbraco backoffice. Modals can be opened via routes (for deep-linking) or at runtime using the Modal Manager Context, and they use a token-based system for type-safe communication.
Always fetch the latest docs before implementing:
The Umbraco source includes working examples:
Custom Modal Location : /Umbraco-CMS/src/Umbraco.Web.UI.Client/examples/custom-modal/
This example demonstrates a basic custom modal with token, element, and manifest.
Routed Modal Location : /Umbraco-CMS/src/Umbraco.Web.UI.Client/examples/modal-routed/
This example demonstrates modals that can be opened via URL routing for deep-linking support.
If you need to explain these foundational concepts when implementing modals, reference these skills:
Context API : When implementing modal manager context, consumeContext patterns, or explaining how to open modals
umbraco-context-apiUmbraco Element : When implementing modal elements, explaining UmbLitElement, or creating modal components
umbraco-umbraco-elementState Management : When implementing modal data flow, modal values, or state management between modal and caller
umbraco-state-managementimport { UmbModalToken } from '@umbraco-cms/backoffice/modal';
export interface MyModalData {
title: string;
}
export interface MyModalValue {
confirmed: boolean;
}
export const MY_MODAL_TOKEN = new UmbModalToken<MyModalData, MyModalValue>(
'My.Modal',
{
modal: {
type: 'sidebar',
size: 'small',
},
}
);
import { html, customElement } from '@umbraco-cms/backoffice/external/lit';
import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element';
import { UmbModalExtensionElement } from '@umbraco-cms/backoffice/modal';
@customElement('my-modal')
export class MyModalElement extends UmbLitElement
implements UmbModalExtensionElement<MyModalData, MyModalValue> {
modalContext: any;
#handleSubmit() {
this.modalContext.updateValue({ confirmed: true });
this.modalContext.submit();
}
render() {
return html`
<umb-body-layout headline="${this.modalContext?.data?.title}">
<uui-box>
<p>Modal content here</p>
<uui-button @click="${this.#handleSubmit}">
Confirm
</uui-button>
</uui-box>
</umb-body-layout>
`;
}
}
export default MyModalElement;
export const manifests = [
{
type: 'modal',
alias: 'My.Modal',
name: 'My Modal',
element: () => import('./modal.element.js'),
},
];
import { UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal';
import { MY_MODAL_TOKEN } from './modal-token.js';
// In your element:
constructor() {
super();
this.consumeContext(UMB_MODAL_MANAGER_CONTEXT, (context) => {
this._modalManager = context;
});
}
async openModal() {
const result = await this._modalManager?.open(this, MY_MODAL_TOKEN, {
data: { title: 'My Modal' }
});
if (result?.confirmed) {
console.log('User confirmed!');
}
}
That's it! Always fetch fresh docs, keep examples minimal, generate complete working code.
Weekly Installs
76
Repository
GitHub Stars
17
First Seen
Feb 4, 2026
Security Audits
Gen Agent Trust HubPassSocketPassSnykWarn
Installed on
github-copilot56
cursor25
opencode24
codex24
gemini-cli22
amp22
Genkit JS 开发指南:AI 应用构建、错误排查与最佳实践
7,700 周安装
Sentry 错误追踪指南:Node.js/Python 异常监控、性能分析与最佳实践
162 周安装
iOS TestFlight崩溃调查指南:使用Xcode Organizer快速定位与修复Beta测试问题
162 周安装
iOS小组件与扩展开发指南:解决数据更新、实时活动与控制中心问题
161 周安装
会话管理最佳实践:JWT令牌、CSRF防护、Redis存储与安全实现指南
161 周安装
AI智能体上下文管理技能context-surfing:防止漂移与幻觉,实现高保真执行
168 周安装
AI安全文档生成工具 | 一键创建合规策略、安全指南与最佳实践
162 周安装