移动目录

This commit is contained in:
CrescentLeaf
2025-11-23 13:27:15 +08:00
parent f13623f4fc
commit 1cb8ac3fff
479 changed files with 49 additions and 49 deletions

109
mdui_patched/components/chip/index.d.ts vendored Normal file
View File

@@ -0,0 +1,109 @@
import '@mdui/shared/icons/check.js';
import '@mdui/shared/icons/clear.js';
import { ButtonBase } from '../button/button-base.js';
import '../icon.js';
import type { Ripple } from '../ripple/index.js';
import type { CSSResultGroup, PropertyValues, TemplateResult } from 'lit';
/**
* @summary 纸片组件
*
* ```html
* <mdui-chip>Chip</mdui-chip>
* ```
*
* @event focus - 获得焦点时触发
* @event blur - 失去焦点时触发
* @event invalid - 表单字段验证未通过时触发
* @event change - 选中状态变更时触发
* @event delete - 点击删除图标时触发
*
* @slot - 纸片文本
* @slot icon - 左侧元素
* @slot end-icon - 右侧元素
* @slot selected-icon - 选中状态下的左侧元素
* @slot delete-icon - 可删除时的右侧删除元素
*
* @csspart button - 内部的 `<button>` 或 `<a>` 元素
* @csspart label - 纸片文本
* @csspart icon - 左侧图标
* @csspart end-icon - 右侧图标
* @csspart selected-icon - 选中状态下的左侧图标
* @csspart delete-icon - 可删除时的右侧删除图标
* @csspart loading - 加载中状态的 `<mdui-circular-progress>` 元素
*
* @cssprop --shape-corner - 组件的圆角大小。可以指定一个具体的像素值;但更推荐引用[设计令牌](/docs/2/styles/design-tokens#shape-corner)
*/
export declare class Chip extends ButtonBase<ChipEventMap> {
static styles: CSSResultGroup;
/**
* 纸片的形状。可选值包括:
*
* * `assist`:用于显示与当前上下文相关的辅助操作,如在点餐页面提供分享、收藏等功能
* * `filter`:用于对内容进行筛选,如在搜索结果页过滤搜索结果
* * `input`:用于表示用户输入的信息片段,如在 Gmail 的“收件人”字段中的联系人
* * `suggestion`:用于提供动态生成的推荐信息,以简化用户操作,如在聊天应用中预测用户可能想发送的信息
*/
variant: /*用于显示与当前上下文相关的辅助操作,如在点餐页面提供分享、收藏等功能*/ 'assist' | /*用于对内容进行筛选,如在搜索结果页过滤搜索结果*/ 'filter' | /*用于表示用户输入的信息片段,如在 Gmail 的“收件人”字段中的联系人*/ 'input' | /*用于提供动态生成的推荐信息,以简化用户操作,如在聊天应用中预测用户可能想发送的信息*/ 'suggestion';
/**
* 是否显示阴影
*/
elevated: boolean;
/**
* 是否可选中
*/
selectable: boolean;
/**
* 是否已选中
*/
selected: boolean;
/**
* 是否可删除。为 `true` 时,纸片右侧会显示删除图标
*/
deletable: boolean;
/**
* 左侧的 Material Icons 图标名。也可以通过 `slot="icon"` 设置
*/
icon?: string;
/**
* 选中状态下左侧的 Material Icons 图标名。也可以通过 `slot="selected-icon"` 设置
*/
selectedIcon?: string;
/**
* 右侧的 Material Icons 图标名。也可以通过 `slot="end-icon"` 设置
*/
endIcon?: string;
/**
* 可删除时,右侧删除图标的 Material Icons 图标名。也可以通过 `slot="delete-icon"` 设置
*/
deleteIcon?: string;
private readonly rippleRef;
private readonly hasSlotController;
constructor();
protected get rippleElement(): Ripple;
private onSelectedChange;
protected firstUpdated(changedProperties: PropertyValues): void;
protected render(): TemplateResult;
private onClick;
private onKeyDown;
/**
* 点击删除按钮
*/
private onDelete;
private renderIcon;
private renderLabel;
private renderEndIcon;
private renderDeleteIcon;
private renderInner;
}
export interface ChipEventMap {
focus: FocusEvent;
blur: FocusEvent;
invalid: CustomEvent<void>;
change: CustomEvent<void>;
delete: CustomEvent<void>;
}
declare global {
interface HTMLElementTagNameMap {
'mdui-chip': Chip;
}
}

View File

@@ -0,0 +1,243 @@
import { __decorate } from "tslib";
import { html } from 'lit';
import { customElement, property } from 'lit/decorators.js';
import { createRef, ref } from 'lit/directives/ref.js';
import cc from 'classcat';
import { HasSlotController } from '@mdui/shared/controllers/has-slot.js';
import { watch } from '@mdui/shared/decorators/watch.js';
import { booleanConverter } from '@mdui/shared/helpers/decorator.js';
import { nothingTemplate } from '@mdui/shared/helpers/template.js';
import '@mdui/shared/icons/check.js';
import '@mdui/shared/icons/clear.js';
import { ButtonBase } from '../button/button-base.js';
import '../icon.js';
import { style } from './style.js';
/**
* @summary 纸片组件
*
* ```html
* <mdui-chip>Chip</mdui-chip>
* ```
*
* @event focus - 获得焦点时触发
* @event blur - 失去焦点时触发
* @event invalid - 表单字段验证未通过时触发
* @event change - 选中状态变更时触发
* @event delete - 点击删除图标时触发
*
* @slot - 纸片文本
* @slot icon - 左侧元素
* @slot end-icon - 右侧元素
* @slot selected-icon - 选中状态下的左侧元素
* @slot delete-icon - 可删除时的右侧删除元素
*
* @csspart button - 内部的 `<button>` 或 `<a>` 元素
* @csspart label - 纸片文本
* @csspart icon - 左侧图标
* @csspart end-icon - 右侧图标
* @csspart selected-icon - 选中状态下的左侧图标
* @csspart delete-icon - 可删除时的右侧删除图标
* @csspart loading - 加载中状态的 `<mdui-circular-progress>` 元素
*
* @cssprop --shape-corner - 组件的圆角大小。可以指定一个具体的像素值;但更推荐引用[设计令牌](/docs/2/styles/design-tokens#shape-corner)
*/
let Chip = class Chip extends ButtonBase {
constructor() {
super();
/**
* 纸片的形状。可选值包括:
*
* * `assist`:用于显示与当前上下文相关的辅助操作,如在点餐页面提供分享、收藏等功能
* * `filter`:用于对内容进行筛选,如在搜索结果页过滤搜索结果
* * `input`:用于表示用户输入的信息片段,如在 Gmail 的“收件人”字段中的联系人
* * `suggestion`:用于提供动态生成的推荐信息,以简化用户操作,如在聊天应用中预测用户可能想发送的信息
*/
this.variant = 'assist';
/**
* 是否显示阴影
*/
this.elevated = false;
/**
* 是否可选中
*/
this.selectable = false;
/**
* 是否已选中
*/
this.selected = false;
/**
* 是否可删除。为 `true` 时,纸片右侧会显示删除图标
*/
this.deletable = false;
this.rippleRef = createRef();
this.hasSlotController = new HasSlotController(this, 'icon', 'selected-icon', 'end-icon');
this.onClick = this.onClick.bind(this);
this.onKeyDown = this.onKeyDown.bind(this);
}
get rippleElement() {
return this.rippleRef.value;
}
onSelectedChange() {
this.emit('change');
}
firstUpdated(changedProperties) {
super.firstUpdated(changedProperties);
this.addEventListener('click', this.onClick);
this.addEventListener('keydown', this.onKeyDown);
}
render() {
const hasIcon = this.icon || this.hasSlotController.test('icon');
const hasEndIcon = this.endIcon || this.hasSlotController.test('end-icon');
const hasSelectedIcon = this.selectedIcon ||
['assist', 'filter'].includes(this.variant) ||
hasIcon ||
this.hasSlotController.test('selected-icon');
const className = cc({
button: true,
'has-icon': this.loading ||
(!this.selected && hasIcon) ||
(this.selected && hasSelectedIcon),
'has-end-icon': hasEndIcon,
});
return html `<mdui-ripple ${ref(this.rippleRef)} .noRipple="${this.noRipple}"></mdui-ripple>${this.isButton()
? this.renderButton({
className,
part: 'button',
content: this.renderInner(),
})
: this.disabled || this.loading
? html `<span part="button" class="${className} _a">${this.renderInner()}</span>`
: this.renderAnchor({
className,
part: 'button',
content: this.renderInner(),
})}`;
}
onClick() {
if (this.disabled || this.loading) {
return;
}
// 点击时,切换选中状态
if (this.selectable) {
this.selected = !this.selected;
}
}
onKeyDown(event) {
if (this.disabled || this.loading) {
return;
}
// 按下空格键时,切换选中状态
if (this.selectable && event.key === ' ') {
event.preventDefault();
this.selected = !this.selected;
}
// 按下 Delete 或 BackSpace 键时,触发 delete 事件
if (this.deletable && ['Delete', 'Backspace'].includes(event.key)) {
this.emit('delete');
}
}
/**
* 点击删除按钮
*/
onDelete(event) {
event.stopPropagation();
this.emit('delete');
}
renderIcon() {
if (this.loading) {
return this.renderLoading();
}
const icon = () => {
return this.icon
? html `<mdui-icon name="${this.icon}" class="i"></mdui-icon>`
: nothingTemplate;
};
const selectedIcon = () => {
if (this.selectedIcon) {
return html `<mdui-icon name="${this.selectedIcon}" class="i"></mdui-icon>`;
}
if (this.variant === 'assist' || this.variant === 'filter') {
return html `<mdui-icon-check class="i"></mdui-icon-check>`;
}
return icon();
};
return !this.selected
? html `<slot name="icon" part="icon" class="icon">${icon()}</slot>`
: html `<slot name="selected-icon" part="selected-icon" class="selected-icon">${selectedIcon()}</slot>`;
}
renderLabel() {
return html `<slot part="label" class="label"></slot>`;
}
renderEndIcon() {
return html `<slot name="end-icon" part="end-icon" class="end-icon">${this.endIcon
? html `<mdui-icon name="${this.endIcon}" class="i"></mdui-icon>`
: nothingTemplate}</slot>`;
}
renderDeleteIcon() {
if (!this.deletable) {
return nothingTemplate;
}
return html `<slot name="delete-icon" part="delete-icon" class="delete-icon" @click="${this.onDelete}">${this.deleteIcon
? html `<mdui-icon name="${this.deleteIcon}" class="i"></mdui-icon>`
: html `<mdui-icon-clear class="i"></mdui-icon-clear>`}</slot>`;
}
renderInner() {
return [
this.renderIcon(),
this.renderLabel(),
this.renderEndIcon(),
this.renderDeleteIcon(),
];
}
};
Chip.styles = [ButtonBase.styles, style];
__decorate([
property({ reflect: true })
], Chip.prototype, "variant", void 0);
__decorate([
property({
type: Boolean,
reflect: true,
converter: booleanConverter,
})
], Chip.prototype, "elevated", void 0);
__decorate([
property({
type: Boolean,
reflect: true,
converter: booleanConverter,
})
], Chip.prototype, "selectable", void 0);
__decorate([
property({
type: Boolean,
reflect: true,
converter: booleanConverter,
})
], Chip.prototype, "selected", void 0);
__decorate([
property({
type: Boolean,
reflect: true,
converter: booleanConverter,
})
], Chip.prototype, "deletable", void 0);
__decorate([
property({ reflect: true })
], Chip.prototype, "icon", void 0);
__decorate([
property({ reflect: true, attribute: 'selected-icon' })
], Chip.prototype, "selectedIcon", void 0);
__decorate([
property({ reflect: true, attribute: 'end-icon' })
], Chip.prototype, "endIcon", void 0);
__decorate([
property({ reflect: true, attribute: 'delete-icon' })
], Chip.prototype, "deleteIcon", void 0);
__decorate([
watch('selected', true)
], Chip.prototype, "onSelectedChange", null);
Chip = __decorate([
customElement('mdui-chip')
], Chip);
export { Chip };

View File

@@ -0,0 +1 @@
export declare const style: import("lit").CSSResult;

View File

@@ -0,0 +1,4 @@
import { css } from 'lit';
export const style = css `:host{--shape-corner:var(--mdui-shape-corner-small);position:relative;display:inline-block;flex-shrink:0;overflow:hidden;border-radius:var(--shape-corner);cursor:pointer;-webkit-tap-highlight-color:transparent;transition:box-shadow var(--mdui-motion-duration-short4) var(--mdui-motion-easing-linear);height:2rem;background-color:rgb(var(--mdui-color-surface));border:.0625rem solid rgb(var(--mdui-color-outline));color:rgb(var(--mdui-color-on-surface-variant));font-size:var(--mdui-typescale-label-large-size);font-weight:var(--mdui-typescale-label-large-weight);letter-spacing:var(--mdui-typescale-label-large-tracking);line-height:var(--mdui-typescale-label-large-line-height);--mdui-comp-ripple-state-layer-color:var(--mdui-color-on-surface-variant)}.button{padding-right:.4375rem;padding-left:.4375rem}:host([variant=input]) .button{padding-right:.1875rem;padding-left:.1875rem}:host([selected]:not([selected=false i])) .button{padding-right:.5rem;padding-left:.5rem}:host([selected][variant=input]:not([selected=false i])) .button{padding-right:.25rem;padding-left:.25rem}:host([elevated]:not([elevated=false i])) .button{padding-right:.5rem;padding-left:.5rem}:host([variant=assist]){color:rgb(var(--mdui-color-on-surface));--mdui-comp-ripple-state-layer-color:var(--mdui-color-on-surface)}:host([elevated]:not([elevated=false i])){border-width:0;background-color:rgb(var(--mdui-color-surface-container-low));box-shadow:var(--mdui-elevation-level1)}:host([selected]:not([selected=false i])){color:rgb(var(--mdui-color-on-secondary-container));background-color:rgb(var(--mdui-color-secondary-container));border-width:0;--mdui-comp-ripple-state-layer-color:var(
--mdui-color-on-secondary-container
)}:host([disabled]:not([disabled=false i])),:host([loading]:not([loading=false i])){cursor:default;pointer-events:none}:host([disabled]:not([disabled=false i])){border-color:rgba(var(--mdui-color-on-surface),12%);color:rgba(var(--mdui-color-on-surface),38%);box-shadow:var(--mdui-elevation-level0)}:host([disabled][elevated]:not([disabled=false i],[elevated=false i])),:host([disabled][selected]:not([disabled=false i],[selected=false i])){background-color:rgba(var(--mdui-color-on-surface),12%)}:host([selected][hover]:not([selected=false i])){box-shadow:var(--mdui-elevation-level1)}:host([elevated][hover]:not([elevated=false i])){color:rgb(var(--mdui-color-on-secondary-container));box-shadow:var(--mdui-elevation-level2)}:host([variant=filter][hover]),:host([variant=input][hover]),:host([variant=suggestion][hover]){color:rgb(var(--mdui-color-on-surface-variant))}:host([variant=filter][focus-visible]),:host([variant=input][focus-visible]),:host([variant=suggestion][focus-visible]){border-color:rgb(var(--mdui-color-on-surface-variant))}:host([dragged]),:host([dragged][hover]){box-shadow:var(--mdui-elevation-level4)}.button{overflow:visible}.label{display:inline-flex;padding-right:.5rem;padding-left:.5rem}.end-icon,.icon,.selected-icon{display:inline-flex;font-size:1.28571429em;color:rgb(var(--mdui-color-on-surface-variant))}:host([variant=assist]) .end-icon,:host([variant=assist]) .icon,:host([variant=assist]) .selected-icon{color:rgb(var(--mdui-color-primary))}:host([selected]:not([selected=false i])) .end-icon,:host([selected]:not([selected=false i])) .icon,:host([selected]:not([selected=false i])) .selected-icon{color:rgb(var(--mdui-color-on-secondary-container))}:host([disabled]:not([disabled=false i])) .end-icon,:host([disabled]:not([disabled=false i])) .icon,:host([disabled]:not([disabled=false i])) .selected-icon{opacity:.38;color:rgb(var(--mdui-color-on-surface))}.end-icon .i,.icon .i,.selected-icon .i,::slotted([slot=end-icon]),::slotted([slot=icon]),::slotted([slot=selected-icon]){font-size:inherit}:host([variant=input]) .has-icon .icon,:host([variant=input]) .has-icon .selected-icon,:host([variant=input]) .has-icon mdui-circular-progress{margin-left:.25rem}:host([variant=input]) .has-end-icon .end-icon{margin-right:.25rem}mdui-circular-progress{display:inline-flex;width:1.125rem;height:1.125rem}:host([disabled]:not([disabled=false i])) mdui-circular-progress{stroke:rgba(var(--mdui-color-on-surface),38%)}::slotted(mdui-avatar[slot=end-icon]),::slotted(mdui-avatar[slot=icon]),::slotted(mdui-avatar[slot=selected-icon]){width:1.5rem;height:1.5rem}:host([disabled]:not([disabled=false i])) ::slotted(mdui-avatar[slot=end-icon]),:host([disabled]:not([disabled=false i])) ::slotted(mdui-avatar[slot=icon]),:host([disabled]:not([disabled=false i])) ::slotted(mdui-avatar[slot=selected-icon]){opacity:.38}::slotted(mdui-avatar[slot=icon]),::slotted(mdui-avatar[slot=selected-icon]){margin-left:-.25rem;margin-right:-.125rem}::slotted(mdui-avatar[slot=end-icon]){margin-right:-.25rem;margin-left:-.125rem}.delete-icon{display:inline-flex;font-size:1.28571429em;transition:background-color var(--mdui-motion-duration-short4) var(--mdui-motion-easing-linear);border-radius:var(--mdui-shape-corner-full);margin-right:-.25rem;margin-left:-.25rem;padding:.25rem;color:rgb(var(--mdui-color-on-surface-variant))}.delete-icon:hover{background-color:rgba(var(--mdui-color-on-surface-variant),12%)}.has-end-icon .delete-icon{margin-left:.25rem}:host([variant=assiat]) .delete-icon{color:rgb(var(--mdui-color-primary))}:host([variant=input]) .delete-icon{margin-right:.0625rem}:host([disabled]:not([disabled=false i])) .delete-icon{color:rgba(var(--mdui-color-on-surface),38%)}.delete-icon .i,::slotted([slot=delete-icon]){font-size:inherit}::slotted(mdui-avatar[slot=delete-icon]){width:1.125rem;height:1.125rem}`;