@xihan-ui/web-components 1.0.0 → 1.1.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/dist/define.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { a as containsPart, c as applyMotionOverride, d as notifyXhConfigChange, f as onXhConfigChange, h as withXhConfig, i as PART_ATTR, o as discoverParts, p as resolveXhConfig, r as createSpreader, s as wcNormalize, t as MachineController } from "./machine-controller-DE6edQbK.js";
2
2
  import { t as defineElement } from "./registry-DR6I2_zF.js";
3
- import { n as version, t as XhReactiveElement } from "./element-ib25-l85.js";
4
- import { HEATMAP_LEGEND_TEXT, SCROLLBAR_DEFAULT_TYPE, accordionAnatomy, accordionMachine, accordionMeta, affixAnatomy, affixMachine, affixMeta, alertAnatomy, alertMachine, alertMeta, anchorAnatomy, anchorMachine, anchorMeta, autoSizeTextarea, avatarAnatomy, avatarGroupAnatomy, avatarGroupMeta, avatarMachine, avatarMeta, backTopAnatomy, backTopMachine, backTopMeta, badgeAnatomy, badgeMeta, breadcrumbAnatomy, breadcrumbMeta, buildHeatmapGrid, buttonAnatomy, buttonGroupAnatomy, buttonGroupMeta, buttonMeta, calendarAnatomy, calendarMachine, calendarMeta, cardAnatomy, cardMeta, carouselAnatomy, carouselMachine, carouselMeta, cascaderAnatomy, cascaderMachine, cascaderMeta, checkboxAnatomy, checkboxGroupAnatomy, checkboxGroupMachine, checkboxGroupMeta, checkboxMachine, checkboxMeta, clipboardAnatomy, clipboardMachine, clipboardMeta, codeBlockAnatomy, codeBlockMeta, collapsibleAnatomy, collapsibleMachine, collapsibleMeta, colorPickerAnatomy, colorPickerMachine, colorPickerMeta, colorPickerToChannel, colorPickerToInputChannel, comboboxAnatomy, comboboxMachine, comboboxMeta, composerAnatomy, composerMachine, composerMeta, connectAccordion, connectAffix, connectAlert, connectAnchor, connectAvatar, connectAvatarGroup, connectBackTop, connectBadge, connectBreadcrumb, connectButton, connectButtonGroup, connectCalendar, connectCard, connectCarousel, connectCascader, connectCheckbox, connectCheckboxGroup, connectClipboard, connectCodeBlock, connectCollapsible, connectColorPicker, connectCombobox, connectComposer, connectContextMenu, connectCountdown, connectDateField, connectDatePicker, connectDescriptions, connectDialog, connectDownloadTrigger, connectDrawer, connectDynamicInput, connectEditable, connectEllipsis, connectEmptyState, connectField, connectFieldset, connectFileUpload, connectFlex, connectFloatButton, connectFloatingPanel, connectForm, connectGradientText, connectGrid, connectHeatmap, connectHighlight, connectHotkeys, connectHoverCard, connectIcon, connectIconWrapper, connectImage, connectImageCropper, connectImageViewer, connectInfiniteScroll, connectJsonViewer, connectLayout, connectList, connectListbox, connectLoadingBar, connectLog, connectMarquee, connectMasonry, connectMention, connectMenu, connectMenubar, connectNavigationMenu, connectNotification, connectNotificationItem, connectNumberAnimation, connectNumberField, connectPageHeader, connectPagination, connectPasswordInput, connectPinInput, connectPopconfirm, connectPopover, connectPopselect, connectProgress, connectQrCode, connectRadioGroup, connectRating, connectResult, connectScrollArea, connectScrollbar, connectSegmented, connectSelect, connectSeparator, connectSideNav, connectSignaturePad, connectSkeleton, connectSlider, connectSpace, connectSpinner, connectSplitter, connectStatistic, connectSteps, connectSwitch, connectTable, connectTabs, connectTag, connectTagsInput, connectTextField, connectThread, connectTime, connectTimeField, connectTimePicker, connectTimeline, connectTimer, connectToast, connectToggle, connectToggleGroup, connectToolbar, connectTooltip, connectTour, connectTransfer, connectTree, connectTreeSelect, connectTypography, connectVirtualizer, connectWatermark, contextMenuAnatomy, contextMenuMachine, contextMenuMeta, countdownAnatomy, countdownMachine, countdownMeta, dateFieldAnatomy, dateFieldMachine, dateFieldMeta, datePickerAnatomy, datePickerCalendarProps, datePickerFieldEndProps, datePickerFieldProps, datePickerMachine, datePickerMeta, descriptionsAnatomy, descriptionsMeta, detectHotkeysPlatform, dialogAnatomy, dialogMachine, dialogMeta, distributeMasonry, downloadTriggerAnatomy, downloadTriggerMachine, downloadTriggerMeta, drawerAnatomy, drawerMachine, drawerMeta, dynamicInputAnatomy, dynamicInputMachine, dynamicInputMeta, editableAnatomy, editableMachine, editableMeta, ellipsisAnatomy, ellipsisMachine, ellipsisMeta, emptyStateAnatomy, emptyStateMeta, fieldAnatomy, fieldMeta, fieldsetAnatomy, fieldsetMeta, fileUploadAnatomy, fileUploadMachine, fileUploadMeta, flexAnatomy, flexMeta, floatButtonAnatomy, floatButtonMeta, floatingPanelAnatomy, floatingPanelMachine, floatingPanelMeta, formAnatomy, formMachine, formMeta, gradientTextAnatomy, gradientTextMeta, gridAnatomy, gridMeta, heatmapAnatomy, heatmapMachine, heatmapMeta, highlightAnatomy, highlightMeta, hotkeysAnatomy, hotkeysMeta, hoverCardAnatomy, hoverCardMachine, hoverCardMeta, iconAnatomy, iconMeta, iconWrapperAnatomy, iconWrapperMeta, imageAnatomy, imageCropperAnatomy, imageCropperMachine, imageCropperMeta, imageMachine, imageMeta, imageViewerAnatomy, imageViewerCounterText, imageViewerMachine, imageViewerMeta, infiniteScrollAnatomy, infiniteScrollMachine, infiniteScrollMeta, isOverflowing, isTimerUnit, jsonViewerAnatomy, jsonViewerMachine, jsonViewerMeta, layoutAnatomy, layoutMachine, layoutMeta, listAnatomy, listMeta, listboxAnatomy, listboxMachine, listboxMeta, loadingBarAnatomy, loadingBarMachine, loadingBarMeta, logAnatomy, logMeta, marqueeAnatomy, marqueeMeta, masonryAnatomy, masonryMeta, mentionAnatomy, mentionMachine, mentionMeta, menuAnatomy, menuMachine, menuMeta, menubarAnatomy, menubarMachine, menubarMeta, navigationMenuAnatomy, navigationMenuMachine, navigationMenuMeta, notificationAnatomy, notificationMachine, notificationMeta, numberAnimationAnatomy, numberAnimationMachine, numberAnimationMeta, numberFieldAnatomy, numberFieldMachine, numberFieldMeta, pageHeaderAnatomy, pageHeaderMeta, paginationAnatomy, paginationMachine, paginationMeta, passwordInputAnatomy, passwordInputMachine, passwordInputMeta, pinInputAnatomy, pinInputMachine, pinInputMeta, popconfirmAnatomy, popconfirmMeta, popoverAnatomy, popoverMachine, popoverMeta, popselectAnatomy, popselectInitialFocus, popselectMeta, progressAnatomy, progressMeta, qrCodeAnatomy, qrCodeMeta, radioGroupAnatomy, radioGroupMachine, radioGroupMeta, ratingAnatomy, ratingMachine, ratingMeta, resolveMasonryColumns, resultAnatomy, resultMeta, scrollAreaAnatomy, scrollAreaMeta, scrollAreaScrollbarProps, scrollbarAnatomy, scrollbarMachine, scrollbarMeta, segmentedAnatomy, segmentedMachine, segmentedMeta, selectAnatomy, selectMachine, selectMeta, separatorAnatomy, separatorMeta, sideNavAnatomy, sideNavMachine, sideNavMeta, signaturePadAnatomy, signaturePadMachine, signaturePadMeta, skeletonAnatomy, skeletonMeta, sliderAnatomy, sliderMachine, sliderMeta, spaceAnatomy, spaceMeta, spinnerAnatomy, spinnerMeta, splitterAnatomy, splitterMachine, splitterMeta, statisticAnatomy, statisticMeta, stepsAnatomy, stepsMachine, stepsMeta, switchAnatomy, switchMachine, switchMeta, tableAnatomy, tableMachine, tableMeta, tabsAnatomy, tabsMachine, tabsMeta, tagAnatomy, tagMachine, tagMeta, tagsInputAnatomy, tagsInputMachine, tagsInputMeta, textFieldAnatomy, textFieldMachine, textFieldMeta, threadAnatomy, threadMachine, threadMeta, timeAnatomy, timeFieldAnatomy, timeFieldMachine, timeFieldMeta, timeMeta, timePickerAnatomy, timePickerMachine, timePickerMeta, timelineAnatomy, timelineMeta, timerAnatomy, timerMachine, timerMeta, toastAnatomy, toastMachine, toastMeta, toggleAnatomy, toggleGroupAnatomy, toggleGroupMachine, toggleGroupMeta, toggleMachine, toggleMeta, toolbarAnatomy, toolbarMachine, toolbarMeta, tooltipAnatomy, tooltipMachine, tooltipMeta, tourAnatomy, tourMachine, tourMeta, transferAnatomy, transferFocusKey, transferMachine, transferMeta, treeAnatomy, treeMachine, treeMeta, treeSelectAnatomy, treeSelectMachine, treeSelectMeta, typographyAnatomy, typographyMeta, virtualizerAnatomy, virtualizerMachine, virtualizerMeta, watermarkAnatomy, watermarkMeta } from "@xihan-ui/headless";
3
+ import { n as version, t as XhReactiveElement } from "./element-b0p0Q8Py.js";
4
+ import { HEATMAP_LEGEND_TEXT, SCROLLBAR_DEFAULT_TYPE, accordionAnatomy, accordionMachine, accordionMeta, affixAnatomy, affixMachine, affixMeta, alertAnatomy, alertMachine, alertMeta, anchorAnatomy, anchorMachine, anchorMeta, autoSizeTextarea, avatarAnatomy, avatarGroupAnatomy, avatarGroupMeta, avatarMachine, avatarMeta, backTopAnatomy, backTopMachine, backTopMeta, badgeAnatomy, badgeMeta, breadcrumbAnatomy, breadcrumbMeta, buildHeatmapGrid, buttonAnatomy, buttonGroupAnatomy, buttonGroupMeta, buttonMeta, calendarAnatomy, calendarMachine, calendarMeta, cardAnatomy, cardMeta, carouselAnatomy, carouselMachine, carouselMeta, cascaderAnatomy, cascaderMachine, cascaderMeta, checkboxAnatomy, checkboxGroupAnatomy, checkboxGroupMachine, checkboxGroupMeta, checkboxMachine, checkboxMeta, clipboardAnatomy, clipboardMachine, clipboardMeta, codeBlockAnatomy, codeBlockMeta, collapsibleAnatomy, collapsibleMachine, collapsibleMeta, colorPickerAnatomy, colorPickerMachine, colorPickerMeta, colorPickerToChannel, colorPickerToInputChannel, comboboxAnatomy, comboboxMachine, comboboxMeta, composerAnatomy, composerMachine, composerMeta, connectAccordion, connectAffix, connectAlert, connectAnchor, connectAvatar, connectAvatarGroup, connectBackTop, connectBadge, connectBreadcrumb, connectButton, connectButtonGroup, connectCalendar, connectCard, connectCarousel, connectCascader, connectCheckbox, connectCheckboxGroup, connectClipboard, connectCodeBlock, connectCollapsible, connectColorPicker, connectCombobox, connectComposer, connectContextMenu, connectCountdown, connectDateField, connectDatePicker, connectDescriptions, connectDialog, connectDownloadTrigger, connectDrawer, connectDynamicInput, connectEditable, connectEllipsis, connectEmptyState, connectField, connectFieldset, connectFileUpload, connectFlex, connectFloatButton, connectFloatingPanel, connectForm, connectGradientText, connectGrid, connectHeatmap, connectHighlight, connectHotkeys, connectHoverCard, connectIcon, connectIconWrapper, connectImage, connectImageCropper, connectImageViewer, connectInfiniteScroll, connectJsonViewer, connectLayout, connectList, connectListbox, connectLoadingBar, connectLog, connectMarquee, connectMasonry, connectMention, connectMenu, connectMenubar, connectNavigationMenu, connectNotification, connectNotificationItem, connectNumberAnimation, connectNumberField, connectPageHeader, connectPagination, connectPasswordInput, connectPinInput, connectPopconfirm, connectPopover, connectPopselect, connectProgress, connectQrCode, connectRadioGroup, connectRating, connectResizable, connectResult, connectScrollArea, connectScrollbar, connectSegmented, connectSelect, connectSeparator, connectSideNav, connectSignaturePad, connectSkeleton, connectSlider, connectSortable, connectSpace, connectSpinner, connectSplitter, connectStatistic, connectSteps, connectSwitch, connectTable, connectTabs, connectTag, connectTagsInput, connectTextField, connectThread, connectTime, connectTimeField, connectTimePicker, connectTimeline, connectTimer, connectToast, connectToggle, connectToggleGroup, connectToolbar, connectTooltip, connectTour, connectTransfer, connectTree, connectTreeSelect, connectTypography, connectVirtualizer, connectWatermark, contextMenuAnatomy, contextMenuMachine, contextMenuMeta, countdownAnatomy, countdownMachine, countdownMeta, dateFieldAnatomy, dateFieldMachine, dateFieldMeta, datePickerAnatomy, datePickerCalendarProps, datePickerFieldEndProps, datePickerFieldProps, datePickerMachine, datePickerMeta, descriptionsAnatomy, descriptionsMeta, detectHotkeysPlatform, dialogAnatomy, dialogMachine, dialogMeta, distributeMasonry, downloadTriggerAnatomy, downloadTriggerMachine, downloadTriggerMeta, drawerAnatomy, drawerMachine, drawerMeta, dynamicInputAnatomy, dynamicInputMachine, dynamicInputMeta, editableAnatomy, editableMachine, editableMeta, ellipsisAnatomy, ellipsisMachine, ellipsisMeta, emptyStateAnatomy, emptyStateMeta, fieldAnatomy, fieldMeta, fieldsetAnatomy, fieldsetMeta, fileUploadAnatomy, fileUploadMachine, fileUploadMeta, flexAnatomy, flexMeta, floatButtonAnatomy, floatButtonMeta, floatingPanelAnatomy, floatingPanelMachine, floatingPanelMeta, formAnatomy, formMachine, formMeta, gradientTextAnatomy, gradientTextMeta, gridAnatomy, gridMeta, heatmapAnatomy, heatmapMachine, heatmapMeta, highlightAnatomy, highlightMeta, hotkeysAnatomy, hotkeysMeta, hoverCardAnatomy, hoverCardMachine, hoverCardMeta, iconAnatomy, iconMeta, iconWrapperAnatomy, iconWrapperMeta, imageAnatomy, imageCropperAnatomy, imageCropperMachine, imageCropperMeta, imageMachine, imageMeta, imageViewerAnatomy, imageViewerCounterText, imageViewerMachine, imageViewerMeta, infiniteScrollAnatomy, infiniteScrollMachine, infiniteScrollMeta, isOverflowing, isTimerUnit, jsonViewerAnatomy, jsonViewerMachine, jsonViewerMeta, layoutAnatomy, layoutMachine, layoutMeta, listAnatomy, listMeta, listboxAnatomy, listboxMachine, listboxMeta, loadingBarAnatomy, loadingBarMachine, loadingBarMeta, logAnatomy, logMeta, marqueeAnatomy, marqueeMeta, masonryAnatomy, masonryMeta, mentionAnatomy, mentionMachine, mentionMeta, menuAnatomy, menuMachine, menuMeta, menubarAnatomy, menubarMachine, menubarMeta, navigationMenuAnatomy, navigationMenuMachine, navigationMenuMeta, notificationAnatomy, notificationMachine, notificationMeta, numberAnimationAnatomy, numberAnimationMachine, numberAnimationMeta, numberFieldAnatomy, numberFieldMachine, numberFieldMeta, pageHeaderAnatomy, pageHeaderMeta, paginationAnatomy, paginationMachine, paginationMeta, passwordInputAnatomy, passwordInputMachine, passwordInputMeta, pinInputAnatomy, pinInputMachine, pinInputMeta, popconfirmAnatomy, popconfirmMeta, popoverAnatomy, popoverMachine, popoverMeta, popselectAnatomy, popselectInitialFocus, popselectMeta, progressAnatomy, progressMeta, qrCodeAnatomy, qrCodeMeta, radioGroupAnatomy, radioGroupMachine, radioGroupMeta, ratingAnatomy, ratingMachine, ratingMeta, resizableAnatomy, resizableMachine, resizableMeta, resolveMasonryColumns, resultAnatomy, resultMeta, scrollAreaAnatomy, scrollAreaMeta, scrollAreaScrollbarProps, scrollbarAnatomy, scrollbarMachine, scrollbarMeta, segmentedAnatomy, segmentedMachine, segmentedMeta, selectAnatomy, selectMachine, selectMeta, separatorAnatomy, separatorMeta, sideNavAnatomy, sideNavMachine, sideNavMeta, signaturePadAnatomy, signaturePadMachine, signaturePadMeta, skeletonAnatomy, skeletonMeta, sliderAnatomy, sliderMachine, sliderMeta, sortableAnatomy, sortableMachine, sortableMeta, spaceAnatomy, spaceMeta, spinnerAnatomy, spinnerMeta, splitterAnatomy, splitterMachine, splitterMeta, statisticAnatomy, statisticMeta, stepsAnatomy, stepsMachine, stepsMeta, switchAnatomy, switchMachine, switchMeta, tableAnatomy, tableMachine, tableMeta, tabsAnatomy, tabsMachine, tabsMeta, tagAnatomy, tagMachine, tagMeta, tagsInputAnatomy, tagsInputMachine, tagsInputMeta, textFieldAnatomy, textFieldMachine, textFieldMeta, threadAnatomy, threadMachine, threadMeta, timeAnatomy, timeFieldAnatomy, timeFieldMachine, timeFieldMeta, timeMeta, timePickerAnatomy, timePickerMachine, timePickerMeta, timelineAnatomy, timelineMeta, timerAnatomy, timerMachine, timerMeta, toastAnatomy, toastMachine, toastMeta, toggleAnatomy, toggleGroupAnatomy, toggleGroupMachine, toggleGroupMeta, toggleMachine, toggleMeta, toolbarAnatomy, toolbarMachine, toolbarMeta, tooltipAnatomy, tooltipMachine, tooltipMeta, tourAnatomy, tourMachine, tourMeta, transferAnatomy, transferFocusKey, transferMachine, transferMeta, treeAnatomy, treeMachine, treeMeta, treeSelectAnatomy, treeSelectMachine, treeSelectMeta, typographyAnatomy, typographyMeta, virtualizerAnatomy, virtualizerMachine, virtualizerMeta, watermarkAnatomy, watermarkMeta } from "@xihan-ui/headless";
5
5
  import { DATA_PART, DATA_SCOPE, DIAGNOSTIC_CODES, VERSION, createCounterIdGenerator, createRuntimeConfig, createScope, getDiagnostics, isDev, reportDiagnostic } from "@xihan-ui/kernel";
6
6
  import { ITEM_VALUE_ATTR, declaredItemDisabled, isItemDisabled } from "@xihan-ui/behavior";
7
7
  import { findDeprecatedPart, startDeprecationScan } from "@xihan-ui/kernel/deprecations";
@@ -516,7 +516,7 @@ var XhAccordionElement = class extends XhElement {
516
516
  };
517
517
  //#endregion
518
518
  //#region src/elements/affix.ts
519
- const NUMBER_CONVERTER$57 = { fromAttribute: (v) => v == null || v === "" ? void 0 : Number(v) };
519
+ const NUMBER_CONVERTER$59 = { fromAttribute: (v) => v == null || v === "" ? void 0 : Number(v) };
520
520
  /**
521
521
  * `<xh-affix>` —— 吸附行为宿主:滚过判定线就把 content 钉在滚动容器可视区的边上。
522
522
  *
@@ -539,11 +539,11 @@ var XhAffixElement = class extends XhElement {
539
539
  };
540
540
  static properties = {
541
541
  topOffset: {
542
- converter: NUMBER_CONVERTER$57,
542
+ converter: NUMBER_CONVERTER$59,
543
543
  attribute: "offset-top"
544
544
  },
545
545
  bottomOffset: {
546
- converter: NUMBER_CONVERTER$57,
546
+ converter: NUMBER_CONVERTER$59,
547
547
  attribute: "offset-bottom"
548
548
  },
549
549
  target: { attribute: false }
@@ -644,9 +644,9 @@ var XhAlertElement = class extends XhElement {
644
644
  };
645
645
  //#endregion
646
646
  //#region src/elements/anchor.ts
647
- const STRING_CONVERTER$95 = { fromAttribute: (v) => v ?? void 0 };
648
- const NUMBER_CONVERTER$56 = { fromAttribute: (v) => v === null ? void 0 : Number(v) };
649
- const BOOLEAN_CONVERTER$68 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
647
+ const STRING_CONVERTER$97 = { fromAttribute: (v) => v ?? void 0 };
648
+ const NUMBER_CONVERTER$58 = { fromAttribute: (v) => v === null ? void 0 : Number(v) };
649
+ const BOOLEAN_CONVERTER$70 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
650
650
  /**
651
651
  * `<xh-anchor>` —— 锚点导航行为宿主,激活项由机器的滚动观察器结算,
652
652
  * 目标区块按 link 上的 value 属性(或 targets 清单)里的 id 现查。
@@ -677,20 +677,20 @@ var XhAnchorElement = class extends XhElement {
677
677
  meta: anchorMeta
678
678
  };
679
679
  static properties = {
680
- value: { converter: STRING_CONVERTER$95 },
680
+ value: { converter: STRING_CONVERTER$97 },
681
681
  defaultValue: {
682
- converter: STRING_CONVERTER$95,
682
+ converter: STRING_CONVERTER$97,
683
683
  attribute: "default-value"
684
684
  },
685
- offset: { converter: NUMBER_CONVERTER$56 },
686
- smooth: { converter: BOOLEAN_CONVERTER$68 },
687
- orientation: { converter: STRING_CONVERTER$95 },
685
+ offset: { converter: NUMBER_CONVERTER$58 },
686
+ smooth: { converter: BOOLEAN_CONVERTER$70 },
687
+ orientation: { converter: STRING_CONVERTER$97 },
688
688
  direction: {
689
- converter: STRING_CONVERTER$95,
689
+ converter: STRING_CONVERTER$97,
690
690
  attribute: "dir"
691
691
  },
692
- tone: { converter: STRING_CONVERTER$95 },
693
- size: { converter: STRING_CONVERTER$95 },
692
+ tone: { converter: STRING_CONVERTER$97 },
693
+ size: { converter: STRING_CONVERTER$97 },
694
694
  targets: { attribute: false },
695
695
  translations: { attribute: false },
696
696
  scrollElement: { attribute: false }
@@ -745,7 +745,7 @@ var XhAnchorElement = class extends XhElement {
745
745
  };
746
746
  //#endregion
747
747
  //#region src/elements/avatar.ts
748
- const STRING_CONVERTER$94 = { fromAttribute: (v) => v ?? void 0 };
748
+ const STRING_CONVERTER$96 = { fromAttribute: (v) => v ?? void 0 };
749
749
  /**
750
750
  * `<xh-avatar>` —— 头像行为宿主,src/alt 写进 image 节点,加载成败回送机器,image 与 fallback 互斥显隐。
751
751
  *
@@ -764,9 +764,9 @@ var XhAvatarElement = class extends XhElement {
764
764
  meta: avatarMeta
765
765
  };
766
766
  static properties = {
767
- src: { converter: STRING_CONVERTER$94 },
768
- alt: { converter: STRING_CONVERTER$94 },
769
- size: { converter: STRING_CONVERTER$94 }
767
+ src: { converter: STRING_CONVERTER$96 },
768
+ alt: { converter: STRING_CONVERTER$96 },
769
+ size: { converter: STRING_CONVERTER$96 }
770
770
  };
771
771
  notify = (details) => {
772
772
  this.dispatchEvent(new CustomEvent("status-change", {
@@ -845,8 +845,8 @@ var XhAvatarGroupElement = class extends XhElement {
845
845
  };
846
846
  //#endregion
847
847
  //#region src/elements/back-top.ts
848
- const STRING_CONVERTER$93 = { fromAttribute: (v) => v ?? void 0 };
849
- const NUMBER_CONVERTER$55 = { fromAttribute: (v) => v == null || v === "" ? void 0 : Number(v) };
848
+ const STRING_CONVERTER$95 = { fromAttribute: (v) => v ?? void 0 };
849
+ const NUMBER_CONVERTER$57 = { fromAttribute: (v) => v == null || v === "" ? void 0 : Number(v) };
850
850
  /**
851
851
  * `<xh-back-top>` —— 回到顶部行为宿主:滚动量过线时露出按钮,点它滚回顶部。
852
852
  *
@@ -870,12 +870,12 @@ var XhBackTopElement = class extends XhElement {
870
870
  };
871
871
  static properties = {
872
872
  visibilityHeight: {
873
- converter: NUMBER_CONVERTER$55,
873
+ converter: NUMBER_CONVERTER$57,
874
874
  attribute: "visibility-height"
875
875
  },
876
- behavior: { converter: STRING_CONVERTER$93 },
877
- tone: { converter: STRING_CONVERTER$93 },
878
- size: { converter: STRING_CONVERTER$93 },
876
+ behavior: { converter: STRING_CONVERTER$95 },
877
+ tone: { converter: STRING_CONVERTER$95 },
878
+ size: { converter: STRING_CONVERTER$95 },
879
879
  translations: { attribute: false },
880
880
  target: { attribute: false }
881
881
  };
@@ -972,7 +972,7 @@ var XhBadgeElement = class extends XhElement {
972
972
  };
973
973
  //#endregion
974
974
  //#region src/elements/breadcrumb.ts
975
- const STRING_CONVERTER$92 = { fromAttribute: (v) => v ?? void 0 };
975
+ const STRING_CONVERTER$94 = { fromAttribute: (v) => v ?? void 0 };
976
976
  /** 读作者写在角色节点上的布尔声明:属性缺席或 ="false" 为假,其余为真。 */
977
977
  function authorFlag$1(el, name) {
978
978
  const raw = el.getAttribute(name);
@@ -1002,11 +1002,11 @@ var XhBreadcrumbElement = class extends XhElement {
1002
1002
  };
1003
1003
  static properties = {
1004
1004
  direction: {
1005
- converter: STRING_CONVERTER$92,
1005
+ converter: STRING_CONVERTER$94,
1006
1006
  attribute: "dir"
1007
1007
  },
1008
- tone: { converter: STRING_CONVERTER$92 },
1009
- size: { converter: STRING_CONVERTER$92 },
1008
+ tone: { converter: STRING_CONVERTER$94 },
1009
+ size: { converter: STRING_CONVERTER$94 },
1010
1010
  translations: { attribute: false }
1011
1011
  };
1012
1012
  wire() {
@@ -1134,9 +1134,9 @@ var XhButtonGroupElement = class extends XhElement {
1134
1134
  };
1135
1135
  //#endregion
1136
1136
  //#region src/elements/calendar.ts
1137
- const STRING_CONVERTER$91 = { fromAttribute: (v) => v ?? void 0 };
1138
- const BOOLEAN_CONVERTER$67 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
1139
- const NUMBER_CONVERTER$54 = { fromAttribute: (v) => v == null || v === "" ? void 0 : Number(v) };
1137
+ const STRING_CONVERTER$93 = { fromAttribute: (v) => v ?? void 0 };
1138
+ const BOOLEAN_CONVERTER$69 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
1139
+ const NUMBER_CONVERTER$56 = { fromAttribute: (v) => v == null || v === "" ? void 0 : Number(v) };
1140
1140
  /** 作者写的面板下标;写坏了或没写按 0 算。 */
1141
1141
  function declaredIndex$6(el, fallback = 0) {
1142
1142
  const raw = el?.getAttribute("index")?.trim();
@@ -1197,32 +1197,32 @@ var XhCalendarElement = class extends XhElement {
1197
1197
  meta: calendarMeta
1198
1198
  };
1199
1199
  static properties = {
1200
- value: { converter: STRING_CONVERTER$91 },
1200
+ value: { converter: STRING_CONVERTER$93 },
1201
1201
  defaultValue: {
1202
- converter: STRING_CONVERTER$91,
1202
+ converter: STRING_CONVERTER$93,
1203
1203
  attribute: "default-value"
1204
1204
  },
1205
1205
  selectionMode: {
1206
- converter: STRING_CONVERTER$91,
1206
+ converter: STRING_CONVERTER$93,
1207
1207
  attribute: "selection-mode"
1208
1208
  },
1209
1209
  focusedValue: {
1210
- converter: STRING_CONVERTER$91,
1210
+ converter: STRING_CONVERTER$93,
1211
1211
  attribute: "focused-value"
1212
1212
  },
1213
1213
  defaultFocusedValue: {
1214
- converter: STRING_CONVERTER$91,
1214
+ converter: STRING_CONVERTER$93,
1215
1215
  attribute: "default-focused-value"
1216
1216
  },
1217
- min: { converter: STRING_CONVERTER$91 },
1218
- max: { converter: STRING_CONVERTER$91 },
1219
- locale: { converter: STRING_CONVERTER$91 },
1217
+ min: { converter: STRING_CONVERTER$93 },
1218
+ max: { converter: STRING_CONVERTER$93 },
1219
+ locale: { converter: STRING_CONVERTER$93 },
1220
1220
  timeZone: {
1221
- converter: STRING_CONVERTER$91,
1221
+ converter: STRING_CONVERTER$93,
1222
1222
  attribute: "time-zone"
1223
1223
  },
1224
1224
  weekdayFormat: {
1225
- converter: STRING_CONVERTER$91,
1225
+ converter: STRING_CONVERTER$93,
1226
1226
  attribute: "weekday-format"
1227
1227
  },
1228
1228
  disabled: { type: Boolean },
@@ -1234,21 +1234,21 @@ var XhCalendarElement = class extends XhElement {
1234
1234
  type: Boolean,
1235
1235
  attribute: "fixed-weeks"
1236
1236
  },
1237
- view: { converter: STRING_CONVERTER$91 },
1237
+ view: { converter: STRING_CONVERTER$93 },
1238
1238
  activeView: {
1239
- converter: STRING_CONVERTER$91,
1239
+ converter: STRING_CONVERTER$93,
1240
1240
  attribute: "active-view"
1241
1241
  },
1242
1242
  defaultActiveView: {
1243
- converter: STRING_CONVERTER$91,
1243
+ converter: STRING_CONVERTER$93,
1244
1244
  attribute: "default-active-view"
1245
1245
  },
1246
1246
  weekSelection: {
1247
- converter: BOOLEAN_CONVERTER$67,
1247
+ converter: BOOLEAN_CONVERTER$69,
1248
1248
  attribute: "week-selection"
1249
1249
  },
1250
1250
  visibleCount: {
1251
- converter: NUMBER_CONVERTER$54,
1251
+ converter: NUMBER_CONVERTER$56,
1252
1252
  attribute: "visible-count"
1253
1253
  },
1254
1254
  isDateUnavailable: { attribute: false }
@@ -1431,9 +1431,9 @@ var XhCardElement = class extends XhElement {
1431
1431
  };
1432
1432
  //#endregion
1433
1433
  //#region src/elements/carousel.ts
1434
- const STRING_CONVERTER$90 = { fromAttribute: (v) => v ?? void 0 };
1435
- const NUMBER_CONVERTER$53 = { fromAttribute: (v) => v == null || v === "" ? void 0 : Number(v) };
1436
- const BOOLEAN_CONVERTER$66 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
1434
+ const STRING_CONVERTER$92 = { fromAttribute: (v) => v ?? void 0 };
1435
+ const NUMBER_CONVERTER$55 = { fromAttribute: (v) => v == null || v === "" ? void 0 : Number(v) };
1436
+ const BOOLEAN_CONVERTER$68 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
1437
1437
  /**
1438
1438
  * autoplay 布尔或毫秒两用:缺席 = undefined,`autoplay` / `autoplay="true"` = 默认间隔,
1439
1439
  * `autoplay="false"` = 关,`autoplay="3000"` = 3 秒一张,念不成数的串按开着处理。
@@ -1487,35 +1487,35 @@ var XhCarouselElement = class extends XhElement {
1487
1487
  meta: carouselMeta
1488
1488
  };
1489
1489
  static properties = {
1490
- page: { converter: NUMBER_CONVERTER$53 },
1490
+ page: { converter: NUMBER_CONVERTER$55 },
1491
1491
  defaultPage: {
1492
- converter: NUMBER_CONVERTER$53,
1492
+ converter: NUMBER_CONVERTER$55,
1493
1493
  attribute: "default-page"
1494
1494
  },
1495
1495
  slideCount: {
1496
- converter: NUMBER_CONVERTER$53,
1496
+ converter: NUMBER_CONVERTER$55,
1497
1497
  attribute: "slide-count"
1498
1498
  },
1499
1499
  slidesPerPage: {
1500
- converter: NUMBER_CONVERTER$53,
1500
+ converter: NUMBER_CONVERTER$55,
1501
1501
  attribute: "slides-per-page"
1502
1502
  },
1503
1503
  slidesPerMove: {
1504
- converter: NUMBER_CONVERTER$53,
1504
+ converter: NUMBER_CONVERTER$55,
1505
1505
  attribute: "slides-per-move"
1506
1506
  },
1507
- orientation: { converter: STRING_CONVERTER$90 },
1507
+ orientation: { converter: STRING_CONVERTER$92 },
1508
1508
  direction: {
1509
- converter: STRING_CONVERTER$90,
1509
+ converter: STRING_CONVERTER$92,
1510
1510
  attribute: "dir"
1511
1511
  },
1512
- loop: { converter: BOOLEAN_CONVERTER$66 },
1512
+ loop: { converter: BOOLEAN_CONVERTER$68 },
1513
1513
  autoplay: { converter: AUTOPLAY_CONVERTER },
1514
1514
  allowPointerDrag: {
1515
- converter: BOOLEAN_CONVERTER$66,
1515
+ converter: BOOLEAN_CONVERTER$68,
1516
1516
  attribute: "allow-pointer-drag"
1517
1517
  },
1518
- spacing: { converter: STRING_CONVERTER$90 },
1518
+ spacing: { converter: STRING_CONVERTER$92 },
1519
1519
  translations: { attribute: false }
1520
1520
  };
1521
1521
  notify = (details) => {
@@ -1682,9 +1682,9 @@ var ScrollbarsController = class {
1682
1682
  };
1683
1683
  //#endregion
1684
1684
  //#region src/elements/cascader.ts
1685
- const STRING_CONVERTER$89 = { fromAttribute: (v) => v ?? void 0 };
1686
- const NUMBER_CONVERTER$52 = { fromAttribute: (v) => v === null ? void 0 : Number(v) };
1687
- const BOOLEAN_CONVERTER$65 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
1685
+ const STRING_CONVERTER$91 = { fromAttribute: (v) => v ?? void 0 };
1686
+ const NUMBER_CONVERTER$54 = { fromAttribute: (v) => v === null ? void 0 : Number(v) };
1687
+ const BOOLEAN_CONVERTER$67 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
1688
1688
  /** 条目一系的归属容器:文本与勾选标记向上找最近的那个条目。 */
1689
1689
  const ITEM_SELECTOR$4 = "[data-xh-part=\"item\"]";
1690
1690
  /**
@@ -1754,43 +1754,43 @@ var XhCascaderElement = class extends XhElement {
1754
1754
  collection: { attribute: false },
1755
1755
  value: { attribute: false },
1756
1756
  defaultValue: { attribute: false },
1757
- open: { converter: BOOLEAN_CONVERTER$65 },
1757
+ open: { converter: BOOLEAN_CONVERTER$67 },
1758
1758
  defaultOpen: {
1759
1759
  type: Boolean,
1760
1760
  attribute: "default-open"
1761
1761
  },
1762
1762
  expandTrigger: {
1763
- converter: STRING_CONVERTER$89,
1763
+ converter: STRING_CONVERTER$91,
1764
1764
  attribute: "expand-trigger"
1765
1765
  },
1766
1766
  changeOnSelect: {
1767
- converter: BOOLEAN_CONVERTER$65,
1767
+ converter: BOOLEAN_CONVERTER$67,
1768
1768
  attribute: "change-on-select"
1769
1769
  },
1770
1770
  multiple: { type: Boolean },
1771
1771
  searchable: { type: Boolean },
1772
1772
  cascade: { type: Boolean },
1773
1773
  checkedStrategy: {
1774
- converter: STRING_CONVERTER$89,
1774
+ converter: STRING_CONVERTER$91,
1775
1775
  attribute: "checked-strategy"
1776
1776
  },
1777
1777
  disabled: { type: Boolean },
1778
1778
  readOnly: {
1779
- converter: BOOLEAN_CONVERTER$65,
1779
+ converter: BOOLEAN_CONVERTER$67,
1780
1780
  attribute: "read-only"
1781
1781
  },
1782
- invalid: { converter: BOOLEAN_CONVERTER$65 },
1783
- variant: { converter: STRING_CONVERTER$89 },
1784
- tone: { converter: STRING_CONVERTER$89 },
1785
- size: { converter: STRING_CONVERTER$89 },
1786
- placeholder: { converter: STRING_CONVERTER$89 },
1787
- separator: { converter: STRING_CONVERTER$89 },
1782
+ invalid: { converter: BOOLEAN_CONVERTER$67 },
1783
+ variant: { converter: STRING_CONVERTER$91 },
1784
+ tone: { converter: STRING_CONVERTER$91 },
1785
+ size: { converter: STRING_CONVERTER$91 },
1786
+ placeholder: { converter: STRING_CONVERTER$91 },
1787
+ separator: { converter: STRING_CONVERTER$91 },
1788
1788
  translations: { attribute: false },
1789
- placement: { converter: STRING_CONVERTER$89 },
1790
- offset: { converter: NUMBER_CONVERTER$52 },
1791
- loop: { converter: BOOLEAN_CONVERTER$65 },
1789
+ placement: { converter: STRING_CONVERTER$91 },
1790
+ offset: { converter: NUMBER_CONVERTER$54 },
1791
+ loop: { converter: BOOLEAN_CONVERTER$67 },
1792
1792
  direction: {
1793
- converter: STRING_CONVERTER$89,
1793
+ converter: STRING_CONVERTER$91,
1794
1794
  attribute: "dir"
1795
1795
  }
1796
1796
  };
@@ -2119,8 +2119,8 @@ function createDeclaredDisabled() {
2119
2119
  }
2120
2120
  //#endregion
2121
2121
  //#region src/elements/checkbox-group.ts
2122
- const STRING_CONVERTER$88 = { fromAttribute: (v) => v ?? void 0 };
2123
- const BOOLEAN_CONVERTER$64 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
2122
+ const STRING_CONVERTER$90 = { fromAttribute: (v) => v ?? void 0 };
2123
+ const BOOLEAN_CONVERTER$66 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
2124
2124
  const LIST_CONVERTER = { fromAttribute: (v) => v === null ? void 0 : v.split(",").map((s) => s.trim()).filter(Boolean) };
2125
2125
  /**
2126
2126
  * `<xh-checkbox-group>` —— Light-DOM 行为宿主:作者写 root/label 与若干 item 角色节点,
@@ -2163,14 +2163,14 @@ var XhCheckboxGroupElement = class extends XhElement {
2163
2163
  converter: LIST_CONVERTER,
2164
2164
  attribute: "item-values"
2165
2165
  },
2166
- disabled: { converter: BOOLEAN_CONVERTER$64 },
2166
+ disabled: { converter: BOOLEAN_CONVERTER$66 },
2167
2167
  readOnly: {
2168
- converter: BOOLEAN_CONVERTER$64,
2168
+ converter: BOOLEAN_CONVERTER$66,
2169
2169
  attribute: "read-only"
2170
2170
  },
2171
- invalid: { converter: BOOLEAN_CONVERTER$64 },
2172
- orientation: { converter: STRING_CONVERTER$88 },
2173
- name: { converter: STRING_CONVERTER$88 }
2171
+ invalid: { converter: BOOLEAN_CONVERTER$66 },
2172
+ orientation: { converter: STRING_CONVERTER$90 },
2173
+ name: { converter: STRING_CONVERTER$90 }
2174
2174
  };
2175
2175
  /** 条目自身 disabled 声明的快照,整组禁用期间 DOM 上的 aria-disabled 不可信。 */
2176
2176
  declaredDisabled = /* @__PURE__ */ new WeakMap();
@@ -2258,8 +2258,8 @@ var XhCheckboxGroupElement = class extends XhElement {
2258
2258
  };
2259
2259
  //#endregion
2260
2260
  //#region src/elements/clipboard.ts
2261
- const STRING_CONVERTER$87 = { fromAttribute: (v) => v ?? void 0 };
2262
- const NUMBER_CONVERTER$51 = { fromAttribute: (v) => v == null || v === "" ? void 0 : Number(v) };
2261
+ const STRING_CONVERTER$89 = { fromAttribute: (v) => v ?? void 0 };
2262
+ const NUMBER_CONVERTER$53 = { fromAttribute: (v) => v == null || v === "" ? void 0 : Number(v) };
2263
2263
  /**
2264
2264
  * `<xh-clipboard>` —— Light-DOM 行为宿主,跑 clipboard 机器并把 connect 产出打到角色节点上。
2265
2265
  *
@@ -2286,8 +2286,8 @@ var XhClipboardElement = class extends XhElement {
2286
2286
  meta: clipboardMeta
2287
2287
  };
2288
2288
  static properties = {
2289
- value: { converter: STRING_CONVERTER$87 },
2290
- timeout: { converter: NUMBER_CONVERTER$51 }
2289
+ value: { converter: STRING_CONVERTER$89 },
2290
+ timeout: { converter: NUMBER_CONVERTER$53 }
2291
2291
  };
2292
2292
  notifyStatus = (details) => {
2293
2293
  this.dispatchEvent(new CustomEvent("status-change", {
@@ -2334,8 +2334,8 @@ var XhClipboardElement = class extends XhElement {
2334
2334
  //#region src/elements/code-block.ts
2335
2335
  /** 默认着色实现全元素共用一份:它无状态,没必要每个块建一个。 */
2336
2336
  const defaultHighlighter = createHighlighter();
2337
- const STRING_CONVERTER$86 = { fromAttribute: (v) => v ?? void 0 };
2338
- const BOOLEAN_CONVERTER$63 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
2337
+ const STRING_CONVERTER$88 = { fromAttribute: (v) => v ?? void 0 };
2338
+ const BOOLEAN_CONVERTER$65 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
2339
2339
  /**
2340
2340
  * `<xh-code-block>` —— Light-DOM 行为宿主,无状态机:wire 时算出 connectCodeBlock 的产出,
2341
2341
  * 打到四类角色节点上。显示的代码文本由作者写在 code 角色节点里,元素不改其子节点。
@@ -2358,15 +2358,15 @@ var XhCodeBlockElement = class extends XhElement {
2358
2358
  meta: codeBlockMeta
2359
2359
  };
2360
2360
  static properties = {
2361
- code: { converter: STRING_CONVERTER$86 },
2361
+ code: { converter: STRING_CONVERTER$88 },
2362
2362
  codeLang: {
2363
- converter: STRING_CONVERTER$86,
2363
+ converter: STRING_CONVERTER$88,
2364
2364
  attribute: "code-lang"
2365
2365
  },
2366
2366
  wrap: { type: Boolean },
2367
- complete: { converter: BOOLEAN_CONVERTER$63 },
2367
+ complete: { converter: BOOLEAN_CONVERTER$65 },
2368
2368
  highlightWhileStreaming: {
2369
- converter: BOOLEAN_CONVERTER$63,
2369
+ converter: BOOLEAN_CONVERTER$65,
2370
2370
  attribute: "highlight-while-streaming"
2371
2371
  }
2372
2372
  };
@@ -2501,9 +2501,9 @@ var XhCollapsibleElement = class extends XhElement {
2501
2501
  };
2502
2502
  //#endregion
2503
2503
  //#region src/elements/color-picker.ts
2504
- const STRING_CONVERTER$85 = { fromAttribute: (v) => v ?? void 0 };
2505
- const NUMBER_CONVERTER$50 = { fromAttribute: (v) => v == null || v === "" ? void 0 : Number(v) };
2506
- const BOOLEAN_CONVERTER$62 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
2504
+ const STRING_CONVERTER$87 = { fromAttribute: (v) => v ?? void 0 };
2505
+ const NUMBER_CONVERTER$52 = { fromAttribute: (v) => v == null || v === "" ? void 0 : Number(v) };
2506
+ const BOOLEAN_CONVERTER$64 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
2507
2507
  /** 预设色板写成逗号分隔(swatches="#ff0000,#00ff00"),空串当没写。 */
2508
2508
  const STRING_LIST_CONVERTER = { fromAttribute: (v) => {
2509
2509
  if (v == null || v.trim() === "") return void 0;
@@ -2564,32 +2564,32 @@ var XhColorPickerElement = class extends XhElement {
2564
2564
  meta: colorPickerMeta
2565
2565
  };
2566
2566
  static properties = {
2567
- value: { converter: STRING_CONVERTER$85 },
2567
+ value: { converter: STRING_CONVERTER$87 },
2568
2568
  defaultValue: {
2569
- converter: STRING_CONVERTER$85,
2569
+ converter: STRING_CONVERTER$87,
2570
2570
  attribute: "default-value"
2571
2571
  },
2572
- format: { converter: STRING_CONVERTER$85 },
2573
- open: { converter: BOOLEAN_CONVERTER$62 },
2572
+ format: { converter: STRING_CONVERTER$87 },
2573
+ open: { converter: BOOLEAN_CONVERTER$64 },
2574
2574
  defaultOpen: {
2575
2575
  type: Boolean,
2576
2576
  attribute: "default-open"
2577
2577
  },
2578
- disabled: { converter: BOOLEAN_CONVERTER$62 },
2578
+ disabled: { converter: BOOLEAN_CONVERTER$64 },
2579
2579
  readOnly: {
2580
- converter: BOOLEAN_CONVERTER$62,
2580
+ converter: BOOLEAN_CONVERTER$64,
2581
2581
  attribute: "read-only"
2582
2582
  },
2583
- alpha: { converter: BOOLEAN_CONVERTER$62 },
2583
+ alpha: { converter: BOOLEAN_CONVERTER$64 },
2584
2584
  swatches: { converter: STRING_LIST_CONVERTER },
2585
- name: { converter: STRING_CONVERTER$85 },
2586
- size: { converter: STRING_CONVERTER$85 },
2585
+ name: { converter: STRING_CONVERTER$87 },
2586
+ size: { converter: STRING_CONVERTER$87 },
2587
2587
  direction: {
2588
- converter: STRING_CONVERTER$85,
2588
+ converter: STRING_CONVERTER$87,
2589
2589
  attribute: "dir"
2590
2590
  },
2591
- placement: { converter: STRING_CONVERTER$85 },
2592
- offset: { converter: NUMBER_CONVERTER$50 },
2591
+ placement: { converter: STRING_CONVERTER$87 },
2592
+ offset: { converter: NUMBER_CONVERTER$52 },
2593
2593
  translations: { attribute: false }
2594
2594
  };
2595
2595
  idGen = createCounterIdGenerator();
@@ -2751,9 +2751,9 @@ var XhColorPickerElement = class extends XhElement {
2751
2751
  };
2752
2752
  //#endregion
2753
2753
  //#region src/elements/combobox.ts
2754
- const STRING_CONVERTER$84 = { fromAttribute: (v) => v ?? void 0 };
2755
- const NUMBER_CONVERTER$49 = { fromAttribute: (v) => v === null ? void 0 : Number(v) };
2756
- const BOOLEAN_CONVERTER$61 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
2754
+ const STRING_CONVERTER$86 = { fromAttribute: (v) => v ?? void 0 };
2755
+ const NUMBER_CONVERTER$51 = { fromAttribute: (v) => v === null ? void 0 : Number(v) };
2756
+ const BOOLEAN_CONVERTER$63 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
2757
2757
  /**
2758
2758
  * `<xh-combobox>` —— Light-DOM 行为宿主:作者写 root/label/control/input/trigger/positioner/content/item/...
2759
2759
  * 角色节点,元素跑 combobox 机器并把 connect 产出打上去。浮层定位引擎在本元素里建好、经 refs 注入机器,
@@ -2813,21 +2813,21 @@ var XhComboboxElement = class extends XhElement {
2813
2813
  static properties = {
2814
2814
  collection: { attribute: false },
2815
2815
  translations: { attribute: false },
2816
- name: { converter: STRING_CONVERTER$84 },
2817
- value: { converter: STRING_CONVERTER$84 },
2816
+ name: { converter: STRING_CONVERTER$86 },
2817
+ value: { converter: STRING_CONVERTER$86 },
2818
2818
  defaultValue: {
2819
- converter: STRING_CONVERTER$84,
2819
+ converter: STRING_CONVERTER$86,
2820
2820
  attribute: "default-value"
2821
2821
  },
2822
2822
  inputValue: {
2823
- converter: STRING_CONVERTER$84,
2823
+ converter: STRING_CONVERTER$86,
2824
2824
  attribute: "input-value"
2825
2825
  },
2826
2826
  defaultInputValue: {
2827
- converter: STRING_CONVERTER$84,
2827
+ converter: STRING_CONVERTER$86,
2828
2828
  attribute: "default-input-value"
2829
2829
  },
2830
- open: { converter: BOOLEAN_CONVERTER$61 },
2830
+ open: { converter: BOOLEAN_CONVERTER$63 },
2831
2831
  defaultOpen: {
2832
2832
  type: Boolean,
2833
2833
  attribute: "default-open"
@@ -2835,12 +2835,12 @@ var XhComboboxElement = class extends XhElement {
2835
2835
  multiple: { type: Boolean },
2836
2836
  disabled: { type: Boolean },
2837
2837
  readOnly: {
2838
- converter: BOOLEAN_CONVERTER$61,
2838
+ converter: BOOLEAN_CONVERTER$63,
2839
2839
  attribute: "read-only"
2840
2840
  },
2841
- invalid: { converter: BOOLEAN_CONVERTER$61 },
2842
- loop: { converter: BOOLEAN_CONVERTER$61 },
2843
- placeholder: { converter: STRING_CONVERTER$84 },
2841
+ invalid: { converter: BOOLEAN_CONVERTER$63 },
2842
+ loop: { converter: BOOLEAN_CONVERTER$63 },
2843
+ placeholder: { converter: STRING_CONVERTER$86 },
2844
2844
  allowCustomValue: {
2845
2845
  type: Boolean,
2846
2846
  attribute: "allow-custom-value"
@@ -2850,14 +2850,14 @@ var XhComboboxElement = class extends XhElement {
2850
2850
  attribute: "open-on-click"
2851
2851
  },
2852
2852
  inputBehavior: {
2853
- converter: STRING_CONVERTER$84,
2853
+ converter: STRING_CONVERTER$86,
2854
2854
  attribute: "input-behavior"
2855
2855
  },
2856
- placement: { converter: STRING_CONVERTER$84 },
2857
- offset: { converter: NUMBER_CONVERTER$49 },
2858
- variant: { converter: STRING_CONVERTER$84 },
2859
- tone: { converter: STRING_CONVERTER$84 },
2860
- size: { converter: STRING_CONVERTER$84 }
2856
+ placement: { converter: STRING_CONVERTER$86 },
2857
+ offset: { converter: NUMBER_CONVERTER$51 },
2858
+ variant: { converter: STRING_CONVERTER$86 },
2859
+ tone: { converter: STRING_CONVERTER$86 },
2860
+ size: { converter: STRING_CONVERTER$86 }
2861
2861
  };
2862
2862
  idGen = createCounterIdGenerator();
2863
2863
  comboboxScope = createScope(null, this.idGen);
@@ -3020,8 +3020,8 @@ var XhComboboxElement = class extends XhElement {
3020
3020
  };
3021
3021
  //#endregion
3022
3022
  //#region src/elements/composer.ts
3023
- const STRING_CONVERTER$83 = { fromAttribute: (v) => v ?? void 0 };
3024
- const BOOLEAN_CONVERTER$60 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
3023
+ const STRING_CONVERTER$85 = { fromAttribute: (v) => v ?? void 0 };
3024
+ const BOOLEAN_CONVERTER$62 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
3025
3025
  /**
3026
3026
  * `<xh-composer>` —— Light-DOM 行为宿主:跑 composer 机器,把 connect 产出打到作者写的
3027
3027
  * root/input/submit-trigger 三类角色节点上。input 须是原生 `<textarea>`,值经 property 写、
@@ -3047,18 +3047,18 @@ var XhComposerElement = class extends XhElement {
3047
3047
  meta: composerMeta
3048
3048
  };
3049
3049
  static properties = {
3050
- value: { converter: STRING_CONVERTER$83 },
3050
+ value: { converter: STRING_CONVERTER$85 },
3051
3051
  defaultValue: {
3052
- converter: STRING_CONVERTER$83,
3052
+ converter: STRING_CONVERTER$85,
3053
3053
  attribute: "default-value"
3054
3054
  },
3055
- disabled: { converter: BOOLEAN_CONVERTER$60 },
3055
+ disabled: { converter: BOOLEAN_CONVERTER$62 },
3056
3056
  runStatus: {
3057
- converter: STRING_CONVERTER$83,
3057
+ converter: STRING_CONVERTER$85,
3058
3058
  attribute: "run-status"
3059
3059
  },
3060
3060
  submitOnEnter: {
3061
- converter: BOOLEAN_CONVERTER$60,
3061
+ converter: BOOLEAN_CONVERTER$62,
3062
3062
  attribute: "submit-on-enter"
3063
3063
  },
3064
3064
  translations: { attribute: false }
@@ -3100,7 +3100,7 @@ var XhComposerElement = class extends XhElement {
3100
3100
  };
3101
3101
  //#endregion
3102
3102
  //#region src/elements/config.ts
3103
- const STRING_CONVERTER$82 = { fromAttribute: (v) => v ?? void 0 };
3103
+ const STRING_CONVERTER$84 = { fromAttribute: (v) => v ?? void 0 };
3104
3104
  /**
3105
3105
  * `<xh-config>` —— 配置作用域。包住一棵子树,里面的元素解析 locale / size / translations
3106
3106
  * 时先看最近的这一层,再往外层与全局那份回落。
@@ -3123,9 +3123,9 @@ const STRING_CONVERTER$82 = { fromAttribute: (v) => v ?? void 0 };
3123
3123
  */
3124
3124
  var XhConfigElement = class extends XhReactiveElement {
3125
3125
  static properties = {
3126
- locale: { converter: STRING_CONVERTER$82 },
3127
- size: { converter: STRING_CONVERTER$82 },
3128
- motion: { converter: STRING_CONVERTER$82 },
3126
+ locale: { converter: STRING_CONVERTER$84 },
3127
+ size: { converter: STRING_CONVERTER$84 },
3128
+ motion: { converter: STRING_CONVERTER$84 },
3129
3129
  translations: { attribute: false },
3130
3130
  scrollRoot: { attribute: false }
3131
3131
  };
@@ -3159,9 +3159,9 @@ var XhConfigElement = class extends XhReactiveElement {
3159
3159
  };
3160
3160
  //#endregion
3161
3161
  //#region src/elements/context-menu.ts
3162
- const STRING_CONVERTER$81 = { fromAttribute: (v) => v ?? void 0 };
3163
- const NUMBER_CONVERTER$48 = { fromAttribute: (v) => v === null ? void 0 : Number(v) };
3164
- const BOOLEAN_CONVERTER$59 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
3162
+ const STRING_CONVERTER$83 = { fromAttribute: (v) => v ?? void 0 };
3163
+ const NUMBER_CONVERTER$50 = { fromAttribute: (v) => v === null ? void 0 : Number(v) };
3164
+ const BOOLEAN_CONVERTER$61 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
3165
3165
  /**
3166
3166
  * `<xh-context-menu>` —— Light-DOM 行为宿主:作者写 root/trigger/positioner/content 与若干
3167
3167
  * item / group / separator 角色节点,元素跑 context-menu 机器并把 connect 产出打上去。
@@ -3204,26 +3204,26 @@ var XhContextMenuElement = class extends XhElement {
3204
3204
  };
3205
3205
  static properties = {
3206
3206
  collection: { attribute: false },
3207
- open: { converter: BOOLEAN_CONVERTER$59 },
3207
+ open: { converter: BOOLEAN_CONVERTER$61 },
3208
3208
  defaultOpen: {
3209
3209
  type: Boolean,
3210
3210
  attribute: "default-open"
3211
3211
  },
3212
- placement: { converter: STRING_CONVERTER$81 },
3213
- offset: { converter: NUMBER_CONVERTER$48 },
3214
- loop: { converter: BOOLEAN_CONVERTER$59 },
3215
- typeahead: { converter: BOOLEAN_CONVERTER$59 },
3212
+ placement: { converter: STRING_CONVERTER$83 },
3213
+ offset: { converter: NUMBER_CONVERTER$50 },
3214
+ loop: { converter: BOOLEAN_CONVERTER$61 },
3215
+ typeahead: { converter: BOOLEAN_CONVERTER$61 },
3216
3216
  translations: { attribute: false },
3217
3217
  direction: {
3218
- converter: STRING_CONVERTER$81,
3218
+ converter: STRING_CONVERTER$83,
3219
3219
  attribute: "dir"
3220
3220
  },
3221
3221
  longPressDelay: {
3222
- converter: NUMBER_CONVERTER$48,
3222
+ converter: NUMBER_CONVERTER$50,
3223
3223
  attribute: "long-press-delay"
3224
3224
  },
3225
- tone: { converter: STRING_CONVERTER$81 },
3226
- size: { converter: STRING_CONVERTER$81 }
3225
+ tone: { converter: STRING_CONVERTER$83 },
3226
+ size: { converter: STRING_CONVERTER$83 }
3227
3227
  };
3228
3228
  idGen = createCounterIdGenerator();
3229
3229
  menuScope = createScope(null, this.idGen);
@@ -3374,9 +3374,9 @@ var XhContextMenuElement = class extends XhElement {
3374
3374
  };
3375
3375
  //#endregion
3376
3376
  //#region src/elements/countdown.ts
3377
- const STRING_CONVERTER$80 = { fromAttribute: (v) => v ?? void 0 };
3378
- const NUMBER_CONVERTER$47 = { fromAttribute: (v) => v == null || v === "" ? void 0 : Number(v) };
3379
- const BOOLEAN_CONVERTER$58 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
3377
+ const STRING_CONVERTER$82 = { fromAttribute: (v) => v ?? void 0 };
3378
+ const NUMBER_CONVERTER$49 = { fromAttribute: (v) => v == null || v === "" ? void 0 : Number(v) };
3379
+ const BOOLEAN_CONVERTER$60 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
3380
3380
  /**
3381
3381
  * `<xh-countdown>` —— Light-DOM 行为宿主:作者写一个 root 角色节点,
3382
3382
  * 元素跑 countdown 机器,逐帧把剩余毫秒按模板铺成时分秒写进那个节点。
@@ -3406,11 +3406,11 @@ var XhCountdownElement = class extends XhElement {
3406
3406
  meta: countdownMeta
3407
3407
  };
3408
3408
  static properties = {
3409
- value: { converter: NUMBER_CONVERTER$47 },
3410
- format: { converter: STRING_CONVERTER$80 },
3411
- active: { converter: BOOLEAN_CONVERTER$58 },
3412
- precision: { converter: NUMBER_CONVERTER$47 },
3413
- live: { converter: STRING_CONVERTER$80 }
3409
+ value: { converter: NUMBER_CONVERTER$49 },
3410
+ format: { converter: STRING_CONVERTER$82 },
3411
+ active: { converter: BOOLEAN_CONVERTER$60 },
3412
+ precision: { converter: NUMBER_CONVERTER$49 },
3413
+ live: { converter: STRING_CONVERTER$82 }
3414
3414
  };
3415
3415
  notify = (details) => {
3416
3416
  this.dispatchEvent(new CustomEvent("finish", {
@@ -3440,8 +3440,8 @@ var XhCountdownElement = class extends XhElement {
3440
3440
  };
3441
3441
  //#endregion
3442
3442
  //#region src/elements/date-field.ts
3443
- const STRING_CONVERTER$79 = { fromAttribute: (v) => v ?? void 0 };
3444
- const BOOLEAN_CONVERTER$57 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
3443
+ const STRING_CONVERTER$81 = { fromAttribute: (v) => v ?? void 0 };
3444
+ const BOOLEAN_CONVERTER$59 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
3445
3445
  const SEGMENT_SET_CONVERTER = { fromAttribute: (v) => {
3446
3446
  if (v === null) return void 0;
3447
3447
  const list = v.split(",").map((part) => part.trim()).filter(Boolean);
@@ -3527,33 +3527,33 @@ var XhDateFieldElement = class extends XhElement {
3527
3527
  meta: dateFieldMeta
3528
3528
  };
3529
3529
  static properties = {
3530
- value: { converter: STRING_CONVERTER$79 },
3530
+ value: { converter: STRING_CONVERTER$81 },
3531
3531
  defaultValue: {
3532
- converter: STRING_CONVERTER$79,
3532
+ converter: STRING_CONVERTER$81,
3533
3533
  attribute: "default-value"
3534
3534
  },
3535
- min: { converter: STRING_CONVERTER$79 },
3536
- max: { converter: STRING_CONVERTER$79 },
3537
- locale: { converter: STRING_CONVERTER$79 },
3535
+ min: { converter: STRING_CONVERTER$81 },
3536
+ max: { converter: STRING_CONVERTER$81 },
3537
+ locale: { converter: STRING_CONVERTER$81 },
3538
3538
  timeZone: {
3539
- converter: STRING_CONVERTER$79,
3539
+ converter: STRING_CONVERTER$81,
3540
3540
  attribute: "time-zone"
3541
3541
  },
3542
- granularity: { converter: STRING_CONVERTER$79 },
3542
+ granularity: { converter: STRING_CONVERTER$81 },
3543
3543
  segments: { converter: SEGMENT_SET_CONVERTER },
3544
- disabled: { converter: BOOLEAN_CONVERTER$57 },
3544
+ disabled: { converter: BOOLEAN_CONVERTER$59 },
3545
3545
  readOnly: {
3546
- converter: BOOLEAN_CONVERTER$57,
3546
+ converter: BOOLEAN_CONVERTER$59,
3547
3547
  attribute: "read-only"
3548
3548
  },
3549
- invalid: { converter: BOOLEAN_CONVERTER$57 },
3550
- required: { converter: BOOLEAN_CONVERTER$57 },
3551
- name: { converter: STRING_CONVERTER$79 },
3549
+ invalid: { converter: BOOLEAN_CONVERTER$59 },
3550
+ required: { converter: BOOLEAN_CONVERTER$59 },
3551
+ name: { converter: STRING_CONVERTER$81 },
3552
3552
  placeholder: { attribute: false },
3553
3553
  translations: { attribute: false },
3554
- variant: { converter: STRING_CONVERTER$79 },
3555
- tone: { converter: STRING_CONVERTER$79 },
3556
- size: { converter: STRING_CONVERTER$79 }
3554
+ variant: { converter: STRING_CONVERTER$81 },
3555
+ tone: { converter: STRING_CONVERTER$81 },
3556
+ size: { converter: STRING_CONVERTER$81 }
3557
3557
  };
3558
3558
  notifyChange = (details) => {
3559
3559
  this.dispatchEvent(new CustomEvent("value-change", {
@@ -3610,9 +3610,9 @@ var XhDateFieldElement = class extends XhElement {
3610
3610
  };
3611
3611
  //#endregion
3612
3612
  //#region src/elements/date-picker.ts
3613
- const STRING_CONVERTER$78 = { fromAttribute: (v) => v ?? void 0 };
3614
- const NUMBER_CONVERTER$46 = { fromAttribute: (v) => v === null ? void 0 : Number(v) };
3615
- const BOOLEAN_CONVERTER$56 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
3613
+ const STRING_CONVERTER$80 = { fromAttribute: (v) => v ?? void 0 };
3614
+ const NUMBER_CONVERTER$48 = { fromAttribute: (v) => v === null ? void 0 : Number(v) };
3615
+ const BOOLEAN_CONVERTER$58 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
3616
3616
  /** 九块段位的名字,按段名声明时照它认。 */
3617
3617
  const SEGMENT_TYPES$2 = [
3618
3618
  "year",
@@ -3734,78 +3734,78 @@ var XhDatePickerElement = class extends XhElement {
3734
3734
  delegates: [dateFieldAnatomy, calendarAnatomy]
3735
3735
  };
3736
3736
  static properties = {
3737
- value: { converter: STRING_CONVERTER$78 },
3737
+ value: { converter: STRING_CONVERTER$80 },
3738
3738
  defaultValue: {
3739
- converter: STRING_CONVERTER$78,
3739
+ converter: STRING_CONVERTER$80,
3740
3740
  attribute: "default-value"
3741
3741
  },
3742
- open: { converter: BOOLEAN_CONVERTER$56 },
3742
+ open: { converter: BOOLEAN_CONVERTER$58 },
3743
3743
  defaultOpen: {
3744
3744
  type: Boolean,
3745
3745
  attribute: "default-open"
3746
3746
  },
3747
- min: { converter: STRING_CONVERTER$78 },
3748
- max: { converter: STRING_CONVERTER$78 },
3749
- locale: { converter: STRING_CONVERTER$78 },
3747
+ min: { converter: STRING_CONVERTER$80 },
3748
+ max: { converter: STRING_CONVERTER$80 },
3749
+ locale: { converter: STRING_CONVERTER$80 },
3750
3750
  timeZone: {
3751
- converter: STRING_CONVERTER$78,
3751
+ converter: STRING_CONVERTER$80,
3752
3752
  attribute: "time-zone"
3753
3753
  },
3754
3754
  selectionMode: {
3755
- converter: STRING_CONVERTER$78,
3755
+ converter: STRING_CONVERTER$80,
3756
3756
  attribute: "selection-mode"
3757
3757
  },
3758
- view: { converter: STRING_CONVERTER$78 },
3758
+ view: { converter: STRING_CONVERTER$80 },
3759
3759
  activeView: {
3760
- converter: STRING_CONVERTER$78,
3760
+ converter: STRING_CONVERTER$80,
3761
3761
  attribute: "active-view"
3762
3762
  },
3763
3763
  segments: { attribute: false },
3764
3764
  weekSelection: {
3765
- converter: BOOLEAN_CONVERTER$56,
3765
+ converter: BOOLEAN_CONVERTER$58,
3766
3766
  attribute: "week-selection"
3767
3767
  },
3768
3768
  presets: { attribute: false },
3769
3769
  visibleCount: {
3770
- converter: NUMBER_CONVERTER$46,
3770
+ converter: NUMBER_CONVERTER$48,
3771
3771
  attribute: "visible-count"
3772
3772
  },
3773
3773
  fixedWeeks: {
3774
- converter: BOOLEAN_CONVERTER$56,
3774
+ converter: BOOLEAN_CONVERTER$58,
3775
3775
  attribute: "fixed-weeks"
3776
3776
  },
3777
3777
  defaultFocusedValue: {
3778
- converter: STRING_CONVERTER$78,
3778
+ converter: STRING_CONVERTER$80,
3779
3779
  attribute: "default-focused-value"
3780
3780
  },
3781
- disabled: { converter: BOOLEAN_CONVERTER$56 },
3781
+ disabled: { converter: BOOLEAN_CONVERTER$58 },
3782
3782
  readOnly: {
3783
- converter: BOOLEAN_CONVERTER$56,
3783
+ converter: BOOLEAN_CONVERTER$58,
3784
3784
  attribute: "read-only"
3785
3785
  },
3786
- invalid: { converter: BOOLEAN_CONVERTER$56 },
3787
- required: { converter: BOOLEAN_CONVERTER$56 },
3788
- name: { converter: STRING_CONVERTER$78 },
3786
+ invalid: { converter: BOOLEAN_CONVERTER$58 },
3787
+ required: { converter: BOOLEAN_CONVERTER$58 },
3788
+ name: { converter: STRING_CONVERTER$80 },
3789
3789
  endName: {
3790
- converter: STRING_CONVERTER$78,
3790
+ converter: STRING_CONVERTER$80,
3791
3791
  attribute: "end-name"
3792
3792
  },
3793
3793
  translations: { attribute: false },
3794
- variant: { converter: STRING_CONVERTER$78 },
3795
- tone: { converter: STRING_CONVERTER$78 },
3796
- size: { converter: STRING_CONVERTER$78 },
3797
- placement: { converter: STRING_CONVERTER$78 },
3798
- offset: { converter: NUMBER_CONVERTER$46 },
3794
+ variant: { converter: STRING_CONVERTER$80 },
3795
+ tone: { converter: STRING_CONVERTER$80 },
3796
+ size: { converter: STRING_CONVERTER$80 },
3797
+ placement: { converter: STRING_CONVERTER$80 },
3798
+ offset: { converter: NUMBER_CONVERTER$48 },
3799
3799
  closeOnSelect: {
3800
- converter: BOOLEAN_CONVERTER$56,
3800
+ converter: BOOLEAN_CONVERTER$58,
3801
3801
  attribute: "close-on-select"
3802
3802
  },
3803
3803
  showTime: {
3804
- converter: BOOLEAN_CONVERTER$56,
3804
+ converter: BOOLEAN_CONVERTER$58,
3805
3805
  attribute: "show-time"
3806
3806
  },
3807
3807
  timeGranularity: {
3808
- converter: STRING_CONVERTER$78,
3808
+ converter: STRING_CONVERTER$80,
3809
3809
  attribute: "time-granularity"
3810
3810
  },
3811
3811
  isDateUnavailable: { attribute: false }
@@ -4085,7 +4085,7 @@ var XhDatePickerElement = class extends XhElement {
4085
4085
  };
4086
4086
  //#endregion
4087
4087
  //#region src/elements/descriptions.ts
4088
- const STRING_CONVERTER$77 = { fromAttribute: (v) => v ?? void 0 };
4088
+ const STRING_CONVERTER$79 = { fromAttribute: (v) => v ?? void 0 };
4089
4089
  /**
4090
4090
  * `<xh-descriptions>` —— Light-DOM 行为宿主,无状态机,把 connectDescriptions 产出打到各角色节点。
4091
4091
  * 排版走 CSS Grid,columns 落成列数。
@@ -4111,8 +4111,8 @@ var XhDescriptionsElement = class extends XhElement {
4111
4111
  static properties = {
4112
4112
  columns: { type: Number },
4113
4113
  bordered: { type: Boolean },
4114
- placement: { converter: STRING_CONVERTER$77 },
4115
- size: { converter: STRING_CONVERTER$77 }
4114
+ placement: { converter: STRING_CONVERTER$79 },
4115
+ size: { converter: STRING_CONVERTER$79 }
4116
4116
  };
4117
4117
  wire() {
4118
4118
  const api = connectDescriptions(this.configured("descriptions", {
@@ -4133,8 +4133,8 @@ var XhDescriptionsElement = class extends XhElement {
4133
4133
  };
4134
4134
  //#endregion
4135
4135
  //#region src/elements/dialog.ts
4136
- const BOOLEAN_CONVERTER$55 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
4137
- const STRING_CONVERTER$76 = { fromAttribute: (v) => v ?? void 0 };
4136
+ const BOOLEAN_CONVERTER$57 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
4137
+ const STRING_CONVERTER$78 = { fromAttribute: (v) => v ?? void 0 };
4138
4138
  /**
4139
4139
  * `<xh-dialog>` —— Light-DOM 行为宿主,跑 dialog 机器并把 connect 产出打到角色节点上,
4140
4140
  * 关闭时用内联 style.display 隐藏浮层子树。
@@ -4163,25 +4163,25 @@ var XhDialogElement = class extends XhElement {
4163
4163
  meta: dialogMeta
4164
4164
  };
4165
4165
  static properties = {
4166
- open: { converter: BOOLEAN_CONVERTER$55 },
4166
+ open: { converter: BOOLEAN_CONVERTER$57 },
4167
4167
  defaultOpen: {
4168
4168
  type: Boolean,
4169
4169
  attribute: "default-open"
4170
4170
  },
4171
- modal: { converter: BOOLEAN_CONVERTER$55 },
4171
+ modal: { converter: BOOLEAN_CONVERTER$57 },
4172
4172
  closeOnEscape: {
4173
- converter: BOOLEAN_CONVERTER$55,
4173
+ converter: BOOLEAN_CONVERTER$57,
4174
4174
  attribute: "close-on-escape"
4175
4175
  },
4176
4176
  restoreFocus: {
4177
- converter: BOOLEAN_CONVERTER$55,
4177
+ converter: BOOLEAN_CONVERTER$57,
4178
4178
  attribute: "restore-focus"
4179
4179
  },
4180
4180
  initialFocus: {
4181
- converter: STRING_CONVERTER$76,
4181
+ converter: STRING_CONVERTER$78,
4182
4182
  attribute: "initial-focus"
4183
4183
  },
4184
- size: { converter: STRING_CONVERTER$76 }
4184
+ size: { converter: STRING_CONVERTER$78 }
4185
4185
  };
4186
4186
  idGen = createCounterIdGenerator();
4187
4187
  dialogScope = createScope(null, this.idGen);
@@ -4287,8 +4287,8 @@ var XhDialogElement = class extends XhElement {
4287
4287
  };
4288
4288
  //#endregion
4289
4289
  //#region src/elements/download-trigger.ts
4290
- const STRING_CONVERTER$75 = { fromAttribute: (v) => v ?? void 0 };
4291
- const BOOLEAN_CONVERTER$54 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
4290
+ const STRING_CONVERTER$77 = { fromAttribute: (v) => v ?? void 0 };
4291
+ const BOOLEAN_CONVERTER$56 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
4292
4292
  /**
4293
4293
  * `<xh-download-trigger>` —— Light-DOM 行为宿主,跑 download-trigger 机器并把 connect 产出打到 root 角色节点。
4294
4294
  *
@@ -4312,16 +4312,16 @@ var XhDownloadTriggerElement = class extends XhElement {
4312
4312
  meta: downloadTriggerMeta
4313
4313
  };
4314
4314
  static properties = {
4315
- data: { converter: STRING_CONVERTER$75 },
4315
+ data: { converter: STRING_CONVERTER$77 },
4316
4316
  fileName: {
4317
- converter: STRING_CONVERTER$75,
4317
+ converter: STRING_CONVERTER$77,
4318
4318
  attribute: "file-name"
4319
4319
  },
4320
4320
  mimeType: {
4321
- converter: STRING_CONVERTER$75,
4321
+ converter: STRING_CONVERTER$77,
4322
4322
  attribute: "mime-type"
4323
4323
  },
4324
- disabled: { converter: BOOLEAN_CONVERTER$54 }
4324
+ disabled: { converter: BOOLEAN_CONVERTER$56 }
4325
4325
  };
4326
4326
  notifyComplete = (details) => {
4327
4327
  this.dispatchEvent(new CustomEvent("download-complete", {
@@ -4356,8 +4356,8 @@ var XhDownloadTriggerElement = class extends XhElement {
4356
4356
  };
4357
4357
  //#endregion
4358
4358
  //#region src/elements/drawer.ts
4359
- const BOOLEAN_CONVERTER$53 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
4360
- const STRING_CONVERTER$74 = { fromAttribute: (v) => v ?? void 0 };
4359
+ const BOOLEAN_CONVERTER$55 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
4360
+ const STRING_CONVERTER$76 = { fromAttribute: (v) => v ?? void 0 };
4361
4361
  /**
4362
4362
  * `<xh-drawer>` —— Light-DOM 行为宿主,跑 drawer 机器并把 connect 产出打到角色节点上,
4363
4363
  * 关闭时用内联 style.display 隐藏浮层子树。
@@ -4392,27 +4392,27 @@ var XhDrawerElement = class extends XhElement {
4392
4392
  meta: drawerMeta
4393
4393
  };
4394
4394
  static properties = {
4395
- open: { converter: BOOLEAN_CONVERTER$53 },
4395
+ open: { converter: BOOLEAN_CONVERTER$55 },
4396
4396
  defaultOpen: {
4397
4397
  type: Boolean,
4398
4398
  attribute: "default-open"
4399
4399
  },
4400
- modal: { converter: BOOLEAN_CONVERTER$53 },
4401
- contained: { converter: BOOLEAN_CONVERTER$53 },
4402
- side: { converter: STRING_CONVERTER$74 },
4400
+ modal: { converter: BOOLEAN_CONVERTER$55 },
4401
+ contained: { converter: BOOLEAN_CONVERTER$55 },
4402
+ side: { converter: STRING_CONVERTER$76 },
4403
4403
  closeOnEscape: {
4404
- converter: BOOLEAN_CONVERTER$53,
4404
+ converter: BOOLEAN_CONVERTER$55,
4405
4405
  attribute: "close-on-escape"
4406
4406
  },
4407
4407
  closeOnInteractOutside: {
4408
- converter: BOOLEAN_CONVERTER$53,
4408
+ converter: BOOLEAN_CONVERTER$55,
4409
4409
  attribute: "close-on-interact-outside"
4410
4410
  },
4411
4411
  restoreFocus: {
4412
- converter: BOOLEAN_CONVERTER$53,
4412
+ converter: BOOLEAN_CONVERTER$55,
4413
4413
  attribute: "restore-focus"
4414
4414
  },
4415
- size: { converter: STRING_CONVERTER$74 },
4415
+ size: { converter: STRING_CONVERTER$76 },
4416
4416
  translations: { attribute: false }
4417
4417
  };
4418
4418
  idGen = createCounterIdGenerator();
@@ -4523,8 +4523,8 @@ var XhDrawerElement = class extends XhElement {
4523
4523
  };
4524
4524
  //#endregion
4525
4525
  //#region src/elements/dynamic-input.ts
4526
- const NUMBER_CONVERTER$45 = { fromAttribute: (v) => v == null || v === "" ? void 0 : Number(v) };
4527
- const BOOLEAN_CONVERTER$52 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
4526
+ const NUMBER_CONVERTER$47 = { fromAttribute: (v) => v == null || v === "" ? void 0 : Number(v) };
4527
+ const BOOLEAN_CONVERTER$54 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
4528
4528
  /** 作者写在行上的下标。缺席或写坏了就退回文档序——把行按顺序排下来本身就是声明。 */
4529
4529
  function declaredIndex$2(el, position) {
4530
4530
  const raw = el.getAttribute("index");
@@ -4566,11 +4566,11 @@ var XhDynamicInputElement = class extends XhElement {
4566
4566
  static properties = {
4567
4567
  value: { attribute: false },
4568
4568
  defaultValue: { attribute: false },
4569
- min: { converter: NUMBER_CONVERTER$45 },
4570
- max: { converter: NUMBER_CONVERTER$45 },
4569
+ min: { converter: NUMBER_CONVERTER$47 },
4570
+ max: { converter: NUMBER_CONVERTER$47 },
4571
4571
  createItem: { attribute: false },
4572
- movable: { converter: BOOLEAN_CONVERTER$52 },
4573
- disabled: { converter: BOOLEAN_CONVERTER$52 },
4572
+ movable: { converter: BOOLEAN_CONVERTER$54 },
4573
+ disabled: { converter: BOOLEAN_CONVERTER$54 },
4574
4574
  translations: { attribute: false }
4575
4575
  };
4576
4576
  notifyValue = (details) => {
@@ -4624,9 +4624,9 @@ var XhDynamicInputElement = class extends XhElement {
4624
4624
  };
4625
4625
  //#endregion
4626
4626
  //#region src/elements/editable.ts
4627
- const STRING_CONVERTER$73 = { fromAttribute: (v) => v ?? void 0 };
4628
- const NUMBER_CONVERTER$44 = { fromAttribute: (v) => v == null || v === "" ? void 0 : Number(v) };
4629
- const BOOLEAN_CONVERTER$51 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
4627
+ const STRING_CONVERTER$75 = { fromAttribute: (v) => v ?? void 0 };
4628
+ const NUMBER_CONVERTER$46 = { fromAttribute: (v) => v == null || v === "" ? void 0 : Number(v) };
4629
+ const BOOLEAN_CONVERTER$53 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
4630
4630
  /**
4631
4631
  * `<xh-editable>` —— Light-DOM 行为宿主:作者写 root/label/area/preview/input/control
4632
4632
  * 与三颗按钮的角色节点,元素跑 editable 机器并把 connect 产出打上去。
@@ -4675,42 +4675,42 @@ var XhEditableElement = class extends XhElement {
4675
4675
  meta: editableMeta
4676
4676
  };
4677
4677
  static properties = {
4678
- value: { converter: STRING_CONVERTER$73 },
4678
+ value: { converter: STRING_CONVERTER$75 },
4679
4679
  defaultValue: {
4680
- converter: STRING_CONVERTER$73,
4680
+ converter: STRING_CONVERTER$75,
4681
4681
  attribute: "default-value"
4682
4682
  },
4683
- edit: { converter: BOOLEAN_CONVERTER$51 },
4683
+ edit: { converter: BOOLEAN_CONVERTER$53 },
4684
4684
  defaultEdit: {
4685
- converter: BOOLEAN_CONVERTER$51,
4685
+ converter: BOOLEAN_CONVERTER$53,
4686
4686
  attribute: "default-edit"
4687
4687
  },
4688
- placeholder: { converter: STRING_CONVERTER$73 },
4689
- disabled: { converter: BOOLEAN_CONVERTER$51 },
4688
+ placeholder: { converter: STRING_CONVERTER$75 },
4689
+ disabled: { converter: BOOLEAN_CONVERTER$53 },
4690
4690
  readOnly: {
4691
- converter: BOOLEAN_CONVERTER$51,
4691
+ converter: BOOLEAN_CONVERTER$53,
4692
4692
  attribute: "read-only"
4693
4693
  },
4694
- invalid: { converter: BOOLEAN_CONVERTER$51 },
4694
+ invalid: { converter: BOOLEAN_CONVERTER$53 },
4695
4695
  maxLength: {
4696
- converter: NUMBER_CONVERTER$44,
4696
+ converter: NUMBER_CONVERTER$46,
4697
4697
  attribute: "max-length"
4698
4698
  },
4699
- name: { converter: STRING_CONVERTER$73 },
4699
+ name: { converter: STRING_CONVERTER$75 },
4700
4700
  submitMode: {
4701
- converter: STRING_CONVERTER$73,
4701
+ converter: STRING_CONVERTER$75,
4702
4702
  attribute: "submit-mode"
4703
4703
  },
4704
4704
  activationMode: {
4705
- converter: STRING_CONVERTER$73,
4705
+ converter: STRING_CONVERTER$75,
4706
4706
  attribute: "activation-mode"
4707
4707
  },
4708
4708
  selectOnFocus: {
4709
- converter: BOOLEAN_CONVERTER$51,
4709
+ converter: BOOLEAN_CONVERTER$53,
4710
4710
  attribute: "select-on-focus"
4711
4711
  },
4712
4712
  autoResize: {
4713
- converter: BOOLEAN_CONVERTER$51,
4713
+ converter: BOOLEAN_CONVERTER$53,
4714
4714
  attribute: "auto-resize"
4715
4715
  }
4716
4716
  };
@@ -4819,7 +4819,7 @@ var XhEditableElement = class extends XhElement {
4819
4819
  };
4820
4820
  //#endregion
4821
4821
  //#region src/elements/ellipsis.ts
4822
- const NUMBER_CONVERTER$43 = { fromAttribute: (v) => v == null || v === "" ? void 0 : Number(v) };
4822
+ const NUMBER_CONVERTER$45 = { fromAttribute: (v) => v == null || v === "" ? void 0 : Number(v) };
4823
4823
  const TRISTATE_CONVERTER$1 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
4824
4824
  /**
4825
4825
  * `<xh-ellipsis>` —— 省略行为宿主:把一段文字夹在给定行数内,并如实报出它有没有被裁掉。
@@ -4847,7 +4847,7 @@ var XhEllipsisElement = class extends XhElement {
4847
4847
  meta: ellipsisMeta
4848
4848
  };
4849
4849
  static properties = {
4850
- lines: { converter: NUMBER_CONVERTER$43 },
4850
+ lines: { converter: NUMBER_CONVERTER$45 },
4851
4851
  expandable: { type: Boolean },
4852
4852
  expanded: { converter: TRISTATE_CONVERTER$1 },
4853
4853
  defaultExpanded: {
@@ -4893,7 +4893,7 @@ var XhEllipsisElement = class extends XhElement {
4893
4893
  };
4894
4894
  //#endregion
4895
4895
  //#region src/elements/empty-state.ts
4896
- const STRING_CONVERTER$72 = { fromAttribute: (v) => v ?? void 0 };
4896
+ const STRING_CONVERTER$74 = { fromAttribute: (v) => v ?? void 0 };
4897
4897
  /**
4898
4898
  * `<xh-empty-state>` —— 空状态行为宿主,无状态机,把 connectEmptyState 产出的属性打到角色节点上。
4899
4899
  *
@@ -4915,8 +4915,8 @@ var XhEmptyStateElement = class extends XhElement {
4915
4915
  meta: emptyStateMeta
4916
4916
  };
4917
4917
  static properties = {
4918
- size: { converter: STRING_CONVERTER$72 },
4919
- live: { converter: STRING_CONVERTER$72 }
4918
+ size: { converter: STRING_CONVERTER$74 },
4919
+ live: { converter: STRING_CONVERTER$74 }
4920
4920
  };
4921
4921
  wire() {
4922
4922
  const props = {
@@ -4937,7 +4937,7 @@ var XhEmptyStateElement = class extends XhElement {
4937
4937
  };
4938
4938
  //#endregion
4939
4939
  //#region src/elements/field.ts
4940
- const STRING_CONVERTER$71 = { fromAttribute: (v) => v ?? void 0 };
4940
+ const STRING_CONVERTER$73 = { fromAttribute: (v) => v ?? void 0 };
4941
4941
  /**
4942
4942
  * `<xh-field>` —— Light-DOM 行为宿主,无状态机,把 connectField 产出的 id 与 aria-* 打到
4943
4943
  * label/control/description/error-text 角色节点上,自动对齐 `for` 与描述链。控件本身由作者渲染。
@@ -4967,7 +4967,7 @@ var XhFieldElement = class extends XhElement {
4967
4967
  required: { type: Boolean },
4968
4968
  disabled: { type: Boolean },
4969
4969
  controlId: {
4970
- converter: STRING_CONVERTER$71,
4970
+ converter: STRING_CONVERTER$73,
4971
4971
  attribute: "control-id"
4972
4972
  }
4973
4973
  };
@@ -4993,7 +4993,7 @@ var XhFieldElement = class extends XhElement {
4993
4993
  };
4994
4994
  //#endregion
4995
4995
  //#region src/elements/fieldset.ts
4996
- const BOOLEAN_CONVERTER$50 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
4996
+ const BOOLEAN_CONVERTER$52 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
4997
4997
  /**
4998
4998
  * `<xh-fieldset>` —— Light-DOM 行为宿主,无状态机,把 connectFieldset 产出的属性打到
4999
4999
  * root/legend/helper-text/error-text 角色节点上:说明与错误文案的 id 自动接进 root 的描述链。
@@ -5022,9 +5022,9 @@ var XhFieldsetElement = class extends XhElement {
5022
5022
  }
5023
5023
  };
5024
5024
  static properties = {
5025
- disabled: { converter: BOOLEAN_CONVERTER$50 },
5026
- invalid: { converter: BOOLEAN_CONVERTER$50 },
5027
- required: { converter: BOOLEAN_CONVERTER$50 },
5025
+ disabled: { converter: BOOLEAN_CONVERTER$52 },
5026
+ invalid: { converter: BOOLEAN_CONVERTER$52 },
5027
+ required: { converter: BOOLEAN_CONVERTER$52 },
5028
5028
  translations: { attribute: false }
5029
5029
  };
5030
5030
  fieldsetScope = createScope(null, createCounterIdGenerator());
@@ -5067,9 +5067,9 @@ var XhFieldsetElement = class extends XhElement {
5067
5067
  };
5068
5068
  //#endregion
5069
5069
  //#region src/elements/file-upload.ts
5070
- const STRING_CONVERTER$70 = { fromAttribute: (v) => v ?? void 0 };
5071
- const NUMBER_CONVERTER$42 = { fromAttribute: (v) => v == null || v === "" ? void 0 : Number(v) };
5072
- const BOOLEAN_CONVERTER$49 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
5070
+ const STRING_CONVERTER$72 = { fromAttribute: (v) => v ?? void 0 };
5071
+ const NUMBER_CONVERTER$44 = { fromAttribute: (v) => v == null || v === "" ? void 0 : Number(v) };
5072
+ const BOOLEAN_CONVERTER$51 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
5073
5073
  /** 取作者写在条目上的 index,缺席或写坏了退回文档序。 */
5074
5074
  function declaredIndex$1(el, position) {
5075
5075
  const raw = el.getAttribute("index");
@@ -5133,31 +5133,31 @@ var XhFileUploadElement = class XhFileUploadElement extends XhElement {
5133
5133
  defaultRemoteFiles: { attribute: false },
5134
5134
  upload: { attribute: false },
5135
5135
  autoUpload: {
5136
- converter: BOOLEAN_CONVERTER$49,
5136
+ converter: BOOLEAN_CONVERTER$51,
5137
5137
  attribute: "auto-upload"
5138
5138
  },
5139
- accept: { converter: STRING_CONVERTER$70 },
5139
+ accept: { converter: STRING_CONVERTER$72 },
5140
5140
  maxFiles: {
5141
- converter: NUMBER_CONVERTER$42,
5141
+ converter: NUMBER_CONVERTER$44,
5142
5142
  attribute: "max-files"
5143
5143
  },
5144
5144
  maxFileSize: {
5145
- converter: NUMBER_CONVERTER$42,
5145
+ converter: NUMBER_CONVERTER$44,
5146
5146
  attribute: "max-file-size"
5147
5147
  },
5148
5148
  minFileSize: {
5149
- converter: NUMBER_CONVERTER$42,
5149
+ converter: NUMBER_CONVERTER$44,
5150
5150
  attribute: "min-file-size"
5151
5151
  },
5152
5152
  disabled: { type: Boolean },
5153
5153
  invalid: { type: Boolean },
5154
- name: { converter: STRING_CONVERTER$70 },
5154
+ name: { converter: STRING_CONVERTER$72 },
5155
5155
  allowDrop: {
5156
- converter: BOOLEAN_CONVERTER$49,
5156
+ converter: BOOLEAN_CONVERTER$51,
5157
5157
  attribute: "allow-drop"
5158
5158
  },
5159
5159
  directory: { type: Boolean },
5160
- capture: { converter: STRING_CONVERTER$70 },
5160
+ capture: { converter: STRING_CONVERTER$72 },
5161
5161
  translations: { attribute: false }
5162
5162
  };
5163
5163
  uploadScope = createScope(this, createCounterIdGenerator());
@@ -5375,8 +5375,8 @@ var XhFlexElement = class extends XhElement {
5375
5375
  };
5376
5376
  //#endregion
5377
5377
  //#region src/elements/float-button.ts
5378
- const STRING_CONVERTER$69 = { fromAttribute: (v) => v ?? void 0 };
5379
- const NUMBER_CONVERTER$41 = { fromAttribute: (v) => v == null || v === "" ? void 0 : Number(v) };
5378
+ const STRING_CONVERTER$71 = { fromAttribute: (v) => v ?? void 0 };
5379
+ const NUMBER_CONVERTER$43 = { fromAttribute: (v) => v == null || v === "" ? void 0 : Number(v) };
5380
5380
  const TRISTATE_CONVERTER = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
5381
5381
  /**
5382
5382
  * `<xh-float-button>` —— 悬浮按钮行为宿主:一颗钉在视口一角的触发器,展开一组动作。
@@ -5414,11 +5414,11 @@ var XhFloatButtonElement = class extends XhElement {
5414
5414
  attribute: "default-open"
5415
5415
  },
5416
5416
  disabled: { type: Boolean },
5417
- placement: { converter: STRING_CONVERTER$69 },
5418
- offset: { converter: NUMBER_CONVERTER$41 },
5419
- shape: { converter: STRING_CONVERTER$69 },
5417
+ placement: { converter: STRING_CONVERTER$71 },
5418
+ offset: { converter: NUMBER_CONVERTER$43 },
5419
+ shape: { converter: STRING_CONVERTER$71 },
5420
5420
  expandTrigger: {
5421
- converter: STRING_CONVERTER$69,
5421
+ converter: STRING_CONVERTER$71,
5422
5422
  attribute: "expand-trigger"
5423
5423
  },
5424
5424
  translations: { attribute: false }
@@ -5466,8 +5466,8 @@ var XhFloatButtonElement = class extends XhElement {
5466
5466
  };
5467
5467
  //#endregion
5468
5468
  //#region src/elements/floating-panel.ts
5469
- const STRING_CONVERTER$68 = { fromAttribute: (v) => v ?? void 0 };
5470
- const BOOLEAN_CONVERTER$48 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
5469
+ const STRING_CONVERTER$70 = { fromAttribute: (v) => v ?? void 0 };
5470
+ const BOOLEAN_CONVERTER$50 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
5471
5471
  /** 一对数写成逗号分隔(position="24,24");读不出两个有限数就当没写。 */
5472
5472
  function parsePair(v) {
5473
5473
  if (v == null || v.trim() === "") return void 0;
@@ -5481,7 +5481,7 @@ const POSITION_CONVERTER = { fromAttribute: (v) => {
5481
5481
  y: pair[1]
5482
5482
  } : void 0;
5483
5483
  } };
5484
- const SIZE_CONVERTER = { fromAttribute: (v) => {
5484
+ const SIZE_CONVERTER$1 = { fromAttribute: (v) => {
5485
5485
  const pair = parsePair(v);
5486
5486
  return pair ? {
5487
5487
  width: pair[0],
@@ -5552,9 +5552,9 @@ var XhFloatingPanelElement = class extends XhElement {
5552
5552
  meta: floatingPanelMeta
5553
5553
  };
5554
5554
  static properties = {
5555
- open: { converter: BOOLEAN_CONVERTER$48 },
5555
+ open: { converter: BOOLEAN_CONVERTER$50 },
5556
5556
  defaultOpen: {
5557
- converter: BOOLEAN_CONVERTER$48,
5557
+ converter: BOOLEAN_CONVERTER$50,
5558
5558
  attribute: "default-open"
5559
5559
  },
5560
5560
  position: { converter: POSITION_CONVERTER },
@@ -5562,30 +5562,30 @@ var XhFloatingPanelElement = class extends XhElement {
5562
5562
  converter: POSITION_CONVERTER,
5563
5563
  attribute: "default-position"
5564
5564
  },
5565
- size: { converter: SIZE_CONVERTER },
5565
+ size: { converter: SIZE_CONVERTER$1 },
5566
5566
  defaultSize: {
5567
- converter: SIZE_CONVERTER,
5567
+ converter: SIZE_CONVERTER$1,
5568
5568
  attribute: "default-size"
5569
5569
  },
5570
5570
  minSize: {
5571
- converter: SIZE_CONVERTER,
5571
+ converter: SIZE_CONVERTER$1,
5572
5572
  attribute: "min-size"
5573
5573
  },
5574
5574
  maxSize: {
5575
- converter: SIZE_CONVERTER,
5575
+ converter: SIZE_CONVERTER$1,
5576
5576
  attribute: "max-size"
5577
5577
  },
5578
- stage: { converter: STRING_CONVERTER$68 },
5578
+ stage: { converter: STRING_CONVERTER$70 },
5579
5579
  defaultStage: {
5580
- converter: STRING_CONVERTER$68,
5580
+ converter: STRING_CONVERTER$70,
5581
5581
  attribute: "default-stage"
5582
5582
  },
5583
5583
  panelDraggable: {
5584
- converter: BOOLEAN_CONVERTER$48,
5584
+ converter: BOOLEAN_CONVERTER$50,
5585
5585
  attribute: "panel-draggable"
5586
5586
  },
5587
- resizable: { converter: BOOLEAN_CONVERTER$48 },
5588
- disabled: { converter: BOOLEAN_CONVERTER$48 },
5587
+ resizable: { converter: BOOLEAN_CONVERTER$50 },
5588
+ disabled: { converter: BOOLEAN_CONVERTER$50 },
5589
5589
  translations: { attribute: false }
5590
5590
  };
5591
5591
  idGen = createCounterIdGenerator();
@@ -5680,8 +5680,8 @@ var XhFloatingPanelElement = class extends XhElement {
5680
5680
  };
5681
5681
  //#endregion
5682
5682
  //#region src/elements/form.ts
5683
- const STRING_CONVERTER$67 = { fromAttribute: (v) => v ?? void 0 };
5684
- const BOOLEAN_CONVERTER$47 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
5683
+ const STRING_CONVERTER$69 = { fromAttribute: (v) => v ?? void 0 };
5684
+ const BOOLEAN_CONVERTER$49 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
5685
5685
  /**
5686
5686
  * 字段容器与摘要条目自报的字段名,取作者写的 `value` 属性。
5687
5687
  *
@@ -5742,21 +5742,21 @@ var XhFormElement = class extends XhElement {
5742
5742
  rules: { attribute: false },
5743
5743
  validateMessages: { attribute: false },
5744
5744
  validateOn: {
5745
- converter: STRING_CONVERTER$67,
5745
+ converter: STRING_CONVERTER$69,
5746
5746
  attribute: "validate-on"
5747
5747
  },
5748
- layout: { converter: STRING_CONVERTER$67 },
5748
+ layout: { converter: STRING_CONVERTER$69 },
5749
5749
  labelWidth: {
5750
- converter: STRING_CONVERTER$67,
5750
+ converter: STRING_CONVERTER$69,
5751
5751
  attribute: "label-width"
5752
5752
  },
5753
5753
  labelAlign: {
5754
- converter: STRING_CONVERTER$67,
5754
+ converter: STRING_CONVERTER$69,
5755
5755
  attribute: "label-align"
5756
5756
  },
5757
- disabled: { converter: BOOLEAN_CONVERTER$47 },
5757
+ disabled: { converter: BOOLEAN_CONVERTER$49 },
5758
5758
  readOnly: {
5759
- converter: BOOLEAN_CONVERTER$47,
5759
+ converter: BOOLEAN_CONVERTER$49,
5760
5760
  attribute: "read-only"
5761
5761
  }
5762
5762
  };
@@ -5891,7 +5891,7 @@ var XhFormElement = class extends XhElement {
5891
5891
  };
5892
5892
  //#endregion
5893
5893
  //#region src/elements/gradient-text.ts
5894
- const STRING_CONVERTER$66 = { fromAttribute: (v) => v ?? void 0 };
5894
+ const STRING_CONVERTER$68 = { fromAttribute: (v) => v ?? void 0 };
5895
5895
  /**
5896
5896
  * `<xh-gradient-text>` —— Light-DOM 行为宿主,无状态机,把 connectGradientText 产出打到 root 角色节点。
5897
5897
  *
@@ -5912,9 +5912,9 @@ var XhGradientTextElement = class extends XhElement {
5912
5912
  meta: gradientTextMeta
5913
5913
  };
5914
5914
  static properties = {
5915
- from: { converter: STRING_CONVERTER$66 },
5916
- to: { converter: STRING_CONVERTER$66 },
5917
- direction: { converter: STRING_CONVERTER$66 }
5915
+ from: { converter: STRING_CONVERTER$68 },
5916
+ to: { converter: STRING_CONVERTER$68 },
5917
+ direction: { converter: STRING_CONVERTER$68 }
5918
5918
  };
5919
5919
  wire() {
5920
5920
  const api = connectGradientText({
@@ -5928,7 +5928,7 @@ var XhGradientTextElement = class extends XhElement {
5928
5928
  };
5929
5929
  //#endregion
5930
5930
  //#region src/elements/grid.ts
5931
- const STRING_CONVERTER$65 = { fromAttribute: (v) => v ?? void 0 };
5931
+ const STRING_CONVERTER$67 = { fromAttribute: (v) => v ?? void 0 };
5932
5932
  /**
5933
5933
  * 列数写整数就是各档同一个列数(`cols="3"`),写 JSON 对象就是逐档的列数
5934
5934
  * (`cols='{"base":1,"md":3}'`)。解析不出对象时当没写:落一个半截对象进去,
@@ -5977,9 +5977,9 @@ var XhGridElement = class extends XhElement {
5977
5977
  };
5978
5978
  static properties = {
5979
5979
  cols: { converter: COLS_CONVERTER },
5980
- gap: { converter: STRING_CONVERTER$65 },
5981
- align: { converter: STRING_CONVERTER$65 },
5982
- justify: { converter: STRING_CONVERTER$65 }
5980
+ gap: { converter: STRING_CONVERTER$67 },
5981
+ align: { converter: STRING_CONVERTER$67 },
5982
+ justify: { converter: STRING_CONVERTER$67 }
5983
5983
  };
5984
5984
  wire() {
5985
5985
  const api = connectGrid({
@@ -6001,8 +6001,8 @@ var XhGridElement = class extends XhElement {
6001
6001
  };
6002
6002
  //#endregion
6003
6003
  //#region src/elements/heatmap.ts
6004
- const STRING_CONVERTER$64 = { fromAttribute: (v) => v ?? void 0 };
6005
- const NUMBER_CONVERTER$40 = { fromAttribute: (v) => v == null || v === "" ? void 0 : Number(v) };
6004
+ const STRING_CONVERTER$66 = { fromAttribute: (v) => v ?? void 0 };
6005
+ const NUMBER_CONVERTER$42 = { fromAttribute: (v) => v == null || v === "" ? void 0 : Number(v) };
6006
6006
  /** 角色节点上作者写的 value,解不出数字即当没写。 */
6007
6007
  function numberOf(el) {
6008
6008
  const raw = el.getAttribute("value");
@@ -6075,28 +6075,28 @@ var XhHeatmapElement = class extends XhElement {
6075
6075
  columns: { attribute: false },
6076
6076
  thresholds: { attribute: false },
6077
6077
  translations: { attribute: false },
6078
- variant: { converter: STRING_CONVERTER$64 },
6078
+ variant: { converter: STRING_CONVERTER$66 },
6079
6079
  startDate: {
6080
- converter: STRING_CONVERTER$64,
6080
+ converter: STRING_CONVERTER$66,
6081
6081
  attribute: "start-date"
6082
6082
  },
6083
6083
  endDate: {
6084
- converter: STRING_CONVERTER$64,
6084
+ converter: STRING_CONVERTER$66,
6085
6085
  attribute: "end-date"
6086
6086
  },
6087
- levels: { converter: NUMBER_CONVERTER$40 },
6087
+ levels: { converter: NUMBER_CONVERTER$42 },
6088
6088
  firstDayOfWeek: {
6089
- converter: NUMBER_CONVERTER$40,
6089
+ converter: NUMBER_CONVERTER$42,
6090
6090
  attribute: "first-day-of-week"
6091
6091
  },
6092
- locale: { converter: STRING_CONVERTER$64 },
6092
+ locale: { converter: STRING_CONVERTER$66 },
6093
6093
  direction: {
6094
- converter: STRING_CONVERTER$64,
6094
+ converter: STRING_CONVERTER$66,
6095
6095
  attribute: "dir"
6096
6096
  },
6097
- tone: { converter: STRING_CONVERTER$64 },
6098
- palette: { converter: STRING_CONVERTER$64 },
6099
- size: { converter: STRING_CONVERTER$64 }
6097
+ tone: { converter: STRING_CONVERTER$66 },
6098
+ palette: { converter: STRING_CONVERTER$66 },
6099
+ size: { converter: STRING_CONVERTER$66 }
6100
6100
  };
6101
6101
  notifyFocus = (details) => {
6102
6102
  this.dispatchEvent(new CustomEvent("cell-focus", {
@@ -6192,7 +6192,7 @@ var XhHeatmapElement = class extends XhElement {
6192
6192
  };
6193
6193
  //#endregion
6194
6194
  //#region src/elements/highlight.ts
6195
- const STRING_CONVERTER$63 = { fromAttribute: (v) => v ?? void 0 };
6195
+ const STRING_CONVERTER$65 = { fromAttribute: (v) => v ?? void 0 };
6196
6196
  /**
6197
6197
  * `<xh-highlight>` —— Light-DOM 行为宿主,无状态机,把 text 按 keyword 切段铺进 root。
6198
6198
  *
@@ -6218,8 +6218,8 @@ var XhHighlightElement = class extends XhElement {
6218
6218
  meta: highlightMeta
6219
6219
  };
6220
6220
  static properties = {
6221
- text: { converter: STRING_CONVERTER$63 },
6222
- keyword: { converter: STRING_CONVERTER$63 },
6221
+ text: { converter: STRING_CONVERTER$65 },
6222
+ keyword: { converter: STRING_CONVERTER$65 },
6223
6223
  caseSensitive: {
6224
6224
  type: Boolean,
6225
6225
  attribute: "case-sensitive"
@@ -6267,8 +6267,8 @@ var XhHighlightElement = class extends XhElement {
6267
6267
  };
6268
6268
  //#endregion
6269
6269
  //#region src/elements/hotkeys.ts
6270
- const STRING_CONVERTER$62 = { fromAttribute: (v) => v ?? void 0 };
6271
- const BOOLEAN_CONVERTER$46 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
6270
+ const STRING_CONVERTER$64 = { fromAttribute: (v) => v ?? void 0 };
6271
+ const BOOLEAN_CONVERTER$48 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
6272
6272
  const ARRAY_CONVERTER$2 = { fromAttribute: (v) => v == null ? void 0 : v.split(",").map((s) => s.trim()).filter((s) => s !== "") };
6273
6273
  /**
6274
6274
  * `<xh-hotkeys>` —— Light-DOM 行为宿主:作者写一个空的行内容器当 root,
@@ -6302,14 +6302,14 @@ var XhHotkeysElement = class extends XhElement {
6302
6302
  };
6303
6303
  static properties = {
6304
6304
  keys: { converter: ARRAY_CONVERTER$2 },
6305
- platform: { converter: STRING_CONVERTER$62 },
6306
- target: { converter: STRING_CONVERTER$62 },
6305
+ platform: { converter: STRING_CONVERTER$64 },
6306
+ target: { converter: STRING_CONVERTER$64 },
6307
6307
  preventDefault: {
6308
- converter: BOOLEAN_CONVERTER$46,
6308
+ converter: BOOLEAN_CONVERTER$48,
6309
6309
  attribute: "prevent-default"
6310
6310
  },
6311
- enabled: { converter: BOOLEAN_CONVERTER$46 },
6312
- size: { converter: STRING_CONVERTER$62 },
6311
+ enabled: { converter: BOOLEAN_CONVERTER$48 },
6312
+ size: { converter: STRING_CONVERTER$64 },
6313
6313
  translations: { attribute: false }
6314
6314
  };
6315
6315
  /** 接进文档后测出来的平台;测出来之前是 auto,connect 按非 Mac 出。 */
@@ -6396,13 +6396,13 @@ var XhHotkeysElement = class extends XhElement {
6396
6396
  };
6397
6397
  //#endregion
6398
6398
  //#region src/elements/hover-card.ts
6399
- const STRING_CONVERTER$61 = { fromAttribute: (v) => v ?? void 0 };
6400
- const NUMBER_CONVERTER$39 = { fromAttribute: (v) => {
6399
+ const STRING_CONVERTER$63 = { fromAttribute: (v) => v ?? void 0 };
6400
+ const NUMBER_CONVERTER$41 = { fromAttribute: (v) => {
6401
6401
  if (v === null) return void 0;
6402
6402
  const n = Number(v);
6403
6403
  return Number.isFinite(n) ? n : void 0;
6404
6404
  } };
6405
- const BOOLEAN_CONVERTER$45 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
6405
+ const BOOLEAN_CONVERTER$47 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
6406
6406
  /**
6407
6407
  * `<xh-hover-card>` —— Light-DOM 行为宿主:作者写 root/trigger/positioner/content/arrow 角色节点,
6408
6408
  * 元素跑 hover-card 机器并把 connect 产出打上去。
@@ -6435,27 +6435,27 @@ var XhHoverCardElement = class extends XhElement {
6435
6435
  meta: hoverCardMeta
6436
6436
  };
6437
6437
  static properties = {
6438
- open: { converter: BOOLEAN_CONVERTER$45 },
6438
+ open: { converter: BOOLEAN_CONVERTER$47 },
6439
6439
  defaultOpen: {
6440
6440
  type: Boolean,
6441
6441
  attribute: "default-open"
6442
6442
  },
6443
- placement: { converter: STRING_CONVERTER$61 },
6444
- offset: { converter: NUMBER_CONVERTER$39 },
6443
+ placement: { converter: STRING_CONVERTER$63 },
6444
+ offset: { converter: NUMBER_CONVERTER$41 },
6445
6445
  openDelay: {
6446
- converter: NUMBER_CONVERTER$39,
6446
+ converter: NUMBER_CONVERTER$41,
6447
6447
  attribute: "open-delay"
6448
6448
  },
6449
6449
  closeDelay: {
6450
- converter: NUMBER_CONVERTER$39,
6450
+ converter: NUMBER_CONVERTER$41,
6451
6451
  attribute: "close-delay"
6452
6452
  },
6453
6453
  direction: {
6454
- converter: STRING_CONVERTER$61,
6454
+ converter: STRING_CONVERTER$63,
6455
6455
  attribute: "dir"
6456
6456
  },
6457
6457
  disabled: { type: Boolean },
6458
- size: { converter: STRING_CONVERTER$61 }
6458
+ size: { converter: STRING_CONVERTER$63 }
6459
6459
  };
6460
6460
  idGen = createCounterIdGenerator();
6461
6461
  hoverCardScope = createScope(null, this.idGen);
@@ -6562,7 +6562,7 @@ var XhHoverCardElement = class extends XhElement {
6562
6562
  };
6563
6563
  //#endregion
6564
6564
  //#region src/elements/icon.ts
6565
- const STRING_CONVERTER$60 = { fromAttribute: (v) => v ?? void 0 };
6565
+ const STRING_CONVERTER$62 = { fromAttribute: (v) => v ?? void 0 };
6566
6566
  const SVG_NS$1 = "http://www.w3.org/2000/svg";
6567
6567
  /** 自带可及名字的控件;图标落在它们里面时名字该写在控件上。 */
6568
6568
  const NAMED_CONTROLS = "button, a[href], [role=\"button\"], [role=\"link\"], [role=\"menuitem\"], [role=\"tab\"], [role=\"option\"]";
@@ -6603,10 +6603,10 @@ var XhIconElement = class extends XhElement {
6603
6603
  }
6604
6604
  };
6605
6605
  static properties = {
6606
- label: { converter: STRING_CONVERTER$60 },
6607
- size: { converter: STRING_CONVERTER$60 },
6608
- weight: { converter: STRING_CONVERTER$60 },
6609
- tone: { converter: STRING_CONVERTER$60 },
6606
+ label: { converter: STRING_CONVERTER$62 },
6607
+ size: { converter: STRING_CONVERTER$62 },
6608
+ weight: { converter: STRING_CONVERTER$62 },
6609
+ tone: { converter: STRING_CONVERTER$62 },
6610
6610
  icon: { attribute: false }
6611
6611
  };
6612
6612
  /** 一个 glyph 节点归谁,首次见到时定死。 */
@@ -6730,8 +6730,8 @@ var XhIconWrapperElement = class extends XhElement {
6730
6730
  };
6731
6731
  //#endregion
6732
6732
  //#region src/elements/image.ts
6733
- const STRING_CONVERTER$59 = { fromAttribute: (v) => v ?? void 0 };
6734
- const NUMBER_CONVERTER$38 = { fromAttribute: (v) => v == null || v === "" ? void 0 : Number(v) };
6733
+ const STRING_CONVERTER$61 = { fromAttribute: (v) => v ?? void 0 };
6734
+ const NUMBER_CONVERTER$40 = { fromAttribute: (v) => v == null || v === "" ? void 0 : Number(v) };
6735
6735
  /**
6736
6736
  * `<xh-image>` —— Light-DOM 行为宿主:作者写 root/image/fallback 角色节点,
6737
6737
  * 元素跑 image 机器并把 connect 产出打上去。图片来源由宿主的 src/alt 写进 image 节点,
@@ -6755,10 +6755,10 @@ var XhImageElement = class extends XhElement {
6755
6755
  meta: imageMeta
6756
6756
  };
6757
6757
  static properties = {
6758
- src: { converter: STRING_CONVERTER$59 },
6759
- alt: { converter: STRING_CONVERTER$59 },
6758
+ src: { converter: STRING_CONVERTER$61 },
6759
+ alt: { converter: STRING_CONVERTER$61 },
6760
6760
  fallbackDelay: {
6761
- converter: NUMBER_CONVERTER$38,
6761
+ converter: NUMBER_CONVERTER$40,
6762
6762
  attribute: "fallback-delay"
6763
6763
  }
6764
6764
  };
@@ -6814,9 +6814,9 @@ var XhImageElement = class extends XhElement {
6814
6814
  };
6815
6815
  //#endregion
6816
6816
  //#region src/elements/image-cropper.ts
6817
- const STRING_CONVERTER$58 = { fromAttribute: (v) => v ?? void 0 };
6818
- const NUMBER_CONVERTER$37 = { fromAttribute: (v) => v == null || v === "" ? void 0 : Number(v) };
6819
- const BOOLEAN_CONVERTER$44 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
6817
+ const STRING_CONVERTER$60 = { fromAttribute: (v) => v ?? void 0 };
6818
+ const NUMBER_CONVERTER$39 = { fromAttribute: (v) => v == null || v === "" ? void 0 : Number(v) };
6819
+ const BOOLEAN_CONVERTER$46 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
6820
6820
  /**
6821
6821
  * 裁切矩形写成逗号分隔的四个数:`x,y,width,height`。
6822
6822
  * 读不出四个有限数就当没写:留下 NaN 会一路写进定位百分比与表单值。
@@ -6887,38 +6887,38 @@ var XhImageCropperElement = class extends XhElement {
6887
6887
  meta: imageCropperMeta
6888
6888
  };
6889
6889
  static properties = {
6890
- src: { converter: STRING_CONVERTER$58 },
6891
- alt: { converter: STRING_CONVERTER$58 },
6890
+ src: { converter: STRING_CONVERTER$60 },
6891
+ alt: { converter: STRING_CONVERTER$60 },
6892
6892
  value: { converter: RECT_CONVERTER },
6893
6893
  defaultValue: {
6894
6894
  converter: RECT_CONVERTER,
6895
6895
  attribute: "default-value"
6896
6896
  },
6897
6897
  aspectRatio: {
6898
- converter: NUMBER_CONVERTER$37,
6898
+ converter: NUMBER_CONVERTER$39,
6899
6899
  attribute: "aspect-ratio"
6900
6900
  },
6901
6901
  minWidth: {
6902
- converter: NUMBER_CONVERTER$37,
6902
+ converter: NUMBER_CONVERTER$39,
6903
6903
  attribute: "min-width"
6904
6904
  },
6905
6905
  minHeight: {
6906
- converter: NUMBER_CONVERTER$37,
6906
+ converter: NUMBER_CONVERTER$39,
6907
6907
  attribute: "min-height"
6908
6908
  },
6909
- zoom: { converter: NUMBER_CONVERTER$37 },
6909
+ zoom: { converter: NUMBER_CONVERTER$39 },
6910
6910
  defaultZoom: {
6911
- converter: NUMBER_CONVERTER$37,
6911
+ converter: NUMBER_CONVERTER$39,
6912
6912
  attribute: "default-zoom"
6913
6913
  },
6914
- rotation: { converter: NUMBER_CONVERTER$37 },
6915
- shape: { converter: STRING_CONVERTER$58 },
6916
- disabled: { converter: BOOLEAN_CONVERTER$44 },
6914
+ rotation: { converter: NUMBER_CONVERTER$39 },
6915
+ shape: { converter: STRING_CONVERTER$60 },
6916
+ disabled: { converter: BOOLEAN_CONVERTER$46 },
6917
6917
  readOnly: {
6918
- converter: BOOLEAN_CONVERTER$44,
6918
+ converter: BOOLEAN_CONVERTER$46,
6919
6919
  attribute: "read-only"
6920
6920
  },
6921
- name: { converter: STRING_CONVERTER$58 },
6921
+ name: { converter: STRING_CONVERTER$60 },
6922
6922
  translations: { attribute: false }
6923
6923
  };
6924
6924
  notifyValue = (details) => {
@@ -7007,8 +7007,8 @@ var XhImageCropperElement = class extends XhElement {
7007
7007
  };
7008
7008
  //#endregion
7009
7009
  //#region src/elements/image-viewer.ts
7010
- const BOOLEAN_CONVERTER$43 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
7011
- const NUMBER_CONVERTER$36 = { fromAttribute: (v) => v === null ? void 0 : Number(v) };
7010
+ const BOOLEAN_CONVERTER$45 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
7011
+ const NUMBER_CONVERTER$38 = { fromAttribute: (v) => v === null ? void 0 : Number(v) };
7012
7012
  /**
7013
7013
  * `<xh-image-viewer>` —— Light-DOM 行为宿主,跑 image-viewer 机器:
7014
7014
  * 模态看片浮层,滚轮缩放、拖拽平移、旋转翻转与多图翻页。
@@ -7052,39 +7052,39 @@ var XhImageViewerElement = class extends XhElement {
7052
7052
  meta: imageViewerMeta
7053
7053
  };
7054
7054
  static properties = {
7055
- open: { converter: BOOLEAN_CONVERTER$43 },
7055
+ open: { converter: BOOLEAN_CONVERTER$45 },
7056
7056
  defaultOpen: {
7057
7057
  type: Boolean,
7058
7058
  attribute: "default-open"
7059
7059
  },
7060
- index: { converter: NUMBER_CONVERTER$36 },
7060
+ index: { converter: NUMBER_CONVERTER$38 },
7061
7061
  defaultIndex: {
7062
- converter: NUMBER_CONVERTER$36,
7062
+ converter: NUMBER_CONVERTER$38,
7063
7063
  attribute: "default-index"
7064
7064
  },
7065
- loop: { converter: BOOLEAN_CONVERTER$43 },
7065
+ loop: { converter: BOOLEAN_CONVERTER$45 },
7066
7066
  zoomStep: {
7067
- converter: NUMBER_CONVERTER$36,
7067
+ converter: NUMBER_CONVERTER$38,
7068
7068
  attribute: "zoom-step"
7069
7069
  },
7070
7070
  minScale: {
7071
- converter: NUMBER_CONVERTER$36,
7071
+ converter: NUMBER_CONVERTER$38,
7072
7072
  attribute: "min-scale"
7073
7073
  },
7074
7074
  maxScale: {
7075
- converter: NUMBER_CONVERTER$36,
7075
+ converter: NUMBER_CONVERTER$38,
7076
7076
  attribute: "max-scale"
7077
7077
  },
7078
7078
  closeOnEscape: {
7079
- converter: BOOLEAN_CONVERTER$43,
7079
+ converter: BOOLEAN_CONVERTER$45,
7080
7080
  attribute: "close-on-escape"
7081
7081
  },
7082
7082
  closeOnInteractOutside: {
7083
- converter: BOOLEAN_CONVERTER$43,
7083
+ converter: BOOLEAN_CONVERTER$45,
7084
7084
  attribute: "close-on-interact-outside"
7085
7085
  },
7086
7086
  restoreFocus: {
7087
- converter: BOOLEAN_CONVERTER$43,
7087
+ converter: BOOLEAN_CONVERTER$45,
7088
7088
  attribute: "restore-focus"
7089
7089
  },
7090
7090
  items: { attribute: false },
@@ -7225,8 +7225,8 @@ var XhImageViewerElement = class extends XhElement {
7225
7225
  };
7226
7226
  //#endregion
7227
7227
  //#region src/elements/infinite-scroll.ts
7228
- const NUMBER_CONVERTER$35 = { fromAttribute: (v) => v == null || v === "" ? void 0 : Number(v) };
7229
- const BOOLEAN_CONVERTER$42 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
7228
+ const NUMBER_CONVERTER$37 = { fromAttribute: (v) => v == null || v === "" ? void 0 : Number(v) };
7229
+ const BOOLEAN_CONVERTER$44 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
7230
7230
  /**
7231
7231
  * `<xh-infinite-scroll>` —— 无限滚动行为宿主:摆在列表末尾的哨兵一进可视区就报「该取下一页了」。
7232
7232
  *
@@ -7249,9 +7249,9 @@ var XhInfiniteScrollElement = class extends XhElement {
7249
7249
  meta: infiniteScrollMeta
7250
7250
  };
7251
7251
  static properties = {
7252
- distance: { converter: NUMBER_CONVERTER$35 },
7253
- disabled: { converter: BOOLEAN_CONVERTER$42 },
7254
- loading: { converter: BOOLEAN_CONVERTER$42 },
7252
+ distance: { converter: NUMBER_CONVERTER$37 },
7253
+ disabled: { converter: BOOLEAN_CONVERTER$44 },
7254
+ loading: { converter: BOOLEAN_CONVERTER$44 },
7255
7255
  target: { attribute: false }
7256
7256
  };
7257
7257
  notify = () => {
@@ -7285,9 +7285,9 @@ var XhInfiniteScrollElement = class extends XhElement {
7285
7285
  };
7286
7286
  //#endregion
7287
7287
  //#region src/elements/json-viewer.ts
7288
- const STRING_CONVERTER$57 = { fromAttribute: (v) => v ?? void 0 };
7289
- const NUMBER_CONVERTER$34 = { fromAttribute: (v) => v == null || v === "" ? void 0 : Number(v) };
7290
- const BOOLEAN_CONVERTER$41 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
7288
+ const STRING_CONVERTER$59 = { fromAttribute: (v) => v ?? void 0 };
7289
+ const NUMBER_CONVERTER$36 = { fromAttribute: (v) => v == null || v === "" ? void 0 : Number(v) };
7290
+ const BOOLEAN_CONVERTER$43 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
7291
7291
  const JSON_CONVERTER = { fromAttribute: (v) => {
7292
7292
  if (v == null) return void 0;
7293
7293
  try {
@@ -7375,28 +7375,28 @@ var XhJsonViewerElement = class extends XhElement {
7375
7375
  expandedValue: { attribute: false },
7376
7376
  defaultExpandedValue: { attribute: false },
7377
7377
  defaultExpandedDepth: {
7378
- converter: NUMBER_CONVERTER$34,
7378
+ converter: NUMBER_CONVERTER$36,
7379
7379
  attribute: "default-expanded-depth"
7380
7380
  },
7381
7381
  maxStringLength: {
7382
- converter: NUMBER_CONVERTER$34,
7382
+ converter: NUMBER_CONVERTER$36,
7383
7383
  attribute: "max-string-length"
7384
7384
  },
7385
7385
  maxItems: {
7386
- converter: NUMBER_CONVERTER$34,
7386
+ converter: NUMBER_CONVERTER$36,
7387
7387
  attribute: "max-items"
7388
7388
  },
7389
7389
  sortKeys: {
7390
- converter: BOOLEAN_CONVERTER$41,
7390
+ converter: BOOLEAN_CONVERTER$43,
7391
7391
  attribute: "sort-keys"
7392
7392
  },
7393
7393
  view: { attribute: "view" },
7394
- loop: { converter: BOOLEAN_CONVERTER$41 },
7394
+ loop: { converter: BOOLEAN_CONVERTER$43 },
7395
7395
  direction: {
7396
- converter: STRING_CONVERTER$57,
7396
+ converter: STRING_CONVERTER$59,
7397
7397
  attribute: "dir"
7398
7398
  },
7399
- size: { converter: STRING_CONVERTER$57 },
7399
+ size: { converter: STRING_CONVERTER$59 },
7400
7400
  translations: { attribute: false }
7401
7401
  };
7402
7402
  notify = (details) => {
@@ -7584,7 +7584,7 @@ var XhJsonViewerElement = class extends XhElement {
7584
7584
  };
7585
7585
  //#endregion
7586
7586
  //#region src/elements/layout.ts
7587
- const STRING_CONVERTER$56 = { fromAttribute: (v) => v ?? void 0 };
7587
+ const STRING_CONVERTER$58 = { fromAttribute: (v) => v ?? void 0 };
7588
7588
  /**
7589
7589
  * `<xh-layout>` —— 页面骨架的 Light-DOM 行为宿主,跑 layout 机器并把 connect 产出打到
7590
7590
  * root/header/sider/content/footer/sider-trigger 角色节点。
@@ -7630,15 +7630,15 @@ var XhLayoutElement = class extends XhElement {
7630
7630
  },
7631
7631
  siderWidth: {
7632
7632
  attribute: "sider-width",
7633
- converter: STRING_CONVERTER$56
7633
+ converter: STRING_CONVERTER$58
7634
7634
  },
7635
7635
  siderCollapsedWidth: {
7636
7636
  attribute: "sider-collapsed-width",
7637
- converter: STRING_CONVERTER$56
7637
+ converter: STRING_CONVERTER$58
7638
7638
  },
7639
7639
  siderPlacement: {
7640
7640
  attribute: "sider-placement",
7641
- converter: STRING_CONVERTER$56
7641
+ converter: STRING_CONVERTER$58
7642
7642
  },
7643
7643
  headerFixed: {
7644
7644
  type: Boolean,
@@ -7687,7 +7687,7 @@ var XhLayoutElement = class extends XhElement {
7687
7687
  };
7688
7688
  //#endregion
7689
7689
  //#region src/elements/list.ts
7690
- const STRING_CONVERTER$55 = { fromAttribute: (v) => v ?? void 0 };
7690
+ const STRING_CONVERTER$57 = { fromAttribute: (v) => v ?? void 0 };
7691
7691
  /**
7692
7692
  * `<xh-list>` —— Light-DOM 行为宿主,无状态机,把 connectList 产出打到各角色节点。
7693
7693
  * 除 root 外的部件全部可缺省:空列表、只有一行标题的条目都是合法形态。
@@ -7717,7 +7717,7 @@ var XhListElement = class extends XhElement {
7717
7717
  bordered: { type: Boolean },
7718
7718
  hoverable: { type: Boolean },
7719
7719
  split: { type: Boolean },
7720
- size: { converter: STRING_CONVERTER$55 }
7720
+ size: { converter: STRING_CONVERTER$57 }
7721
7721
  };
7722
7722
  wire() {
7723
7723
  const api = connectList(this.configured("list", {
@@ -7741,8 +7741,8 @@ var XhListElement = class extends XhElement {
7741
7741
  };
7742
7742
  //#endregion
7743
7743
  //#region src/elements/listbox.ts
7744
- const STRING_CONVERTER$54 = { fromAttribute: (v) => v ?? void 0 };
7745
- const BOOLEAN_CONVERTER$40 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
7744
+ const STRING_CONVERTER$56 = { fromAttribute: (v) => v ?? void 0 };
7745
+ const BOOLEAN_CONVERTER$42 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
7746
7746
  /**
7747
7747
  * `<xh-listbox>` —— Light-DOM 行为宿主:作者写 root/label/content 与若干 item 角色节点,
7748
7748
  * 元素跑 listbox 机器并把 connect 产出打上去。条目身份取自条目节点上的 value 属性,
@@ -7784,24 +7784,24 @@ var XhListboxElement = class extends XhElement {
7784
7784
  };
7785
7785
  static properties = {
7786
7786
  collection: { attribute: false },
7787
- value: { converter: STRING_CONVERTER$54 },
7787
+ value: { converter: STRING_CONVERTER$56 },
7788
7788
  defaultValue: {
7789
- converter: STRING_CONVERTER$54,
7789
+ converter: STRING_CONVERTER$56,
7790
7790
  attribute: "default-value"
7791
7791
  },
7792
7792
  multiple: { type: Boolean },
7793
7793
  selectionMode: {
7794
- converter: STRING_CONVERTER$54,
7794
+ converter: STRING_CONVERTER$56,
7795
7795
  attribute: "selection-mode"
7796
7796
  },
7797
7797
  disabled: { type: Boolean },
7798
- loop: { converter: BOOLEAN_CONVERTER$40 },
7798
+ loop: { converter: BOOLEAN_CONVERTER$42 },
7799
7799
  direction: {
7800
- converter: STRING_CONVERTER$54,
7800
+ converter: STRING_CONVERTER$56,
7801
7801
  attribute: "dir"
7802
7802
  },
7803
- orientation: { converter: STRING_CONVERTER$54 },
7804
- typeahead: { converter: BOOLEAN_CONVERTER$40 }
7803
+ orientation: { converter: STRING_CONVERTER$56 },
7804
+ typeahead: { converter: BOOLEAN_CONVERTER$42 }
7805
7805
  };
7806
7806
  declaredDisabled = /* @__PURE__ */ new WeakMap();
7807
7807
  /** 上一帧是否整列禁用:解禁当帧 DOM 上还留着机器写回的 aria-disabled,读不得。 */
@@ -7899,9 +7899,9 @@ var XhListboxElement = class extends XhElement {
7899
7899
  };
7900
7900
  //#endregion
7901
7901
  //#region src/elements/loading-bar.ts
7902
- const STRING_CONVERTER$53 = { fromAttribute: (v) => v ?? void 0 };
7903
- const NUMBER_CONVERTER$33 = { fromAttribute: (v) => v == null || v === "" ? void 0 : Number(v) };
7904
- const BOOLEAN_CONVERTER$39 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
7902
+ const STRING_CONVERTER$55 = { fromAttribute: (v) => v ?? void 0 };
7903
+ const NUMBER_CONVERTER$35 = { fromAttribute: (v) => v == null || v === "" ? void 0 : Number(v) };
7904
+ const BOOLEAN_CONVERTER$41 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
7905
7905
  const HEIGHT_CONVERTER = { fromAttribute: (v) => {
7906
7906
  if (v == null || v === "") return void 0;
7907
7907
  const px = Number(v);
@@ -7940,23 +7940,23 @@ var XhLoadingBarElement = class extends XhElement {
7940
7940
  meta: loadingBarMeta
7941
7941
  };
7942
7942
  static properties = {
7943
- value: { converter: NUMBER_CONVERTER$33 },
7943
+ value: { converter: NUMBER_CONVERTER$35 },
7944
7944
  defaultValue: {
7945
- converter: NUMBER_CONVERTER$33,
7945
+ converter: NUMBER_CONVERTER$35,
7946
7946
  attribute: "default-value"
7947
7947
  },
7948
- loading: { converter: BOOLEAN_CONVERTER$39 },
7948
+ loading: { converter: BOOLEAN_CONVERTER$41 },
7949
7949
  height: { converter: HEIGHT_CONVERTER },
7950
- color: { converter: STRING_CONVERTER$53 },
7951
- tone: { converter: STRING_CONVERTER$53 },
7952
- trickle: { converter: BOOLEAN_CONVERTER$39 },
7950
+ color: { converter: STRING_CONVERTER$55 },
7951
+ tone: { converter: STRING_CONVERTER$55 },
7952
+ trickle: { converter: BOOLEAN_CONVERTER$41 },
7953
7953
  trickleSpeed: {
7954
- converter: NUMBER_CONVERTER$33,
7954
+ converter: NUMBER_CONVERTER$35,
7955
7955
  attribute: "trickle-speed"
7956
7956
  },
7957
- minimum: { converter: NUMBER_CONVERTER$33 },
7957
+ minimum: { converter: NUMBER_CONVERTER$35 },
7958
7958
  fadeDuration: {
7959
- converter: NUMBER_CONVERTER$33,
7959
+ converter: NUMBER_CONVERTER$35,
7960
7960
  attribute: "fade-duration"
7961
7961
  },
7962
7962
  translations: { attribute: false }
@@ -7999,7 +7999,7 @@ var XhLoadingBarElement = class extends XhElement {
7999
7999
  };
8000
8000
  //#endregion
8001
8001
  //#region src/elements/log.ts
8002
- const NUMBER_CONVERTER$32 = { fromAttribute: (v) => v == null || v === "" ? void 0 : Number(v) };
8002
+ const NUMBER_CONVERTER$34 = { fromAttribute: (v) => v == null || v === "" ? void 0 : Number(v) };
8003
8003
  /**
8004
8004
  * `<xh-log>` —— Light-DOM 行为宿主:作者写 root/viewport/content/line 角色节点,
8005
8005
  * 元素把 connectLog 的产出打上去。行长出来时跟随滚动到底部,用户上滚后解除粘附,
@@ -8024,7 +8024,7 @@ var XhLogElement = class extends XhElement {
8024
8024
  meta: logMeta
8025
8025
  };
8026
8026
  static properties = {
8027
- rows: { converter: NUMBER_CONVERTER$32 },
8027
+ rows: { converter: NUMBER_CONVERTER$34 },
8028
8028
  loading: { type: Boolean },
8029
8029
  translations: { attribute: false }
8030
8030
  };
@@ -8085,8 +8085,8 @@ var XhLogElement = class extends XhElement {
8085
8085
  };
8086
8086
  //#endregion
8087
8087
  //#region src/elements/marquee.ts
8088
- const STRING_CONVERTER$52 = { fromAttribute: (v) => v ?? void 0 };
8089
- const NUMBER_CONVERTER$31 = { fromAttribute: (v) => v == null || v === "" ? void 0 : Number(v) };
8088
+ const STRING_CONVERTER$54 = { fromAttribute: (v) => v ?? void 0 };
8089
+ const NUMBER_CONVERTER$33 = { fromAttribute: (v) => v == null || v === "" ? void 0 : Number(v) };
8090
8090
  /**
8091
8091
  * `<xh-marquee>` —— Light-DOM 行为宿主,无状态机,把 connectMarquee 产出打到 root 与 content 上。
8092
8092
  *
@@ -8113,8 +8113,8 @@ var XhMarqueeElement = class extends XhElement {
8113
8113
  meta: marqueeMeta
8114
8114
  };
8115
8115
  static properties = {
8116
- direction: { converter: STRING_CONVERTER$52 },
8117
- speed: { converter: NUMBER_CONVERTER$31 },
8116
+ direction: { converter: STRING_CONVERTER$54 },
8117
+ speed: { converter: NUMBER_CONVERTER$33 },
8118
8118
  pauseOnHover: {
8119
8119
  type: Boolean,
8120
8120
  attribute: "pause-on-hover"
@@ -8141,8 +8141,8 @@ var XhMarqueeElement = class extends XhElement {
8141
8141
  };
8142
8142
  //#endregion
8143
8143
  //#region src/elements/masonry.ts
8144
- const STRING_CONVERTER$51 = { fromAttribute: (v) => v ?? void 0 };
8145
- const BOOLEAN_CONVERTER$38 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
8144
+ const STRING_CONVERTER$53 = { fromAttribute: (v) => v ?? void 0 };
8145
+ const BOOLEAN_CONVERTER$40 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
8146
8146
  /**
8147
8147
  * 列数写整数就是各档同一个列数(`columns="3"`),写 JSON 对象就是逐档的列数
8148
8148
  * (`columns='{"base":1,"md":3}'`)。解析不出对象时当没写:落一个半截对象进去,
@@ -8186,8 +8186,8 @@ var XhMasonryElement = class extends XhElement {
8186
8186
  };
8187
8187
  static properties = {
8188
8188
  columns: { converter: COLUMNS_CONVERTER },
8189
- gap: { converter: STRING_CONVERTER$51 },
8190
- sequential: { converter: BOOLEAN_CONVERTER$38 }
8189
+ gap: { converter: STRING_CONVERTER$53 },
8190
+ sequential: { converter: BOOLEAN_CONVERTER$40 }
8191
8191
  };
8192
8192
  /** 每一项首次被看到时的序号,重排后 DOM 序等于列序,原序只剩它认得出来。 */
8193
8193
  seen = /* @__PURE__ */ new WeakMap();
@@ -8263,9 +8263,9 @@ var XhMasonryElement = class extends XhElement {
8263
8263
  };
8264
8264
  //#endregion
8265
8265
  //#region src/elements/mention.ts
8266
- const STRING_CONVERTER$50 = { fromAttribute: (v) => v ?? void 0 };
8267
- const NUMBER_CONVERTER$30 = { fromAttribute: (v) => v === null ? void 0 : Number(v) };
8268
- const BOOLEAN_CONVERTER$37 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
8266
+ const STRING_CONVERTER$52 = { fromAttribute: (v) => v ?? void 0 };
8267
+ const NUMBER_CONVERTER$32 = { fromAttribute: (v) => v === null ? void 0 : Number(v) };
8268
+ const BOOLEAN_CONVERTER$39 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
8269
8269
  /**
8270
8270
  * `<xh-mention>` —— Light-DOM 行为宿主:作者写 root/input/positioner/content/item 角色节点,
8271
8271
  * 元素跑 mention 机器并把 connect 产出打上去。浮层定位引擎在本元素里建好、经 refs 注入机器,
@@ -8316,12 +8316,12 @@ var XhMentionElement = class extends XhElement {
8316
8316
  collection: { attribute: false },
8317
8317
  translations: { attribute: false },
8318
8318
  triggerPrefix: {
8319
- converter: STRING_CONVERTER$50,
8319
+ converter: STRING_CONVERTER$52,
8320
8320
  attribute: "prefix"
8321
8321
  },
8322
- value: { converter: STRING_CONVERTER$50 },
8322
+ value: { converter: STRING_CONVERTER$52 },
8323
8323
  defaultValue: {
8324
- converter: STRING_CONVERTER$50,
8324
+ converter: STRING_CONVERTER$52,
8325
8325
  attribute: "default-value"
8326
8326
  },
8327
8327
  disabled: { type: Boolean },
@@ -8330,13 +8330,13 @@ var XhMentionElement = class extends XhElement {
8330
8330
  attribute: "read-only"
8331
8331
  },
8332
8332
  invalid: { type: Boolean },
8333
- placeholder: { converter: STRING_CONVERTER$50 },
8334
- loop: { converter: BOOLEAN_CONVERTER$37 },
8335
- placement: { converter: STRING_CONVERTER$50 },
8336
- offset: { converter: NUMBER_CONVERTER$30 },
8337
- variant: { converter: STRING_CONVERTER$50 },
8338
- tone: { converter: STRING_CONVERTER$50 },
8339
- size: { converter: STRING_CONVERTER$50 }
8333
+ placeholder: { converter: STRING_CONVERTER$52 },
8334
+ loop: { converter: BOOLEAN_CONVERTER$39 },
8335
+ placement: { converter: STRING_CONVERTER$52 },
8336
+ offset: { converter: NUMBER_CONVERTER$32 },
8337
+ variant: { converter: STRING_CONVERTER$52 },
8338
+ tone: { converter: STRING_CONVERTER$52 },
8339
+ size: { converter: STRING_CONVERTER$52 }
8340
8340
  };
8341
8341
  idGen = createCounterIdGenerator();
8342
8342
  mentionScope = createScope(null, this.idGen);
@@ -8485,9 +8485,9 @@ var XhMentionElement = class extends XhElement {
8485
8485
  };
8486
8486
  //#endregion
8487
8487
  //#region src/elements/menu.ts
8488
- const STRING_CONVERTER$49 = { fromAttribute: (v) => v ?? void 0 };
8489
- const NUMBER_CONVERTER$29 = { fromAttribute: (v) => v === null ? void 0 : Number(v) };
8490
- const BOOLEAN_CONVERTER$36 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
8488
+ const STRING_CONVERTER$51 = { fromAttribute: (v) => v ?? void 0 };
8489
+ const NUMBER_CONVERTER$31 = { fromAttribute: (v) => v === null ? void 0 : Number(v) };
8490
+ const BOOLEAN_CONVERTER$38 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
8491
8491
  /**
8492
8492
  * `<xh-menu>` —— Light-DOM 行为宿主:用户写 trigger/positioner/content/item/group/... 角色节点,
8493
8493
  * 元素跑 menu 机器并把 connect 产出打上去。浮层定位引擎在本元素里建好、经 refs 注入机器,
@@ -8521,31 +8521,31 @@ var XhMenuElement = class extends XhElement {
8521
8521
  };
8522
8522
  static properties = {
8523
8523
  collection: { attribute: false },
8524
- open: { converter: BOOLEAN_CONVERTER$36 },
8524
+ open: { converter: BOOLEAN_CONVERTER$38 },
8525
8525
  defaultOpen: {
8526
8526
  type: Boolean,
8527
8527
  attribute: "default-open"
8528
8528
  },
8529
- placement: { converter: STRING_CONVERTER$49 },
8530
- offset: { converter: NUMBER_CONVERTER$29 },
8531
- loop: { converter: BOOLEAN_CONVERTER$36 },
8529
+ placement: { converter: STRING_CONVERTER$51 },
8530
+ offset: { converter: NUMBER_CONVERTER$31 },
8531
+ loop: { converter: BOOLEAN_CONVERTER$38 },
8532
8532
  direction: {
8533
- converter: STRING_CONVERTER$49,
8533
+ converter: STRING_CONVERTER$51,
8534
8534
  attribute: "dir"
8535
8535
  },
8536
- tone: { converter: STRING_CONVERTER$49 },
8537
- size: { converter: STRING_CONVERTER$49 },
8538
- submenu: { converter: BOOLEAN_CONVERTER$36 },
8536
+ tone: { converter: STRING_CONVERTER$51 },
8537
+ size: { converter: STRING_CONVERTER$51 },
8538
+ submenu: { converter: BOOLEAN_CONVERTER$38 },
8539
8539
  openOnHover: {
8540
- converter: BOOLEAN_CONVERTER$36,
8540
+ converter: BOOLEAN_CONVERTER$38,
8541
8541
  attribute: "open-on-hover"
8542
8542
  },
8543
8543
  hoverOpenDelay: {
8544
- converter: NUMBER_CONVERTER$29,
8544
+ converter: NUMBER_CONVERTER$31,
8545
8545
  attribute: "hover-open-delay"
8546
8546
  },
8547
8547
  hoverCloseDelay: {
8548
- converter: NUMBER_CONVERTER$29,
8548
+ converter: NUMBER_CONVERTER$31,
8549
8549
  attribute: "hover-close-delay"
8550
8550
  }
8551
8551
  };
@@ -8699,9 +8699,9 @@ var XhMenuElement = class extends XhElement {
8699
8699
  };
8700
8700
  //#endregion
8701
8701
  //#region src/elements/menubar.ts
8702
- const STRING_CONVERTER$48 = { fromAttribute: (v) => v ?? void 0 };
8703
- const NUMBER_CONVERTER$28 = { fromAttribute: (v) => v === null ? void 0 : Number(v) };
8704
- const BOOLEAN_CONVERTER$35 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
8702
+ const STRING_CONVERTER$50 = { fromAttribute: (v) => v ?? void 0 };
8703
+ const NUMBER_CONVERTER$30 = { fromAttribute: (v) => v === null ? void 0 : Number(v) };
8704
+ const BOOLEAN_CONVERTER$37 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
8705
8705
  /** 读角色节点的禁用声明,并摘掉作者写的原生 disabled,禁用态归一到 aria-disabled。 */
8706
8706
  function authorDisabled$1(el) {
8707
8707
  const disabled = isItemDisabled(el);
@@ -8755,23 +8755,23 @@ var XhMenubarElement = class extends XhElement {
8755
8755
  };
8756
8756
  static properties = {
8757
8757
  collection: { attribute: false },
8758
- value: { converter: STRING_CONVERTER$48 },
8758
+ value: { converter: STRING_CONVERTER$50 },
8759
8759
  defaultValue: {
8760
- converter: STRING_CONVERTER$48,
8760
+ converter: STRING_CONVERTER$50,
8761
8761
  attribute: "default-value"
8762
8762
  },
8763
- orientation: { converter: STRING_CONVERTER$48 },
8764
- loop: { converter: BOOLEAN_CONVERTER$35 },
8763
+ orientation: { converter: STRING_CONVERTER$50 },
8764
+ loop: { converter: BOOLEAN_CONVERTER$37 },
8765
8765
  direction: {
8766
- converter: STRING_CONVERTER$48,
8766
+ converter: STRING_CONVERTER$50,
8767
8767
  attribute: "dir"
8768
8768
  },
8769
- disabled: { converter: BOOLEAN_CONVERTER$35 },
8770
- typeahead: { converter: BOOLEAN_CONVERTER$35 },
8771
- placement: { converter: STRING_CONVERTER$48 },
8772
- offset: { converter: NUMBER_CONVERTER$28 },
8773
- tone: { converter: STRING_CONVERTER$48 },
8774
- size: { converter: STRING_CONVERTER$48 }
8769
+ disabled: { converter: BOOLEAN_CONVERTER$37 },
8770
+ typeahead: { converter: BOOLEAN_CONVERTER$37 },
8771
+ placement: { converter: STRING_CONVERTER$50 },
8772
+ offset: { converter: NUMBER_CONVERTER$30 },
8773
+ tone: { converter: STRING_CONVERTER$50 },
8774
+ size: { converter: STRING_CONVERTER$50 }
8775
8775
  };
8776
8776
  idGen = createCounterIdGenerator();
8777
8777
  barScope = createScope(null, this.idGen);
@@ -8922,9 +8922,9 @@ var XhMenubarElement = class extends XhElement {
8922
8922
  };
8923
8923
  //#endregion
8924
8924
  //#region src/elements/navigation-menu.ts
8925
- const STRING_CONVERTER$47 = { fromAttribute: (v) => v ?? void 0 };
8926
- const NUMBER_CONVERTER$27 = { fromAttribute: (v) => v === null ? void 0 : Number(v) };
8927
- const BOOLEAN_CONVERTER$34 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
8925
+ const STRING_CONVERTER$49 = { fromAttribute: (v) => v ?? void 0 };
8926
+ const NUMBER_CONVERTER$29 = { fromAttribute: (v) => v === null ? void 0 : Number(v) };
8927
+ const BOOLEAN_CONVERTER$36 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
8928
8928
  /**
8929
8929
  * 作者写在角色节点上的布尔声明,三态读法:属性缺席 = false,="false" = false,其余 = true。
8930
8930
  */
@@ -8988,27 +8988,27 @@ var XhNavigationMenuElement = class extends XhElement {
8988
8988
  };
8989
8989
  static properties = {
8990
8990
  collection: { attribute: false },
8991
- value: { converter: STRING_CONVERTER$47 },
8991
+ value: { converter: STRING_CONVERTER$49 },
8992
8992
  defaultValue: {
8993
- converter: STRING_CONVERTER$47,
8993
+ converter: STRING_CONVERTER$49,
8994
8994
  attribute: "default-value"
8995
8995
  },
8996
- orientation: { converter: STRING_CONVERTER$47 },
8996
+ orientation: { converter: STRING_CONVERTER$49 },
8997
8997
  delayDuration: {
8998
- converter: NUMBER_CONVERTER$27,
8998
+ converter: NUMBER_CONVERTER$29,
8999
8999
  attribute: "delay-duration"
9000
9000
  },
9001
9001
  skipDelayDuration: {
9002
- converter: NUMBER_CONVERTER$27,
9002
+ converter: NUMBER_CONVERTER$29,
9003
9003
  attribute: "skip-delay-duration"
9004
9004
  },
9005
9005
  direction: {
9006
- converter: STRING_CONVERTER$47,
9006
+ converter: STRING_CONVERTER$49,
9007
9007
  attribute: "dir"
9008
9008
  },
9009
- loop: { converter: BOOLEAN_CONVERTER$34 },
9010
- tone: { converter: STRING_CONVERTER$47 },
9011
- size: { converter: STRING_CONVERTER$47 },
9009
+ loop: { converter: BOOLEAN_CONVERTER$36 },
9010
+ tone: { converter: STRING_CONVERTER$49 },
9011
+ size: { converter: STRING_CONVERTER$49 },
9012
9012
  translations: { attribute: false }
9013
9013
  };
9014
9014
  idGen = createCounterIdGenerator();
@@ -9122,9 +9122,9 @@ var XhNavigationMenuElement = class extends XhElement {
9122
9122
  };
9123
9123
  //#endregion
9124
9124
  //#region src/elements/notification.ts
9125
- const STRING_CONVERTER$46 = { fromAttribute: (v) => v ?? void 0 };
9126
- const NUMBER_CONVERTER$26 = { fromAttribute: (v) => v == null || v === "" ? void 0 : Number(v) };
9127
- const BOOLEAN_CONVERTER$33 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
9125
+ const STRING_CONVERTER$48 = { fromAttribute: (v) => v ?? void 0 };
9126
+ const NUMBER_CONVERTER$28 = { fromAttribute: (v) => v == null || v === "" ? void 0 : Number(v) };
9127
+ const BOOLEAN_CONVERTER$35 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
9128
9128
  /**
9129
9129
  * 这一摞对应哪个位置。属性缺席就交 undefined,由 connect 回落到队列的 placement。
9130
9130
  * 写坏了照原样交出去:它与九个位没有一个对得上,这摞就一直是空的——
@@ -9162,16 +9162,16 @@ var XhNotificationElement = class extends XhElement {
9162
9162
  static properties = {
9163
9163
  items: { attribute: false },
9164
9164
  defaultItems: { attribute: false },
9165
- placement: { converter: STRING_CONVERTER$46 },
9166
- max: { converter: NUMBER_CONVERTER$26 },
9167
- gap: { converter: NUMBER_CONVERTER$26 },
9168
- duration: { converter: NUMBER_CONVERTER$26 },
9165
+ placement: { converter: STRING_CONVERTER$48 },
9166
+ max: { converter: NUMBER_CONVERTER$28 },
9167
+ gap: { converter: NUMBER_CONVERTER$28 },
9168
+ duration: { converter: NUMBER_CONVERTER$28 },
9169
9169
  removeDelay: {
9170
- converter: NUMBER_CONVERTER$26,
9170
+ converter: NUMBER_CONVERTER$28,
9171
9171
  attribute: "remove-delay"
9172
9172
  },
9173
9173
  pauseOnPageIdle: {
9174
- converter: BOOLEAN_CONVERTER$33,
9174
+ converter: BOOLEAN_CONVERTER$35,
9175
9175
  attribute: "pause-on-page-idle"
9176
9176
  },
9177
9177
  translations: { attribute: false }
@@ -9305,23 +9305,23 @@ var XhNotificationItemElement = class extends XhElement {
9305
9305
  static partContract = ITEM_CONTRACT;
9306
9306
  static properties = {
9307
9307
  itemId: {
9308
- converter: STRING_CONVERTER$46,
9308
+ converter: STRING_CONVERTER$48,
9309
9309
  attribute: "id"
9310
9310
  },
9311
9311
  titleText: {
9312
- converter: STRING_CONVERTER$46,
9312
+ converter: STRING_CONVERTER$48,
9313
9313
  attribute: "title"
9314
9314
  },
9315
- description: { converter: STRING_CONVERTER$46 },
9316
- type: { converter: STRING_CONVERTER$46 },
9317
- duration: { converter: NUMBER_CONVERTER$26 },
9315
+ description: { converter: STRING_CONVERTER$48 },
9316
+ type: { converter: STRING_CONVERTER$48 },
9317
+ duration: { converter: NUMBER_CONVERTER$28 },
9318
9318
  removeDelay: {
9319
- converter: NUMBER_CONVERTER$26,
9319
+ converter: NUMBER_CONVERTER$28,
9320
9320
  attribute: "remove-delay"
9321
9321
  },
9322
- closable: { converter: BOOLEAN_CONVERTER$33 },
9322
+ closable: { converter: BOOLEAN_CONVERTER$35 },
9323
9323
  pauseOnPageIdle: {
9324
- converter: BOOLEAN_CONVERTER$33,
9324
+ converter: BOOLEAN_CONVERTER$35,
9325
9325
  attribute: "pause-on-page-idle"
9326
9326
  },
9327
9327
  translations: { attribute: false }
@@ -9395,9 +9395,9 @@ var XhNotificationItemElement = class extends XhElement {
9395
9395
  };
9396
9396
  //#endregion
9397
9397
  //#region src/elements/number-animation.ts
9398
- const STRING_CONVERTER$45 = { fromAttribute: (v) => v ?? void 0 };
9399
- const NUMBER_CONVERTER$25 = { fromAttribute: (v) => v == null || v === "" ? void 0 : Number(v) };
9400
- const BOOLEAN_CONVERTER$32 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
9398
+ const STRING_CONVERTER$47 = { fromAttribute: (v) => v ?? void 0 };
9399
+ const NUMBER_CONVERTER$27 = { fromAttribute: (v) => v == null || v === "" ? void 0 : Number(v) };
9400
+ const BOOLEAN_CONVERTER$34 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
9401
9401
  /**
9402
9402
  * `<xh-number-animation>` —— Light-DOM 行为宿主:作者写一个 root 角色节点,
9403
9403
  * 元素跑 number-animation 机器,逐帧把补间算出的数字格式化后写进那个节点。
@@ -9429,16 +9429,16 @@ var XhNumberAnimationElement = class extends XhElement {
9429
9429
  meta: numberAnimationMeta
9430
9430
  };
9431
9431
  static properties = {
9432
- from: { converter: NUMBER_CONVERTER$25 },
9433
- to: { converter: NUMBER_CONVERTER$25 },
9434
- duration: { converter: NUMBER_CONVERTER$25 },
9435
- easing: { converter: STRING_CONVERTER$45 },
9436
- precision: { converter: NUMBER_CONVERTER$25 },
9437
- separator: { converter: STRING_CONVERTER$45 },
9438
- active: { converter: BOOLEAN_CONVERTER$32 },
9439
- size: { converter: STRING_CONVERTER$45 },
9440
- tone: { converter: STRING_CONVERTER$45 },
9441
- live: { converter: STRING_CONVERTER$45 }
9432
+ from: { converter: NUMBER_CONVERTER$27 },
9433
+ to: { converter: NUMBER_CONVERTER$27 },
9434
+ duration: { converter: NUMBER_CONVERTER$27 },
9435
+ easing: { converter: STRING_CONVERTER$47 },
9436
+ precision: { converter: NUMBER_CONVERTER$27 },
9437
+ separator: { converter: STRING_CONVERTER$47 },
9438
+ active: { converter: BOOLEAN_CONVERTER$34 },
9439
+ size: { converter: STRING_CONVERTER$47 },
9440
+ tone: { converter: STRING_CONVERTER$47 },
9441
+ live: { converter: STRING_CONVERTER$47 }
9442
9442
  };
9443
9443
  notify = (details) => {
9444
9444
  this.dispatchEvent(new CustomEvent("finish", {
@@ -9473,8 +9473,8 @@ var XhNumberAnimationElement = class extends XhElement {
9473
9473
  };
9474
9474
  //#endregion
9475
9475
  //#region src/elements/number-field.ts
9476
- const STRING_CONVERTER$44 = { fromAttribute: (v) => v ?? void 0 };
9477
- const NUMBER_CONVERTER$24 = { fromAttribute: (v) => v == null || v === "" ? void 0 : Number(v) };
9476
+ const STRING_CONVERTER$46 = { fromAttribute: (v) => v ?? void 0 };
9477
+ const NUMBER_CONVERTER$26 = { fromAttribute: (v) => v == null || v === "" ? void 0 : Number(v) };
9478
9478
  /**
9479
9479
  * `<xh-number-field>` —— Light-DOM 行为宿主:作者写 root/label/input/加减按钮四类角色节点,
9480
9480
  * 元素跑 number-field 机器并把 connect 产出打上去。
@@ -9515,16 +9515,16 @@ var XhNumberFieldElement = class extends XhElement {
9515
9515
  meta: numberFieldMeta
9516
9516
  };
9517
9517
  static properties = {
9518
- value: { converter: STRING_CONVERTER$44 },
9518
+ value: { converter: STRING_CONVERTER$46 },
9519
9519
  defaultValue: {
9520
- converter: STRING_CONVERTER$44,
9520
+ converter: STRING_CONVERTER$46,
9521
9521
  attribute: "default-value"
9522
9522
  },
9523
- min: { converter: NUMBER_CONVERTER$24 },
9524
- max: { converter: NUMBER_CONVERTER$24 },
9525
- step: { converter: NUMBER_CONVERTER$24 },
9523
+ min: { converter: NUMBER_CONVERTER$26 },
9524
+ max: { converter: NUMBER_CONVERTER$26 },
9525
+ step: { converter: NUMBER_CONVERTER$26 },
9526
9526
  largeStep: {
9527
- converter: NUMBER_CONVERTER$24,
9527
+ converter: NUMBER_CONVERTER$26,
9528
9528
  attribute: "large-step"
9529
9529
  },
9530
9530
  disabled: { type: Boolean },
@@ -9534,18 +9534,18 @@ var XhNumberFieldElement = class extends XhElement {
9534
9534
  },
9535
9535
  required: { type: Boolean },
9536
9536
  invalid: { type: Boolean },
9537
- name: { converter: STRING_CONVERTER$44 },
9537
+ name: { converter: STRING_CONVERTER$46 },
9538
9538
  changeDelay: {
9539
- converter: NUMBER_CONVERTER$24,
9539
+ converter: NUMBER_CONVERTER$26,
9540
9540
  attribute: "change-delay"
9541
9541
  },
9542
9542
  changeInterval: {
9543
- converter: NUMBER_CONVERTER$24,
9543
+ converter: NUMBER_CONVERTER$26,
9544
9544
  attribute: "change-interval"
9545
9545
  },
9546
- variant: { converter: STRING_CONVERTER$44 },
9547
- tone: { converter: STRING_CONVERTER$44 },
9548
- size: { converter: STRING_CONVERTER$44 },
9546
+ variant: { converter: STRING_CONVERTER$46 },
9547
+ tone: { converter: STRING_CONVERTER$46 },
9548
+ size: { converter: STRING_CONVERTER$46 },
9549
9549
  parse: { attribute: false },
9550
9550
  format: { attribute: false }
9551
9551
  };
@@ -9596,7 +9596,7 @@ var XhNumberFieldElement = class extends XhElement {
9596
9596
  };
9597
9597
  //#endregion
9598
9598
  //#region src/elements/page-header.ts
9599
- const STRING_CONVERTER$43 = { fromAttribute: (v) => v ?? void 0 };
9599
+ const STRING_CONVERTER$45 = { fromAttribute: (v) => v ?? void 0 };
9600
9600
  /**
9601
9601
  * `<xh-page-header>` —— Light-DOM 行为宿主,无状态机,把 connectPageHeader 产出打到各角色节点。
9602
9602
  * 除 root 外的部件全部可缺省:返回位、标题、副标题、操作、页脚按需摆。
@@ -9620,7 +9620,7 @@ var XhPageHeaderElement = class extends XhElement {
9620
9620
  meta: pageHeaderMeta
9621
9621
  };
9622
9622
  static properties = {
9623
- size: { converter: STRING_CONVERTER$43 },
9623
+ size: { converter: STRING_CONVERTER$45 },
9624
9624
  bordered: { type: Boolean }
9625
9625
  };
9626
9626
  wire() {
@@ -9642,8 +9642,8 @@ var XhPageHeaderElement = class extends XhElement {
9642
9642
  };
9643
9643
  //#endregion
9644
9644
  //#region src/elements/pagination.ts
9645
- const NUMBER_CONVERTER$23 = { fromAttribute: (v) => v == null || v === "" ? void 0 : Number(v) };
9646
- const STRING_CONVERTER$42 = { fromAttribute: (v) => v ?? void 0 };
9645
+ const NUMBER_CONVERTER$25 = { fromAttribute: (v) => v == null || v === "" ? void 0 : Number(v) };
9646
+ const STRING_CONVERTER$44 = { fromAttribute: (v) => v ?? void 0 };
9647
9647
  /** 页码按钮自报的页数;缺失或空串一律给 NaN(见 wire 里的说明)。 */
9648
9648
  function itemPage(el) {
9649
9649
  const raw = el.getAttribute("value");
@@ -9688,40 +9688,40 @@ var XhPaginationElement = class extends XhElement {
9688
9688
  meta: paginationMeta
9689
9689
  };
9690
9690
  static properties = {
9691
- count: { converter: NUMBER_CONVERTER$23 },
9691
+ count: { converter: NUMBER_CONVERTER$25 },
9692
9692
  pageSize: {
9693
- converter: NUMBER_CONVERTER$23,
9693
+ converter: NUMBER_CONVERTER$25,
9694
9694
  attribute: "page-size"
9695
9695
  },
9696
9696
  defaultPageSize: {
9697
- converter: NUMBER_CONVERTER$23,
9697
+ converter: NUMBER_CONVERTER$25,
9698
9698
  attribute: "default-page-size"
9699
9699
  },
9700
9700
  pageSizeOptions: { attribute: false },
9701
- page: { converter: NUMBER_CONVERTER$23 },
9701
+ page: { converter: NUMBER_CONVERTER$25 },
9702
9702
  defaultPage: {
9703
- converter: NUMBER_CONVERTER$23,
9703
+ converter: NUMBER_CONVERTER$25,
9704
9704
  attribute: "default-page"
9705
9705
  },
9706
9706
  siblingCount: {
9707
- converter: NUMBER_CONVERTER$23,
9707
+ converter: NUMBER_CONVERTER$25,
9708
9708
  attribute: "sibling-count"
9709
9709
  },
9710
9710
  direction: {
9711
- converter: STRING_CONVERTER$42,
9711
+ converter: STRING_CONVERTER$44,
9712
9712
  attribute: "dir"
9713
9713
  },
9714
- tone: { converter: STRING_CONVERTER$42 },
9715
- size: { converter: STRING_CONVERTER$42 },
9714
+ tone: { converter: STRING_CONVERTER$44 },
9715
+ size: { converter: STRING_CONVERTER$44 },
9716
9716
  translations: { attribute: false },
9717
- placement: { converter: STRING_CONVERTER$42 },
9718
- offset: { converter: NUMBER_CONVERTER$23 },
9717
+ placement: { converter: STRING_CONVERTER$44 },
9718
+ offset: { converter: NUMBER_CONVERTER$25 },
9719
9719
  openDelay: {
9720
- converter: NUMBER_CONVERTER$23,
9720
+ converter: NUMBER_CONVERTER$25,
9721
9721
  attribute: "open-delay"
9722
9722
  },
9723
9723
  closeDelay: {
9724
- converter: NUMBER_CONVERTER$23,
9724
+ converter: NUMBER_CONVERTER$25,
9725
9725
  attribute: "close-delay"
9726
9726
  }
9727
9727
  };
@@ -9858,8 +9858,8 @@ var XhPaginationElement = class extends XhElement {
9858
9858
  };
9859
9859
  //#endregion
9860
9860
  //#region src/elements/password-input.ts
9861
- const STRING_CONVERTER$41 = { fromAttribute: (v) => v ?? void 0 };
9862
- const BOOLEAN_CONVERTER$31 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
9861
+ const STRING_CONVERTER$43 = { fromAttribute: (v) => v ?? void 0 };
9862
+ const BOOLEAN_CONVERTER$33 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
9863
9863
  /**
9864
9864
  * `<xh-password-input>` —— Light-DOM 行为宿主:作者写 root/label/control/input/
9865
9865
  * visibility-trigger/caps-lock-indicator 六类角色节点,元素跑 password-input 机器并把 connect 产出打上去。
@@ -9904,32 +9904,32 @@ var XhPasswordInputElement = class extends XhElement {
9904
9904
  meta: passwordInputMeta
9905
9905
  };
9906
9906
  static properties = {
9907
- value: { converter: STRING_CONVERTER$41 },
9907
+ value: { converter: STRING_CONVERTER$43 },
9908
9908
  defaultValue: {
9909
- converter: STRING_CONVERTER$41,
9909
+ converter: STRING_CONVERTER$43,
9910
9910
  attribute: "default-value"
9911
9911
  },
9912
- visible: { converter: BOOLEAN_CONVERTER$31 },
9912
+ visible: { converter: BOOLEAN_CONVERTER$33 },
9913
9913
  defaultVisible: {
9914
- converter: BOOLEAN_CONVERTER$31,
9914
+ converter: BOOLEAN_CONVERTER$33,
9915
9915
  attribute: "default-visible"
9916
9916
  },
9917
- disabled: { converter: BOOLEAN_CONVERTER$31 },
9917
+ disabled: { converter: BOOLEAN_CONVERTER$33 },
9918
9918
  readOnly: {
9919
- converter: BOOLEAN_CONVERTER$31,
9919
+ converter: BOOLEAN_CONVERTER$33,
9920
9920
  attribute: "read-only"
9921
9921
  },
9922
- required: { converter: BOOLEAN_CONVERTER$31 },
9923
- invalid: { converter: BOOLEAN_CONVERTER$31 },
9924
- name: { converter: STRING_CONVERTER$41 },
9925
- placeholder: { converter: STRING_CONVERTER$41 },
9922
+ required: { converter: BOOLEAN_CONVERTER$33 },
9923
+ invalid: { converter: BOOLEAN_CONVERTER$33 },
9924
+ name: { converter: STRING_CONVERTER$43 },
9925
+ placeholder: { converter: STRING_CONVERTER$43 },
9926
9926
  autoComplete: {
9927
- converter: STRING_CONVERTER$41,
9927
+ converter: STRING_CONVERTER$43,
9928
9928
  attribute: "auto-complete"
9929
9929
  },
9930
- variant: { converter: STRING_CONVERTER$41 },
9931
- tone: { converter: STRING_CONVERTER$41 },
9932
- size: { converter: STRING_CONVERTER$41 },
9930
+ variant: { converter: STRING_CONVERTER$43 },
9931
+ tone: { converter: STRING_CONVERTER$43 },
9932
+ size: { converter: STRING_CONVERTER$43 },
9933
9933
  translations: { attribute: false }
9934
9934
  };
9935
9935
  notifyValue = (details) => {
@@ -9986,8 +9986,8 @@ var XhPasswordInputElement = class extends XhElement {
9986
9986
  };
9987
9987
  //#endregion
9988
9988
  //#region src/elements/pin-input.ts
9989
- const STRING_CONVERTER$40 = { fromAttribute: (v) => v ?? void 0 };
9990
- const NUMBER_CONVERTER$22 = { fromAttribute: (v) => v == null || v === "" ? void 0 : Number(v) };
9989
+ const STRING_CONVERTER$42 = { fromAttribute: (v) => v ?? void 0 };
9990
+ const NUMBER_CONVERTER$24 = { fromAttribute: (v) => v == null || v === "" ? void 0 : Number(v) };
9991
9991
  const ARRAY_CONVERTER$1 = { fromAttribute: (v) => v == null ? void 0 : [...v] };
9992
9992
  /** 作者写在格子上的下标。缺席或写坏了就退回文档序——手写 HTML 时把格子按顺序排下来本身就是声明。 */
9993
9993
  function declaredIndex(el, position) {
@@ -10038,22 +10038,22 @@ var XhPinInputElement = class extends XhElement {
10038
10038
  converter: ARRAY_CONVERTER$1,
10039
10039
  attribute: "default-value"
10040
10040
  },
10041
- length: { converter: NUMBER_CONVERTER$22 },
10042
- type: { converter: STRING_CONVERTER$40 },
10043
- pattern: { converter: STRING_CONVERTER$40 },
10041
+ length: { converter: NUMBER_CONVERTER$24 },
10042
+ type: { converter: STRING_CONVERTER$42 },
10043
+ pattern: { converter: STRING_CONVERTER$42 },
10044
10044
  mask: { type: Boolean },
10045
10045
  otp: { type: Boolean },
10046
- placeholder: { converter: STRING_CONVERTER$40 },
10046
+ placeholder: { converter: STRING_CONVERTER$42 },
10047
10047
  disabled: { type: Boolean },
10048
10048
  invalid: { type: Boolean },
10049
10049
  blurOnComplete: {
10050
10050
  type: Boolean,
10051
10051
  attribute: "blur-on-complete"
10052
10052
  },
10053
- name: { converter: STRING_CONVERTER$40 },
10054
- variant: { converter: STRING_CONVERTER$40 },
10055
- tone: { converter: STRING_CONVERTER$40 },
10056
- size: { converter: STRING_CONVERTER$40 },
10053
+ name: { converter: STRING_CONVERTER$42 },
10054
+ variant: { converter: STRING_CONVERTER$42 },
10055
+ tone: { converter: STRING_CONVERTER$42 },
10056
+ size: { converter: STRING_CONVERTER$42 },
10057
10057
  translations: { attribute: false }
10058
10058
  };
10059
10059
  notifyChange = (details) => {
@@ -10110,9 +10110,9 @@ var XhPinInputElement = class extends XhElement {
10110
10110
  };
10111
10111
  //#endregion
10112
10112
  //#region src/elements/popconfirm.ts
10113
- const STRING_CONVERTER$39 = { fromAttribute: (v) => v ?? void 0 };
10114
- const NUMBER_CONVERTER$21 = { fromAttribute: (v) => v === null ? void 0 : Number(v) };
10115
- const BOOLEAN_CONVERTER$30 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
10113
+ const STRING_CONVERTER$41 = { fromAttribute: (v) => v ?? void 0 };
10114
+ const NUMBER_CONVERTER$23 = { fromAttribute: (v) => v === null ? void 0 : Number(v) };
10115
+ const BOOLEAN_CONVERTER$32 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
10116
10116
  /**
10117
10117
  * `<xh-popconfirm>` —— Light-DOM 行为宿主:用户写 root/trigger/positioner/content/... 角色节点,
10118
10118
  * 元素跑 popover 机器(开合、定位、消解层、焦点域都在那里)并把 connectPopconfirm 产出打上去。
@@ -10149,22 +10149,22 @@ var XhPopconfirmElement = class extends XhElement {
10149
10149
  meta: popconfirmMeta
10150
10150
  };
10151
10151
  static properties = {
10152
- open: { converter: BOOLEAN_CONVERTER$30 },
10152
+ open: { converter: BOOLEAN_CONVERTER$32 },
10153
10153
  defaultOpen: {
10154
10154
  type: Boolean,
10155
10155
  attribute: "default-open"
10156
10156
  },
10157
- placement: { converter: STRING_CONVERTER$39 },
10158
- offset: { converter: NUMBER_CONVERTER$21 },
10157
+ placement: { converter: STRING_CONVERTER$41 },
10158
+ offset: { converter: NUMBER_CONVERTER$23 },
10159
10159
  closeOnEscape: {
10160
- converter: BOOLEAN_CONVERTER$30,
10160
+ converter: BOOLEAN_CONVERTER$32,
10161
10161
  attribute: "close-on-escape"
10162
10162
  },
10163
10163
  closeOnInteractOutside: {
10164
- converter: BOOLEAN_CONVERTER$30,
10164
+ converter: BOOLEAN_CONVERTER$32,
10165
10165
  attribute: "close-on-interact-outside"
10166
10166
  },
10167
- size: { converter: STRING_CONVERTER$39 }
10167
+ size: { converter: STRING_CONVERTER$41 }
10168
10168
  };
10169
10169
  idGen = createCounterIdGenerator();
10170
10170
  popconfirmScope = createScope(null, this.idGen);
@@ -10290,9 +10290,9 @@ var XhPopconfirmElement = class extends XhElement {
10290
10290
  };
10291
10291
  //#endregion
10292
10292
  //#region src/elements/popover.ts
10293
- const STRING_CONVERTER$38 = { fromAttribute: (v) => v ?? void 0 };
10294
- const NUMBER_CONVERTER$20 = { fromAttribute: (v) => v === null ? void 0 : Number(v) };
10295
- const BOOLEAN_CONVERTER$29 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
10293
+ const STRING_CONVERTER$40 = { fromAttribute: (v) => v ?? void 0 };
10294
+ const NUMBER_CONVERTER$22 = { fromAttribute: (v) => v === null ? void 0 : Number(v) };
10295
+ const BOOLEAN_CONVERTER$31 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
10296
10296
  /**
10297
10297
  * `<xh-popover>` —— Light-DOM 行为宿主:用户写 trigger/positioner/content/... 角色节点,
10298
10298
  * 元素跑 popover 机器并把 connect 产出打上去。浮层定位引擎在本元素里建好、经 refs 注入机器,
@@ -10322,23 +10322,23 @@ var XhPopoverElement = class extends XhElement {
10322
10322
  meta: popoverMeta
10323
10323
  };
10324
10324
  static properties = {
10325
- open: { converter: BOOLEAN_CONVERTER$29 },
10325
+ open: { converter: BOOLEAN_CONVERTER$31 },
10326
10326
  defaultOpen: {
10327
10327
  type: Boolean,
10328
10328
  attribute: "default-open"
10329
10329
  },
10330
- placement: { converter: STRING_CONVERTER$38 },
10331
- offset: { converter: NUMBER_CONVERTER$20 },
10332
- modal: { converter: BOOLEAN_CONVERTER$29 },
10330
+ placement: { converter: STRING_CONVERTER$40 },
10331
+ offset: { converter: NUMBER_CONVERTER$22 },
10332
+ modal: { converter: BOOLEAN_CONVERTER$31 },
10333
10333
  closeOnEscape: {
10334
- converter: BOOLEAN_CONVERTER$29,
10334
+ converter: BOOLEAN_CONVERTER$31,
10335
10335
  attribute: "close-on-escape"
10336
10336
  },
10337
10337
  closeOnInteractOutside: {
10338
- converter: BOOLEAN_CONVERTER$29,
10338
+ converter: BOOLEAN_CONVERTER$31,
10339
10339
  attribute: "close-on-interact-outside"
10340
10340
  },
10341
- size: { converter: STRING_CONVERTER$38 },
10341
+ size: { converter: STRING_CONVERTER$40 },
10342
10342
  translations: { attribute: false }
10343
10343
  };
10344
10344
  idGen = createCounterIdGenerator();
@@ -10449,9 +10449,9 @@ var XhPopoverElement = class extends XhElement {
10449
10449
  };
10450
10450
  //#endregion
10451
10451
  //#region src/elements/popselect.ts
10452
- const STRING_CONVERTER$37 = { fromAttribute: (v) => v ?? void 0 };
10453
- const NUMBER_CONVERTER$19 = { fromAttribute: (v) => v === null ? void 0 : Number(v) };
10454
- const BOOLEAN_CONVERTER$28 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
10452
+ const STRING_CONVERTER$39 = { fromAttribute: (v) => v ?? void 0 };
10453
+ const NUMBER_CONVERTER$21 = { fromAttribute: (v) => v === null ? void 0 : Number(v) };
10454
+ const BOOLEAN_CONVERTER$30 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
10455
10455
  /**
10456
10456
  * `<xh-popselect>` —— Light-DOM 行为宿主:作者写 root/trigger/positioner/content/item 角色节点,
10457
10457
  * 元素同时跑两台机器——浮层开合、定位、消解层与焦点域归 popover,选中集合与焦点锚点归 listbox——
@@ -10500,37 +10500,37 @@ var XhPopselectElement = class extends XhElement {
10500
10500
  };
10501
10501
  static properties = {
10502
10502
  collection: { attribute: false },
10503
- value: { converter: STRING_CONVERTER$37 },
10503
+ value: { converter: STRING_CONVERTER$39 },
10504
10504
  defaultValue: {
10505
- converter: STRING_CONVERTER$37,
10505
+ converter: STRING_CONVERTER$39,
10506
10506
  attribute: "default-value"
10507
10507
  },
10508
10508
  multiple: { type: Boolean },
10509
10509
  disabled: { type: Boolean },
10510
- loop: { converter: BOOLEAN_CONVERTER$28 },
10511
- typeahead: { converter: BOOLEAN_CONVERTER$28 },
10510
+ loop: { converter: BOOLEAN_CONVERTER$30 },
10511
+ typeahead: { converter: BOOLEAN_CONVERTER$30 },
10512
10512
  direction: {
10513
- converter: STRING_CONVERTER$37,
10513
+ converter: STRING_CONVERTER$39,
10514
10514
  attribute: "dir"
10515
10515
  },
10516
- open: { converter: BOOLEAN_CONVERTER$28 },
10516
+ open: { converter: BOOLEAN_CONVERTER$30 },
10517
10517
  defaultOpen: {
10518
10518
  type: Boolean,
10519
10519
  attribute: "default-open"
10520
10520
  },
10521
- placement: { converter: STRING_CONVERTER$37 },
10522
- offset: { converter: NUMBER_CONVERTER$19 },
10521
+ placement: { converter: STRING_CONVERTER$39 },
10522
+ offset: { converter: NUMBER_CONVERTER$21 },
10523
10523
  closeOnEscape: {
10524
- converter: BOOLEAN_CONVERTER$28,
10524
+ converter: BOOLEAN_CONVERTER$30,
10525
10525
  attribute: "close-on-escape"
10526
10526
  },
10527
10527
  closeOnInteractOutside: {
10528
- converter: BOOLEAN_CONVERTER$28,
10528
+ converter: BOOLEAN_CONVERTER$30,
10529
10529
  attribute: "close-on-interact-outside"
10530
10530
  },
10531
- variant: { converter: STRING_CONVERTER$37 },
10532
- tone: { converter: STRING_CONVERTER$37 },
10533
- size: { converter: STRING_CONVERTER$37 },
10531
+ variant: { converter: STRING_CONVERTER$39 },
10532
+ tone: { converter: STRING_CONVERTER$39 },
10533
+ size: { converter: STRING_CONVERTER$39 },
10534
10534
  translations: { attribute: false }
10535
10535
  };
10536
10536
  idGen = createCounterIdGenerator();
@@ -10779,7 +10779,7 @@ var XhProgressElement = class extends XhElement {
10779
10779
  };
10780
10780
  //#endregion
10781
10781
  //#region src/elements/qr-code.ts
10782
- const STRING_CONVERTER$36 = { fromAttribute: (v) => v ?? void 0 };
10782
+ const STRING_CONVERTER$38 = { fromAttribute: (v) => v ?? void 0 };
10783
10783
  const SVG_NS = "http://www.w3.org/2000/svg";
10784
10784
  /** 本元素生成的几何节点的标记:作者写的节点不带它,重画时只清掉自己生成的那几个。 */
10785
10785
  const GEOM_ATTR = "data-xh-geom";
@@ -10824,20 +10824,20 @@ var XhQrCodeElement = class extends XhElement {
10824
10824
  }
10825
10825
  };
10826
10826
  static properties = {
10827
- value: { converter: STRING_CONVERTER$36 },
10828
- level: { converter: STRING_CONVERTER$36 },
10829
- label: { converter: STRING_CONVERTER$36 },
10827
+ value: { converter: STRING_CONVERTER$38 },
10828
+ level: { converter: STRING_CONVERTER$38 },
10829
+ label: { converter: STRING_CONVERTER$38 },
10830
10830
  pixelSize: {
10831
10831
  type: Number,
10832
10832
  attribute: "pixel-size"
10833
10833
  },
10834
10834
  margin: { type: Number },
10835
10835
  moduleShape: {
10836
- converter: STRING_CONVERTER$36,
10836
+ converter: STRING_CONVERTER$38,
10837
10837
  attribute: "module-shape"
10838
10838
  },
10839
10839
  eyeShape: {
10840
- converter: STRING_CONVERTER$36,
10840
+ converter: STRING_CONVERTER$38,
10841
10841
  attribute: "eye-shape"
10842
10842
  }
10843
10843
  };
@@ -11050,9 +11050,9 @@ var XhRadioGroupElement = class extends XhElement {
11050
11050
  };
11051
11051
  //#endregion
11052
11052
  //#region src/elements/rating.ts
11053
- const STRING_CONVERTER$35 = { fromAttribute: (v) => v ?? void 0 };
11054
- const NUMBER_CONVERTER$18 = { fromAttribute: (v) => v == null || v === "" ? void 0 : Number(v) };
11055
- const BOOLEAN_CONVERTER$27 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
11053
+ const STRING_CONVERTER$37 = { fromAttribute: (v) => v ?? void 0 };
11054
+ const NUMBER_CONVERTER$20 = { fromAttribute: (v) => v == null || v === "" ? void 0 : Number(v) };
11055
+ const BOOLEAN_CONVERTER$29 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
11056
11056
  /**
11057
11057
  * `<xh-rating>` —— Light-DOM 行为宿主:作者写 root/label/control 与若干 item 角色节点
11058
11058
  * (可选再写一个 hidden-input 参与表单提交),元素跑 rating 机器并把 connect 产出打上去。
@@ -11088,33 +11088,33 @@ var XhRatingElement = class extends XhElement {
11088
11088
  meta: ratingMeta
11089
11089
  };
11090
11090
  static properties = {
11091
- value: { converter: NUMBER_CONVERTER$18 },
11091
+ value: { converter: NUMBER_CONVERTER$20 },
11092
11092
  defaultValue: {
11093
- converter: NUMBER_CONVERTER$18,
11093
+ converter: NUMBER_CONVERTER$20,
11094
11094
  attribute: "default-value"
11095
11095
  },
11096
- count: { converter: NUMBER_CONVERTER$18 },
11096
+ count: { converter: NUMBER_CONVERTER$20 },
11097
11097
  allowHalf: {
11098
- converter: BOOLEAN_CONVERTER$27,
11098
+ converter: BOOLEAN_CONVERTER$29,
11099
11099
  attribute: "allow-half"
11100
11100
  },
11101
11101
  allowClear: {
11102
- converter: BOOLEAN_CONVERTER$27,
11102
+ converter: BOOLEAN_CONVERTER$29,
11103
11103
  attribute: "allow-clear"
11104
11104
  },
11105
- disabled: { converter: BOOLEAN_CONVERTER$27 },
11105
+ disabled: { converter: BOOLEAN_CONVERTER$29 },
11106
11106
  readOnly: {
11107
- converter: BOOLEAN_CONVERTER$27,
11107
+ converter: BOOLEAN_CONVERTER$29,
11108
11108
  attribute: "read-only"
11109
11109
  },
11110
- required: { converter: BOOLEAN_CONVERTER$27 },
11111
- name: { converter: STRING_CONVERTER$35 },
11110
+ required: { converter: BOOLEAN_CONVERTER$29 },
11111
+ name: { converter: STRING_CONVERTER$37 },
11112
11112
  direction: {
11113
- converter: STRING_CONVERTER$35,
11113
+ converter: STRING_CONVERTER$37,
11114
11114
  attribute: "dir"
11115
11115
  },
11116
- tone: { converter: STRING_CONVERTER$35 },
11117
- size: { converter: STRING_CONVERTER$35 }
11116
+ tone: { converter: STRING_CONVERTER$37 },
11117
+ size: { converter: STRING_CONVERTER$37 }
11118
11118
  };
11119
11119
  notifyValue = (details) => {
11120
11120
  this.dispatchEvent(new CustomEvent("value-change", {
@@ -11179,8 +11179,161 @@ var XhRatingElement = class extends XhElement {
11179
11179
  }
11180
11180
  };
11181
11181
  //#endregion
11182
+ //#region src/elements/resizable.ts
11183
+ const STRING_CONVERTER$36 = { fromAttribute: (v) => v ?? void 0 };
11184
+ const NUMBER_CONVERTER$19 = { fromAttribute: (v) => v == null || v === "" ? void 0 : Number(v) };
11185
+ const BOOLEAN_CONVERTER$28 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
11186
+ /** 尺寸写成 `宽x高`(如 `320x200`)。解析不出两个有限数就当没写。 */
11187
+ const SIZE_CONVERTER = { fromAttribute: (v) => {
11188
+ if (v == null || v.trim() === "") return void 0;
11189
+ const [w, h] = v.split(/[x,\s]+/).map(Number);
11190
+ return Number.isFinite(w) && Number.isFinite(h) ? {
11191
+ width: w,
11192
+ height: h
11193
+ } : void 0;
11194
+ } };
11195
+ /** 开放的边写成逗号分隔(如 `e,s,se`)。 */
11196
+ const EDGES_CONVERTER = { fromAttribute: (v) => {
11197
+ if (v == null || v.trim() === "") return void 0;
11198
+ const out = v.split(",").map((s) => s.trim()).filter(Boolean);
11199
+ return out.length ? out : void 0;
11200
+ } };
11201
+ /**
11202
+ * `<xh-resizable>` —— Light-DOM 行为宿主:作者写 root 与八向 handle 角色节点,
11203
+ * 元素跑 resizable 机器并把 connect 产出打上去。
11204
+ *
11205
+ * 每个 handle 用 `edge` 属性写明自己是哪条边(`n` / `ne` / `e` / `se` / `s` / `sw` / `w` / `nw`),
11206
+ * 与 Vue 侧的 `:edge` 是同一份声明。
11207
+ *
11208
+ * 尺寸由元素每帧写进 root 的内联 `inline-size` / `block-size`,作者的样式表不要再碰这两条轴。
11209
+ * **推西边与北边时容器的起点会动**,那段位移写成 root 的 `left` / `top`——皮肤已给
11210
+ * `position: relative`,开箱即对;把 root 改成 `static` 会让这两个方向只变尺寸不移位。
11211
+ *
11212
+ * 键盘全在把手上:方向键按屏幕方向推一步(推东边时右键变宽、推西边时右键变窄,与拖动同义),
11213
+ * 按住 Shift 走大步,Home / End 推到这条边能到的两端。
11214
+ *
11215
+ * @customElement xh-resizable
11216
+ * @attr {string} size - 受控尺寸,写成 `宽x高`(如 `320x200`);缺省该属性即非受控
11217
+ * @attr {string} default-size - 非受控初值,同样写成 `宽x高`
11218
+ * @attr {number} min-width - 宽度下限
11219
+ * @attr {number} min-height - 高度下限
11220
+ * @attr {number} max-width - 宽度上限;不给即不封顶
11221
+ * @attr {number} max-height - 高度上限;不给即不封顶
11222
+ * @attr {number} aspect-ratio - 宽高比(宽 ÷ 高)。给了就锁死,四个角以宽为准
11223
+ * @attr {number} step - 吸附步进:宽高各自落到最近的整数倍
11224
+ * @attr {number} keyboard-step - 方向键一次推多远(px),默认 8
11225
+ * @attr {number} keyboard-large-step - 按住 Shift 时的步长(px),默认 40
11226
+ * @attr {string} edges - 开放哪几条边,逗号分隔(如 `e,s,se`);默认八向全开
11227
+ * @attr {boolean} disabled - 禁用:把手退出 Tab 序列,按下也不进调整
11228
+ * @attr {'ltr'|'rtl'} dir - 文字方向,只对调水平位移与左右两键的正负,默认 ltr
11229
+ * @fires size-change - 尺寸变化(拖动途中会连发);detail 为 `{ size }`
11230
+ * @fires size-change-end - 一次调整收尾发一次;detail 为 `{ size, edge }`
11231
+ * @csspart root - 承载 data-resizing / data-edge / data-disabled 的容器,尺寸写在它的内联样式上
11232
+ * @csspart handle - role=separator 的把手,指针与键盘交互全在它身上
11233
+ */
11234
+ var XhResizableElement = class extends XhElement {
11235
+ static partContract = {
11236
+ anatomy: resizableAnatomy,
11237
+ meta: resizableMeta
11238
+ };
11239
+ static properties = {
11240
+ size: { converter: SIZE_CONVERTER },
11241
+ defaultSize: {
11242
+ converter: SIZE_CONVERTER,
11243
+ attribute: "default-size"
11244
+ },
11245
+ minWidth: {
11246
+ converter: NUMBER_CONVERTER$19,
11247
+ attribute: "min-width"
11248
+ },
11249
+ minHeight: {
11250
+ converter: NUMBER_CONVERTER$19,
11251
+ attribute: "min-height"
11252
+ },
11253
+ maxWidth: {
11254
+ converter: NUMBER_CONVERTER$19,
11255
+ attribute: "max-width"
11256
+ },
11257
+ maxHeight: {
11258
+ converter: NUMBER_CONVERTER$19,
11259
+ attribute: "max-height"
11260
+ },
11261
+ aspectRatio: {
11262
+ converter: NUMBER_CONVERTER$19,
11263
+ attribute: "aspect-ratio"
11264
+ },
11265
+ step: { converter: NUMBER_CONVERTER$19 },
11266
+ keyboardStep: {
11267
+ converter: NUMBER_CONVERTER$19,
11268
+ attribute: "keyboard-step"
11269
+ },
11270
+ keyboardLargeStep: {
11271
+ converter: NUMBER_CONVERTER$19,
11272
+ attribute: "keyboard-large-step"
11273
+ },
11274
+ edges: { converter: EDGES_CONVERTER },
11275
+ disabled: { converter: BOOLEAN_CONVERTER$28 },
11276
+ direction: {
11277
+ converter: STRING_CONVERTER$36,
11278
+ attribute: "dir"
11279
+ }
11280
+ };
11281
+ idGen = createCounterIdGenerator();
11282
+ resizableScope = createScope(null, this.idGen);
11283
+ notifySize = (details) => {
11284
+ this.dispatchEvent(new CustomEvent("size-change", {
11285
+ detail: details,
11286
+ bubbles: true,
11287
+ composed: true
11288
+ }));
11289
+ };
11290
+ notifySizeEnd = (details) => {
11291
+ this.dispatchEvent(new CustomEvent("size-change-end", {
11292
+ detail: details,
11293
+ bubbles: true,
11294
+ composed: true
11295
+ }));
11296
+ };
11297
+ ctrl = new MachineController(this, resizableMachine, () => this.machineProps(), {
11298
+ scope: this.resizableScope,
11299
+ onBuilt: (svc) => this.injectRefs(svc)
11300
+ });
11301
+ machineProps() {
11302
+ return {
11303
+ size: this.size,
11304
+ defaultSize: this.defaultSize,
11305
+ minWidth: this.minWidth,
11306
+ minHeight: this.minHeight,
11307
+ maxWidth: this.maxWidth,
11308
+ maxHeight: this.maxHeight,
11309
+ aspectRatio: this.aspectRatio,
11310
+ step: this.step,
11311
+ keyboardStep: this.keyboardStep,
11312
+ keyboardLargeStep: this.keyboardLargeStep,
11313
+ edges: this.edges,
11314
+ disabled: this.disabled ?? false,
11315
+ dir: this.direction,
11316
+ onSizeChange: this.notifySize,
11317
+ onSizeChangeEnd: this.notifySizeEnd
11318
+ };
11319
+ }
11320
+ injectRefs(svc) {
11321
+ svc.refs.set("getRootEl", () => this.getPart("root"));
11322
+ }
11323
+ /** 把手自报的边。没写就落东南角——那是文档流里最常见的那个。 */
11324
+ edgeOf(el) {
11325
+ return el.getAttribute("edge") ?? "se";
11326
+ }
11327
+ wire() {
11328
+ const api = connectResizable(this.ctrl.service, wcNormalize);
11329
+ const root = this.getPart("root");
11330
+ if (root) this.spreader.spread(root, api.getRootProps());
11331
+ for (const el of this.getParts("handle")) this.spreader.spread(el, api.getHandleProps({ edge: this.edgeOf(el) }));
11332
+ }
11333
+ };
11334
+ //#endregion
11182
11335
  //#region src/elements/result.ts
11183
- const STRING_CONVERTER$34 = { fromAttribute: (v) => v ?? void 0 };
11336
+ const STRING_CONVERTER$35 = { fromAttribute: (v) => v ?? void 0 };
11184
11337
  /**
11185
11338
  * `<xh-result>` —— 结果页行为宿主,无状态机,把 connectResult 产出的属性打到角色节点上。
11186
11339
  *
@@ -11204,8 +11357,8 @@ var XhResultElement = class extends XhElement {
11204
11357
  meta: resultMeta
11205
11358
  };
11206
11359
  static properties = {
11207
- status: { converter: STRING_CONVERTER$34 },
11208
- size: { converter: STRING_CONVERTER$34 }
11360
+ status: { converter: STRING_CONVERTER$35 },
11361
+ size: { converter: STRING_CONVERTER$35 }
11209
11362
  };
11210
11363
  wire() {
11211
11364
  const props = {
@@ -11226,9 +11379,9 @@ var XhResultElement = class extends XhElement {
11226
11379
  };
11227
11380
  //#endregion
11228
11381
  //#region src/elements/scroll-area.ts
11229
- const STRING_CONVERTER$33 = { fromAttribute: (v) => v ?? void 0 };
11230
- const NUMBER_CONVERTER$17 = { fromAttribute: (v) => v == null || v === "" ? void 0 : Number(v) };
11231
- const BOOLEAN_CONVERTER$26 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
11382
+ const STRING_CONVERTER$34 = { fromAttribute: (v) => v ?? void 0 };
11383
+ const NUMBER_CONVERTER$18 = { fromAttribute: (v) => v == null || v === "" ? void 0 : Number(v) };
11384
+ const BOOLEAN_CONVERTER$27 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
11232
11385
  /**
11233
11386
  * `<xh-scroll-area>` —— Light-DOM 行为宿主:作者写 root/viewport/content 与两条 scrollbar
11234
11387
  * 角色节点,元素按轴各跑一台 scrollbar 机器并把 connect 产出打上去。
@@ -11266,19 +11419,19 @@ var XhScrollAreaElement = class extends XhElement {
11266
11419
  delegates: [scrollbarAnatomy]
11267
11420
  };
11268
11421
  static properties = {
11269
- type: { converter: STRING_CONVERTER$33 },
11422
+ type: { converter: STRING_CONVERTER$34 },
11270
11423
  hideDelay: {
11271
- converter: NUMBER_CONVERTER$17,
11424
+ converter: NUMBER_CONVERTER$18,
11272
11425
  attribute: "hide-delay"
11273
11426
  },
11274
- orientation: { converter: STRING_CONVERTER$33 },
11275
- size: { converter: STRING_CONVERTER$33 },
11427
+ orientation: { converter: STRING_CONVERTER$34 },
11428
+ size: { converter: STRING_CONVERTER$34 },
11276
11429
  direction: {
11277
- converter: STRING_CONVERTER$33,
11430
+ converter: STRING_CONVERTER$34,
11278
11431
  attribute: "dir"
11279
11432
  },
11280
11433
  forceVisible: {
11281
- converter: BOOLEAN_CONVERTER$26,
11434
+ converter: BOOLEAN_CONVERTER$27,
11282
11435
  attribute: "force-visible"
11283
11436
  }
11284
11437
  };
@@ -11343,9 +11496,9 @@ var XhScrollAreaElement = class extends XhElement {
11343
11496
  };
11344
11497
  //#endregion
11345
11498
  //#region src/elements/scrollbar.ts
11346
- const STRING_CONVERTER$32 = { fromAttribute: (v) => v ?? void 0 };
11347
- const NUMBER_CONVERTER$16 = { fromAttribute: (v) => v == null || v === "" ? void 0 : Number(v) };
11348
- const BOOLEAN_CONVERTER$25 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
11499
+ const STRING_CONVERTER$33 = { fromAttribute: (v) => v ?? void 0 };
11500
+ const NUMBER_CONVERTER$17 = { fromAttribute: (v) => v == null || v === "" ? void 0 : Number(v) };
11501
+ const BOOLEAN_CONVERTER$26 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
11349
11502
  /**
11350
11503
  * `<xh-scrollbar>` —— Light-DOM 行为宿主:作者写 root/track/thumb 三个角色节点,
11351
11504
  * 元素跑 scrollbar 机器并把 connect 产出打上去。
@@ -11390,28 +11543,28 @@ var XhScrollbarElement = class extends XhElement {
11390
11543
  meta: scrollbarMeta
11391
11544
  };
11392
11545
  static properties = {
11393
- controls: { converter: STRING_CONVERTER$32 },
11394
- orientation: { converter: STRING_CONVERTER$32 },
11395
- type: { converter: STRING_CONVERTER$32 },
11546
+ controls: { converter: STRING_CONVERTER$33 },
11547
+ orientation: { converter: STRING_CONVERTER$33 },
11548
+ type: { converter: STRING_CONVERTER$33 },
11396
11549
  hideDelay: {
11397
- converter: NUMBER_CONVERTER$16,
11550
+ converter: NUMBER_CONVERTER$17,
11398
11551
  attribute: "hide-delay"
11399
11552
  },
11400
11553
  minThumbSize: {
11401
- converter: NUMBER_CONVERTER$16,
11554
+ converter: NUMBER_CONVERTER$17,
11402
11555
  attribute: "min-thumb-size"
11403
11556
  },
11404
- step: { converter: NUMBER_CONVERTER$16 },
11405
- size: { converter: STRING_CONVERTER$32 },
11406
- disabled: { converter: BOOLEAN_CONVERTER$25 },
11407
- focusable: { converter: BOOLEAN_CONVERTER$25 },
11408
- gutter: { converter: BOOLEAN_CONVERTER$25 },
11557
+ step: { converter: NUMBER_CONVERTER$17 },
11558
+ size: { converter: STRING_CONVERTER$33 },
11559
+ disabled: { converter: BOOLEAN_CONVERTER$26 },
11560
+ focusable: { converter: BOOLEAN_CONVERTER$26 },
11561
+ gutter: { converter: BOOLEAN_CONVERTER$26 },
11409
11562
  forceVisible: {
11410
- converter: BOOLEAN_CONVERTER$25,
11563
+ converter: BOOLEAN_CONVERTER$26,
11411
11564
  attribute: "force-visible"
11412
11565
  },
11413
11566
  direction: {
11414
- converter: STRING_CONVERTER$32,
11567
+ converter: STRING_CONVERTER$33,
11415
11568
  attribute: "dir"
11416
11569
  },
11417
11570
  scrollable: { attribute: false },
@@ -11476,8 +11629,8 @@ var XhScrollbarElement = class extends XhElement {
11476
11629
  };
11477
11630
  //#endregion
11478
11631
  //#region src/elements/segmented.ts
11479
- const STRING_CONVERTER$31 = { fromAttribute: (v) => v ?? void 0 };
11480
- const BOOLEAN_CONVERTER$24 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
11632
+ const STRING_CONVERTER$32 = { fromAttribute: (v) => v ?? void 0 };
11633
+ const BOOLEAN_CONVERTER$25 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
11481
11634
  /**
11482
11635
  * `<xh-segmented>` —— Light-DOM 行为宿主:作者写 root 与若干 item 角色节点,
11483
11636
  * 元素跑 segmented 机器并把 connect 产出打上去。段须是原生 `<button>`
@@ -11515,28 +11668,28 @@ var XhSegmentedElement = class extends XhElement {
11515
11668
  };
11516
11669
  static properties = {
11517
11670
  collection: { attribute: false },
11518
- value: { converter: STRING_CONVERTER$31 },
11671
+ value: { converter: STRING_CONVERTER$32 },
11519
11672
  defaultValue: {
11520
- converter: STRING_CONVERTER$31,
11673
+ converter: STRING_CONVERTER$32,
11521
11674
  attribute: "default-value"
11522
11675
  },
11523
- disabled: { converter: BOOLEAN_CONVERTER$24 },
11676
+ disabled: { converter: BOOLEAN_CONVERTER$25 },
11524
11677
  readOnly: {
11525
- converter: BOOLEAN_CONVERTER$24,
11678
+ converter: BOOLEAN_CONVERTER$25,
11526
11679
  attribute: "read-only"
11527
11680
  },
11528
- invalid: { converter: BOOLEAN_CONVERTER$24 },
11529
- required: { converter: BOOLEAN_CONVERTER$24 },
11530
- name: { converter: STRING_CONVERTER$31 },
11531
- orientation: { converter: STRING_CONVERTER$31 },
11681
+ invalid: { converter: BOOLEAN_CONVERTER$25 },
11682
+ required: { converter: BOOLEAN_CONVERTER$25 },
11683
+ name: { converter: STRING_CONVERTER$32 },
11684
+ orientation: { converter: STRING_CONVERTER$32 },
11532
11685
  direction: {
11533
- converter: STRING_CONVERTER$31,
11686
+ converter: STRING_CONVERTER$32,
11534
11687
  attribute: "dir"
11535
11688
  },
11536
- loop: { converter: BOOLEAN_CONVERTER$24 },
11537
- block: { converter: BOOLEAN_CONVERTER$24 },
11538
- tone: { converter: STRING_CONVERTER$31 },
11539
- size: { converter: STRING_CONVERTER$31 }
11689
+ loop: { converter: BOOLEAN_CONVERTER$25 },
11690
+ block: { converter: BOOLEAN_CONVERTER$25 },
11691
+ tone: { converter: STRING_CONVERTER$32 },
11692
+ size: { converter: STRING_CONVERTER$32 }
11540
11693
  };
11541
11694
  declaredDisabled = /* @__PURE__ */ new WeakMap();
11542
11695
  /** 上一帧是否整组禁用:解禁当帧 DOM 上还留着机器写回的 aria-disabled,读不得。 */
@@ -11639,9 +11792,9 @@ var XhSegmentedElement = class extends XhElement {
11639
11792
  };
11640
11793
  //#endregion
11641
11794
  //#region src/elements/select.ts
11642
- const STRING_CONVERTER$30 = { fromAttribute: (v) => v ?? void 0 };
11643
- const NUMBER_CONVERTER$15 = { fromAttribute: (v) => v === null ? void 0 : Number(v) };
11644
- const BOOLEAN_CONVERTER$23 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
11795
+ const STRING_CONVERTER$31 = { fromAttribute: (v) => v ?? void 0 };
11796
+ const NUMBER_CONVERTER$16 = { fromAttribute: (v) => v === null ? void 0 : Number(v) };
11797
+ const BOOLEAN_CONVERTER$24 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
11645
11798
  /**
11646
11799
  * `<xh-select>` —— Light-DOM 行为宿主:用户写 root/trigger/value-text/positioner/content/item/...
11647
11800
  * 角色节点,元素跑 select 机器并把 connect 产出打上去。浮层定位引擎在本元素里建好、经 refs 注入机器,
@@ -11698,39 +11851,39 @@ var XhSelectElement = class extends XhElement {
11698
11851
  };
11699
11852
  static properties = {
11700
11853
  collection: { attribute: false },
11701
- value: { converter: STRING_CONVERTER$30 },
11854
+ value: { converter: STRING_CONVERTER$31 },
11702
11855
  defaultValue: {
11703
- converter: STRING_CONVERTER$30,
11856
+ converter: STRING_CONVERTER$31,
11704
11857
  attribute: "default-value"
11705
11858
  },
11706
- open: { converter: BOOLEAN_CONVERTER$23 },
11859
+ open: { converter: BOOLEAN_CONVERTER$24 },
11707
11860
  defaultOpen: {
11708
11861
  type: Boolean,
11709
11862
  attribute: "default-open"
11710
11863
  },
11711
11864
  disabled: { type: Boolean },
11712
11865
  readOnly: {
11713
- converter: BOOLEAN_CONVERTER$23,
11866
+ converter: BOOLEAN_CONVERTER$24,
11714
11867
  attribute: "read-only"
11715
11868
  },
11716
11869
  invalid: { type: Boolean },
11717
11870
  required: { type: Boolean },
11718
- name: { converter: STRING_CONVERTER$30 },
11719
- placeholder: { converter: STRING_CONVERTER$30 },
11720
- placement: { converter: STRING_CONVERTER$30 },
11721
- offset: { converter: NUMBER_CONVERTER$15 },
11722
- loop: { converter: BOOLEAN_CONVERTER$23 },
11871
+ name: { converter: STRING_CONVERTER$31 },
11872
+ placeholder: { converter: STRING_CONVERTER$31 },
11873
+ placement: { converter: STRING_CONVERTER$31 },
11874
+ offset: { converter: NUMBER_CONVERTER$16 },
11875
+ loop: { converter: BOOLEAN_CONVERTER$24 },
11723
11876
  multiple: { type: Boolean },
11724
11877
  direction: {
11725
- converter: STRING_CONVERTER$30,
11878
+ converter: STRING_CONVERTER$31,
11726
11879
  attribute: "dir"
11727
11880
  },
11728
- variant: { converter: STRING_CONVERTER$30 },
11729
- tone: { converter: STRING_CONVERTER$30 },
11730
- size: { converter: STRING_CONVERTER$30 },
11881
+ variant: { converter: STRING_CONVERTER$31 },
11882
+ tone: { converter: STRING_CONVERTER$31 },
11883
+ size: { converter: STRING_CONVERTER$31 },
11731
11884
  translations: { attribute: false },
11732
11885
  maxTagCount: {
11733
- converter: NUMBER_CONVERTER$15,
11886
+ converter: NUMBER_CONVERTER$16,
11734
11887
  attribute: "max-tag-count"
11735
11888
  }
11736
11889
  };
@@ -11967,8 +12120,8 @@ var XhSeparatorElement = class extends XhElement {
11967
12120
  };
11968
12121
  //#endregion
11969
12122
  //#region src/elements/side-nav.ts
11970
- const STRING_CONVERTER$29 = { fromAttribute: (v) => v ?? void 0 };
11971
- const BOOLEAN_CONVERTER$22 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
12123
+ const STRING_CONVERTER$30 = { fromAttribute: (v) => v ?? void 0 };
12124
+ const BOOLEAN_CONVERTER$23 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
11972
12125
  /** 分支一系的归属容器;嵌套分支各认最近的那个。 */
11973
12126
  const BRANCH_SELECTOR$2 = "[data-xh-part=\"branch\"]";
11974
12127
  /** 分组一系的归属容器。 */
@@ -12009,21 +12162,21 @@ var XhSideNavElement = class extends XhElement {
12009
12162
  meta: sideNavMeta
12010
12163
  };
12011
12164
  static properties = {
12012
- value: { converter: STRING_CONVERTER$29 },
12165
+ value: { converter: STRING_CONVERTER$30 },
12013
12166
  defaultValue: {
12014
- converter: STRING_CONVERTER$29,
12167
+ converter: STRING_CONVERTER$30,
12015
12168
  attribute: "default-value"
12016
12169
  },
12017
- accordion: { converter: BOOLEAN_CONVERTER$22 },
12018
- collapsed: { converter: BOOLEAN_CONVERTER$22 },
12170
+ accordion: { converter: BOOLEAN_CONVERTER$23 },
12171
+ collapsed: { converter: BOOLEAN_CONVERTER$23 },
12019
12172
  collapsedPopout: {
12020
- converter: BOOLEAN_CONVERTER$22,
12173
+ converter: BOOLEAN_CONVERTER$23,
12021
12174
  attribute: "collapsed-popout"
12022
12175
  },
12023
- disabled: { converter: BOOLEAN_CONVERTER$22 },
12024
- loop: { converter: BOOLEAN_CONVERTER$22 },
12176
+ disabled: { converter: BOOLEAN_CONVERTER$23 },
12177
+ loop: { converter: BOOLEAN_CONVERTER$23 },
12025
12178
  direction: {
12026
- converter: STRING_CONVERTER$29,
12179
+ converter: STRING_CONVERTER$30,
12027
12180
  attribute: "dir"
12028
12181
  },
12029
12182
  collection: { attribute: false },
@@ -12174,8 +12327,8 @@ var XhSideNavElement = class extends XhElement {
12174
12327
  };
12175
12328
  //#endregion
12176
12329
  //#region src/elements/signature-pad.ts
12177
- const STRING_CONVERTER$28 = { fromAttribute: (v) => v ?? void 0 };
12178
- const BOOLEAN_CONVERTER$21 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
12330
+ const STRING_CONVERTER$29 = { fromAttribute: (v) => v ?? void 0 };
12331
+ const BOOLEAN_CONVERTER$22 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
12179
12332
  /**
12180
12333
  * `<xh-signature-pad>` —— Light-DOM 行为宿主:作者写 root / control / segment 三个必需角色节点
12181
12334
  * (可再写 label、guide、clear-trigger 与 hidden-input),元素跑 signature-pad 机器并把 connect 产出打上去。
@@ -12212,14 +12365,14 @@ var XhSignaturePadElement = class extends XhElement {
12212
12365
  meta: signaturePadMeta
12213
12366
  };
12214
12367
  static properties = {
12215
- disabled: { converter: BOOLEAN_CONVERTER$21 },
12368
+ disabled: { converter: BOOLEAN_CONVERTER$22 },
12216
12369
  readOnly: {
12217
- converter: BOOLEAN_CONVERTER$21,
12370
+ converter: BOOLEAN_CONVERTER$22,
12218
12371
  attribute: "read-only"
12219
12372
  },
12220
- required: { converter: BOOLEAN_CONVERTER$21 },
12221
- invalid: { converter: BOOLEAN_CONVERTER$21 },
12222
- name: { converter: STRING_CONVERTER$28 },
12373
+ required: { converter: BOOLEAN_CONVERTER$22 },
12374
+ invalid: { converter: BOOLEAN_CONVERTER$22 },
12375
+ name: { converter: STRING_CONVERTER$29 },
12223
12376
  drawing: { attribute: false },
12224
12377
  translations: { attribute: false }
12225
12378
  };
@@ -12305,8 +12458,8 @@ var XhSignaturePadElement = class extends XhElement {
12305
12458
  };
12306
12459
  //#endregion
12307
12460
  //#region src/elements/skeleton.ts
12308
- const STRING_CONVERTER$27 = { fromAttribute: (v) => v ?? void 0 };
12309
- const BOOLEAN_CONVERTER$20 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
12461
+ const STRING_CONVERTER$28 = { fromAttribute: (v) => v ?? void 0 };
12462
+ const BOOLEAN_CONVERTER$21 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
12310
12463
  /** 允许的形状名,作者写错时落回容器的默认值。 */
12311
12464
  const VARIANTS = [
12312
12465
  "text",
@@ -12336,8 +12489,8 @@ var XhSkeletonElement = class extends XhElement {
12336
12489
  meta: skeletonMeta
12337
12490
  };
12338
12491
  static properties = {
12339
- loading: { converter: BOOLEAN_CONVERTER$20 },
12340
- variant: { converter: STRING_CONVERTER$27 }
12492
+ loading: { converter: BOOLEAN_CONVERTER$21 },
12493
+ variant: { converter: STRING_CONVERTER$28 }
12341
12494
  };
12342
12495
  wire() {
12343
12496
  const api = connectSkeleton({
@@ -12351,9 +12504,9 @@ var XhSkeletonElement = class extends XhElement {
12351
12504
  };
12352
12505
  //#endregion
12353
12506
  //#region src/elements/slider.ts
12354
- const STRING_CONVERTER$26 = { fromAttribute: (v) => v ?? void 0 };
12355
- const NUMBER_CONVERTER$14 = { fromAttribute: (v) => v == null || v === "" ? void 0 : Number(v) };
12356
- const BOOLEAN_CONVERTER$19 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
12507
+ const STRING_CONVERTER$27 = { fromAttribute: (v) => v ?? void 0 };
12508
+ const NUMBER_CONVERTER$15 = { fromAttribute: (v) => v == null || v === "" ? void 0 : Number(v) };
12509
+ const BOOLEAN_CONVERTER$20 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
12357
12510
  /**
12358
12511
  * 值恒是数组,属性写成逗号分隔(单滑块 value="30",双滑块 value="20,80")。
12359
12512
  * 解析不出任何有限数就当没写:留下 NaN 会一路写进 aria-valuenow 与定位百分比。
@@ -12415,36 +12568,36 @@ var XhSliderElement = class extends XhElement {
12415
12568
  converter: NUMBER_LIST_CONVERTER$1,
12416
12569
  attribute: "default-value"
12417
12570
  },
12418
- min: { converter: NUMBER_CONVERTER$14 },
12419
- max: { converter: NUMBER_CONVERTER$14 },
12420
- step: { converter: NUMBER_CONVERTER$14 },
12571
+ min: { converter: NUMBER_CONVERTER$15 },
12572
+ max: { converter: NUMBER_CONVERTER$15 },
12573
+ step: { converter: NUMBER_CONVERTER$15 },
12421
12574
  largeStep: {
12422
- converter: NUMBER_CONVERTER$14,
12575
+ converter: NUMBER_CONVERTER$15,
12423
12576
  attribute: "large-step"
12424
12577
  },
12425
12578
  minStepsBetweenThumbs: {
12426
- converter: NUMBER_CONVERTER$14,
12579
+ converter: NUMBER_CONVERTER$15,
12427
12580
  attribute: "min-steps-between-thumbs"
12428
12581
  },
12429
12582
  snapToMarks: {
12430
- converter: BOOLEAN_CONVERTER$19,
12583
+ converter: BOOLEAN_CONVERTER$20,
12431
12584
  attribute: "snap-to-marks"
12432
12585
  },
12433
12586
  marks: { attribute: false },
12434
- orientation: { converter: STRING_CONVERTER$26 },
12587
+ orientation: { converter: STRING_CONVERTER$27 },
12435
12588
  direction: {
12436
- converter: STRING_CONVERTER$26,
12589
+ converter: STRING_CONVERTER$27,
12437
12590
  attribute: "dir"
12438
12591
  },
12439
- disabled: { converter: BOOLEAN_CONVERTER$19 },
12592
+ disabled: { converter: BOOLEAN_CONVERTER$20 },
12440
12593
  readOnly: {
12441
- converter: BOOLEAN_CONVERTER$19,
12594
+ converter: BOOLEAN_CONVERTER$20,
12442
12595
  attribute: "read-only"
12443
12596
  },
12444
- invalid: { converter: BOOLEAN_CONVERTER$19 },
12445
- tone: { converter: STRING_CONVERTER$26 },
12446
- size: { converter: STRING_CONVERTER$26 },
12447
- name: { converter: STRING_CONVERTER$26 },
12597
+ invalid: { converter: BOOLEAN_CONVERTER$20 },
12598
+ tone: { converter: STRING_CONVERTER$27 },
12599
+ size: { converter: STRING_CONVERTER$27 },
12600
+ name: { converter: STRING_CONVERTER$27 },
12448
12601
  getValueText: { attribute: false }
12449
12602
  };
12450
12603
  idGen = createCounterIdGenerator();
@@ -12527,6 +12680,145 @@ var XhSliderElement = class extends XhElement {
12527
12680
  }
12528
12681
  };
12529
12682
  //#endregion
12683
+ //#region src/elements/sortable.ts
12684
+ const STRING_CONVERTER$26 = { fromAttribute: (v) => v ?? void 0 };
12685
+ const NUMBER_CONVERTER$14 = { fromAttribute: (v) => v == null || v === "" ? void 0 : Number(v) };
12686
+ const BOOLEAN_CONVERTER$19 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
12687
+ /** 顺序写成逗号分隔的标识串(ids="a,b,c")。空串当没写。 */
12688
+ const ID_LIST_CONVERTER = { fromAttribute: (v) => {
12689
+ if (v == null || v.trim() === "") return void 0;
12690
+ const out = v.split(",").map((s) => s.trim()).filter(Boolean);
12691
+ return out.length ? out : void 0;
12692
+ } };
12693
+ /**
12694
+ * `<xh-sortable>` —— Light-DOM 行为宿主:作者写 root/item/item-handle/live-region 角色节点,
12695
+ * 元素跑 sortable 机器并把 connect 产出打上去。
12696
+ *
12697
+ * 顺序的唯一真源是 `ids`,DOM 里项的先后必须与它一致——几何按 DOM 量,事件按 `ids` 算。
12698
+ * 每个 item 与它的 item-handle 都要用 `item-id` 属性写明自己是哪一项(与 Vue 侧的 `:item-id` 同一份声明)。
12699
+ * 单独禁掉某一项写 `item-disabled`。不给 item-handle 时整项可拖。
12700
+ *
12701
+ * 拖动落点走乐观投影:拖动过程中其余项实时让位,松手即定。让位与跟手的位移由元素每帧
12702
+ * 写进内联 transform,作者的样式表不要再碰这条属性。
12703
+ *
12704
+ * 键盘全在手柄上:空格或回车拾起、方向键挪一格、再按空格放下、Esc 取消。
12705
+ * 拖动中的 Tab 会被拦下——焦点一旦移走,这一场就没有出口了。
12706
+ *
12707
+ * @customElement xh-sortable
12708
+ * @attr {string} ids - 顺序真源,逗号分隔的项标识(如 "a,b,c")
12709
+ * @attr {'horizontal'|'vertical'|'both'} orientation - 排序轴,默认 vertical;换行网格用 both
12710
+ * @attr {'ltr'|'rtl'} dir - 文字方向,只对调水平排布下左右两键的语义,默认 ltr
12711
+ * @attr {boolean} disabled - 禁用:手柄退出 Tab 序列,按下也不进拖动
12712
+ * @attr {number} activation-distance - 按下之后走多远才算开始拖,默认 5;给 0 表示按下即拖
12713
+ * @attr {boolean} auto-scroll - 拖到容器边缘时自动滚动,默认开
12714
+ * @fires sort - 顺序变化;detail 为 `{ from, to, id, ids }`,其中 ids 已重排好
12715
+ * @fires drag-start - 拾起;detail 为 `{ id, from, mode }`
12716
+ * @fires drag-end - 收尾(含取消);detail 为 `{ id, from, to, mode, canceled }`
12717
+ * @csspart root - 承载 data-orientation / data-disabled / data-dragging 的容器
12718
+ * @csspart item - 一项;位移由内联 transform 给出,被拖的那项带 data-dragging
12719
+ * @csspart item-handle - role=button 的拖拽手柄,指针与键盘交互全在它身上
12720
+ * @csspart live-region - 视觉隐藏的播报区,拖动过程的读屏文案写在这里
12721
+ */
12722
+ var XhSortableElement = class extends XhElement {
12723
+ static partContract = {
12724
+ anatomy: sortableAnatomy,
12725
+ meta: sortableMeta
12726
+ };
12727
+ static properties = {
12728
+ ids: { converter: ID_LIST_CONVERTER },
12729
+ orientation: { converter: STRING_CONVERTER$26 },
12730
+ direction: {
12731
+ converter: STRING_CONVERTER$26,
12732
+ attribute: "dir"
12733
+ },
12734
+ disabled: { converter: BOOLEAN_CONVERTER$19 },
12735
+ activationDistance: {
12736
+ converter: NUMBER_CONVERTER$14,
12737
+ attribute: "activation-distance"
12738
+ },
12739
+ autoScroll: {
12740
+ converter: BOOLEAN_CONVERTER$19,
12741
+ attribute: "auto-scroll"
12742
+ }
12743
+ };
12744
+ idGen = createCounterIdGenerator();
12745
+ sortableScope = createScope(null, this.idGen);
12746
+ notifySort = (details) => {
12747
+ this.dispatchEvent(new CustomEvent("sort", {
12748
+ detail: details,
12749
+ bubbles: true,
12750
+ composed: true
12751
+ }));
12752
+ };
12753
+ notifyDragStart = (details) => {
12754
+ this.dispatchEvent(new CustomEvent("drag-start", {
12755
+ detail: details,
12756
+ bubbles: true,
12757
+ composed: true
12758
+ }));
12759
+ };
12760
+ notifyDragEnd = (details) => {
12761
+ this.dispatchEvent(new CustomEvent("drag-end", {
12762
+ detail: details,
12763
+ bubbles: true,
12764
+ composed: true
12765
+ }));
12766
+ };
12767
+ ctrl = new MachineController(this, sortableMachine, () => this.machineProps(), {
12768
+ scope: this.sortableScope,
12769
+ onBuilt: (svc) => this.injectRefs(svc)
12770
+ });
12771
+ machineProps() {
12772
+ return {
12773
+ ids: this.ids ?? [],
12774
+ orientation: this.orientation,
12775
+ dir: this.direction,
12776
+ disabled: this.disabled ?? false,
12777
+ activationDistance: this.activationDistance,
12778
+ autoScroll: this.autoScroll,
12779
+ onSort: this.notifySort,
12780
+ onDragStart: this.notifyDragStart,
12781
+ onDragEnd: this.notifyDragEnd
12782
+ };
12783
+ }
12784
+ injectRefs(svc) {
12785
+ svc.refs.set("getRootEl", () => this.getPart("root"));
12786
+ }
12787
+ /**
12788
+ * 部件自报的项标识。作者在节点上写 item-id="a",与 Vue 侧的 `:id` 是同一份声明;
12789
+ * 没写就落空串——connect 那边找不到对应项,会当作不可拖的普通节点。
12790
+ *
12791
+ * 不用 `id`:那是 HTML 全局属性,写上去会留在 DOM 里(Vue 侧的同名 prop 不会),
12792
+ * 而且同一项的外壳与手柄同名时会造出两个相同的 DOM id。
12793
+ */
12794
+ partId(el) {
12795
+ return el.getAttribute("item-id") ?? "";
12796
+ }
12797
+ /** 项级禁用。写 item-disabled 即禁掉这一项,与列表级的 disabled 各管各的。 */
12798
+ partDisabled(el) {
12799
+ const raw = el.getAttribute("item-disabled");
12800
+ return raw != null && raw !== "false";
12801
+ }
12802
+ wire() {
12803
+ const api = connectSortable(this.ctrl.service, wcNormalize);
12804
+ const root = this.getPart("root");
12805
+ if (root) this.spreader.spread(root, api.getRootProps());
12806
+ for (const el of this.getParts("item")) this.spreader.spread(el, api.getItemProps({
12807
+ id: this.partId(el),
12808
+ disabled: this.partDisabled(el)
12809
+ }));
12810
+ for (const el of this.getParts("item-handle")) this.spreader.spread(el, api.getItemHandleProps({
12811
+ id: this.partId(el),
12812
+ disabled: this.partDisabled(el)
12813
+ }));
12814
+ const live = this.getPart("live-region");
12815
+ if (live) {
12816
+ this.spreader.spread(live, api.getLiveRegionProps());
12817
+ live.textContent = this.ctrl.service.context.get("announcement");
12818
+ }
12819
+ }
12820
+ };
12821
+ //#endregion
12530
12822
  //#region src/elements/space.ts
12531
12823
  const STRING_CONVERTER$25 = { fromAttribute: (v) => v ?? void 0 };
12532
12824
  const BOOLEAN_CONVERTER$18 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
@@ -13049,7 +13341,13 @@ const FOOTER_SELECTOR = "[data-xh-part=\"footer\"]";
13049
13341
  * 同一个 row 部件写在 header / body / footer 里语义不同(表头行、数据行、脚注行),
13050
13342
  * 元素按祖先链现查区段,作者无需换用别的部件名。
13051
13343
  *
13052
- * 两份定义与三个集合都是数组/对象,只走 property(`el.rows = [...]`)。
13344
+ * 两份定义与三个集合都是数组/对象,只走 property(`el.rows = [...]`);
13345
+ * 落点校验 `allowRowDrop`(函数)同理。
13346
+ *
13347
+ * 打开 row-reorderable 后行可以拖着换位:整行都是拖动源。落点画在参照行上——
13348
+ * data-drop 为 before/after 是插在这一行前后;rows 带 parentId 的树形表另有 inside,
13349
+ * 是放进这一行底下,只有可展开或已经有孩子的行给这一档。触屏那一路走 row-drag-trigger 把手。
13350
+ * 键盘走 Alt + 方向键:上下在同层挪一位,左右在树形表下改缩进层级(rtl 下左右对调)。
13053
13351
  *
13054
13352
  * @customElement xh-table
13055
13353
  * @attr {'none'|'single'|'multiple'} selection-mode - 选择模式,默认 none(不声明就没有选择这回事)
@@ -13060,6 +13358,7 @@ const FOOTER_SELECTOR = "[data-xh-part=\"footer\"]";
13060
13358
  * @attr {boolean} borderless - 去掉外框,只留行间横线
13061
13359
  * @attr {boolean} ruled - 列与列之间加竖分隔线
13062
13360
  * @attr {boolean} footer - 表格带脚注行:行号空间的最后一行留给它,aria-rowcount 也算上
13361
+ * @attr {boolean} row-reorderable - 行可以拖着换位:整行都是拖动源;触屏那一路走 row-drag-trigger 把手
13063
13362
  * @attr {boolean} loop - 上下键走到首尾回绕,默认关;写 loop="true" 打开
13064
13363
  * @attr {'ltr'|'rtl'} dir - 文字方向,只对调左右方向键的展开/收起语义,默认 ltr
13065
13364
  * @attr {'sm'|'md'|'lg'} size - 密度:只换单元格的纵向内边距与字号,列宽不受影响
@@ -13069,6 +13368,8 @@ const FOOTER_SELECTOR = "[data-xh-part=\"footer\"]";
13069
13368
  * @prop {TableColumnKind[]} prefixColumns - 要哪几列前缀列,按给定顺序插在最前面
13070
13369
  * @fires selection-change - 选中集合变化;detail 为 `{ value: string[] | 'all' }`
13071
13370
  * @fires expanded-change - 展开集合变化;detail 为 `{ value: string[] }`
13371
+ * @fires row-move - 行换了位置;detail 为 `{ id, parent, index, ids }`,parent 为 null 即根层,index 是在那一层的落位(已算过先摘后插),ids 是重排好的整份行序
13372
+ * @prop {(move: TableRowMoveDetails) => boolean} allowRowDrop - 这一次搬家许不许,收到的是折算好的落点;不给即都许
13072
13373
  * @csspart root - role=grid 容器(rows 里有可展开的行时为 treegrid),报行列总数与多选声明
13073
13374
  * @csspart caption - 表格标题(aria-labelledby 目标)
13074
13375
  * @csspart header - role=rowgroup 表头区
@@ -13080,6 +13381,10 @@ const FOOTER_SELECTOR = "[data-xh-part=\"footer\"]";
13080
13381
  * @csspart select-all-trigger - 全选把手,三态(aria-checked 半选为 mixed),自占一个 Tab 位
13081
13382
  * @csspart row-select-trigger - 行选择把手(aria-hidden 且不占 Tab 位,键盘那一路由 Space 承担)
13082
13383
  * @csspart sort-trigger - 排序把手,自占一个 Tab 位;按住 Shift 点是追加到排序链
13384
+ * @csspart column-resize-trigger - 列宽把手,自占一个 Tab 位;方向键改一步、按住 Shift 是大步
13385
+ * @csspart column-drag-trigger - 列拖拽把手,自占一个 Tab 位;方向键移一位、Home/End 移到可拖区段首末
13386
+ * @csspart row-drag-trigger - 行拖拽把手,触屏那一路的入口(自带 touch-action: none,按下即拖);对读屏隐藏且不占 Tab 位,键盘那一路由表体上的 Alt + 方向键承担
13387
+ * @csspart live-region - 视觉隐藏的播报区,列拖拽过程的读屏文案写在这里;须写在 root 之外(root 是 role=grid,它的子节点只能是 row 与 rowgroup)
13083
13388
  * @csspart expand-trigger - 展开把手(aria-hidden 且不占 Tab 位,键盘那一路由左右方向键承担)
13084
13389
  * @csspart expanded-row - role=row 详情行,须自带 value 属性与它所属的数据行配对,内部须放一个 cell 承载详情;收起时 hidden
13085
13390
  * @csspart empty - 空态节点,表体为空且不在加载时显形
@@ -13121,6 +13426,11 @@ var XhTableElement = class extends XhElement {
13121
13426
  borderless: { type: Boolean },
13122
13427
  ruled: { type: Boolean },
13123
13428
  footer: { type: Boolean },
13429
+ rowReorderable: {
13430
+ type: Boolean,
13431
+ attribute: "row-reorderable"
13432
+ },
13433
+ allowRowDrop: { attribute: false },
13124
13434
  loop: { converter: BOOLEAN_CONVERTER$15 },
13125
13435
  direction: {
13126
13436
  converter: STRING_CONVERTER$20,
@@ -13156,6 +13466,13 @@ var XhTableElement = class extends XhElement {
13156
13466
  composed: true
13157
13467
  }));
13158
13468
  };
13469
+ notifyRowMove = (details) => {
13470
+ this.dispatchEvent(new CustomEvent("row-move", {
13471
+ detail: details,
13472
+ bubbles: true,
13473
+ composed: true
13474
+ }));
13475
+ };
13159
13476
  ctrl = new MachineController(this, tableMachine, () => this.machineProps());
13160
13477
  machineProps() {
13161
13478
  return {
@@ -13181,12 +13498,15 @@ var XhTableElement = class extends XhElement {
13181
13498
  borderless: this.borderless ?? false,
13182
13499
  ruled: this.ruled ?? false,
13183
13500
  footer: this.footer ?? false,
13501
+ rowReorderable: this.rowReorderable ?? false,
13502
+ allowRowDrop: this.allowRowDrop,
13184
13503
  loop: this.loop,
13185
13504
  dir: this.direction,
13186
13505
  size: this.size,
13187
13506
  onSortChange: this.notifySort,
13188
13507
  onSelectionChange: this.notifySelection,
13189
- onExpandedChange: this.notifyExpanded
13508
+ onExpandedChange: this.notifyExpanded,
13509
+ onRowMove: this.notifyRowMove
13190
13510
  };
13191
13511
  }
13192
13512
  /** 承载焦点的行被移出 DOM 时上报 TABLE.BLUR,让机器重挑焦点锚点。 */
@@ -13211,6 +13531,18 @@ var XhTableElement = class extends XhElement {
13211
13531
  columnOf(el) {
13212
13532
  return { value: this.identityOf(el, COLUMN_HEADER_SELECTOR) };
13213
13533
  }
13534
+ /**
13535
+ * 播报区节点。第一次用时建出来挂在元素末尾,之后一直复用——
13536
+ * 读屏不播报后插入的节点,等到拾起才建等于没有。
13537
+ */
13538
+ ensureLiveRegion() {
13539
+ const existing = this.querySelector(`:scope > [data-xh-part="live-region"]`);
13540
+ if (existing) return existing;
13541
+ const el = this.ownerDocument.createElement("div");
13542
+ el.setAttribute("data-xh-part", "live-region");
13543
+ this.append(el);
13544
+ return el;
13545
+ }
13214
13546
  /** 按祖先链现查行所在的区段。 */
13215
13547
  sectionOf(el) {
13216
13548
  const header = el.closest(HEADER_SELECTOR);
@@ -13257,8 +13589,14 @@ var XhTableElement = class extends XhElement {
13257
13589
  putAll("select-all-trigger", () => api.getSelectAllTriggerProps());
13258
13590
  putAll("row-select-trigger", (el) => api.getRowSelectTriggerProps(this.rowOf(el)));
13259
13591
  putAll("sort-trigger", (el) => api.getSortTriggerProps(this.columnOf(el)));
13592
+ putAll("column-resize-trigger", (el) => api.getColumnResizeTriggerProps(this.columnOf(el)));
13593
+ putAll("column-drag-trigger", (el) => api.getColumnDragTriggerProps(this.columnOf(el)));
13594
+ putAll("row-drag-trigger", (el) => api.getRowDragTriggerProps(this.rowOf(el)));
13260
13595
  putAll("expand-trigger", (el) => api.getExpandTriggerProps(this.rowOf(el)));
13261
13596
  putAll("expanded-row", (el) => api.getExpandedRowProps({ value: el.getAttribute("value") ?? "" }));
13597
+ const live = this.ensureLiveRegion();
13598
+ this.spreader.spread(live, api.getLiveRegionProps());
13599
+ live.textContent = this.ctrl.service.context.get("announcement");
13262
13600
  for (const el of this.getParts("row")) if (el.hasAttribute("disabled")) el.removeAttribute("disabled");
13263
13601
  for (const el of this.getParts("expanded-row")) this.setPartHidden(el, !api.isExpanded(el.getAttribute("value") ?? ""));
13264
13602
  this.setPartHidden(this.getPart("empty"), !!emptyProps.hidden);
@@ -13269,10 +13607,19 @@ var XhTableElement = class extends XhElement {
13269
13607
  //#region src/elements/tabs.ts
13270
13608
  const STRING_CONVERTER$19 = { fromAttribute: (v) => v ?? void 0 };
13271
13609
  const BOOLEAN_CONVERTER$14 = { fromAttribute: (v) => v === null ? void 0 : v !== "false" };
13610
+ /** 标签一系的归属容器:标签内的把手向上找最近的那个 trigger。 */
13611
+ const TRIGGER_SELECTOR = "[data-xh-part=\"trigger\"]";
13272
13612
  /**
13273
13613
  * `<xh-tabs>` —— Light-DOM 行为宿主,跑 tabs 机器并把 connect 产出打到 root/list/trigger/content
13274
13614
  * 角色节点上。条目身份取作者写在 trigger/content 上的 value 属性,trigger 的禁用由部件自报。
13275
13615
  *
13616
+ * 读屏文案 `translations` 是对象,属性表达不了,只能走 property(`el.translations = {...}`)。
13617
+ *
13618
+ * 打开 reorderable 后标签可以拖着换位:整个标签都是拖动源。拖动中被拖的标签原地不动,
13619
+ * 只落 data-dragging;落点画在参照标签上,data-drop 为 before/after 即插在这个标签前后。触屏那一路走 tab-drag-trigger 把手。
13620
+ * 键盘走 Alt + 主轴方向键(横排是左右、竖排是上下,横排 rtl 下左右对调),一按就是一次完整提交。
13621
+ * 顺序不由元素保管:换位只发 tab-move,标签序由使用方写回自己的数据源。
13622
+ *
13276
13623
  * @customElement xh-tabs
13277
13624
  * @attr {string} value - 受控选中值;缺省该属性即非受控
13278
13625
  * @attr {string} default-value - 非受控的初始选中值
@@ -13283,11 +13630,15 @@ const BOOLEAN_CONVERTER$14 = { fromAttribute: (v) => v === null ? void 0 : v !==
13283
13630
  * @attr {'line'|'card'|'segment'} variant - 形态,默认 line
13284
13631
  * @attr {'brand'|'neutral'|'success'|'warning'|'danger'|'info'} tone - 语气
13285
13632
  * @attr {'sm'|'md'|'lg'} size - 尺寸
13633
+ * @attr {boolean} reorderable - 标签可以拖着换位,默认关
13286
13634
  * @fires value-change - 选中值变化;detail 为 `{ value: string | null }`
13635
+ * @fires tab-move - 标签换了位;detail 为 `{ value, from, to, values }`,values 是重排好的整份标签序
13287
13636
  * @csspart root - 组件根容器(承载 data-orientation)
13288
13637
  * @csspart list - role=tablist 容器(方向键与 Tab 序列在此收口)
13638
+ * @csspart live-region - 视觉隐藏的播报区,拖动过程的读屏文案写在这里;写在 root 里、与 list 部件平级(root 自己不带角色,它落不进 role=tablist 的子节点集合)
13289
13639
  * @csspart trigger - role=tab 的标签按钮,须自带 value 属性标识身份
13290
13640
  * @csspart content - role=tabpanel 的面板,须自带 value 属性与 trigger 配对;未选中时 hidden
13641
+ * @csspart tab-drag-trigger - 标签拖拽把手,触屏那一路的入口(自带 touch-action: none,按下即拖);对读屏隐藏且不占 Tab 位,键盘那一路由标签带上的 Alt + 方向键承担
13291
13642
  */
13292
13643
  var XhTabsElement = class extends XhElement {
13293
13644
  static partContract = {
@@ -13313,7 +13664,9 @@ var XhTabsElement = class extends XhElement {
13313
13664
  loop: { converter: BOOLEAN_CONVERTER$14 },
13314
13665
  variant: { converter: STRING_CONVERTER$19 },
13315
13666
  tone: { converter: STRING_CONVERTER$19 },
13316
- size: { converter: STRING_CONVERTER$19 }
13667
+ size: { converter: STRING_CONVERTER$19 },
13668
+ reorderable: { type: Boolean },
13669
+ translations: { attribute: false }
13317
13670
  };
13318
13671
  notify = (details) => {
13319
13672
  this.dispatchEvent(new CustomEvent("value-change", {
@@ -13322,6 +13675,13 @@ var XhTabsElement = class extends XhElement {
13322
13675
  composed: true
13323
13676
  }));
13324
13677
  };
13678
+ notifyTabMove = (details) => {
13679
+ this.dispatchEvent(new CustomEvent("tab-move", {
13680
+ detail: details,
13681
+ bubbles: true,
13682
+ composed: true
13683
+ }));
13684
+ };
13325
13685
  ctrl = new MachineController(this, tabsMachine, () => this.machineProps());
13326
13686
  /** 作者声明的条目禁用,只认首见那一份;给了 collection 时用它,否则现读 */
13327
13687
  declaredDisabled = createDeclaredDisabled();
@@ -13337,7 +13697,10 @@ var XhTabsElement = class extends XhElement {
13337
13697
  variant: this.variant,
13338
13698
  tone: this.tone,
13339
13699
  size: this.size,
13340
- onValueChange: this.notify
13700
+ reorderable: this.reorderable ?? false,
13701
+ translations: this.translations,
13702
+ onValueChange: this.notify,
13703
+ onTabMove: this.notifyTabMove
13341
13704
  };
13342
13705
  }
13343
13706
  /** 承载焦点的条目被移出 DOM 时浏览器不派 focusout,这里替 DOM 上报焦点离场。 */
@@ -13348,6 +13711,15 @@ var XhTabsElement = class extends XhElement {
13348
13711
  if (focusedValue == null) return;
13349
13712
  if (nodes.some((el) => el.getAttribute(ITEM_VALUE_ATTR) === focusedValue)) send({ type: "LIST.BLUR" });
13350
13713
  }
13714
+ /**
13715
+ * 取把手所属标签的身份:向上找本宿主内最近的 trigger,没有包裹层时退回读节点自身。
13716
+ * 越出本宿主的 trigger 不算数——嵌套 xh-tabs 的内层把手不会认外层的标签。
13717
+ */
13718
+ /** 把手所属的那个 trigger 节点;把手自己就写在 trigger 上时即它本身。 */
13719
+ triggerElOf(el) {
13720
+ const owner = el.closest(TRIGGER_SELECTOR);
13721
+ return owner && owner !== this && this.contains(owner) ? owner : el;
13722
+ }
13351
13723
  wire() {
13352
13724
  const api = connectTabs(this.ctrl.service, wcNormalize);
13353
13725
  const put = (name, props) => {
@@ -13356,6 +13728,11 @@ var XhTabsElement = class extends XhElement {
13356
13728
  };
13357
13729
  put("root", api.getRootProps());
13358
13730
  put("list", api.getListProps());
13731
+ const live = this.getPart("live-region");
13732
+ if (live) {
13733
+ this.spreader.spread(live, api.getLiveRegionProps());
13734
+ live.textContent = this.ctrl.service.context.get("announcement");
13735
+ }
13359
13736
  for (const el of this.getParts("trigger")) {
13360
13737
  const props = api.getTriggerProps({
13361
13738
  value: el.getAttribute("value") ?? "",
@@ -13363,6 +13740,14 @@ var XhTabsElement = class extends XhElement {
13363
13740
  });
13364
13741
  this.spreader.spread(el, props);
13365
13742
  }
13743
+ for (const el of this.getParts("tab-drag-trigger")) {
13744
+ const trigger = this.triggerElOf(el);
13745
+ const props = api.getTabDragTriggerProps({
13746
+ value: trigger.getAttribute("value") ?? "",
13747
+ disabled: this.collection ? this.declaredDisabled(trigger) : isItemDisabled(trigger)
13748
+ });
13749
+ this.spreader.spread(el, props);
13750
+ }
13366
13751
  for (const el of this.getParts("content")) {
13367
13752
  const props = api.getContentProps({ value: el.getAttribute("value") ?? "" });
13368
13753
  this.spreader.spread(el, props);
@@ -15501,6 +15886,8 @@ const BOOLEAN_CONVERTER$2 = { fromAttribute: (v) => v === null ? void 0 : v !==
15501
15886
  const ITEM_SELECTOR$1 = "[data-xh-part=\"item\"]";
15502
15887
  /** 分支一系的归属容器;嵌套分支各认最近的那个。 */
15503
15888
  const BRANCH_SELECTOR$1 = "[data-xh-part=\"branch\"]";
15889
+ /** 两类节点通吃的归属容器:拖动把手写在叶子里还是分支里都算,取最近的那一个。 */
15890
+ const NODE_SELECTOR = `${ITEM_SELECTOR$1}, ${BRANCH_SELECTOR$1}`;
15504
15891
  /**
15505
15892
  * `<xh-tree>` —— Light-DOM 行为宿主:作者写 root/label/tree 与若干 item / branch 角色节点,
15506
15893
  * 元素跑 tree 机器并把 connect 产出打上去。节点身份取自节点上的 value 属性。
@@ -15509,7 +15896,13 @@ const BRANCH_SELECTOR$1 = "[data-xh-part=\"branch\"]";
15509
15896
  * 这份树数据——它是元信息的唯一事实源,作者的标记只管长相,两个适配器也就不会各推各的。
15510
15897
  * 因此 collection 必须与标记同源:标记里有、collection 里没有的节点报不出层级,也进不了导航。
15511
15898
  *
15512
- * 树数据与展开/选中集合都是数组,属性表达不了,只能走 property(`el.collection = [...]`)。
15899
+ * 树数据与展开/选中集合都是数组,属性表达不了,只能走 property(`el.collection = [...]`);
15900
+ * 落点校验 `allowDrop`(函数)与读屏文案 `translations`(对象)同理。
15901
+ *
15902
+ * 打开 node-draggable 后节点可以拖着搬家:整个节点都是拖动源。拖动中被拖的节点原地不动,
15903
+ * 只落 data-dragging;落点画在参照节点上——data-drop 为 before/after 是插在这一行前后,
15904
+ * 为 inside 是放进这个分支。触屏那一路走 node-drag-trigger 把手。
15905
+ * 键盘走 Alt + 方向键:上下在同层兄弟间挪,左右改缩进层级(rtl 下左右对调),一按就是一次完整提交。
15513
15906
  *
15514
15907
  * @customElement xh-tree
15515
15908
  * @attr {boolean} multiple - 复选,默认关闭
@@ -15522,10 +15915,13 @@ const BRANCH_SELECTOR$1 = "[data-xh-part=\"branch\"]";
15522
15915
  * @attr {boolean} loop - 上下键走到首尾回绕,默认关;写 loop="true" 打开
15523
15916
  * @attr {boolean} typeahead - 连打检索,默认开;写 typeahead="false" 关掉
15524
15917
  * @attr {'ltr'|'rtl'} dir - 文字方向,只对调左右方向键的展开/收起语义,默认 ltr
15918
+ * @attr {boolean} node-draggable - 节点可以拖着搬家,默认关;不叫 draggable 是因为那是 HTML 全局属性,写在元素上浏览器会拿它接管原生拖放,指针就到不了这里
15525
15919
  * @fires expanded-change - 展开集合变化;detail 为 `{ value: string[] }`
15526
15920
  * @fires selection-change - 选中集合变化;detail 为 `{ value: string[] }`
15921
+ * @fires node-move - 节点搬了家;detail 为 `{ value, parent, index }`,parent 为 null 即根层,index 是在那一层的落位(已算过先摘后插)
15527
15922
  * @csspart root - 组件根容器
15528
15923
  * @csspart label - 树标题(aria-labelledby 目标)
15924
+ * @csspart live-region - 视觉隐藏的播报区,拖动过程的读屏文案写在这里;写在 root 里、与 tree 部件平级(root 自己不带角色,它落不进 role=tree 的子节点集合)
15529
15925
  * @csspart tree - role=tree 容器,键盘在此收口,也是 roving tabindex 的兜底位
15530
15926
  * @csspart item - role=treeitem 叶子,须自带 value 属性标识身份
15531
15927
  * @csspart item-text - 叶子文本
@@ -15538,6 +15934,7 @@ const BRANCH_SELECTOR$1 = "[data-xh-part=\"branch\"]";
15538
15934
  * @csspart branch-indicator - 展开方向指示符(aria-hidden)
15539
15935
  * @csspart branch-text - 分支文本
15540
15936
  * @csspart branch-content - role=group 子层容器,收起时隐藏
15937
+ * @csspart node-drag-trigger - 节点拖拽把手,触屏那一路的入口(自带 touch-action: none,按下即拖);对读屏隐藏且不占 Tab 位,键盘那一路由树上的 Alt + 方向键承担
15541
15938
  */
15542
15939
  var XhTreeElement = class extends XhElement {
15543
15940
  static partContract = {
@@ -15574,7 +15971,13 @@ var XhTreeElement = class extends XhElement {
15574
15971
  direction: {
15575
15972
  converter: STRING_CONVERTER$3,
15576
15973
  attribute: "dir"
15577
- }
15974
+ },
15975
+ nodeDraggable: {
15976
+ type: Boolean,
15977
+ attribute: "node-draggable"
15978
+ },
15979
+ allowDrop: { attribute: false },
15980
+ translations: { attribute: false }
15578
15981
  };
15579
15982
  notifyExpanded = (details) => {
15580
15983
  this.dispatchEvent(new CustomEvent("expanded-change", {
@@ -15590,6 +15993,13 @@ var XhTreeElement = class extends XhElement {
15590
15993
  composed: true
15591
15994
  }));
15592
15995
  };
15996
+ notifyNodeMove = (details) => {
15997
+ this.dispatchEvent(new CustomEvent("node-move", {
15998
+ detail: details,
15999
+ bubbles: true,
16000
+ composed: true
16001
+ }));
16002
+ };
15593
16003
  ctrl = new MachineController(this, treeMachine, () => this.machineProps());
15594
16004
  machineProps() {
15595
16005
  return {
@@ -15608,8 +16018,12 @@ var XhTreeElement = class extends XhElement {
15608
16018
  loop: this.loop,
15609
16019
  typeahead: this.typeahead,
15610
16020
  dir: this.direction,
16021
+ nodeDraggable: this.nodeDraggable ?? false,
16022
+ allowDrop: this.allowDrop,
16023
+ translations: this.translations,
15611
16024
  onExpandedChange: this.notifyExpanded,
15612
- onSelectionChange: this.notifySelection
16025
+ onSelectionChange: this.notifySelection,
16026
+ onNodeMove: this.notifyNodeMove
15613
16027
  };
15614
16028
  }
15615
16029
  /**
@@ -15643,6 +16057,11 @@ var XhTreeElement = class extends XhElement {
15643
16057
  put("root", api.getRootProps());
15644
16058
  put("label", api.getLabelProps());
15645
16059
  put("tree", api.getTreeProps());
16060
+ const live = this.getPart("live-region");
16061
+ if (live) {
16062
+ this.spreader.spread(live, api.getLiveRegionProps());
16063
+ live.textContent = this.ctrl.service.context.get("announcement");
16064
+ }
15646
16065
  const putAll = (name, selector, get) => {
15647
16066
  for (const el of this.getParts(name)) this.spreader.spread(el, get(this.nodeOf(el, selector)));
15648
16067
  };
@@ -15657,6 +16076,7 @@ var XhTreeElement = class extends XhElement {
15657
16076
  putAll("branch-indicator", BRANCH_SELECTOR$1, (node) => api.getBranchIndicatorProps(node));
15658
16077
  putAll("branch-text", BRANCH_SELECTOR$1, (node) => api.getBranchTextProps(node));
15659
16078
  putAll("branch-content", BRANCH_SELECTOR$1, (node) => api.getBranchContentProps(node));
16079
+ putAll("node-drag-trigger", NODE_SELECTOR, (node) => api.getNodeDragTriggerProps(node));
15660
16080
  for (const el of this.getParts("branch-content")) this.setPartHidden(el, !api.isExpanded(this.nodeOf(el, BRANCH_SELECTOR$1).value));
15661
16081
  }
15662
16082
  };
@@ -16260,6 +16680,7 @@ function defineXhElements() {
16260
16680
  defineElement("xh-popconfirm", XhPopconfirmElement, version);
16261
16681
  defineElement("xh-popselect", XhPopselectElement, version);
16262
16682
  defineElement("xh-qr-code", XhQrCodeElement, version);
16683
+ defineElement("xh-resizable", XhResizableElement, version);
16263
16684
  defineElement("xh-result", XhResultElement, version);
16264
16685
  defineElement("xh-segmented", XhSegmentedElement, version);
16265
16686
  defineElement("xh-signature-pad", XhSignaturePadElement, version);
@@ -16318,6 +16739,7 @@ function defineXhElements() {
16318
16739
  defineElement("xh-separator", XhSeparatorElement, version);
16319
16740
  defineElement("xh-side-nav", XhSideNavElement, version);
16320
16741
  defineElement("xh-slider", XhSliderElement, version);
16742
+ defineElement("xh-sortable", XhSortableElement, version);
16321
16743
  defineElement("xh-splitter", XhSplitterElement, version);
16322
16744
  defineElement("xh-statistic", XhStatisticElement, version);
16323
16745
  defineElement("xh-steps", XhStepsElement, version);
@@ -16353,6 +16775,6 @@ function defineXhElements() {
16353
16775
  }
16354
16776
  }
16355
16777
  //#endregion
16356
- export { XhAccordionElement, XhAlertElement, XhAnchorElement, XhAvatarElement, XhBadgeElement, XhBreadcrumbElement, XhButtonElement, XhCalendarElement, XhCarouselElement, XhCascaderElement, XhCheckboxElement, XhCheckboxGroupElement, XhClipboardElement, XhCodeBlockElement, XhCollapsibleElement, XhColorPickerElement, XhComboboxElement, XhComposerElement, XhConfigElement, XhContextMenuElement, XhDateFieldElement, XhDatePickerElement, XhDialogElement, XhDownloadTriggerElement, XhDrawerElement, XhEditableElement, XhEmptyStateElement, XhFieldElement, XhFieldsetElement, XhFileUploadElement, XhFloatingPanelElement, XhFormElement, XhHeatmapElement, XhHotkeysElement, XhHoverCardElement, XhIconElement, XhImageCropperElement, XhImageElement, XhImageViewerElement, XhJsonViewerElement, XhListboxElement, XhLoadingBarElement, XhMasonryElement, XhMenuElement, XhMenubarElement, XhNavigationMenuElement, XhNotificationElement, XhNotificationItemElement, XhNumberFieldElement, XhPaginationElement, XhPasswordInputElement, XhPinInputElement, XhPopoverElement, XhProgressElement, XhRadioGroupElement, XhRatingElement, XhScrollAreaElement, XhScrollbarElement, XhSegmentedElement, XhSelectElement, XhSeparatorElement, XhSideNavElement, XhSignaturePadElement, XhSkeletonElement, XhSliderElement, XhSpaceElement, XhSpinnerElement, XhSplitterElement, XhStepsElement, XhSwitchElement, XhTableElement, XhTabsElement, XhTagElement, XhTagsInputElement, XhTextFieldElement, XhThreadElement, XhTimeFieldElement, XhTimePickerElement, XhTimerElement, XhToastElement, XhToggleElement, XhToggleGroupElement, XhToolbarElement, XhTooltipElement, XhTourElement, XhTransferElement, XhTreeElement, XhTreeSelectElement, XhVirtualizerElement, defineXhElements };
16778
+ export { XhAccordionElement, XhAlertElement, XhAnchorElement, XhAvatarElement, XhBadgeElement, XhBreadcrumbElement, XhButtonElement, XhCalendarElement, XhCarouselElement, XhCascaderElement, XhCheckboxElement, XhCheckboxGroupElement, XhClipboardElement, XhCodeBlockElement, XhCollapsibleElement, XhColorPickerElement, XhComboboxElement, XhComposerElement, XhConfigElement, XhContextMenuElement, XhDateFieldElement, XhDatePickerElement, XhDialogElement, XhDownloadTriggerElement, XhDrawerElement, XhEditableElement, XhEmptyStateElement, XhFieldElement, XhFieldsetElement, XhFileUploadElement, XhFloatingPanelElement, XhFormElement, XhHeatmapElement, XhHotkeysElement, XhHoverCardElement, XhIconElement, XhImageCropperElement, XhImageElement, XhImageViewerElement, XhJsonViewerElement, XhListboxElement, XhLoadingBarElement, XhMasonryElement, XhMenuElement, XhMenubarElement, XhNavigationMenuElement, XhNotificationElement, XhNotificationItemElement, XhNumberFieldElement, XhPaginationElement, XhPasswordInputElement, XhPinInputElement, XhPopoverElement, XhProgressElement, XhRadioGroupElement, XhRatingElement, XhResizableElement, XhScrollAreaElement, XhScrollbarElement, XhSegmentedElement, XhSelectElement, XhSeparatorElement, XhSideNavElement, XhSignaturePadElement, XhSkeletonElement, XhSliderElement, XhSortableElement, XhSpaceElement, XhSpinnerElement, XhSplitterElement, XhStepsElement, XhSwitchElement, XhTableElement, XhTabsElement, XhTagElement, XhTagsInputElement, XhTextFieldElement, XhThreadElement, XhTimeFieldElement, XhTimePickerElement, XhTimerElement, XhToastElement, XhToggleElement, XhToggleGroupElement, XhToolbarElement, XhTooltipElement, XhTourElement, XhTransferElement, XhTreeElement, XhTreeSelectElement, XhVirtualizerElement, defineXhElements };
16357
16779
 
16358
16780
  //# sourceMappingURL=define.js.map