@mooncellwiki/prts-design-vue 0.1.2 → 0.1.4

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/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["_openBlock","_createBlock","_resolveDynamicComponent","_withCtx","_renderSlot","_sfc_main","_hoisted_1","_openBlock","_createElementBlock","_sfc_main","_useSlots","_openBlock","_createBlock","_resolveDynamicComponent","_normalizeClass","_withCtx","AkIcon","_createElementBlock","_Fragment","_createCommentVNode","_renderSlot","_sfc_main","_hoisted_1","props","_openBlock","_createElementBlock","_renderSlot","_sfc_main","_hoisted_1","_hoisted_2","_hoisted_3","_openBlock","_createElementBlock","_normalizeClass","_createCommentVNode","_unref","_renderSlot","_sfc_main","$slots","_hoisted_1","_hoisted_2","_hoisted_3","_openBlock","_createElementBlock","_normalizeClass","_createElementVNode","_renderSlot","_createVNode","AkIcon","_createTextVNode","_toDisplayString","_createCommentVNode","_sfc_main","_renderSlot","_createTextVNode","_toDisplayString","_sfc_main","_hoisted_1","_openBlock","_createElementBlock","_renderSlot","_sfc_main","_hoisted_1","_hoisted_2","_useModel","_useSlots","AkTabPane","AkTab","_openBlock","_createElementBlock","_normalizeClass","_Fragment","_renderList","_createElementVNode","_createVNode","_createBlock","_createCommentVNode","_sfc_main","$slots","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_openBlock","_createBlock","_resolveDynamicComponent","_withCtx","_createElementVNode","_normalizeClass","_createElementBlock","_renderSlot","_createTextVNode","_toDisplayString","_createCommentVNode","_sfc_main","_hoisted_1","props","_openBlock","_createElementBlock","_renderSlot","_sfc_main","_hoisted_1","_useModel","_openBlock","_createElementBlock","_normalizeClass","_createBlock","AkIcon","_createCommentVNode","_renderSlot","_sfc_main","$slots","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_openBlock","_createElementBlock","_renderSlot","_normalizeClass","_Fragment","_toDisplayString","_createCommentVNode","_createElementVNode","_createTextVNode","_sfc_main","$slots","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_useSlots","_openBlock","_createBlock","_resolveDynamicComponent","_normalizeClass","_withCtx","_renderSlot","_createElementBlock","_createCommentVNode","_toDisplayString","_createTextVNode","_createElementVNode","_Fragment","_sfc_main","_sfc_main","_hoisted_1","_sfc_render","_openBlock","_createElementBlock","_renderSlot","$slots","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_useModel","_useSlots","_openBlock","_createElementBlock","_normalizeClass","_createBlock","_resolveDynamicComponent","_withCtx","_unref","_renderSlot","_createTextVNode","_toDisplayString","_createCommentVNode","_Fragment","_createElementVNode","_sfc_main","$slots","_hoisted_1","_hoisted_2","_hoisted_3","_openBlock","_createElementBlock","_normalizeClass","_toDisplayString","_createCommentVNode","_createBlock","_resolveDynamicComponent","_withCtx","_renderSlot","_createTextVNode","_sfc_main","$slots","_hoisted_1","_hoisted_2","_openBlock","_createElementBlock","_renderSlot","_normalizeClass","_sfc_main","_hoisted_1","_hoisted_2","_openBlock","_createElementBlock","_normalizeClass","_renderSlot","_createCommentVNode","_sfc_main","_hoisted_1","_openBlock","_createElementBlock","_Fragment","_renderList","_createBlock","AkAvatar","_withCtx","_createTextVNode","_toDisplayString","_createCommentVNode","_renderSlot","_sfc_main","$slots","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_openBlock","_createElementBlock","_toDisplayString","_renderSlot","_createBlock","AkIcon","_createCommentVNode","_createTextVNode","_sfc_main","$attrs","_openBlock","_createElementBlock","_Fragment","_renderList","_mergeProps","_sfc_main","$slots","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_openBlock","_createElementBlock","_createElementVNode","_renderSlot","_normalizeClass","_normalizeStyle","_Fragment","_createCommentVNode","_createTextVNode","_toDisplayString","_sfc_main","$slots","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_useModel","_openBlock","_createElementBlock","_normalizeClass","_Fragment","_renderSlot","_createBlock","AkIcon","_createCommentVNode","_createElementVNode","_createTextVNode","_toDisplayString","_sfc_main","_hoisted_1","_useModel","_useSlots","_openBlock","_createElementBlock","_mergeProps","_toHandlers","_unref","_createVNode","_createElementVNode","_normalizeClass","_renderSlot","_sfc_main","$slots","_hoisted_1","_hoisted_2","_useModel","_useSlots","_openBlock","_createElementBlock","_mergeProps","_toHandlers","_unref","_createVNode","_createElementVNode","_normalizeClass","_renderSlot","_createTextVNode","_toDisplayString","_createCommentVNode","_sfc_main","_hoisted_1","_hoisted_2","_openBlock","_createElementBlock","_mergeProps","_createBlock","AkIcon","_createCommentVNode","_createTextVNode","_toDisplayString","_createElementVNode","_sfc_main","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_useModel","_useSlots","_openBlock","_createElementBlock","_normalizeClass","_createVNode","_unref","_createElementVNode","_Fragment","_renderList","_toDisplayString","_createBlock","MenuItem","_sfc_main","$slots","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_useModel","_openBlock","_createElementBlock","_normalizeClass","_unref","_renderSlot","_createTextVNode","_toDisplayString","_createBlock","AkButton","_createCommentVNode","_createElementVNode","_withCtx","_sfc_main","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_openBlock","_createElementBlock","_Fragment","_renderSlot","_createBlock","_Teleport","_createElementVNode","_renderList","_normalizeClass","_normalizeStyle","_toDisplayString","_createCommentVNode","_createVNode","_unref","_sfc_main","$slots","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_openBlock","_createElementBlock","_mergeProps","_renderSlot","_createTextVNode","_toDisplayString","_createCommentVNode","_unref","_createElementVNode","_normalizeClass","_normalizeStyle","_Fragment","_renderList","_sfc_main","$slots","_hoisted_1","_hoisted_2","_hoisted_3","_openBlock","_createElementBlock","_normalizeClass","_renderSlot","_createTextVNode","_toDisplayString","_createCommentVNode","_createElementVNode","_sfc_main","_hoisted_1","_openBlock","_createElementBlock","_renderSlot","_sfc_main","_hoisted_1","_hoisted_2","_openBlock","_createElementBlock","_renderSlot","_sfc_main","_hoisted_1","_hoisted_2","_useSlots","AkBreadcrumbItem","_openBlock","_createElementBlock","_createElementVNode","_createVNode","_sfc_main","_hoisted_1","_hoisted_2","_useModel","_openBlock","_createElementBlock","_createBlock","_resolveDynamicComponent","_mergeProps","_withCtx","_renderSlot","_createTextVNode","_Fragment","_renderList","_toDisplayString","_sfc_main","_hoisted_1","_openBlock","_createElementBlock","_renderSlot","_sfc_main","$slots","_hoisted_1","_hoisted_2","_hoisted_3","_openBlock","_createElementBlock","_normalizeClass","_toDisplayString","_createCommentVNode","_renderSlot","_createTextVNode","_sfc_main","_renderSlot","_createTextVNode","_toDisplayString","_sfc_main","_hoisted_1","_hoisted_2","_hoisted_3","_useSlots","AkStep","_openBlock","_createElementBlock","_Fragment","_renderList","_normalizeClass","_createVNode","_createCommentVNode","_sfc_main","_useModel","_openBlock","_createElementBlock","_renderSlot","_sfc_main","_hoisted_1","_hoisted_2","_hoisted_3","_openBlock","_createElementBlock","_createElementVNode","_unref","_renderSlot","_createTextVNode","_toDisplayString","_sfc_main","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_useModel","_openBlock","_createElementBlock","_normalizeClass","_createElementVNode","_Fragment","_renderList","_toDisplayString","_createTextVNode","_renderSlot","_createBlock","_createCommentVNode","_sfc_main","_hoisted_1","_useModel","_openBlock","_createElementBlock","_normalizeClass","_createVNode","AkIcon","_sfc_main","_hoisted_1","_hoisted_2","_useSlots","_openBlock","_createElementBlock","_normalizeClass","_renderSlot","_createTextVNode","_toDisplayString","_Fragment","_createElementVNode","_createCommentVNode","_sfc_main","$attrs","$slots","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_useModel","_useSlots","_withDirectives","_openBlock","_createElementBlock","_mergeProps","_vModelText","_createBlock","_withCtx","_renderSlot","_createCommentVNode","_createElementVNode","_vModelDynamic","_sfc_main","_hoisted_1","_openBlock","_createElementBlock","_renderSlot","_sfc_main","_hoisted_1","_hoisted_2","_hoisted_3","_useModel","_openBlock","_createElementBlock","_mergeProps","_unref","_createCommentVNode","_createElementVNode","_sfc_main","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_useModel","_withDirectives","_openBlock","_createElementBlock","_mergeProps","_unref","_toDisplayString","_createCommentVNode","_Fragment","_renderList","_vModelSelect","_sfc_main","_hoisted_1","_useModel","_useSlots","_openBlock","_createElementBlock","_mergeProps","_unref","_createElementVNode","_renderSlot","_sfc_main","_hoisted_1","_useModel","_openBlock","_createElementBlock","_mergeProps","_unref","_renderSlot","_sfc_main","_hoisted_1","_useModel","_useSlots","_openBlock","_createElementBlock","_mergeProps","_unref","_createElementVNode","_renderSlot","_sfc_main","_hoisted_1","_useSlots","_openBlock","_createElementBlock","_normalizeClass","_unref","_createBlock","AkIcon","_Fragment","_createCommentVNode","_renderSlot","_sfc_main","_useModel","_useSlots","AkRadioButton","_openBlock","_createBlock","_sfc_main","$slots","_hoisted_1","_hoisted_2","_hoisted_3","_useModel","_useSlots","_openBlock","_createElementBlock","_mergeProps","_unref","_withDirectives","_createElementVNode","_vModelCheckbox","_renderSlot","_createCommentVNode","_sfc_main","_hoisted_1","_useModel","_withDirectives","_openBlock","_createElementBlock","_mergeProps","_unref","_vModelText","_sfc_main","_hoisted_1","_hoisted_2","_useModel","_openBlock","_createElementBlock","_mergeProps","_unref","_createVNode","AkIcon","_withDirectives","_createElementVNode","_withKeys","_vModelText","_toDisplayString","_createCommentVNode","_sfc_main","_hoisted_1","_openBlock","_createElementBlock","_renderSlot","_sfc_main","_hoisted_1","_hoisted_2","_openBlock","_createElementBlock","_normalizeClass","_Fragment","_renderList","_sfc_main","_hoisted_1","_hoisted_2","_openBlock","_createElementBlock","_normalizeClass","_createElementVNode","_sfc_main","_hoisted_1","_hoisted_2","_hoisted_3","_openBlock","_createElementBlock","_renderSlot","_createBlock","AkProfession","_createCommentVNode","_toDisplayString","_Fragment","_createTextVNode","_sfc_main","$slots","_hoisted_1","_openBlock","_createElementBlock","_normalizeClass","_createElementVNode","_renderSlot","_createTextVNode","_toDisplayString","_sfc_main","_hoisted_1","_openBlock","_createElementBlock","_normalizeClass","_createElementVNode","_sfc_main","_hoisted_1","_openBlock","_createElementBlock","_normalizeClass","_createElementVNode","_sfc_main","_hoisted_1","_openBlock","_createElementBlock","_normalizeClass","_createElementVNode","_toDisplayString","_sfc_main","_hoisted_1","_hoisted_2","_hoisted_3","_useModel","_openBlock","_createElementBlock","_Fragment","_renderList","_normalizeClass","_createCommentVNode","_createTextVNode","_toDisplayString","_sfc_main","_hoisted_1","_hoisted_2","_openBlock","_createElementBlock","_toDisplayString","_createCommentVNode","_createTextVNode","_sfc_main","_hoisted_1","props","_openBlock","_createElementBlock","_renderSlot","_sfc_main","_hoisted_1","_hoisted_2","_hoisted_3","_openBlock","_createElementBlock","_normalizeClass","_createVNode","AkPotential","_createElementVNode","_toDisplayString","_renderSlot","_createCommentVNode","_sfc_main","$slots","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_openBlock","_createBlock","_resolveDynamicComponent","_normalizeClass","_withCtx","_createElementVNode","_createElementBlock","AkRarity","_createCommentVNode","_renderSlot","_createTextVNode","_toDisplayString","_sfc_main","_hoisted_1","_openBlock","_createElementBlock","_renderSlot","$slots","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_openBlock","_createBlock","_resolveDynamicComponent","_withCtx","_createElementVNode","_toDisplayString","_createElementBlock","AkRarity","_createCommentVNode","_renderSlot","_createTextVNode","_sfc_main","_useSlots","_openBlock","_createBlock","_resolveDynamicComponent","_normalizeClass","_withCtx","_renderSlot","_sfc_main","_hoisted_1","_openBlock","_createElementBlock","_normalizeClass","_unref","_renderSlot","_createTextVNode","_toDisplayString","_sfc_main","_hoisted_1","_openBlock","_createElementBlock","_normalizeClass","_unref","_renderSlot","_createTextVNode","_toDisplayString","_sfc_main","_hoisted_1","_hoisted_2","_openBlock","_createElementBlock","_normalizeClass","_unref","_renderSlot","_createElementVNode","_toDisplayString","_createTextVNode","_sfc_main","$slots","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","_useSlots","_openBlock","_createElementBlock","_normalizeClass","_createElementVNode","_createCommentVNode","_createBlock","_resolveDynamicComponent","_withCtx","_createTextVNode","_toDisplayString","_renderSlot","_createVNode","AkSp","AkSpTrigger","AkSpValue","_sfc_main","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_openBlock","_createElementBlock","_Fragment","_createTextVNode","_toDisplayString","_createElementVNode","_createCommentVNode","_sfc_main","_hoisted_1","_hoisted_2","_useModel","_openBlock","_createElementBlock","_Fragment","_renderList","_normalizeClass","_createVNode","LevelLabel","_sfc_main","$slots","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_openBlock","_createElementBlock","_renderSlot","_createElementVNode","_createVNode","AkSpValue","_withCtx","_createTextVNode","_Fragment","_renderList","_normalizeClass","LevelLabel","AkRichText","_toDisplayString","_createCommentVNode","_sfc_main","$slots","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_useModel","_openBlock","_createElementBlock","_renderSlot","_createVNode","AkRichText","_withCtx","_createElementVNode","_toDisplayString","_createCommentVNode","_Fragment","_renderList","_normalizeClass","LevelLabel","_createBlock","AkSpValue","_createTextVNode","_sfc_main","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","_hoisted_15","_useModel","_openBlock","_createElementBlock","_normalizeClass","_createElementVNode","_toDisplayString","_createTextVNode","_withDirectives","_vModelCheckbox","_createCommentVNode","_Fragment","_renderList","_renderSlot","_createVNode","AkRichText","_sfc_main","_hoisted_1","_openBlock","_createElementBlock","_normalizeClass","_sfc_main","$slots","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_openBlock","_createElementBlock","_createElementVNode","_createTextVNode","_toDisplayString","_Fragment","_renderList","_createCommentVNode","_renderSlot","_sfc_main","_hoisted_1","_openBlock","_createElementBlock","_renderSlot","_sfc_main","_hoisted_1","_hoisted_2","_openBlock","_createElementBlock","_Fragment","_createElementVNode","_renderSlot","_createTextVNode","_toDisplayString","_sfc_main","_hoisted_1","_openBlock","_createElementBlock","_renderSlot","_sfc_main","_openBlock","_createElementBlock","_normalizeClass","_renderSlot","_sfc_main","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_openBlock","_createElementBlock","_normalizeClass","_createElementVNode","_createTextVNode","_toDisplayString","_createCommentVNode","_renderSlot","_sfc_main","props","_openBlock","_createElementBlock","_normalizeClass","_renderSlot","_sfc_main","_hoisted_1","_unref","_openBlock","_createElementBlock","_createElementVNode","_renderSlot","_createTextVNode","_toDisplayString","_Fragment","_sfc_main","_hoisted_1","_openBlock","_createElementBlock","_normalizeClass","_normalizeStyle","_Fragment","_renderList","_sfc_main","$slots","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_useModel","_useSlots","_openBlock","_createElementBlock","_createElementVNode","_createCommentVNode","_normalizeClass","_createTextVNode","_toDisplayString","_renderSlot","_unref","_withDirectives","_vModelCheckbox","_Fragment","_renderList","_sfc_main","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_openBlock","_createElementBlock","_createElementVNode","_createTextVNode","_toDisplayString","_Fragment","_renderList","_normalizeClass","_createCommentVNode","_renderSlot","_sfc_main","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_openBlock","_createElementBlock","_createElementVNode","_createTextVNode","_toDisplayString","_Fragment","_renderList","_normalizeClass","_renderSlot","_sfc_main","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_useModel","_openBlock","_createElementBlock","_unref","_createElementVNode","_Fragment","_renderList","_normalizeClass","_toDisplayString","_createCommentVNode","_createTextVNode","_renderSlot","_sfc_main","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_openBlock","_createElementBlock","_createElementVNode","_normalizeClass","_createVNode","AkIcon","_createCommentVNode","_createTextVNode","_toDisplayString","_Fragment","_renderList","_unref","_sfc_main","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_openBlock","_createElementBlock","_normalizeClass","_createElementVNode","_createTextVNode","_toDisplayString","_createCommentVNode","_renderSlot","_sfc_main","_hoisted_1","_useModel","_openBlock","_createElementBlock","_normalizeClass","_withKeys","_withModifiers","_renderSlot","_sfc_main","$slots","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_openBlock","_createElementBlock","_createElementVNode","_toDisplayString","_createCommentVNode","_renderSlot","_createTextVNode","_sfc_main","_openBlock","_createBlock","_resolveDynamicComponent","_withCtx","_createElementVNode","_renderSlot","_sfc_main","_hoisted_1","_openBlock","_createElementBlock","_renderSlot","_sfc_main","_useSlots","_openBlock","_createElementBlock","_Fragment","_createElementVNode","_normalizeClass","_renderSlot","_createTextVNode","_toDisplayString","_sfc_main","_hoisted_1","_openBlock","_createElementBlock","_createElementVNode","_createTextVNode","_toDisplayString","_sfc_main","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_useSlots","_openBlock","_createBlock","_resolveDynamicComponent","_normalizeClass","_withCtx","_createElementVNode","_createTextVNode","_toDisplayString","_createElementBlock","_createCommentVNode","_createVNode","AkSanity","_renderSlot","_sfc_main","_openBlock","_createBlock","_resolveDynamicComponent","_normalizeClass","_withCtx","_renderSlot","_sfc_main","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_openBlock","_createElementBlock","_normalizeClass","_createElementVNode","_toDisplayString","_Fragment","_renderList","_createCommentVNode","_renderSlot","_sfc_main","_hoisted_1","_hoisted_2","_openBlock","_createElementBlock","_normalizeClass","_createElementVNode","_Fragment","_createTextVNode","_toDisplayString","_createCommentVNode","_sfc_main","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_openBlock","_createElementBlock","_normalizeClass","_renderSlot","_createCommentVNode","_createElementVNode","_toDisplayString","_createTextVNode","_sfc_main","_hoisted_1","_openBlock","_createElementBlock","_Fragment","_renderList","_createElementVNode","_toDisplayString","_createCommentVNode","_sfc_main","_hoisted_1","_hoisted_2","_hoisted_3","_openBlock","_createElementBlock","_createElementVNode","_renderSlot","_createTextVNode","_toDisplayString","_sfc_main","$slots","_openBlock","_createElementBlock","_toDisplayString","_createCommentVNode","_createElementVNode","_renderSlot","_createTextVNode","_sfc_main"],"sources":["../src/icons.ts","../src/components/Scope/AkScope.vue","../src/components/Scope/AkScope.vue","../src/components/Icon/AkIcon.vue","../src/components/Icon/AkIcon.vue","../src/components/Button/context.ts","../src/components/Button/AkButton.vue","../src/components/Button/AkButton.vue","../src/components/Button/AkButtonGroup.vue","../src/components/Button/AkButtonGroup.vue","../src/components/Tag/AkTag.vue","../src/components/Tag/AkTag.vue","../src/components/Cbox/AkCbox.vue","../src/components/Cbox/AkCbox.vue","../src/components/Tabs/AkTab.vue","../src/components/Tabs/AkTab.vue","../src/components/Tabs/AkTabPane.vue","../src/components/Tabs/AkTabPane.vue","../src/components/Tabs/AkTabs.vue","../src/components/Tabs/AkTabs.vue","../src/components/Item/context.ts","../src/components/Item/AkItem.vue","../src/components/Item/AkItem.vue","../src/components/Item/AkItemList.vue","../src/components/Item/AkItemList.vue","../src/components/Chip/AkChip.vue","../src/components/Chip/AkChip.vue","../src/components/Badge/AkBadge.vue","../src/components/Badge/AkBadge.vue","../src/components/Card/AkCard.vue","../src/components/Card/AkCard.vue","../src/components/Card/AkCardGrid.vue","../src/components/Panel/AkPanel.vue","../src/components/Panel/AkPanel.vue","../src/components/Heading/AkHeading.vue","../src/components/Heading/AkHeading.vue","../src/components/Divider/AkDivider.vue","../src/components/Divider/AkDivider.vue","../src/components/Avatar/context.ts","../src/components/Avatar/AkAvatar.vue","../src/components/Avatar/AkAvatar.vue","../src/components/Avatar/AkAvatarGroup.vue","../src/components/Avatar/AkAvatarGroup.vue","../src/components/Empty/AkEmpty.vue","../src/components/Empty/AkEmpty.vue","../src/components/Skeleton/AkSkeleton.vue","../src/components/Skeleton/AkSkeleton.vue","../src/components/Spinner/AkSpinner.vue","../src/components/Spinner/AkSpinner.vue","../src/components/Message/AkMessage.vue","../src/components/Message/AkMessage.vue","../src/components/Tooltip/trigger.ts","../src/components/Tooltip/usePopover.ts","../src/components/Tooltip/AkTooltip.vue","../src/components/Tooltip/AkTooltip.vue","../src/components/Tooltip/AkPopover.vue","../src/components/Tooltip/AkPopover.vue","../src/components/Dropdown/MenuItem.vue","../src/components/Dropdown/MenuItem.vue","../src/components/Dropdown/AkDropdown.vue","../src/components/Dropdown/AkDropdown.vue","../src/components/Dialog/AkDialog.vue","../src/components/Dialog/AkDialog.vue","../src/components/Toast/useToast.ts","../src/components/Toast/AkToastProvider.vue","../src/components/Toast/AkToastProvider.vue","../src/components/Progress/AkProgress.vue","../src/components/Progress/AkProgress.vue","../src/components/Stat/AkStat.vue","../src/components/Stat/AkStat.vue","../src/components/Stat/AkStatRow.vue","../src/components/Stat/AkStatRow.vue","../src/components/Breadcrumb/AkBreadcrumbItem.vue","../src/components/Breadcrumb/AkBreadcrumbItem.vue","../src/components/Breadcrumb/AkBreadcrumb.vue","../src/components/Breadcrumb/AkBreadcrumb.vue","../src/components/Pagination/AkPagination.vue","../src/components/Pagination/AkPagination.vue","../src/components/Timeline/AkTimeline.vue","../src/components/Timeline/AkTimeline.vue","../src/components/Timeline/AkTimelineItem.vue","../src/components/Timeline/AkTimelineItem.vue","../src/components/Stepper/AkStep.vue","../src/components/Stepper/AkStep.vue","../src/components/Stepper/AkSteps.vue","../src/components/Stepper/AkSteps.vue","../src/components/Accordion/context.ts","../src/components/Accordion/AkCollapse.vue","../src/components/Accordion/AkCollapse.vue","../src/components/Accordion/AkCollapseItem.vue","../src/components/Accordion/AkCollapseItem.vue","../src/components/Table/AkDataTable.vue","../src/components/Table/AkDataTable.vue","../src/components/Fab/AkBackTop.vue","../src/components/Fab/AkBackTop.vue","../src/components/Field/context.ts","../src/components/Field/AkField.vue","../src/components/Field/AkField.vue","../src/components/Input/context.ts","../src/components/Input/AkInput.vue","../src/components/Input/AkInput.vue","../src/components/Input/AkInputGroup.vue","../src/components/Input/AkInputGroup.vue","../src/components/InputNumber/AkInputNumber.vue","../src/components/InputNumber/AkInputNumber.vue","../src/components/Select/AkSelect.vue","../src/components/Select/AkSelect.vue","../src/components/Checkbox/context.ts","../src/components/Checkbox/AkCheckbox.vue","../src/components/Checkbox/AkCheckbox.vue","../src/components/Checkbox/AkCheckboxGroup.vue","../src/components/Checkbox/AkCheckboxGroup.vue","../src/components/Radio/context.ts","../src/components/Radio/AkRadio.vue","../src/components/Radio/AkRadio.vue","../src/components/Radio/AkRadioButton.vue","../src/components/Radio/AkRadioButton.vue","../src/components/Radio/AkRadioGroup.vue","../src/components/Radio/AkRadioGroup.vue","../src/components/Switch/AkSwitch.vue","../src/components/Switch/AkSwitch.vue","../src/components/Slider/AkSlider.vue","../src/components/Slider/AkSlider.vue","../src/components/Search/AkSearch.vue","../src/components/Search/AkSearch.vue","../src/components/Kbd/AkKbd.vue","../src/components/Kbd/AkKbd.vue","../src/components/Rarity/AkRarity.vue","../src/components/Rarity/AkRarity.vue","../src/components/Profession/AkProfession.vue","../src/components/Profession/AkProfession.vue","../src/components/Profession/AkProfessionLabel.vue","../src/components/Profession/AkProfessionLabel.vue","../src/components/Elite/AkElite.vue","../src/components/Elite/AkElite.vue","../src/components/Potential/AkPotential.vue","../src/components/Potential/AkPotential.vue","../src/components/Potential/AkSpecialization.vue","../src/components/Potential/AkSpecialization.vue","../src/components/Level/AkLevel.vue","../src/components/Level/AkLevel.vue","../src/components/PhaseTabs/AkPhaseTabs.vue","../src/components/PhaseTabs/AkPhaseTabs.vue","../src/components/Trust/AkTrust.vue","../src/components/Trust/AkTrust.vue","../src/components/PotList/context.ts","../src/components/PotList/AkPotList.vue","../src/components/PotList/AkPotList.vue","../src/components/PotList/AkPot.vue","../src/components/PotList/AkPot.vue","../src/components/OpCard/AkOpCard.vue","../src/components/OpCard/AkOpCard.vue","../src/components/OpCard/AkOpGrid.vue","../src/components/OpRow/AkOpRow.vue","../src/components/OpRow/AkOpRow.vue","../src/components/RichText/parse.ts","../src/components/RichText/AkRichText.vue","../src/components/RichText/AkRichText.vue","../src/components/Sp/sp.ts","../src/components/Sp/AkSp.vue","../src/components/Sp/AkSp.vue","../src/components/Sp/AkSpTrigger.vue","../src/components/Sp/AkSpTrigger.vue","../src/components/Sp/AkSpValue.vue","../src/components/Sp/AkSpValue.vue","../src/components/Skill/AkSkill.vue","../src/components/Skill/AkSkill.vue","../src/components/Skill/LevelLabel.vue","../src/components/Skill/LevelLabel.vue","../src/components/SkillLevels/AkSkillLevels.vue","../src/components/SkillLevels/AkSkillLevels.vue","../src/components/SkillSheet/AkSkillSheet.vue","../src/components/SkillSheet/AkSkillSheet.vue","../src/components/SkillMatrix/AkSkillMatrix.vue","../src/components/SkillMatrix/AkSkillMatrix.vue","../src/components/TalentTable/AkTalentTable.vue","../src/components/TalentTable/AkTalentTable.vue","../src/components/TalentTable/AkCalc.vue","../src/components/TalentTable/AkCalc.vue","../src/components/Talent/AkTalent.vue","../src/components/Talent/AkTalent.vue","../src/components/Materials/AkMaterials.vue","../src/components/Materials/AkMaterials.vue","../src/components/Materials/AkMaterialsRow.vue","../src/components/Materials/AkMaterialsRow.vue","../src/components/Materials/AkMaterialsDivider.vue","../src/components/Materials/AkMaterialsDivider.vue","../src/components/Attrs/AkAttrs.vue","../src/components/Attrs/AkAttrs.vue","../src/components/Attrs/AkAttr.vue","../src/components/Attrs/AkAttr.vue","../src/components/Kv/context.ts","../src/components/Kv/AkKv.vue","../src/components/Kv/AkKv.vue","../src/components/Kv/AkKvItem.vue","../src/components/Kv/AkKvItem.vue","../src/components/Range/AkRange.vue","../src/components/Range/AkRange.vue","../src/components/Module/AkModule.vue","../src/components/Module/AkModule.vue","../src/components/Module/AkModuleStage.vue","../src/components/Module/AkModuleStage.vue","../src/components/Module/AkModuleUnlock.vue","../src/components/Module/AkModuleUnlock.vue","../src/components/Voice/context.ts","../src/components/Voice/AkVoiceList.vue","../src/components/Voice/AkVoiceList.vue","../src/components/Voice/player.ts","../src/components/Voice/AkVoice.vue","../src/components/Voice/AkVoice.vue","../src/components/Dossier/AkDossier.vue","../src/components/Dossier/AkDossier.vue","../src/components/Dossier/AkRedacted.vue","../src/components/Dossier/AkRedacted.vue","../src/components/Archive/AkArchive.vue","../src/components/Archive/AkArchive.vue","../src/components/Archive/AkArchivePlay.vue","../src/components/Archive/AkArchivePlay.vue","../src/components/Dialogue/AkDialogue.vue","../src/components/Dialogue/AkDialogue.vue","../src/components/Dialogue/AkDialogueLine.vue","../src/components/Dialogue/AkDialogueLine.vue","../src/components/Stage/AkSanity.vue","../src/components/Stage/AkSanity.vue","../src/components/Stage/AkStage.vue","../src/components/Stage/AkStage.vue","../src/components/Stage/AkStageCode.vue","../src/components/Stage/AkStageCode.vue","../src/components/Enemy/AkEnemy.vue","../src/components/Enemy/AkEnemy.vue","../src/components/Camp/AkCamp.vue","../src/components/Camp/AkCamp.vue","../src/components/Event/AkEvent.vue","../src/components/Event/AkEvent.vue","../src/components/Event/AkCountdown.vue","../src/components/Event/AkCountdown.vue","../src/components/News/AkNews.vue","../src/components/News/AkNews.vue","../src/components/Hero/AkHero.vue","../src/components/Hero/AkHero.vue"],"sourcesContent":["/**\n * PRTS Design 线稿图标(24×24,stroke / fill 用 currentColor)——与预览骨架 preview/_src/skeleton.html 的 SVG sprite 同一套路径。\n * Vue 组件内联渲染(<AkIcon name=\"search\" />),不依赖页面里有没有 sprite;MW 皮肤 / 模板那边仍走 <svg><use href=\"#i-…\"></svg>。\n */\nexport const icons = {\n \"menu\": \"<path fill=\\\"currentColor\\\" d=\\\"M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z\\\"/>\",\n \"search\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" d=\\\"M10.5 3a7.5 7.5 0 1 1 0 15 7.5 7.5 0 0 1 0-15zM16 16l5 5\\\"/>\",\n \"bell\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" d=\\\"M6 17V11a6 6 0 1 1 12 0v6l2 2H4l2-2zm4 4h4\\\"/>\",\n \"user\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" d=\\\"M12 12a4 4 0 1 0 0-8 4 4 0 0 0 0 8zm-8 9c0-4 3.6-6 8-6s8 2 8 6\\\"/>\",\n \"sun\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" d=\\\"M12 8a4 4 0 1 0 0 8 4 4 0 0 0 0-8zm0-6v3m0 14v3M2 12h3m14 0h3M4.9 4.9l2.1 2.1m10 10 2.1 2.1M4.9 19.1 7 17m10-10 2.1-2.1\\\"/>\",\n \"moon\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" d=\\\"M20 14.5A8 8 0 0 1 9.5 4a8 8 0 1 0 10.5 10.5z\\\"/>\",\n \"monitor\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" d=\\\"M3 4h18v12H3zm5 16h8m-4-4v4\\\"/>\",\n \"edit\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" d=\\\"M4 20h4l11-11-4-4L4 16v4zM13 7l4 4\\\"/>\",\n \"history\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" d=\\\"M3 12a9 9 0 1 0 3-6.7M3 4v5h5m4-1v5l3 2\\\"/>\",\n \"book\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" d=\\\"M4 4h7a3 3 0 0 1 3 3v13a2 2 0 0 0-2-2H4zm16 0h-7a3 3 0 0 0-3 3v13a2 2 0 0 1 2-2h8z\\\"/>\",\n \"talk\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" d=\\\"M4 5h16v11H9l-5 4z\\\"/>\",\n \"more\": \"<path fill=\\\"currentColor\\\" d=\\\"M5 10a2 2 0 1 1 0 4 2 2 0 0 1 0-4zm7 0a2 2 0 1 1 0 4 2 2 0 0 1 0-4zm7 0a2 2 0 1 1 0 4 2 2 0 0 1 0-4z\\\"/>\",\n \"star\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linejoin=\\\"round\\\" d=\\\"M12 3.5l2.6 5.6 6.1.7-4.5 4.2 1.2 6-5.4-3-5.4 3 1.2-6L3.3 9.8l6.1-.7z\\\"/>\",\n \"link\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" d=\\\"M10 14a4 4 0 0 0 5.7 0l3-3a4 4 0 0 0-5.7-5.7l-1.5 1.5M14 10a4 4 0 0 0-5.7 0l-3 3a4 4 0 0 0 5.7 5.7l1.5-1.5\\\"/>\",\n \"linkin\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" d=\\\"M3 12h12m-4-4 4 4-4 4M18 4h3v16h-3\\\"/>\",\n \"arrow-ne\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2.5\\\" d=\\\"M7 17 17 7M9 7h8v8\\\"/>\",\n \"mic\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" d=\\\"M12 3a3 3 0 0 1 3 3v6a3 3 0 0 1-6 0V6a3 3 0 0 1 3-3zM6 11a6 6 0 0 0 12 0M12 17v4m-4 0h8\\\"/>\",\n \"list\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" d=\\\"M4 7h16M4 12h16M4 17h10\\\"/>\",\n \"print\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" d=\\\"M7 8V3h10v5M5 8h14a2 2 0 0 1 2 2v6h-4v-3H7v3H3v-6a2 2 0 0 1 2-2zm2 8v5h10v-5\\\"/>\",\n \"upload\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" d=\\\"M12 16V4m-5 5 5-5 5 5M4 20h16\\\"/>\",\n \"download\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" d=\\\"M12 4v12m-5-5 5 5 5-5M4 20h16\\\"/>\",\n \"grid\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" d=\\\"M4 4h6v6H4zm10 0h6v6h-6zM4 14h6v6H4zm10 0h6v6h-6z\\\"/>\",\n \"refresh\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" d=\\\"M20 12a8 8 0 1 1-2.3-5.7M20 4v5h-5\\\"/>\",\n \"quote\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" d=\\\"M6 16h3l2-4V7H5v5h3zm9 0h3l2-4V7h-6v5h3z\\\"/>\",\n \"table\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" d=\\\"M3 5h18v14H3zm0 5h18M3 14h18M9 5v14\\\"/>\",\n \"source\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" d=\\\"M8 4H5v16h3M16 4h3v16h-3M10 8l-2 4 2 4m4-8 2 4-2 4\\\"/>\",\n \"move\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" d=\\\"M12 2v20M2 12h20M9 5l3-3 3 3M9 19l3 3 3-3M5 9 2 12l3 3m14-6 3 3-3 3\\\"/>\",\n \"lock\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" d=\\\"M7 11V8a5 5 0 0 1 10 0v3M4 11h16v10H4z\\\"/>\",\n \"trash\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" d=\\\"M4 7h16M9 7V4h6v3m-8 0 1 13h8l1-13M10 11v6m4-6v6\\\"/>\",\n \"lang\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" d=\\\"M3 5h10M8 3v2m3 0c-1 4-3.5 7-7 9m1-6c1 3 3 5 6 6M13 21l4-10 4 10m-6.5-3h5\\\"/>\",\n \"gear\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" d=\\\"M12 9a3 3 0 1 0 0 6 3 3 0 0 0 0-6zm-2-6h4l.6 2.4 2.1 1.2 2.4-.7 2 3.4-1.8 1.7v2.4l1.8 1.7-2 3.4-2.4-.7-2.1 1.2L14 21h-4l-.6-2.4-2.1-1.2-2.4.7-2-3.4 1.8-1.7v-2.4L2.9 8.9l2-3.4 2.4.7 2.1-1.2z\\\"/>\",\n \"watchlist\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" d=\\\"M3 6h12M3 11h8M3 16h6m8-4 1.3 2.7 3 .4-2.2 2.1.5 3-2.6-1.4-2.6 1.4.5-3-2.2-2.1 3-.4z\\\"/>\",\n \"contribs\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" d=\\\"M3 6h12M3 11h8M3 16h6m9-5a2.5 2.5 0 1 0 0-5 2.5 2.5 0 0 0 0 5zm-4.5 8c0-2.5 2-4 4.5-4s4.5 1.5 4.5 4\\\"/>\",\n \"logout\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" d=\\\"M10 4H4v16h6m4-12 5 4-5 4m5-4H9\\\"/>\",\n \"info\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" d=\\\"M12 3a9 9 0 1 1 0 18 9 9 0 0 1 0-18zm0 8v5m0-9v1\\\"/>\",\n \"warn\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" d=\\\"M12 3l10 18H2zm0 7v5m0 3v1\\\"/>\",\n \"check\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2.5\\\" d=\\\"M4 12l5 5L20 6\\\"/>\",\n \"x\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2.5\\\" d=\\\"M5 5l14 14M19 5L5 19\\\"/>\",\n \"up\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2.5\\\" d=\\\"M5 15l7-7 7 7\\\"/>\",\n \"chevron-left\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2.5\\\" d=\\\"M15 5l-7 7 7 7\\\"/>\",\n \"chevron-right\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2.5\\\" d=\\\"M9 5l7 7-7 7\\\"/>\",\n \"play\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linejoin=\\\"round\\\" d=\\\"M7 4v16l12-8z\\\"/>\",\n \"pause\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" d=\\\"M6 4h4v16H6zm8 0h4v16h-4z\\\"/>\",\n \"empty\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"1.5\\\" d=\\\"M3 7l9-4 9 4v10l-9 4-9-4zm9 4 9-4M12 11 3 7m9 4v10\\\"/>\",\n} as const;\n\nexport type IconName = keyof typeof icons;\n","<script setup lang=\"ts\">\n/**\n * 作用域根:组件的排版基线(字体 / 字号 / 行高 / 前景色)挂在这一层,不靠宿主页面的 body 继承——prts.wiki 上别的皮肤(Vector 2022 …)、\n * 站外页面里,widget 的根节点包一层,就和 Arknights 皮肤上看起来一样;theme 让这一块局部走终端(暗)/ 档案(亮)配色。\n * Arknights 皮肤上 body.skin-arknights 本身就是作用域,包不包都一样。样式在 CSS 实现的 scope.css(= class=\"ak-scope\")。\n */\nwithDefaults(\n defineProps<{\n /** 局部主题:dark 终端 · light 档案(连画布底色一起换);不传 = 跟随宿主页面(html 上的 clientpref 类 / data-theme,都没有就跟随系统) */\n theme?: \"light\" | \"dark\";\n /** 根元素标签 */\n tag?: string;\n }>(),\n { theme: undefined, tag: \"div\" },\n);\n\ndefineSlots<{\n /** 作用域里的内容:widget 的整棵组件树 */\n default?: () => unknown;\n}>();\n</script>\n\n<template>\n <component :is=\"tag\" class=\"ak-scope\" :data-theme=\"theme\"><slot /></component>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 作用域根:组件的排版基线(字体 / 字号 / 行高 / 前景色)挂在这一层,不靠宿主页面的 body 继承——prts.wiki 上别的皮肤(Vector 2022 …)、\n * 站外页面里,widget 的根节点包一层,就和 Arknights 皮肤上看起来一样;theme 让这一块局部走终端(暗)/ 档案(亮)配色。\n * Arknights 皮肤上 body.skin-arknights 本身就是作用域,包不包都一样。样式在 CSS 实现的 scope.css(= class=\"ak-scope\")。\n */\nwithDefaults(\n defineProps<{\n /** 局部主题:dark 终端 · light 档案(连画布底色一起换);不传 = 跟随宿主页面(html 上的 clientpref 类 / data-theme,都没有就跟随系统) */\n theme?: \"light\" | \"dark\";\n /** 根元素标签 */\n tag?: string;\n }>(),\n { theme: undefined, tag: \"div\" },\n);\n\ndefineSlots<{\n /** 作用域里的内容:widget 的整棵组件树 */\n default?: () => unknown;\n}>();\n</script>\n\n<template>\n <component :is=\"tag\" class=\"ak-scope\" :data-theme=\"theme\"><slot /></component>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nimport { icons, type IconName } from \"../../icons\";\n\nconst props = withDefaults(\n defineProps<{\n /** 图标名(见 icons.ts,与皮肤 sprite 的 #i-* 同名) */\n name: IconName;\n /** 边长(px);不写则由外层 CSS 定(如 .ak-btn__icon 的 1.1em) */\n size?: number | string;\n /** 读屏文本;不写则 aria-hidden(纯装饰,旁边有文字) */\n label?: string;\n }>(),\n { size: undefined, label: undefined },\n);\n\nconst markup = computed(() => icons[props.name]);\n</script>\n\n<template>\n <svg\n class=\"ak-icon\"\n viewBox=\"0 0 24 24\"\n :width=\"size\"\n :height=\"size\"\n :role=\"label ? 'img' : undefined\"\n :aria-label=\"label\"\n :aria-hidden=\"label ? undefined : 'true'\"\n focusable=\"false\"\n v-html=\"markup\"\n />\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nimport { icons, type IconName } from \"../../icons\";\n\nconst props = withDefaults(\n defineProps<{\n /** 图标名(见 icons.ts,与皮肤 sprite 的 #i-* 同名) */\n name: IconName;\n /** 边长(px);不写则由外层 CSS 定(如 .ak-btn__icon 的 1.1em) */\n size?: number | string;\n /** 读屏文本;不写则 aria-hidden(纯装饰,旁边有文字) */\n label?: string;\n }>(),\n { size: undefined, label: undefined },\n);\n\nconst markup = computed(() => icons[props.name]);\n</script>\n\n<template>\n <svg\n class=\"ak-icon\"\n viewBox=\"0 0 24 24\"\n :width=\"size\"\n :height=\"size\"\n :role=\"label ? 'img' : undefined\"\n :aria-label=\"label\"\n :aria-hidden=\"label ? undefined : 'true'\"\n focusable=\"false\"\n v-html=\"markup\"\n />\n</template>\n","import type { InjectionKey } from \"vue\";\n\nexport type ButtonVariant = \"default\" | \"primary\" | \"contrast\" | \"outline\" | \"ghost\" | \"danger\" | \"link\";\nexport type ButtonSize = \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n\n/** AkButtonGroup 给组内 AkButton 的默认尺寸(同 Naive 的 NButtonGroup) */\nexport const buttonGroupKey: InjectionKey<{ size?: ButtonSize }> = Symbol(\"AkButtonGroup\");\n","<script setup lang=\"ts\">\nimport { computed, inject, warn } from \"vue\";\n\nimport type { IconName } from \"../../icons\";\nimport AkIcon from \"../Icon/AkIcon.vue\";\nimport { buttonGroupKey, type ButtonSize, type ButtonVariant } from \"./context\";\n\nconst props = withDefaults(\n defineProps<{\n /** 外观:primary = 主色实底(一处一枚)· contrast = 黑白反转(游戏内 btn_on)· outline 描边 · ghost 幽灵 · danger 危险 · link 链接样式 */\n variant?: ButtonVariant;\n /** 尺寸:xs 24 · sm 30 · md 36 · lg 44 · xl 56(px 高);不写时跟 AkButtonGroup,再不然是 md */\n size?: ButtonSize;\n /** 图标;没有文字(不写默认插槽)时是方形的图标按钮,这时 label 必填 */\n icon?: IconName;\n /** 图标在文字左边还是右边(同 Naive 的 icon-placement) */\n iconPlacement?: \"left\" | \"right\";\n /** 可访问名(aria-label;图标按钮同时作 title)——只有图标的按钮必填,有文字的一般不写 */\n label?: string;\n /** 占满容器宽度 */\n block?: boolean;\n /** 胶囊圆角(系统默认直角,只在确需时用) */\n pill?: boolean;\n /** 危险按钮叠斜纹(只配 variant=\"danger\") */\n stripes?: boolean;\n /** 加载中:文字隐去,居中转圈,不可点 */\n loading?: boolean;\n disabled?: boolean;\n /** 有 href 时渲染成 <a>(禁用时 aria-disabled) */\n href?: string;\n type?: \"button\" | \"submit\" | \"reset\";\n }>(),\n { variant: \"default\", size: undefined, icon: undefined, iconPlacement: \"left\", label: undefined, href: undefined, type: \"button\" },\n);\n\nconst slots = defineSlots<{\n /** 按钮文字;不写就是图标按钮 */\n default?: () => unknown;\n}>();\n\nconst group = inject(buttonGroupKey, null);\nconst size = computed(() => props.size ?? group?.size ?? \"md\");\nconst iconOnly = computed(() => !!props.icon && !slots.default);\nif (iconOnly.value && !props.label) warn(`AkButton:只有图标(${props.icon})的按钮要写 label,否则读屏只念「按钮」`);\n\n/** 图标按钮里的图标边长;有文字时由 .ak-btn__icon 的 1.1em 定 */\nconst ICON_PX: Record<ButtonSize, number> = { xs: 14, sm: 16, md: 18, lg: 20, xl: 24 };\n\nconst classes = computed(() => [\n \"ak-btn\",\n props.variant !== \"default\" && `ak-btn--${props.variant}`,\n size.value !== \"md\" && `ak-btn--${size.value}`,\n {\n \"ak-btn--icon\": iconOnly.value,\n \"ak-btn--block\": props.block,\n \"ak-btn--pill\": props.pill,\n \"ak-stripes\": props.stripes,\n \"is-loading\": props.loading,\n },\n]);\n</script>\n\n<template>\n <component\n :is=\"href ? 'a' : 'button'\"\n :class=\"classes\"\n :href=\"href && !disabled ? href : undefined\"\n :type=\"href ? undefined : type\"\n :disabled=\"href ? undefined : disabled\"\n :aria-disabled=\"(href && disabled) || undefined\"\n :aria-busy=\"loading || undefined\"\n :aria-label=\"label\"\n :title=\"iconOnly ? label : undefined\"\n >\n <AkIcon v-if=\"iconOnly\" :name=\"icon!\" :size=\"ICON_PX[size]\" />\n <template v-else>\n <AkIcon v-if=\"icon && iconPlacement === 'left'\" :name=\"icon\" class=\"ak-btn__icon\" />\n <slot />\n <AkIcon v-if=\"icon && iconPlacement === 'right'\" :name=\"icon\" class=\"ak-btn__icon\" />\n </template>\n </component>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, inject, warn } from \"vue\";\n\nimport type { IconName } from \"../../icons\";\nimport AkIcon from \"../Icon/AkIcon.vue\";\nimport { buttonGroupKey, type ButtonSize, type ButtonVariant } from \"./context\";\n\nconst props = withDefaults(\n defineProps<{\n /** 外观:primary = 主色实底(一处一枚)· contrast = 黑白反转(游戏内 btn_on)· outline 描边 · ghost 幽灵 · danger 危险 · link 链接样式 */\n variant?: ButtonVariant;\n /** 尺寸:xs 24 · sm 30 · md 36 · lg 44 · xl 56(px 高);不写时跟 AkButtonGroup,再不然是 md */\n size?: ButtonSize;\n /** 图标;没有文字(不写默认插槽)时是方形的图标按钮,这时 label 必填 */\n icon?: IconName;\n /** 图标在文字左边还是右边(同 Naive 的 icon-placement) */\n iconPlacement?: \"left\" | \"right\";\n /** 可访问名(aria-label;图标按钮同时作 title)——只有图标的按钮必填,有文字的一般不写 */\n label?: string;\n /** 占满容器宽度 */\n block?: boolean;\n /** 胶囊圆角(系统默认直角,只在确需时用) */\n pill?: boolean;\n /** 危险按钮叠斜纹(只配 variant=\"danger\") */\n stripes?: boolean;\n /** 加载中:文字隐去,居中转圈,不可点 */\n loading?: boolean;\n disabled?: boolean;\n /** 有 href 时渲染成 <a>(禁用时 aria-disabled) */\n href?: string;\n type?: \"button\" | \"submit\" | \"reset\";\n }>(),\n { variant: \"default\", size: undefined, icon: undefined, iconPlacement: \"left\", label: undefined, href: undefined, type: \"button\" },\n);\n\nconst slots = defineSlots<{\n /** 按钮文字;不写就是图标按钮 */\n default?: () => unknown;\n}>();\n\nconst group = inject(buttonGroupKey, null);\nconst size = computed(() => props.size ?? group?.size ?? \"md\");\nconst iconOnly = computed(() => !!props.icon && !slots.default);\nif (iconOnly.value && !props.label) warn(`AkButton:只有图标(${props.icon})的按钮要写 label,否则读屏只念「按钮」`);\n\n/** 图标按钮里的图标边长;有文字时由 .ak-btn__icon 的 1.1em 定 */\nconst ICON_PX: Record<ButtonSize, number> = { xs: 14, sm: 16, md: 18, lg: 20, xl: 24 };\n\nconst classes = computed(() => [\n \"ak-btn\",\n props.variant !== \"default\" && `ak-btn--${props.variant}`,\n size.value !== \"md\" && `ak-btn--${size.value}`,\n {\n \"ak-btn--icon\": iconOnly.value,\n \"ak-btn--block\": props.block,\n \"ak-btn--pill\": props.pill,\n \"ak-stripes\": props.stripes,\n \"is-loading\": props.loading,\n },\n]);\n</script>\n\n<template>\n <component\n :is=\"href ? 'a' : 'button'\"\n :class=\"classes\"\n :href=\"href && !disabled ? href : undefined\"\n :type=\"href ? undefined : type\"\n :disabled=\"href ? undefined : disabled\"\n :aria-disabled=\"(href && disabled) || undefined\"\n :aria-busy=\"loading || undefined\"\n :aria-label=\"label\"\n :title=\"iconOnly ? label : undefined\"\n >\n <AkIcon v-if=\"iconOnly\" :name=\"icon!\" :size=\"ICON_PX[size]\" />\n <template v-else>\n <AkIcon v-if=\"icon && iconPlacement === 'left'\" :name=\"icon\" class=\"ak-btn__icon\" />\n <slot />\n <AkIcon v-if=\"icon && iconPlacement === 'right'\" :name=\"icon\" class=\"ak-btn__icon\" />\n </template>\n </component>\n</template>\n","<script setup lang=\"ts\">\nimport { provide } from \"vue\";\n\nimport { buttonGroupKey, type ButtonSize } from \"./context\";\n\n/** 一排贴在一起的按钮(同 Naive 的 NButtonGroup,纯容器);多选一的分段控件用单选组,不用它 */\nconst props = defineProps<{\n /** 组内按钮的默认尺寸(按钮自己写了 size 以按钮为准) */\n size?: ButtonSize;\n /** 读屏用的组名:一组有意义的动作时写 */\n label?: string;\n}>();\n\ndefineSlots<{\n /** 若干 AkButton */\n default?: () => unknown;\n}>();\n\nprovide(buttonGroupKey, props);\n</script>\n\n<template>\n <!-- data-no-toggle:皮肤脚本会给模板输出的 .ak-btn-group 里被点的 .ak-btn 翻 is-active(分段控件的演示态),这里是一组普通按钮,退出那层委托 -->\n <div class=\"ak-btn-group\" role=\"group\" :aria-label=\"label\" data-no-toggle><slot /></div>\n</template>\n","<script setup lang=\"ts\">\nimport { provide } from \"vue\";\n\nimport { buttonGroupKey, type ButtonSize } from \"./context\";\n\n/** 一排贴在一起的按钮(同 Naive 的 NButtonGroup,纯容器);多选一的分段控件用单选组,不用它 */\nconst props = defineProps<{\n /** 组内按钮的默认尺寸(按钮自己写了 size 以按钮为准) */\n size?: ButtonSize;\n /** 读屏用的组名:一组有意义的动作时写 */\n label?: string;\n}>();\n\ndefineSlots<{\n /** 若干 AkButton */\n default?: () => unknown;\n}>();\n\nprovide(buttonGroupKey, props);\n</script>\n\n<template>\n <!-- data-no-toggle:皮肤脚本会给模板输出的 .ak-btn-group 里被点的 .ak-btn 翻 is-active(分段控件的演示态),这里是一组普通按钮,退出那层委托 -->\n <div class=\"ak-btn-group\" role=\"group\" :aria-label=\"label\" data-no-toggle><slot /></div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, useId } from \"vue\";\n\nexport type TagVariant =\n | \"default\"\n | \"outline\"\n | \"accent\"\n | \"accent-soft\"\n | \"yellow\"\n | \"info\"\n | \"success\"\n | \"warning\"\n | \"danger\"\n | \"danger-solid\"\n | \"new\"\n | \"inverse\";\n\nconst props = withDefaults(\n defineProps<{\n /** 外观:状态色走 info / success / warning / danger(淡底色字);new = 红底 NEW 角标;danger-solid = BREAKING 红;yellow 次强调 */\n variant?: TagVariant;\n /** 尺寸:sm 18 · md 22 · lg 28(px 高) */\n size?: \"sm\" | \"md\" | \"lg\";\n /** 标签字(Bender 大写 + 字距),给版本号 / 状态码这类拉丁短词 */\n caps?: boolean;\n /** 前置小方点 */\n dot?: boolean;\n /** 显示移除按钮,点击触发 remove(读屏名是「移除 + 标签文字」) */\n removable?: boolean;\n }>(),\n { variant: \"default\", size: \"md\" },\n);\n\nconst emit = defineEmits<{\n /** 点了移除按钮 */\n remove: [];\n}>();\n\nconst classes = computed(() => [\n \"ak-tag\",\n props.variant !== \"default\" && `ak-tag--${props.variant}`,\n props.size !== \"md\" && `ak-tag--${props.size}`,\n { \"ak-tag--label\": props.caps },\n]);\n\nconst id = useId();\n</script>\n\n<template>\n <span :class=\"classes\">\n <span v-if=\"dot\" class=\"ak-tag__dot\" aria-hidden=\"true\" />\n <span v-if=\"removable\" :id=\"`${id}-text`\"><slot /></span>\n <slot v-else />\n <button\n v-if=\"removable\"\n :id=\"`${id}-remove`\"\n type=\"button\"\n class=\"ak-tag__remove\"\n aria-label=\"移除\"\n :aria-labelledby=\"`${id}-remove ${id}-text`\"\n @click=\"emit('remove')\"\n >\n ✕\n </button>\n </span>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, useId } from \"vue\";\n\nexport type TagVariant =\n | \"default\"\n | \"outline\"\n | \"accent\"\n | \"accent-soft\"\n | \"yellow\"\n | \"info\"\n | \"success\"\n | \"warning\"\n | \"danger\"\n | \"danger-solid\"\n | \"new\"\n | \"inverse\";\n\nconst props = withDefaults(\n defineProps<{\n /** 外观:状态色走 info / success / warning / danger(淡底色字);new = 红底 NEW 角标;danger-solid = BREAKING 红;yellow 次强调 */\n variant?: TagVariant;\n /** 尺寸:sm 18 · md 22 · lg 28(px 高) */\n size?: \"sm\" | \"md\" | \"lg\";\n /** 标签字(Bender 大写 + 字距),给版本号 / 状态码这类拉丁短词 */\n caps?: boolean;\n /** 前置小方点 */\n dot?: boolean;\n /** 显示移除按钮,点击触发 remove(读屏名是「移除 + 标签文字」) */\n removable?: boolean;\n }>(),\n { variant: \"default\", size: \"md\" },\n);\n\nconst emit = defineEmits<{\n /** 点了移除按钮 */\n remove: [];\n}>();\n\nconst classes = computed(() => [\n \"ak-tag\",\n props.variant !== \"default\" && `ak-tag--${props.variant}`,\n props.size !== \"md\" && `ak-tag--${props.size}`,\n { \"ak-tag--label\": props.caps },\n]);\n\nconst id = useId();\n</script>\n\n<template>\n <span :class=\"classes\">\n <span v-if=\"dot\" class=\"ak-tag__dot\" aria-hidden=\"true\" />\n <span v-if=\"removable\" :id=\"`${id}-text`\"><slot /></span>\n <slot v-else />\n <button\n v-if=\"removable\"\n :id=\"`${id}-remove`\"\n type=\"button\"\n class=\"ak-tag__remove\"\n aria-label=\"移除\"\n :aria-labelledby=\"`${id}-remove ${id}-text`\"\n @click=\"emit('remove')\"\n >\n ✕\n </button>\n </span>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nimport type { IconName } from \"../../icons\";\nimport AkIcon from \"../Icon/AkIcon.vue\";\n\nexport type CboxLevel = \"tip\" | \"info\" | \"warning\" | \"danger\" | \"neutral\";\n\nconst props = withDefaults(\n defineProps<{\n /** 等级(= 现网 {{Cbox2}} 的 lv):tip = lv0 绿「另见 / 提示」· info = lv1 蓝(默认)· warning = lv2 / lv3 · danger = lv4 · neutral 灰 */\n level?: CboxLevel;\n /** 加粗的标题行(等级色) */\n title?: string;\n /** 图标井里的图标;默认按等级:tip → arrow-ne,info / neutral → info,warning / danger → warn */\n icon?: IconName;\n /** 最宽 640px(= 模板 narrow=) */\n narrow?: boolean;\n }>(),\n { level: \"info\", title: undefined, icon: undefined },\n);\n\nconst DEFAULT_ICON: Record<CboxLevel, IconName> = { tip: \"arrow-ne\", info: \"info\", warning: \"warn\", danger: \"warn\", neutral: \"info\" };\n\nconst classes = computed(() => [\n \"ak-cbox\",\n props.level !== \"info\" && `ak-cbox--${props.level}`,\n { \"ak-cbox--narrow\": props.narrow },\n]);\n</script>\n\n<template>\n <div :class=\"classes\" role=\"note\">\n <span class=\"ak-cbox__icon\">\n <slot name=\"icon\"><AkIcon :name=\"icon ?? DEFAULT_ICON[level]\" /></slot>\n </span>\n <div class=\"ak-cbox__body\">\n <div v-if=\"title || $slots.title\" class=\"ak-cbox__title\"><slot name=\"title\">{{ title }}</slot></div>\n <slot />\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nimport type { IconName } from \"../../icons\";\nimport AkIcon from \"../Icon/AkIcon.vue\";\n\nexport type CboxLevel = \"tip\" | \"info\" | \"warning\" | \"danger\" | \"neutral\";\n\nconst props = withDefaults(\n defineProps<{\n /** 等级(= 现网 {{Cbox2}} 的 lv):tip = lv0 绿「另见 / 提示」· info = lv1 蓝(默认)· warning = lv2 / lv3 · danger = lv4 · neutral 灰 */\n level?: CboxLevel;\n /** 加粗的标题行(等级色) */\n title?: string;\n /** 图标井里的图标;默认按等级:tip → arrow-ne,info / neutral → info,warning / danger → warn */\n icon?: IconName;\n /** 最宽 640px(= 模板 narrow=) */\n narrow?: boolean;\n }>(),\n { level: \"info\", title: undefined, icon: undefined },\n);\n\nconst DEFAULT_ICON: Record<CboxLevel, IconName> = { tip: \"arrow-ne\", info: \"info\", warning: \"warn\", danger: \"warn\", neutral: \"info\" };\n\nconst classes = computed(() => [\n \"ak-cbox\",\n props.level !== \"info\" && `ak-cbox--${props.level}`,\n { \"ak-cbox--narrow\": props.narrow },\n]);\n</script>\n\n<template>\n <div :class=\"classes\" role=\"note\">\n <span class=\"ak-cbox__icon\">\n <slot name=\"icon\"><AkIcon :name=\"icon ?? DEFAULT_ICON[level]\" /></slot>\n </span>\n <div class=\"ak-cbox__body\">\n <div v-if=\"title || $slots.title\" class=\"ak-cbox__title\"><slot name=\"title\">{{ title }}</slot></div>\n <slot />\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 只有页签、没有面板(= Naive 的 NTab):一排页签当筛选 / 切换外部内容时用,只能直接放在 AkTabs 里。\n * AkTabs 读它的 name / tab / disabled / 默认插槽自己画页签,这个组件本身不会被挂载。\n */\ndefineProps<{\n /** 标识,= AkTabs 的 v-model 值 */\n name: string | number;\n /** 页签文字(也可以写在默认插槽里) */\n tab?: string;\n /** 禁用:页签不可选,方向键跳过 */\n disabled?: boolean;\n}>();\n\ndefineSlots<{\n /** 页签内容(代替 tab) */\n default?: () => unknown;\n}>();\n</script>\n\n<template>\n <slot>{{ tab }}</slot>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 只有页签、没有面板(= Naive 的 NTab):一排页签当筛选 / 切换外部内容时用,只能直接放在 AkTabs 里。\n * AkTabs 读它的 name / tab / disabled / 默认插槽自己画页签,这个组件本身不会被挂载。\n */\ndefineProps<{\n /** 标识,= AkTabs 的 v-model 值 */\n name: string | number;\n /** 页签文字(也可以写在默认插槽里) */\n tab?: string;\n /** 禁用:页签不可选,方向键跳过 */\n disabled?: boolean;\n}>();\n\ndefineSlots<{\n /** 页签内容(代替 tab) */\n default?: () => unknown;\n}>();\n</script>\n\n<template>\n <slot>{{ tab }}</slot>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 一个页签 + 它的面板(= Naive 的 NTabPane),只能直接放在 AkTabs 里。\n * AkTabs 读它的 name / tab / disabled / #tab 画页签,再把它渲染成面板(id、aria-labelledby、hidden 由 AkTabs 补上)。\n */\ndefineProps<{\n /** 标识,= AkTabs 的 v-model 值 */\n name: string | number;\n /** 页签文字;要第二行小字(「信赖 25%」)或图标时改用 #tab 插槽 */\n tab?: string;\n /** 禁用:页签不可选,方向键跳过 */\n disabled?: boolean;\n /** 面板渲染方式(同 Naive):if 只渲染当前页(默认)· show 全部渲染、非当前页 hidden · show:lazy 第一次切到时渲染,之后保留 */\n displayDirective?: \"if\" | \"show\" | \"show:lazy\";\n}>();\n\ndefineSlots<{\n /** 面板内容 */\n default?: () => unknown;\n /** 页签内容(代替 tab) */\n tab?: () => unknown;\n}>();\n</script>\n\n<template>\n <div class=\"ak-tabpanel\" role=\"tabpanel\" tabindex=\"0\"><slot /></div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 一个页签 + 它的面板(= Naive 的 NTabPane),只能直接放在 AkTabs 里。\n * AkTabs 读它的 name / tab / disabled / #tab 画页签,再把它渲染成面板(id、aria-labelledby、hidden 由 AkTabs 补上)。\n */\ndefineProps<{\n /** 标识,= AkTabs 的 v-model 值 */\n name: string | number;\n /** 页签文字;要第二行小字(「信赖 25%」)或图标时改用 #tab 插槽 */\n tab?: string;\n /** 禁用:页签不可选,方向键跳过 */\n disabled?: boolean;\n /** 面板渲染方式(同 Naive):if 只渲染当前页(默认)· show 全部渲染、非当前页 hidden · show:lazy 第一次切到时渲染,之后保留 */\n displayDirective?: \"if\" | \"show\" | \"show:lazy\";\n}>();\n\ndefineSlots<{\n /** 面板内容 */\n default?: () => unknown;\n /** 页签内容(代替 tab) */\n tab?: () => unknown;\n}>();\n</script>\n\n<template>\n <div class=\"ak-tabpanel\" role=\"tabpanel\" tabindex=\"0\"><slot /></div>\n</template>\n","<script setup lang=\"ts\">\nimport { Comment, Fragment, cloneVNode, nextTick, useId, type VNode } from \"vue\";\n\nimport AkTab from \"./AkTab.vue\";\nimport AkTabPane from \"./AkTabPane.vue\";\n\ntype Name = string | number;\n\nconst props = withDefaults(\n defineProps<{\n /** 外观:underline 下划线(默认)· pill 胶囊底 · block 游戏内块状(选中黑白反转) */\n variant?: \"underline\" | \"pill\" | \"block\";\n /** 页签位置:top 在上(默认)· left 竖排在左、面板在右(干员档案),上下方向键切换 */\n placement?: \"top\" | \"left\";\n /** 读屏用的页签组名 */\n label?: string;\n }>(),\n { variant: \"underline\", placement: \"top\", label: undefined },\n);\n\n/** 当前页签的 name;不绑定时默认第一个 */\nconst model = defineModel<Name>();\n\nconst slots = defineSlots<{\n /** AkTabPane(页签 + 面板)或 AkTab(只有页签)若干 */\n default?: () => VNode[];\n}>();\n\ninterface TabDef {\n index: number;\n name: Name;\n disabled: boolean;\n /** 页签内容:#tab 插槽(AkTab 是默认插槽),没有就用 tab 字符串 */\n label: (() => unknown) | string | undefined;\n /** AkTabPane 的 vnode;AkTab 没有面板 */\n pane?: VNode;\n directive: \"if\" | \"show\" | \"show:lazy\";\n}\n\nconst flatten = (nodes: VNode[]): VNode[] =>\n nodes.flatMap(n => (n.type === Fragment && Array.isArray(n.children) ? flatten(n.children as VNode[]) : n.type === Comment ? [] : [n]));\n\n/**\n * 同 Naive 的 NTabs:从默认插槽里挑出 AkTabPane / AkTab 读 props 和插槽,自己画页签。\n * 不走子组件注册(provide / inject),这样首次渲染 / SSR 预渲染就有完整的页签。插槽只能在渲染期调用,所以由模板调用。\n */\nfunction collect(): TabDef[] {\n const nodes = flatten(slots.default?.() ?? []);\n const panes = nodes.filter(n => n.type === AkTabPane);\n return (panes.length ? panes : nodes.filter(n => n.type === AkTab)).map((n, index) => {\n const p = (n.props ?? {}) as Record<string, unknown>;\n const s = (n.children ?? {}) as Record<string, (() => unknown) | undefined>;\n const isPane = n.type === AkTabPane;\n return {\n index,\n name: p.name as Name,\n disabled: p.disabled !== undefined && p.disabled !== false, // <AkTabPane disabled> 在 vnode.props 里是 \"\"\n label: (isPane ? s.tab : s.default) ?? (p.tab as string | undefined),\n pane: isPane ? n : undefined,\n directive: (p.displayDirective ?? p[\"display-directive\"] ?? \"if\") as TabDef[\"directive\"],\n };\n });\n}\n\nconst current = (tabs: TabDef[]) => model.value ?? tabs[0]?.name;\n\n/** show:lazy 已经切到过的页;只在渲染期随当前页一起变,不需要响应式 */\nconst visited = new Set<Name>();\nfunction isRendered(t: TabDef, tabs: TabDef[]) {\n if (!t.pane) return false;\n if (t.name === current(tabs)) {\n visited.add(t.name);\n return true;\n }\n return t.directive === \"show\" || (t.directive === \"show:lazy\" && visited.has(t.name));\n}\n\nconst id = useId();\nconst tabId = (t: TabDef) => `${id}-tab-${t.index}`;\nconst panelId = (t: TabDef) => `${id}-panel-${t.index}`;\n\n/** 方向键 / Home / End 在页签间移动并选中(WAI-ARIA Tabs,自动激活) */\nfunction onKey(e: KeyboardEvent, tabs: TabDef[]) {\n const enabled = tabs.filter(t => !t.disabled);\n const i = enabled.findIndex(t => t.name === current(tabs));\n const [prev, next] = props.placement === \"left\" ? [\"ArrowUp\", \"ArrowDown\"] : [\"ArrowLeft\", \"ArrowRight\"];\n const to =\n e.key === next ? enabled[(i + 1) % enabled.length]\n : e.key === prev ? enabled[(i - 1 + enabled.length) % enabled.length]\n : e.key === \"Home\" ? enabled[0]\n : e.key === \"End\" ? enabled.at(-1)\n : undefined;\n if (!to) return;\n e.preventDefault();\n model.value = to.name;\n const tablist = e.currentTarget as HTMLElement;\n nextTick(() => tablist.querySelector<HTMLElement>(`#${CSS.escape(tabId(to))}`)?.focus());\n}\n\n/** 把插槽函数 / 字符串 / vnode 原样渲染;定义在外面保持同一个组件类型,重渲染时不重建 */\nconst Render = (p: { content: unknown }) => (typeof p.content === \"function\" ? p.content() : p.content);\n</script>\n\n<template>\n <div :class=\"['ak-tabset', placement === 'left' && 'ak-tabset--left']\">\n <template v-for=\"tabs in [collect()]\" :key=\"0\">\n <div\n :class=\"['ak-tabs', variant !== 'underline' && `ak-tabs--${variant}`, placement === 'left' && 'ak-tabs--vertical']\"\n role=\"tablist\"\n :aria-label=\"label\"\n :aria-orientation=\"placement === 'left' ? 'vertical' : undefined\"\n @keydown=\"onKey($event, tabs)\"\n >\n <button\n v-for=\"t in tabs\"\n :id=\"tabId(t)\"\n :key=\"t.name\"\n type=\"button\"\n role=\"tab\"\n :class=\"['ak-tab', { 'is-active': t.name === current(tabs) }]\"\n :aria-selected=\"t.name === current(tabs)\"\n :aria-controls=\"isRendered(t, tabs) ? panelId(t) : undefined\"\n :tabindex=\"t.name === current(tabs) ? 0 : -1\"\n :disabled=\"t.disabled\"\n @click=\"model = t.name\"\n >\n <Render :content=\"t.label\" />\n </button>\n </div>\n <template v-for=\"t in tabs\" :key=\"t.name\">\n <Render\n v-if=\"t.pane && isRendered(t, tabs)\"\n :content=\"cloneVNode(t.pane, { id: panelId(t), 'aria-labelledby': tabId(t), hidden: t.name !== current(tabs) || undefined })\"\n />\n </template>\n </template>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { Comment, Fragment, cloneVNode, nextTick, useId, type VNode } from \"vue\";\n\nimport AkTab from \"./AkTab.vue\";\nimport AkTabPane from \"./AkTabPane.vue\";\n\ntype Name = string | number;\n\nconst props = withDefaults(\n defineProps<{\n /** 外观:underline 下划线(默认)· pill 胶囊底 · block 游戏内块状(选中黑白反转) */\n variant?: \"underline\" | \"pill\" | \"block\";\n /** 页签位置:top 在上(默认)· left 竖排在左、面板在右(干员档案),上下方向键切换 */\n placement?: \"top\" | \"left\";\n /** 读屏用的页签组名 */\n label?: string;\n }>(),\n { variant: \"underline\", placement: \"top\", label: undefined },\n);\n\n/** 当前页签的 name;不绑定时默认第一个 */\nconst model = defineModel<Name>();\n\nconst slots = defineSlots<{\n /** AkTabPane(页签 + 面板)或 AkTab(只有页签)若干 */\n default?: () => VNode[];\n}>();\n\ninterface TabDef {\n index: number;\n name: Name;\n disabled: boolean;\n /** 页签内容:#tab 插槽(AkTab 是默认插槽),没有就用 tab 字符串 */\n label: (() => unknown) | string | undefined;\n /** AkTabPane 的 vnode;AkTab 没有面板 */\n pane?: VNode;\n directive: \"if\" | \"show\" | \"show:lazy\";\n}\n\nconst flatten = (nodes: VNode[]): VNode[] =>\n nodes.flatMap(n => (n.type === Fragment && Array.isArray(n.children) ? flatten(n.children as VNode[]) : n.type === Comment ? [] : [n]));\n\n/**\n * 同 Naive 的 NTabs:从默认插槽里挑出 AkTabPane / AkTab 读 props 和插槽,自己画页签。\n * 不走子组件注册(provide / inject),这样首次渲染 / SSR 预渲染就有完整的页签。插槽只能在渲染期调用,所以由模板调用。\n */\nfunction collect(): TabDef[] {\n const nodes = flatten(slots.default?.() ?? []);\n const panes = nodes.filter(n => n.type === AkTabPane);\n return (panes.length ? panes : nodes.filter(n => n.type === AkTab)).map((n, index) => {\n const p = (n.props ?? {}) as Record<string, unknown>;\n const s = (n.children ?? {}) as Record<string, (() => unknown) | undefined>;\n const isPane = n.type === AkTabPane;\n return {\n index,\n name: p.name as Name,\n disabled: p.disabled !== undefined && p.disabled !== false, // <AkTabPane disabled> 在 vnode.props 里是 \"\"\n label: (isPane ? s.tab : s.default) ?? (p.tab as string | undefined),\n pane: isPane ? n : undefined,\n directive: (p.displayDirective ?? p[\"display-directive\"] ?? \"if\") as TabDef[\"directive\"],\n };\n });\n}\n\nconst current = (tabs: TabDef[]) => model.value ?? tabs[0]?.name;\n\n/** show:lazy 已经切到过的页;只在渲染期随当前页一起变,不需要响应式 */\nconst visited = new Set<Name>();\nfunction isRendered(t: TabDef, tabs: TabDef[]) {\n if (!t.pane) return false;\n if (t.name === current(tabs)) {\n visited.add(t.name);\n return true;\n }\n return t.directive === \"show\" || (t.directive === \"show:lazy\" && visited.has(t.name));\n}\n\nconst id = useId();\nconst tabId = (t: TabDef) => `${id}-tab-${t.index}`;\nconst panelId = (t: TabDef) => `${id}-panel-${t.index}`;\n\n/** 方向键 / Home / End 在页签间移动并选中(WAI-ARIA Tabs,自动激活) */\nfunction onKey(e: KeyboardEvent, tabs: TabDef[]) {\n const enabled = tabs.filter(t => !t.disabled);\n const i = enabled.findIndex(t => t.name === current(tabs));\n const [prev, next] = props.placement === \"left\" ? [\"ArrowUp\", \"ArrowDown\"] : [\"ArrowLeft\", \"ArrowRight\"];\n const to =\n e.key === next ? enabled[(i + 1) % enabled.length]\n : e.key === prev ? enabled[(i - 1 + enabled.length) % enabled.length]\n : e.key === \"Home\" ? enabled[0]\n : e.key === \"End\" ? enabled.at(-1)\n : undefined;\n if (!to) return;\n e.preventDefault();\n model.value = to.name;\n const tablist = e.currentTarget as HTMLElement;\n nextTick(() => tablist.querySelector<HTMLElement>(`#${CSS.escape(tabId(to))}`)?.focus());\n}\n\n/** 把插槽函数 / 字符串 / vnode 原样渲染;定义在外面保持同一个组件类型,重渲染时不重建 */\nconst Render = (p: { content: unknown }) => (typeof p.content === \"function\" ? p.content() : p.content);\n</script>\n\n<template>\n <div :class=\"['ak-tabset', placement === 'left' && 'ak-tabset--left']\">\n <template v-for=\"tabs in [collect()]\" :key=\"0\">\n <div\n :class=\"['ak-tabs', variant !== 'underline' && `ak-tabs--${variant}`, placement === 'left' && 'ak-tabs--vertical']\"\n role=\"tablist\"\n :aria-label=\"label\"\n :aria-orientation=\"placement === 'left' ? 'vertical' : undefined\"\n @keydown=\"onKey($event, tabs)\"\n >\n <button\n v-for=\"t in tabs\"\n :id=\"tabId(t)\"\n :key=\"t.name\"\n type=\"button\"\n role=\"tab\"\n :class=\"['ak-tab', { 'is-active': t.name === current(tabs) }]\"\n :aria-selected=\"t.name === current(tabs)\"\n :aria-controls=\"isRendered(t, tabs) ? panelId(t) : undefined\"\n :tabindex=\"t.name === current(tabs) ? 0 : -1\"\n :disabled=\"t.disabled\"\n @click=\"model = t.name\"\n >\n <Render :content=\"t.label\" />\n </button>\n </div>\n <template v-for=\"t in tabs\" :key=\"t.name\">\n <Render\n v-if=\"t.pane && isRendered(t, tabs)\"\n :content=\"cloneVNode(t.pane, { id: panelId(t), 'aria-labelledby': tabId(t), hidden: t.name !== current(tabs) || undefined })\"\n />\n </template>\n </template>\n </div>\n</template>\n","import type { InjectionKey } from \"vue\";\n\nexport type ItemSize = \"sm\" | \"md\" | \"lg\";\n\n/** AkItemList / AkMaterialsRow 给里面 AkItem 的默认尺寸(同 AkButtonGroup → AkButton) */\nexport const itemListKey: InjectionKey<{ size?: ItemSize }> = Symbol(\"AkItemList\");\n","<script setup lang=\"ts\">\nimport { computed, inject } from \"vue\";\n\nimport { itemListKey, type ItemSize } from \"./context\";\n\nconst props = withDefaults(\n defineProps<{\n /** 图片地址:默认是现网拼好的「道具_带框_<名>.png」(底框 + 图标);bare 时是裸图标 */\n src: string;\n /** 道具名:作 alt,并默认作悬停提示 */\n name: string;\n /** 数量:数字或写好的串(\"30K\" / \"99+\");不写不显示。inline 时显示成图后的「×数量」 */\n count?: number | string;\n /** 数量不足(红字) */\n insufficient?: boolean;\n /** 尺寸:sm 40 · md 56 · lg 76(px);不写时跟 AkItemList 的 size(材料表里是 sm),再不然是 md;inline 时固定 22 */\n size?: ItemSize;\n /** 裸图标:底框由 CSS 按 rarity 画(只有 torappu 透明图标、没有合成图时用) */\n bare?: boolean;\n /** bare 时的底框稀有度 1–6(白 / 绿 / 蓝 / 紫 / 金 / 特殊) */\n rarity?: 1 | 2 | 3 | 4 | 5 | 6;\n /** 去色(未获得 / 不可用) */\n disabled?: boolean;\n /** 招聘合同那种:叠在底图空框里的干员头像;inline 时不显示 */\n avatar?: string;\n /** 链接到道具页 */\n href?: string;\n /** 悬停提示(data-ak-tip):默认是 name,可改写;false 关掉 */\n tip?: string | false;\n /** 行内:22px 小图 + 文字,放在正文里(龙门币×30000);文字默认是「×count」,可用默认插槽改写 */\n inline?: boolean;\n }>(),\n { count: undefined, size: undefined, rarity: undefined, avatar: undefined, href: undefined, tip: undefined },\n);\n\nconst list = inject(itemListKey, null);\nconst size = computed(() => props.size ?? list?.size ?? \"md\");\n\nconst classes = computed(() => [\n \"ak-item\",\n !props.inline && size.value !== \"md\" && `ak-item--${size.value}`,\n { \"ak-item--bare\": props.bare, \"is-disabled\": props.disabled },\n]);\nconst tipText = computed(() => (props.tip === false ? undefined : (props.tip ?? props.name)));\n</script>\n\n<template>\n <component :is=\"href ? 'a' : 'span'\" v-if=\"inline\" class=\"ak-item-inline\" :href=\"href\" :data-ak-tip=\"tipText\">\n <span :class=\"classes\" :data-rarity=\"bare ? rarity : undefined\"><img :src=\"src\" :alt=\"name\" /></span>\n <span v-if=\"$slots.default || count !== undefined\" :class=\"insufficient ? 'ak-fg-danger' : undefined\"><slot>×{{ count }}</slot></span>\n </component>\n <component\n :is=\"href ? 'a' : 'span'\"\n v-else\n :class=\"classes\"\n :href=\"href\"\n :data-rarity=\"bare ? rarity : undefined\"\n :data-ak-tip=\"tipText\"\n >\n <img :src=\"src\" :alt=\"name\" />\n <img v-if=\"avatar\" class=\"ak-item__avatar\" :src=\"avatar\" alt=\"\" />\n <span v-if=\"count !== undefined\" :class=\"['ak-item__count', { 'is-short': insufficient }]\">{{ count }}</span>\n </component>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, inject } from \"vue\";\n\nimport { itemListKey, type ItemSize } from \"./context\";\n\nconst props = withDefaults(\n defineProps<{\n /** 图片地址:默认是现网拼好的「道具_带框_<名>.png」(底框 + 图标);bare 时是裸图标 */\n src: string;\n /** 道具名:作 alt,并默认作悬停提示 */\n name: string;\n /** 数量:数字或写好的串(\"30K\" / \"99+\");不写不显示。inline 时显示成图后的「×数量」 */\n count?: number | string;\n /** 数量不足(红字) */\n insufficient?: boolean;\n /** 尺寸:sm 40 · md 56 · lg 76(px);不写时跟 AkItemList 的 size(材料表里是 sm),再不然是 md;inline 时固定 22 */\n size?: ItemSize;\n /** 裸图标:底框由 CSS 按 rarity 画(只有 torappu 透明图标、没有合成图时用) */\n bare?: boolean;\n /** bare 时的底框稀有度 1–6(白 / 绿 / 蓝 / 紫 / 金 / 特殊) */\n rarity?: 1 | 2 | 3 | 4 | 5 | 6;\n /** 去色(未获得 / 不可用) */\n disabled?: boolean;\n /** 招聘合同那种:叠在底图空框里的干员头像;inline 时不显示 */\n avatar?: string;\n /** 链接到道具页 */\n href?: string;\n /** 悬停提示(data-ak-tip):默认是 name,可改写;false 关掉 */\n tip?: string | false;\n /** 行内:22px 小图 + 文字,放在正文里(龙门币×30000);文字默认是「×count」,可用默认插槽改写 */\n inline?: boolean;\n }>(),\n { count: undefined, size: undefined, rarity: undefined, avatar: undefined, href: undefined, tip: undefined },\n);\n\nconst list = inject(itemListKey, null);\nconst size = computed(() => props.size ?? list?.size ?? \"md\");\n\nconst classes = computed(() => [\n \"ak-item\",\n !props.inline && size.value !== \"md\" && `ak-item--${size.value}`,\n { \"ak-item--bare\": props.bare, \"is-disabled\": props.disabled },\n]);\nconst tipText = computed(() => (props.tip === false ? undefined : (props.tip ?? props.name)));\n</script>\n\n<template>\n <component :is=\"href ? 'a' : 'span'\" v-if=\"inline\" class=\"ak-item-inline\" :href=\"href\" :data-ak-tip=\"tipText\">\n <span :class=\"classes\" :data-rarity=\"bare ? rarity : undefined\"><img :src=\"src\" :alt=\"name\" /></span>\n <span v-if=\"$slots.default || count !== undefined\" :class=\"insufficient ? 'ak-fg-danger' : undefined\"><slot>×{{ count }}</slot></span>\n </component>\n <component\n :is=\"href ? 'a' : 'span'\"\n v-else\n :class=\"classes\"\n :href=\"href\"\n :data-rarity=\"bare ? rarity : undefined\"\n :data-ak-tip=\"tipText\"\n >\n <img :src=\"src\" :alt=\"name\" />\n <img v-if=\"avatar\" class=\"ak-item__avatar\" :src=\"avatar\" alt=\"\" />\n <span v-if=\"count !== undefined\" :class=\"['ak-item__count', { 'is-short': insufficient }]\">{{ count }}</span>\n </component>\n</template>\n","<script setup lang=\"ts\">\nimport { provide } from \"vue\";\n\nimport { itemListKey, type ItemSize } from \"./context\";\n\n/** 一排道具:换行、间距 6 / 8 */\nconst props = defineProps<{\n /** 里面道具的默认尺寸(道具自己写了 size 以道具为准,同 AkButtonGroup) */\n size?: ItemSize;\n}>();\n\ndefineSlots<{\n /** 若干 AkItem */\n default?: () => unknown;\n}>();\n\nprovide(itemListKey, props);\n</script>\n\n<template>\n <div class=\"ak-item-list\"><slot /></div>\n</template>\n","<script setup lang=\"ts\">\nimport { provide } from \"vue\";\n\nimport { itemListKey, type ItemSize } from \"./context\";\n\n/** 一排道具:换行、间距 6 / 8 */\nconst props = defineProps<{\n /** 里面道具的默认尺寸(道具自己写了 size 以道具为准,同 AkButtonGroup) */\n size?: ItemSize;\n}>();\n\ndefineSlots<{\n /** 若干 AkItem */\n default?: () => unknown;\n}>();\n\nprovide(itemListKey, props);\n</script>\n\n<template>\n <div class=\"ak-item-list\"><slot /></div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 可交互的筛选芯片(= Naive 的 NTag checkable):一个开关按钮,点一下选中 / 取消,aria-pressed 报状态。\n * 选中 = 主色实底 + 左上角三角角标(同 .ak-tab / .ak-card 的选中角标)。\n * data-no-toggle:皮肤 / 预览脚本会在 document 上把所有 .ak-chip 的 is-active / aria-pressed 翻一遍(给模板输出的纯 CSS 芯片用),\n * 状态归 Vue 管的芯片要用它退出,否则两边各翻一次、DOM 与 v-model 对不上。\n */\nimport type { IconName } from \"../../icons\";\nimport AkIcon from \"../Icon/AkIcon.vue\";\n\nwithDefaults(\n defineProps<{\n /** 文字前的图标(芯片自带 6px 间距) */\n icon?: IconName;\n }>(),\n { icon: undefined },\n);\n\n/** 是否选中(= Naive 的 checked);点击切换 */\nconst checked = defineModel<boolean>({ default: false });\n\ndefineSlots<{\n /** 芯片文字 */\n default?: () => unknown;\n}>();\n</script>\n\n<template>\n <button type=\"button\" :class=\"['ak-chip', { 'is-active': checked }]\" :aria-pressed=\"checked\" data-no-toggle @click=\"checked = !checked\">\n <AkIcon v-if=\"icon\" :name=\"icon\" :size=\"14\" />\n <slot />\n </button>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 可交互的筛选芯片(= Naive 的 NTag checkable):一个开关按钮,点一下选中 / 取消,aria-pressed 报状态。\n * 选中 = 主色实底 + 左上角三角角标(同 .ak-tab / .ak-card 的选中角标)。\n * data-no-toggle:皮肤 / 预览脚本会在 document 上把所有 .ak-chip 的 is-active / aria-pressed 翻一遍(给模板输出的纯 CSS 芯片用),\n * 状态归 Vue 管的芯片要用它退出,否则两边各翻一次、DOM 与 v-model 对不上。\n */\nimport type { IconName } from \"../../icons\";\nimport AkIcon from \"../Icon/AkIcon.vue\";\n\nwithDefaults(\n defineProps<{\n /** 文字前的图标(芯片自带 6px 间距) */\n icon?: IconName;\n }>(),\n { icon: undefined },\n);\n\n/** 是否选中(= Naive 的 checked);点击切换 */\nconst checked = defineModel<boolean>({ default: false });\n\ndefineSlots<{\n /** 芯片文字 */\n default?: () => unknown;\n}>();\n</script>\n\n<template>\n <button type=\"button\" :class=\"['ak-chip', { 'is-active': checked }]\" :aria-pressed=\"checked\" data-no-toggle @click=\"checked = !checked\">\n <AkIcon v-if=\"icon\" :name=\"icon\" :size=\"14\" />\n <slot />\n </button>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 计数徽标 / 未读点(= Naive 的 NBadge)。默认插槽写了内容时,徽标骑在它右上角(.ak-badge-wrap);不写就是一枚行内徽标。\n * 默认黄(次强调「提示」):未读数不是高危信息,红只给回退 / 权限变更这类 alerts;NEW 角标是 AkTag variant=\"new\",不是徽标。\n */\nimport { computed } from \"vue\";\n\nconst props = withDefaults(\n defineProps<{\n /** 数字或短串;数字为 0 时默认不显示(见 showZero) */\n value?: number | string;\n /** 封顶:value 按数字大于它时显示「max+」(99+) */\n max?: number;\n /** 圆点:不显示数字,只提示「有新的」 */\n dot?: boolean;\n /** 是否显示徽标(同 Naive);false 时只剩包住的内容 */\n show?: boolean;\n /** value 为 0 时也显示 */\n showZero?: boolean;\n /** 颜色:default 黄(未读计数 / 点)· accent 主色 · danger 红(只给回退 / 权限变更这类 alerts) */\n variant?: \"default\" | \"accent\" | \"danger\";\n /** 读屏文本(「3 条未读通知」):写了就把数字对读屏隐藏、改念这句;圆点徽标一定要写 */\n label?: string;\n }>(),\n { value: undefined, max: undefined, show: true, variant: \"default\", label: undefined },\n);\n\ndefineSlots<{\n /** 被标记的内容(头像、图标按钮…):徽标骑在它右上角;不写就是独立的行内徽标 */\n default?: () => unknown;\n}>();\n\nconst visible = computed(() => {\n if (!props.show) return false;\n if (props.dot) return true;\n if (props.value === undefined || props.value === \"\") return false;\n return props.showZero || !(Number(props.value) <= 0);\n});\n\nconst text = computed(() => {\n if (props.dot) return \"\";\n const v = props.value;\n return props.max !== undefined && Number(v) > props.max ? `${props.max}+` : String(v ?? \"\");\n});\n\nconst classes = computed(() => [\n \"ak-badge\",\n props.variant !== \"default\" && `ak-badge--${props.variant}`,\n { \"ak-badge--dot\": props.dot },\n]);\n</script>\n\n<template>\n <span v-if=\"$slots.default\" class=\"ak-badge-wrap\">\n <slot />\n <span v-if=\"visible\" :class=\"classes\">\n <template v-if=\"label\"><span v-if=\"text\" aria-hidden=\"true\">{{ text }}</span><span class=\"ak-sr-only\">{{ label }}</span></template>\n <template v-else>{{ text }}</template>\n </span>\n </span>\n <span v-else-if=\"visible\" :class=\"classes\">\n <template v-if=\"label\"><span v-if=\"text\" aria-hidden=\"true\">{{ text }}</span><span class=\"ak-sr-only\">{{ label }}</span></template>\n <template v-else>{{ text }}</template>\n </span>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 计数徽标 / 未读点(= Naive 的 NBadge)。默认插槽写了内容时,徽标骑在它右上角(.ak-badge-wrap);不写就是一枚行内徽标。\n * 默认黄(次强调「提示」):未读数不是高危信息,红只给回退 / 权限变更这类 alerts;NEW 角标是 AkTag variant=\"new\",不是徽标。\n */\nimport { computed } from \"vue\";\n\nconst props = withDefaults(\n defineProps<{\n /** 数字或短串;数字为 0 时默认不显示(见 showZero) */\n value?: number | string;\n /** 封顶:value 按数字大于它时显示「max+」(99+) */\n max?: number;\n /** 圆点:不显示数字,只提示「有新的」 */\n dot?: boolean;\n /** 是否显示徽标(同 Naive);false 时只剩包住的内容 */\n show?: boolean;\n /** value 为 0 时也显示 */\n showZero?: boolean;\n /** 颜色:default 黄(未读计数 / 点)· accent 主色 · danger 红(只给回退 / 权限变更这类 alerts) */\n variant?: \"default\" | \"accent\" | \"danger\";\n /** 读屏文本(「3 条未读通知」):写了就把数字对读屏隐藏、改念这句;圆点徽标一定要写 */\n label?: string;\n }>(),\n { value: undefined, max: undefined, show: true, variant: \"default\", label: undefined },\n);\n\ndefineSlots<{\n /** 被标记的内容(头像、图标按钮…):徽标骑在它右上角;不写就是独立的行内徽标 */\n default?: () => unknown;\n}>();\n\nconst visible = computed(() => {\n if (!props.show) return false;\n if (props.dot) return true;\n if (props.value === undefined || props.value === \"\") return false;\n return props.showZero || !(Number(props.value) <= 0);\n});\n\nconst text = computed(() => {\n if (props.dot) return \"\";\n const v = props.value;\n return props.max !== undefined && Number(v) > props.max ? `${props.max}+` : String(v ?? \"\");\n});\n\nconst classes = computed(() => [\n \"ak-badge\",\n props.variant !== \"default\" && `ak-badge--${props.variant}`,\n { \"ak-badge--dot\": props.dot },\n]);\n</script>\n\n<template>\n <span v-if=\"$slots.default\" class=\"ak-badge-wrap\">\n <slot />\n <span v-if=\"visible\" :class=\"classes\">\n <template v-if=\"label\"><span v-if=\"text\" aria-hidden=\"true\">{{ text }}</span><span class=\"ak-sr-only\">{{ label }}</span></template>\n <template v-else>{{ text }}</template>\n </span>\n </span>\n <span v-else-if=\"visible\" :class=\"classes\">\n <template v-if=\"label\"><span v-if=\"text\" aria-hidden=\"true\">{{ text }}</span><span class=\"ak-sr-only\">{{ label }}</span></template>\n <template v-else>{{ text }}</template>\n </span>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 卡片(= Naive 的 NCard):1px 边、直角、表面色。标题 / 眉题默认直接排在正文顶部;\n * segmented(或写了 #header-extra)时标题单独成一栏、下面一道分隔线。页脚是表面 2 底的一栏。\n */\nimport { computed } from \"vue\";\n\ntype TitleTag = \"div\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\";\n\nconst props = withDefaults(\n defineProps<{\n /** 标题(也可用 #header 插槽) */\n title?: string;\n /** 标题上方的灰色小字(Bender 大写:「Side Story」「01 · Foundations」) */\n eyebrow?: string;\n /** 标题元素:默认 div;卡片是页面大纲里的一节时用 h2–h6 */\n titleTag?: TitleTag;\n /** 标题独立成栏、下面一道分隔线(同 Naive 的 segmented);写了 #header-extra 时自动成栏 */\n segmented?: boolean;\n /** 封面图地址:16:9 裁切铺满顶部;horizontal 时在左边占 40%。要自定义用 #cover */\n cover?: string;\n /** 外观:default 表面色 + 1px 边 · flat 无边、表面 2 底 · inset 凹陷底 */\n variant?: \"default\" | \"flat\" | \"inset\";\n /** 主色色条:top 顶部 3px · left 左侧 4px(公告 / 提示 / 天赋条目) */\n accent?: \"top\" | \"left\";\n /** 悬停时主色描边 + 投影 + 上移 2px(同 Naive 的 hoverable);整卡可点时用 */\n hoverable?: boolean;\n /** 选中:主色内描边 + 左上角三角角标(源自游戏内技能选中框) */\n selected?: boolean;\n /** 横排:封面在左、正文在右 */\n horizontal?: boolean;\n /** 整张卡是一个链接:渲染成 <a>(带 ak-not-prose,正文链接色 / 下划线不进来);这时正文里别再放链接 */\n href?: string;\n }>(),\n { title: undefined, eyebrow: undefined, titleTag: \"div\", cover: undefined, variant: \"default\", accent: undefined, href: undefined },\n);\n\nconst slots = defineSlots<{\n /** 正文 */\n default?: () => unknown;\n /** 标题内容(代替 title) */\n header?: () => unknown;\n /** 标题栏右侧(标签、按钮);写了它标题自动成栏 */\n \"header-extra\"?: () => unknown;\n /** 页脚(日期 + 操作):表面 2 底、上面一道线 */\n footer?: () => unknown;\n /** 自定义封面(代替 cover);图片自己加 class=\"ak-card__media\" */\n cover?: () => unknown;\n}>();\n\nconst bar = computed(() => props.segmented || !!slots[\"header-extra\"]);\nconst hasTitle = computed(() => !!props.title || !!slots.header);\n\nconst classes = computed(() => [\n \"ak-card\",\n props.variant !== \"default\" && `ak-card--${props.variant}`,\n props.accent && `ak-card--accent-${props.accent}`,\n {\n \"ak-card--hover\": props.hoverable,\n \"ak-card--selected\": props.selected,\n \"ak-card--horizontal\": props.horizontal,\n /* 整块是链接:挡掉正文的 a:hover 下划线 / a:visited 褪色(base/typography.css prose / not-prose) */\n \"ak-not-prose\": !!props.href,\n },\n]);\n</script>\n\n<template>\n <component :is=\"href ? 'a' : 'div'\" :class=\"classes\" :href=\"href\">\n <slot name=\"cover\"><img v-if=\"cover\" class=\"ak-card__media\" :src=\"cover\" alt=\"\" /></slot>\n <div v-if=\"bar\" class=\"ak-card__header\">\n <component :is=\"titleTag\" class=\"ak-card__title\">\n <span v-if=\"eyebrow\" class=\"ak-card__eyebrow\">{{ eyebrow }}</span>\n <slot name=\"header\">{{ title }}</slot>\n </component>\n <slot name=\"header-extra\" />\n </div>\n <div class=\"ak-card__body\">\n <template v-if=\"!bar\">\n <span v-if=\"eyebrow\" class=\"ak-card__eyebrow\">{{ eyebrow }}</span>\n <component :is=\"titleTag\" v-if=\"hasTitle\" class=\"ak-card__title\"><slot name=\"header\">{{ title }}</slot></component>\n </template>\n <slot />\n </div>\n <div v-if=\"$slots.footer\" class=\"ak-card__footer\"><slot name=\"footer\" /></div>\n </component>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 卡片(= Naive 的 NCard):1px 边、直角、表面色。标题 / 眉题默认直接排在正文顶部;\n * segmented(或写了 #header-extra)时标题单独成一栏、下面一道分隔线。页脚是表面 2 底的一栏。\n */\nimport { computed } from \"vue\";\n\ntype TitleTag = \"div\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\";\n\nconst props = withDefaults(\n defineProps<{\n /** 标题(也可用 #header 插槽) */\n title?: string;\n /** 标题上方的灰色小字(Bender 大写:「Side Story」「01 · Foundations」) */\n eyebrow?: string;\n /** 标题元素:默认 div;卡片是页面大纲里的一节时用 h2–h6 */\n titleTag?: TitleTag;\n /** 标题独立成栏、下面一道分隔线(同 Naive 的 segmented);写了 #header-extra 时自动成栏 */\n segmented?: boolean;\n /** 封面图地址:16:9 裁切铺满顶部;horizontal 时在左边占 40%。要自定义用 #cover */\n cover?: string;\n /** 外观:default 表面色 + 1px 边 · flat 无边、表面 2 底 · inset 凹陷底 */\n variant?: \"default\" | \"flat\" | \"inset\";\n /** 主色色条:top 顶部 3px · left 左侧 4px(公告 / 提示 / 天赋条目) */\n accent?: \"top\" | \"left\";\n /** 悬停时主色描边 + 投影 + 上移 2px(同 Naive 的 hoverable);整卡可点时用 */\n hoverable?: boolean;\n /** 选中:主色内描边 + 左上角三角角标(源自游戏内技能选中框) */\n selected?: boolean;\n /** 横排:封面在左、正文在右 */\n horizontal?: boolean;\n /** 整张卡是一个链接:渲染成 <a>(带 ak-not-prose,正文链接色 / 下划线不进来);这时正文里别再放链接 */\n href?: string;\n }>(),\n { title: undefined, eyebrow: undefined, titleTag: \"div\", cover: undefined, variant: \"default\", accent: undefined, href: undefined },\n);\n\nconst slots = defineSlots<{\n /** 正文 */\n default?: () => unknown;\n /** 标题内容(代替 title) */\n header?: () => unknown;\n /** 标题栏右侧(标签、按钮);写了它标题自动成栏 */\n \"header-extra\"?: () => unknown;\n /** 页脚(日期 + 操作):表面 2 底、上面一道线 */\n footer?: () => unknown;\n /** 自定义封面(代替 cover);图片自己加 class=\"ak-card__media\" */\n cover?: () => unknown;\n}>();\n\nconst bar = computed(() => props.segmented || !!slots[\"header-extra\"]);\nconst hasTitle = computed(() => !!props.title || !!slots.header);\n\nconst classes = computed(() => [\n \"ak-card\",\n props.variant !== \"default\" && `ak-card--${props.variant}`,\n props.accent && `ak-card--accent-${props.accent}`,\n {\n \"ak-card--hover\": props.hoverable,\n \"ak-card--selected\": props.selected,\n \"ak-card--horizontal\": props.horizontal,\n /* 整块是链接:挡掉正文的 a:hover 下划线 / a:visited 褪色(base/typography.css prose / not-prose) */\n \"ak-not-prose\": !!props.href,\n },\n]);\n</script>\n\n<template>\n <component :is=\"href ? 'a' : 'div'\" :class=\"classes\" :href=\"href\">\n <slot name=\"cover\"><img v-if=\"cover\" class=\"ak-card__media\" :src=\"cover\" alt=\"\" /></slot>\n <div v-if=\"bar\" class=\"ak-card__header\">\n <component :is=\"titleTag\" class=\"ak-card__title\">\n <span v-if=\"eyebrow\" class=\"ak-card__eyebrow\">{{ eyebrow }}</span>\n <slot name=\"header\">{{ title }}</slot>\n </component>\n <slot name=\"header-extra\" />\n </div>\n <div class=\"ak-card__body\">\n <template v-if=\"!bar\">\n <span v-if=\"eyebrow\" class=\"ak-card__eyebrow\">{{ eyebrow }}</span>\n <component :is=\"titleTag\" v-if=\"hasTitle\" class=\"ak-card__title\"><slot name=\"header\">{{ title }}</slot></component>\n </template>\n <slot />\n </div>\n <div v-if=\"$slots.footer\" class=\"ak-card__footer\"><slot name=\"footer\" /></div>\n </component>\n</template>\n","<template>\n <!-- 卡片网格:自动填充,每列至少 260px(窄屏一列),间距 16 -->\n <div class=\"ak-card-grid\"><slot /></div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 面板:带标题栏的容器(游戏内 announce panel)——标题栏表面 2 底、左侧 4px 主色条;标题后可跟 Bender 英文。\n * 与 AkCard 的分工:卡片是一件可并列 / 可点的东西,面板是页面上一块有名字的区域(首页「今日信息」「新增关卡」)。\n * collapsible 时点标题栏收起 / 展开(同 Naive NCollapseItem 的单项用法),展开状态是 v-model;\n * 键盘:标题文字是 role=\"button\"(在标题元素里面,h3 的大纲语义不丢,同 WAI-ARIA Accordion),Enter / Space 切换。\n */\nimport { computed, useId, useTemplateRef } from \"vue\";\n\ntype TitleTag = \"div\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\";\n\nconst props = withDefaults(\n defineProps<{\n /** 标题(也可用 #header 插槽) */\n title?: string;\n /** 标题后的英文(Bender 大写灰字:「Today」「Operations」) */\n en?: string;\n /** 标题元素:默认 div;面板是页面大纲里的一节时用 h2–h6(首页「新增关卡」是 h3) */\n titleTag?: TitleTag;\n /** 标题栏反转(亮色下黑底白字、暗色下白底黑字,同 .ak-inverse):公告这类要跳出来的区域 */\n inverse?: boolean;\n /** 可折叠:点标题栏收起 / 展开正文(右端出现 V 形箭头);需要有标题 */\n collapsible?: boolean;\n }>(),\n { title: undefined, en: undefined, titleTag: \"div\" },\n);\n\n/** 是否展开(collapsible 时有效);默认展开 */\nconst expanded = defineModel<boolean>({ default: true });\n\nconst slots = defineSlots<{\n /** 正文 */\n default?: () => unknown;\n /** 标题内容(代替 title) */\n header?: () => unknown;\n /** 标题栏右侧(标签、日期、按钮) */\n \"header-extra\"?: () => unknown;\n}>();\n\nconst id = useId();\nconst toggle = useTemplateRef<HTMLElement>(\"toggle\");\nconst hasHead = computed(() => !!props.title || !!slots.header || !!slots[\"header-extra\"]);\nconst collapsed = computed(() => props.collapsible && !expanded.value);\n\n/**\n * 整条标题栏都能点(同 CSS 的 cursor: pointer);标题栏里别的链接 / 按钮自己的点击不算。\n * 皮肤 / 预览脚本也会给纯 CSS 面板的标题栏点击翻 is-collapsed——标题栏上的 data-no-toggle 让它跳过这里(放在标题栏而不是根上,免得正文里的纯 CSS 芯片也被豁免),状态只看 v-model。\n */\nfunction onHeadClick(e: MouseEvent) {\n if (!props.collapsible) return;\n const hit = (e.target as Element).closest(\"a, button, input, select, textarea, label, [role='button']\");\n if (!hit || hit === toggle.value) expanded.value = !expanded.value;\n}\n\nfunction onKey(e: KeyboardEvent) {\n if (e.key !== \"Enter\" && e.key !== \" \") return;\n e.preventDefault();\n expanded.value = !expanded.value;\n}\n</script>\n\n<template>\n <div :class=\"['ak-panel', { 'ak-panel--collapsible': collapsible, 'is-collapsed': collapsed }]\">\n <div v-if=\"hasHead\" :class=\"['ak-panel__head', { 'ak-panel__head--inverse': inverse }]\" data-no-toggle @click=\"onHeadClick\">\n <component :is=\"titleTag\" v-if=\"title || $slots.header\" class=\"ak-panel__title\">\n <span\n v-if=\"collapsible\"\n ref=\"toggle\"\n role=\"button\"\n tabindex=\"0\"\n :aria-expanded=\"expanded\"\n :aria-controls=\"`${id}-body`\"\n @keydown=\"onKey\"\n >\n <slot name=\"header\">{{ title }}</slot><span v-if=\"en\" class=\"ak-en\" lang=\"en\">{{ en }}</span>\n </span>\n <template v-else>\n <slot name=\"header\">{{ title }}</slot><span v-if=\"en\" class=\"ak-en\" lang=\"en\">{{ en }}</span>\n </template>\n </component>\n <slot name=\"header-extra\" />\n </div>\n <div :id=\"`${id}-body`\" class=\"ak-panel__body\"><slot /></div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 面板:带标题栏的容器(游戏内 announce panel)——标题栏表面 2 底、左侧 4px 主色条;标题后可跟 Bender 英文。\n * 与 AkCard 的分工:卡片是一件可并列 / 可点的东西,面板是页面上一块有名字的区域(首页「今日信息」「新增关卡」)。\n * collapsible 时点标题栏收起 / 展开(同 Naive NCollapseItem 的单项用法),展开状态是 v-model;\n * 键盘:标题文字是 role=\"button\"(在标题元素里面,h3 的大纲语义不丢,同 WAI-ARIA Accordion),Enter / Space 切换。\n */\nimport { computed, useId, useTemplateRef } from \"vue\";\n\ntype TitleTag = \"div\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\";\n\nconst props = withDefaults(\n defineProps<{\n /** 标题(也可用 #header 插槽) */\n title?: string;\n /** 标题后的英文(Bender 大写灰字:「Today」「Operations」) */\n en?: string;\n /** 标题元素:默认 div;面板是页面大纲里的一节时用 h2–h6(首页「新增关卡」是 h3) */\n titleTag?: TitleTag;\n /** 标题栏反转(亮色下黑底白字、暗色下白底黑字,同 .ak-inverse):公告这类要跳出来的区域 */\n inverse?: boolean;\n /** 可折叠:点标题栏收起 / 展开正文(右端出现 V 形箭头);需要有标题 */\n collapsible?: boolean;\n }>(),\n { title: undefined, en: undefined, titleTag: \"div\" },\n);\n\n/** 是否展开(collapsible 时有效);默认展开 */\nconst expanded = defineModel<boolean>({ default: true });\n\nconst slots = defineSlots<{\n /** 正文 */\n default?: () => unknown;\n /** 标题内容(代替 title) */\n header?: () => unknown;\n /** 标题栏右侧(标签、日期、按钮) */\n \"header-extra\"?: () => unknown;\n}>();\n\nconst id = useId();\nconst toggle = useTemplateRef<HTMLElement>(\"toggle\");\nconst hasHead = computed(() => !!props.title || !!slots.header || !!slots[\"header-extra\"]);\nconst collapsed = computed(() => props.collapsible && !expanded.value);\n\n/**\n * 整条标题栏都能点(同 CSS 的 cursor: pointer);标题栏里别的链接 / 按钮自己的点击不算。\n * 皮肤 / 预览脚本也会给纯 CSS 面板的标题栏点击翻 is-collapsed——标题栏上的 data-no-toggle 让它跳过这里(放在标题栏而不是根上,免得正文里的纯 CSS 芯片也被豁免),状态只看 v-model。\n */\nfunction onHeadClick(e: MouseEvent) {\n if (!props.collapsible) return;\n const hit = (e.target as Element).closest(\"a, button, input, select, textarea, label, [role='button']\");\n if (!hit || hit === toggle.value) expanded.value = !expanded.value;\n}\n\nfunction onKey(e: KeyboardEvent) {\n if (e.key !== \"Enter\" && e.key !== \" \") return;\n e.preventDefault();\n expanded.value = !expanded.value;\n}\n</script>\n\n<template>\n <div :class=\"['ak-panel', { 'ak-panel--collapsible': collapsible, 'is-collapsed': collapsed }]\">\n <div v-if=\"hasHead\" :class=\"['ak-panel__head', { 'ak-panel__head--inverse': inverse }]\" data-no-toggle @click=\"onHeadClick\">\n <component :is=\"titleTag\" v-if=\"title || $slots.header\" class=\"ak-panel__title\">\n <span\n v-if=\"collapsible\"\n ref=\"toggle\"\n role=\"button\"\n tabindex=\"0\"\n :aria-expanded=\"expanded\"\n :aria-controls=\"`${id}-body`\"\n @keydown=\"onKey\"\n >\n <slot name=\"header\">{{ title }}</slot><span v-if=\"en\" class=\"ak-en\" lang=\"en\">{{ en }}</span>\n </span>\n <template v-else>\n <slot name=\"header\">{{ title }}</slot><span v-if=\"en\" class=\"ak-en\" lang=\"en\">{{ en }}</span>\n </template>\n </component>\n <slot name=\"header-extra\" />\n </div>\n <div :id=\"`${id}-body`\" class=\"ak-panel__body\"><slot /></div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 区块标题:中文标题 + Bender 大写英文副题(「技能 SKILLS」),左侧主色粗竖条;右侧可放「查看全部 ›」这类附加。\n * Naive 没有对应组件(最近的是 NPageHeader 的 title / subtitle / #extra)。标题元素是真正的 h1–h6,进页面大纲。\n */\nimport { computed } from \"vue\";\n\nconst props = withDefaults(\n defineProps<{\n /** 标题(也可写在默认插槽里) */\n title?: string;\n /** 英文副题(Bender 大写灰字):并排时跟在标题右边,stack 时叠在标题上方当眉题(「Chapter 08」) */\n en?: string;\n /** 标题级别,渲染成 h1–h6 */\n level?: 1 | 2 | 3 | 4 | 5 | 6;\n /** 外观:bar 左侧主色粗竖条(默认)· underline 底线 + 左段 120px 主色粗线 */\n variant?: \"bar\" | \"underline\";\n /** 英文叠在标题上方(章节号、活动代号) */\n stack?: boolean;\n /** 尺寸:md = h2 字号(默认)· lg = display 字号(专题页 / 活动页头) */\n size?: \"md\" | \"lg\";\n }>(),\n { title: undefined, en: undefined, level: 2, variant: \"bar\", size: \"md\" },\n);\n\ndefineSlots<{\n /** 标题内容(代替 title) */\n default?: () => unknown;\n /** 右侧附加(链接、开关),推到最右 */\n extra?: () => unknown;\n}>();\n\nconst classes = computed(() => [\n \"ak-heading\",\n props.variant === \"underline\" && \"ak-heading--underline\",\n props.size === \"lg\" && \"ak-heading--lg\",\n { \"ak-heading--stack\": props.stack },\n]);\n</script>\n\n<template>\n <div :class=\"classes\">\n <span v-if=\"en && stack\" class=\"ak-heading__en\" lang=\"en\">{{ en }}</span>\n <component :is=\"`h${level}`\" class=\"ak-heading__title\"><slot>{{ title }}</slot></component>\n <span v-if=\"en && !stack\" class=\"ak-heading__en\" lang=\"en\">{{ en }}</span>\n <span v-if=\"$slots.extra\" class=\"ak-heading__aside\"><slot name=\"extra\" /></span>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 区块标题:中文标题 + Bender 大写英文副题(「技能 SKILLS」),左侧主色粗竖条;右侧可放「查看全部 ›」这类附加。\n * Naive 没有对应组件(最近的是 NPageHeader 的 title / subtitle / #extra)。标题元素是真正的 h1–h6,进页面大纲。\n */\nimport { computed } from \"vue\";\n\nconst props = withDefaults(\n defineProps<{\n /** 标题(也可写在默认插槽里) */\n title?: string;\n /** 英文副题(Bender 大写灰字):并排时跟在标题右边,stack 时叠在标题上方当眉题(「Chapter 08」) */\n en?: string;\n /** 标题级别,渲染成 h1–h6 */\n level?: 1 | 2 | 3 | 4 | 5 | 6;\n /** 外观:bar 左侧主色粗竖条(默认)· underline 底线 + 左段 120px 主色粗线 */\n variant?: \"bar\" | \"underline\";\n /** 英文叠在标题上方(章节号、活动代号) */\n stack?: boolean;\n /** 尺寸:md = h2 字号(默认)· lg = display 字号(专题页 / 活动页头) */\n size?: \"md\" | \"lg\";\n }>(),\n { title: undefined, en: undefined, level: 2, variant: \"bar\", size: \"md\" },\n);\n\ndefineSlots<{\n /** 标题内容(代替 title) */\n default?: () => unknown;\n /** 右侧附加(链接、开关),推到最右 */\n extra?: () => unknown;\n}>();\n\nconst classes = computed(() => [\n \"ak-heading\",\n props.variant === \"underline\" && \"ak-heading--underline\",\n props.size === \"lg\" && \"ak-heading--lg\",\n { \"ak-heading--stack\": props.stack },\n]);\n</script>\n\n<template>\n <div :class=\"classes\">\n <span v-if=\"en && stack\" class=\"ak-heading__en\" lang=\"en\">{{ en }}</span>\n <component :is=\"`h${level}`\" class=\"ak-heading__title\"><slot>{{ title }}</slot></component>\n <span v-if=\"en && !stack\" class=\"ak-heading__en\" lang=\"en\">{{ en }}</span>\n <span v-if=\"$slots.extra\" class=\"ak-heading__aside\"><slot name=\"extra\" /></span>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 分隔线(= Naive 的 NDivider):默认 <hr>;默认插槽写了文字就是「——文字——」(小号大写标签字,两侧线段);vertical 是行内竖线。\n */\nimport { computed } from \"vue\";\n\nconst props = withDefaults(\n defineProps<{\n /** 外观:default 1px 线 · accent 左段 80px 主色 + 其余 1 色线(2px 高)· stripes 6px 斜纹带;带文字 / 竖线时不适用 */\n variant?: \"default\" | \"accent\" | \"stripes\";\n /** 竖线:行内 1px × 1em,隔开同一行里的几项(「编辑 | 历史」) */\n vertical?: boolean;\n }>(),\n { variant: \"default\" },\n);\n\ndefineSlots<{\n /** 线中间的文字(同 Naive 的标题);竖线时不适用 */\n default?: () => unknown;\n}>();\n\nconst classes = computed(() => [\"ak-divider\", props.variant !== \"default\" && `ak-divider--${props.variant}`]);\n</script>\n\n<template>\n <span v-if=\"vertical\" class=\"ak-divider ak-divider--vertical\" role=\"separator\" aria-orientation=\"vertical\" />\n <div v-else-if=\"$slots.default\" class=\"ak-divider ak-divider--text\" role=\"separator\"><slot /></div>\n <hr v-else :class=\"classes\" />\n</template>\n","<script setup lang=\"ts\">\n/**\n * 分隔线(= Naive 的 NDivider):默认 <hr>;默认插槽写了文字就是「——文字——」(小号大写标签字,两侧线段);vertical 是行内竖线。\n */\nimport { computed } from \"vue\";\n\nconst props = withDefaults(\n defineProps<{\n /** 外观:default 1px 线 · accent 左段 80px 主色 + 其余 1 色线(2px 高)· stripes 6px 斜纹带;带文字 / 竖线时不适用 */\n variant?: \"default\" | \"accent\" | \"stripes\";\n /** 竖线:行内 1px × 1em,隔开同一行里的几项(「编辑 | 历史」) */\n vertical?: boolean;\n }>(),\n { variant: \"default\" },\n);\n\ndefineSlots<{\n /** 线中间的文字(同 Naive 的标题);竖线时不适用 */\n default?: () => unknown;\n}>();\n\nconst classes = computed(() => [\"ak-divider\", props.variant !== \"default\" && `ak-divider--${props.variant}`]);\n</script>\n\n<template>\n <span v-if=\"vertical\" class=\"ak-divider ak-divider--vertical\" role=\"separator\" aria-orientation=\"vertical\" />\n <div v-else-if=\"$slots.default\" class=\"ak-divider ak-divider--text\" role=\"separator\"><slot /></div>\n <hr v-else :class=\"classes\" />\n</template>\n","import type { InjectionKey } from \"vue\";\n\nexport type AvatarSize = \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n\n/** AkAvatarGroup 给组内 AkAvatar 的默认尺寸(同 Naive 的 NAvatarGroup size) */\nexport const avatarGroupKey: InjectionKey<{ size?: AvatarSize }> = Symbol(\"AkAvatarGroup\");\n","<script setup lang=\"ts\">\n/** 头像(= Naive 的 NAvatar):直角 1px 边的方块,图片铺满;没有图 / 图挂了时显示默认插槽的文字(「DR」「+9」)。 */\nimport { computed, inject, ref, watch } from \"vue\";\n\nimport { avatarGroupKey, type AvatarSize } from \"./context\";\n\nconst props = withDefaults(\n defineProps<{\n /** 图片地址(干员头像等);不写或加载失败时显示默认插槽的文字 */\n src?: string;\n /** 图片替代文本:旁边已经写了名字时留空(默认),头像单独出现时写人名 */\n alt?: string;\n /** 尺寸:xs 24 · sm 32 · md 40 · lg 56 · xl 80(px);不写时跟 AkAvatarGroup,再不然是 md */\n size?: AvatarSize;\n /** 圆形(系统默认直角,只给用户头像这类确需时用) */\n round?: boolean;\n /** 右下角绿色状态点(在线 / 可用):纯视觉,含义要在旁边的文字里说出来 */\n status?: boolean;\n }>(),\n { src: undefined, alt: \"\", size: undefined },\n);\n\ndefineSlots<{\n /** 没有图片时显示的文字(缩写、「+9」) */\n default?: () => unknown;\n}>();\n\nconst group = inject(avatarGroupKey, null);\nconst size = computed(() => props.size ?? group?.size ?? \"md\");\n\n/** 图片加载失败就退回文字(同 Naive 的 fallback);换了地址重新试 */\nconst failed = ref(false);\nwatch(\n () => props.src,\n () => (failed.value = false),\n);\n\nconst classes = computed(() => [\"ak-avatar\", size.value !== \"md\" && `ak-avatar--${size.value}`, { \"ak-avatar--round\": props.round }]);\n</script>\n\n<template>\n <span :class=\"classes\">\n <img v-if=\"src && !failed\" :src=\"src\" :alt=\"alt\" @error=\"failed = true\" />\n <slot v-else />\n <span v-if=\"status\" class=\"ak-avatar__status\" aria-hidden=\"true\" />\n </span>\n</template>\n","<script setup lang=\"ts\">\n/** 头像(= Naive 的 NAvatar):直角 1px 边的方块,图片铺满;没有图 / 图挂了时显示默认插槽的文字(「DR」「+9」)。 */\nimport { computed, inject, ref, watch } from \"vue\";\n\nimport { avatarGroupKey, type AvatarSize } from \"./context\";\n\nconst props = withDefaults(\n defineProps<{\n /** 图片地址(干员头像等);不写或加载失败时显示默认插槽的文字 */\n src?: string;\n /** 图片替代文本:旁边已经写了名字时留空(默认),头像单独出现时写人名 */\n alt?: string;\n /** 尺寸:xs 24 · sm 32 · md 40 · lg 56 · xl 80(px);不写时跟 AkAvatarGroup,再不然是 md */\n size?: AvatarSize;\n /** 圆形(系统默认直角,只给用户头像这类确需时用) */\n round?: boolean;\n /** 右下角绿色状态点(在线 / 可用):纯视觉,含义要在旁边的文字里说出来 */\n status?: boolean;\n }>(),\n { src: undefined, alt: \"\", size: undefined },\n);\n\ndefineSlots<{\n /** 没有图片时显示的文字(缩写、「+9」) */\n default?: () => unknown;\n}>();\n\nconst group = inject(avatarGroupKey, null);\nconst size = computed(() => props.size ?? group?.size ?? \"md\");\n\n/** 图片加载失败就退回文字(同 Naive 的 fallback);换了地址重新试 */\nconst failed = ref(false);\nwatch(\n () => props.src,\n () => (failed.value = false),\n);\n\nconst classes = computed(() => [\"ak-avatar\", size.value !== \"md\" && `ak-avatar--${size.value}`, { \"ak-avatar--round\": props.round }]);\n</script>\n\n<template>\n <span :class=\"classes\">\n <img v-if=\"src && !failed\" :src=\"src\" :alt=\"alt\" @error=\"failed = true\" />\n <slot v-else />\n <span v-if=\"status\" class=\"ak-avatar__status\" aria-hidden=\"true\" />\n </span>\n</template>\n","<script setup lang=\"ts\">\n/** 一叠头像(= Naive 的 NAvatarGroup):后一枚压前一枚 8px。给 options 由组件画(可用 max 收成「+N」),或者在默认插槽里直接放 AkAvatar。 */\nimport { computed, provide } from \"vue\";\n\nimport AkAvatar from \"./AkAvatar.vue\";\nimport { avatarGroupKey, type AvatarSize } from \"./context\";\n\nexport interface AvatarOption {\n /** 图片地址 */\n src: string;\n /** 替代文本(人名);组有意义时每枚都写 */\n alt?: string;\n}\n\nconst props = withDefaults(\n defineProps<{\n /** 头像列表(同 Naive 的 options);不写就用默认插槽里的 AkAvatar */\n options?: AvatarOption[];\n /** 最多画几枚,其余收成一枚「+N」(只对 options 生效) */\n max?: number;\n /** 组内头像的尺寸(头像自己写了 size 以头像为准) */\n size?: AvatarSize;\n /** 读屏用的组名(「参与干员」) */\n label?: string;\n }>(),\n { options: undefined, max: undefined, size: undefined, label: undefined },\n);\n\ndefineSlots<{\n /** 若干 AkAvatar(不用 options 时) */\n default?: () => unknown;\n}>();\n\nprovide(avatarGroupKey, props);\n\nconst shown = computed(() => (props.options && props.max !== undefined ? props.options.slice(0, props.max) : (props.options ?? [])));\nconst rest = computed(() => (props.options?.length ?? 0) - shown.value.length);\n</script>\n\n<template>\n <div class=\"ak-avatar-group\" :role=\"label ? 'group' : undefined\" :aria-label=\"label\">\n <template v-if=\"options\">\n <AkAvatar v-for=\"(o, i) in shown\" :key=\"i\" :src=\"o.src\" :alt=\"o.alt\" />\n <AkAvatar v-if=\"rest > 0\">+{{ rest }}</AkAvatar>\n </template>\n <slot v-else />\n </div>\n</template>\n","<script setup lang=\"ts\">\n/** 一叠头像(= Naive 的 NAvatarGroup):后一枚压前一枚 8px。给 options 由组件画(可用 max 收成「+N」),或者在默认插槽里直接放 AkAvatar。 */\nimport { computed, provide } from \"vue\";\n\nimport AkAvatar from \"./AkAvatar.vue\";\nimport { avatarGroupKey, type AvatarSize } from \"./context\";\n\nexport interface AvatarOption {\n /** 图片地址 */\n src: string;\n /** 替代文本(人名);组有意义时每枚都写 */\n alt?: string;\n}\n\nconst props = withDefaults(\n defineProps<{\n /** 头像列表(同 Naive 的 options);不写就用默认插槽里的 AkAvatar */\n options?: AvatarOption[];\n /** 最多画几枚,其余收成一枚「+N」(只对 options 生效) */\n max?: number;\n /** 组内头像的尺寸(头像自己写了 size 以头像为准) */\n size?: AvatarSize;\n /** 读屏用的组名(「参与干员」) */\n label?: string;\n }>(),\n { options: undefined, max: undefined, size: undefined, label: undefined },\n);\n\ndefineSlots<{\n /** 若干 AkAvatar(不用 options 时) */\n default?: () => unknown;\n}>();\n\nprovide(avatarGroupKey, props);\n\nconst shown = computed(() => (props.options && props.max !== undefined ? props.options.slice(0, props.max) : (props.options ?? [])));\nconst rest = computed(() => (props.options?.length ?? 0) - shown.value.length);\n</script>\n\n<template>\n <div class=\"ak-avatar-group\" :role=\"label ? 'group' : undefined\" :aria-label=\"label\">\n <template v-if=\"options\">\n <AkAvatar v-for=\"(o, i) in shown\" :key=\"i\" :src=\"o.src\" :alt=\"o.alt\" />\n <AkAvatar v-if=\"rest > 0\">+{{ rest }}</AkAvatar>\n </template>\n <slot v-else />\n </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 空状态(= Naive 的 NEmpty):虚线框里居中一枚线稿图标 + 标题 + 说明 + 可选的操作。\n * 404 / 403 这类页面级的空,用 code 换成大号状态码。\n */\nimport type { IconName } from \"../../icons\";\nimport AkIcon from \"../Icon/AkIcon.vue\";\n\nwithDefaults(\n defineProps<{\n /** 标题(粗体一行);传空串不显示 */\n title?: string;\n /** 说明文字(小字,标题下一行);要放链接时改用默认插槽 */\n description?: string;\n /** 大号状态码(404 / 403):放在图标的位置,写了就不显示图标 */\n code?: string;\n /** 图标(48px 半透明线稿);false 不显示 */\n icon?: IconName | false;\n }>(),\n { title: \"暂无数据\", description: undefined, code: undefined, icon: \"empty\" },\n);\n\ndefineSlots<{\n /** 说明(代替 description) */\n default?: () => unknown;\n /** 自定义图标(代替 icon);自己加 class=\"ak-empty__icon\" 得到 48px 半透明 */\n icon?: () => unknown;\n /** 说明下方的操作(按钮 / 链接) */\n extra?: () => unknown;\n}>();\n</script>\n\n<template>\n <div class=\"ak-empty\">\n <span v-if=\"code\" class=\"ak-empty__code\">{{ code }}</span>\n <slot v-else name=\"icon\"><AkIcon v-if=\"icon\" :name=\"icon\" class=\"ak-empty__icon\" /></slot>\n <div v-if=\"title\" class=\"ak-empty__title\">{{ title }}</div>\n <div v-if=\"description || $slots.default\" class=\"ak-fs-xs\"><slot>{{ description }}</slot></div>\n <div v-if=\"$slots.extra\" class=\"ak-flex ak-wrap ak-gap-2 ak-justify-center ak-mt-2\"><slot name=\"extra\" /></div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 空状态(= Naive 的 NEmpty):虚线框里居中一枚线稿图标 + 标题 + 说明 + 可选的操作。\n * 404 / 403 这类页面级的空,用 code 换成大号状态码。\n */\nimport type { IconName } from \"../../icons\";\nimport AkIcon from \"../Icon/AkIcon.vue\";\n\nwithDefaults(\n defineProps<{\n /** 标题(粗体一行);传空串不显示 */\n title?: string;\n /** 说明文字(小字,标题下一行);要放链接时改用默认插槽 */\n description?: string;\n /** 大号状态码(404 / 403):放在图标的位置,写了就不显示图标 */\n code?: string;\n /** 图标(48px 半透明线稿);false 不显示 */\n icon?: IconName | false;\n }>(),\n { title: \"暂无数据\", description: undefined, code: undefined, icon: \"empty\" },\n);\n\ndefineSlots<{\n /** 说明(代替 description) */\n default?: () => unknown;\n /** 自定义图标(代替 icon);自己加 class=\"ak-empty__icon\" 得到 48px 半透明 */\n icon?: () => unknown;\n /** 说明下方的操作(按钮 / 链接) */\n extra?: () => unknown;\n}>();\n</script>\n\n<template>\n <div class=\"ak-empty\">\n <span v-if=\"code\" class=\"ak-empty__code\">{{ code }}</span>\n <slot v-else name=\"icon\"><AkIcon v-if=\"icon\" :name=\"icon\" class=\"ak-empty__icon\" /></slot>\n <div v-if=\"title\" class=\"ak-empty__title\">{{ title }}</div>\n <div v-if=\"description || $slots.default\" class=\"ak-fs-xs\"><slot>{{ description }}</slot></div>\n <div v-if=\"$slots.extra\" class=\"ak-flex ak-wrap ak-gap-2 ak-justify-center ak-mt-2\"><slot name=\"extra\" /></div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 骨架占位(= Naive 的 NSkeleton):内容到之前先占住它的形状,底色两级表面之间扫光。\n * 骨架对读屏隐藏(aria-hidden);「正在加载」由外层容器的 aria-busy 或 AkSpinner 报。\n */\nimport { computed } from \"vue\";\n\ndefineOptions({ inheritAttrs: false });\n\nconst props = withDefaults(\n defineProps<{\n /** 文字行:.9em 高、上下 .35em 间距;一组里最后一行 60% 宽 */\n text?: boolean;\n /** 圆形(头像占位):宽高相等,由 width 定 */\n circle?: boolean;\n /** 方形(道具 / 头像占位):宽高相等,由 width 定 */\n square?: boolean;\n /** 重复几个(同 Naive):配 text 画一段文字 */\n repeat?: number;\n /** 宽度:数字按 px,字符串原样(\"60%\");不写时占满一行 */\n width?: number | string;\n /** 高度:数字按 px;不写时 1em(text 时 .9em,圆 / 方形跟宽度) */\n height?: number | string;\n }>(),\n { repeat: 1, width: undefined, height: undefined },\n);\n\nconst classes = computed(() => [\n \"ak-skeleton\",\n { \"ak-skeleton--text\": props.text, \"ak-skeleton--circle\": props.circle, \"ak-skeleton--square\": props.square && !props.circle },\n]);\n\nconst px = (v: number | string | undefined) => (typeof v === \"number\" ? `${v}px` : v);\n/** 宽高是每一处占位自己的数据(同 Naive 的 width / height),CSS 里没有对应的类 */\nconst size = computed(() => (props.width === undefined && props.height === undefined ? undefined : { width: px(props.width), height: px(props.height) }));\n</script>\n\n<template>\n <span v-for=\"i in repeat\" :key=\"i\" v-bind=\"$attrs\" :class=\"classes\" :style=\"size\" aria-hidden=\"true\" />\n</template>\n","<script setup lang=\"ts\">\n/**\n * 骨架占位(= Naive 的 NSkeleton):内容到之前先占住它的形状,底色两级表面之间扫光。\n * 骨架对读屏隐藏(aria-hidden);「正在加载」由外层容器的 aria-busy 或 AkSpinner 报。\n */\nimport { computed } from \"vue\";\n\ndefineOptions({ inheritAttrs: false });\n\nconst props = withDefaults(\n defineProps<{\n /** 文字行:.9em 高、上下 .35em 间距;一组里最后一行 60% 宽 */\n text?: boolean;\n /** 圆形(头像占位):宽高相等,由 width 定 */\n circle?: boolean;\n /** 方形(道具 / 头像占位):宽高相等,由 width 定 */\n square?: boolean;\n /** 重复几个(同 Naive):配 text 画一段文字 */\n repeat?: number;\n /** 宽度:数字按 px,字符串原样(\"60%\");不写时占满一行 */\n width?: number | string;\n /** 高度:数字按 px;不写时 1em(text 时 .9em,圆 / 方形跟宽度) */\n height?: number | string;\n }>(),\n { repeat: 1, width: undefined, height: undefined },\n);\n\nconst classes = computed(() => [\n \"ak-skeleton\",\n { \"ak-skeleton--text\": props.text, \"ak-skeleton--circle\": props.circle, \"ak-skeleton--square\": props.square && !props.circle },\n]);\n\nconst px = (v: number | string | undefined) => (typeof v === \"number\" ? `${v}px` : v);\n/** 宽高是每一处占位自己的数据(同 Naive 的 width / height),CSS 里没有对应的类 */\nconst size = computed(() => (props.width === undefined && props.height === undefined ? undefined : { width: px(props.width), height: px(props.height) }));\n</script>\n\n<template>\n <span v-for=\"i in repeat\" :key=\"i\" v-bind=\"$attrs\" :class=\"classes\" :style=\"size\" aria-hidden=\"true\" />\n</template>\n","<script setup lang=\"ts\">\n/**\n * 加载中(= Naive 的 NSpin)。三种输出:\n * - 只有图形:<span class=\"ak-spinner\" role=\"status\" aria-label>\n * - 有 description:.ak-spin(图形 + 说明竖排)\n * - 默认插槽包住内容:.ak-spin-container,show 时内容压淡不可点、.ak-spin 叠在正中,容器 aria-busy\n */\nimport { computed } from \"vue\";\n\nconst props = withDefaults(\n defineProps<{\n /** 样子:diamond 菱形涟漪(游戏内 loading,默认)· bars 三根竖条(行内、更轻) */\n variant?: \"diamond\" | \"bars\";\n /** 说明文字,排在图形下方(同 Naive) */\n description?: string;\n /** 包住内容时是否在加载(同 Naive);不包内容时无效,要藏起来直接 v-if */\n show?: boolean;\n /** 换色:写到 CSS 的 --_c(只对 diamond 生效),如 \"var(--ak-yellow-500)\" */\n color?: string;\n /** 读屏文本;有 description 时念 description */\n label?: string;\n }>(),\n { variant: \"diamond\", description: undefined, show: true, color: undefined, label: \"加载中\" },\n);\n\ndefineSlots<{\n /** 正在加载的内容:加载层叠在它上面 */\n default?: () => unknown;\n /** 说明(代替 description) */\n description?: () => unknown;\n}>();\n\nconst graphicClass = computed(() => (props.variant === \"bars\" ? \"ak-loader\" : \"ak-spinner\"));\n/** --_c 是 .ak-spinner 约定的换色接口(spinner.css 头注),不是随手写的内联样式 */\nconst graphicStyle = computed(() => (props.color && props.variant === \"diamond\" ? { \"--_c\": props.color } : undefined));\n</script>\n\n<template>\n <div v-if=\"$slots.default\" class=\"ak-spin-container\" :aria-busy=\"show\">\n <div class=\"ak-spin-container__content\"><slot /></div>\n <div v-if=\"show\" class=\"ak-spin\" role=\"status\">\n <span :class=\"graphicClass\" :style=\"graphicStyle\" aria-hidden=\"true\"><template v-if=\"variant === 'bars'\"><i /><i /><i /></template></span>\n <span v-if=\"description || $slots.description\" class=\"ak-spin__desc\"><slot name=\"description\">{{ description }}</slot></span>\n <span v-else class=\"ak-sr-only\">{{ label }}</span>\n </div>\n </div>\n <div v-else-if=\"description || $slots.description\" class=\"ak-spin\" role=\"status\">\n <span :class=\"graphicClass\" :style=\"graphicStyle\" aria-hidden=\"true\"><template v-if=\"variant === 'bars'\"><i /><i /><i /></template></span>\n <span class=\"ak-spin__desc\"><slot name=\"description\">{{ description }}</slot></span>\n </div>\n <span v-else :class=\"graphicClass\" :style=\"graphicStyle\" role=\"status\" :aria-label=\"label\">\n <template v-if=\"variant === 'bars'\"><i /><i /><i /></template>\n </span>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 加载中(= Naive 的 NSpin)。三种输出:\n * - 只有图形:<span class=\"ak-spinner\" role=\"status\" aria-label>\n * - 有 description:.ak-spin(图形 + 说明竖排)\n * - 默认插槽包住内容:.ak-spin-container,show 时内容压淡不可点、.ak-spin 叠在正中,容器 aria-busy\n */\nimport { computed } from \"vue\";\n\nconst props = withDefaults(\n defineProps<{\n /** 样子:diamond 菱形涟漪(游戏内 loading,默认)· bars 三根竖条(行内、更轻) */\n variant?: \"diamond\" | \"bars\";\n /** 说明文字,排在图形下方(同 Naive) */\n description?: string;\n /** 包住内容时是否在加载(同 Naive);不包内容时无效,要藏起来直接 v-if */\n show?: boolean;\n /** 换色:写到 CSS 的 --_c(只对 diamond 生效),如 \"var(--ak-yellow-500)\" */\n color?: string;\n /** 读屏文本;有 description 时念 description */\n label?: string;\n }>(),\n { variant: \"diamond\", description: undefined, show: true, color: undefined, label: \"加载中\" },\n);\n\ndefineSlots<{\n /** 正在加载的内容:加载层叠在它上面 */\n default?: () => unknown;\n /** 说明(代替 description) */\n description?: () => unknown;\n}>();\n\nconst graphicClass = computed(() => (props.variant === \"bars\" ? \"ak-loader\" : \"ak-spinner\"));\n/** --_c 是 .ak-spinner 约定的换色接口(spinner.css 头注),不是随手写的内联样式 */\nconst graphicStyle = computed(() => (props.color && props.variant === \"diamond\" ? { \"--_c\": props.color } : undefined));\n</script>\n\n<template>\n <div v-if=\"$slots.default\" class=\"ak-spin-container\" :aria-busy=\"show\">\n <div class=\"ak-spin-container__content\"><slot /></div>\n <div v-if=\"show\" class=\"ak-spin\" role=\"status\">\n <span :class=\"graphicClass\" :style=\"graphicStyle\" aria-hidden=\"true\"><template v-if=\"variant === 'bars'\"><i /><i /><i /></template></span>\n <span v-if=\"description || $slots.description\" class=\"ak-spin__desc\"><slot name=\"description\">{{ description }}</slot></span>\n <span v-else class=\"ak-sr-only\">{{ label }}</span>\n </div>\n </div>\n <div v-else-if=\"description || $slots.description\" class=\"ak-spin\" role=\"status\">\n <span :class=\"graphicClass\" :style=\"graphicStyle\" aria-hidden=\"true\"><template v-if=\"variant === 'bars'\"><i /><i /><i /></template></span>\n <span class=\"ak-spin__desc\"><slot name=\"description\">{{ description }}</slot></span>\n </div>\n <span v-else :class=\"graphicClass\" :style=\"graphicStyle\" role=\"status\" :aria-label=\"label\">\n <template v-if=\"variant === 'bars'\"><i /><i /><i /></template>\n </span>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nimport type { IconName } from \"../../icons\";\nimport AkIcon from \"../Icon/AkIcon.vue\";\n\nexport type MessageVariant = \"info\" | \"success\" | \"warning\" | \"danger\" | \"neutral\" | \"accent\";\n\n/** 界面 / 系统反馈的提示条(同 Naive 的 NAlert):左色条 + 淡底;编辑写在正文里的提示用 AkCbox */\nconst props = withDefaults(\n defineProps<{\n /** 外观(等级色):info 蓝(默认)· success 绿 · warning 黄 · danger 红 · neutral 灰 · accent 主色 */\n variant?: MessageVariant;\n /** 加粗的标题行(等级色);要带链接 / 格式时用 #header 插槽 */\n title?: string;\n /** 图标;默认按 variant:success → check,warning / danger → warn,其余 → info */\n icon?: IconName;\n /** 显示图标(同 Naive 的 show-icon) */\n showIcon?: boolean;\n /** 右侧 ✕ 关闭按钮:点了隐藏自己(v-model 变 false)并触发 close */\n closable?: boolean;\n /** 横幅:顶边 3px 色条、文字居中——站点公告 / 页顶通知 */\n banner?: boolean;\n /** 叠斜纹(危险横幅,配 variant=\"danger\") */\n stripes?: boolean;\n }>(),\n { variant: \"info\", title: undefined, icon: undefined, showIcon: true },\n);\n\n/** 是否显示;不绑定时自己管(关掉就没了),绑定了可以再打开 */\nconst show = defineModel<boolean>({ default: true });\n\nconst emit = defineEmits<{\n /** 点了关闭按钮(之后自己隐藏) */\n close: [];\n}>();\n\ndefineSlots<{\n /** 正文 */\n default?: () => unknown;\n /** 标题行(代替 title) */\n header?: () => unknown;\n /** 图标(代替 icon;放进 20px 的图标位,颜色跟等级色) */\n icon?: () => unknown;\n}>();\n\nconst DEFAULT_ICON: Record<MessageVariant, IconName> = {\n info: \"info\",\n success: \"check\",\n warning: \"warn\",\n danger: \"warn\",\n neutral: \"info\",\n accent: \"info\",\n};\n\nconst classes = computed(() => [\n \"ak-message\",\n props.variant !== \"info\" && `ak-message--${props.variant}`,\n { \"ak-message--banner\": props.banner, \"ak-message--stripes\": props.stripes },\n]);\n\nfunction close() {\n show.value = false;\n emit(\"close\");\n}\n</script>\n\n<template>\n <!-- 警告 / 危险是 alert(动态插入时读屏立刻念),其余是 status(礼貌播报) -->\n <div v-if=\"show\" :class=\"classes\" :role=\"variant === 'warning' || variant === 'danger' ? 'alert' : 'status'\">\n <template v-if=\"showIcon\">\n <span v-if=\"$slots.icon\" class=\"ak-message__icon\"><slot name=\"icon\" /></span>\n <AkIcon v-else :name=\"icon ?? DEFAULT_ICON[variant]\" class=\"ak-message__icon\" />\n </template>\n <div class=\"ak-message__body\">\n <div v-if=\"title || $slots.header\" class=\"ak-message__title\"><slot name=\"header\">{{ title }}</slot></div>\n <slot />\n </div>\n <button v-if=\"closable\" type=\"button\" class=\"ak-message__close\" aria-label=\"关闭\" @click=\"close\">✕</button>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nimport type { IconName } from \"../../icons\";\nimport AkIcon from \"../Icon/AkIcon.vue\";\n\nexport type MessageVariant = \"info\" | \"success\" | \"warning\" | \"danger\" | \"neutral\" | \"accent\";\n\n/** 界面 / 系统反馈的提示条(同 Naive 的 NAlert):左色条 + 淡底;编辑写在正文里的提示用 AkCbox */\nconst props = withDefaults(\n defineProps<{\n /** 外观(等级色):info 蓝(默认)· success 绿 · warning 黄 · danger 红 · neutral 灰 · accent 主色 */\n variant?: MessageVariant;\n /** 加粗的标题行(等级色);要带链接 / 格式时用 #header 插槽 */\n title?: string;\n /** 图标;默认按 variant:success → check,warning / danger → warn,其余 → info */\n icon?: IconName;\n /** 显示图标(同 Naive 的 show-icon) */\n showIcon?: boolean;\n /** 右侧 ✕ 关闭按钮:点了隐藏自己(v-model 变 false)并触发 close */\n closable?: boolean;\n /** 横幅:顶边 3px 色条、文字居中——站点公告 / 页顶通知 */\n banner?: boolean;\n /** 叠斜纹(危险横幅,配 variant=\"danger\") */\n stripes?: boolean;\n }>(),\n { variant: \"info\", title: undefined, icon: undefined, showIcon: true },\n);\n\n/** 是否显示;不绑定时自己管(关掉就没了),绑定了可以再打开 */\nconst show = defineModel<boolean>({ default: true });\n\nconst emit = defineEmits<{\n /** 点了关闭按钮(之后自己隐藏) */\n close: [];\n}>();\n\ndefineSlots<{\n /** 正文 */\n default?: () => unknown;\n /** 标题行(代替 title) */\n header?: () => unknown;\n /** 图标(代替 icon;放进 20px 的图标位,颜色跟等级色) */\n icon?: () => unknown;\n}>();\n\nconst DEFAULT_ICON: Record<MessageVariant, IconName> = {\n info: \"info\",\n success: \"check\",\n warning: \"warn\",\n danger: \"warn\",\n neutral: \"info\",\n accent: \"info\",\n};\n\nconst classes = computed(() => [\n \"ak-message\",\n props.variant !== \"info\" && `ak-message--${props.variant}`,\n { \"ak-message--banner\": props.banner, \"ak-message--stripes\": props.stripes },\n]);\n\nfunction close() {\n show.value = false;\n emit(\"close\");\n}\n</script>\n\n<template>\n <!-- 警告 / 危险是 alert(动态插入时读屏立刻念),其余是 status(礼貌播报) -->\n <div v-if=\"show\" :class=\"classes\" :role=\"variant === 'warning' || variant === 'danger' ? 'alert' : 'status'\">\n <template v-if=\"showIcon\">\n <span v-if=\"$slots.icon\" class=\"ak-message__icon\"><slot name=\"icon\" /></span>\n <AkIcon v-else :name=\"icon ?? DEFAULT_ICON[variant]\" class=\"ak-message__icon\" />\n </template>\n <div class=\"ak-message__body\">\n <div v-if=\"title || $slots.header\" class=\"ak-message__title\"><slot name=\"header\">{{ title }}</slot></div>\n <slot />\n </div>\n <button v-if=\"closable\" type=\"button\" class=\"ak-message__close\" aria-label=\"关闭\" @click=\"close\">✕</button>\n </div>\n</template>\n","import { Comment, Fragment, Text, cloneVNode, h, type VNode } from \"vue\";\n\n/** 原生就在 Tab 顺序里的标签(a 要有 href 才算,交给调用方自己保证) */\nconst FOCUSABLE = new Set([\"a\", \"button\", \"input\", \"select\", \"textarea\", \"summary\"]);\n\nconst flatten = (nodes: VNode[]): VNode[] =>\n nodes.flatMap(n => (n.type === Fragment && Array.isArray(n.children) ? flatten(n.children as VNode[]) : n.type === Comment ? [] : [n]));\n\n/** 触发元素(插槽里第一个元素 / 组件)自己写的 id;只有文字、没写时 undefined */\nexport function firstId(nodes: VNode[] | undefined): string | undefined {\n const first = flatten(nodes ?? []).find(n => n.type !== Text || String(n.children).trim());\n const id = first && first.type !== Text ? first.props?.id : undefined;\n return id == null || id === \"\" ? undefined : String(id);\n}\n\n/**\n * 触发元素写在插槽里(同 Naive 的 NPopover #trigger / NDropdown 默认插槽):取第一个元素 / 组件 vnode 克隆一份,\n * 补上 ARIA 属性与事件(与它自己的合并,不覆盖)。只有文字时包一层 <span>;\n * focusable 时,原生不可聚焦的元素(span / abbr / img …)补 tabindex=\"0\",键盘也能触发——组件(AkButton 等)假定自己渲染可聚焦元素。\n */\nexport function decorateTrigger(nodes: VNode[] | undefined, extra: Record<string, unknown>, focusable = true): VNode | undefined {\n const list = flatten(nodes ?? []).filter(n => n.type !== Text || String(n.children).trim());\n const first = list[0];\n if (!first) return undefined;\n if (first.type === Text) return h(\"span\", { tabindex: focusable ? 0 : undefined, ...extra }, list);\n const p = first.props ?? {};\n const needsTab = focusable && typeof first.type === \"string\" && !FOCUSABLE.has(first.type) && p.tabindex == null && p.tabIndex == null;\n return cloneVNode(first, needsTab ? { tabindex: 0, ...extra } : extra, true);\n}\n\n/** 把 vnode 原样渲染;定义在组件外保持同一个组件类型,重渲染时不重建(同 AkTabs) */\nexport const Render = (p: { content: unknown }) => (typeof p.content === \"function\" ? p.content() : p.content);\n","import { computed, onBeforeUnmount, watch, type Ref } from \"vue\";\n\nexport type PopoverPlacement = \"top\" | \"top-start\" | \"top-end\" | \"bottom\" | \"bottom-start\" | \"bottom-end\" | \"left\" | \"right\";\nexport type PopoverTrigger = \"hover\" | \"click\" | \"focus\" | \"manual\";\n\nexport interface PopoverBaseProps {\n trigger: PopoverTrigger;\n delay: number;\n duration: number;\n disabled?: boolean;\n}\n\n/**\n * AkTooltip / AkPopover 共用的开合逻辑(同 Naive 的 NPopover):\n * hover = 悬停(delay 后出现、离开 duration 后消失,能移进气泡里)+ 键盘聚焦 · focus = 只看聚焦 · click = 点触发元素开合、点外面关 · manual = 只听 v-model。\n * 任何方式打开的都能按 Esc 关(WAI-ARIA Tooltip)。事件挂在外层 .ak-tip-anchor 上(气泡是它的后代,移进气泡不算离开)。\n */\nexport function usePopover(props: PopoverBaseProps, model: Ref<boolean | undefined>, anchor: Ref<HTMLElement | null>) {\n let timer: ReturnType<typeof setTimeout> | undefined;\n const open = computed(() => !!model.value && !props.disabled);\n\n function set(v: boolean, wait = 0) {\n clearTimeout(timer);\n if (wait > 0) timer = setTimeout(() => (model.value = v), wait);\n else model.value = v;\n }\n\n const hover = () => props.trigger === \"hover\";\n const focus = () => props.trigger === \"hover\" || props.trigger === \"focus\";\n\n const anchorOn = {\n mouseenter: () => hover() && set(true, props.delay),\n mouseleave: () => hover() && set(false, props.duration),\n focusin: () => focus() && set(true),\n focusout: (e: FocusEvent) => {\n if (focus() && !anchor.value?.contains(e.relatedTarget as Node | null)) set(false);\n },\n keydown: (e: KeyboardEvent) => {\n if (e.key !== \"Escape\" || !open.value) return;\n e.preventDefault(); // 在对话框里时别顺带把对话框也关了\n e.stopPropagation();\n // 触发元素是 anchor 的第一个子元素,气泡在它后面:焦点在气泡里时关掉后还给触发元素\n const trigger = anchor.value?.firstElementChild as HTMLElement | null | undefined;\n const inBubble = !trigger?.contains(e.target as Node);\n set(false);\n if (inBubble) trigger?.focus();\n },\n };\n\n /** 给触发元素:click 模式开合 */\n const onTriggerClick = () => {\n if (props.trigger === \"click\" && !props.disabled) set(!model.value);\n };\n\n /** click 模式:点外面关(监听挂在 anchor 所在的文档上——示例在 iframe 里时不是全局 document) */\n function onOutside(e: PointerEvent) {\n if (!anchor.value?.contains(e.target as Node)) set(false);\n }\n let doc: Document | undefined;\n watch(\n () => open.value && props.trigger === \"click\",\n on => {\n doc?.removeEventListener(\"pointerdown\", onOutside, true);\n doc = on ? anchor.value?.ownerDocument : undefined;\n doc?.addEventListener(\"pointerdown\", onOutside, true);\n },\n { flush: \"post\" },\n );\n onBeforeUnmount(() => {\n clearTimeout(timer);\n doc?.removeEventListener(\"pointerdown\", onOutside, true);\n });\n\n return { open, anchorOn, onTriggerClick };\n}\n","<script setup lang=\"ts\">\n/**\n * 文字提示(同 Naive 的 NTooltip):#trigger 里放触发元素,默认插槽是提示内容。\n * 与纯 CSS 的 [data-ak-tip] 分工:那个只是属性里的一句字符串、只能在上方、没有 JS(模板 / AkItem 的 tip 用它);\n * 这个能放任意内容、四个方向、点击 / 手动触发,触发元素带 aria-describedby,Esc 可关。\n */\nimport { useId, useTemplateRef, type VNode } from \"vue\";\n\nimport { Render, decorateTrigger } from \"./trigger\";\nimport { usePopover, type PopoverPlacement, type PopoverTrigger } from \"./usePopover\";\n\nconst props = withDefaults(\n defineProps<{\n /** 出现在触发元素的哪一边:top(默认)· bottom · left · right;-start / -end 与触发元素左 / 右缘对齐。不自动翻转,贴边的触发元素自己选 */\n placement?: PopoverPlacement;\n /** 触发方式:hover 悬停 + 键盘聚焦(默认)· focus 只看聚焦 · click 点击开合 · manual 只由 v-model 控制 */\n trigger?: PopoverTrigger;\n /** 悬停多久后出现(ms) */\n delay?: number;\n /** 移开多久后消失(ms);这段时间里鼠标能移进提示里 */\n duration?: number;\n /** 禁用:不再出现 */\n disabled?: boolean;\n }>(),\n { placement: \"top\", trigger: \"hover\", delay: 100, duration: 100 },\n);\n\n/** 是否显示;不绑定时由 trigger 决定 */\nconst model = defineModel<boolean>({ default: false });\n\nconst slots = defineSlots<{\n /** 触发元素:取第一个元素 / 组件;只有文字时自动包一层 <span>,不可聚焦的元素自动补 tabindex=\"0\" */\n trigger?: () => VNode[];\n /** 提示内容(短句;较长的解释会在 280px 处折行) */\n default?: () => unknown;\n}>();\n\nconst id = useId();\nconst anchor = useTemplateRef<HTMLElement>(\"anchor\");\nconst { open, anchorOn, onTriggerClick } = usePopover(props, model, anchor);\n</script>\n\n<template>\n <span ref=\"anchor\" class=\"ak-tip-anchor\" v-on=\"anchorOn\">\n <Render :content=\"decorateTrigger(slots.trigger?.(), { 'aria-describedby': id, onClick: onTriggerClick })\" />\n <span :id=\"id\" role=\"tooltip\" :class=\"['ak-tooltip', `ak-tooltip--${placement}`]\" :hidden=\"!open\"><slot /></span>\n </span>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 文字提示(同 Naive 的 NTooltip):#trigger 里放触发元素,默认插槽是提示内容。\n * 与纯 CSS 的 [data-ak-tip] 分工:那个只是属性里的一句字符串、只能在上方、没有 JS(模板 / AkItem 的 tip 用它);\n * 这个能放任意内容、四个方向、点击 / 手动触发,触发元素带 aria-describedby,Esc 可关。\n */\nimport { useId, useTemplateRef, type VNode } from \"vue\";\n\nimport { Render, decorateTrigger } from \"./trigger\";\nimport { usePopover, type PopoverPlacement, type PopoverTrigger } from \"./usePopover\";\n\nconst props = withDefaults(\n defineProps<{\n /** 出现在触发元素的哪一边:top(默认)· bottom · left · right;-start / -end 与触发元素左 / 右缘对齐。不自动翻转,贴边的触发元素自己选 */\n placement?: PopoverPlacement;\n /** 触发方式:hover 悬停 + 键盘聚焦(默认)· focus 只看聚焦 · click 点击开合 · manual 只由 v-model 控制 */\n trigger?: PopoverTrigger;\n /** 悬停多久后出现(ms) */\n delay?: number;\n /** 移开多久后消失(ms);这段时间里鼠标能移进提示里 */\n duration?: number;\n /** 禁用:不再出现 */\n disabled?: boolean;\n }>(),\n { placement: \"top\", trigger: \"hover\", delay: 100, duration: 100 },\n);\n\n/** 是否显示;不绑定时由 trigger 决定 */\nconst model = defineModel<boolean>({ default: false });\n\nconst slots = defineSlots<{\n /** 触发元素:取第一个元素 / 组件;只有文字时自动包一层 <span>,不可聚焦的元素自动补 tabindex=\"0\" */\n trigger?: () => VNode[];\n /** 提示内容(短句;较长的解释会在 280px 处折行) */\n default?: () => unknown;\n}>();\n\nconst id = useId();\nconst anchor = useTemplateRef<HTMLElement>(\"anchor\");\nconst { open, anchorOn, onTriggerClick } = usePopover(props, model, anchor);\n</script>\n\n<template>\n <span ref=\"anchor\" class=\"ak-tip-anchor\" v-on=\"anchorOn\">\n <Render :content=\"decorateTrigger(slots.trigger?.(), { 'aria-describedby': id, onClick: onTriggerClick })\" />\n <span :id=\"id\" role=\"tooltip\" :class=\"['ak-tooltip', `ak-tooltip--${placement}`]\" :hidden=\"!open\"><slot /></span>\n </span>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 弹出卡片(同 Naive 的 NPopover):比 AkTooltip 大、白底、顶边主色条,能放标题、段落、链接、道具。\n * 默认点击开合(里面常有可点的东西,悬停弹出的卡片键盘用户够不着);点外面 / Esc 关,焦点在卡片里时还给触发元素。\n */\nimport { computed, useId, useTemplateRef, type VNode } from \"vue\";\n\nimport { Render, decorateTrigger } from \"./trigger\";\nimport { usePopover, type PopoverPlacement, type PopoverTrigger } from \"./usePopover\";\n\nconst props = withDefaults(\n defineProps<{\n /** 标题(粗体一行);也可以用 #header 插槽 */\n title?: string;\n /** 出现在触发元素的哪一边:bottom(默认)· top · left · right;-start / -end 与触发元素左 / 右缘对齐。不自动翻转,贴边的触发元素自己选 */\n placement?: PopoverPlacement;\n /** 触发方式:click 点击开合(默认)· hover 悬停 + 键盘聚焦 · focus 只看聚焦 · manual 只由 v-model 控制 */\n trigger?: PopoverTrigger;\n /** hover 模式:悬停多久后出现(ms) */\n delay?: number;\n /** hover 模式:移开多久后消失(ms);这段时间里鼠标能移进卡片里 */\n duration?: number;\n /** 禁用:不再弹出 */\n disabled?: boolean;\n }>(),\n { title: undefined, placement: \"bottom\", trigger: \"click\", delay: 100, duration: 100 },\n);\n\n/** 是否显示;不绑定时由 trigger 决定 */\nconst model = defineModel<boolean>({ default: false });\n\nconst slots = defineSlots<{\n /** 触发元素:取第一个元素 / 组件;只有文字时自动包一层 <span>,不可聚焦的元素自动补 tabindex=\"0\" */\n trigger?: () => VNode[];\n /** 卡片正文 */\n default?: () => unknown;\n /** 标题行(代替 title) */\n header?: () => unknown;\n}>();\n\nconst id = useId();\nconst anchor = useTemplateRef<HTMLElement>(\"anchor\");\nconst { open, anchorOn, onTriggerClick } = usePopover(props, model, anchor);\n\n/** 点击打开的是非模态对话框(触发元素 aria-expanded / aria-controls);悬停 / 聚焦打开的等同富文本提示(aria-describedby) */\nconst isDialog = computed(() => props.trigger === \"click\" || props.trigger === \"manual\");\nconst triggerAttrs = computed(() =>\n isDialog.value\n ? { \"aria-haspopup\": \"dialog\", \"aria-expanded\": open.value, \"aria-controls\": id, onClick: onTriggerClick }\n : { \"aria-describedby\": id, onClick: onTriggerClick },\n);\n</script>\n\n<template>\n <span ref=\"anchor\" class=\"ak-tip-anchor\" v-on=\"anchorOn\">\n <Render :content=\"decorateTrigger(slots.trigger?.(), triggerAttrs)\" />\n <div\n :id=\"id\"\n :role=\"isDialog ? 'dialog' : 'tooltip'\"\n :aria-labelledby=\"isDialog && (title || $slots.header) ? `${id}-title` : undefined\"\n :class=\"['ak-popover', `ak-popover--${placement}`]\"\n :hidden=\"!open\"\n >\n <div v-if=\"title || $slots.header\" :id=\"`${id}-title`\" class=\"ak-popover__title\"><slot name=\"header\">{{ title }}</slot></div>\n <slot />\n </div>\n </span>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 弹出卡片(同 Naive 的 NPopover):比 AkTooltip 大、白底、顶边主色条,能放标题、段落、链接、道具。\n * 默认点击开合(里面常有可点的东西,悬停弹出的卡片键盘用户够不着);点外面 / Esc 关,焦点在卡片里时还给触发元素。\n */\nimport { computed, useId, useTemplateRef, type VNode } from \"vue\";\n\nimport { Render, decorateTrigger } from \"./trigger\";\nimport { usePopover, type PopoverPlacement, type PopoverTrigger } from \"./usePopover\";\n\nconst props = withDefaults(\n defineProps<{\n /** 标题(粗体一行);也可以用 #header 插槽 */\n title?: string;\n /** 出现在触发元素的哪一边:bottom(默认)· top · left · right;-start / -end 与触发元素左 / 右缘对齐。不自动翻转,贴边的触发元素自己选 */\n placement?: PopoverPlacement;\n /** 触发方式:click 点击开合(默认)· hover 悬停 + 键盘聚焦 · focus 只看聚焦 · manual 只由 v-model 控制 */\n trigger?: PopoverTrigger;\n /** hover 模式:悬停多久后出现(ms) */\n delay?: number;\n /** hover 模式:移开多久后消失(ms);这段时间里鼠标能移进卡片里 */\n duration?: number;\n /** 禁用:不再弹出 */\n disabled?: boolean;\n }>(),\n { title: undefined, placement: \"bottom\", trigger: \"click\", delay: 100, duration: 100 },\n);\n\n/** 是否显示;不绑定时由 trigger 决定 */\nconst model = defineModel<boolean>({ default: false });\n\nconst slots = defineSlots<{\n /** 触发元素:取第一个元素 / 组件;只有文字时自动包一层 <span>,不可聚焦的元素自动补 tabindex=\"0\" */\n trigger?: () => VNode[];\n /** 卡片正文 */\n default?: () => unknown;\n /** 标题行(代替 title) */\n header?: () => unknown;\n}>();\n\nconst id = useId();\nconst anchor = useTemplateRef<HTMLElement>(\"anchor\");\nconst { open, anchorOn, onTriggerClick } = usePopover(props, model, anchor);\n\n/** 点击打开的是非模态对话框(触发元素 aria-expanded / aria-controls);悬停 / 聚焦打开的等同富文本提示(aria-describedby) */\nconst isDialog = computed(() => props.trigger === \"click\" || props.trigger === \"manual\");\nconst triggerAttrs = computed(() =>\n isDialog.value\n ? { \"aria-haspopup\": \"dialog\", \"aria-expanded\": open.value, \"aria-controls\": id, onClick: onTriggerClick }\n : { \"aria-describedby\": id, onClick: onTriggerClick },\n);\n</script>\n\n<template>\n <span ref=\"anchor\" class=\"ak-tip-anchor\" v-on=\"anchorOn\">\n <Render :content=\"decorateTrigger(slots.trigger?.(), triggerAttrs)\" />\n <div\n :id=\"id\"\n :role=\"isDialog ? 'dialog' : 'tooltip'\"\n :aria-labelledby=\"isDialog && (title || $slots.header) ? `${id}-title` : undefined\"\n :class=\"['ak-popover', `ak-popover--${placement}`]\"\n :hidden=\"!open\"\n >\n <div v-if=\"title || $slots.header\" :id=\"`${id}-title`\" class=\"ak-popover__title\"><slot name=\"header\">{{ title }}</slot></div>\n <slot />\n </div>\n </span>\n</template>\n","<script setup lang=\"ts\">\n/** AkDropdown 内部用的一个菜单项(不导出):普通项是 li[role=menuitem];有 href 的是 li[role=none] > a[role=menuitem](MW 门户链接的结构) */\nimport { computed } from \"vue\";\n\nimport AkIcon from \"../Icon/AkIcon.vue\";\nimport type { DropdownKey, DropdownOption } from \"./types\";\n\nconst props = defineProps<{\n /** 菜单项 */\n option: DropdownOption;\n /** AkDropdown 的 value:有值时是单选菜单项 */\n value?: DropdownKey;\n}>();\n\nconst emit = defineEmits<{\n /** 点了这一项(禁用项也会触发,由 AkDropdown 判断) */\n select: [e: MouseEvent];\n}>();\n\nconst radio = computed(() => props.value !== undefined);\nconst active = computed(() => radio.value && props.option.key === props.value);\nconst attrs = computed(() => ({\n role: radio.value ? \"menuitemradio\" : \"menuitem\",\n tabindex: -1,\n \"aria-checked\": radio.value ? active.value : undefined,\n \"aria-disabled\": props.option.disabled || undefined,\n class: [\"ak-menu__item\", { \"is-active\": active.value, \"ak-menu__item--danger\": props.option.danger }],\n}));\n</script>\n\n<template>\n <li v-if=\"!option.href\" v-bind=\"attrs\" @click=\"emit('select', $event)\">\n <AkIcon v-if=\"option.icon\" :name=\"option.icon\" :size=\"16\" />{{ option.label }}\n </li>\n <li v-else role=\"none\">\n <a :href=\"option.disabled ? undefined : option.href\" v-bind=\"attrs\" @click=\"emit('select', $event)\">\n <AkIcon v-if=\"option.icon\" :name=\"option.icon\" :size=\"16\" />{{ option.label }}\n </a>\n </li>\n</template>\n","<script setup lang=\"ts\">\n/** AkDropdown 内部用的一个菜单项(不导出):普通项是 li[role=menuitem];有 href 的是 li[role=none] > a[role=menuitem](MW 门户链接的结构) */\nimport { computed } from \"vue\";\n\nimport AkIcon from \"../Icon/AkIcon.vue\";\nimport type { DropdownKey, DropdownOption } from \"./types\";\n\nconst props = defineProps<{\n /** 菜单项 */\n option: DropdownOption;\n /** AkDropdown 的 value:有值时是单选菜单项 */\n value?: DropdownKey;\n}>();\n\nconst emit = defineEmits<{\n /** 点了这一项(禁用项也会触发,由 AkDropdown 判断) */\n select: [e: MouseEvent];\n}>();\n\nconst radio = computed(() => props.value !== undefined);\nconst active = computed(() => radio.value && props.option.key === props.value);\nconst attrs = computed(() => ({\n role: radio.value ? \"menuitemradio\" : \"menuitem\",\n tabindex: -1,\n \"aria-checked\": radio.value ? active.value : undefined,\n \"aria-disabled\": props.option.disabled || undefined,\n class: [\"ak-menu__item\", { \"is-active\": active.value, \"ak-menu__item--danger\": props.option.danger }],\n}));\n</script>\n\n<template>\n <li v-if=\"!option.href\" v-bind=\"attrs\" @click=\"emit('select', $event)\">\n <AkIcon v-if=\"option.icon\" :name=\"option.icon\" :size=\"16\" />{{ option.label }}\n </li>\n <li v-else role=\"none\">\n <a :href=\"option.disabled ? undefined : option.href\" v-bind=\"attrs\" @click=\"emit('select', $event)\">\n <AkIcon v-if=\"option.icon\" :name=\"option.icon\" :size=\"16\" />{{ option.label }}\n </a>\n </li>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 下拉菜单(同 Naive 的 NDropdown):默认插槽放触发元素(一般是 AkButton),options 给菜单项,选中触发 select。\n * 键盘与 ARIA 按 WAI-ARIA 菜单按钮(Menu Button):Enter / 空格 / ↓ 打开并落在第一项,↑ 落在最后一项;\n * 菜单里 ↑ ↓ Home End 移动、首字母跳转、Enter / 空格选中、Esc 收起并把焦点还给触发元素、Tab 收起并离开;点外面收起。\n */\nimport { computed, nextTick, onBeforeUnmount, onMounted, useId, useTemplateRef, watch, type VNode } from \"vue\";\n\nimport { Render, decorateTrigger, firstId } from \"../Tooltip/trigger\";\nimport MenuItem from \"./MenuItem.vue\";\nimport type { DropdownKey, DropdownMixedOption, DropdownOption } from \"./types\";\n\nconst props = withDefaults(\n defineProps<{\n /** 菜单项:{ key, label, icon?, disabled?, danger?, href? };{ type: \"divider\" } 分隔线;{ type: \"group\", label, children } 带小标题的一组 */\n options: DropdownMixedOption[];\n /** 菜单对齐:bottom-start 与触发元素左对齐(默认)· bottom-end 右对齐(靠页面右边的触发元素用) */\n placement?: \"bottom-start\" | \"bottom-end\";\n /** 当前选中项的 key:该项高亮,菜单变成单选菜单(menuitemradio + aria-checked),打开时落在它上面 */\n value?: DropdownKey;\n /** 读屏用的菜单名;不写时用触发元素的文字 */\n label?: string;\n /** 禁用:触发元素点了不展开 */\n disabled?: boolean;\n }>(),\n { placement: \"bottom-start\", value: undefined, label: undefined },\n);\n\n/** 菜单是否展开 */\nconst model = defineModel<boolean>({ default: false });\n\nconst emit = defineEmits<{\n /** 选了一项(点击 / Enter / 空格);之后菜单收起、焦点回到触发元素。有 href 的项照常跳转 */\n select: [key: DropdownKey, option: DropdownOption];\n}>();\n\nconst slots = defineSlots<{\n /** 触发元素:取第一个元素 / 组件,自动补 aria-haspopup / aria-expanded / aria-controls 与键盘;id 它自己写了就沿用,没写才补一个(菜单的 aria-labelledby 指向它) */\n default?: () => VNode[];\n}>();\n\nconst id = useId();\nconst triggerId = `${id}-trigger`;\nconst menuId = `${id}-menu`;\nconst root = useTemplateRef<HTMLElement>(\"root\");\nconst menu = useTemplateRef<HTMLElement>(\"menu\");\n\nconst items = () => [...(menu.value?.querySelectorAll<HTMLElement>('[role=\"menuitem\"], [role=\"menuitemradio\"]') ?? [])];\n/** 触发元素 = 根的第一个子元素 */\nconst triggerEl = () => root.value?.firstElementChild as HTMLElement | null | undefined;\n\nasync function openMenu(focus: \"first\" | \"last\") {\n model.value = true;\n await nextTick(); // 等 .is-open 生效(收起时菜单 display: none,聚焦不了)\n const list = items();\n const checked = list.find(el => el.getAttribute(\"aria-checked\") === \"true\");\n (checked ?? (focus === \"first\" ? list[0] : list.at(-1)))?.focus();\n}\n\nfunction closeMenu(returnFocus: boolean) {\n model.value = false;\n if (returnFocus) triggerEl()?.focus();\n}\n\nfunction onTriggerClick() {\n if (props.disabled) return;\n if (model.value) closeMenu(false);\n else openMenu(\"first\");\n}\n\nfunction onTriggerKeydown(e: KeyboardEvent) {\n if (props.disabled || ![\"Enter\", \" \", \"ArrowDown\", \"ArrowUp\"].includes(e.key)) return;\n e.preventDefault(); // 也拦掉 Enter / 空格随后合成的 click,免得刚打开又关上\n openMenu(e.key === \"ArrowUp\" ? \"last\" : \"first\");\n}\n\nconst triggerAttrs = computed(() => ({\n \"aria-haspopup\": \"menu\",\n \"aria-expanded\": model.value,\n \"aria-controls\": menuId,\n onClick: onTriggerClick,\n onKeydown: onTriggerKeydown,\n}));\n\n/** 渲染期取触发元素:它自己写了 id 就沿用(菜单的 aria-labelledby 跟着它),没写才补生成的 triggerId。\n * 插槽只能在渲染期调用,所以由模板调用,结果记在 rendered 里给后面的菜单用(同一次渲染、触发元素在前) */\nconst rendered = { triggerId };\nfunction renderTrigger() {\n const nodes = slots.default?.();\n const own = firstId(nodes);\n rendered.triggerId = own ?? triggerId;\n return decorateTrigger(nodes, own === undefined ? { id: triggerId, ...triggerAttrs.value } : triggerAttrs.value);\n}\n\n/** 首字母跳转:从当前项往后找第一个文字以这个字符开头的 */\nfunction typeahead(list: HTMLElement[], from: number, ch: string) {\n const c = ch.toLowerCase();\n for (let k = 1; k <= list.length; k++) {\n const el = list[(from + k) % list.length];\n if (el.textContent?.trim().toLowerCase().startsWith(c)) return el.focus();\n }\n}\n\nfunction onMenuKeydown(e: KeyboardEvent) {\n const list = items();\n const i = list.indexOf(e.target as HTMLElement);\n const go = (n: number) => list[(n + list.length) % list.length]?.focus();\n switch (e.key) {\n case \"ArrowDown\":\n go(i + 1);\n break;\n case \"ArrowUp\":\n go(i < 0 ? -1 : i - 1);\n break;\n case \"Home\":\n case \"PageUp\":\n go(0);\n break;\n case \"End\":\n case \"PageDown\":\n go(-1);\n break;\n case \"Escape\":\n closeMenu(true);\n break;\n case \"Tab\":\n closeMenu(false); // 不拦:焦点照常移到菜单后面的元素\n return;\n case \"Enter\":\n case \" \":\n list[i]?.click(); // <a> 项会照常跳转\n break;\n default:\n if (e.key.length !== 1 || e.ctrlKey || e.metaKey || e.altKey) return;\n typeahead(list, i, e.key);\n }\n e.preventDefault();\n e.stopPropagation(); // Esc 不要顺带关掉外面的对话框\n}\n\nfunction onSelect(e: MouseEvent, o: DropdownOption) {\n if (o.disabled) {\n e.preventDefault();\n return;\n }\n emit(\"select\", o.key, o);\n closeMenu(true);\n}\n\n/** 展开时点外面收起(监听挂在组件所在的文档上——示例在 iframe 里时不是全局 document) */\nfunction onOutside(e: PointerEvent) {\n if (!root.value?.contains(e.target as Node)) closeMenu(false);\n}\nlet doc: Document | undefined;\nfunction syncOutside() {\n doc?.removeEventListener(\"pointerdown\", onOutside, true);\n doc = model.value ? root.value?.ownerDocument : undefined;\n doc?.addEventListener(\"pointerdown\", onOutside, true);\n}\nwatch(model, syncOutside, { flush: \"post\" });\nonMounted(syncOutside);\nonBeforeUnmount(() => doc?.removeEventListener(\"pointerdown\", onOutside, true));\n</script>\n\n<template>\n <!-- ak-not-prose:菜单是 ul / li / a,别吃正文的列表符、段距与链接色 -->\n <div ref=\"root\" :class=\"['ak-dropdown', 'ak-not-prose', { 'is-open': model }]\">\n <Render :content=\"renderTrigger()\" />\n <ul\n :id=\"menuId\"\n ref=\"menu\"\n role=\"menu\"\n :class=\"['ak-menu', placement === 'bottom-end' && 'ak-menu--right']\"\n :aria-labelledby=\"label ? undefined : rendered.triggerId\"\n :aria-label=\"label\"\n @keydown=\"onMenuKeydown\"\n >\n <template v-for=\"(o, i) in options\" :key=\"o.key ?? `_${i}`\">\n <li v-if=\"o.type === 'divider'\" class=\"ak-menu__sep\" role=\"separator\" />\n <li v-else-if=\"o.type === 'group'\" class=\"ak-menu__group\" role=\"group\" :aria-label=\"o.label\">\n <!-- 组名由 aria-label 念,这里只给眼睛看 -->\n <div class=\"ak-menu__label\" aria-hidden=\"true\">{{ o.label }}</div>\n <ul role=\"none\">\n <template v-for=\"(c, j) in o.children\" :key=\"c.key ?? `_${j}`\">\n <li v-if=\"c.type === 'divider'\" class=\"ak-menu__sep\" role=\"separator\" />\n <MenuItem v-else :option=\"c\" :value=\"value\" @select=\"onSelect($event, c)\" />\n </template>\n </ul>\n </li>\n <MenuItem v-else :option=\"o\" :value=\"value\" @select=\"onSelect($event, o)\" />\n </template>\n </ul>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 下拉菜单(同 Naive 的 NDropdown):默认插槽放触发元素(一般是 AkButton),options 给菜单项,选中触发 select。\n * 键盘与 ARIA 按 WAI-ARIA 菜单按钮(Menu Button):Enter / 空格 / ↓ 打开并落在第一项,↑ 落在最后一项;\n * 菜单里 ↑ ↓ Home End 移动、首字母跳转、Enter / 空格选中、Esc 收起并把焦点还给触发元素、Tab 收起并离开;点外面收起。\n */\nimport { computed, nextTick, onBeforeUnmount, onMounted, useId, useTemplateRef, watch, type VNode } from \"vue\";\n\nimport { Render, decorateTrigger, firstId } from \"../Tooltip/trigger\";\nimport MenuItem from \"./MenuItem.vue\";\nimport type { DropdownKey, DropdownMixedOption, DropdownOption } from \"./types\";\n\nconst props = withDefaults(\n defineProps<{\n /** 菜单项:{ key, label, icon?, disabled?, danger?, href? };{ type: \"divider\" } 分隔线;{ type: \"group\", label, children } 带小标题的一组 */\n options: DropdownMixedOption[];\n /** 菜单对齐:bottom-start 与触发元素左对齐(默认)· bottom-end 右对齐(靠页面右边的触发元素用) */\n placement?: \"bottom-start\" | \"bottom-end\";\n /** 当前选中项的 key:该项高亮,菜单变成单选菜单(menuitemradio + aria-checked),打开时落在它上面 */\n value?: DropdownKey;\n /** 读屏用的菜单名;不写时用触发元素的文字 */\n label?: string;\n /** 禁用:触发元素点了不展开 */\n disabled?: boolean;\n }>(),\n { placement: \"bottom-start\", value: undefined, label: undefined },\n);\n\n/** 菜单是否展开 */\nconst model = defineModel<boolean>({ default: false });\n\nconst emit = defineEmits<{\n /** 选了一项(点击 / Enter / 空格);之后菜单收起、焦点回到触发元素。有 href 的项照常跳转 */\n select: [key: DropdownKey, option: DropdownOption];\n}>();\n\nconst slots = defineSlots<{\n /** 触发元素:取第一个元素 / 组件,自动补 aria-haspopup / aria-expanded / aria-controls 与键盘;id 它自己写了就沿用,没写才补一个(菜单的 aria-labelledby 指向它) */\n default?: () => VNode[];\n}>();\n\nconst id = useId();\nconst triggerId = `${id}-trigger`;\nconst menuId = `${id}-menu`;\nconst root = useTemplateRef<HTMLElement>(\"root\");\nconst menu = useTemplateRef<HTMLElement>(\"menu\");\n\nconst items = () => [...(menu.value?.querySelectorAll<HTMLElement>('[role=\"menuitem\"], [role=\"menuitemradio\"]') ?? [])];\n/** 触发元素 = 根的第一个子元素 */\nconst triggerEl = () => root.value?.firstElementChild as HTMLElement | null | undefined;\n\nasync function openMenu(focus: \"first\" | \"last\") {\n model.value = true;\n await nextTick(); // 等 .is-open 生效(收起时菜单 display: none,聚焦不了)\n const list = items();\n const checked = list.find(el => el.getAttribute(\"aria-checked\") === \"true\");\n (checked ?? (focus === \"first\" ? list[0] : list.at(-1)))?.focus();\n}\n\nfunction closeMenu(returnFocus: boolean) {\n model.value = false;\n if (returnFocus) triggerEl()?.focus();\n}\n\nfunction onTriggerClick() {\n if (props.disabled) return;\n if (model.value) closeMenu(false);\n else openMenu(\"first\");\n}\n\nfunction onTriggerKeydown(e: KeyboardEvent) {\n if (props.disabled || ![\"Enter\", \" \", \"ArrowDown\", \"ArrowUp\"].includes(e.key)) return;\n e.preventDefault(); // 也拦掉 Enter / 空格随后合成的 click,免得刚打开又关上\n openMenu(e.key === \"ArrowUp\" ? \"last\" : \"first\");\n}\n\nconst triggerAttrs = computed(() => ({\n \"aria-haspopup\": \"menu\",\n \"aria-expanded\": model.value,\n \"aria-controls\": menuId,\n onClick: onTriggerClick,\n onKeydown: onTriggerKeydown,\n}));\n\n/** 渲染期取触发元素:它自己写了 id 就沿用(菜单的 aria-labelledby 跟着它),没写才补生成的 triggerId。\n * 插槽只能在渲染期调用,所以由模板调用,结果记在 rendered 里给后面的菜单用(同一次渲染、触发元素在前) */\nconst rendered = { triggerId };\nfunction renderTrigger() {\n const nodes = slots.default?.();\n const own = firstId(nodes);\n rendered.triggerId = own ?? triggerId;\n return decorateTrigger(nodes, own === undefined ? { id: triggerId, ...triggerAttrs.value } : triggerAttrs.value);\n}\n\n/** 首字母跳转:从当前项往后找第一个文字以这个字符开头的 */\nfunction typeahead(list: HTMLElement[], from: number, ch: string) {\n const c = ch.toLowerCase();\n for (let k = 1; k <= list.length; k++) {\n const el = list[(from + k) % list.length];\n if (el.textContent?.trim().toLowerCase().startsWith(c)) return el.focus();\n }\n}\n\nfunction onMenuKeydown(e: KeyboardEvent) {\n const list = items();\n const i = list.indexOf(e.target as HTMLElement);\n const go = (n: number) => list[(n + list.length) % list.length]?.focus();\n switch (e.key) {\n case \"ArrowDown\":\n go(i + 1);\n break;\n case \"ArrowUp\":\n go(i < 0 ? -1 : i - 1);\n break;\n case \"Home\":\n case \"PageUp\":\n go(0);\n break;\n case \"End\":\n case \"PageDown\":\n go(-1);\n break;\n case \"Escape\":\n closeMenu(true);\n break;\n case \"Tab\":\n closeMenu(false); // 不拦:焦点照常移到菜单后面的元素\n return;\n case \"Enter\":\n case \" \":\n list[i]?.click(); // <a> 项会照常跳转\n break;\n default:\n if (e.key.length !== 1 || e.ctrlKey || e.metaKey || e.altKey) return;\n typeahead(list, i, e.key);\n }\n e.preventDefault();\n e.stopPropagation(); // Esc 不要顺带关掉外面的对话框\n}\n\nfunction onSelect(e: MouseEvent, o: DropdownOption) {\n if (o.disabled) {\n e.preventDefault();\n return;\n }\n emit(\"select\", o.key, o);\n closeMenu(true);\n}\n\n/** 展开时点外面收起(监听挂在组件所在的文档上——示例在 iframe 里时不是全局 document) */\nfunction onOutside(e: PointerEvent) {\n if (!root.value?.contains(e.target as Node)) closeMenu(false);\n}\nlet doc: Document | undefined;\nfunction syncOutside() {\n doc?.removeEventListener(\"pointerdown\", onOutside, true);\n doc = model.value ? root.value?.ownerDocument : undefined;\n doc?.addEventListener(\"pointerdown\", onOutside, true);\n}\nwatch(model, syncOutside, { flush: \"post\" });\nonMounted(syncOutside);\nonBeforeUnmount(() => doc?.removeEventListener(\"pointerdown\", onOutside, true));\n</script>\n\n<template>\n <!-- ak-not-prose:菜单是 ul / li / a,别吃正文的列表符、段距与链接色 -->\n <div ref=\"root\" :class=\"['ak-dropdown', 'ak-not-prose', { 'is-open': model }]\">\n <Render :content=\"renderTrigger()\" />\n <ul\n :id=\"menuId\"\n ref=\"menu\"\n role=\"menu\"\n :class=\"['ak-menu', placement === 'bottom-end' && 'ak-menu--right']\"\n :aria-labelledby=\"label ? undefined : rendered.triggerId\"\n :aria-label=\"label\"\n @keydown=\"onMenuKeydown\"\n >\n <template v-for=\"(o, i) in options\" :key=\"o.key ?? `_${i}`\">\n <li v-if=\"o.type === 'divider'\" class=\"ak-menu__sep\" role=\"separator\" />\n <li v-else-if=\"o.type === 'group'\" class=\"ak-menu__group\" role=\"group\" :aria-label=\"o.label\">\n <!-- 组名由 aria-label 念,这里只给眼睛看 -->\n <div class=\"ak-menu__label\" aria-hidden=\"true\">{{ o.label }}</div>\n <ul role=\"none\">\n <template v-for=\"(c, j) in o.children\" :key=\"c.key ?? `_${j}`\">\n <li v-if=\"c.type === 'divider'\" class=\"ak-menu__sep\" role=\"separator\" />\n <MenuItem v-else :option=\"c\" :value=\"value\" @select=\"onSelect($event, c)\" />\n </template>\n </ul>\n </li>\n <MenuItem v-else :option=\"o\" :value=\"value\" @select=\"onSelect($event, o)\" />\n </template>\n </ul>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 模态对话框(同 Naive 的 NModal + NDialog):原生 <dialog> + showModal()——焦点圈在对话框里、背后的页面 inert、Esc 关闭都由浏览器负责;\n * 这里补上:v-model 开合、点遮罩关闭、关闭后焦点还给打开前的元素、标题作可访问名。\n */\nimport { computed, onBeforeUnmount, onMounted, useId, useTemplateRef, watch } from \"vue\";\n\nimport AkButton from \"../Button/AkButton.vue\";\n\nconst props = withDefaults(\n defineProps<{\n /** 标题(同时作对话框的可访问名);要带格式时用 #header 插槽 */\n title?: string;\n /** 可访问名:没有标题时写(aria-label) */\n label?: string;\n /** 宽度:sm 420 · md 640(默认)· lg 900 · full 占满 96vw × 92vh */\n size?: \"sm\" | \"md\" | \"lg\" | \"full\";\n /** 标题栏右侧的 ✕ 关闭按钮 */\n closable?: boolean;\n /** 点遮罩关闭(同 Naive 的 mask-closable) */\n maskClosable?: boolean;\n /** 按 Esc 关闭(同 Naive 的 close-on-esc) */\n closeOnEsc?: boolean;\n /** 确认按钮文字:写了就在底栏放一枚黑白反转的确认按钮,点了触发 positive-click 并关闭 */\n positiveText?: string;\n /** 取消按钮文字:写了就在底栏放一枚默认按钮,点了触发 negative-click 并关闭 */\n negativeText?: string;\n }>(),\n {\n title: undefined,\n label: undefined,\n size: \"md\",\n closable: true,\n maskClosable: true,\n closeOnEsc: true,\n positiveText: undefined,\n negativeText: undefined,\n },\n);\n\n/** 是否打开 */\nconst model = defineModel<boolean>({ default: false });\n\nconst emit = defineEmits<{\n /** 点了确认按钮(之后关闭) */\n \"positive-click\": [];\n /** 点了取消按钮(之后关闭) */\n \"negative-click\": [];\n}>();\n\ndefineSlots<{\n /** 正文 */\n default?: () => unknown;\n /** 标题(代替 title) */\n header?: () => unknown;\n /** 底栏按钮(代替 positive-text / negative-text 那两枚),右对齐 */\n footer?: () => unknown;\n}>();\n\nconst id = useId();\nconst el = useTemplateRef<HTMLDialogElement>(\"el\");\nconst classes = computed(() => [\"ak-dialog\", props.size !== \"md\" && `ak-dialog--${props.size}`]);\n\n/** 打开前的焦点:关闭后还回去 */\nlet returnTo: HTMLElement | null = null;\n\nfunction sync(open: boolean) {\n const d = el.value;\n if (!d) return;\n if (open && !d.open) {\n returnTo = d.ownerDocument.activeElement as HTMLElement | null;\n d.showModal();\n } else if (!open && d.open) d.close();\n}\nwatch(model, sync, { flush: \"post\" });\nonMounted(() => sync(model.value));\n// 开着就被卸载(路由切走等):不会有 close 事件,焦点也要还回去\nonBeforeUnmount(() => {\n if (el.value?.open && returnTo?.isConnected) returnTo.focus();\n});\n\n/** 原生 close 事件:Esc、form[method=dialog]、d.close() 都走这里 */\nfunction onClose() {\n model.value = false;\n if (returnTo?.isConnected) returnTo.focus();\n returnTo = null;\n}\n\n/** Esc 触发的 cancel:不许 Esc 关时拦下 */\nfunction onCancel(e: Event) {\n if (!props.closeOnEsc) e.preventDefault();\n}\n\n/** 遮罩点击 = 点在 <dialog> 自身、且落在框外(::backdrop 的点击算在 dialog 上);按下也要在框外,免得从框里拖选到框外被当成点遮罩 */\nlet downOutside = false;\nconst outside = (e: MouseEvent) => {\n const r = el.value!.getBoundingClientRect();\n return e.target === el.value && (e.clientX < r.left || e.clientX > r.right || e.clientY < r.top || e.clientY > r.bottom);\n};\nfunction onPointerdown(e: PointerEvent) {\n downOutside = outside(e);\n}\nfunction onClick(e: MouseEvent) {\n if (props.maskClosable && downOutside && outside(e)) model.value = false;\n downOutside = false;\n}\n\nfunction onPositive() {\n emit(\"positive-click\");\n model.value = false;\n}\nfunction onNegative() {\n emit(\"negative-click\");\n model.value = false;\n}\n</script>\n\n<template>\n <dialog\n ref=\"el\"\n :class=\"classes\"\n :aria-labelledby=\"title || $slots.header ? `${id}-title` : undefined\"\n :aria-label=\"label\"\n @close=\"onClose\"\n @cancel=\"onCancel\"\n @pointerdown=\"onPointerdown\"\n @click=\"onClick\"\n >\n <div v-if=\"title || $slots.header || closable\" class=\"ak-dialog__head\">\n <h2 v-if=\"title || $slots.header\" :id=\"`${id}-title`\" class=\"ak-dialog__title\"><slot name=\"header\">{{ title }}</slot></h2>\n <span v-else class=\"ak-dialog__title\" /><!-- 只有关闭按钮时占位,把它推到右边 -->\n <AkButton v-if=\"closable\" icon=\"x\" label=\"关闭\" variant=\"ghost\" size=\"sm\" @click=\"model = false\" />\n </div>\n <div class=\"ak-dialog__body\"><slot /></div>\n <div v-if=\"$slots.footer || positiveText || negativeText\" class=\"ak-dialog__foot\">\n <slot name=\"footer\">\n <AkButton v-if=\"negativeText\" @click=\"onNegative\">{{ negativeText }}</AkButton>\n <AkButton v-if=\"positiveText\" variant=\"contrast\" @click=\"onPositive\">{{ positiveText }}</AkButton>\n </slot>\n </div>\n </dialog>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 模态对话框(同 Naive 的 NModal + NDialog):原生 <dialog> + showModal()——焦点圈在对话框里、背后的页面 inert、Esc 关闭都由浏览器负责;\n * 这里补上:v-model 开合、点遮罩关闭、关闭后焦点还给打开前的元素、标题作可访问名。\n */\nimport { computed, onBeforeUnmount, onMounted, useId, useTemplateRef, watch } from \"vue\";\n\nimport AkButton from \"../Button/AkButton.vue\";\n\nconst props = withDefaults(\n defineProps<{\n /** 标题(同时作对话框的可访问名);要带格式时用 #header 插槽 */\n title?: string;\n /** 可访问名:没有标题时写(aria-label) */\n label?: string;\n /** 宽度:sm 420 · md 640(默认)· lg 900 · full 占满 96vw × 92vh */\n size?: \"sm\" | \"md\" | \"lg\" | \"full\";\n /** 标题栏右侧的 ✕ 关闭按钮 */\n closable?: boolean;\n /** 点遮罩关闭(同 Naive 的 mask-closable) */\n maskClosable?: boolean;\n /** 按 Esc 关闭(同 Naive 的 close-on-esc) */\n closeOnEsc?: boolean;\n /** 确认按钮文字:写了就在底栏放一枚黑白反转的确认按钮,点了触发 positive-click 并关闭 */\n positiveText?: string;\n /** 取消按钮文字:写了就在底栏放一枚默认按钮,点了触发 negative-click 并关闭 */\n negativeText?: string;\n }>(),\n {\n title: undefined,\n label: undefined,\n size: \"md\",\n closable: true,\n maskClosable: true,\n closeOnEsc: true,\n positiveText: undefined,\n negativeText: undefined,\n },\n);\n\n/** 是否打开 */\nconst model = defineModel<boolean>({ default: false });\n\nconst emit = defineEmits<{\n /** 点了确认按钮(之后关闭) */\n \"positive-click\": [];\n /** 点了取消按钮(之后关闭) */\n \"negative-click\": [];\n}>();\n\ndefineSlots<{\n /** 正文 */\n default?: () => unknown;\n /** 标题(代替 title) */\n header?: () => unknown;\n /** 底栏按钮(代替 positive-text / negative-text 那两枚),右对齐 */\n footer?: () => unknown;\n}>();\n\nconst id = useId();\nconst el = useTemplateRef<HTMLDialogElement>(\"el\");\nconst classes = computed(() => [\"ak-dialog\", props.size !== \"md\" && `ak-dialog--${props.size}`]);\n\n/** 打开前的焦点:关闭后还回去 */\nlet returnTo: HTMLElement | null = null;\n\nfunction sync(open: boolean) {\n const d = el.value;\n if (!d) return;\n if (open && !d.open) {\n returnTo = d.ownerDocument.activeElement as HTMLElement | null;\n d.showModal();\n } else if (!open && d.open) d.close();\n}\nwatch(model, sync, { flush: \"post\" });\nonMounted(() => sync(model.value));\n// 开着就被卸载(路由切走等):不会有 close 事件,焦点也要还回去\nonBeforeUnmount(() => {\n if (el.value?.open && returnTo?.isConnected) returnTo.focus();\n});\n\n/** 原生 close 事件:Esc、form[method=dialog]、d.close() 都走这里 */\nfunction onClose() {\n model.value = false;\n if (returnTo?.isConnected) returnTo.focus();\n returnTo = null;\n}\n\n/** Esc 触发的 cancel:不许 Esc 关时拦下 */\nfunction onCancel(e: Event) {\n if (!props.closeOnEsc) e.preventDefault();\n}\n\n/** 遮罩点击 = 点在 <dialog> 自身、且落在框外(::backdrop 的点击算在 dialog 上);按下也要在框外,免得从框里拖选到框外被当成点遮罩 */\nlet downOutside = false;\nconst outside = (e: MouseEvent) => {\n const r = el.value!.getBoundingClientRect();\n return e.target === el.value && (e.clientX < r.left || e.clientX > r.right || e.clientY < r.top || e.clientY > r.bottom);\n};\nfunction onPointerdown(e: PointerEvent) {\n downOutside = outside(e);\n}\nfunction onClick(e: MouseEvent) {\n if (props.maskClosable && downOutside && outside(e)) model.value = false;\n downOutside = false;\n}\n\nfunction onPositive() {\n emit(\"positive-click\");\n model.value = false;\n}\nfunction onNegative() {\n emit(\"negative-click\");\n model.value = false;\n}\n</script>\n\n<template>\n <dialog\n ref=\"el\"\n :class=\"classes\"\n :aria-labelledby=\"title || $slots.header ? `${id}-title` : undefined\"\n :aria-label=\"label\"\n @close=\"onClose\"\n @cancel=\"onCancel\"\n @pointerdown=\"onPointerdown\"\n @click=\"onClick\"\n >\n <div v-if=\"title || $slots.header || closable\" class=\"ak-dialog__head\">\n <h2 v-if=\"title || $slots.header\" :id=\"`${id}-title`\" class=\"ak-dialog__title\"><slot name=\"header\">{{ title }}</slot></h2>\n <span v-else class=\"ak-dialog__title\" /><!-- 只有关闭按钮时占位,把它推到右边 -->\n <AkButton v-if=\"closable\" icon=\"x\" label=\"关闭\" variant=\"ghost\" size=\"sm\" @click=\"model = false\" />\n </div>\n <div class=\"ak-dialog__body\"><slot /></div>\n <div v-if=\"$slots.footer || positiveText || negativeText\" class=\"ak-dialog__foot\">\n <slot name=\"footer\">\n <AkButton v-if=\"negativeText\" @click=\"onNegative\">{{ negativeText }}</AkButton>\n <AkButton v-if=\"positiveText\" variant=\"contrast\" @click=\"onPositive\">{{ positiveText }}</AkButton>\n </slot>\n </div>\n </dialog>\n</template>\n","import { inject, type InjectionKey, type VNodeChild } from \"vue\";\n\n/** 颜色:info 主色(默认)· success 绿 · warning 黄 · danger 红(= toast.error) */\nexport type ToastVariant = \"info\" | \"success\" | \"warning\" | \"danger\";\n\n/** 正文:字符串,或返回 vnode 的函数(要放链接 / 加粗时) */\nexport type ToastContent = string | (() => VNodeChild);\n\n/** 单条的选项(同 Naive 的 MessageOptions;不写的跟 AkToastProvider) */\nexport interface ToastOptions {\n /** 加粗的标题行 */\n title?: string;\n /** 停留时长(ms),0 = 不自动消失 */\n duration?: number;\n /** 显示 ✕ 关闭按钮 */\n closable?: boolean;\n /** 关掉时(到时 / 点 ✕ / destroy)调用 */\n onClose?: () => void;\n}\n\n/** 已弹出的一条:destroy() 提前关掉 */\nexport interface ToastHandle {\n destroy: () => void;\n}\n\n/** useToast() 的返回值(同 Naive 的 MessageApi) */\nexport interface ToastApi {\n create: (content: ToastContent, options?: ToastOptions & { variant?: ToastVariant }) => ToastHandle;\n info: (content: ToastContent, options?: ToastOptions) => ToastHandle;\n success: (content: ToastContent, options?: ToastOptions) => ToastHandle;\n warning: (content: ToastContent, options?: ToastOptions) => ToastHandle;\n error: (content: ToastContent, options?: ToastOptions) => ToastHandle;\n /** 全部关掉 */\n destroyAll: () => void;\n}\n\nexport const toastKey: InjectionKey<ToastApi> = Symbol(\"AkToastProvider\");\n\n/**\n * 弹轻提示(同 Naive 的 useMessage):要在 <AkToastProvider> 里面的组件的 setup 里调用。\n * const toast = useToast();\n * toast.success(\"页面已加入监视列表\", { title: \"完成\" });\n */\nexport function useToast(): ToastApi {\n const api = inject(toastKey, null);\n if (!api) throw new Error(\"useToast() 要在 <AkToastProvider> 里面的组件中调用\");\n return api;\n}\n","<script setup lang=\"ts\">\n/**\n * 轻提示的容器(同 Naive 的 NMessageProvider):包在应用 / 小部件的最外层,里面的组件用 useToast() 弹提示。\n * 提示栈 .ak-toasts 固定在视口右下角,是一个 aria-live=\"polite\" 的区域:新弹出的提示读屏会念,不打断当前朗读。\n * 也可以拿组件 ref 直接调(ref 上有和 useToast() 一样的方法)。\n */\nimport { onBeforeUnmount, provide, reactive } from \"vue\";\n\nimport { Render } from \"../Tooltip/trigger\";\nimport { toastKey, type ToastApi, type ToastContent, type ToastOptions, type ToastVariant } from \"./useToast\";\n\nconst props = withDefaults(\n defineProps<{\n /** 默认停留时长(ms),0 = 不自动消失;单条可以在选项里改 */\n duration?: number;\n /** 默认显示 ✕ 关闭按钮 */\n closable?: boolean;\n /** 鼠标悬停 / 键盘聚焦在某条上时暂停它的倒计时(同 Naive 的 keep-alive-on-hover) */\n keepAliveOnHover?: boolean;\n /** 最多同时显示几条,多了先关最早的 */\n max?: number;\n /** 把提示栈传送到别处(Teleport 的 to,如 \"body\");不写就渲染在原地——它是 fixed 定位,一般用不着 */\n to?: string | HTMLElement;\n /** 读屏里提示栈的名字 */\n label?: string;\n }>(),\n { duration: 5000, closable: true, keepAliveOnHover: true, max: undefined, to: undefined, label: \"通知\" },\n);\n\ndefineSlots<{\n /** 应用内容:里面的组件可以 useToast() */\n default?: () => unknown;\n}>();\n\ninterface Item {\n key: number;\n variant: ToastVariant;\n content: ToastContent;\n title?: string;\n duration: number;\n closable: boolean;\n onClose?: () => void;\n hovered: boolean;\n focused: boolean;\n /** 剩余时长(暂停时扣掉已走的)与本轮开始计时的时刻 */\n remaining: number;\n started: number;\n timer?: ReturnType<typeof setTimeout>;\n}\n\nconst list = reactive<Item[]>([]);\nlet seq = 0;\n\nfunction destroy(key: number) {\n const i = list.findIndex(t => t.key === key);\n if (i < 0) return;\n const [t] = list.splice(i, 1);\n clearTimeout(t.timer);\n t.onClose?.();\n}\n\nfunction run(t: Item) {\n clearTimeout(t.timer);\n if (t.duration <= 0) return;\n t.started = Date.now();\n t.timer = setTimeout(() => destroy(t.key), t.remaining);\n}\n\nconst held = (t: Item) => props.keepAliveOnHover && t.duration > 0 && (t.hovered || t.focused);\n\n/** 悬停 / 聚焦:暂停倒计时(进度条由 .is-paused 停住),都离开后接着走剩下的 */\nfunction hold(t: Item, kind: \"hovered\" | \"focused\", on: boolean) {\n const was = held(t);\n t[kind] = on;\n const now = held(t);\n if (!was && now) {\n clearTimeout(t.timer);\n t.remaining -= Date.now() - t.started;\n } else if (was && !now) run(t);\n}\n\nfunction onFocusout(e: FocusEvent, t: Item) {\n if (!(e.currentTarget as HTMLElement).contains(e.relatedTarget as Node | null)) hold(t, \"focused\", false);\n}\n\nfunction create(content: ToastContent, options: ToastOptions & { variant?: ToastVariant } = {}) {\n const duration = options.duration ?? props.duration;\n list.push({\n key: ++seq,\n variant: options.variant ?? \"info\",\n content,\n title: options.title,\n duration,\n closable: options.closable ?? props.closable,\n onClose: options.onClose,\n hovered: false,\n focused: false,\n remaining: duration,\n started: 0,\n });\n const t = list[list.length - 1];\n if (props.max && list.length > props.max) destroy(list[0].key);\n run(t);\n return { destroy: () => destroy(t.key) };\n}\n\nconst api: ToastApi = {\n create,\n info: (c, o) => create(c, { ...o, variant: \"info\" }),\n success: (c, o) => create(c, { ...o, variant: \"success\" }),\n warning: (c, o) => create(c, { ...o, variant: \"warning\" }),\n error: (c, o) => create(c, { ...o, variant: \"danger\" }),\n destroyAll: () => [...list].forEach(t => destroy(t.key)),\n};\nprovide(toastKey, api);\ndefineExpose(api);\n\nonBeforeUnmount(() => list.forEach(t => clearTimeout(t.timer)));\n</script>\n\n<template>\n <slot />\n <Teleport :to=\"to\" :disabled=\"!to\">\n <div class=\"ak-toasts\" role=\"region\" :aria-label=\"label\" aria-live=\"polite\" aria-relevant=\"additions\">\n <div\n v-for=\"t in list\"\n :key=\"t.key\"\n :class=\"['ak-toast', t.variant !== 'info' && `ak-toast--${t.variant}`, { 'is-paused': held(t) }]\"\n :style=\"t.duration > 0 ? { '--_dur': `${t.duration}ms` } : undefined\"\n @mouseenter=\"hold(t, 'hovered', true)\"\n @mouseleave=\"hold(t, 'hovered', false)\"\n @focusin=\"hold(t, 'focused', true)\"\n @focusout=\"onFocusout($event, t)\"\n >\n <div class=\"ak-toast__body\">\n <div v-if=\"t.title\" class=\"ak-toast__title\">{{ t.title }}</div>\n <div><Render :content=\"t.content\" /></div>\n </div>\n <button v-if=\"t.closable\" type=\"button\" class=\"ak-message__close\" aria-label=\"关闭\" @click=\"destroy(t.key)\">✕</button>\n <i v-if=\"t.duration > 0\" class=\"ak-toast__progress\" aria-hidden=\"true\" />\n </div>\n </div>\n </Teleport>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 轻提示的容器(同 Naive 的 NMessageProvider):包在应用 / 小部件的最外层,里面的组件用 useToast() 弹提示。\n * 提示栈 .ak-toasts 固定在视口右下角,是一个 aria-live=\"polite\" 的区域:新弹出的提示读屏会念,不打断当前朗读。\n * 也可以拿组件 ref 直接调(ref 上有和 useToast() 一样的方法)。\n */\nimport { onBeforeUnmount, provide, reactive } from \"vue\";\n\nimport { Render } from \"../Tooltip/trigger\";\nimport { toastKey, type ToastApi, type ToastContent, type ToastOptions, type ToastVariant } from \"./useToast\";\n\nconst props = withDefaults(\n defineProps<{\n /** 默认停留时长(ms),0 = 不自动消失;单条可以在选项里改 */\n duration?: number;\n /** 默认显示 ✕ 关闭按钮 */\n closable?: boolean;\n /** 鼠标悬停 / 键盘聚焦在某条上时暂停它的倒计时(同 Naive 的 keep-alive-on-hover) */\n keepAliveOnHover?: boolean;\n /** 最多同时显示几条,多了先关最早的 */\n max?: number;\n /** 把提示栈传送到别处(Teleport 的 to,如 \"body\");不写就渲染在原地——它是 fixed 定位,一般用不着 */\n to?: string | HTMLElement;\n /** 读屏里提示栈的名字 */\n label?: string;\n }>(),\n { duration: 5000, closable: true, keepAliveOnHover: true, max: undefined, to: undefined, label: \"通知\" },\n);\n\ndefineSlots<{\n /** 应用内容:里面的组件可以 useToast() */\n default?: () => unknown;\n}>();\n\ninterface Item {\n key: number;\n variant: ToastVariant;\n content: ToastContent;\n title?: string;\n duration: number;\n closable: boolean;\n onClose?: () => void;\n hovered: boolean;\n focused: boolean;\n /** 剩余时长(暂停时扣掉已走的)与本轮开始计时的时刻 */\n remaining: number;\n started: number;\n timer?: ReturnType<typeof setTimeout>;\n}\n\nconst list = reactive<Item[]>([]);\nlet seq = 0;\n\nfunction destroy(key: number) {\n const i = list.findIndex(t => t.key === key);\n if (i < 0) return;\n const [t] = list.splice(i, 1);\n clearTimeout(t.timer);\n t.onClose?.();\n}\n\nfunction run(t: Item) {\n clearTimeout(t.timer);\n if (t.duration <= 0) return;\n t.started = Date.now();\n t.timer = setTimeout(() => destroy(t.key), t.remaining);\n}\n\nconst held = (t: Item) => props.keepAliveOnHover && t.duration > 0 && (t.hovered || t.focused);\n\n/** 悬停 / 聚焦:暂停倒计时(进度条由 .is-paused 停住),都离开后接着走剩下的 */\nfunction hold(t: Item, kind: \"hovered\" | \"focused\", on: boolean) {\n const was = held(t);\n t[kind] = on;\n const now = held(t);\n if (!was && now) {\n clearTimeout(t.timer);\n t.remaining -= Date.now() - t.started;\n } else if (was && !now) run(t);\n}\n\nfunction onFocusout(e: FocusEvent, t: Item) {\n if (!(e.currentTarget as HTMLElement).contains(e.relatedTarget as Node | null)) hold(t, \"focused\", false);\n}\n\nfunction create(content: ToastContent, options: ToastOptions & { variant?: ToastVariant } = {}) {\n const duration = options.duration ?? props.duration;\n list.push({\n key: ++seq,\n variant: options.variant ?? \"info\",\n content,\n title: options.title,\n duration,\n closable: options.closable ?? props.closable,\n onClose: options.onClose,\n hovered: false,\n focused: false,\n remaining: duration,\n started: 0,\n });\n const t = list[list.length - 1];\n if (props.max && list.length > props.max) destroy(list[0].key);\n run(t);\n return { destroy: () => destroy(t.key) };\n}\n\nconst api: ToastApi = {\n create,\n info: (c, o) => create(c, { ...o, variant: \"info\" }),\n success: (c, o) => create(c, { ...o, variant: \"success\" }),\n warning: (c, o) => create(c, { ...o, variant: \"warning\" }),\n error: (c, o) => create(c, { ...o, variant: \"danger\" }),\n destroyAll: () => [...list].forEach(t => destroy(t.key)),\n};\nprovide(toastKey, api);\ndefineExpose(api);\n\nonBeforeUnmount(() => list.forEach(t => clearTimeout(t.timer)));\n</script>\n\n<template>\n <slot />\n <Teleport :to=\"to\" :disabled=\"!to\">\n <div class=\"ak-toasts\" role=\"region\" :aria-label=\"label\" aria-live=\"polite\" aria-relevant=\"additions\">\n <div\n v-for=\"t in list\"\n :key=\"t.key\"\n :class=\"['ak-toast', t.variant !== 'info' && `ak-toast--${t.variant}`, { 'is-paused': held(t) }]\"\n :style=\"t.duration > 0 ? { '--_dur': `${t.duration}ms` } : undefined\"\n @mouseenter=\"hold(t, 'hovered', true)\"\n @mouseleave=\"hold(t, 'hovered', false)\"\n @focusin=\"hold(t, 'focused', true)\"\n @focusout=\"onFocusout($event, t)\"\n >\n <div class=\"ak-toast__body\">\n <div v-if=\"t.title\" class=\"ak-toast__title\">{{ t.title }}</div>\n <div><Render :content=\"t.content\" /></div>\n </div>\n <button v-if=\"t.closable\" type=\"button\" class=\"ak-message__close\" aria-label=\"关闭\" @click=\"destroy(t.key)\">✕</button>\n <i v-if=\"t.duration > 0\" class=\"ak-toast__progress\" aria-hidden=\"true\" />\n </div>\n </div>\n </Teleport>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 进度(同 Naive 的 NProgress):默认线形 .ak-progress(可带上方的标签行 .ak-progress-label),circle 是环形 .ak-ring。\n * 输出 role=\"progressbar\" + aria-valuenow;有 label 时标签行的名字作可访问名。\n */\nimport { computed, useId } from \"vue\";\n\nconst props = withDefaults(\n defineProps<{\n /** 百分比 0–100 */\n percentage?: number;\n /** 颜色:accent 主色(默认)· yellow 黄(信赖 / 次强调)· success 绿 · danger 红 */\n variant?: \"accent\" | \"yellow\" | \"success\" | \"danger\";\n /** 线形粗细:sm 4 · md 8(默认)· lg 14(px);环形不适用 */\n size?: \"sm\" | \"md\" | \"lg\";\n /** 名称:线形显示在条上方标签行的左边(并作可访问名);环形只作可访问名(aria-label) */\n label?: string;\n /** 显示数值:默认「N%」,默认插槽可改写(「200 / 200」);线形的数值在标签行右边,只在有 label 或插槽时出标签行 */\n showIndicator?: boolean;\n /** 斜纹(线形) */\n stripes?: boolean;\n /** 不定进度:一段色块来回滑,不报数值(线形) */\n indeterminate?: boolean;\n /** 分段:条切成 N 格,按百分比点亮(3 / 5 格 = steps 5 + percentage 60)(线形) */\n steps?: number;\n /** 环形(= .ak-ring:直径 56,中间是数值)——信赖、完成度 */\n circle?: boolean;\n }>(),\n { percentage: 0, variant: \"accent\", size: \"md\", label: undefined, showIndicator: true, steps: undefined },\n);\n\ndefineSlots<{\n /** 数值文字(代替「N%」) */\n default?: () => unknown;\n}>();\n\nconst id = useId();\nconst pct = computed(() => Math.min(100, Math.max(0, props.percentage)));\n/** 分段时点亮几格 */\nconst lit = computed(() => (props.steps ? Math.round((props.steps * pct.value) / 100) : 0));\n\nconst aria = computed(() => ({\n role: \"progressbar\",\n \"aria-valuemin\": props.indeterminate ? undefined : 0,\n \"aria-valuemax\": props.indeterminate ? undefined : 100,\n \"aria-valuenow\": props.indeterminate ? undefined : pct.value,\n \"aria-valuetext\": props.steps ? `${lit.value} / ${props.steps}` : undefined,\n}));\n\nconst barClasses = computed(() => [\n \"ak-progress\",\n props.size !== \"md\" && `ak-progress--${props.size}`,\n props.variant !== \"accent\" && `ak-progress--${props.variant}`,\n {\n \"ak-progress--stripes\": props.stripes,\n \"ak-progress--indeterminate\": props.indeterminate,\n \"ak-progress--segmented\": props.steps,\n },\n]);\n/** 条宽走 CSS 的 --_v;不定进度 / 分段不用它 */\nconst barStyle = computed(() => (props.indeterminate || props.steps ? undefined : { \"--_v\": `${pct.value}%` }));\n</script>\n\n<template>\n <div\n v-if=\"circle\"\n v-bind=\"aria\"\n :aria-label=\"label\"\n :class=\"['ak-ring', variant !== 'accent' && `ak-ring--${variant}`]\"\n :style=\"{ '--_v': pct }\"\n >\n <span v-if=\"showIndicator || $slots.default\"><slot>{{ pct }}%</slot></span>\n </div>\n <!-- 带标签行:progressbar 在外层,标签行的名字作可访问名 -->\n <div v-else-if=\"label || $slots.default\" v-bind=\"aria\" :aria-labelledby=\"label ? `${id}-label` : undefined\">\n <div class=\"ak-progress-label\">\n <span :id=\"`${id}-label`\">{{ label }}</span>\n <span v-if=\"showIndicator || $slots.default\"><slot>{{ pct }}%</slot></span>\n </div>\n <div :class=\"barClasses\" :style=\"barStyle\"><i v-for=\"n in steps\" :key=\"n\" :class=\"{ 'is-on': n <= lit }\" /></div>\n </div>\n <div v-else v-bind=\"aria\" :class=\"barClasses\" :style=\"barStyle\"><i v-for=\"n in steps\" :key=\"n\" :class=\"{ 'is-on': n <= lit }\" /></div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 进度(同 Naive 的 NProgress):默认线形 .ak-progress(可带上方的标签行 .ak-progress-label),circle 是环形 .ak-ring。\n * 输出 role=\"progressbar\" + aria-valuenow;有 label 时标签行的名字作可访问名。\n */\nimport { computed, useId } from \"vue\";\n\nconst props = withDefaults(\n defineProps<{\n /** 百分比 0–100 */\n percentage?: number;\n /** 颜色:accent 主色(默认)· yellow 黄(信赖 / 次强调)· success 绿 · danger 红 */\n variant?: \"accent\" | \"yellow\" | \"success\" | \"danger\";\n /** 线形粗细:sm 4 · md 8(默认)· lg 14(px);环形不适用 */\n size?: \"sm\" | \"md\" | \"lg\";\n /** 名称:线形显示在条上方标签行的左边(并作可访问名);环形只作可访问名(aria-label) */\n label?: string;\n /** 显示数值:默认「N%」,默认插槽可改写(「200 / 200」);线形的数值在标签行右边,只在有 label 或插槽时出标签行 */\n showIndicator?: boolean;\n /** 斜纹(线形) */\n stripes?: boolean;\n /** 不定进度:一段色块来回滑,不报数值(线形) */\n indeterminate?: boolean;\n /** 分段:条切成 N 格,按百分比点亮(3 / 5 格 = steps 5 + percentage 60)(线形) */\n steps?: number;\n /** 环形(= .ak-ring:直径 56,中间是数值)——信赖、完成度 */\n circle?: boolean;\n }>(),\n { percentage: 0, variant: \"accent\", size: \"md\", label: undefined, showIndicator: true, steps: undefined },\n);\n\ndefineSlots<{\n /** 数值文字(代替「N%」) */\n default?: () => unknown;\n}>();\n\nconst id = useId();\nconst pct = computed(() => Math.min(100, Math.max(0, props.percentage)));\n/** 分段时点亮几格 */\nconst lit = computed(() => (props.steps ? Math.round((props.steps * pct.value) / 100) : 0));\n\nconst aria = computed(() => ({\n role: \"progressbar\",\n \"aria-valuemin\": props.indeterminate ? undefined : 0,\n \"aria-valuemax\": props.indeterminate ? undefined : 100,\n \"aria-valuenow\": props.indeterminate ? undefined : pct.value,\n \"aria-valuetext\": props.steps ? `${lit.value} / ${props.steps}` : undefined,\n}));\n\nconst barClasses = computed(() => [\n \"ak-progress\",\n props.size !== \"md\" && `ak-progress--${props.size}`,\n props.variant !== \"accent\" && `ak-progress--${props.variant}`,\n {\n \"ak-progress--stripes\": props.stripes,\n \"ak-progress--indeterminate\": props.indeterminate,\n \"ak-progress--segmented\": props.steps,\n },\n]);\n/** 条宽走 CSS 的 --_v;不定进度 / 分段不用它 */\nconst barStyle = computed(() => (props.indeterminate || props.steps ? undefined : { \"--_v\": `${pct.value}%` }));\n</script>\n\n<template>\n <div\n v-if=\"circle\"\n v-bind=\"aria\"\n :aria-label=\"label\"\n :class=\"['ak-ring', variant !== 'accent' && `ak-ring--${variant}`]\"\n :style=\"{ '--_v': pct }\"\n >\n <span v-if=\"showIndicator || $slots.default\"><slot>{{ pct }}%</slot></span>\n </div>\n <!-- 带标签行:progressbar 在外层,标签行的名字作可访问名 -->\n <div v-else-if=\"label || $slots.default\" v-bind=\"aria\" :aria-labelledby=\"label ? `${id}-label` : undefined\">\n <div class=\"ak-progress-label\">\n <span :id=\"`${id}-label`\">{{ label }}</span>\n <span v-if=\"showIndicator || $slots.default\"><slot>{{ pct }}%</slot></span>\n </div>\n <div :class=\"barClasses\" :style=\"barStyle\"><i v-for=\"n in steps\" :key=\"n\" :class=\"{ 'is-on': n <= lit }\" /></div>\n </div>\n <div v-else v-bind=\"aria\" :class=\"barClasses\" :style=\"barStyle\"><i v-for=\"n in steps\" :key=\"n\" :class=\"{ 'is-on': n <= lit }\" /></div>\n</template>\n","<script setup lang=\"ts\">\n/** 统计数字(同 Naive 的 NStatistic):小号大写的名称 + 大号等宽数字 + 可选的变化量;一排放进 AkStatRow */\nimport { computed } from \"vue\";\n\nconst props = withDefaults(\n defineProps<{\n /** 名称(小号大写 overline:Operators / Edits / 24h);要带格式时用 #label 插槽 */\n label?: string;\n /** 数值,原样显示(千分位等格式由调用方先排好:「1,204」);也可以写在默认插槽里 */\n value?: string | number;\n /** 变化量(「+4 本月」「-12%」),显示在数值下面 */\n delta?: string;\n /** 变化方向(颜色取游戏富文本的升 / 降色);不写时按 delta 开头的 + / - 判断 */\n trend?: \"up\" | \"down\";\n /** 行内:一行「名称 数值」,不要卡片框(放进正文 / 表格里) */\n inline?: boolean;\n }>(),\n { label: undefined, value: undefined, delta: undefined, trend: undefined },\n);\n\ndefineSlots<{\n /** 数值(代替 value) */\n default?: () => unknown;\n /** 名称(代替 label) */\n label?: () => unknown;\n /** 数值前面的内容(货币符号、图标) */\n prefix?: () => unknown;\n /** 数值后面的小字单位(渲染成 <small>:2.3<small>k</small>) */\n suffix?: () => unknown;\n}>();\n\nconst direction = computed(() => props.trend ?? (/^\\+/.test(props.delta ?? \"\") ? \"up\" : /^[-−]/.test(props.delta ?? \"\") ? \"down\" : undefined));\n</script>\n\n<template>\n <div :class=\"['ak-stat', inline && 'ak-stat--inline']\">\n <span v-if=\"label || $slots.label\" class=\"ak-stat__label\"><slot name=\"label\">{{ label }}</slot></span>\n <span class=\"ak-stat__value\">\n <slot name=\"prefix\" /><slot>{{ value }}</slot><small v-if=\"$slots.suffix\"><slot name=\"suffix\" /></small>\n </span>\n <span v-if=\"delta\" :class=\"['ak-stat__delta', direction && `ak-stat__delta--${direction}`]\">{{ delta }}</span>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/** 统计数字(同 Naive 的 NStatistic):小号大写的名称 + 大号等宽数字 + 可选的变化量;一排放进 AkStatRow */\nimport { computed } from \"vue\";\n\nconst props = withDefaults(\n defineProps<{\n /** 名称(小号大写 overline:Operators / Edits / 24h);要带格式时用 #label 插槽 */\n label?: string;\n /** 数值,原样显示(千分位等格式由调用方先排好:「1,204」);也可以写在默认插槽里 */\n value?: string | number;\n /** 变化量(「+4 本月」「-12%」),显示在数值下面 */\n delta?: string;\n /** 变化方向(颜色取游戏富文本的升 / 降色);不写时按 delta 开头的 + / - 判断 */\n trend?: \"up\" | \"down\";\n /** 行内:一行「名称 数值」,不要卡片框(放进正文 / 表格里) */\n inline?: boolean;\n }>(),\n { label: undefined, value: undefined, delta: undefined, trend: undefined },\n);\n\ndefineSlots<{\n /** 数值(代替 value) */\n default?: () => unknown;\n /** 名称(代替 label) */\n label?: () => unknown;\n /** 数值前面的内容(货币符号、图标) */\n prefix?: () => unknown;\n /** 数值后面的小字单位(渲染成 <small>:2.3<small>k</small>) */\n suffix?: () => unknown;\n}>();\n\nconst direction = computed(() => props.trend ?? (/^\\+/.test(props.delta ?? \"\") ? \"up\" : /^[-−]/.test(props.delta ?? \"\") ? \"down\" : undefined));\n</script>\n\n<template>\n <div :class=\"['ak-stat', inline && 'ak-stat--inline']\">\n <span v-if=\"label || $slots.label\" class=\"ak-stat__label\"><slot name=\"label\">{{ label }}</slot></span>\n <span class=\"ak-stat__value\">\n <slot name=\"prefix\" /><slot>{{ value }}</slot><small v-if=\"$slots.suffix\"><slot name=\"suffix\" /></small>\n </span>\n <span v-if=\"delta\" :class=\"['ak-stat__delta', direction && `ak-stat__delta--${direction}`]\">{{ delta }}</span>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/** 一排统计卡片:自动铺满(每格至少 120px,放不下就换行),间距 12 */\ndefineSlots<{\n /** 若干 AkStat */\n default?: () => unknown;\n}>();\n</script>\n\n<template>\n <div class=\"ak-stat-row\"><slot /></div>\n</template>\n","<script setup lang=\"ts\">\n/** 一排统计卡片:自动铺满(每格至少 120px,放不下就换行),间距 12 */\ndefineSlots<{\n /** 若干 AkStat */\n default?: () => unknown;\n}>();\n</script>\n\n<template>\n <div class=\"ak-stat-row\"><slot /></div>\n</template>\n","<script setup lang=\"ts\">\n/** 面包屑的一项(= Naive 的 NBreadcrumbItem),只能放在 AkBreadcrumb 里 */\ndefineProps<{\n /** 链接地址;不写就是纯文字(当前页一般不写) */\n href?: string;\n /** 当前页:aria-current=\"page\" + 加粗。一项都没写时 AkBreadcrumb 自动把最后一项当作当前页 */\n current?: boolean;\n}>();\n\ndefineSlots<{\n /** 文字;要用路由链接(RouterLink)时整个写在这里、不写 href */\n default?: () => unknown;\n}>();\n</script>\n\n<template>\n <li :aria-current=\"current && !href ? 'page' : undefined\">\n <a v-if=\"href\" :href=\"href\" :aria-current=\"current ? 'page' : undefined\"><slot /></a>\n <slot v-else />\n </li>\n</template>\n","<script setup lang=\"ts\">\n/** 面包屑的一项(= Naive 的 NBreadcrumbItem),只能放在 AkBreadcrumb 里 */\ndefineProps<{\n /** 链接地址;不写就是纯文字(当前页一般不写) */\n href?: string;\n /** 当前页:aria-current=\"page\" + 加粗。一项都没写时 AkBreadcrumb 自动把最后一项当作当前页 */\n current?: boolean;\n}>();\n\ndefineSlots<{\n /** 文字;要用路由链接(RouterLink)时整个写在这里、不写 href */\n default?: () => unknown;\n}>();\n</script>\n\n<template>\n <li :aria-current=\"current && !href ? 'page' : undefined\">\n <a v-if=\"href\" :href=\"href\" :aria-current=\"current ? 'page' : undefined\"><slot /></a>\n <slot v-else />\n </li>\n</template>\n","<script setup lang=\"ts\">\nimport { Comment, Fragment, cloneVNode, type VNode } from \"vue\";\n\nimport AkBreadcrumbItem from \"./AkBreadcrumbItem.vue\";\n\n/**\n * 面包屑(= Naive 的 NBreadcrumb):<nav> 地标里一条 <ol class=\"ak-breadcrumb\">,里面放 AkBreadcrumbItem。\n * 分隔符是 CSS 画的斜角(li + li::before),不能换字符。外层标 ak-not-prose:正文的列表缩进 / 项目符号不进来。\n * 没有哪一项写了 current 时,最后一项自动标成当前页(aria-current=\"page\",加粗)——所以这里要读子组件 vnode(同 AkTabs)。\n */\nwithDefaults(\n defineProps<{\n /** 导航地标的可访问名(nav 的 aria-label) */\n label?: string;\n }>(),\n { label: \"面包屑\" },\n);\n\nconst slots = defineSlots<{\n /** 若干 AkBreadcrumbItem,从上级到当前页 */\n default?: () => VNode[];\n}>();\n\nconst flatten = (nodes: VNode[]): VNode[] =>\n nodes.flatMap(n => (n.type === Fragment && Array.isArray(n.children) ? flatten(n.children as VNode[]) : n.type === Comment ? [] : [n]));\n\n/** 插槽只能在渲染期调用,所以由模板调用 */\nfunction items(): VNode[] {\n const nodes = flatten(slots.default?.() ?? []);\n const crumbs = nodes.filter(n => n.type === AkBreadcrumbItem);\n if (crumbs.some(n => n.props && \"current\" in n.props)) return nodes;\n const last = crumbs.at(-1);\n return nodes.map(n => (n === last ? cloneVNode(n, { current: true }) : n));\n}\n\nconst Render = (p: { nodes: VNode[] }) => p.nodes;\n</script>\n\n<template>\n <nav class=\"ak-not-prose\" :aria-label=\"label\">\n <ol class=\"ak-breadcrumb\"><Render :nodes=\"items()\" /></ol>\n </nav>\n</template>\n","<script setup lang=\"ts\">\nimport { Comment, Fragment, cloneVNode, type VNode } from \"vue\";\n\nimport AkBreadcrumbItem from \"./AkBreadcrumbItem.vue\";\n\n/**\n * 面包屑(= Naive 的 NBreadcrumb):<nav> 地标里一条 <ol class=\"ak-breadcrumb\">,里面放 AkBreadcrumbItem。\n * 分隔符是 CSS 画的斜角(li + li::before),不能换字符。外层标 ak-not-prose:正文的列表缩进 / 项目符号不进来。\n * 没有哪一项写了 current 时,最后一项自动标成当前页(aria-current=\"page\",加粗)——所以这里要读子组件 vnode(同 AkTabs)。\n */\nwithDefaults(\n defineProps<{\n /** 导航地标的可访问名(nav 的 aria-label) */\n label?: string;\n }>(),\n { label: \"面包屑\" },\n);\n\nconst slots = defineSlots<{\n /** 若干 AkBreadcrumbItem,从上级到当前页 */\n default?: () => VNode[];\n}>();\n\nconst flatten = (nodes: VNode[]): VNode[] =>\n nodes.flatMap(n => (n.type === Fragment && Array.isArray(n.children) ? flatten(n.children as VNode[]) : n.type === Comment ? [] : [n]));\n\n/** 插槽只能在渲染期调用,所以由模板调用 */\nfunction items(): VNode[] {\n const nodes = flatten(slots.default?.() ?? []);\n const crumbs = nodes.filter(n => n.type === AkBreadcrumbItem);\n if (crumbs.some(n => n.props && \"current\" in n.props)) return nodes;\n const last = crumbs.at(-1);\n return nodes.map(n => (n === last ? cloneVNode(n, { current: true }) : n));\n}\n\nconst Render = (p: { nodes: VNode[] }) => p.nodes;\n</script>\n\n<template>\n <nav class=\"ak-not-prose\" :aria-label=\"label\">\n <ol class=\"ak-breadcrumb\"><Render :nodes=\"items()\" /></ol>\n </nav>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\n/**\n * 分页(= Naive 的 NPagination,精简):‹ 页码 … 页码 ›,当前页主色实底。\n * 不给 page-href 时页码是页内切换的 <button>;给了就渲染成 <a href>(MW 页面上真能打开的地址,同 CSS 版)。\n */\nconst props = withDefaults(\n defineProps<{\n /** 总页数;不写时由 itemCount ÷ pageSize 算出 */\n pageCount?: number;\n /** 总条数(配合 pageSize 算页数) */\n itemCount?: number;\n /** 每页条数(只在用 itemCount 算页数时有用) */\n pageSize?: number;\n /** 最多显示几格页码(含首页、尾页和省略号,同 Naive 的 page-slot,最少 5);每格约 50px,窄处调小 */\n pageSlot?: number;\n /** 整组禁用 */\n disabled?: boolean;\n /** 页码链接:给了就渲染成 <a href=\"pageHref(n)\">,点击照常跳转;不给就是 <button>,只更新 v-model */\n pageHref?: (page: number) => string;\n /** 导航地标的可访问名(nav 的 aria-label) */\n label?: string;\n }>(),\n { pageCount: undefined, itemCount: undefined, pageSize: 10, pageSlot: 7, pageHref: undefined, label: \"分页\" },\n);\n\n/** 当前页(从 1 数) */\nconst page = defineModel<number>({ default: 1 });\n\ndefineSlots<{\n /** 「上一页」按钮的内容(默认 ‹) */\n prev?: () => unknown;\n /** 「下一页」按钮的内容(默认 ›) */\n next?: () => unknown;\n}>();\n\nconst count = computed(() => Math.max(1, props.pageCount ?? Math.ceil((props.itemCount ?? 0) / props.pageSize)));\nconst current = computed(() => Math.min(Math.max(1, page.value), count.value));\n\nconst range = (from: number, to: number) => Array.from({ length: to - from + 1 }, (_, i) => from + i);\n\n/** 页码格:数字 = 页码,\"…\" = 省略号。首尾页常驻、当前页居中,两边放不下的收成省略号(同 Naive 的算法,省略号不可点) */\nconst cells = computed<(number | \"…\")[]>(() => {\n const n = count.value;\n const c = current.value;\n const slot = Math.max(5, props.pageSlot);\n if (n <= slot) return range(1, n);\n const width = slot - 4; // 两个省略号之间的窗口\n const left = c - Math.floor((width - 1) / 2);\n const right = left + width - 1;\n if (left <= 3) return [...range(1, slot - 2), \"…\", n];\n if (right >= n - 2) return [1, \"…\", ...range(n - slot + 3, n)];\n return [1, \"…\", ...range(left, right), \"…\", n];\n});\n\nconst tag = computed(() => (props.pageHref ? \"a\" : \"button\"));\n\n/** <a> / <button> 各自的属性:禁用的链接去掉 href、标 aria-disabled;禁用的按钮用 disabled */\nfunction attrs(target: number, off: boolean) {\n return props.pageHref ? { href: off ? undefined : props.pageHref(target), \"aria-disabled\": off || undefined } : { type: \"button\", disabled: off };\n}\n\nfunction go(target: number, e: MouseEvent) {\n if (props.disabled || target < 1 || target > count.value) return e.preventDefault();\n page.value = target;\n}\n</script>\n\n<template>\n <nav class=\"ak-pagination\" :aria-label=\"label\">\n <component\n :is=\"tag\"\n v-bind=\"attrs(current - 1, disabled || current <= 1)\"\n :class=\"['ak-pagination__item', { 'is-disabled': disabled || current <= 1 }]\"\n aria-label=\"上一页\"\n @click=\"go(current - 1, $event)\"\n >\n <slot name=\"prev\">‹</slot>\n </component>\n <template v-for=\"(cell, i) in cells\" :key=\"cell === '…' ? `gap-${i}` : cell\">\n <span v-if=\"cell === '…'\" class=\"ak-pagination__ellipsis\" aria-hidden=\"true\">…</span>\n <component\n :is=\"tag\"\n v-else\n v-bind=\"attrs(cell, disabled)\"\n :class=\"['ak-pagination__item', { 'is-active': cell === current, 'is-disabled': disabled }]\"\n :aria-current=\"cell === current ? 'page' : undefined\"\n :aria-label=\"`第 ${cell} 页`\"\n @click=\"go(cell, $event)\"\n >\n {{ cell }}\n </component>\n </template>\n <component\n :is=\"tag\"\n v-bind=\"attrs(current + 1, disabled || current >= count)\"\n :class=\"['ak-pagination__item', { 'is-disabled': disabled || current >= count }]\"\n aria-label=\"下一页\"\n @click=\"go(current + 1, $event)\"\n >\n <slot name=\"next\">›</slot>\n </component>\n </nav>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\n/**\n * 分页(= Naive 的 NPagination,精简):‹ 页码 … 页码 ›,当前页主色实底。\n * 不给 page-href 时页码是页内切换的 <button>;给了就渲染成 <a href>(MW 页面上真能打开的地址,同 CSS 版)。\n */\nconst props = withDefaults(\n defineProps<{\n /** 总页数;不写时由 itemCount ÷ pageSize 算出 */\n pageCount?: number;\n /** 总条数(配合 pageSize 算页数) */\n itemCount?: number;\n /** 每页条数(只在用 itemCount 算页数时有用) */\n pageSize?: number;\n /** 最多显示几格页码(含首页、尾页和省略号,同 Naive 的 page-slot,最少 5);每格约 50px,窄处调小 */\n pageSlot?: number;\n /** 整组禁用 */\n disabled?: boolean;\n /** 页码链接:给了就渲染成 <a href=\"pageHref(n)\">,点击照常跳转;不给就是 <button>,只更新 v-model */\n pageHref?: (page: number) => string;\n /** 导航地标的可访问名(nav 的 aria-label) */\n label?: string;\n }>(),\n { pageCount: undefined, itemCount: undefined, pageSize: 10, pageSlot: 7, pageHref: undefined, label: \"分页\" },\n);\n\n/** 当前页(从 1 数) */\nconst page = defineModel<number>({ default: 1 });\n\ndefineSlots<{\n /** 「上一页」按钮的内容(默认 ‹) */\n prev?: () => unknown;\n /** 「下一页」按钮的内容(默认 ›) */\n next?: () => unknown;\n}>();\n\nconst count = computed(() => Math.max(1, props.pageCount ?? Math.ceil((props.itemCount ?? 0) / props.pageSize)));\nconst current = computed(() => Math.min(Math.max(1, page.value), count.value));\n\nconst range = (from: number, to: number) => Array.from({ length: to - from + 1 }, (_, i) => from + i);\n\n/** 页码格:数字 = 页码,\"…\" = 省略号。首尾页常驻、当前页居中,两边放不下的收成省略号(同 Naive 的算法,省略号不可点) */\nconst cells = computed<(number | \"…\")[]>(() => {\n const n = count.value;\n const c = current.value;\n const slot = Math.max(5, props.pageSlot);\n if (n <= slot) return range(1, n);\n const width = slot - 4; // 两个省略号之间的窗口\n const left = c - Math.floor((width - 1) / 2);\n const right = left + width - 1;\n if (left <= 3) return [...range(1, slot - 2), \"…\", n];\n if (right >= n - 2) return [1, \"…\", ...range(n - slot + 3, n)];\n return [1, \"…\", ...range(left, right), \"…\", n];\n});\n\nconst tag = computed(() => (props.pageHref ? \"a\" : \"button\"));\n\n/** <a> / <button> 各自的属性:禁用的链接去掉 href、标 aria-disabled;禁用的按钮用 disabled */\nfunction attrs(target: number, off: boolean) {\n return props.pageHref ? { href: off ? undefined : props.pageHref(target), \"aria-disabled\": off || undefined } : { type: \"button\", disabled: off };\n}\n\nfunction go(target: number, e: MouseEvent) {\n if (props.disabled || target < 1 || target > count.value) return e.preventDefault();\n page.value = target;\n}\n</script>\n\n<template>\n <nav class=\"ak-pagination\" :aria-label=\"label\">\n <component\n :is=\"tag\"\n v-bind=\"attrs(current - 1, disabled || current <= 1)\"\n :class=\"['ak-pagination__item', { 'is-disabled': disabled || current <= 1 }]\"\n aria-label=\"上一页\"\n @click=\"go(current - 1, $event)\"\n >\n <slot name=\"prev\">‹</slot>\n </component>\n <template v-for=\"(cell, i) in cells\" :key=\"cell === '…' ? `gap-${i}` : cell\">\n <span v-if=\"cell === '…'\" class=\"ak-pagination__ellipsis\" aria-hidden=\"true\">…</span>\n <component\n :is=\"tag\"\n v-else\n v-bind=\"attrs(cell, disabled)\"\n :class=\"['ak-pagination__item', { 'is-active': cell === current, 'is-disabled': disabled }]\"\n :aria-current=\"cell === current ? 'page' : undefined\"\n :aria-label=\"`第 ${cell} 页`\"\n @click=\"go(cell, $event)\"\n >\n {{ cell }}\n </component>\n </template>\n <component\n :is=\"tag\"\n v-bind=\"attrs(current + 1, disabled || current >= count)\"\n :class=\"['ak-pagination__item', { 'is-disabled': disabled || current >= count }]\"\n aria-label=\"下一页\"\n @click=\"go(current + 1, $event)\"\n >\n <slot name=\"next\">›</slot>\n </component>\n </nav>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 时间线(= Naive 的 NTimeline):左侧一条竖线 + 菱形节点,里面放 AkTimelineItem。\n * 不标 ak-not-prose:timeline.css 自己压得过正文列表规则,说明里的链接照常是正文链接。\n */\ndefineSlots<{\n /** 若干 AkTimelineItem,从早到晚 */\n default?: () => unknown;\n}>();\n</script>\n\n<template>\n <ul class=\"ak-timeline\"><slot /></ul>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 时间线(= Naive 的 NTimeline):左侧一条竖线 + 菱形节点,里面放 AkTimelineItem。\n * 不标 ak-not-prose:timeline.css 自己压得过正文列表规则,说明里的链接照常是正文链接。\n */\ndefineSlots<{\n /** 若干 AkTimelineItem,从早到晚 */\n default?: () => unknown;\n}>();\n</script>\n\n<template>\n <ul class=\"ak-timeline\"><slot /></ul>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nexport type TimelineStatus = \"wait\" | \"active\" | \"done\";\n\n/** 时间线的一项(= Naive 的 NTimelineItem),只能放在 AkTimeline 里 */\nconst props = withDefaults(\n defineProps<{\n /** 时间(Bender 小字,在标题上方) */\n time?: string;\n /** 标题 */\n title?: string;\n /** 说明文字(也可以写在默认插槽里) */\n content?: string;\n /** 节点状态:wait 空心菱形(默认)· active 当前 · done 已发生(后两者都是主色实心) */\n status?: TimelineStatus;\n }>(),\n { time: undefined, title: undefined, content: undefined, status: \"wait\" },\n);\n\ndefineSlots<{\n /** 标题(代替 title) */\n header?: () => unknown;\n /** 说明(代替 content) */\n default?: () => unknown;\n}>();\n\nconst classes = computed(() => ({ \"is-active\": props.status === \"active\", \"is-done\": props.status === \"done\" }));\n</script>\n\n<template>\n <li :class=\"classes\">\n <span v-if=\"time\" class=\"ak-timeline__date\">{{ time }}</span>\n <div v-if=\"title || $slots.header\" class=\"ak-timeline__title\"><slot name=\"header\">{{ title }}</slot></div>\n <div v-if=\"content || $slots.default\" class=\"ak-timeline__desc\"><slot>{{ content }}</slot></div>\n </li>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nexport type TimelineStatus = \"wait\" | \"active\" | \"done\";\n\n/** 时间线的一项(= Naive 的 NTimelineItem),只能放在 AkTimeline 里 */\nconst props = withDefaults(\n defineProps<{\n /** 时间(Bender 小字,在标题上方) */\n time?: string;\n /** 标题 */\n title?: string;\n /** 说明文字(也可以写在默认插槽里) */\n content?: string;\n /** 节点状态:wait 空心菱形(默认)· active 当前 · done 已发生(后两者都是主色实心) */\n status?: TimelineStatus;\n }>(),\n { time: undefined, title: undefined, content: undefined, status: \"wait\" },\n);\n\ndefineSlots<{\n /** 标题(代替 title) */\n header?: () => unknown;\n /** 说明(代替 content) */\n default?: () => unknown;\n}>();\n\nconst classes = computed(() => ({ \"is-active\": props.status === \"active\", \"is-done\": props.status === \"done\" }));\n</script>\n\n<template>\n <li :class=\"classes\">\n <span v-if=\"time\" class=\"ak-timeline__date\">{{ time }}</span>\n <div v-if=\"title || $slots.header\" class=\"ak-timeline__title\"><slot name=\"header\">{{ title }}</slot></div>\n <div v-if=\"content || $slots.default\" class=\"ak-timeline__desc\"><slot>{{ content }}</slot></div>\n </li>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 步骤条的一步(= Naive 的 NStep),只能直接放在 AkSteps 里。\n * AkSteps 读它的 title / status / 默认插槽自己画这一步(序号由 CSS 计数器给),这个组件本身不会被挂载。\n */\nexport type StepStatus = \"wait\" | \"active\" | \"done\";\n\ndefineProps<{\n /** 步骤名(也可以写在默认插槽里) */\n title?: string;\n /** 状态:wait 未到 · active 当前(主色序号 + 加粗)· done 已完成(主色序号 + 主色连线);不写时按 AkSteps 的 current 推算 */\n status?: StepStatus;\n}>();\n\ndefineSlots<{\n /** 步骤名(代替 title) */\n default?: () => unknown;\n}>();\n</script>\n\n<template>\n <slot>{{ title }}</slot>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 步骤条的一步(= Naive 的 NStep),只能直接放在 AkSteps 里。\n * AkSteps 读它的 title / status / 默认插槽自己画这一步(序号由 CSS 计数器给),这个组件本身不会被挂载。\n */\nexport type StepStatus = \"wait\" | \"active\" | \"done\";\n\ndefineProps<{\n /** 步骤名(也可以写在默认插槽里) */\n title?: string;\n /** 状态:wait 未到 · active 当前(主色序号 + 加粗)· done 已完成(主色序号 + 主色连线);不写时按 AkSteps 的 current 推算 */\n status?: StepStatus;\n}>();\n\ndefineSlots<{\n /** 步骤名(代替 title) */\n default?: () => unknown;\n}>();\n</script>\n\n<template>\n <slot>{{ title }}</slot>\n</template>\n","<script setup lang=\"ts\">\nimport { Comment, Fragment, type VNode } from \"vue\";\n\nimport AkStep, { type StepStatus } from \"./AkStep.vue\";\n\n/**\n * 步骤条(= Naive 的 NSteps,只有横排):一排带序号的步骤 + 连线,放若干 AkStep。\n * 同 AkTabs:从默认插槽读 AkStep 的 props 自己画,首次渲染 / SSR 预渲染就是完整的。只是展示进度,不可点。\n * 输出 ol > li;ol 上显式 role=\"list\":Safari(VoiceOver)对 list-style: none 的列表不报列表语义,写上补回。\n */\nconst props = defineProps<{\n /** 当前步骤(从 1 数,同 Naive):之前的已完成、这一步是当前、之后未到;超过步数 = 全部完成;不写则各步按自己的 status */\n current?: number;\n /** 读屏用的列表名(如「精英化进度」) */\n label?: string;\n}>();\n\nconst slots = defineSlots<{\n /** 若干 AkStep */\n default?: () => VNode[];\n}>();\n\ninterface StepDef {\n key: PropertyKey;\n status: StepStatus;\n /** 步骤名:默认插槽,没有就用 title 字符串 */\n title: (() => unknown) | string | undefined;\n}\n\nconst flatten = (nodes: VNode[]): VNode[] =>\n nodes.flatMap(n => (n.type === Fragment && Array.isArray(n.children) ? flatten(n.children as VNode[]) : n.type === Comment ? [] : [n]));\n\n/** 插槽只能在渲染期调用,所以由模板调用 */\nfunction collect(): StepDef[] {\n return flatten(slots.default?.() ?? [])\n .filter(n => n.type === AkStep)\n .map((n, i) => {\n const p = (n.props ?? {}) as Record<string, unknown>;\n const s = (n.children ?? {}) as Record<string, (() => unknown) | undefined>;\n const c = props.current;\n const derived: StepStatus = c === undefined ? \"wait\" : i + 1 < c ? \"done\" : i + 1 === c ? \"active\" : \"wait\";\n return { key: n.key ?? i, status: (p.status as StepStatus | undefined) ?? derived, title: s.default ?? (p.title as string | undefined) };\n });\n}\n\n/** 把插槽函数 / 字符串原样渲染;定义在外面保持同一个组件类型,重渲染时不重建 */\nconst Render = (p: { content: unknown }) => (typeof p.content === \"function\" ? p.content() : p.content);\n</script>\n\n<template>\n <ol class=\"ak-stepper\" role=\"list\" :aria-label=\"label\">\n <li\n v-for=\"s in collect()\"\n :key=\"s.key\"\n :class=\"['ak-step', s.status !== 'wait' && `is-${s.status}`]\"\n :aria-current=\"s.status === 'active' ? 'step' : undefined\"\n >\n <Render :content=\"s.title\" /><span v-if=\"s.status === 'done'\" class=\"ak-sr-only\">(已完成)</span>\n </li>\n </ol>\n</template>\n","<script setup lang=\"ts\">\nimport { Comment, Fragment, type VNode } from \"vue\";\n\nimport AkStep, { type StepStatus } from \"./AkStep.vue\";\n\n/**\n * 步骤条(= Naive 的 NSteps,只有横排):一排带序号的步骤 + 连线,放若干 AkStep。\n * 同 AkTabs:从默认插槽读 AkStep 的 props 自己画,首次渲染 / SSR 预渲染就是完整的。只是展示进度,不可点。\n * 输出 ol > li;ol 上显式 role=\"list\":Safari(VoiceOver)对 list-style: none 的列表不报列表语义,写上补回。\n */\nconst props = defineProps<{\n /** 当前步骤(从 1 数,同 Naive):之前的已完成、这一步是当前、之后未到;超过步数 = 全部完成;不写则各步按自己的 status */\n current?: number;\n /** 读屏用的列表名(如「精英化进度」) */\n label?: string;\n}>();\n\nconst slots = defineSlots<{\n /** 若干 AkStep */\n default?: () => VNode[];\n}>();\n\ninterface StepDef {\n key: PropertyKey;\n status: StepStatus;\n /** 步骤名:默认插槽,没有就用 title 字符串 */\n title: (() => unknown) | string | undefined;\n}\n\nconst flatten = (nodes: VNode[]): VNode[] =>\n nodes.flatMap(n => (n.type === Fragment && Array.isArray(n.children) ? flatten(n.children as VNode[]) : n.type === Comment ? [] : [n]));\n\n/** 插槽只能在渲染期调用,所以由模板调用 */\nfunction collect(): StepDef[] {\n return flatten(slots.default?.() ?? [])\n .filter(n => n.type === AkStep)\n .map((n, i) => {\n const p = (n.props ?? {}) as Record<string, unknown>;\n const s = (n.children ?? {}) as Record<string, (() => unknown) | undefined>;\n const c = props.current;\n const derived: StepStatus = c === undefined ? \"wait\" : i + 1 < c ? \"done\" : i + 1 === c ? \"active\" : \"wait\";\n return { key: n.key ?? i, status: (p.status as StepStatus | undefined) ?? derived, title: s.default ?? (p.title as string | undefined) };\n });\n}\n\n/** 把插槽函数 / 字符串原样渲染;定义在外面保持同一个组件类型,重渲染时不重建 */\nconst Render = (p: { content: unknown }) => (typeof p.content === \"function\" ? p.content() : p.content);\n</script>\n\n<template>\n <ol class=\"ak-stepper\" role=\"list\" :aria-label=\"label\">\n <li\n v-for=\"s in collect()\"\n :key=\"s.key\"\n :class=\"['ak-step', s.status !== 'wait' && `is-${s.status}`]\"\n :aria-current=\"s.status === 'active' ? 'step' : undefined\"\n >\n <Render :content=\"s.title\" /><span v-if=\"s.status === 'done'\" class=\"ak-sr-only\">(已完成)</span>\n </li>\n </ol>\n</template>\n","import type { InjectionKey } from \"vue\";\n\nexport type CollapseName = string | number;\n\n/** AkCollapse 给 AkCollapseItem 的展开状态(同 Naive 的 NCollapse:子项只需要父组件的状态,走 provide / inject) */\nexport const collapseKey: InjectionKey<{\n isOpen: (name: CollapseName) => boolean;\n set: (name: CollapseName, open: boolean) => void;\n}> = Symbol(\"AkCollapse\");\n","<script setup lang=\"ts\">\nimport { provide } from \"vue\";\n\nimport { collapseKey, type CollapseName } from \"./context\";\n\n/**\n * 折叠面板组(= Naive 的 NCollapse;CSS 叫 Accordion / .ak-details):放若干 AkCollapseItem,每项是一个原生 <details>。\n * 本身不输出类名,只是个容器;开合状态收在 v-model 里,accordion 时同一时间只开一项。\n */\nconst props = defineProps<{\n /** 手风琴:同一时间只展开一项(展开一项时收起其他) */\n accordion?: boolean;\n}>();\n\n/** 展开项的 name 数组 */\nconst expanded = defineModel<CollapseName[]>({ default: () => [] });\n\ndefineSlots<{\n /** 若干 AkCollapseItem */\n default?: () => unknown;\n}>();\n\nprovide(collapseKey, {\n isOpen: name => expanded.value.includes(name),\n set(name, open) {\n const rest = expanded.value.filter(n => n !== name);\n expanded.value = open ? (props.accordion ? [name] : [...rest, name]) : rest;\n },\n});\n\n/** ↑ / ↓ / Home / End 在各项标题间移动焦点(WAI-ARIA Accordion 的可选键盘支持);Enter / 空格开合是 <summary> 自带的 */\nfunction onKey(e: KeyboardEvent) {\n const t = e.target as HTMLElement;\n if (t.tagName !== \"SUMMARY\") return;\n const heads = [...(e.currentTarget as HTMLElement).querySelectorAll<HTMLElement>(\":scope > details > summary\")];\n const i = heads.indexOf(t);\n if (i < 0) return;\n const to =\n e.key === \"ArrowDown\" ? heads[(i + 1) % heads.length]\n : e.key === \"ArrowUp\" ? heads[(i - 1 + heads.length) % heads.length]\n : e.key === \"Home\" ? heads[0]\n : e.key === \"End\" ? heads.at(-1)\n : undefined;\n if (!to) return;\n e.preventDefault();\n to.focus();\n}\n</script>\n\n<template>\n <div @keydown=\"onKey\"><slot /></div>\n</template>\n","<script setup lang=\"ts\">\nimport { provide } from \"vue\";\n\nimport { collapseKey, type CollapseName } from \"./context\";\n\n/**\n * 折叠面板组(= Naive 的 NCollapse;CSS 叫 Accordion / .ak-details):放若干 AkCollapseItem,每项是一个原生 <details>。\n * 本身不输出类名,只是个容器;开合状态收在 v-model 里,accordion 时同一时间只开一项。\n */\nconst props = defineProps<{\n /** 手风琴:同一时间只展开一项(展开一项时收起其他) */\n accordion?: boolean;\n}>();\n\n/** 展开项的 name 数组 */\nconst expanded = defineModel<CollapseName[]>({ default: () => [] });\n\ndefineSlots<{\n /** 若干 AkCollapseItem */\n default?: () => unknown;\n}>();\n\nprovide(collapseKey, {\n isOpen: name => expanded.value.includes(name),\n set(name, open) {\n const rest = expanded.value.filter(n => n !== name);\n expanded.value = open ? (props.accordion ? [name] : [...rest, name]) : rest;\n },\n});\n\n/** ↑ / ↓ / Home / End 在各项标题间移动焦点(WAI-ARIA Accordion 的可选键盘支持);Enter / 空格开合是 <summary> 自带的 */\nfunction onKey(e: KeyboardEvent) {\n const t = e.target as HTMLElement;\n if (t.tagName !== \"SUMMARY\") return;\n const heads = [...(e.currentTarget as HTMLElement).querySelectorAll<HTMLElement>(\":scope > details > summary\")];\n const i = heads.indexOf(t);\n if (i < 0) return;\n const to =\n e.key === \"ArrowDown\" ? heads[(i + 1) % heads.length]\n : e.key === \"ArrowUp\" ? heads[(i - 1 + heads.length) % heads.length]\n : e.key === \"Home\" ? heads[0]\n : e.key === \"End\" ? heads.at(-1)\n : undefined;\n if (!to) return;\n e.preventDefault();\n to.focus();\n}\n</script>\n\n<template>\n <div @keydown=\"onKey\"><slot /></div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, inject, nextTick, ref, useId, useTemplateRef } from \"vue\";\n\nimport { collapseKey, type CollapseName } from \"./context\";\n\n/**\n * 折叠面板的一项(= Naive 的 NCollapseItem):原生 <details class=\"ak-details\"> + <summary> + .ak-details__body。\n * 开合交给浏览器(点击 / Enter / 空格,页内查找命中时自动展开),toggle 事件里同步回 AkCollapse 的 v-model;\n * <summary> 自带按钮语义与展开状态,不另加 aria-expanded。单独用(不放在 AkCollapse 里)时自己记开合。\n */\nconst props = defineProps<{\n /** 标识,= AkCollapse 的 v-model 数组里的值;不写时自动生成(只能靠点击开合) */\n name?: CollapseName;\n /** 标题;要放图标 / 标签时改用 #header 插槽 */\n title?: string;\n}>();\n\ndefineSlots<{\n /** 标题(代替 title) */\n header?: () => unknown;\n /** 展开后的内容(正文排版照常生效) */\n default?: () => unknown;\n}>();\n\nconst id = useId();\nconst key = computed(() => props.name ?? id);\nconst group = inject(collapseKey, null);\nconst local = ref(false);\nconst open = computed(() => (group ? group.isOpen(key.value) : local.value));\n\nconst el = useTemplateRef<HTMLDetailsElement>(\"el\");\nfunction onToggle() {\n const now = el.value!.open;\n if (now === open.value) return;\n if (group) group.set(key.value, now);\n else local.value = now;\n // v-model 没接住(绑了固定值、不更新)时把 DOM 拨回去,保持与状态一致\n nextTick(() => {\n if (el.value && el.value.open !== open.value) el.value.open = open.value;\n });\n}\n</script>\n\n<template>\n <details ref=\"el\" class=\"ak-details\" :open=\"open\" @toggle=\"onToggle\">\n <summary :id=\"`${id}-head`\" :aria-controls=\"`${id}-body`\"><slot name=\"header\">{{ title }}</slot></summary>\n <div :id=\"`${id}-body`\" class=\"ak-details__body\"><slot /></div>\n </details>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, inject, nextTick, ref, useId, useTemplateRef } from \"vue\";\n\nimport { collapseKey, type CollapseName } from \"./context\";\n\n/**\n * 折叠面板的一项(= Naive 的 NCollapseItem):原生 <details class=\"ak-details\"> + <summary> + .ak-details__body。\n * 开合交给浏览器(点击 / Enter / 空格,页内查找命中时自动展开),toggle 事件里同步回 AkCollapse 的 v-model;\n * <summary> 自带按钮语义与展开状态,不另加 aria-expanded。单独用(不放在 AkCollapse 里)时自己记开合。\n */\nconst props = defineProps<{\n /** 标识,= AkCollapse 的 v-model 数组里的值;不写时自动生成(只能靠点击开合) */\n name?: CollapseName;\n /** 标题;要放图标 / 标签时改用 #header 插槽 */\n title?: string;\n}>();\n\ndefineSlots<{\n /** 标题(代替 title) */\n header?: () => unknown;\n /** 展开后的内容(正文排版照常生效) */\n default?: () => unknown;\n}>();\n\nconst id = useId();\nconst key = computed(() => props.name ?? id);\nconst group = inject(collapseKey, null);\nconst local = ref(false);\nconst open = computed(() => (group ? group.isOpen(key.value) : local.value));\n\nconst el = useTemplateRef<HTMLDetailsElement>(\"el\");\nfunction onToggle() {\n const now = el.value!.open;\n if (now === open.value) return;\n if (group) group.set(key.value, now);\n else local.value = now;\n // v-model 没接住(绑了固定值、不更新)时把 DOM 拨回去,保持与状态一致\n nextTick(() => {\n if (el.value && el.value.open !== open.value) el.value.open = open.value;\n });\n}\n</script>\n\n<template>\n <details ref=\"el\" class=\"ak-details\" :open=\"open\" @toggle=\"onToggle\">\n <summary :id=\"`${id}-head`\" :aria-controls=\"`${id}-body`\"><slot name=\"header\">{{ title }}</slot></summary>\n <div :id=\"`${id}-body`\" class=\"ak-details__body\"><slot /></div>\n </details>\n</template>\n","<script setup lang=\"ts\" generic=\"T extends object\">\nimport { computed } from \"vue\";\n\nimport type { DataTableColumn, DataTableSort } from \"./types\";\n\n/**\n * 数据表(= Naive 的 NDataTable,精简):columns + data 渲染成 <table class=\"ak-table\">。\n * 单元格默认是 row[key];自定义用 #cell-<key> 插槽或列的 render。可排序的列表头里放一枚 <button>(WAI-ARIA APG Sortable Table),\n * 当前排序列标 aria-sort,↑ / ↓ 由 CSS 画。不做分页 / 勾选 / 固定列——CSS 没有这些。\n */\nconst props = withDefaults(\n defineProps<{\n /** 列定义:key 取值字段 · title 表头 · num 数字列 · sorter 可排序 · render 自定义单元格 · className */\n columns: DataTableColumn<T>[];\n /** 行数据 */\n data: T[];\n /** 行的唯一标识(同 Naive 的 row-key);不写用原始下标 */\n rowKey?: (row: T) => string | number;\n /** 行的额外类名(同 Naive 的 row-class-name):给当前行 / 选中行加 is-selected(淡主色底) */\n rowClassName?: string | ((row: T, index: number) => string | undefined);\n /** 斑马纹 */\n striped?: boolean;\n /** 紧凑:格内边距 4 / 8 */\n compact?: boolean;\n /** 表格的可访问名(aria-label);上方已有标题说明这张表时可以不写 */\n label?: string;\n }>(),\n { rowKey: undefined, rowClassName: undefined, label: undefined },\n);\n\n/** 排序状态 { key, order: \"ascending\" | \"descending\" },null = 原顺序;点可排序的表头依次切换 升序 → 降序 → 原顺序 */\nconst sort = defineModel<DataTableSort | null>({ default: null });\n\ndefineSlots<\n {\n /** 没有数据时整行显示的内容(默认「暂无数据」) */\n empty?: () => unknown;\n } & {\n /** 某一列的单元格:#cell-<列 key>=\"{ row, index, value }\"(优先于列的 render) */\n [K in `cell-${string}`]?: (p: { row: T; index: number; value: unknown }) => unknown;\n }\n>();\n\nconst get = (row: T, key: string) => (row as Record<string, unknown>)[key];\nconst compare = (a: unknown, b: unknown) =>\n typeof a === \"number\" && typeof b === \"number\" ? a - b : String(a ?? \"\").localeCompare(String(b ?? \"\"), \"zh-Hans-CN\", { numeric: true });\n\nconst rows = computed(() => {\n const list = props.data.map((row, index) => ({ row, index }));\n const s = sort.value;\n const col = s && props.columns.find(c => c.key === s.key);\n if (!s || !col?.sorter) return list;\n const cmp = typeof col.sorter === \"function\" ? col.sorter : (a: T, b: T) => compare(get(a, col.key), get(b, col.key));\n const dir = s.order === \"ascending\" ? 1 : -1;\n return list.sort((a, b) => cmp(a.row, b.row) * dir || a.index - b.index);\n});\n\nconst ariaSort = (c: DataTableColumn<T>) => (sort.value?.key === c.key ? sort.value.order : undefined);\n\nfunction toggle(c: DataTableColumn<T>) {\n const s = sort.value;\n sort.value = s?.key !== c.key ? { key: c.key, order: \"ascending\" } : s.order === \"ascending\" ? { key: c.key, order: \"descending\" } : null;\n}\n\nconst rowClass = (row: T, i: number) => (typeof props.rowClassName === \"function\" ? props.rowClassName(row, i) : props.rowClassName);\n\n/** 把 render 的返回值原样渲染 */\nconst Render = (p: { content: () => unknown }) => p.content();\n</script>\n\n<template>\n <table :class=\"['ak-table', { 'ak-table--striped': striped, 'ak-table--compact': compact }]\" :aria-label=\"label\">\n <thead>\n <tr>\n <th v-for=\"c in columns\" :key=\"c.key\" scope=\"col\" :class=\"[c.num && 'num', c.className]\" :aria-sort=\"ariaSort(c)\">\n <button v-if=\"c.sorter\" type=\"button\" class=\"ak-table__sort\" @click=\"toggle(c)\">{{ c.title }}</button>\n <template v-else>{{ c.title }}</template>\n </th>\n </tr>\n </thead>\n <tbody>\n <tr v-for=\"(r, i) in rows\" :key=\"rowKey ? rowKey(r.row) : r.index\" :class=\"rowClass(r.row, i)\">\n <td v-for=\"c in columns\" :key=\"c.key\" :class=\"[c.num && 'num', c.className]\">\n <slot :name=\"`cell-${c.key}`\" :row=\"r.row\" :index=\"i\" :value=\"get(r.row, c.key)\">\n <Render v-if=\"c.render\" :content=\"() => c.render!(r.row, i)\" />\n <template v-else>{{ get(r.row, c.key) }}</template>\n </slot>\n </td>\n </tr>\n <tr v-if=\"!rows.length\">\n <td :colspan=\"columns.length\" class=\"ak-fg-muted\"><slot name=\"empty\">暂无数据</slot></td>\n </tr>\n </tbody>\n </table>\n</template>\n","<script setup lang=\"ts\" generic=\"T extends object\">\nimport { computed } from \"vue\";\n\nimport type { DataTableColumn, DataTableSort } from \"./types\";\n\n/**\n * 数据表(= Naive 的 NDataTable,精简):columns + data 渲染成 <table class=\"ak-table\">。\n * 单元格默认是 row[key];自定义用 #cell-<key> 插槽或列的 render。可排序的列表头里放一枚 <button>(WAI-ARIA APG Sortable Table),\n * 当前排序列标 aria-sort,↑ / ↓ 由 CSS 画。不做分页 / 勾选 / 固定列——CSS 没有这些。\n */\nconst props = withDefaults(\n defineProps<{\n /** 列定义:key 取值字段 · title 表头 · num 数字列 · sorter 可排序 · render 自定义单元格 · className */\n columns: DataTableColumn<T>[];\n /** 行数据 */\n data: T[];\n /** 行的唯一标识(同 Naive 的 row-key);不写用原始下标 */\n rowKey?: (row: T) => string | number;\n /** 行的额外类名(同 Naive 的 row-class-name):给当前行 / 选中行加 is-selected(淡主色底) */\n rowClassName?: string | ((row: T, index: number) => string | undefined);\n /** 斑马纹 */\n striped?: boolean;\n /** 紧凑:格内边距 4 / 8 */\n compact?: boolean;\n /** 表格的可访问名(aria-label);上方已有标题说明这张表时可以不写 */\n label?: string;\n }>(),\n { rowKey: undefined, rowClassName: undefined, label: undefined },\n);\n\n/** 排序状态 { key, order: \"ascending\" | \"descending\" },null = 原顺序;点可排序的表头依次切换 升序 → 降序 → 原顺序 */\nconst sort = defineModel<DataTableSort | null>({ default: null });\n\ndefineSlots<\n {\n /** 没有数据时整行显示的内容(默认「暂无数据」) */\n empty?: () => unknown;\n } & {\n /** 某一列的单元格:#cell-<列 key>=\"{ row, index, value }\"(优先于列的 render) */\n [K in `cell-${string}`]?: (p: { row: T; index: number; value: unknown }) => unknown;\n }\n>();\n\nconst get = (row: T, key: string) => (row as Record<string, unknown>)[key];\nconst compare = (a: unknown, b: unknown) =>\n typeof a === \"number\" && typeof b === \"number\" ? a - b : String(a ?? \"\").localeCompare(String(b ?? \"\"), \"zh-Hans-CN\", { numeric: true });\n\nconst rows = computed(() => {\n const list = props.data.map((row, index) => ({ row, index }));\n const s = sort.value;\n const col = s && props.columns.find(c => c.key === s.key);\n if (!s || !col?.sorter) return list;\n const cmp = typeof col.sorter === \"function\" ? col.sorter : (a: T, b: T) => compare(get(a, col.key), get(b, col.key));\n const dir = s.order === \"ascending\" ? 1 : -1;\n return list.sort((a, b) => cmp(a.row, b.row) * dir || a.index - b.index);\n});\n\nconst ariaSort = (c: DataTableColumn<T>) => (sort.value?.key === c.key ? sort.value.order : undefined);\n\nfunction toggle(c: DataTableColumn<T>) {\n const s = sort.value;\n sort.value = s?.key !== c.key ? { key: c.key, order: \"ascending\" } : s.order === \"ascending\" ? { key: c.key, order: \"descending\" } : null;\n}\n\nconst rowClass = (row: T, i: number) => (typeof props.rowClassName === \"function\" ? props.rowClassName(row, i) : props.rowClassName);\n\n/** 把 render 的返回值原样渲染 */\nconst Render = (p: { content: () => unknown }) => p.content();\n</script>\n\n<template>\n <table :class=\"['ak-table', { 'ak-table--striped': striped, 'ak-table--compact': compact }]\" :aria-label=\"label\">\n <thead>\n <tr>\n <th v-for=\"c in columns\" :key=\"c.key\" scope=\"col\" :class=\"[c.num && 'num', c.className]\" :aria-sort=\"ariaSort(c)\">\n <button v-if=\"c.sorter\" type=\"button\" class=\"ak-table__sort\" @click=\"toggle(c)\">{{ c.title }}</button>\n <template v-else>{{ c.title }}</template>\n </th>\n </tr>\n </thead>\n <tbody>\n <tr v-for=\"(r, i) in rows\" :key=\"rowKey ? rowKey(r.row) : r.index\" :class=\"rowClass(r.row, i)\">\n <td v-for=\"c in columns\" :key=\"c.key\" :class=\"[c.num && 'num', c.className]\">\n <slot :name=\"`cell-${c.key}`\" :row=\"r.row\" :index=\"i\" :value=\"get(r.row, c.key)\">\n <Render v-if=\"c.render\" :content=\"() => c.render!(r.row, i)\" />\n <template v-else>{{ get(r.row, c.key) }}</template>\n </slot>\n </td>\n </tr>\n <tr v-if=\"!rows.length\">\n <td :colspan=\"columns.length\" class=\"ak-fg-muted\"><slot name=\"empty\">暂无数据</slot></td>\n </tr>\n </tbody>\n </table>\n</template>\n","<script setup lang=\"ts\">\nimport { onBeforeUnmount, onMounted, watch } from \"vue\";\n\nimport type { IconName } from \"../../icons\";\nimport AkIcon from \"../Icon/AkIcon.vue\";\n\n/**\n * 回到顶部(= Naive 的 NBackTop;CSS 叫 FAB / .ak-fab):右下角 44px 反色方块,滚过 visibility-height 淡入,点了平滑滚回顶部。\n * 整页那枚由皮肤输出(skin.js 同样 600px 出现),而且 < 1400 时皮肤把它收进目录浮层——Vue 版主要给「页面里某个滚动区域」用:\n * position=\"absolute\" + listen-to 指向那个容器。隐藏时 inert:不可点、不进 Tab 顺序、读屏读不到。\n */\nconst props = withDefaults(\n defineProps<{\n /** 可访问名(aria-label,同时作 title) */\n label?: string;\n /** 图标 */\n icon?: IconName;\n /** 滚动超过多少 px 出现(同 Naive 的 visibility-height);false = 不看滚动,显隐完全由 v-model 定 */\n visibilityHeight?: number | false;\n /** 监听、并滚回顶部的滚动容器(元素或选择器);不写 = 整页。模板 ref 还没就绪(null)时先不监听 */\n listenTo?: HTMLElement | string | null;\n /** 定位:fixed 贴视口右下(默认,整页一枚)· absolute 贴最近的定位祖先右下(配合 listen-to 给页面里的滚动区域) */\n position?: \"fixed\" | \"absolute\";\n }>(),\n { label: \"回到顶部\", icon: \"up\", visibilityHeight: 600, listenTo: undefined, position: \"fixed\" },\n);\n\n/** 是否显示;visibility-height 是数字时组件按滚动距离自己更新它 */\nconst visible = defineModel<boolean>({ default: false });\n\ntype Scroller = HTMLElement | Window;\nfunction target(): Scroller | null {\n const t = props.listenTo;\n if (t === undefined) return window;\n return typeof t === \"string\" ? document.querySelector<HTMLElement>(t) : t;\n}\nconst scrollTop = (s: Scroller) => (s instanceof Window ? s.scrollY : s.scrollTop);\n\nlet bound: Scroller | null = null;\nfunction update() {\n if (bound && props.visibilityHeight !== false) visible.value = scrollTop(bound) > props.visibilityHeight;\n}\nfunction bind() {\n bound?.removeEventListener(\"scroll\", update);\n bound = props.visibilityHeight === false ? null : target();\n bound?.addEventListener(\"scroll\", update, { passive: true });\n update();\n}\nonMounted(bind);\nwatch(() => [props.listenTo, props.visibilityHeight], bind);\nonBeforeUnmount(() => bound?.removeEventListener(\"scroll\", update));\n\nfunction toTop() {\n const reduce = matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\n (target() ?? window).scrollTo({ top: 0, behavior: reduce ? \"auto\" : \"smooth\" });\n}\n</script>\n\n<template>\n <button\n type=\"button\"\n :class=\"['ak-fab', { 'ak-fab--absolute': position === 'absolute', 'is-visible': visible }]\"\n :aria-label=\"label\"\n :title=\"label\"\n :inert=\"!visible\"\n @click=\"toTop\"\n >\n <AkIcon :name=\"icon\" :size=\"18\" />\n </button>\n</template>\n","<script setup lang=\"ts\">\nimport { onBeforeUnmount, onMounted, watch } from \"vue\";\n\nimport type { IconName } from \"../../icons\";\nimport AkIcon from \"../Icon/AkIcon.vue\";\n\n/**\n * 回到顶部(= Naive 的 NBackTop;CSS 叫 FAB / .ak-fab):右下角 44px 反色方块,滚过 visibility-height 淡入,点了平滑滚回顶部。\n * 整页那枚由皮肤输出(skin.js 同样 600px 出现),而且 < 1400 时皮肤把它收进目录浮层——Vue 版主要给「页面里某个滚动区域」用:\n * position=\"absolute\" + listen-to 指向那个容器。隐藏时 inert:不可点、不进 Tab 顺序、读屏读不到。\n */\nconst props = withDefaults(\n defineProps<{\n /** 可访问名(aria-label,同时作 title) */\n label?: string;\n /** 图标 */\n icon?: IconName;\n /** 滚动超过多少 px 出现(同 Naive 的 visibility-height);false = 不看滚动,显隐完全由 v-model 定 */\n visibilityHeight?: number | false;\n /** 监听、并滚回顶部的滚动容器(元素或选择器);不写 = 整页。模板 ref 还没就绪(null)时先不监听 */\n listenTo?: HTMLElement | string | null;\n /** 定位:fixed 贴视口右下(默认,整页一枚)· absolute 贴最近的定位祖先右下(配合 listen-to 给页面里的滚动区域) */\n position?: \"fixed\" | \"absolute\";\n }>(),\n { label: \"回到顶部\", icon: \"up\", visibilityHeight: 600, listenTo: undefined, position: \"fixed\" },\n);\n\n/** 是否显示;visibility-height 是数字时组件按滚动距离自己更新它 */\nconst visible = defineModel<boolean>({ default: false });\n\ntype Scroller = HTMLElement | Window;\nfunction target(): Scroller | null {\n const t = props.listenTo;\n if (t === undefined) return window;\n return typeof t === \"string\" ? document.querySelector<HTMLElement>(t) : t;\n}\nconst scrollTop = (s: Scroller) => (s instanceof Window ? s.scrollY : s.scrollTop);\n\nlet bound: Scroller | null = null;\nfunction update() {\n if (bound && props.visibilityHeight !== false) visible.value = scrollTop(bound) > props.visibilityHeight;\n}\nfunction bind() {\n bound?.removeEventListener(\"scroll\", update);\n bound = props.visibilityHeight === false ? null : target();\n bound?.addEventListener(\"scroll\", update, { passive: true });\n update();\n}\nonMounted(bind);\nwatch(() => [props.listenTo, props.visibilityHeight], bind);\nonBeforeUnmount(() => bound?.removeEventListener(\"scroll\", update));\n\nfunction toTop() {\n const reduce = matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\n (target() ?? window).scrollTo({ top: 0, behavior: reduce ? \"auto\" : \"smooth\" });\n}\n</script>\n\n<template>\n <button\n type=\"button\"\n :class=\"['ak-fab', { 'ak-fab--absolute': position === 'absolute', 'is-visible': visible }]\"\n :aria-label=\"label\"\n :title=\"label\"\n :inert=\"!visible\"\n @click=\"toTop\"\n >\n <AkIcon :name=\"icon\" :size=\"18\" />\n </button>\n</template>\n","import { computed, inject, onBeforeUnmount, provide, useAttrs, type InjectionKey } from \"vue\";\n\n/** 校验状态(同 Naive 的 FormValidationStatus,只有 CSS 画得出来的两种) */\nexport type ValidationStatus = \"error\" | \"success\";\n\n/** AkField 给字段里控件的状态(响应式对象) */\nexport interface FieldContext {\n /** 控件 id:<label for> 指向它 */\n readonly id: string;\n readonly labelId: string;\n readonly helpId: string;\n readonly hasLabel: boolean;\n readonly hasHelp: boolean;\n readonly status: ValidationStatus | undefined;\n readonly required: boolean;\n /** 谁占着标签:第一个挂上来的控件(label for 指向它)· 组(复选组 / 单选组:label 不写 for,组用 aria-labelledby)· null 还没有 */\n owner: \"control\" | \"group\" | null;\n}\n\nexport const fieldKey: InjectionKey<FieldContext | null> = Symbol(\"AkField\");\n\n/**\n * 控件接入 AkField(同 Naive 表单项与控件之间的 formItem 注入):返回要绑到原生控件上的 id / aria-labelledby / aria-describedby,\n * 以及字段的校验状态、必填。不在字段里时 attrs 为空。\n * 一个字段只有第一个控件拿 id;kind = \"group\" 的复选组 / 单选组改用 aria-labelledby,并把组里的选项与字段隔开(它们不再各自认字段)。\n */\nexport function useField(kind: \"control\" | \"group\" = \"control\") {\n const field = inject(fieldKey, null);\n const own = !!field && field.owner === null;\n if (own) field!.owner = kind;\n onBeforeUnmount(() => {\n if (own) field!.owner = null;\n });\n if (kind === \"group\") provide(fieldKey, null);\n\n const attrs = computed(() =>\n field\n ? {\n id: own && kind === \"control\" ? field.id : undefined,\n \"aria-labelledby\": own && kind === \"group\" && field.hasLabel ? field.labelId : undefined,\n \"aria-describedby\": field.hasHelp ? field.helpId : undefined,\n }\n : {},\n );\n return {\n attrs,\n status: computed(() => field?.status),\n required: computed(() => own && !!field?.required),\n };\n}\n\n/**\n * 外面包了一层 <label> / <div> 的控件(勾选、开关、步进器、搜索框):class / style 给外层,其余属性(name、autocomplete、@focus …)给原生控件。\n * 配合 defineOptions({ inheritAttrs: false })。\n */\nexport function useSplitAttrs() {\n const attrs = useAttrs();\n return {\n root: computed(() => ({ class: attrs.class, style: attrs.style })),\n control: computed(() => {\n const { class: _c, style: _s, ...rest } = attrs;\n return rest;\n }),\n };\n}\n","<script setup lang=\"ts\">\nimport { provide, reactive, useId } from \"vue\";\n\nimport { fieldKey, type FieldContext, type ValidationStatus } from \"./context\";\n\n/** 表单字段:标签 + 控件 + 说明 / 校验文案(同 Naive 的 NFormItem)。字段里的 AkInput / AkSelect … 自动拿到 id、aria-describedby、aria-invalid */\nconst props = withDefaults(\n defineProps<{\n /** 标签文字:渲染成 <label for>,指向字段里的第一个控件(= 控件的可访问名);复选组 / 单选组改由组 aria-labelledby 指向它 */\n label?: string;\n /** 必填:标签后出红色 *(读屏不念,控件自己带 required) */\n required?: boolean;\n /** 说明或校验文案(.ak-help),经 aria-describedby 关联到控件;validation-status=\"error\" 时是红字 */\n feedback?: string;\n /** 校验状态(同 Naive 的 validation-status):error = 红边 + 红字文案 + aria-invalid · success = 绿边 */\n validationStatus?: ValidationStatus;\n }>(),\n { label: undefined, feedback: undefined, validationStatus: undefined },\n);\n\nconst slots = defineSlots<{\n /** 控件;自己写的原生控件用插槽参数里的 id 对上标签 */\n default?: (props: { id: string }) => unknown;\n /** 标签内容(代替 label,要放链接 / 图标时用) */\n label?: () => unknown;\n /** 说明 / 校验文案(代替 feedback) */\n feedback?: () => unknown;\n}>();\n\nconst id = useId();\nconst ctx: FieldContext = reactive({\n id: `${id}-control`,\n labelId: `${id}-label`,\n helpId: `${id}-help`,\n get hasLabel() {\n return !!(props.label || slots.label);\n },\n get hasHelp() {\n return !!(props.feedback || slots.feedback);\n },\n get status() {\n return props.validationStatus;\n },\n get required() {\n return props.required;\n },\n owner: null,\n});\nprovide(fieldKey, ctx);\n</script>\n\n<template>\n <div :class=\"['ak-field', { 'is-invalid': validationStatus === 'error' }]\">\n <label v-if=\"ctx.hasLabel\" :id=\"ctx.labelId\" class=\"ak-label\" :for=\"ctx.owner === 'group' ? undefined : ctx.id\">\n <slot name=\"label\">{{ label }}</slot>\n <template v-if=\"required\">{{ \" \" }}<span class=\"req\" aria-hidden=\"true\">*</span></template>\n </label>\n <slot :id=\"ctx.id\" />\n <div v-if=\"ctx.hasHelp\" :id=\"ctx.helpId\" :class=\"['ak-help', { 'ak-help--error': validationStatus === 'error' }]\">\n <slot name=\"feedback\">{{ feedback }}</slot>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { provide, reactive, useId } from \"vue\";\n\nimport { fieldKey, type FieldContext, type ValidationStatus } from \"./context\";\n\n/** 表单字段:标签 + 控件 + 说明 / 校验文案(同 Naive 的 NFormItem)。字段里的 AkInput / AkSelect … 自动拿到 id、aria-describedby、aria-invalid */\nconst props = withDefaults(\n defineProps<{\n /** 标签文字:渲染成 <label for>,指向字段里的第一个控件(= 控件的可访问名);复选组 / 单选组改由组 aria-labelledby 指向它 */\n label?: string;\n /** 必填:标签后出红色 *(读屏不念,控件自己带 required) */\n required?: boolean;\n /** 说明或校验文案(.ak-help),经 aria-describedby 关联到控件;validation-status=\"error\" 时是红字 */\n feedback?: string;\n /** 校验状态(同 Naive 的 validation-status):error = 红边 + 红字文案 + aria-invalid · success = 绿边 */\n validationStatus?: ValidationStatus;\n }>(),\n { label: undefined, feedback: undefined, validationStatus: undefined },\n);\n\nconst slots = defineSlots<{\n /** 控件;自己写的原生控件用插槽参数里的 id 对上标签 */\n default?: (props: { id: string }) => unknown;\n /** 标签内容(代替 label,要放链接 / 图标时用) */\n label?: () => unknown;\n /** 说明 / 校验文案(代替 feedback) */\n feedback?: () => unknown;\n}>();\n\nconst id = useId();\nconst ctx: FieldContext = reactive({\n id: `${id}-control`,\n labelId: `${id}-label`,\n helpId: `${id}-help`,\n get hasLabel() {\n return !!(props.label || slots.label);\n },\n get hasHelp() {\n return !!(props.feedback || slots.feedback);\n },\n get status() {\n return props.validationStatus;\n },\n get required() {\n return props.required;\n },\n owner: null,\n});\nprovide(fieldKey, ctx);\n</script>\n\n<template>\n <div :class=\"['ak-field', { 'is-invalid': validationStatus === 'error' }]\">\n <label v-if=\"ctx.hasLabel\" :id=\"ctx.labelId\" class=\"ak-label\" :for=\"ctx.owner === 'group' ? undefined : ctx.id\">\n <slot name=\"label\">{{ label }}</slot>\n <template v-if=\"required\">{{ \" \" }}<span class=\"req\" aria-hidden=\"true\">*</span></template>\n </label>\n <slot :id=\"ctx.id\" />\n <div v-if=\"ctx.hasHelp\" :id=\"ctx.helpId\" :class=\"['ak-help', { 'ak-help--error': validationStatus === 'error' }]\">\n <slot name=\"feedback\">{{ feedback }}</slot>\n </div>\n </div>\n</template>\n","import type { InjectionKey } from \"vue\";\n\nexport type InputSize = \"sm\" | \"md\" | \"lg\";\n\n/** AkInputGroup 给组内 AkInput 的默认尺寸,也告诉它「前后缀直接作为组的子项输出,不要再包一层 .ak-input-group」 */\nexport const inputGroupKey: InjectionKey<{ size?: InputSize }> = Symbol(\"AkInputGroup\");\n","<script setup lang=\"ts\">\nimport { computed, h, inject, type FunctionalComponent } from \"vue\";\n\nimport { useField, type ValidationStatus } from \"../Field/context\";\nimport { inputGroupKey, type InputSize } from \"./context\";\n\n/** 其余属性(name、autocomplete、@focus / @blur / @keydown …)都落到原生 <input> / <textarea> 上 */\ndefineOptions({ inheritAttrs: false });\n\nconst props = withDefaults(\n defineProps<{\n /** 类型:textarea 渲染多行 <textarea class=\"ak-textarea\">(同 Naive);其余是 <input> 的 type。数字用 AkInputNumber,搜索用 AkSearch */\n type?: \"text\" | \"textarea\" | \"password\" | \"email\" | \"url\" | \"tel\";\n /** 占位提示(只做提示,不承载必填等信息) */\n placeholder?: string;\n /** 尺寸:sm 30 · md 36 · lg 44(px 高),与按钮同一刻度;多行输入不适用。不写时跟 AkInputGroup,再不然是 md */\n size?: InputSize;\n /** 校验状态:error 红边(aria-invalid)· success 绿边;不写时跟 AkField 的 validation-status */\n status?: ValidationStatus;\n /** 禁用 */\n disabled?: boolean;\n /** 只读:下沉底色,仍可选中复制——计算器「只显示不编辑」的结果用它,不要用 disabled */\n readonly?: boolean;\n /** 最多字数(原生 maxlength) */\n maxlength?: number;\n /** 多行输入的可见行数(原生 rows);不写时由 CSS 的最小高 90px 定 */\n rows?: number;\n /** 可访问名(aria-label):不在 AkField 里、旁边也没有 <label> 时必填 */\n label?: string;\n }>(),\n { type: \"text\", placeholder: undefined, size: undefined, status: undefined, maxlength: undefined, rows: undefined, label: undefined },\n);\n\n/** 输入的文字 */\nconst model = defineModel<string>();\n\nconst slots = defineSlots<{\n /** 前缀(输入框左边的 .ak-input-group__addon,如「wiki/」);多行输入不适用 */\n prefix?: () => unknown;\n /** 后缀(输入框右边的 .ak-input-group__addon,如单位「%」);多行输入不适用 */\n suffix?: () => unknown;\n}>();\n\nconst group = inject(inputGroupKey, null);\nconst field = useField();\nconst size = computed(() => props.size ?? group?.size ?? \"md\");\nconst status = computed(() => props.status ?? field.status.value);\n\n/** 有前后缀时包一层 .ak-input-group;已经在 AkInputGroup 里就直接作为组的子项输出(CSS 是 .ak-input-group > .ak-input) */\nconst Wrap: FunctionalComponent<{ bare: boolean }> = (p, { slots: s }) =>\n p.bare ? s.default?.() : h(\"div\", { class: \"ak-input-group\" }, s.default?.());\nconst bare = computed(() => !!group || !(slots.prefix || slots.suffix));\n\nconst common = computed(() => ({\n ...field.attrs.value,\n placeholder: props.placeholder,\n disabled: props.disabled,\n readonly: props.readonly,\n maxlength: props.maxlength,\n required: field.required.value || undefined,\n \"aria-invalid\": status.value === \"error\" || undefined,\n \"aria-label\": props.label,\n}));\n</script>\n\n<template>\n <textarea\n v-if=\"type === 'textarea'\"\n v-model=\"model\"\n v-bind=\"{ ...common, ...$attrs }\"\n :class=\"['ak-textarea', { 'is-valid': status === 'success' }]\"\n :rows=\"rows\"\n />\n <Wrap v-else :bare=\"bare\">\n <span v-if=\"$slots.prefix\" class=\"ak-input-group__addon\"><slot name=\"prefix\" /></span>\n <input\n v-model=\"model\"\n :type=\"type\"\n v-bind=\"{ ...common, ...$attrs }\"\n :class=\"['ak-input', size !== 'md' && `ak-input--${size}`, { 'is-valid': status === 'success' }]\"\n />\n <span v-if=\"$slots.suffix\" class=\"ak-input-group__addon\"><slot name=\"suffix\" /></span>\n </Wrap>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, h, inject, type FunctionalComponent } from \"vue\";\n\nimport { useField, type ValidationStatus } from \"../Field/context\";\nimport { inputGroupKey, type InputSize } from \"./context\";\n\n/** 其余属性(name、autocomplete、@focus / @blur / @keydown …)都落到原生 <input> / <textarea> 上 */\ndefineOptions({ inheritAttrs: false });\n\nconst props = withDefaults(\n defineProps<{\n /** 类型:textarea 渲染多行 <textarea class=\"ak-textarea\">(同 Naive);其余是 <input> 的 type。数字用 AkInputNumber,搜索用 AkSearch */\n type?: \"text\" | \"textarea\" | \"password\" | \"email\" | \"url\" | \"tel\";\n /** 占位提示(只做提示,不承载必填等信息) */\n placeholder?: string;\n /** 尺寸:sm 30 · md 36 · lg 44(px 高),与按钮同一刻度;多行输入不适用。不写时跟 AkInputGroup,再不然是 md */\n size?: InputSize;\n /** 校验状态:error 红边(aria-invalid)· success 绿边;不写时跟 AkField 的 validation-status */\n status?: ValidationStatus;\n /** 禁用 */\n disabled?: boolean;\n /** 只读:下沉底色,仍可选中复制——计算器「只显示不编辑」的结果用它,不要用 disabled */\n readonly?: boolean;\n /** 最多字数(原生 maxlength) */\n maxlength?: number;\n /** 多行输入的可见行数(原生 rows);不写时由 CSS 的最小高 90px 定 */\n rows?: number;\n /** 可访问名(aria-label):不在 AkField 里、旁边也没有 <label> 时必填 */\n label?: string;\n }>(),\n { type: \"text\", placeholder: undefined, size: undefined, status: undefined, maxlength: undefined, rows: undefined, label: undefined },\n);\n\n/** 输入的文字 */\nconst model = defineModel<string>();\n\nconst slots = defineSlots<{\n /** 前缀(输入框左边的 .ak-input-group__addon,如「wiki/」);多行输入不适用 */\n prefix?: () => unknown;\n /** 后缀(输入框右边的 .ak-input-group__addon,如单位「%」);多行输入不适用 */\n suffix?: () => unknown;\n}>();\n\nconst group = inject(inputGroupKey, null);\nconst field = useField();\nconst size = computed(() => props.size ?? group?.size ?? \"md\");\nconst status = computed(() => props.status ?? field.status.value);\n\n/** 有前后缀时包一层 .ak-input-group;已经在 AkInputGroup 里就直接作为组的子项输出(CSS 是 .ak-input-group > .ak-input) */\nconst Wrap: FunctionalComponent<{ bare: boolean }> = (p, { slots: s }) =>\n p.bare ? s.default?.() : h(\"div\", { class: \"ak-input-group\" }, s.default?.());\nconst bare = computed(() => !!group || !(slots.prefix || slots.suffix));\n\nconst common = computed(() => ({\n ...field.attrs.value,\n placeholder: props.placeholder,\n disabled: props.disabled,\n readonly: props.readonly,\n maxlength: props.maxlength,\n required: field.required.value || undefined,\n \"aria-invalid\": status.value === \"error\" || undefined,\n \"aria-label\": props.label,\n}));\n</script>\n\n<template>\n <textarea\n v-if=\"type === 'textarea'\"\n v-model=\"model\"\n v-bind=\"{ ...common, ...$attrs }\"\n :class=\"['ak-textarea', { 'is-valid': status === 'success' }]\"\n :rows=\"rows\"\n />\n <Wrap v-else :bare=\"bare\">\n <span v-if=\"$slots.prefix\" class=\"ak-input-group__addon\"><slot name=\"prefix\" /></span>\n <input\n v-model=\"model\"\n :type=\"type\"\n v-bind=\"{ ...common, ...$attrs }\"\n :class=\"['ak-input', size !== 'md' && `ak-input--${size}`, { 'is-valid': status === 'success' }]\"\n />\n <span v-if=\"$slots.suffix\" class=\"ak-input-group__addon\"><slot name=\"suffix\" /></span>\n </Wrap>\n</template>\n","<script setup lang=\"ts\">\nimport { provide } from \"vue\";\n\nimport { buttonGroupKey } from \"../Button/context\";\nimport { inputGroupKey, type InputSize } from \"./context\";\n\n/** 把输入框和按钮拼成一条(同 Naive 的 NInputGroup):相邻边重叠、中间不留圆角。前后缀文字用 AkInput 的 #prefix / #suffix */\nconst props = defineProps<{\n /** 组内输入框与按钮的默认尺寸(各自写了 size 以各自为准) */\n size?: InputSize;\n}>();\n\ndefineSlots<{\n /** AkInput(可带 #prefix / #suffix)与 AkButton */\n default?: () => unknown;\n}>();\n\nprovide(inputGroupKey, props);\nprovide(buttonGroupKey, props);\n</script>\n\n<template>\n <div class=\"ak-input-group\"><slot /></div>\n</template>\n","<script setup lang=\"ts\">\nimport { provide } from \"vue\";\n\nimport { buttonGroupKey } from \"../Button/context\";\nimport { inputGroupKey, type InputSize } from \"./context\";\n\n/** 把输入框和按钮拼成一条(同 Naive 的 NInputGroup):相邻边重叠、中间不留圆角。前后缀文字用 AkInput 的 #prefix / #suffix */\nconst props = defineProps<{\n /** 组内输入框与按钮的默认尺寸(各自写了 size 以各自为准) */\n size?: InputSize;\n}>();\n\ndefineSlots<{\n /** AkInput(可带 #prefix / #suffix)与 AkButton */\n default?: () => unknown;\n}>();\n\nprovide(inputGroupKey, props);\nprovide(buttonGroupKey, props);\n</script>\n\n<template>\n <div class=\"ak-input-group\"><slot /></div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, ref, watch } from \"vue\";\n\nimport { useField, useSplitAttrs } from \"../Field/context\";\n\n/**\n * 数字输入(同 Naive 的 NInputNumber):.ak-number 里 − / 输入 / + 三段,按钮常显。\n * 输入框是 role=\"spinbutton\":↑↓ 一步、PageUp / PageDown 十步、Home / End 到上下限;两个按钮不进 Tab 顺序(键盘用方向键)。\n * class / style 给外层,其余属性给 <input>。\n */\ndefineOptions({ inheritAttrs: false });\n\nconst props = withDefaults(\n defineProps<{\n /** 最小值 */\n min?: number;\n /** 最大值 */\n max?: number;\n /** 步长:按钮 / 方向键每次加减多少 */\n step?: number;\n /** 禁用 */\n disabled?: boolean;\n /** 只读:值能看能复制,不能改 */\n readonly?: boolean;\n /** 清空时的占位提示 */\n placeholder?: string;\n /** 显示 − / + 按钮(同 Naive 的 show-button) */\n showButton?: boolean;\n /** 可访问名(aria-label):不在 AkField 里、旁边也没有 <label> 时必填 */\n label?: string;\n }>(),\n { min: undefined, max: undefined, step: 1, placeholder: undefined, showButton: true, label: undefined },\n);\n\n/** 当前值;输入框清空后是 null */\nconst model = defineModel<number | null>();\n\nconst field = useField();\nconst attrs = useSplitAttrs();\n\nconst format = (v: number | null | undefined) => (v === null || v === undefined ? \"\" : String(v));\n/** 输入框里的文字:打字时可以暂时是「12.」「-」这类还不是数字的样子,失焦 / 回车时再落到 model */\nconst text = ref(format(model.value));\nwatch(model, v => {\n if (parse(text.value) !== v) text.value = format(v);\n});\n\n/** 文字 → 数字;空 = null,不合法 = undefined */\nfunction parse(s: string): number | null | undefined {\n const t = s.trim();\n if (t === \"\") return null;\n const n = Number(t);\n return Number.isFinite(n) ? n : undefined;\n}\nconst clamp = (n: number) => Math.min(props.max ?? Infinity, Math.max(props.min ?? -Infinity, n));\n/** 加减步长时按步长与当前值的小数位取整,避免 0.1 + 0.2 这类尾巴 */\nconst decimals = (n: number) => (String(n).split(\".\")[1] ?? \"\").length;\n\nfunction set(n: number | null) {\n model.value = n;\n text.value = format(n);\n}\n/** 打字时:是合法数字且在范围内就实时更新(同 Naive 的 update-value-on-input),否则等失焦 */\nfunction onInput(e: Event) {\n text.value = (e.target as HTMLInputElement).value;\n const n = parse(text.value);\n if (typeof n === \"number\" && n === clamp(n)) model.value = n;\n}\n/** 失焦 / 回车:落到范围内;不合法就退回原值 */\nfunction commit() {\n const n = parse(text.value);\n if (n === undefined) text.value = format(model.value);\n else set(n === null ? null : clamp(n));\n}\nfunction add(steps: number) {\n if (props.disabled || props.readonly) return;\n const base = model.value ?? props.min ?? 0;\n const next = base + steps * props.step;\n set(clamp(Number(next.toFixed(Math.max(decimals(props.step), decimals(base))))));\n}\n\nconst atMin = computed(() => props.min !== undefined && model.value !== null && model.value !== undefined && model.value <= props.min);\nconst atMax = computed(() => props.max !== undefined && model.value !== null && model.value !== undefined && model.value >= props.max);\nconst locked = computed(() => props.disabled || props.readonly);\n\n/** Home / End 只在有上下限时接管(否则留给光标移动) */\nfunction onKey(e: KeyboardEvent) {\n const { min, max } = props;\n const act: Record<string, (() => void) | undefined> = {\n ArrowUp: () => add(1),\n ArrowDown: () => add(-1),\n PageUp: () => add(10),\n PageDown: () => add(-10),\n Home: min === undefined ? undefined : () => locked.value || set(min),\n End: max === undefined ? undefined : () => locked.value || set(max),\n Enter: commit,\n };\n const fn = act[e.key];\n if (!fn) return;\n e.preventDefault();\n fn();\n}\n\n/** 整数、不会是负数时给手机弹数字键盘;否则要能输小数点 / 负号 */\nconst inputmode = computed(() => (Number.isInteger(props.step) && (props.min ?? -1) >= 0 ? \"numeric\" : \"decimal\"));\n</script>\n\n<template>\n <div v-bind=\"attrs.root.value\" class=\"ak-number\">\n <button v-if=\"showButton\" type=\"button\" tabindex=\"-1\" aria-label=\"减少\" :disabled=\"locked || atMin\" @click=\"add(-1)\">−</button>\n <input\n type=\"text\"\n role=\"spinbutton\"\n autocomplete=\"off\"\n :inputmode=\"inputmode\"\n v-bind=\"{ ...field.attrs.value, ...attrs.control.value }\"\n :value=\"text\"\n :placeholder=\"placeholder\"\n :disabled=\"disabled\"\n :readonly=\"readonly\"\n :required=\"field.required.value || undefined\"\n :aria-invalid=\"field.status.value === 'error' || undefined\"\n :aria-label=\"label\"\n :aria-valuenow=\"model ?? undefined\"\n :aria-valuemin=\"min\"\n :aria-valuemax=\"max\"\n @input=\"onInput\"\n @blur=\"commit\"\n @keydown=\"onKey\"\n />\n <button v-if=\"showButton\" type=\"button\" tabindex=\"-1\" aria-label=\"增加\" :disabled=\"locked || atMax\" @click=\"add(1)\">+</button>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, ref, watch } from \"vue\";\n\nimport { useField, useSplitAttrs } from \"../Field/context\";\n\n/**\n * 数字输入(同 Naive 的 NInputNumber):.ak-number 里 − / 输入 / + 三段,按钮常显。\n * 输入框是 role=\"spinbutton\":↑↓ 一步、PageUp / PageDown 十步、Home / End 到上下限;两个按钮不进 Tab 顺序(键盘用方向键)。\n * class / style 给外层,其余属性给 <input>。\n */\ndefineOptions({ inheritAttrs: false });\n\nconst props = withDefaults(\n defineProps<{\n /** 最小值 */\n min?: number;\n /** 最大值 */\n max?: number;\n /** 步长:按钮 / 方向键每次加减多少 */\n step?: number;\n /** 禁用 */\n disabled?: boolean;\n /** 只读:值能看能复制,不能改 */\n readonly?: boolean;\n /** 清空时的占位提示 */\n placeholder?: string;\n /** 显示 − / + 按钮(同 Naive 的 show-button) */\n showButton?: boolean;\n /** 可访问名(aria-label):不在 AkField 里、旁边也没有 <label> 时必填 */\n label?: string;\n }>(),\n { min: undefined, max: undefined, step: 1, placeholder: undefined, showButton: true, label: undefined },\n);\n\n/** 当前值;输入框清空后是 null */\nconst model = defineModel<number | null>();\n\nconst field = useField();\nconst attrs = useSplitAttrs();\n\nconst format = (v: number | null | undefined) => (v === null || v === undefined ? \"\" : String(v));\n/** 输入框里的文字:打字时可以暂时是「12.」「-」这类还不是数字的样子,失焦 / 回车时再落到 model */\nconst text = ref(format(model.value));\nwatch(model, v => {\n if (parse(text.value) !== v) text.value = format(v);\n});\n\n/** 文字 → 数字;空 = null,不合法 = undefined */\nfunction parse(s: string): number | null | undefined {\n const t = s.trim();\n if (t === \"\") return null;\n const n = Number(t);\n return Number.isFinite(n) ? n : undefined;\n}\nconst clamp = (n: number) => Math.min(props.max ?? Infinity, Math.max(props.min ?? -Infinity, n));\n/** 加减步长时按步长与当前值的小数位取整,避免 0.1 + 0.2 这类尾巴 */\nconst decimals = (n: number) => (String(n).split(\".\")[1] ?? \"\").length;\n\nfunction set(n: number | null) {\n model.value = n;\n text.value = format(n);\n}\n/** 打字时:是合法数字且在范围内就实时更新(同 Naive 的 update-value-on-input),否则等失焦 */\nfunction onInput(e: Event) {\n text.value = (e.target as HTMLInputElement).value;\n const n = parse(text.value);\n if (typeof n === \"number\" && n === clamp(n)) model.value = n;\n}\n/** 失焦 / 回车:落到范围内;不合法就退回原值 */\nfunction commit() {\n const n = parse(text.value);\n if (n === undefined) text.value = format(model.value);\n else set(n === null ? null : clamp(n));\n}\nfunction add(steps: number) {\n if (props.disabled || props.readonly) return;\n const base = model.value ?? props.min ?? 0;\n const next = base + steps * props.step;\n set(clamp(Number(next.toFixed(Math.max(decimals(props.step), decimals(base))))));\n}\n\nconst atMin = computed(() => props.min !== undefined && model.value !== null && model.value !== undefined && model.value <= props.min);\nconst atMax = computed(() => props.max !== undefined && model.value !== null && model.value !== undefined && model.value >= props.max);\nconst locked = computed(() => props.disabled || props.readonly);\n\n/** Home / End 只在有上下限时接管(否则留给光标移动) */\nfunction onKey(e: KeyboardEvent) {\n const { min, max } = props;\n const act: Record<string, (() => void) | undefined> = {\n ArrowUp: () => add(1),\n ArrowDown: () => add(-1),\n PageUp: () => add(10),\n PageDown: () => add(-10),\n Home: min === undefined ? undefined : () => locked.value || set(min),\n End: max === undefined ? undefined : () => locked.value || set(max),\n Enter: commit,\n };\n const fn = act[e.key];\n if (!fn) return;\n e.preventDefault();\n fn();\n}\n\n/** 整数、不会是负数时给手机弹数字键盘;否则要能输小数点 / 负号 */\nconst inputmode = computed(() => (Number.isInteger(props.step) && (props.min ?? -1) >= 0 ? \"numeric\" : \"decimal\"));\n</script>\n\n<template>\n <div v-bind=\"attrs.root.value\" class=\"ak-number\">\n <button v-if=\"showButton\" type=\"button\" tabindex=\"-1\" aria-label=\"减少\" :disabled=\"locked || atMin\" @click=\"add(-1)\">−</button>\n <input\n type=\"text\"\n role=\"spinbutton\"\n autocomplete=\"off\"\n :inputmode=\"inputmode\"\n v-bind=\"{ ...field.attrs.value, ...attrs.control.value }\"\n :value=\"text\"\n :placeholder=\"placeholder\"\n :disabled=\"disabled\"\n :readonly=\"readonly\"\n :required=\"field.required.value || undefined\"\n :aria-invalid=\"field.status.value === 'error' || undefined\"\n :aria-label=\"label\"\n :aria-valuenow=\"model ?? undefined\"\n :aria-valuemin=\"min\"\n :aria-valuemax=\"max\"\n @input=\"onInput\"\n @blur=\"commit\"\n @keydown=\"onKey\"\n />\n <button v-if=\"showButton\" type=\"button\" tabindex=\"-1\" aria-label=\"增加\" :disabled=\"locked || atMax\" @click=\"add(1)\">+</button>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nimport { useField, type ValidationStatus } from \"../Field/context\";\n\nexport type SelectValue = string | number;\n/** 一个选项(同 Naive 的 SelectOption) */\nexport interface SelectOption {\n label: string;\n value: SelectValue;\n disabled?: boolean;\n}\n/** 一组选项,渲染成 <optgroup>(同 Naive 的 SelectGroupOption) */\nexport interface SelectGroupOption {\n type: \"group\";\n label: string;\n children: SelectOption[];\n}\n\n/** 原生 <select> 换肤(与裸 <select> 同一枚 ▾):下拉列表、键盘、读屏都是浏览器自己的。其余属性(name、@change …)落到 <select> 上 */\nconst props = withDefaults(\n defineProps<{\n /** 选项(同 Naive 的 options):{ label, value, disabled };{ type: \"group\", label, children } 是一组(<optgroup>) */\n options: (SelectOption | SelectGroupOption)[];\n /** 没选时显示的提示(一个选不到的空选项);不写则默认选中第一项的样子 */\n placeholder?: string;\n /** 尺寸:sm 30 · md 36 · lg 44(px 高),与输入框同一刻度 */\n size?: \"sm\" | \"md\" | \"lg\";\n /** 校验状态:error 红边(aria-invalid)· success 绿边;不写时跟 AkField 的 validation-status */\n status?: ValidationStatus;\n /** 禁用 */\n disabled?: boolean;\n /** 可访问名(aria-label):不在 AkField 里、旁边也没有 <label> 时必填 */\n label?: string;\n }>(),\n { placeholder: undefined, size: \"md\", status: undefined, label: undefined },\n);\n\n/** 选中项的 value;没选是 null / undefined */\nconst model = defineModel<SelectValue | null>();\n\nconst field = useField();\nconst status = computed(() => props.status ?? field.status.value);\n/** 没选时落到 placeholder 那个空选项上(它的 value 是 null) */\nconst current = computed({\n get: () => model.value ?? null,\n set: v => (model.value = v),\n});\n\nconst isGroup = (o: SelectOption | SelectGroupOption): o is SelectGroupOption => \"type\" in o && o.type === \"group\";\n</script>\n\n<template>\n <select\n v-model=\"current\"\n v-bind=\"field.attrs.value\"\n :class=\"['ak-select', size !== 'md' && `ak-select--${size}`, { 'is-valid': status === 'success' }]\"\n :disabled=\"disabled\"\n :required=\"field.required.value || undefined\"\n :aria-invalid=\"status === 'error' || undefined\"\n :aria-label=\"label\"\n >\n <option v-if=\"placeholder\" :value=\"null\" disabled hidden>{{ placeholder }}</option>\n <template v-for=\"o in options\" :key=\"isGroup(o) ? `g:${o.label}` : o.value\">\n <optgroup v-if=\"isGroup(o)\" :label=\"o.label\">\n <option v-for=\"c in o.children\" :key=\"c.value\" :value=\"c.value\" :disabled=\"c.disabled\">{{ c.label }}</option>\n </optgroup>\n <option v-else :value=\"o.value\" :disabled=\"o.disabled\">{{ o.label }}</option>\n </template>\n </select>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nimport { useField, type ValidationStatus } from \"../Field/context\";\n\nexport type SelectValue = string | number;\n/** 一个选项(同 Naive 的 SelectOption) */\nexport interface SelectOption {\n label: string;\n value: SelectValue;\n disabled?: boolean;\n}\n/** 一组选项,渲染成 <optgroup>(同 Naive 的 SelectGroupOption) */\nexport interface SelectGroupOption {\n type: \"group\";\n label: string;\n children: SelectOption[];\n}\n\n/** 原生 <select> 换肤(与裸 <select> 同一枚 ▾):下拉列表、键盘、读屏都是浏览器自己的。其余属性(name、@change …)落到 <select> 上 */\nconst props = withDefaults(\n defineProps<{\n /** 选项(同 Naive 的 options):{ label, value, disabled };{ type: \"group\", label, children } 是一组(<optgroup>) */\n options: (SelectOption | SelectGroupOption)[];\n /** 没选时显示的提示(一个选不到的空选项);不写则默认选中第一项的样子 */\n placeholder?: string;\n /** 尺寸:sm 30 · md 36 · lg 44(px 高),与输入框同一刻度 */\n size?: \"sm\" | \"md\" | \"lg\";\n /** 校验状态:error 红边(aria-invalid)· success 绿边;不写时跟 AkField 的 validation-status */\n status?: ValidationStatus;\n /** 禁用 */\n disabled?: boolean;\n /** 可访问名(aria-label):不在 AkField 里、旁边也没有 <label> 时必填 */\n label?: string;\n }>(),\n { placeholder: undefined, size: \"md\", status: undefined, label: undefined },\n);\n\n/** 选中项的 value;没选是 null / undefined */\nconst model = defineModel<SelectValue | null>();\n\nconst field = useField();\nconst status = computed(() => props.status ?? field.status.value);\n/** 没选时落到 placeholder 那个空选项上(它的 value 是 null) */\nconst current = computed({\n get: () => model.value ?? null,\n set: v => (model.value = v),\n});\n\nconst isGroup = (o: SelectOption | SelectGroupOption): o is SelectGroupOption => \"type\" in o && o.type === \"group\";\n</script>\n\n<template>\n <select\n v-model=\"current\"\n v-bind=\"field.attrs.value\"\n :class=\"['ak-select', size !== 'md' && `ak-select--${size}`, { 'is-valid': status === 'success' }]\"\n :disabled=\"disabled\"\n :required=\"field.required.value || undefined\"\n :aria-invalid=\"status === 'error' || undefined\"\n :aria-label=\"label\"\n >\n <option v-if=\"placeholder\" :value=\"null\" disabled hidden>{{ placeholder }}</option>\n <template v-for=\"o in options\" :key=\"isGroup(o) ? `g:${o.label}` : o.value\">\n <optgroup v-if=\"isGroup(o)\" :label=\"o.label\">\n <option v-for=\"c in o.children\" :key=\"c.value\" :value=\"c.value\" :disabled=\"c.disabled\">{{ c.label }}</option>\n </optgroup>\n <option v-else :value=\"o.value\" :disabled=\"o.disabled\">{{ o.label }}</option>\n </template>\n </select>\n</template>\n","import type { InjectionKey } from \"vue\";\n\nexport type CheckValue = string | number;\nexport type CheckSize = \"sm\" | \"md\";\n\n/** AkCheckboxGroup 给组内 AkCheckbox 的状态(同 Naive 的 NCheckboxGroup 注入);都是 getter,读的时候才取值 */\nexport interface CheckboxGroupContext {\n readonly value: CheckValue[];\n readonly disabled: boolean;\n readonly size: CheckSize | undefined;\n /** 已选满 max:没勾的不能再勾 */\n readonly full: boolean;\n /** 已到 min:勾着的不能再取消 */\n readonly atMin: boolean;\n toggle(value: CheckValue, checked: boolean): void;\n}\n\nexport const checkboxGroupKey: InjectionKey<CheckboxGroupContext> = Symbol(\"AkCheckboxGroup\");\n","<script setup lang=\"ts\">\nimport { computed, inject, onMounted, onUpdated, useTemplateRef, warn } from \"vue\";\n\nimport { useField, useSplitAttrs } from \"../Field/context\";\nimport { checkboxGroupKey, type CheckSize, type CheckValue } from \"./context\";\n\n/** class / style 给外层 <label>,其余属性(name、@change …)给原生 <input type=\"checkbox\"> */\ndefineOptions({ inheritAttrs: false });\n\nconst props = withDefaults(\n defineProps<{\n /** 在 AkCheckboxGroup 里的取值:勾上时进组的 v-model 数组 */\n value?: CheckValue;\n /** 半选(一横):「全选」框在部分子项勾上时用。只管外观与读屏的「部分选中」,点击照常切换 */\n indeterminate?: boolean;\n /** 禁用 */\n disabled?: boolean;\n /** 尺寸:sm 16px 框(表头里的开关)· md 18px;不写时跟 AkCheckboxGroup */\n size?: CheckSize;\n /** 可访问名(aria-label):不写文字(默认插槽)时必填 */\n label?: string;\n }>(),\n { value: undefined, size: undefined, label: undefined },\n);\n\n/** 单独用时是否勾上;放在 AkCheckboxGroup 里时由组的 v-model 决定,不用绑 */\nconst model = defineModel<boolean>({ default: false });\n\nconst slots = defineSlots<{\n /** 文字 */\n default?: () => unknown;\n}>();\n\nconst group = inject(checkboxGroupKey, null);\nconst inGroup = computed(() => !!group && props.value !== undefined);\nconst checked = computed(() => (inGroup.value ? group!.value.includes(props.value!) : model.value));\nconst disabled = computed(\n () => props.disabled || !!group?.disabled || (inGroup.value && (checked.value ? group!.atMin : group!.full)),\n);\nconst size = computed(() => props.size ?? group?.size ?? \"md\");\n\nconst field = useField();\nconst attrs = useSplitAttrs();\nif (!slots.default && !props.label && !field.attrs.value.id) warn(\"AkCheckbox:没有文字的勾选框要写 label,否则读屏只念「复选框」\");\n\nfunction onChange(e: Event) {\n const c = (e.target as HTMLInputElement).checked;\n if (inGroup.value) group!.toggle(props.value!, c);\n else model.value = c;\n}\n\n/** checked / indeterminate 是 DOM 属性:点击会先改掉 DOM,父组件没接受(或仍是半选)时 vnode 没变、Vue 不会补写,这里每次渲染后对齐 */\nconst input = useTemplateRef<HTMLInputElement>(\"input\");\nconst sync = () => {\n if (!input.value) return;\n input.value.checked = checked.value;\n input.value.indeterminate = props.indeterminate;\n};\nonMounted(sync);\nonUpdated(sync);\n</script>\n\n<template>\n <label v-bind=\"attrs.root.value\" :class=\"['ak-check', size === 'sm' && 'ak-check--sm', { 'is-disabled': disabled }]\">\n <input\n ref=\"input\"\n type=\"checkbox\"\n v-bind=\"{ ...field.attrs.value, ...attrs.control.value }\"\n :value=\"value\"\n :checked=\"checked\"\n :disabled=\"disabled\"\n :aria-label=\"label\"\n @change=\"onChange\"\n />\n <slot />\n </label>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, inject, onMounted, onUpdated, useTemplateRef, warn } from \"vue\";\n\nimport { useField, useSplitAttrs } from \"../Field/context\";\nimport { checkboxGroupKey, type CheckSize, type CheckValue } from \"./context\";\n\n/** class / style 给外层 <label>,其余属性(name、@change …)给原生 <input type=\"checkbox\"> */\ndefineOptions({ inheritAttrs: false });\n\nconst props = withDefaults(\n defineProps<{\n /** 在 AkCheckboxGroup 里的取值:勾上时进组的 v-model 数组 */\n value?: CheckValue;\n /** 半选(一横):「全选」框在部分子项勾上时用。只管外观与读屏的「部分选中」,点击照常切换 */\n indeterminate?: boolean;\n /** 禁用 */\n disabled?: boolean;\n /** 尺寸:sm 16px 框(表头里的开关)· md 18px;不写时跟 AkCheckboxGroup */\n size?: CheckSize;\n /** 可访问名(aria-label):不写文字(默认插槽)时必填 */\n label?: string;\n }>(),\n { value: undefined, size: undefined, label: undefined },\n);\n\n/** 单独用时是否勾上;放在 AkCheckboxGroup 里时由组的 v-model 决定,不用绑 */\nconst model = defineModel<boolean>({ default: false });\n\nconst slots = defineSlots<{\n /** 文字 */\n default?: () => unknown;\n}>();\n\nconst group = inject(checkboxGroupKey, null);\nconst inGroup = computed(() => !!group && props.value !== undefined);\nconst checked = computed(() => (inGroup.value ? group!.value.includes(props.value!) : model.value));\nconst disabled = computed(\n () => props.disabled || !!group?.disabled || (inGroup.value && (checked.value ? group!.atMin : group!.full)),\n);\nconst size = computed(() => props.size ?? group?.size ?? \"md\");\n\nconst field = useField();\nconst attrs = useSplitAttrs();\nif (!slots.default && !props.label && !field.attrs.value.id) warn(\"AkCheckbox:没有文字的勾选框要写 label,否则读屏只念「复选框」\");\n\nfunction onChange(e: Event) {\n const c = (e.target as HTMLInputElement).checked;\n if (inGroup.value) group!.toggle(props.value!, c);\n else model.value = c;\n}\n\n/** checked / indeterminate 是 DOM 属性:点击会先改掉 DOM,父组件没接受(或仍是半选)时 vnode 没变、Vue 不会补写,这里每次渲染后对齐 */\nconst input = useTemplateRef<HTMLInputElement>(\"input\");\nconst sync = () => {\n if (!input.value) return;\n input.value.checked = checked.value;\n input.value.indeterminate = props.indeterminate;\n};\nonMounted(sync);\nonUpdated(sync);\n</script>\n\n<template>\n <label v-bind=\"attrs.root.value\" :class=\"['ak-check', size === 'sm' && 'ak-check--sm', { 'is-disabled': disabled }]\">\n <input\n ref=\"input\"\n type=\"checkbox\"\n v-bind=\"{ ...field.attrs.value, ...attrs.control.value }\"\n :value=\"value\"\n :checked=\"checked\"\n :disabled=\"disabled\"\n :aria-label=\"label\"\n @change=\"onChange\"\n />\n <slot />\n </label>\n</template>\n","<script setup lang=\"ts\">\nimport { provide } from \"vue\";\n\nimport { useField } from \"../Field/context\";\nimport { checkboxGroupKey, type CheckSize, type CheckValue } from \"./context\";\n\n/** 一组复选框(同 Naive 的 NCheckboxGroup):v-model 是勾上的 value 数组。role=\"group\",组名来自 AkField 的标签或 label */\nconst props = withDefaults(\n defineProps<{\n /** 整组禁用 */\n disabled?: boolean;\n /** 最多勾几个:选满后没勾的变成禁用(公开招募最多选 3 个标签) */\n max?: number;\n /** 最少勾几个:到了之后勾着的不能再取消 */\n min?: number;\n /** 组内勾选框的尺寸 */\n size?: CheckSize;\n /** 竖排(默认横排、放不下换行) */\n vertical?: boolean;\n /** 读屏用的组名(aria-label);放在带标签的 AkField 里时不用写 */\n label?: string;\n }>(),\n { max: undefined, min: undefined, size: undefined, label: undefined },\n);\n\n/** 勾上的 value 数组 */\nconst model = defineModel<CheckValue[]>({ default: () => [] });\n\ndefineSlots<{\n /** 若干 AkCheckbox(各写 value) */\n default?: () => unknown;\n}>();\n\nconst field = useField(\"group\");\n\nprovide(checkboxGroupKey, {\n get value() {\n return model.value;\n },\n get disabled() {\n return props.disabled;\n },\n get size() {\n return props.size;\n },\n get full() {\n return props.max !== undefined && model.value.length >= props.max;\n },\n get atMin() {\n return props.min !== undefined && model.value.length <= props.min;\n },\n toggle(value, checked) {\n const rest = model.value.filter(v => v !== value);\n model.value = checked ? [...rest, value] : rest;\n },\n});\n</script>\n\n<template>\n <div :class=\"['ak-check-group', { 'ak-check-group--vertical': vertical }]\" role=\"group\" :aria-label=\"label\" v-bind=\"field.attrs.value\">\n <slot />\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { provide } from \"vue\";\n\nimport { useField } from \"../Field/context\";\nimport { checkboxGroupKey, type CheckSize, type CheckValue } from \"./context\";\n\n/** 一组复选框(同 Naive 的 NCheckboxGroup):v-model 是勾上的 value 数组。role=\"group\",组名来自 AkField 的标签或 label */\nconst props = withDefaults(\n defineProps<{\n /** 整组禁用 */\n disabled?: boolean;\n /** 最多勾几个:选满后没勾的变成禁用(公开招募最多选 3 个标签) */\n max?: number;\n /** 最少勾几个:到了之后勾着的不能再取消 */\n min?: number;\n /** 组内勾选框的尺寸 */\n size?: CheckSize;\n /** 竖排(默认横排、放不下换行) */\n vertical?: boolean;\n /** 读屏用的组名(aria-label);放在带标签的 AkField 里时不用写 */\n label?: string;\n }>(),\n { max: undefined, min: undefined, size: undefined, label: undefined },\n);\n\n/** 勾上的 value 数组 */\nconst model = defineModel<CheckValue[]>({ default: () => [] });\n\ndefineSlots<{\n /** 若干 AkCheckbox(各写 value) */\n default?: () => unknown;\n}>();\n\nconst field = useField(\"group\");\n\nprovide(checkboxGroupKey, {\n get value() {\n return model.value;\n },\n get disabled() {\n return props.disabled;\n },\n get size() {\n return props.size;\n },\n get full() {\n return props.max !== undefined && model.value.length >= props.max;\n },\n get atMin() {\n return props.min !== undefined && model.value.length <= props.min;\n },\n toggle(value, checked) {\n const rest = model.value.filter(v => v !== value);\n model.value = checked ? [...rest, value] : rest;\n },\n});\n</script>\n\n<template>\n <div :class=\"['ak-check-group', { 'ak-check-group--vertical': vertical }]\" role=\"group\" :aria-label=\"label\" v-bind=\"field.attrs.value\">\n <slot />\n </div>\n</template>\n","import type { InjectionKey } from \"vue\";\n\nexport type RadioValue = string | number;\nexport type RadioSize = \"sm\" | \"md\" | \"lg\";\n\n/** AkRadioGroup 给组内 AkRadio / AkRadioButton 的状态(同 Naive 的 NRadioGroup 注入);都是 getter,读的时候才取值 */\nexport interface RadioGroupContext {\n readonly value: RadioValue | undefined;\n readonly name: string;\n readonly disabled: boolean;\n readonly size: RadioSize | undefined;\n select(value: RadioValue): void;\n}\n\nexport const radioGroupKey: InjectionKey<RadioGroupContext> = Symbol(\"AkRadioGroup\");\n","<script setup lang=\"ts\">\nimport { computed, inject, warn } from \"vue\";\n\nimport { useField, useSplitAttrs } from \"../Field/context\";\nimport { radioGroupKey, type RadioValue } from \"./context\";\n\n/** class / style 给外层 <label>,其余属性给原生 <input type=\"radio\"> */\ndefineOptions({ inheritAttrs: false });\n\nconst props = withDefaults(\n defineProps<{\n /** 这一项的值:选中时成为 v-model(或所在 AkRadioGroup 的 v-model)的值 */\n value: RadioValue;\n /** 禁用 */\n disabled?: boolean;\n /** 尺寸:sm 16px 圆 · md 18px;不写时跟 AkRadioGroup(lg 对单选圆点不起作用) */\n size?: \"sm\" | \"md\";\n /** 原生 name:同名的单选互斥、方向键在其间移动;放在 AkRadioGroup 里时由组统一给 */\n name?: string;\n /** 可访问名(aria-label):不写文字(默认插槽)时必填 */\n label?: string;\n }>(),\n { size: undefined, name: undefined, label: undefined },\n);\n\n/** 单独用时 = 选中项的值(同原生 <input type=\"radio\" v-model>);放在 AkRadioGroup 里时由组的 v-model 决定,不用绑 */\nconst model = defineModel<RadioValue>();\n\nconst slots = defineSlots<{\n /** 文字 */\n default?: () => unknown;\n}>();\n\nconst group = inject(radioGroupKey, null);\nconst checked = computed(() => (group ? group.value : model.value) === props.value);\nconst disabled = computed(() => props.disabled || !!group?.disabled);\nconst size = computed(() => props.size ?? group?.size);\n\nconst field = useField();\nconst attrs = useSplitAttrs();\nif (!slots.default && !props.label && !field.attrs.value.id) warn(\"AkRadio:没有文字的单选要写 label,否则读屏只念「单选按钮」\");\n\nfunction onChange() {\n if (group) group.select(props.value);\n else model.value = props.value;\n}\n</script>\n\n<template>\n <label v-bind=\"attrs.root.value\" :class=\"['ak-check', size === 'sm' && 'ak-check--sm', { 'is-disabled': disabled }]\">\n <input\n type=\"radio\"\n v-bind=\"{ ...field.attrs.value, ...attrs.control.value }\"\n :name=\"group?.name ?? name\"\n :value=\"value\"\n :checked=\"checked\"\n :disabled=\"disabled\"\n :aria-label=\"label\"\n @change=\"onChange\"\n />\n <slot />\n </label>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, inject, warn } from \"vue\";\n\nimport { useField, useSplitAttrs } from \"../Field/context\";\nimport { radioGroupKey, type RadioValue } from \"./context\";\n\n/** class / style 给外层 <label>,其余属性给原生 <input type=\"radio\"> */\ndefineOptions({ inheritAttrs: false });\n\nconst props = withDefaults(\n defineProps<{\n /** 这一项的值:选中时成为 v-model(或所在 AkRadioGroup 的 v-model)的值 */\n value: RadioValue;\n /** 禁用 */\n disabled?: boolean;\n /** 尺寸:sm 16px 圆 · md 18px;不写时跟 AkRadioGroup(lg 对单选圆点不起作用) */\n size?: \"sm\" | \"md\";\n /** 原生 name:同名的单选互斥、方向键在其间移动;放在 AkRadioGroup 里时由组统一给 */\n name?: string;\n /** 可访问名(aria-label):不写文字(默认插槽)时必填 */\n label?: string;\n }>(),\n { size: undefined, name: undefined, label: undefined },\n);\n\n/** 单独用时 = 选中项的值(同原生 <input type=\"radio\" v-model>);放在 AkRadioGroup 里时由组的 v-model 决定,不用绑 */\nconst model = defineModel<RadioValue>();\n\nconst slots = defineSlots<{\n /** 文字 */\n default?: () => unknown;\n}>();\n\nconst group = inject(radioGroupKey, null);\nconst checked = computed(() => (group ? group.value : model.value) === props.value);\nconst disabled = computed(() => props.disabled || !!group?.disabled);\nconst size = computed(() => props.size ?? group?.size);\n\nconst field = useField();\nconst attrs = useSplitAttrs();\nif (!slots.default && !props.label && !field.attrs.value.id) warn(\"AkRadio:没有文字的单选要写 label,否则读屏只念「单选按钮」\");\n\nfunction onChange() {\n if (group) group.select(props.value);\n else model.value = props.value;\n}\n</script>\n\n<template>\n <label v-bind=\"attrs.root.value\" :class=\"['ak-check', size === 'sm' && 'ak-check--sm', { 'is-disabled': disabled }]\">\n <input\n type=\"radio\"\n v-bind=\"{ ...field.attrs.value, ...attrs.control.value }\"\n :name=\"group?.name ?? name\"\n :value=\"value\"\n :checked=\"checked\"\n :disabled=\"disabled\"\n :aria-label=\"label\"\n @change=\"onChange\"\n />\n <slot />\n </label>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, inject, warn } from \"vue\";\n\nimport type { IconName } from \"../../icons\";\nimport AkIcon from \"../Icon/AkIcon.vue\";\nimport { radioGroupKey, type RadioValue } from \"./context\";\n\n/**\n * 按钮样式的单选(同 Naive 的 NRadioButton):分段控件——视图切换、排序方式这类「几个里选一个、立即生效」。\n * 只能放在 AkRadioGroup 里:组渲染成 .ak-btn-group[role=radiogroup],这一项是 .ak-btn[role=radio],选中 .is-active(主色实底)。\n * tabindex 由组按 roving tabindex 补上(只有选中项在 Tab 顺序里),方向键由组处理。\n */\nconst props = withDefaults(\n defineProps<{\n /** 这一项的值:选中时成为 AkRadioGroup 的 v-model */\n value: RadioValue;\n /** 禁用:不可选,方向键跳过 */\n disabled?: boolean;\n /** 图标;不写文字(默认插槽)时是方形的图标按钮,这时 label 必填 */\n icon?: IconName;\n /** 可访问名(aria-label;图标按钮同时作 title)——只有图标时必填 */\n label?: string;\n }>(),\n { icon: undefined, label: undefined },\n);\n\nconst slots = defineSlots<{\n /** 文字;不写就是图标按钮 */\n default?: () => unknown;\n}>();\n\nconst group = inject(radioGroupKey, null);\nif (!group) warn(\"AkRadioButton 要放在 AkRadioGroup 里\");\nconst checked = computed(() => group?.value === props.value);\nconst disabled = computed(() => props.disabled || !!group?.disabled);\nconst size = computed(() => group?.size ?? \"md\");\nconst iconOnly = computed(() => !!props.icon && !slots.default);\nif (iconOnly.value && !props.label) warn(`AkRadioButton:只有图标(${props.icon})的单选按钮要写 label`);\n\n/** 图标按钮里的图标边长(同 AkButton) */\nconst ICON_PX = { sm: 16, md: 18, lg: 20 } as const;\n</script>\n\n<template>\n <button\n type=\"button\"\n role=\"radio\"\n :class=\"['ak-btn', size !== 'md' && `ak-btn--${size}`, { 'ak-btn--icon': iconOnly, 'is-active': checked }]\"\n :aria-checked=\"checked\"\n :disabled=\"disabled\"\n :aria-label=\"label\"\n :title=\"iconOnly ? label : undefined\"\n @click=\"group?.select(value)\"\n >\n <AkIcon v-if=\"iconOnly\" :name=\"icon!\" :size=\"ICON_PX[size]\" />\n <template v-else>\n <AkIcon v-if=\"icon\" :name=\"icon\" class=\"ak-btn__icon\" />\n <slot />\n </template>\n </button>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, inject, warn } from \"vue\";\n\nimport type { IconName } from \"../../icons\";\nimport AkIcon from \"../Icon/AkIcon.vue\";\nimport { radioGroupKey, type RadioValue } from \"./context\";\n\n/**\n * 按钮样式的单选(同 Naive 的 NRadioButton):分段控件——视图切换、排序方式这类「几个里选一个、立即生效」。\n * 只能放在 AkRadioGroup 里:组渲染成 .ak-btn-group[role=radiogroup],这一项是 .ak-btn[role=radio],选中 .is-active(主色实底)。\n * tabindex 由组按 roving tabindex 补上(只有选中项在 Tab 顺序里),方向键由组处理。\n */\nconst props = withDefaults(\n defineProps<{\n /** 这一项的值:选中时成为 AkRadioGroup 的 v-model */\n value: RadioValue;\n /** 禁用:不可选,方向键跳过 */\n disabled?: boolean;\n /** 图标;不写文字(默认插槽)时是方形的图标按钮,这时 label 必填 */\n icon?: IconName;\n /** 可访问名(aria-label;图标按钮同时作 title)——只有图标时必填 */\n label?: string;\n }>(),\n { icon: undefined, label: undefined },\n);\n\nconst slots = defineSlots<{\n /** 文字;不写就是图标按钮 */\n default?: () => unknown;\n}>();\n\nconst group = inject(radioGroupKey, null);\nif (!group) warn(\"AkRadioButton 要放在 AkRadioGroup 里\");\nconst checked = computed(() => group?.value === props.value);\nconst disabled = computed(() => props.disabled || !!group?.disabled);\nconst size = computed(() => group?.size ?? \"md\");\nconst iconOnly = computed(() => !!props.icon && !slots.default);\nif (iconOnly.value && !props.label) warn(`AkRadioButton:只有图标(${props.icon})的单选按钮要写 label`);\n\n/** 图标按钮里的图标边长(同 AkButton) */\nconst ICON_PX = { sm: 16, md: 18, lg: 20 } as const;\n</script>\n\n<template>\n <button\n type=\"button\"\n role=\"radio\"\n :class=\"['ak-btn', size !== 'md' && `ak-btn--${size}`, { 'ak-btn--icon': iconOnly, 'is-active': checked }]\"\n :aria-checked=\"checked\"\n :disabled=\"disabled\"\n :aria-label=\"label\"\n :title=\"iconOnly ? label : undefined\"\n @click=\"group?.select(value)\"\n >\n <AkIcon v-if=\"iconOnly\" :name=\"icon!\" :size=\"ICON_PX[size]\" />\n <template v-else>\n <AkIcon v-if=\"icon\" :name=\"icon\" class=\"ak-btn__icon\" />\n <slot />\n </template>\n </button>\n</template>\n","<script setup lang=\"ts\">\nimport { Comment, Fragment, cloneVNode, h, mergeProps, provide, useAttrs, useId, type VNode } from \"vue\";\n\nimport { useField } from \"../Field/context\";\nimport AkRadioButton from \"./AkRadioButton.vue\";\nimport { radioGroupKey, type RadioSize, type RadioValue } from \"./context\";\n\n/**\n * 一组单选(同 Naive 的 NRadioGroup):v-model 是选中项的 value。role=\"radiogroup\",组名来自 AkField 的标签或 label。\n * 里面放 AkRadio → 一排原生单选(.ak-check-group,同名互斥、方向键是浏览器自己的);\n * 放 AkRadioButton → 分段控件(.ak-btn-group 里的 .ak-btn,选中 .is-active),roving tabindex 与方向键由这里处理。\n */\ndefineOptions({ inheritAttrs: false });\n\nconst props = withDefaults(\n defineProps<{\n /** 原生 name(普通单选靠它互斥);不写自动生成 */\n name?: string;\n /** 整组禁用 */\n disabled?: boolean;\n /** 尺寸:单选按钮 sm 30 · md 36 · lg 44(px 高);普通单选只有 sm(16px 圆)与 md */\n size?: RadioSize;\n /** 竖排(只对普通单选;单选按钮总是连成一排) */\n vertical?: boolean;\n /** 读屏用的组名(aria-label);放在带标签的 AkField 里时不用写 */\n label?: string;\n }>(),\n { name: undefined, size: undefined, label: undefined },\n);\n\n/** 选中项的 value */\nconst model = defineModel<RadioValue>();\n\nconst slots = defineSlots<{\n /** 若干 AkRadio,或若干 AkRadioButton */\n default?: () => VNode[];\n}>();\n\nconst field = useField(\"group\");\nconst attrs = useAttrs();\nconst autoName = useId();\n\nprovide(radioGroupKey, {\n get value() {\n return model.value;\n },\n get name() {\n return props.name ?? autoName;\n },\n get disabled() {\n return props.disabled;\n },\n get size() {\n return props.size;\n },\n select(value) {\n model.value = value;\n },\n});\n\nconst flatten = (nodes: VNode[]): VNode[] =>\n nodes.flatMap(n => (n.type === Fragment && Array.isArray(n.children) ? flatten(n.children as VNode[]) : n.type === Comment ? [] : [n]));\n/** <AkRadioButton disabled> 在 vnode.props 里是 \"\" */\nconst isOn = (v: unknown) => v !== undefined && v !== false;\n\n/** 单选按钮:←/↑ 上一个、→/↓ 下一个(跳过禁用、首尾循环),移过去即选中(WAI-ARIA Radio Group) */\nfunction onKey(e: KeyboardEvent) {\n const step = ({ ArrowRight: 1, ArrowDown: 1, ArrowLeft: -1, ArrowUp: -1 } as Record<string, number>)[e.key];\n if (!step) return;\n const radios = [...(e.currentTarget as HTMLElement).querySelectorAll<HTMLButtonElement>(':scope > [role=\"radio\"]')];\n const from = radios.indexOf((e.target as HTMLElement).closest<HTMLButtonElement>('[role=\"radio\"]')!);\n if (from < 0) return;\n e.preventDefault();\n for (let i = 1; i < radios.length; i++) {\n const to = radios[(((from + step * i) % radios.length) + radios.length) % radios.length];\n if (!to.disabled) return void (to.focus(), to.click());\n }\n}\n\n/**\n * 同 Naive 的 NRadioGroup:从默认插槽里看子项是不是单选按钮,决定整组的结构;单选按钮再补上 roving tabindex\n * (选中项 0、其余 -1;没有选中项时第一个可用的是 0)。插槽只能在渲染期调用,所以整个根节点在这里画。\n */\nconst Root = () => {\n const nodes = flatten(slots.default?.() ?? []);\n const common = mergeProps(attrs, field.attrs.value, {\n role: \"radiogroup\",\n \"aria-label\": props.label,\n \"aria-required\": field.required.value || undefined,\n });\n const buttons = nodes.filter(n => n.type === AkRadioButton);\n if (!buttons.length) return h(\"div\", mergeProps(common, { class: [\"ak-check-group\", props.vertical && \"ak-check-group--vertical\"] }), nodes);\n\n const enabled = buttons.filter(n => !props.disabled && !isOn(n.props?.disabled)).map(n => n.props?.value as RadioValue);\n const stop = enabled.includes(model.value!) ? model.value : enabled[0];\n return h(\n \"div\",\n // data-no-toggle:皮肤脚本会替模板输出的 .ak-btn-group 翻 is-active,这里的选中只看 v-model\n mergeProps(common, { class: \"ak-btn-group\", \"data-no-toggle\": \"\", onKeydown: onKey }),\n nodes.map(n => (n.type === AkRadioButton ? cloneVNode(n, { tabindex: n.props?.value === stop ? 0 : -1 }) : n)),\n );\n};\n</script>\n\n<template>\n <Root />\n</template>\n","<script setup lang=\"ts\">\nimport { Comment, Fragment, cloneVNode, h, mergeProps, provide, useAttrs, useId, type VNode } from \"vue\";\n\nimport { useField } from \"../Field/context\";\nimport AkRadioButton from \"./AkRadioButton.vue\";\nimport { radioGroupKey, type RadioSize, type RadioValue } from \"./context\";\n\n/**\n * 一组单选(同 Naive 的 NRadioGroup):v-model 是选中项的 value。role=\"radiogroup\",组名来自 AkField 的标签或 label。\n * 里面放 AkRadio → 一排原生单选(.ak-check-group,同名互斥、方向键是浏览器自己的);\n * 放 AkRadioButton → 分段控件(.ak-btn-group 里的 .ak-btn,选中 .is-active),roving tabindex 与方向键由这里处理。\n */\ndefineOptions({ inheritAttrs: false });\n\nconst props = withDefaults(\n defineProps<{\n /** 原生 name(普通单选靠它互斥);不写自动生成 */\n name?: string;\n /** 整组禁用 */\n disabled?: boolean;\n /** 尺寸:单选按钮 sm 30 · md 36 · lg 44(px 高);普通单选只有 sm(16px 圆)与 md */\n size?: RadioSize;\n /** 竖排(只对普通单选;单选按钮总是连成一排) */\n vertical?: boolean;\n /** 读屏用的组名(aria-label);放在带标签的 AkField 里时不用写 */\n label?: string;\n }>(),\n { name: undefined, size: undefined, label: undefined },\n);\n\n/** 选中项的 value */\nconst model = defineModel<RadioValue>();\n\nconst slots = defineSlots<{\n /** 若干 AkRadio,或若干 AkRadioButton */\n default?: () => VNode[];\n}>();\n\nconst field = useField(\"group\");\nconst attrs = useAttrs();\nconst autoName = useId();\n\nprovide(radioGroupKey, {\n get value() {\n return model.value;\n },\n get name() {\n return props.name ?? autoName;\n },\n get disabled() {\n return props.disabled;\n },\n get size() {\n return props.size;\n },\n select(value) {\n model.value = value;\n },\n});\n\nconst flatten = (nodes: VNode[]): VNode[] =>\n nodes.flatMap(n => (n.type === Fragment && Array.isArray(n.children) ? flatten(n.children as VNode[]) : n.type === Comment ? [] : [n]));\n/** <AkRadioButton disabled> 在 vnode.props 里是 \"\" */\nconst isOn = (v: unknown) => v !== undefined && v !== false;\n\n/** 单选按钮:←/↑ 上一个、→/↓ 下一个(跳过禁用、首尾循环),移过去即选中(WAI-ARIA Radio Group) */\nfunction onKey(e: KeyboardEvent) {\n const step = ({ ArrowRight: 1, ArrowDown: 1, ArrowLeft: -1, ArrowUp: -1 } as Record<string, number>)[e.key];\n if (!step) return;\n const radios = [...(e.currentTarget as HTMLElement).querySelectorAll<HTMLButtonElement>(':scope > [role=\"radio\"]')];\n const from = radios.indexOf((e.target as HTMLElement).closest<HTMLButtonElement>('[role=\"radio\"]')!);\n if (from < 0) return;\n e.preventDefault();\n for (let i = 1; i < radios.length; i++) {\n const to = radios[(((from + step * i) % radios.length) + radios.length) % radios.length];\n if (!to.disabled) return void (to.focus(), to.click());\n }\n}\n\n/**\n * 同 Naive 的 NRadioGroup:从默认插槽里看子项是不是单选按钮,决定整组的结构;单选按钮再补上 roving tabindex\n * (选中项 0、其余 -1;没有选中项时第一个可用的是 0)。插槽只能在渲染期调用,所以整个根节点在这里画。\n */\nconst Root = () => {\n const nodes = flatten(slots.default?.() ?? []);\n const common = mergeProps(attrs, field.attrs.value, {\n role: \"radiogroup\",\n \"aria-label\": props.label,\n \"aria-required\": field.required.value || undefined,\n });\n const buttons = nodes.filter(n => n.type === AkRadioButton);\n if (!buttons.length) return h(\"div\", mergeProps(common, { class: [\"ak-check-group\", props.vertical && \"ak-check-group--vertical\"] }), nodes);\n\n const enabled = buttons.filter(n => !props.disabled && !isOn(n.props?.disabled)).map(n => n.props?.value as RadioValue);\n const stop = enabled.includes(model.value!) ? model.value : enabled[0];\n return h(\n \"div\",\n // data-no-toggle:皮肤脚本会替模板输出的 .ak-btn-group 翻 is-active,这里的选中只看 v-model\n mergeProps(common, { class: \"ak-btn-group\", \"data-no-toggle\": \"\", onKeydown: onKey }),\n nodes.map(n => (n.type === AkRadioButton ? cloneVNode(n, { tabindex: n.props?.value === stop ? 0 : -1 }) : n)),\n );\n};\n</script>\n\n<template>\n <Root />\n</template>\n","<script setup lang=\"ts\">\nimport { warn } from \"vue\";\n\nimport { useField, useSplitAttrs } from \"../Field/context\";\n\n/**\n * 开关(同 Naive 的 NSwitch):方形轨道,开 = 游戏内 toggle_on 蓝。原生 <input type=\"checkbox\" role=\"switch\">,\n * 读屏念「开关,开 / 关」,Space 切换。class / style 给外层 <label>,其余属性给 <input>。\n */\ndefineOptions({ inheritAttrs: false });\n\nconst props = withDefaults(\n defineProps<{\n /** 禁用 */\n disabled?: boolean;\n /** 尺寸:sm 32 × 18(标题栏旁、表头里)· md 40 × 22 */\n size?: \"sm\" | \"md\";\n /** 可访问名(aria-label):没有默认插槽的文字、也不在带标签的 AkField 里时必填 */\n label?: string;\n }>(),\n { size: \"md\", label: undefined },\n);\n\n/** 是否打开 */\nconst model = defineModel<boolean>({ default: false });\n\nconst slots = defineSlots<{\n /** 开关的名称(「显示潜能加成」)——就是它的可访问名,开 / 关时不变 */\n default?: () => unknown;\n /** 打开时名称后面的状态文字(同 Naive 的 #checked);只给眼睛看,读屏已经念「开」 */\n checked?: () => unknown;\n /** 关闭时名称后面的状态文字(同 Naive 的 #unchecked) */\n unchecked?: () => unknown;\n}>();\n\nconst field = useField();\nconst attrs = useSplitAttrs();\nif (!slots.default && !props.label && !field.attrs.value.id) warn(\"AkSwitch:没有名称文字的开关要写 label,否则读屏只念「开关」\");\n</script>\n\n<template>\n <label v-bind=\"attrs.root.value\" :class=\"['ak-switch', size === 'sm' && 'ak-switch--sm', { 'is-disabled': disabled }]\">\n <input\n v-model=\"model\"\n type=\"checkbox\"\n role=\"switch\"\n v-bind=\"{ ...field.attrs.value, ...attrs.control.value }\"\n :disabled=\"disabled\"\n :aria-label=\"label\"\n />\n <span v-if=\"$slots.default\"><slot /></span>\n <span v-if=\"model ? $slots.checked : $slots.unchecked\" aria-hidden=\"true\"><slot :name=\"model ? 'checked' : 'unchecked'\" /></span>\n </label>\n</template>\n","<script setup lang=\"ts\">\nimport { warn } from \"vue\";\n\nimport { useField, useSplitAttrs } from \"../Field/context\";\n\n/**\n * 开关(同 Naive 的 NSwitch):方形轨道,开 = 游戏内 toggle_on 蓝。原生 <input type=\"checkbox\" role=\"switch\">,\n * 读屏念「开关,开 / 关」,Space 切换。class / style 给外层 <label>,其余属性给 <input>。\n */\ndefineOptions({ inheritAttrs: false });\n\nconst props = withDefaults(\n defineProps<{\n /** 禁用 */\n disabled?: boolean;\n /** 尺寸:sm 32 × 18(标题栏旁、表头里)· md 40 × 22 */\n size?: \"sm\" | \"md\";\n /** 可访问名(aria-label):没有默认插槽的文字、也不在带标签的 AkField 里时必填 */\n label?: string;\n }>(),\n { size: \"md\", label: undefined },\n);\n\n/** 是否打开 */\nconst model = defineModel<boolean>({ default: false });\n\nconst slots = defineSlots<{\n /** 开关的名称(「显示潜能加成」)——就是它的可访问名,开 / 关时不变 */\n default?: () => unknown;\n /** 打开时名称后面的状态文字(同 Naive 的 #checked);只给眼睛看,读屏已经念「开」 */\n checked?: () => unknown;\n /** 关闭时名称后面的状态文字(同 Naive 的 #unchecked) */\n unchecked?: () => unknown;\n}>();\n\nconst field = useField();\nconst attrs = useSplitAttrs();\nif (!slots.default && !props.label && !field.attrs.value.id) warn(\"AkSwitch:没有名称文字的开关要写 label,否则读屏只念「开关」\");\n</script>\n\n<template>\n <label v-bind=\"attrs.root.value\" :class=\"['ak-switch', size === 'sm' && 'ak-switch--sm', { 'is-disabled': disabled }]\">\n <input\n v-model=\"model\"\n type=\"checkbox\"\n role=\"switch\"\n v-bind=\"{ ...field.attrs.value, ...attrs.control.value }\"\n :disabled=\"disabled\"\n :aria-label=\"label\"\n />\n <span v-if=\"$slots.default\"><slot /></span>\n <span v-if=\"model ? $slots.checked : $slots.unchecked\" aria-hidden=\"true\"><slot :name=\"model ? 'checked' : 'unchecked'\" /></span>\n </label>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nimport { useField } from \"../Field/context\";\n\n/**\n * 滑杆(同 Naive 的 NSlider):原生 <input type=\"range\" class=\"ak-slider\">,方形滑块、4px 轨道。\n * 键盘(←→↑↓ 一步、PageUp/PageDown、Home/End)和读屏都是浏览器自己的。其余属性落到 <input> 上。\n */\nconst props = withDefaults(\n defineProps<{\n /** 最小值 */\n min?: number;\n /** 最大值 */\n max?: number;\n /** 步长 */\n step?: number;\n /** 禁用 */\n disabled?: boolean;\n /** 可访问名(aria-label):不在 AkField 里、旁边也没有 <label> 时必填 */\n label?: string;\n /** 读屏念的值(aria-valuetext),如 v => `信赖 ${v}%`;不写就念数字 */\n formatValue?: (value: number) => string;\n }>(),\n { min: 0, max: 100, step: 1, label: undefined, formatValue: undefined },\n);\n\n/** 当前值 */\nconst model = defineModel<number>();\n\nconst field = useField();\nconst valueText = computed(() => (props.formatValue && model.value !== undefined ? props.formatValue(model.value) : undefined));\n</script>\n\n<template>\n <input\n v-model.number=\"model\"\n type=\"range\"\n class=\"ak-slider\"\n v-bind=\"field.attrs.value\"\n :min=\"min\"\n :max=\"max\"\n :step=\"step\"\n :disabled=\"disabled\"\n :aria-label=\"label\"\n :aria-valuetext=\"valueText\"\n />\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nimport { useField } from \"../Field/context\";\n\n/**\n * 滑杆(同 Naive 的 NSlider):原生 <input type=\"range\" class=\"ak-slider\">,方形滑块、4px 轨道。\n * 键盘(←→↑↓ 一步、PageUp/PageDown、Home/End)和读屏都是浏览器自己的。其余属性落到 <input> 上。\n */\nconst props = withDefaults(\n defineProps<{\n /** 最小值 */\n min?: number;\n /** 最大值 */\n max?: number;\n /** 步长 */\n step?: number;\n /** 禁用 */\n disabled?: boolean;\n /** 可访问名(aria-label):不在 AkField 里、旁边也没有 <label> 时必填 */\n label?: string;\n /** 读屏念的值(aria-valuetext),如 v => `信赖 ${v}%`;不写就念数字 */\n formatValue?: (value: number) => string;\n }>(),\n { min: 0, max: 100, step: 1, label: undefined, formatValue: undefined },\n);\n\n/** 当前值 */\nconst model = defineModel<number>();\n\nconst field = useField();\nconst valueText = computed(() => (props.formatValue && model.value !== undefined ? props.formatValue(model.value) : undefined));\n</script>\n\n<template>\n <input\n v-model.number=\"model\"\n type=\"range\"\n class=\"ak-slider\"\n v-bind=\"field.attrs.value\"\n :min=\"min\"\n :max=\"max\"\n :step=\"step\"\n :disabled=\"disabled\"\n :aria-label=\"label\"\n :aria-valuetext=\"valueText\"\n />\n</template>\n","<script setup lang=\"ts\">\nimport { computed, onBeforeUnmount, onMounted, useTemplateRef } from \"vue\";\n\nimport { useField, useSplitAttrs } from \"../Field/context\";\nimport AkIcon from \"../Icon/AkIcon.vue\";\n\n/**\n * 搜索框:左侧放大镜 + <input type=\"search\" class=\"ak-input\">(+ 右侧快捷键键帽),同页眉里无 JS 时的搜索表单。\n * 站点级搜索外面包 <form role=\"search\">;页内筛选直接用。class / style 给外层 .ak-search,其余属性给 <input>。\n */\ndefineOptions({ inheritAttrs: false });\n\nconst props = withDefaults(\n defineProps<{\n /** 占位提示 */\n placeholder?: string;\n /** 尺寸:sm 30 · md 36 · lg 44(px 高) */\n size?: \"sm\" | \"md\" | \"lg\";\n /** 禁用 */\n disabled?: boolean;\n /** 可访问名(aria-label);在带标签的 AkField 里时由标签给,否则默认「搜索」 */\n label?: string;\n /** 聚焦快捷键(单个按键,如 \"/\"):右侧显示键帽(有字时隐去),在页面上别处按下它就聚焦到这里(正在别的输入框里打字时不抢) */\n shortcut?: string;\n }>(),\n { placeholder: undefined, size: \"md\", label: undefined, shortcut: undefined },\n);\n\n/** 搜索词 */\nconst model = defineModel<string>();\n\nconst emit = defineEmits<{\n /** 在输入框里按了回车 */\n search: [query: string];\n}>();\n\nconst field = useField();\nconst attrs = useSplitAttrs();\nconst name = computed(() => props.label ?? (field.attrs.value.id ? undefined : \"搜索\"));\n\nconst input = useTemplateRef<HTMLInputElement>(\"input\");\n/** 监听挂在输入框所在的 document 上(文档站示例在 iframe 里,全局 document 不是它) */\nlet doc: Document | undefined;\nfunction onDocKey(e: KeyboardEvent) {\n if (!props.shortcut || e.key !== props.shortcut || e.ctrlKey || e.metaKey || e.altKey || e.defaultPrevented) return;\n const t = e.target as HTMLElement | null;\n if (t && (t.isContentEditable || /^(INPUT|TEXTAREA|SELECT)$/.test(t.tagName))) return;\n e.preventDefault();\n input.value?.focus();\n}\n/** 输入法选字时的回车(isComposing)不算 */\nfunction onEnter(e: KeyboardEvent) {\n if (!e.isComposing) emit(\"search\", model.value ?? \"\");\n}\nonMounted(() => {\n doc = input.value?.ownerDocument;\n doc?.addEventListener(\"keydown\", onDocKey);\n});\nonBeforeUnmount(() => doc?.removeEventListener(\"keydown\", onDocKey));\n</script>\n\n<template>\n <div v-bind=\"attrs.root.value\" class=\"ak-search\">\n <AkIcon name=\"search\" class=\"ak-search__icon\" />\n <input\n ref=\"input\"\n v-model=\"model\"\n type=\"search\"\n v-bind=\"{ ...field.attrs.value, ...attrs.control.value }\"\n :class=\"['ak-input', size !== 'md' && `ak-input--${size}`]\"\n :placeholder=\"placeholder\"\n :disabled=\"disabled\"\n :aria-label=\"name\"\n :aria-keyshortcuts=\"shortcut\"\n @keydown.enter=\"onEnter\"\n />\n <kbd v-if=\"shortcut && !model\" class=\"ak-search__kbd\" aria-hidden=\"true\">{{ shortcut }}</kbd>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, onBeforeUnmount, onMounted, useTemplateRef } from \"vue\";\n\nimport { useField, useSplitAttrs } from \"../Field/context\";\nimport AkIcon from \"../Icon/AkIcon.vue\";\n\n/**\n * 搜索框:左侧放大镜 + <input type=\"search\" class=\"ak-input\">(+ 右侧快捷键键帽),同页眉里无 JS 时的搜索表单。\n * 站点级搜索外面包 <form role=\"search\">;页内筛选直接用。class / style 给外层 .ak-search,其余属性给 <input>。\n */\ndefineOptions({ inheritAttrs: false });\n\nconst props = withDefaults(\n defineProps<{\n /** 占位提示 */\n placeholder?: string;\n /** 尺寸:sm 30 · md 36 · lg 44(px 高) */\n size?: \"sm\" | \"md\" | \"lg\";\n /** 禁用 */\n disabled?: boolean;\n /** 可访问名(aria-label);在带标签的 AkField 里时由标签给,否则默认「搜索」 */\n label?: string;\n /** 聚焦快捷键(单个按键,如 \"/\"):右侧显示键帽(有字时隐去),在页面上别处按下它就聚焦到这里(正在别的输入框里打字时不抢) */\n shortcut?: string;\n }>(),\n { placeholder: undefined, size: \"md\", label: undefined, shortcut: undefined },\n);\n\n/** 搜索词 */\nconst model = defineModel<string>();\n\nconst emit = defineEmits<{\n /** 在输入框里按了回车 */\n search: [query: string];\n}>();\n\nconst field = useField();\nconst attrs = useSplitAttrs();\nconst name = computed(() => props.label ?? (field.attrs.value.id ? undefined : \"搜索\"));\n\nconst input = useTemplateRef<HTMLInputElement>(\"input\");\n/** 监听挂在输入框所在的 document 上(文档站示例在 iframe 里,全局 document 不是它) */\nlet doc: Document | undefined;\nfunction onDocKey(e: KeyboardEvent) {\n if (!props.shortcut || e.key !== props.shortcut || e.ctrlKey || e.metaKey || e.altKey || e.defaultPrevented) return;\n const t = e.target as HTMLElement | null;\n if (t && (t.isContentEditable || /^(INPUT|TEXTAREA|SELECT)$/.test(t.tagName))) return;\n e.preventDefault();\n input.value?.focus();\n}\n/** 输入法选字时的回车(isComposing)不算 */\nfunction onEnter(e: KeyboardEvent) {\n if (!e.isComposing) emit(\"search\", model.value ?? \"\");\n}\nonMounted(() => {\n doc = input.value?.ownerDocument;\n doc?.addEventListener(\"keydown\", onDocKey);\n});\nonBeforeUnmount(() => doc?.removeEventListener(\"keydown\", onDocKey));\n</script>\n\n<template>\n <div v-bind=\"attrs.root.value\" class=\"ak-search\">\n <AkIcon name=\"search\" class=\"ak-search__icon\" />\n <input\n ref=\"input\"\n v-model=\"model\"\n type=\"search\"\n v-bind=\"{ ...field.attrs.value, ...attrs.control.value }\"\n :class=\"['ak-input', size !== 'md' && `ak-input--${size}`]\"\n :placeholder=\"placeholder\"\n :disabled=\"disabled\"\n :aria-label=\"name\"\n :aria-keyshortcuts=\"shortcut\"\n @keydown.enter=\"onEnter\"\n />\n <kbd v-if=\"shortcut && !model\" class=\"ak-search__kbd\" aria-hidden=\"true\">{{ shortcut }}</kbd>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/** 键帽(<kbd class=\"ak-kbd\">):快捷键提示——面板页脚、触发器右侧、行内说明。组合键写成几枚键帽,中间的「+」写在外面 */\ndefineSlots<{\n /** 键名:Ctrl、K、Esc、↵、/ … */\n default?: () => unknown;\n}>();\n</script>\n\n<template>\n <kbd class=\"ak-kbd\"><slot /></kbd>\n</template>\n","<script setup lang=\"ts\">\n/** 键帽(<kbd class=\"ak-kbd\">):快捷键提示——面板页脚、触发器右侧、行内说明。组合键写成几枚键帽,中间的「+」写在外面 */\ndefineSlots<{\n /** 键名:Ctrl、K、Esc、↵、/ … */\n default?: () => unknown;\n}>();\n</script>\n\n<template>\n <kbd class=\"ak-kbd\"><slot /></kbd>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\n/** 稀有度 = 星数 1–6(游戏数据里的 rarity 是 0–5,用的时候 +1) */\nexport type Rarity = 1 | 2 | 3 | 4 | 5 | 6;\n\nconst props = withDefaults(\n defineProps<{\n /** 星数 1–6 */\n value: Rarity;\n /** 颜色:default 游戏星黄 · white 正文色(亮黑暗白)· tier 按稀有度色阶(跟 value 走,= .ak-rarity--r{value}) */\n variant?: \"default\" | \"white\" | \"tier\";\n /** 尺寸:sm 0.8em · md 1em · lg 1.4em——星形跟字号走,放进哪行字就是那行的大小 */\n size?: \"sm\" | \"md\" | \"lg\";\n /** 改用游戏原图(rarity_yellow_N.png 黄星 / rarity_N.png 白星,N = 星数 − 1),固定 14px 高;这时 variant / size 不适用 */\n src?: string;\n /** 原图是白色的那套(rarity_N.png):亮色主题下反相为黑(.ak-glyph) */\n glyph?: boolean;\n /** 可访问名:默认「六星」这种(星形是 CSS 画的空元素,读屏读不到) */\n label?: string;\n }>(),\n { variant: \"default\", size: \"md\", src: undefined, label: undefined },\n);\n\nconst CN = [\"\", \"一\", \"二\", \"三\", \"四\", \"五\", \"六\"];\nconst name = computed(() => props.label ?? `${CN[props.value]}星`);\n\nconst classes = computed(() => [\n \"ak-rarity\",\n props.variant === \"white\" && \"ak-rarity--white\",\n props.variant === \"tier\" && `ak-rarity--r${props.value}`,\n props.size !== \"md\" && `ak-rarity--${props.size}`,\n]);\n</script>\n\n<template>\n <img v-if=\"src\" :class=\"['ak-rarity-img', { 'ak-glyph': glyph }]\" :src=\"src\" :alt=\"name\" />\n <span v-else :class=\"classes\" role=\"img\" :aria-label=\"name\"><i v-for=\"n in value\" :key=\"n\" /></span>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\n/** 稀有度 = 星数 1–6(游戏数据里的 rarity 是 0–5,用的时候 +1) */\nexport type Rarity = 1 | 2 | 3 | 4 | 5 | 6;\n\nconst props = withDefaults(\n defineProps<{\n /** 星数 1–6 */\n value: Rarity;\n /** 颜色:default 游戏星黄 · white 正文色(亮黑暗白)· tier 按稀有度色阶(跟 value 走,= .ak-rarity--r{value}) */\n variant?: \"default\" | \"white\" | \"tier\";\n /** 尺寸:sm 0.8em · md 1em · lg 1.4em——星形跟字号走,放进哪行字就是那行的大小 */\n size?: \"sm\" | \"md\" | \"lg\";\n /** 改用游戏原图(rarity_yellow_N.png 黄星 / rarity_N.png 白星,N = 星数 − 1),固定 14px 高;这时 variant / size 不适用 */\n src?: string;\n /** 原图是白色的那套(rarity_N.png):亮色主题下反相为黑(.ak-glyph) */\n glyph?: boolean;\n /** 可访问名:默认「六星」这种(星形是 CSS 画的空元素,读屏读不到) */\n label?: string;\n }>(),\n { variant: \"default\", size: \"md\", src: undefined, label: undefined },\n);\n\nconst CN = [\"\", \"一\", \"二\", \"三\", \"四\", \"五\", \"六\"];\nconst name = computed(() => props.label ?? `${CN[props.value]}星`);\n\nconst classes = computed(() => [\n \"ak-rarity\",\n props.variant === \"white\" && \"ak-rarity--white\",\n props.variant === \"tier\" && `ak-rarity--r${props.value}`,\n props.size !== \"md\" && `ak-rarity--${props.size}`,\n]);\n</script>\n\n<template>\n <img v-if=\"src\" :class=\"['ak-rarity-img', { 'ak-glyph': glyph }]\" :src=\"src\" :alt=\"name\" />\n <span v-else :class=\"classes\" role=\"img\" :aria-label=\"name\"><i v-for=\"n in value\" :key=\"n\" /></span>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nconst props = withDefaults(\n defineProps<{\n /** 图标地址:职业 profession/<职业>.png、分支 subprofession/<分支>.png(torappu 白线稿,亮色主题下 CSS 反相为黑) */\n src: string;\n /** 职业 / 分支名:作图标的 alt,并默认作悬停提示;不写 = 装饰图标(旁边已经有文字) */\n name?: string;\n /** 分支图标(.ak-subprof,26px,图占 90%):size / variant 不适用 */\n branch?: boolean;\n /** 尺寸:sm 22 · md 32 · lg 48 · xl 72(px 边长) */\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\";\n /** 外观:default 透明底(线稿跟主题反相)· box 深底白线稿(两套主题不变,同游戏内)· outline 1px 描边 */\n variant?: \"default\" | \"box\" | \"outline\";\n /** 悬停提示(data-ak-tip):默认是 name,可改写;false 关掉 */\n tip?: string | false;\n }>(),\n { name: undefined, size: \"md\", variant: \"default\", tip: undefined },\n);\n\nconst classes = computed(() =>\n props.branch\n ? [\"ak-subprof\"]\n : [\"ak-prof\", props.size !== \"md\" && `ak-prof--${props.size}`, props.variant !== \"default\" && `ak-prof--${props.variant}`],\n);\nconst tipText = computed(() => (props.tip === false ? undefined : (props.tip ?? props.name)));\n</script>\n\n<template>\n <span :class=\"classes\" :data-ak-tip=\"tipText\"><img :src=\"src\" :alt=\"name ?? ''\" /></span>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nconst props = withDefaults(\n defineProps<{\n /** 图标地址:职业 profession/<职业>.png、分支 subprofession/<分支>.png(torappu 白线稿,亮色主题下 CSS 反相为黑) */\n src: string;\n /** 职业 / 分支名:作图标的 alt,并默认作悬停提示;不写 = 装饰图标(旁边已经有文字) */\n name?: string;\n /** 分支图标(.ak-subprof,26px,图占 90%):size / variant 不适用 */\n branch?: boolean;\n /** 尺寸:sm 22 · md 32 · lg 48 · xl 72(px 边长) */\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\";\n /** 外观:default 透明底(线稿跟主题反相)· box 深底白线稿(两套主题不变,同游戏内)· outline 1px 描边 */\n variant?: \"default\" | \"box\" | \"outline\";\n /** 悬停提示(data-ak-tip):默认是 name,可改写;false 关掉 */\n tip?: string | false;\n }>(),\n { name: undefined, size: \"md\", variant: \"default\", tip: undefined },\n);\n\nconst classes = computed(() =>\n props.branch\n ? [\"ak-subprof\"]\n : [\"ak-prof\", props.size !== \"md\" && `ak-prof--${props.size}`, props.variant !== \"default\" && `ak-prof--${props.variant}`],\n);\nconst tipText = computed(() => (props.tip === false ? undefined : (props.tip ?? props.name)));\n</script>\n\n<template>\n <span :class=\"classes\" :data-ak-tip=\"tipText\"><img :src=\"src\" :alt=\"name ?? ''\" /></span>\n</template>\n","<script setup lang=\"ts\">\nimport AkProfession from \"./AkProfession.vue\";\n\n/** 带文字的职业 / 分支名(.ak-prof-label):图标 + 中文名 + Bender 英文小字,放在信息栏 / 表格里 */\nwithDefaults(\n defineProps<{\n /** 职业 / 分支名 */\n name: string;\n /** 英文名(Bender 小字,.ak-en) */\n en?: string;\n /** 图标地址:画成分支图标(AkProfession branch,装饰,不带提示);要职业图标或别的写法用 #icon 插槽 */\n src?: string;\n /** 名字链接到职业 / 分支页 */\n href?: string;\n }>(),\n { en: undefined, src: undefined, href: undefined },\n);\n\ndefineSlots<{\n /** 图标(代替 src),如 <AkProfession size=\"sm\" :src /> */\n icon?: () => unknown;\n}>();\n</script>\n\n<template>\n <span class=\"ak-prof-label\">\n <slot name=\"icon\"><AkProfession v-if=\"src\" :src=\"src\" branch :tip=\"false\" /></slot>\n <a v-if=\"href\" :href=\"href\">{{ name }}</a>\n <template v-else>{{ name }}</template>\n <span v-if=\"en\" class=\"ak-en\">{{ en }}</span>\n </span>\n</template>\n","<script setup lang=\"ts\">\nimport AkProfession from \"./AkProfession.vue\";\n\n/** 带文字的职业 / 分支名(.ak-prof-label):图标 + 中文名 + Bender 英文小字,放在信息栏 / 表格里 */\nwithDefaults(\n defineProps<{\n /** 职业 / 分支名 */\n name: string;\n /** 英文名(Bender 小字,.ak-en) */\n en?: string;\n /** 图标地址:画成分支图标(AkProfession branch,装饰,不带提示);要职业图标或别的写法用 #icon 插槽 */\n src?: string;\n /** 名字链接到职业 / 分支页 */\n href?: string;\n }>(),\n { en: undefined, src: undefined, href: undefined },\n);\n\ndefineSlots<{\n /** 图标(代替 src),如 <AkProfession size=\"sm\" :src /> */\n icon?: () => unknown;\n}>();\n</script>\n\n<template>\n <span class=\"ak-prof-label\">\n <slot name=\"icon\"><AkProfession v-if=\"src\" :src=\"src\" branch :tip=\"false\" /></slot>\n <a v-if=\"href\" :href=\"href\">{{ name }}</a>\n <template v-else>{{ name }}</template>\n <span v-if=\"en\" class=\"ak-en\">{{ en }}</span>\n </span>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nconst props = withDefaults(\n defineProps<{\n /** 图标地址:elite/elite_N.png(白线稿,亮色主题下 CSS 反相为黑);lg 用 elite_N_large.png */\n src: string;\n /** 精英阶段 0–2:给出默认文字「精英零 / 一 / 二」 */\n phase?: 0 | 1 | 2;\n /** 等级:接在阶段名后面,「精英二 Lv60」 */\n level?: number;\n /** 文字:默认由 phase + level 拼出,可改写(「提升至精英阶段 1 等级 1」「专精 Ⅰ」);false 只显示图标 */\n text?: string | false;\n /** 尺寸:md 图标 16px 高(默认,配文字)· lg 28px 高(一般只放图标) */\n size?: \"md\" | \"lg\";\n /** 可访问名:只显示图标时作图标的 alt,默认是阶段名;有文字时图标是装饰 */\n label?: string;\n }>(),\n { phase: undefined, level: undefined, text: undefined, size: \"md\", label: undefined },\n);\n\ndefineSlots<{\n /** 文字(代替 text),可以带链接 / 加粗 */\n default?: () => unknown;\n}>();\n\nconst CN = [\"零\", \"一\", \"二\"];\nconst phaseName = computed(() => (props.phase === undefined ? undefined : `精英${CN[props.phase]}`));\nconst content = computed(() => {\n if (props.text !== undefined) return props.text || undefined;\n if (!phaseName.value) return undefined;\n return props.level === undefined ? phaseName.value : `${phaseName.value} Lv${props.level}`;\n});\n</script>\n\n<template>\n <span :class=\"['ak-elite', size === 'lg' && 'ak-elite--lg']\">\n <img :src=\"src\" :alt=\"$slots.default || content ? '' : (label ?? phaseName ?? '')\" />\n <slot>{{ content }}</slot>\n </span>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nconst props = withDefaults(\n defineProps<{\n /** 图标地址:elite/elite_N.png(白线稿,亮色主题下 CSS 反相为黑);lg 用 elite_N_large.png */\n src: string;\n /** 精英阶段 0–2:给出默认文字「精英零 / 一 / 二」 */\n phase?: 0 | 1 | 2;\n /** 等级:接在阶段名后面,「精英二 Lv60」 */\n level?: number;\n /** 文字:默认由 phase + level 拼出,可改写(「提升至精英阶段 1 等级 1」「专精 Ⅰ」);false 只显示图标 */\n text?: string | false;\n /** 尺寸:md 图标 16px 高(默认,配文字)· lg 28px 高(一般只放图标) */\n size?: \"md\" | \"lg\";\n /** 可访问名:只显示图标时作图标的 alt,默认是阶段名;有文字时图标是装饰 */\n label?: string;\n }>(),\n { phase: undefined, level: undefined, text: undefined, size: \"md\", label: undefined },\n);\n\ndefineSlots<{\n /** 文字(代替 text),可以带链接 / 加粗 */\n default?: () => unknown;\n}>();\n\nconst CN = [\"零\", \"一\", \"二\"];\nconst phaseName = computed(() => (props.phase === undefined ? undefined : `精英${CN[props.phase]}`));\nconst content = computed(() => {\n if (props.text !== undefined) return props.text || undefined;\n if (!phaseName.value) return undefined;\n return props.level === undefined ? phaseName.value : `${phaseName.value} Lv${props.level}`;\n});\n</script>\n\n<template>\n <span :class=\"['ak-elite', size === 'lg' && 'ak-elite--lg']\">\n <img :src=\"src\" :alt=\"$slots.default || content ? '' : (label ?? phaseName ?? '')\" />\n <slot>{{ content }}</slot>\n </span>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nconst props = withDefaults(\n defineProps<{\n /** 图标地址:potential/potential_{N−1}.png(游戏图标自带颜色,不随主题反相) */\n src: string;\n /** 潜能 1–6:给出默认 alt「潜能 N」 */\n value?: 1 | 2 | 3 | 4 | 5 | 6;\n /** 可访问名(图标的 alt):默认「潜能 N」;旁边已有同样的文字时写 \"\" 当装饰 */\n label?: string;\n /** 去掉深色底座(放进已有深底 / 表头开关这类行内位置) */\n bare?: boolean;\n }>(),\n { value: undefined, label: undefined },\n);\n\nconst alt = computed(() => props.label ?? (props.value ? `潜能 ${props.value}` : \"\"));\n</script>\n\n<template>\n <span :class=\"['ak-potential', { 'ak-potential--bare': bare }]\"><img :src=\"src\" :alt=\"alt\" /></span>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nconst props = withDefaults(\n defineProps<{\n /** 图标地址:potential/potential_{N−1}.png(游戏图标自带颜色,不随主题反相) */\n src: string;\n /** 潜能 1–6:给出默认 alt「潜能 N」 */\n value?: 1 | 2 | 3 | 4 | 5 | 6;\n /** 可访问名(图标的 alt):默认「潜能 N」;旁边已有同样的文字时写 \"\" 当装饰 */\n label?: string;\n /** 去掉深色底座(放进已有深底 / 表头开关这类行内位置) */\n bare?: boolean;\n }>(),\n { value: undefined, label: undefined },\n);\n\nconst alt = computed(() => props.label ?? (props.value ? `潜能 ${props.value}` : \"\"));\n</script>\n\n<template>\n <span :class=\"['ak-potential', { 'ak-potential--bare': bare }]\"><img :src=\"src\" :alt=\"alt\" /></span>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nconst props = withDefaults(\n defineProps<{\n /** 图标地址:specialized/specialized_N.png */\n src: string;\n /** 专精 1–3:给出默认 alt「专精 N」 */\n value?: 1 | 2 | 3;\n /** 可访问名(图标的 alt):默认「专精 N」;旁边已有同样的文字时写 \"\" 当装饰 */\n label?: string;\n /** 去掉深色底座 */\n bare?: boolean;\n }>(),\n { value: undefined, label: undefined },\n);\n\nconst alt = computed(() => props.label ?? (props.value ? `专精 ${props.value}` : \"\"));\n</script>\n\n<template>\n <span :class=\"['ak-spec', { 'ak-spec--bare': bare }]\"><img :src=\"src\" :alt=\"alt\" /></span>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nconst props = withDefaults(\n defineProps<{\n /** 图标地址:specialized/specialized_N.png */\n src: string;\n /** 专精 1–3:给出默认 alt「专精 N」 */\n value?: 1 | 2 | 3;\n /** 可访问名(图标的 alt):默认「专精 N」;旁边已有同样的文字时写 \"\" 当装饰 */\n label?: string;\n /** 去掉深色底座 */\n bare?: boolean;\n }>(),\n { value: undefined, label: undefined },\n);\n\nconst alt = computed(() => props.label ?? (props.value ? `专精 ${props.value}` : \"\"));\n</script>\n\n<template>\n <span :class=\"['ak-spec', { 'ak-spec--bare': bare }]\"><img :src=\"src\" :alt=\"alt\" /></span>\n</template>\n","<script setup lang=\"ts\">\nwithDefaults(\n defineProps<{\n /** 等级 */\n value: number;\n /** 外观:default 纯读数 · badge 主题灰块(24px 高,与阶段选择器 / 开关 / 信赖同一条线;是读数不是按钮,不反白) */\n variant?: \"default\" | \"badge\";\n }>(),\n { variant: \"default\" },\n);\n</script>\n\n<template>\n <span :class=\"['ak-level', variant === 'badge' && 'ak-level--badge']\">\n <span class=\"ak-level__lv\">LV</span><span class=\"ak-level__n\">{{ value }}</span>\n </span>\n</template>\n","<script setup lang=\"ts\">\nwithDefaults(\n defineProps<{\n /** 等级 */\n value: number;\n /** 外观:default 纯读数 · badge 主题灰块(24px 高,与阶段选择器 / 开关 / 信赖同一条线;是读数不是按钮,不反白) */\n variant?: \"default\" | \"badge\";\n }>(),\n { variant: \"default\" },\n);\n</script>\n\n<template>\n <span :class=\"['ak-level', variant === 'badge' && 'ak-level--badge']\">\n <span class=\"ak-level__lv\">LV</span><span class=\"ak-level__n\">{{ value }}</span>\n </span>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, nextTick } from \"vue\";\n\n/**\n * 精英阶段选择器(E0 / E1 / E2):属性计算器 / 攻击范围这类「同一块数据按阶段重算」的地方用。\n * 语义是单选组(WAI-ARIA Radio Group)而不是页签:它不切换面板,只改一个值,下游数据跟着重算。\n */\nconst props = withDefaults(\n defineProps<{\n /** 最高精英阶段:只画到这一阶(三星干员 1,一 / 二星 0) */\n max?: 0 | 1 | 2;\n /** 各阶段图标地址,下标 = 阶段(elite/elite_N.png,白线稿;选中项在反色块上自动反相);不传只有文字 */\n icons?: string[];\n /** 读屏用的组名 */\n label?: string;\n }>(),\n { max: 2, icons: () => [], label: \"精英阶段\" },\n);\n\n/** 当前精英阶段 0–2 */\nconst model = defineModel<number>({ default: 0 });\n\nconst phases = computed(() => Array.from({ length: props.max + 1 }, (_, i) => i));\n/** 绑定的值超出 max(换了个星级低的干员)时按最高阶显示,保证总有一项在 Tab 顺序里 */\nconst current = computed(() => Math.min(Math.max(model.value, 0), props.max));\n\n/** 方向键在阶段间移动并选中,首尾循环(WAI-ARIA Radio Group);Space / Enter 由 <button> 自己触发 click */\nfunction onKey(e: KeyboardEvent) {\n const n = phases.value.length;\n const i = current.value;\n const to =\n e.key === \"ArrowRight\" || e.key === \"ArrowDown\" ? (i + 1) % n\n : e.key === \"ArrowLeft\" || e.key === \"ArrowUp\" ? (i - 1 + n) % n\n : undefined;\n if (to === undefined) return;\n e.preventDefault();\n model.value = to;\n const group = e.currentTarget as HTMLElement;\n nextTick(() => group.querySelectorAll<HTMLElement>(\"[role=radio]\")[to]?.focus());\n}\n</script>\n\n<template>\n <!-- data-no-toggle:皮肤脚本会替模板输出的 .ak-phase-tabs 翻 is-active 并发 akds:select,这里的选中只看 v-model -->\n <div class=\"ak-phase-tabs\" role=\"radiogroup\" :aria-label=\"label\" data-no-toggle @keydown=\"onKey\">\n <button\n v-for=\"p in phases\"\n :key=\"p\"\n type=\"button\"\n role=\"radio\"\n :class=\"{ 'is-active': p === current }\"\n :aria-checked=\"p === current\"\n :tabindex=\"p === current ? 0 : -1\"\n @click=\"model = p\"\n >\n <img v-if=\"icons[p]\" :src=\"icons[p]\" alt=\"\" />E{{ p }}\n </button>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, nextTick } from \"vue\";\n\n/**\n * 精英阶段选择器(E0 / E1 / E2):属性计算器 / 攻击范围这类「同一块数据按阶段重算」的地方用。\n * 语义是单选组(WAI-ARIA Radio Group)而不是页签:它不切换面板,只改一个值,下游数据跟着重算。\n */\nconst props = withDefaults(\n defineProps<{\n /** 最高精英阶段:只画到这一阶(三星干员 1,一 / 二星 0) */\n max?: 0 | 1 | 2;\n /** 各阶段图标地址,下标 = 阶段(elite/elite_N.png,白线稿;选中项在反色块上自动反相);不传只有文字 */\n icons?: string[];\n /** 读屏用的组名 */\n label?: string;\n }>(),\n { max: 2, icons: () => [], label: \"精英阶段\" },\n);\n\n/** 当前精英阶段 0–2 */\nconst model = defineModel<number>({ default: 0 });\n\nconst phases = computed(() => Array.from({ length: props.max + 1 }, (_, i) => i));\n/** 绑定的值超出 max(换了个星级低的干员)时按最高阶显示,保证总有一项在 Tab 顺序里 */\nconst current = computed(() => Math.min(Math.max(model.value, 0), props.max));\n\n/** 方向键在阶段间移动并选中,首尾循环(WAI-ARIA Radio Group);Space / Enter 由 <button> 自己触发 click */\nfunction onKey(e: KeyboardEvent) {\n const n = phases.value.length;\n const i = current.value;\n const to =\n e.key === \"ArrowRight\" || e.key === \"ArrowDown\" ? (i + 1) % n\n : e.key === \"ArrowLeft\" || e.key === \"ArrowUp\" ? (i - 1 + n) % n\n : undefined;\n if (to === undefined) return;\n e.preventDefault();\n model.value = to;\n const group = e.currentTarget as HTMLElement;\n nextTick(() => group.querySelectorAll<HTMLElement>(\"[role=radio]\")[to]?.focus());\n}\n</script>\n\n<template>\n <!-- data-no-toggle:皮肤脚本会替模板输出的 .ak-phase-tabs 翻 is-active 并发 akds:select,这里的选中只看 v-model -->\n <div class=\"ak-phase-tabs\" role=\"radiogroup\" :aria-label=\"label\" data-no-toggle @keydown=\"onKey\">\n <button\n v-for=\"p in phases\"\n :key=\"p\"\n type=\"button\"\n role=\"radio\"\n :class=\"{ 'is-active': p === current }\"\n :aria-checked=\"p === current\"\n :tabindex=\"p === current ? 0 : -1\"\n @click=\"model = p\"\n >\n <img v-if=\"icons[p]\" :src=\"icons[p]\" alt=\"\" />E{{ p }}\n </button>\n </div>\n</template>\n","<script setup lang=\"ts\">\nwithDefaults(\n defineProps<{\n /** 信赖(%):0–200 */\n value: number;\n /** 读屏前缀:心形是 CSS 画的、读屏读不到,默认补一段隐藏的「信赖」 */\n label?: string;\n }>(),\n { label: \"信赖\" },\n);\n</script>\n\n<template>\n <span class=\"ak-trust\"><span v-if=\"label\" class=\"ak-sr-only\">{{ label }}</span>{{ value }}%</span>\n</template>\n","<script setup lang=\"ts\">\nwithDefaults(\n defineProps<{\n /** 信赖(%):0–200 */\n value: number;\n /** 读屏前缀:心形是 CSS 画的、读屏读不到,默认补一段隐藏的「信赖」 */\n label?: string;\n }>(),\n { label: \"信赖\" },\n);\n</script>\n\n<template>\n <span class=\"ak-trust\"><span v-if=\"label\" class=\"ak-sr-only\">{{ label }}</span>{{ value }}%</span>\n</template>\n","import type { InjectionKey } from \"vue\";\n\n/** AkPotList 给格子的当前潜能(格子自己比较决定是否点亮) */\nexport const potListKey: InjectionKey<{ value?: number }> = Symbol(\"AkPotList\");\n","<script setup lang=\"ts\">\nimport { provide } from \"vue\";\n\nimport { potListKey } from \"./context\";\n\n/** 潜能提升一览(同现网 {{潜能提升}} 的五格表):潜能 2–6 各一格 AkPot,自动折行 */\nconst props = defineProps<{\n /** 当前潜能 1–6:潜能等级不超过它的格子点亮(顶部青条 + 青色小标);不写都不亮 */\n value?: number;\n}>();\n\ndefineSlots<{\n /** 若干 AkPot */\n default?: () => unknown;\n}>();\n\nprovide(potListKey, props);\n</script>\n\n<template>\n <div class=\"ak-pot-list\" role=\"list\"><slot /></div>\n</template>\n","<script setup lang=\"ts\">\nimport { provide } from \"vue\";\n\nimport { potListKey } from \"./context\";\n\n/** 潜能提升一览(同现网 {{潜能提升}} 的五格表):潜能 2–6 各一格 AkPot,自动折行 */\nconst props = defineProps<{\n /** 当前潜能 1–6:潜能等级不超过它的格子点亮(顶部青条 + 青色小标);不写都不亮 */\n value?: number;\n}>();\n\ndefineSlots<{\n /** 若干 AkPot */\n default?: () => unknown;\n}>();\n\nprovide(potListKey, props);\n</script>\n\n<template>\n <div class=\"ak-pot-list\" role=\"list\"><slot /></div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, inject } from \"vue\";\n\nimport AkPotential from \"../Potential/AkPotential.vue\";\nimport { potListKey } from \"./context\";\n\n/** 潜能提升一览里的一格:图标 + 小标「潜能 N」+ 效果(默认插槽),只能放在 AkPotList 里 */\nconst props = withDefaults(\n defineProps<{\n /** 潜能等级 2–6:给出小标「潜能 N」,并与 AkPotList 的 value 比较决定是否点亮 */\n level: 2 | 3 | 4 | 5 | 6;\n /** 潜能图标地址(potential/potential_{N−1}.png) */\n src: string;\n /** 小标:默认「潜能 N」 */\n title?: string;\n /** 点亮(已生效):不写时按 AkPotList 的 value 算 */\n active?: boolean;\n }>(),\n { title: undefined, active: undefined },\n);\n\ndefineSlots<{\n /** 效果:「部署费用<span class=\"ak-rt-vup\">-1</span>」这种,可带富文本 */\n default?: () => unknown;\n}>();\n\nconst list = inject(potListKey, null);\nconst on = computed(() => props.active ?? (list?.value !== undefined && props.level <= list.value));\n</script>\n\n<template>\n <div :class=\"['ak-pot', { 'is-on': on }]\" role=\"listitem\" :data-pot=\"level\">\n <AkPotential :src=\"src\" label=\"\" />\n <div>\n <span class=\"ak-pot__label\">{{ title ?? `潜能 ${level}` }}</span>\n <slot />\n <span v-if=\"on\" class=\"ak-sr-only\">(已生效)</span>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, inject } from \"vue\";\n\nimport AkPotential from \"../Potential/AkPotential.vue\";\nimport { potListKey } from \"./context\";\n\n/** 潜能提升一览里的一格:图标 + 小标「潜能 N」+ 效果(默认插槽),只能放在 AkPotList 里 */\nconst props = withDefaults(\n defineProps<{\n /** 潜能等级 2–6:给出小标「潜能 N」,并与 AkPotList 的 value 比较决定是否点亮 */\n level: 2 | 3 | 4 | 5 | 6;\n /** 潜能图标地址(potential/potential_{N−1}.png) */\n src: string;\n /** 小标:默认「潜能 N」 */\n title?: string;\n /** 点亮(已生效):不写时按 AkPotList 的 value 算 */\n active?: boolean;\n }>(),\n { title: undefined, active: undefined },\n);\n\ndefineSlots<{\n /** 效果:「部署费用<span class=\"ak-rt-vup\">-1</span>」这种,可带富文本 */\n default?: () => unknown;\n}>();\n\nconst list = inject(potListKey, null);\nconst on = computed(() => props.active ?? (list?.value !== undefined && props.level <= list.value));\n</script>\n\n<template>\n <div :class=\"['ak-pot', { 'is-on': on }]\" role=\"listitem\" :data-pot=\"level\">\n <AkPotential :src=\"src\" label=\"\" />\n <div>\n <span class=\"ak-pot__label\">{{ title ?? `潜能 ${level}` }}</span>\n <slot />\n <span v-if=\"on\" class=\"ak-sr-only\">(已生效)</span>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nimport AkRarity, { type Rarity } from \"../Rarity/AkRarity.vue\";\n\nconst props = withDefaults(\n defineProps<{\n /** 干员名 */\n name: string;\n /** 名字下的小字(Bender 大写):英文名 · 编号(Ch'en · LM04)/ 生日 / 获得方式 */\n sub?: string;\n /** 头像地址(正方形,avatar/char_xxx_2.png) */\n avatar: string;\n /** 稀有度 1–6:名字上方的色线(rail 时是左边条),并作左上角星级的 alt */\n rarity: Rarity;\n /** 左上角星级原图地址(rarity/rarity_yellow_{rarity−1}.png);不传时画 CSS 星形 */\n rarityIcon?: string;\n /** 职业名:左下角职业图标的 alt */\n profession?: string;\n /** 左下角职业图标地址:md / lg 用 profession/<职业>.png,sm 用头像同款小图标 profession/icon_<职业>.png;不传不显示 */\n professionIcon?: string;\n /** 精英阶段 0–2:右下角精英图标的 alt */\n elite?: 0 | 1 | 2;\n /** 右下角精英图标地址(elite/elite_N.png);不传不显示 */\n eliteIcon?: string;\n /** 尺寸:sm 88 · md 128 · lg 180(px 宽);放进 AkOpGrid 时宽度由网格定 */\n size?: \"sm\" | \"md\" | \"lg\";\n /** 外观:default 稀有度色顶线 · rail 稀有度色左边条(与 1px 框直角拼接) */\n variant?: \"default\" | \"rail\";\n /** 链接到干员页;不写渲染成 <div> */\n href?: string;\n /** 当前项(异格一览里正在看的这位):青色描边 + aria-current=\"page\" */\n current?: boolean;\n }>(),\n {\n sub: undefined,\n rarityIcon: undefined,\n profession: undefined,\n professionIcon: undefined,\n elite: undefined,\n eliteIcon: undefined,\n size: \"md\",\n variant: \"default\",\n href: undefined,\n },\n);\n\ndefineSlots<{\n /** 头像右上角的角标(.ak-op-card__badge:首页「兑」字标、模组类型小图标…) */\n badge?: () => unknown;\n}>();\n\nconst CN = [\"零\", \"一\", \"二\", \"三\", \"四\", \"五\", \"六\"];\n\nconst classes = computed(() => [\n \"ak-op-card\",\n \"ak-not-prose\",\n props.size !== \"md\" && `ak-op-card--${props.size}`,\n { \"ak-op-card--rail\": props.variant === \"rail\", \"is-current\": props.current },\n]);\n</script>\n\n<template>\n <!-- 整块是链接:ak-not-prose 挡掉正文的 a:visited / a:hover 链接色 -->\n <component :is=\"href ? 'a' : 'div'\" :class=\"classes\" :href=\"href\" :data-rarity=\"rarity\" :aria-current=\"current ? 'page' : undefined\">\n <span class=\"ak-op-card__portrait\">\n <img :src=\"avatar\" alt=\"\" />\n <span class=\"ak-op-card__rarity\">\n <img v-if=\"rarityIcon\" :src=\"rarityIcon\" :alt=\"`${CN[rarity]}星`\" />\n <AkRarity v-else :value=\"rarity\" />\n </span>\n <span v-if=\"professionIcon\" class=\"ak-op-card__prof\"><img :src=\"professionIcon\" :alt=\"profession ?? ''\" /></span>\n <span v-if=\"eliteIcon\" class=\"ak-op-card__elite\"><img :src=\"eliteIcon\" :alt=\"elite === undefined ? '' : `精英${CN[elite]}`\" /></span>\n <span v-if=\"$slots.badge\" class=\"ak-op-card__badge\"><slot name=\"badge\" /></span>\n </span>\n <span class=\"ak-op-card__name\">{{ name }}<span v-if=\"sub\" class=\"ak-op-card__sub\">{{ sub }}</span></span>\n </component>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nimport AkRarity, { type Rarity } from \"../Rarity/AkRarity.vue\";\n\nconst props = withDefaults(\n defineProps<{\n /** 干员名 */\n name: string;\n /** 名字下的小字(Bender 大写):英文名 · 编号(Ch'en · LM04)/ 生日 / 获得方式 */\n sub?: string;\n /** 头像地址(正方形,avatar/char_xxx_2.png) */\n avatar: string;\n /** 稀有度 1–6:名字上方的色线(rail 时是左边条),并作左上角星级的 alt */\n rarity: Rarity;\n /** 左上角星级原图地址(rarity/rarity_yellow_{rarity−1}.png);不传时画 CSS 星形 */\n rarityIcon?: string;\n /** 职业名:左下角职业图标的 alt */\n profession?: string;\n /** 左下角职业图标地址:md / lg 用 profession/<职业>.png,sm 用头像同款小图标 profession/icon_<职业>.png;不传不显示 */\n professionIcon?: string;\n /** 精英阶段 0–2:右下角精英图标的 alt */\n elite?: 0 | 1 | 2;\n /** 右下角精英图标地址(elite/elite_N.png);不传不显示 */\n eliteIcon?: string;\n /** 尺寸:sm 88 · md 128 · lg 180(px 宽);放进 AkOpGrid 时宽度由网格定 */\n size?: \"sm\" | \"md\" | \"lg\";\n /** 外观:default 稀有度色顶线 · rail 稀有度色左边条(与 1px 框直角拼接) */\n variant?: \"default\" | \"rail\";\n /** 链接到干员页;不写渲染成 <div> */\n href?: string;\n /** 当前项(异格一览里正在看的这位):青色描边 + aria-current=\"page\" */\n current?: boolean;\n }>(),\n {\n sub: undefined,\n rarityIcon: undefined,\n profession: undefined,\n professionIcon: undefined,\n elite: undefined,\n eliteIcon: undefined,\n size: \"md\",\n variant: \"default\",\n href: undefined,\n },\n);\n\ndefineSlots<{\n /** 头像右上角的角标(.ak-op-card__badge:首页「兑」字标、模组类型小图标…) */\n badge?: () => unknown;\n}>();\n\nconst CN = [\"零\", \"一\", \"二\", \"三\", \"四\", \"五\", \"六\"];\n\nconst classes = computed(() => [\n \"ak-op-card\",\n \"ak-not-prose\",\n props.size !== \"md\" && `ak-op-card--${props.size}`,\n { \"ak-op-card--rail\": props.variant === \"rail\", \"is-current\": props.current },\n]);\n</script>\n\n<template>\n <!-- 整块是链接:ak-not-prose 挡掉正文的 a:visited / a:hover 链接色 -->\n <component :is=\"href ? 'a' : 'div'\" :class=\"classes\" :href=\"href\" :data-rarity=\"rarity\" :aria-current=\"current ? 'page' : undefined\">\n <span class=\"ak-op-card__portrait\">\n <img :src=\"avatar\" alt=\"\" />\n <span class=\"ak-op-card__rarity\">\n <img v-if=\"rarityIcon\" :src=\"rarityIcon\" :alt=\"`${CN[rarity]}星`\" />\n <AkRarity v-else :value=\"rarity\" />\n </span>\n <span v-if=\"professionIcon\" class=\"ak-op-card__prof\"><img :src=\"professionIcon\" :alt=\"profession ?? ''\" /></span>\n <span v-if=\"eliteIcon\" class=\"ak-op-card__elite\"><img :src=\"eliteIcon\" :alt=\"elite === undefined ? '' : `精英${CN[elite]}`\" /></span>\n <span v-if=\"$slots.badge\" class=\"ak-op-card__badge\"><slot name=\"badge\" /></span>\n </span>\n <span class=\"ak-op-card__name\">{{ name }}<span v-if=\"sub\" class=\"ak-op-card__sub\">{{ sub }}</span></span>\n </component>\n</template>\n","<template>\n <!-- 干员卡网格:auto-fill 每列最窄 112px,卡片宽度由网格定 -->\n <div class=\"ak-op-grid\"><slot /></div>\n</template>\n","<script setup lang=\"ts\">\nimport AkRarity, { type Rarity } from \"../Rarity/AkRarity.vue\";\n\n/** 干员横向条目:列表 / 表格里一行一位——头像(稀有度色左边条)+ 名字 + 第二行小字 */\nwithDefaults(\n defineProps<{\n /** 干员名 */\n name: string;\n /** 头像地址(正方形,36px 显示) */\n avatar: string;\n /** 稀有度 1–6:头像左边的色条;stars 时第二行的星也按它画 */\n rarity?: Rarity;\n /** 第二行小字:分支 / 职业 / 获得方式 */\n meta?: string;\n /** 在第二行前面画稀有度星(按稀有度色阶着色;要写 rarity) */\n stars?: boolean;\n /** 链接到干员页;不写渲染成 <span> */\n href?: string;\n }>(),\n { rarity: undefined, meta: undefined, href: undefined },\n);\n\ndefineSlots<{\n /** 第二行(代替 meta),可放标签 / 链接 */\n meta?: () => unknown;\n}>();\n</script>\n\n<template>\n <!-- 整块是链接:ak-not-prose 挡掉正文的 a:visited / a:hover 链接色 -->\n <component :is=\"href ? 'a' : 'span'\" class=\"ak-op-row ak-not-prose\" :href=\"href\">\n <span class=\"ak-avatar\" :data-rarity=\"rarity\"><img :src=\"avatar\" alt=\"\" /></span>\n <span>\n <span class=\"ak-op-row__name\">{{ name }}</span>\n <span v-if=\"meta || $slots.meta || (stars && rarity)\" class=\"ak-op-row__meta\">\n <AkRarity v-if=\"stars && rarity\" :value=\"rarity\" variant=\"tier\" size=\"sm\" />\n <slot name=\"meta\">{{ meta }}</slot>\n </span>\n </span>\n </component>\n</template>\n","<script setup lang=\"ts\">\nimport AkRarity, { type Rarity } from \"../Rarity/AkRarity.vue\";\n\n/** 干员横向条目:列表 / 表格里一行一位——头像(稀有度色左边条)+ 名字 + 第二行小字 */\nwithDefaults(\n defineProps<{\n /** 干员名 */\n name: string;\n /** 头像地址(正方形,36px 显示) */\n avatar: string;\n /** 稀有度 1–6:头像左边的色条;stars 时第二行的星也按它画 */\n rarity?: Rarity;\n /** 第二行小字:分支 / 职业 / 获得方式 */\n meta?: string;\n /** 在第二行前面画稀有度星(按稀有度色阶着色;要写 rarity) */\n stars?: boolean;\n /** 链接到干员页;不写渲染成 <span> */\n href?: string;\n }>(),\n { rarity: undefined, meta: undefined, href: undefined },\n);\n\ndefineSlots<{\n /** 第二行(代替 meta),可放标签 / 链接 */\n meta?: () => unknown;\n}>();\n</script>\n\n<template>\n <!-- 整块是链接:ak-not-prose 挡掉正文的 a:visited / a:hover 链接色 -->\n <component :is=\"href ? 'a' : 'span'\" class=\"ak-op-row ak-not-prose\" :href=\"href\">\n <span class=\"ak-avatar\" :data-rarity=\"rarity\"><img :src=\"avatar\" alt=\"\" /></span>\n <span>\n <span class=\"ak-op-row__name\">{{ name }}</span>\n <span v-if=\"meta || $slots.meta || (stars && rarity)\" class=\"ak-op-row__meta\">\n <AkRarity v-if=\"stars && rarity\" :value=\"rarity\" variant=\"tier\" size=\"sm\" />\n <slot name=\"meta\">{{ meta }}</slot>\n </span>\n </span>\n </component>\n</template>\n","/**\n * 游戏内富文本:gamedata 里技能 / 天赋 / 关卡描述的原始标记 → 结点树(AkRichText 再画成 .ak-rt-* 的 span)。\n *\n * <@ba.vup>…</> 样式标签(gamedata_const.richTextStyles)→ .ak-rt-vup;命名空间不论(cc.vup / ba.vup 同色),认不得的样式只留文字\n * <$ba.stun>…</> 术语(termDescriptionDict)→ .ak-rt-term,说明作悬停提示\n * {atk_scale:0%} blackboard 占位符:前缀 - 取负;:0% 乘 100 加 %、:0.0 保留一位(# 位去掉末尾的 0);没有格式就原样\n * 换行 → <br>\n *\n * 标签可以嵌套(<@ba.kw><$ba.stun>晕眩</></>);没闭合的在末尾自动闭合,多出来的 </> 忽略。\n */\n\nexport type RtNode =\n | { type: \"text\"; text: string }\n | { type: \"br\" }\n | { type: \"var\"; key: string; negative: boolean; format?: string; raw: string }\n | { type: \"style\" | \"term\"; key: string; children: RtNode[] };\n\nconst TOKEN = /<([@$])([^<>\\s]+?)>|<\\/>|\\{(-)?([^{}:\\s]+?)(?::([^{}\\s]+))?\\}|\\r?\\n/g;\n\nexport function parseRichText(src: string): RtNode[] {\n const root: RtNode[] = [];\n const stack: RtNode[][] = [root];\n const top = () => stack[stack.length - 1];\n let last = 0;\n for (const m of src.matchAll(TOKEN)) {\n if (m.index > last) top().push({ type: \"text\", text: src.slice(last, m.index) });\n last = m.index + m[0].length;\n if (m[1]) {\n const node: RtNode = { type: m[1] === \"$\" ? \"term\" : \"style\", key: m[2], children: [] };\n top().push(node);\n stack.push(node.children);\n } else if (m[0] === \"</>\") {\n if (stack.length > 1) stack.pop();\n } else if (m[4]) {\n top().push({ type: \"var\", key: m[4], negative: !!m[3], format: m[5], raw: m[0] });\n } else {\n top().push({ type: \"br\" });\n }\n }\n if (last < src.length) top().push({ type: \"text\", text: src.slice(last) });\n return root;\n}\n\n/** 有 .ak-rt-* 类的样式名(rich-text.css);mission.levelname 另算 */\nconst STYLES = new Set([\"vup\", \"vdown\", \"rem\", \"kw\", \"imp\", \"drop\", \"enemy\", \"gild\", \"acrem\", \"level\", \"talpu\", \"pn\"]);\n\n/** <@ns.name> → 类名;认不得的返回 undefined(只留文字) */\nexport function styleClass(key: string): string | undefined {\n if (key === \"mission.levelname\") return \"ak-rt-level\";\n const name = key.slice(key.lastIndexOf(\".\") + 1).toLowerCase();\n return STYLES.has(name) ? `ak-rt-${name}` : undefined;\n}\n\n/** 占位符取值 → 文字:{atk_scale:0%} + 2.6 → \"260%\",{-cost:0.0} + 1.25 → \"-1.3\" */\nexport function formatVar(value: number | string, format?: string, negative = false): string {\n if (typeof value !== \"number\") return negative ? `-${value}` : value;\n const percent = format?.endsWith(\"%\") ?? false;\n const n = (negative ? -value : value) * (percent ? 100 : 1);\n const digits = format ? (/\\.([0#]+)/.exec(format)?.[1] ?? \"\") : undefined;\n let s: string;\n if (digits === undefined) s = String(Math.round(n * 1e6) / 1e6);\n else {\n s = n.toFixed(digits.length);\n if (digits.includes(\"#\") && s.includes(\".\")) s = s.replace(/\\.?0+$/, \"\");\n }\n return percent ? `${s}%` : s;\n}\n\n/** 一两句话的说明(术语 / SP 说明)用可折行的宽气泡 .ak-tip--wide,短的一行放下 */\nexport const isWideTip = (tip: string | undefined) => !!tip && tip.length > 12;\n","<script setup lang=\"ts\">\nimport { computed, h, type VNodeChild } from \"vue\";\n\nimport { formatVar, isWideTip, parseRichText, styleClass, type RtNode } from \"./parse\";\n\nexport type RichTextVariant =\n | \"vup\"\n | \"vdown\"\n | \"rem\"\n | \"kw\"\n | \"talpu\"\n | \"term\"\n | \"imp\"\n | \"enemy\"\n | \"gild\"\n | \"drop\"\n | \"acrem\"\n | \"level\"\n | \"pn\";\n\nconst props = withDefaults(\n defineProps<{\n /** 游戏原始标记:<@ba.vup>…</> 样式 · <$ba.stun>…</> 术语 · {atk_scale:0%} 占位符 · 换行;不写就渲染默认插槽 */\n text?: string;\n /** 占位符的取值(技能等级的 blackboard,如 { atk_scale: 2.6 });键不分大小写,没给的占位符原样留着 */\n vars?: Record<string, number | string>;\n /** 术语说明(termDescriptionDict,如 { \"ba.stun\": \"晕眩:…\" }),作 <$…> 的悬停提示 */\n terms?: Record<string, string>;\n /** 只包一层、不解析时的样式:vup 增益 · vdown 减益 · rem 提醒 · kw 关键词 · talpu 潜能加成 · term 术语 · imp 重要 · enemy 敌方 · gild 镀层 · level 关卡名 · pn 斜体 … */\n variant?: RichTextVariant;\n /** 悬停提示(data-ak-tip);variant=\"term\" 时写术语说明 */\n tip?: string;\n /** 外层元素 */\n tag?: string;\n }>(),\n { text: undefined, vars: undefined, terms: undefined, variant: undefined, tip: undefined, tag: \"span\" },\n);\n\nconst slots = defineSlots<{\n /** 不写 text 时的内容(用 variant 包一层) */\n default?: () => unknown;\n /** 占位符怎么画(技能参数矩阵用它把变量位画成 .ak-var);不写就按 vars 填数 */\n var?: (p: { key: string; value: string | undefined }) => unknown;\n}>();\n\nconst tree = computed(() => (props.text === undefined ? [] : parseRichText(props.text)));\n\n/** vars 的键按小写查(游戏里模板和 blackboard 的大小写不总一致) */\nconst lowerVars = computed(() => {\n const out: Record<string, number | string> = {};\n for (const [k, v] of Object.entries(props.vars ?? {})) out[k.toLowerCase()] = v;\n return out;\n});\n\nfunction render(nodes: RtNode[]): VNodeChild[] {\n return nodes.map(n => {\n switch (n.type) {\n case \"text\":\n return n.text;\n case \"br\":\n return h(\"br\");\n case \"var\": {\n const v = lowerVars.value[n.key.toLowerCase()];\n const value = v === undefined ? undefined : formatVar(v, n.format, n.negative);\n return slots.var ? (slots.var({ key: n.key, value }) as VNodeChild) : (value ?? n.raw);\n }\n case \"term\": {\n const tip = props.terms?.[n.key];\n return h(\"span\", { class: [\"ak-rt-term\", isWideTip(tip) && \"ak-tip--wide\"], \"data-ak-tip\": tip }, render(n.children));\n }\n case \"style\": {\n const cls = styleClass(n.key);\n return cls ? h(\"span\", { class: cls }, render(n.children)) : render(n.children);\n }\n }\n });\n}\n\nconst classes = computed(() => [props.variant && `ak-rt-${props.variant}`, isWideTip(props.tip) && \"ak-tip--wide\"].filter(Boolean).join(\" \") || undefined);\n\n/** 渲染期才调插槽(var 插槽要在父组件的渲染里调用),所以包成一个函数组件交给模板 */\nconst Nodes = () => render(tree.value);\n</script>\n\n<template>\n <component :is=\"tag\" :class=\"classes\" :data-ak-tip=\"tip\">\n <Nodes v-if=\"text !== undefined\" />\n <slot v-else />\n </component>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, h, type VNodeChild } from \"vue\";\n\nimport { formatVar, isWideTip, parseRichText, styleClass, type RtNode } from \"./parse\";\n\nexport type RichTextVariant =\n | \"vup\"\n | \"vdown\"\n | \"rem\"\n | \"kw\"\n | \"talpu\"\n | \"term\"\n | \"imp\"\n | \"enemy\"\n | \"gild\"\n | \"drop\"\n | \"acrem\"\n | \"level\"\n | \"pn\";\n\nconst props = withDefaults(\n defineProps<{\n /** 游戏原始标记:<@ba.vup>…</> 样式 · <$ba.stun>…</> 术语 · {atk_scale:0%} 占位符 · 换行;不写就渲染默认插槽 */\n text?: string;\n /** 占位符的取值(技能等级的 blackboard,如 { atk_scale: 2.6 });键不分大小写,没给的占位符原样留着 */\n vars?: Record<string, number | string>;\n /** 术语说明(termDescriptionDict,如 { \"ba.stun\": \"晕眩:…\" }),作 <$…> 的悬停提示 */\n terms?: Record<string, string>;\n /** 只包一层、不解析时的样式:vup 增益 · vdown 减益 · rem 提醒 · kw 关键词 · talpu 潜能加成 · term 术语 · imp 重要 · enemy 敌方 · gild 镀层 · level 关卡名 · pn 斜体 … */\n variant?: RichTextVariant;\n /** 悬停提示(data-ak-tip);variant=\"term\" 时写术语说明 */\n tip?: string;\n /** 外层元素 */\n tag?: string;\n }>(),\n { text: undefined, vars: undefined, terms: undefined, variant: undefined, tip: undefined, tag: \"span\" },\n);\n\nconst slots = defineSlots<{\n /** 不写 text 时的内容(用 variant 包一层) */\n default?: () => unknown;\n /** 占位符怎么画(技能参数矩阵用它把变量位画成 .ak-var);不写就按 vars 填数 */\n var?: (p: { key: string; value: string | undefined }) => unknown;\n}>();\n\nconst tree = computed(() => (props.text === undefined ? [] : parseRichText(props.text)));\n\n/** vars 的键按小写查(游戏里模板和 blackboard 的大小写不总一致) */\nconst lowerVars = computed(() => {\n const out: Record<string, number | string> = {};\n for (const [k, v] of Object.entries(props.vars ?? {})) out[k.toLowerCase()] = v;\n return out;\n});\n\nfunction render(nodes: RtNode[]): VNodeChild[] {\n return nodes.map(n => {\n switch (n.type) {\n case \"text\":\n return n.text;\n case \"br\":\n return h(\"br\");\n case \"var\": {\n const v = lowerVars.value[n.key.toLowerCase()];\n const value = v === undefined ? undefined : formatVar(v, n.format, n.negative);\n return slots.var ? (slots.var({ key: n.key, value }) as VNodeChild) : (value ?? n.raw);\n }\n case \"term\": {\n const tip = props.terms?.[n.key];\n return h(\"span\", { class: [\"ak-rt-term\", isWideTip(tip) && \"ak-tip--wide\"], \"data-ak-tip\": tip }, render(n.children));\n }\n case \"style\": {\n const cls = styleClass(n.key);\n return cls ? h(\"span\", { class: cls }, render(n.children)) : render(n.children);\n }\n }\n });\n}\n\nconst classes = computed(() => [props.variant && `ak-rt-${props.variant}`, isWideTip(props.tip) && \"ak-tip--wide\"].filter(Boolean).join(\" \") || undefined);\n\n/** 渲染期才调插槽(var 插槽要在父组件的渲染里调用),所以包成一个函数组件交给模板 */\nconst Nodes = () => render(tree.value);\n</script>\n\n<template>\n <component :is=\"tag\" :class=\"classes\" :data-ak-tip=\"tip\">\n <Nodes v-if=\"text !== undefined\" />\n <slot v-else />\n </component>\n</template>\n","/** 技力回复方式(游戏内 spType):自动回复 绿 · 攻击回复 橙 · 受击回复 黄 · 被动 灰 */\nexport type SpType = \"auto\" | \"attack\" | \"hit\" | \"passive\";\n\n/** SP 数值芯片:cost 消耗(荧光绿闪电)· init 初始(▶)· duration 持续(⏱) */\nexport type SpValueKind = \"cost\" | \"init\" | \"duration\";\n\nexport const SP_TYPE_TEXT: Record<SpType, string> = { auto: \"自动回复\", attack: \"攻击回复\", hit: \"受击回复\", passive: \"被动\" };\n\n/** 游戏内的技力说明(prts.wiki 干员页的悬停提示);被动技能没有技力,不给 */\nexport const SP_TYPE_TIP: Record<SpType, string | undefined> = {\n auto: \"每秒回复1点技力\",\n attack: \"每次攻击回复1点技力\",\n hit: \"每次受到攻击回复1点技力\",\n passive: undefined,\n};\n\nexport const TRIGGER_TEXT = { manual: \"手动触发\", auto: \"自动触发\" } as const;\nexport const TRIGGER_TIP = {\n manual: \"技力达到需求并满足开启条件后,需要玩家手动开启的技能\",\n auto: \"技力达到需求并满足开启条件后,自动开启的技能\",\n} as const;\n\nexport const SP_VALUE_CLASS: Record<SpValueKind, string> = { cost: \"ak-sp-cost\", init: \"ak-sp-init\", duration: \"ak-sp-dur\" };\n/** 读屏用的名字(芯片的图形是 CSS mask,读不出来) */\nexport const SP_VALUE_NAME: Record<SpValueKind, string> = { cost: \"消耗\", init: \"初始\", duration: \"持续\" };\nexport const SP_VALUE_TIP: Record<SpValueKind, string> = {\n cost: \"消耗:该技能所需要消耗的技力数\",\n init: \"初始:干员部署后预置的技力数(每次部署仅一次)\",\n duration: \"持续:该技能的持续时间(秒)\",\n};\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nimport { isWideTip } from \"../RichText/parse\";\nimport { SP_TYPE_TEXT, SP_TYPE_TIP, type SpType } from \"./sp\";\n\nconst props = withDefaults(\n defineProps<{\n /** 技力回复方式:auto 自动回复(绿)· attack 攻击回复(橙)· hit 受击回复(黄)· passive 被动(灰) */\n spType?: SpType;\n /** 悬停提示(data-ak-tip):默认是游戏内的说明(「每次攻击回复1点技力」),可改写;false 关掉 */\n tip?: string | false;\n }>(),\n { spType: \"auto\", tip: undefined },\n);\n\ndefineSlots<{\n /** 文字;默认「自动回复」「攻击回复」「受击回复」「被动」 */\n default?: () => unknown;\n}>();\n\nconst tipText = computed(() => (props.tip === false ? undefined : (props.tip ?? SP_TYPE_TIP[props.spType])));\n</script>\n\n<template>\n <span\n :class=\"['ak-sp', spType !== 'auto' && `ak-sp--${spType}`, isWideTip(tipText) && 'ak-tip--wide']\"\n :data-ak-tip=\"tipText\"\n >\n <slot>{{ SP_TYPE_TEXT[spType] }}</slot>\n </span>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nimport { isWideTip } from \"../RichText/parse\";\nimport { SP_TYPE_TEXT, SP_TYPE_TIP, type SpType } from \"./sp\";\n\nconst props = withDefaults(\n defineProps<{\n /** 技力回复方式:auto 自动回复(绿)· attack 攻击回复(橙)· hit 受击回复(黄)· passive 被动(灰) */\n spType?: SpType;\n /** 悬停提示(data-ak-tip):默认是游戏内的说明(「每次攻击回复1点技力」),可改写;false 关掉 */\n tip?: string | false;\n }>(),\n { spType: \"auto\", tip: undefined },\n);\n\ndefineSlots<{\n /** 文字;默认「自动回复」「攻击回复」「受击回复」「被动」 */\n default?: () => unknown;\n}>();\n\nconst tipText = computed(() => (props.tip === false ? undefined : (props.tip ?? SP_TYPE_TIP[props.spType])));\n</script>\n\n<template>\n <span\n :class=\"['ak-sp', spType !== 'auto' && `ak-sp--${spType}`, isWideTip(tipText) && 'ak-tip--wide']\"\n :data-ak-tip=\"tipText\"\n >\n <slot>{{ SP_TYPE_TEXT[spType] }}</slot>\n </span>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nimport { isWideTip } from \"../RichText/parse\";\nimport { TRIGGER_TEXT, TRIGGER_TIP } from \"./sp\";\n\nconst props = withDefaults(\n defineProps<{\n /** 自动触发(灰底);默认手动触发(黑白反转) */\n auto?: boolean;\n /** 悬停提示(data-ak-tip):默认是游戏内的说明,可改写;false 关掉 */\n tip?: string | false;\n }>(),\n { tip: undefined },\n);\n\ndefineSlots<{\n /** 文字;默认「手动触发」/「自动触发」 */\n default?: () => unknown;\n}>();\n\nconst mode = computed(() => (props.auto ? \"auto\" : \"manual\"));\nconst tipText = computed(() => (props.tip === false ? undefined : (props.tip ?? TRIGGER_TIP[mode.value])));\n</script>\n\n<template>\n <span :class=\"['ak-sp-trigger', { 'ak-sp-trigger--auto': auto, 'ak-tip--wide': isWideTip(tipText) }]\" :data-ak-tip=\"tipText\">\n <slot>{{ TRIGGER_TEXT[mode] }}</slot>\n </span>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nimport { isWideTip } from \"../RichText/parse\";\nimport { TRIGGER_TEXT, TRIGGER_TIP } from \"./sp\";\n\nconst props = withDefaults(\n defineProps<{\n /** 自动触发(灰底);默认手动触发(黑白反转) */\n auto?: boolean;\n /** 悬停提示(data-ak-tip):默认是游戏内的说明,可改写;false 关掉 */\n tip?: string | false;\n }>(),\n { tip: undefined },\n);\n\ndefineSlots<{\n /** 文字;默认「手动触发」/「自动触发」 */\n default?: () => unknown;\n}>();\n\nconst mode = computed(() => (props.auto ? \"auto\" : \"manual\"));\nconst tipText = computed(() => (props.tip === false ? undefined : (props.tip ?? TRIGGER_TIP[mode.value])));\n</script>\n\n<template>\n <span :class=\"['ak-sp-trigger', { 'ak-sp-trigger--auto': auto, 'ak-tip--wide': isWideTip(tipText) }]\" :data-ak-tip=\"tipText\">\n <slot>{{ TRIGGER_TEXT[mode] }}</slot>\n </span>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nimport { isWideTip } from \"../RichText/parse\";\nimport { SP_VALUE_CLASS, SP_VALUE_NAME, SP_VALUE_TIP, type SpValueKind } from \"./sp\";\n\nconst props = withDefaults(\n defineProps<{\n /** 哪一枚芯片:cost 消耗(荧光绿闪电)· init 初始(▶)· duration 持续(⏱) */\n kind: SpValueKind;\n /** 数值;也可以写在默认插槽里(表头图例写「消耗」「初始」这种字) */\n value?: number | string;\n /** 悬停提示(data-ak-tip):默认是这一项的说明(「消耗:该技能所需要消耗的技力数」),可改写;false 关掉 */\n tip?: string | false;\n }>(),\n { value: undefined, tip: undefined },\n);\n\ndefineSlots<{\n /** 芯片里的字(代替 value) */\n default?: () => unknown;\n}>();\n\n/*\n * 图形是 CSS mask,读屏只念得出数字:写 value 时在数字前补一个看不见的名字(.ak-sr-only「消耗」)。\n * 提示长(一句话)时用可折行的宽气泡 .ak-tip--wide。\n */\nconst tipText = computed(() => (props.tip === false ? undefined : (props.tip ?? SP_VALUE_TIP[props.kind])));\n</script>\n\n<template>\n <span :class=\"[SP_VALUE_CLASS[kind], isWideTip(tipText) && 'ak-tip--wide']\" :data-ak-tip=\"tipText\">\n <slot><span class=\"ak-sr-only\">{{ SP_VALUE_NAME[kind] }}</span>{{ value }}</slot>\n </span>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nimport { isWideTip } from \"../RichText/parse\";\nimport { SP_VALUE_CLASS, SP_VALUE_NAME, SP_VALUE_TIP, type SpValueKind } from \"./sp\";\n\nconst props = withDefaults(\n defineProps<{\n /** 哪一枚芯片:cost 消耗(荧光绿闪电)· init 初始(▶)· duration 持续(⏱) */\n kind: SpValueKind;\n /** 数值;也可以写在默认插槽里(表头图例写「消耗」「初始」这种字) */\n value?: number | string;\n /** 悬停提示(data-ak-tip):默认是这一项的说明(「消耗:该技能所需要消耗的技力数」),可改写;false 关掉 */\n tip?: string | false;\n }>(),\n { value: undefined, tip: undefined },\n);\n\ndefineSlots<{\n /** 芯片里的字(代替 value) */\n default?: () => unknown;\n}>();\n\n/*\n * 图形是 CSS mask,读屏只念得出数字:写 value 时在数字前补一个看不见的名字(.ak-sr-only「消耗」)。\n * 提示长(一句话)时用可折行的宽气泡 .ak-tip--wide。\n */\nconst tipText = computed(() => (props.tip === false ? undefined : (props.tip ?? SP_VALUE_TIP[props.kind])));\n</script>\n\n<template>\n <span :class=\"[SP_VALUE_CLASS[kind], isWideTip(tipText) && 'ak-tip--wide']\" :data-ak-tip=\"tipText\">\n <slot><span class=\"ak-sr-only\">{{ SP_VALUE_NAME[kind] }}</span>{{ value }}</slot>\n </span>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nimport AkSp from \"../Sp/AkSp.vue\";\nimport AkSpTrigger from \"../Sp/AkSpTrigger.vue\";\nimport AkSpValue from \"../Sp/AkSpValue.vue\";\nimport type { SpType } from \"../Sp/sp\";\n\nconst props = withDefaults(\n defineProps<{\n /** 技能名 */\n name: string;\n /** 别名,跟在技能名后的灰色小字(干员页全等级表的表头):en 英文名(Bender 大写)· ja 日文名;要放别的内容用 #alias 插槽 */\n alias?: { en?: string; ja?: string };\n /** 技能图标地址(游戏 skill_icon,64px 见方) */\n icon?: string;\n /** 技力回复方式:决定图标描边 + 底条色与 SP 标签;auto 自动回复 · attack 攻击回复 · hit 受击回复 · passive 被动 */\n spType?: SpType;\n /** 触发方式:manual 手动触发 · auto 自动触发;不写不显示(被动技能) */\n trigger?: \"manual\" | \"auto\";\n /** 技力消耗;不写不显示 */\n cost?: number | string;\n /** 初始技力;不写不显示 */\n init?: number | string;\n /** 持续时间:数字按秒写成「25s」,字符串原样(「—」);不写不显示 */\n duration?: number | string;\n /** 开放条件(「技能2 · 精英一开放」),显示在右侧槽 */\n unlock?: string;\n /** 开放条件前的精英化图标地址 */\n unlockIcon?: string;\n /** 选中(蓝框 + 左上角标,游戏内 selected_back) */\n selected?: boolean;\n /** 未解锁:图标灰化 + 锁 */\n locked?: boolean;\n /** 技能名的标题级别(干员页正文里是 3,列表 / 侧栏里一般是 4) */\n headingLevel?: 2 | 3 | 4 | 5 | 6;\n }>(),\n {\n alias: undefined,\n icon: undefined,\n spType: \"auto\",\n trigger: undefined,\n cost: undefined,\n init: undefined,\n duration: undefined,\n unlock: undefined,\n unlockIcon: undefined,\n headingLevel: 4,\n },\n);\n\nconst slots = defineSlots<{\n /** 技能描述(游戏原始标记可以套 AkRichText) */\n default?: () => unknown;\n /** 技能名后的别名(代替 alias),放进 .ak-skill__alias */\n alias?: () => unknown;\n /** 名称行末尾的附加内容(「未解锁」标签等) */\n \"header-extra\"?: () => unknown;\n /** 右侧槽(开放条件之后):技能范围等;写了就是三栏的宽卡(.ak-skill--wide) */\n aside?: () => unknown;\n}>();\n\nconst hasAlias = computed(() => !!props.alias?.en || !!props.alias?.ja || !!slots.alias);\nconst wide = computed(() => !!props.unlock || !!slots.aside);\nconst hasStats = computed(() => props.cost !== undefined || props.init !== undefined || props.duration !== undefined);\nconst durationText = computed(() => (typeof props.duration === \"number\" ? `${props.duration}s` : props.duration));\n</script>\n\n<template>\n <div :class=\"['ak-skill', { 'ak-skill--wide': wide, 'is-selected': selected }]\">\n <div :class=\"['ak-skill__icon', `ak-skill__icon--${spType}`, { 'is-locked': locked }]\">\n <img v-if=\"icon\" :src=\"icon\" alt=\"\" />\n </div>\n <div>\n <div class=\"ak-skill__head\">\n <component :is=\"`h${headingLevel}`\" class=\"ak-skill__name\">{{ name }}</component>\n <span v-if=\"hasAlias\" class=\"ak-skill__alias\">\n <slot name=\"alias\">\n <span v-if=\"alias?.en\" class=\"ak-en\" lang=\"en\">{{ alias.en }}</span>\n <span v-if=\"alias?.ja\" lang=\"ja\">{{ alias.ja }}</span>\n </slot>\n </span>\n <AkSp :sp-type=\"spType\" />\n <AkSpTrigger v-if=\"trigger\" :auto=\"trigger === 'auto'\" />\n <slot name=\"header-extra\" />\n </div>\n <div v-if=\"hasStats\" class=\"ak-skill__stats\">\n <span v-if=\"cost !== undefined\"><AkSpValue kind=\"cost\" :value=\"cost\" /></span>\n <span v-if=\"init !== undefined\"><AkSpValue kind=\"init\" :value=\"init\" /></span>\n <span v-if=\"duration !== undefined\">持续 <b>{{ durationText }}</b></span>\n </div>\n </div>\n <div v-if=\"wide\" class=\"ak-skill__aside\">\n <span v-if=\"unlock\" class=\"ak-skill__open\"><img v-if=\"unlockIcon\" :src=\"unlockIcon\" alt=\"\" />{{ unlock }}</span>\n <slot name=\"aside\" />\n </div>\n <div v-if=\"$slots.default\" class=\"ak-skill__desc\"><slot /></div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nimport AkSp from \"../Sp/AkSp.vue\";\nimport AkSpTrigger from \"../Sp/AkSpTrigger.vue\";\nimport AkSpValue from \"../Sp/AkSpValue.vue\";\nimport type { SpType } from \"../Sp/sp\";\n\nconst props = withDefaults(\n defineProps<{\n /** 技能名 */\n name: string;\n /** 别名,跟在技能名后的灰色小字(干员页全等级表的表头):en 英文名(Bender 大写)· ja 日文名;要放别的内容用 #alias 插槽 */\n alias?: { en?: string; ja?: string };\n /** 技能图标地址(游戏 skill_icon,64px 见方) */\n icon?: string;\n /** 技力回复方式:决定图标描边 + 底条色与 SP 标签;auto 自动回复 · attack 攻击回复 · hit 受击回复 · passive 被动 */\n spType?: SpType;\n /** 触发方式:manual 手动触发 · auto 自动触发;不写不显示(被动技能) */\n trigger?: \"manual\" | \"auto\";\n /** 技力消耗;不写不显示 */\n cost?: number | string;\n /** 初始技力;不写不显示 */\n init?: number | string;\n /** 持续时间:数字按秒写成「25s」,字符串原样(「—」);不写不显示 */\n duration?: number | string;\n /** 开放条件(「技能2 · 精英一开放」),显示在右侧槽 */\n unlock?: string;\n /** 开放条件前的精英化图标地址 */\n unlockIcon?: string;\n /** 选中(蓝框 + 左上角标,游戏内 selected_back) */\n selected?: boolean;\n /** 未解锁:图标灰化 + 锁 */\n locked?: boolean;\n /** 技能名的标题级别(干员页正文里是 3,列表 / 侧栏里一般是 4) */\n headingLevel?: 2 | 3 | 4 | 5 | 6;\n }>(),\n {\n alias: undefined,\n icon: undefined,\n spType: \"auto\",\n trigger: undefined,\n cost: undefined,\n init: undefined,\n duration: undefined,\n unlock: undefined,\n unlockIcon: undefined,\n headingLevel: 4,\n },\n);\n\nconst slots = defineSlots<{\n /** 技能描述(游戏原始标记可以套 AkRichText) */\n default?: () => unknown;\n /** 技能名后的别名(代替 alias),放进 .ak-skill__alias */\n alias?: () => unknown;\n /** 名称行末尾的附加内容(「未解锁」标签等) */\n \"header-extra\"?: () => unknown;\n /** 右侧槽(开放条件之后):技能范围等;写了就是三栏的宽卡(.ak-skill--wide) */\n aside?: () => unknown;\n}>();\n\nconst hasAlias = computed(() => !!props.alias?.en || !!props.alias?.ja || !!slots.alias);\nconst wide = computed(() => !!props.unlock || !!slots.aside);\nconst hasStats = computed(() => props.cost !== undefined || props.init !== undefined || props.duration !== undefined);\nconst durationText = computed(() => (typeof props.duration === \"number\" ? `${props.duration}s` : props.duration));\n</script>\n\n<template>\n <div :class=\"['ak-skill', { 'ak-skill--wide': wide, 'is-selected': selected }]\">\n <div :class=\"['ak-skill__icon', `ak-skill__icon--${spType}`, { 'is-locked': locked }]\">\n <img v-if=\"icon\" :src=\"icon\" alt=\"\" />\n </div>\n <div>\n <div class=\"ak-skill__head\">\n <component :is=\"`h${headingLevel}`\" class=\"ak-skill__name\">{{ name }}</component>\n <span v-if=\"hasAlias\" class=\"ak-skill__alias\">\n <slot name=\"alias\">\n <span v-if=\"alias?.en\" class=\"ak-en\" lang=\"en\">{{ alias.en }}</span>\n <span v-if=\"alias?.ja\" lang=\"ja\">{{ alias.ja }}</span>\n </slot>\n </span>\n <AkSp :sp-type=\"spType\" />\n <AkSpTrigger v-if=\"trigger\" :auto=\"trigger === 'auto'\" />\n <slot name=\"header-extra\" />\n </div>\n <div v-if=\"hasStats\" class=\"ak-skill__stats\">\n <span v-if=\"cost !== undefined\"><AkSpValue kind=\"cost\" :value=\"cost\" /></span>\n <span v-if=\"init !== undefined\"><AkSpValue kind=\"init\" :value=\"init\" /></span>\n <span v-if=\"duration !== undefined\">持续 <b>{{ durationText }}</b></span>\n </div>\n </div>\n <div v-if=\"wide\" class=\"ak-skill__aside\">\n <span v-if=\"unlock\" class=\"ak-skill__open\"><img v-if=\"unlockIcon\" :src=\"unlockIcon\" alt=\"\" />{{ unlock }}</span>\n <slot name=\"aside\" />\n </div>\n <div v-if=\"$slots.default\" class=\"ak-skill__desc\"><slot /></div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * (内部)技能等级的写法,等级选择器 / 全等级表 / 参数矩阵共用:1–7 是数字,8–10 是专精 Ⅰ–Ⅲ。\n * 专精画游戏图标(specialized_tiny_N,由调用方给地址);numeral 时图标后再跟罗马数字(表格里);没给图标时写 M1–M3。\n */\ndefineProps<{\n /** 1–10(8–10 = 专精 Ⅰ–Ⅲ) */\n level: number;\n /** 专精 Ⅰ–Ⅲ 的图标地址 */\n icons?: readonly string[];\n /** 图标后跟罗马数字 */\n numeral?: boolean;\n}>();\n\nconst NUMERALS = [\"Ⅰ\", \"Ⅱ\", \"Ⅲ\"];\n</script>\n\n<template>\n <template v-if=\"level <= 7\">{{ level }}</template>\n <template v-else-if=\"icons?.[level - 8]\">\n <img :src=\"icons[level - 8]\" :alt=\"`专精${level - 7}`\" /><span v-if=\"numeral\" aria-hidden=\"true\">{{ NUMERALS[level - 8] }}</span>\n </template>\n <template v-else><span aria-hidden=\"true\">M{{ level - 7 }}</span><span class=\"ak-sr-only\">专精{{ level - 7 }}</span></template>\n</template>\n","<script setup lang=\"ts\">\n/**\n * (内部)技能等级的写法,等级选择器 / 全等级表 / 参数矩阵共用:1–7 是数字,8–10 是专精 Ⅰ–Ⅲ。\n * 专精画游戏图标(specialized_tiny_N,由调用方给地址);numeral 时图标后再跟罗马数字(表格里);没给图标时写 M1–M3。\n */\ndefineProps<{\n /** 1–10(8–10 = 专精 Ⅰ–Ⅲ) */\n level: number;\n /** 专精 Ⅰ–Ⅲ 的图标地址 */\n icons?: readonly string[];\n /** 图标后跟罗马数字 */\n numeral?: boolean;\n}>();\n\nconst NUMERALS = [\"Ⅰ\", \"Ⅱ\", \"Ⅲ\"];\n</script>\n\n<template>\n <template v-if=\"level <= 7\">{{ level }}</template>\n <template v-else-if=\"icons?.[level - 8]\">\n <img :src=\"icons[level - 8]\" :alt=\"`专精${level - 7}`\" /><span v-if=\"numeral\" aria-hidden=\"true\">{{ NUMERALS[level - 8] }}</span>\n </template>\n <template v-else><span aria-hidden=\"true\">M{{ level - 7 }}</span><span class=\"ak-sr-only\">专精{{ level - 7 }}</span></template>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, nextTick } from \"vue\";\n\nimport LevelLabel from \"../Skill/LevelLabel.vue\";\n\nconst props = withDefaults(\n defineProps<{\n /** 最高等级:7 = 只有 1–7(三星及以下 / 未精二),10 = 再加专精 Ⅰ–Ⅲ */\n max?: number;\n /** 专精 Ⅰ–Ⅲ 的图标地址(游戏 specialized_tiny_1–3);不给时写 M1–M3 */\n masteryIcons?: readonly string[];\n /** 读屏用的组名 */\n label?: string;\n /** 整组禁用 */\n disabled?: boolean;\n }>(),\n { max: 10, masteryIcons: undefined, label: \"技能等级\" },\n);\n\n/** 当前等级 1–10(8–10 = 专精 Ⅰ–Ⅲ);不绑定时没有选中项 */\nconst model = defineModel<number>();\n\nconst levels = computed(() => Array.from({ length: props.max }, (_, i) => i + 1));\n/** roving tabindex:Tab 只停在选中项上(没选中时停在第一项) */\nconst tabStop = computed(() => (model.value && model.value <= props.max ? model.value : 1));\n\n/** 类名;普通等级未选中时不输出 class 属性(同 CSS 实现里的 <button>1</button>) */\nconst btnClass = (lv: number) => [lv === model.value && \"is-active\", lv > 7 && \"is-mastery\"].filter(Boolean).join(\" \") || undefined;\n\n/** 方向键 / Home / End 移到上一级 / 下一级并选中(WAI-ARIA Radio Group) */\nfunction onKey(e: KeyboardEvent) {\n const n = props.max;\n const i = tabStop.value;\n const to =\n e.key === \"ArrowRight\" || e.key === \"ArrowDown\" ? (i % n) + 1\n : e.key === \"ArrowLeft\" || e.key === \"ArrowUp\" ? ((i - 2 + n) % n) + 1\n : e.key === \"Home\" ? 1\n : e.key === \"End\" ? n\n : undefined;\n if (!to) return;\n e.preventDefault();\n model.value = to;\n const group = e.currentTarget as HTMLElement;\n nextTick(() => (group.children[to - 1] as HTMLElement | undefined)?.focus());\n}\n</script>\n\n<template>\n <!-- data-no-toggle:皮肤脚本会替模板输出的 .ak-skill-levels 翻 is-active 并发 akds:select,这里的选中只看 v-model -->\n <div class=\"ak-skill-levels\" role=\"radiogroup\" :aria-label=\"label\" :aria-disabled=\"disabled || undefined\" data-no-toggle @keydown=\"onKey\">\n <button\n v-for=\"lv in levels\"\n :key=\"lv\"\n type=\"button\"\n role=\"radio\"\n :class=\"btnClass(lv)\"\n :aria-checked=\"lv === model\"\n :tabindex=\"lv === tabStop ? 0 : -1\"\n :disabled=\"disabled\"\n @click=\"model = lv\"\n >\n <LevelLabel :level=\"lv\" :icons=\"masteryIcons\" />\n </button>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, nextTick } from \"vue\";\n\nimport LevelLabel from \"../Skill/LevelLabel.vue\";\n\nconst props = withDefaults(\n defineProps<{\n /** 最高等级:7 = 只有 1–7(三星及以下 / 未精二),10 = 再加专精 Ⅰ–Ⅲ */\n max?: number;\n /** 专精 Ⅰ–Ⅲ 的图标地址(游戏 specialized_tiny_1–3);不给时写 M1–M3 */\n masteryIcons?: readonly string[];\n /** 读屏用的组名 */\n label?: string;\n /** 整组禁用 */\n disabled?: boolean;\n }>(),\n { max: 10, masteryIcons: undefined, label: \"技能等级\" },\n);\n\n/** 当前等级 1–10(8–10 = 专精 Ⅰ–Ⅲ);不绑定时没有选中项 */\nconst model = defineModel<number>();\n\nconst levels = computed(() => Array.from({ length: props.max }, (_, i) => i + 1));\n/** roving tabindex:Tab 只停在选中项上(没选中时停在第一项) */\nconst tabStop = computed(() => (model.value && model.value <= props.max ? model.value : 1));\n\n/** 类名;普通等级未选中时不输出 class 属性(同 CSS 实现里的 <button>1</button>) */\nconst btnClass = (lv: number) => [lv === model.value && \"is-active\", lv > 7 && \"is-mastery\"].filter(Boolean).join(\" \") || undefined;\n\n/** 方向键 / Home / End 移到上一级 / 下一级并选中(WAI-ARIA Radio Group) */\nfunction onKey(e: KeyboardEvent) {\n const n = props.max;\n const i = tabStop.value;\n const to =\n e.key === \"ArrowRight\" || e.key === \"ArrowDown\" ? (i % n) + 1\n : e.key === \"ArrowLeft\" || e.key === \"ArrowUp\" ? ((i - 2 + n) % n) + 1\n : e.key === \"Home\" ? 1\n : e.key === \"End\" ? n\n : undefined;\n if (!to) return;\n e.preventDefault();\n model.value = to;\n const group = e.currentTarget as HTMLElement;\n nextTick(() => (group.children[to - 1] as HTMLElement | undefined)?.focus());\n}\n</script>\n\n<template>\n <!-- data-no-toggle:皮肤脚本会替模板输出的 .ak-skill-levels 翻 is-active 并发 akds:select,这里的选中只看 v-model -->\n <div class=\"ak-skill-levels\" role=\"radiogroup\" :aria-label=\"label\" :aria-disabled=\"disabled || undefined\" data-no-toggle @keydown=\"onKey\">\n <button\n v-for=\"lv in levels\"\n :key=\"lv\"\n type=\"button\"\n role=\"radio\"\n :class=\"btnClass(lv)\"\n :aria-checked=\"lv === model\"\n :tabindex=\"lv === tabStop ? 0 : -1\"\n :disabled=\"disabled\"\n @click=\"model = lv\"\n >\n <LevelLabel :level=\"lv\" :icons=\"masteryIcons\" />\n </button>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport AkRichText from \"../RichText/AkRichText.vue\";\nimport LevelLabel from \"../Skill/LevelLabel.vue\";\nimport AkSpValue from \"../Sp/AkSpValue.vue\";\n\n/** 一个技能等级(第 i 项 = 等级 i+1,第 8–10 项 = 专精 Ⅰ–Ⅲ) */\nexport interface SkillSheetLevel {\n /** 描述:游戏原始标记(<@ba.vup>…</>、{atk_scale:0%}),由 AkRichText 渲染 */\n description: string;\n /** 描述里占位符的取值(这一级的 blackboard) */\n vars?: Record<string, number | string>;\n /** 初始技力 */\n init?: number | string;\n /** 技力消耗 */\n cost?: number | string;\n /** 持续时间(秒);没有就空着(表里显示「—」) */\n duration?: number | string;\n}\n\nconst props = withDefaults(\n defineProps<{\n /** 各级数据:1–7 级,之后是专精 Ⅰ–Ⅲ(三星及以下只有 7 项) */\n levels: SkillSheetLevel[];\n /** 高亮一行(当前等级,1–10);常与 AkSkillLevels 的 v-model 绑同一个值 */\n highlight?: number;\n /** 专精 Ⅰ–Ⅲ 的图标地址(游戏 specialized_tiny_1–3);不给时写 M1–M3 */\n masteryIcons?: readonly string[];\n /** 术语说明(termDescriptionDict),给描述里 <$ba.xxx> 的悬停提示 */\n terms?: Record<string, string>;\n /** 表格的可访问名(如「鞘击 · 各等级数据」) */\n label?: string;\n }>(),\n { highlight: undefined, masteryIcons: undefined, terms: undefined, label: undefined },\n);\n\ndefineSlots<{\n /** 表头卡:一般放 <AkSkill>(名称 / SP 类型 / 开放条件 / 范围),不写 cost / init,名称行居中对齐图标 */\n header?: () => unknown;\n /** 表下的注释(.ak-skill-sheet__note,每条一个 <p>:「※不可对空」) */\n footer?: () => unknown;\n /** 自己画某一级的描述(代替 AkRichText):{ row, level } */\n description?: (p: { row: SkillSheetLevel; level: number }) => unknown;\n}>();\n\n/** 行的类名:专精行 .is-mastery,高亮行 .is-hl;都没有时不输出 class */\nconst rowClass = (level: number) => [level > 7 && \"is-mastery\", level === props.highlight && \"is-hl\"].filter(Boolean).join(\" \") || undefined;\n/** 数值格:没有值时整格留空(CSS 的 :empty 画「—」),不能留空文字结点 */\nconst num = (v: number | string | undefined) => (v === undefined || v === \"\" ? \"\" : String(v));\n</script>\n\n<template>\n <div class=\"ak-skill-sheet\">\n <slot name=\"header\" />\n <table class=\"ak-skill-table\" :aria-label=\"label\">\n <thead>\n <tr>\n <th class=\"lv\" scope=\"col\">等级</th>\n <th class=\"desc\" scope=\"col\">描述</th>\n <th class=\"num\" scope=\"col\"><AkSpValue kind=\"init\">初始</AkSpValue></th>\n <th class=\"num\" scope=\"col\"><AkSpValue kind=\"cost\">消耗</AkSpValue></th>\n <th class=\"num\" scope=\"col\"><AkSpValue kind=\"duration\">持续</AkSpValue></th>\n </tr>\n </thead>\n <tbody>\n <tr v-for=\"(row, i) in levels\" :key=\"i\" :class=\"rowClass(i + 1)\" :aria-current=\"i + 1 === highlight || undefined\">\n <td class=\"lv\"><LevelLabel :level=\"i + 1\" :icons=\"masteryIcons\" numeral /></td>\n <td class=\"desc\">\n <slot name=\"description\" :row=\"row\" :level=\"i + 1\">\n <AkRichText :text=\"row.description\" :vars=\"row.vars\" :terms=\"terms\" />\n </slot>\n </td>\n <td class=\"num\" v-text=\"num(row.init)\" />\n <td class=\"num\" v-text=\"num(row.cost)\" />\n <td class=\"num\" v-text=\"num(row.duration)\" />\n </tr>\n </tbody>\n </table>\n <div v-if=\"$slots.footer\" class=\"ak-skill-sheet__note\"><slot name=\"footer\" /></div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport AkRichText from \"../RichText/AkRichText.vue\";\nimport LevelLabel from \"../Skill/LevelLabel.vue\";\nimport AkSpValue from \"../Sp/AkSpValue.vue\";\n\n/** 一个技能等级(第 i 项 = 等级 i+1,第 8–10 项 = 专精 Ⅰ–Ⅲ) */\nexport interface SkillSheetLevel {\n /** 描述:游戏原始标记(<@ba.vup>…</>、{atk_scale:0%}),由 AkRichText 渲染 */\n description: string;\n /** 描述里占位符的取值(这一级的 blackboard) */\n vars?: Record<string, number | string>;\n /** 初始技力 */\n init?: number | string;\n /** 技力消耗 */\n cost?: number | string;\n /** 持续时间(秒);没有就空着(表里显示「—」) */\n duration?: number | string;\n}\n\nconst props = withDefaults(\n defineProps<{\n /** 各级数据:1–7 级,之后是专精 Ⅰ–Ⅲ(三星及以下只有 7 项) */\n levels: SkillSheetLevel[];\n /** 高亮一行(当前等级,1–10);常与 AkSkillLevels 的 v-model 绑同一个值 */\n highlight?: number;\n /** 专精 Ⅰ–Ⅲ 的图标地址(游戏 specialized_tiny_1–3);不给时写 M1–M3 */\n masteryIcons?: readonly string[];\n /** 术语说明(termDescriptionDict),给描述里 <$ba.xxx> 的悬停提示 */\n terms?: Record<string, string>;\n /** 表格的可访问名(如「鞘击 · 各等级数据」) */\n label?: string;\n }>(),\n { highlight: undefined, masteryIcons: undefined, terms: undefined, label: undefined },\n);\n\ndefineSlots<{\n /** 表头卡:一般放 <AkSkill>(名称 / SP 类型 / 开放条件 / 范围),不写 cost / init,名称行居中对齐图标 */\n header?: () => unknown;\n /** 表下的注释(.ak-skill-sheet__note,每条一个 <p>:「※不可对空」) */\n footer?: () => unknown;\n /** 自己画某一级的描述(代替 AkRichText):{ row, level } */\n description?: (p: { row: SkillSheetLevel; level: number }) => unknown;\n}>();\n\n/** 行的类名:专精行 .is-mastery,高亮行 .is-hl;都没有时不输出 class */\nconst rowClass = (level: number) => [level > 7 && \"is-mastery\", level === props.highlight && \"is-hl\"].filter(Boolean).join(\" \") || undefined;\n/** 数值格:没有值时整格留空(CSS 的 :empty 画「—」),不能留空文字结点 */\nconst num = (v: number | string | undefined) => (v === undefined || v === \"\" ? \"\" : String(v));\n</script>\n\n<template>\n <div class=\"ak-skill-sheet\">\n <slot name=\"header\" />\n <table class=\"ak-skill-table\" :aria-label=\"label\">\n <thead>\n <tr>\n <th class=\"lv\" scope=\"col\">等级</th>\n <th class=\"desc\" scope=\"col\">描述</th>\n <th class=\"num\" scope=\"col\"><AkSpValue kind=\"init\">初始</AkSpValue></th>\n <th class=\"num\" scope=\"col\"><AkSpValue kind=\"cost\">消耗</AkSpValue></th>\n <th class=\"num\" scope=\"col\"><AkSpValue kind=\"duration\">持续</AkSpValue></th>\n </tr>\n </thead>\n <tbody>\n <tr v-for=\"(row, i) in levels\" :key=\"i\" :class=\"rowClass(i + 1)\" :aria-current=\"i + 1 === highlight || undefined\">\n <td class=\"lv\"><LevelLabel :level=\"i + 1\" :icons=\"masteryIcons\" numeral /></td>\n <td class=\"desc\">\n <slot name=\"description\" :row=\"row\" :level=\"i + 1\">\n <AkRichText :text=\"row.description\" :vars=\"row.vars\" :terms=\"terms\" />\n </slot>\n </td>\n <td class=\"num\" v-text=\"num(row.init)\" />\n <td class=\"num\" v-text=\"num(row.cost)\" />\n <td class=\"num\" v-text=\"num(row.duration)\" />\n </tr>\n </tbody>\n </table>\n <div v-if=\"$slots.footer\" class=\"ak-skill-sheet__note\"><slot name=\"footer\" /></div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, nextTick, ref } from \"vue\";\n\nimport AkRichText from \"../RichText/AkRichText.vue\";\nimport LevelLabel from \"../Skill/LevelLabel.vue\";\nimport AkSpValue from \"../Sp/AkSpValue.vue\";\nimport type { SpValueKind } from \"../Sp/sp\";\n\n/** 矩阵的一行:一个参数在各级的值 */\nexport interface SkillMatrixRow {\n /** 描述模板里的占位符名({key});写了这一行就对应描述里的一个变量位 */\n key?: string;\n /** 参数名(「伤害倍率」「晕眩(秒)」);sp 行是芯片里的字 */\n label: string;\n /** 用 SP 芯片当参数名:init 初始 · cost 消耗 · duration 持续 */\n sp?: SpValueKind;\n /** 各级的值(已经写好的字,「200%」):第 i 项 = 等级 i+1,第 8–10 项 = 专精 Ⅰ–Ⅲ */\n values: (number | string)[];\n}\n\nconst props = withDefaults(\n defineProps<{\n /** 参数行 */\n rows: SkillMatrixRow[];\n /** 描述模板(游戏原始标记):只写一遍,{key} 变量位画成 .ak-var——平时是区间(200%→320%),悬停 / 选中某一列时换成该级的值 */\n description?: string;\n /** 专精 Ⅰ–Ⅲ 的图标地址(游戏 specialized_tiny_1–3);不给时写 M1–M3 */\n masteryIcons?: readonly string[];\n /** 术语说明(termDescriptionDict),给描述里 <$ba.xxx> 的悬停提示 */\n terms?: Record<string, string>;\n /** 表格的可访问名(如「鞘击 · 各等级参数」) */\n label?: string;\n }>(),\n { description: undefined, masteryIcons: undefined, terms: undefined, label: undefined },\n);\n\n/** 钉住的一列(等级 1–10,没有是 undefined):点列里任一格 / 列头按钮钉住、再点取消;可以和 AkSkillLevels 绑同一个值 */\nconst model = defineModel<number>();\n\ndefineSlots<{\n /** 表头卡:一般放 <AkSkill>(名称 / SP 类型 / 开放条件 / 范围) */\n header?: () => unknown;\n /** 表下的注释(.ak-skill-sheet__note,每条一个 <p>) */\n footer?: () => unknown;\n /** 自己画描述(代替 description):level = 正在看的等级(没有是 undefined),value(key) = 该变量此刻该显示的字 */\n description?: (p: { level: number | undefined; value: (key: string) => string }) => unknown;\n}>();\n\n/** 列数 = 最长那行的值个数 */\nconst count = computed(() => Math.max(0, ...props.rows.map(r => r.values.length)));\nconst levels = computed(() => Array.from({ length: count.value }, (_, i) => i + 1));\n\n/** 悬停 / 键盘聚焦中的列;离开就回到钉住的列 */\nconst hovered = ref<number>();\nconst shown = computed(() => hovered.value ?? model.value);\n\n/** 变量位此刻的字:看某一列时是该级的值,否则是「首级→末级」区间(没变化就一个值) */\nfunction valueOf(key: string): string {\n const row = props.rows.find(r => r.key?.toLowerCase() === key.toLowerCase());\n if (!row) return `{${key}}`;\n if (shown.value) return String(row.values[shown.value - 1] ?? \"\");\n const first = String(row.values[0] ?? \"\");\n const last = String(row.values.at(-1) ?? \"\");\n return first === last ? first : `${first}→${last}`;\n}\n\n/** 格子的类名:7 与专精 Ⅰ 之间的分隔 .m-start、列头专精色 .is-mastery、当前列 .is-hl、较上一级有变化 .is-up */\nfunction cellClass(level: number, extra?: Record<string, boolean>) {\n const c = [level === 8 && \"m-start\", level === shown.value && \"is-hl\", ...Object.entries(extra ?? {}).map(([k, v]) => v && k)];\n return c.filter(Boolean).join(\" \") || undefined;\n}\nconst isUp = (row: SkillMatrixRow, i: number) => i === 0 || String(row.values[i]) !== String(row.values[i - 1]);\n\n/** 鼠标:悬停某格 → 整列高亮;点某格 → 钉住 / 取消(第 0 列是参数名,不算) */\nfunction columnOf(e: Event) {\n const cell = (e.target as Element).closest(\"th, td\") as HTMLTableCellElement | null;\n return cell && cell.cellIndex > 0 && cell.cellIndex <= count.value ? cell.cellIndex : null;\n}\nfunction onOver(e: MouseEvent) {\n const col = columnOf(e);\n if (col) hovered.value = col;\n}\nfunction onClick(e: MouseEvent) {\n const col = columnOf(e);\n if (col) model.value = model.value === col ? undefined : col;\n}\n\n/** 列头按钮:roving tabindex(Tab 只停一个:上次聚焦的列,否则钉住的列,否则第 1 列),←/→/Home/End 在列间移动;聚焦即预览该列,Enter / Space 钉住 */\nconst focused = ref<number>();\nconst tabStop = computed(() => focused.value ?? model.value ?? 1);\nfunction onFocus(level: number) {\n focused.value = level;\n hovered.value = level;\n}\nfunction onKey(e: KeyboardEvent, level: number) {\n const n = count.value;\n const to =\n e.key === \"ArrowRight\" ? (level % n) + 1\n : e.key === \"ArrowLeft\" ? ((level - 2 + n) % n) + 1\n : e.key === \"Home\" ? 1\n : e.key === \"End\" ? n\n : undefined;\n if (!to) return;\n e.preventDefault();\n const row = (e.currentTarget as HTMLElement).closest(\"tr\")!;\n nextTick(() => row.cells[to]?.querySelector(\"button\")?.focus());\n}\n</script>\n\n<template>\n <div class=\"ak-skill-sheet\">\n <slot name=\"header\" />\n <div v-if=\"description !== undefined || $slots.description\" class=\"ak-skill-sheet__tpl\">\n <slot name=\"description\" :level=\"shown\" :value=\"valueOf\">\n <AkRichText :text=\"description\" :terms=\"terms\">\n <template #var=\"{ key }\"><span class=\"ak-var\" :data-var=\"key\">{{ valueOf(key) }}</span></template>\n </AkRichText>\n </slot>\n </div>\n <!-- data-no-toggle:皮肤脚本会给页面里的 .ak-skill-matrix 绑一套列高亮 / .ak-var 换值(wikipage.content 时也会扫),这里自己管 -->\n <table class=\"ak-skill-matrix\" :aria-label=\"label\" data-no-toggle @mouseover=\"onOver\" @mouseleave=\"hovered = undefined\" @click=\"onClick\">\n <colgroup><col class=\"label\" /></colgroup>\n <thead>\n <tr>\n <th scope=\"col\">等级</th>\n <th v-for=\"lv in levels\" :key=\"lv\" scope=\"col\" :class=\"cellClass(lv, { 'is-mastery': lv > 7 })\">\n <button\n type=\"button\"\n :aria-pressed=\"model === lv\"\n :tabindex=\"lv === tabStop ? 0 : -1\"\n @focus=\"onFocus(lv)\"\n @blur=\"hovered = undefined\"\n @keydown=\"onKey($event, lv)\"\n >\n <LevelLabel :level=\"lv\" :icons=\"masteryIcons\" numeral />\n </button>\n </th>\n </tr>\n </thead>\n <tbody>\n <tr v-for=\"(row, r) in rows\" :key=\"row.key ?? r\" :data-var=\"row.key\">\n <th scope=\"row\">\n <AkSpValue v-if=\"row.sp\" :kind=\"row.sp\">{{ row.label }}</AkSpValue>\n <template v-else>{{ row.label }}</template>\n </th>\n <td v-for=\"lv in levels\" :key=\"lv\" :class=\"cellClass(lv, { 'is-up': isUp(row, lv - 1) })\">{{ row.values[lv - 1] }}</td>\n </tr>\n </tbody>\n </table>\n <div v-if=\"$slots.footer\" class=\"ak-skill-sheet__note\"><slot name=\"footer\" /></div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, nextTick, ref } from \"vue\";\n\nimport AkRichText from \"../RichText/AkRichText.vue\";\nimport LevelLabel from \"../Skill/LevelLabel.vue\";\nimport AkSpValue from \"../Sp/AkSpValue.vue\";\nimport type { SpValueKind } from \"../Sp/sp\";\n\n/** 矩阵的一行:一个参数在各级的值 */\nexport interface SkillMatrixRow {\n /** 描述模板里的占位符名({key});写了这一行就对应描述里的一个变量位 */\n key?: string;\n /** 参数名(「伤害倍率」「晕眩(秒)」);sp 行是芯片里的字 */\n label: string;\n /** 用 SP 芯片当参数名:init 初始 · cost 消耗 · duration 持续 */\n sp?: SpValueKind;\n /** 各级的值(已经写好的字,「200%」):第 i 项 = 等级 i+1,第 8–10 项 = 专精 Ⅰ–Ⅲ */\n values: (number | string)[];\n}\n\nconst props = withDefaults(\n defineProps<{\n /** 参数行 */\n rows: SkillMatrixRow[];\n /** 描述模板(游戏原始标记):只写一遍,{key} 变量位画成 .ak-var——平时是区间(200%→320%),悬停 / 选中某一列时换成该级的值 */\n description?: string;\n /** 专精 Ⅰ–Ⅲ 的图标地址(游戏 specialized_tiny_1–3);不给时写 M1–M3 */\n masteryIcons?: readonly string[];\n /** 术语说明(termDescriptionDict),给描述里 <$ba.xxx> 的悬停提示 */\n terms?: Record<string, string>;\n /** 表格的可访问名(如「鞘击 · 各等级参数」) */\n label?: string;\n }>(),\n { description: undefined, masteryIcons: undefined, terms: undefined, label: undefined },\n);\n\n/** 钉住的一列(等级 1–10,没有是 undefined):点列里任一格 / 列头按钮钉住、再点取消;可以和 AkSkillLevels 绑同一个值 */\nconst model = defineModel<number>();\n\ndefineSlots<{\n /** 表头卡:一般放 <AkSkill>(名称 / SP 类型 / 开放条件 / 范围) */\n header?: () => unknown;\n /** 表下的注释(.ak-skill-sheet__note,每条一个 <p>) */\n footer?: () => unknown;\n /** 自己画描述(代替 description):level = 正在看的等级(没有是 undefined),value(key) = 该变量此刻该显示的字 */\n description?: (p: { level: number | undefined; value: (key: string) => string }) => unknown;\n}>();\n\n/** 列数 = 最长那行的值个数 */\nconst count = computed(() => Math.max(0, ...props.rows.map(r => r.values.length)));\nconst levels = computed(() => Array.from({ length: count.value }, (_, i) => i + 1));\n\n/** 悬停 / 键盘聚焦中的列;离开就回到钉住的列 */\nconst hovered = ref<number>();\nconst shown = computed(() => hovered.value ?? model.value);\n\n/** 变量位此刻的字:看某一列时是该级的值,否则是「首级→末级」区间(没变化就一个值) */\nfunction valueOf(key: string): string {\n const row = props.rows.find(r => r.key?.toLowerCase() === key.toLowerCase());\n if (!row) return `{${key}}`;\n if (shown.value) return String(row.values[shown.value - 1] ?? \"\");\n const first = String(row.values[0] ?? \"\");\n const last = String(row.values.at(-1) ?? \"\");\n return first === last ? first : `${first}→${last}`;\n}\n\n/** 格子的类名:7 与专精 Ⅰ 之间的分隔 .m-start、列头专精色 .is-mastery、当前列 .is-hl、较上一级有变化 .is-up */\nfunction cellClass(level: number, extra?: Record<string, boolean>) {\n const c = [level === 8 && \"m-start\", level === shown.value && \"is-hl\", ...Object.entries(extra ?? {}).map(([k, v]) => v && k)];\n return c.filter(Boolean).join(\" \") || undefined;\n}\nconst isUp = (row: SkillMatrixRow, i: number) => i === 0 || String(row.values[i]) !== String(row.values[i - 1]);\n\n/** 鼠标:悬停某格 → 整列高亮;点某格 → 钉住 / 取消(第 0 列是参数名,不算) */\nfunction columnOf(e: Event) {\n const cell = (e.target as Element).closest(\"th, td\") as HTMLTableCellElement | null;\n return cell && cell.cellIndex > 0 && cell.cellIndex <= count.value ? cell.cellIndex : null;\n}\nfunction onOver(e: MouseEvent) {\n const col = columnOf(e);\n if (col) hovered.value = col;\n}\nfunction onClick(e: MouseEvent) {\n const col = columnOf(e);\n if (col) model.value = model.value === col ? undefined : col;\n}\n\n/** 列头按钮:roving tabindex(Tab 只停一个:上次聚焦的列,否则钉住的列,否则第 1 列),←/→/Home/End 在列间移动;聚焦即预览该列,Enter / Space 钉住 */\nconst focused = ref<number>();\nconst tabStop = computed(() => focused.value ?? model.value ?? 1);\nfunction onFocus(level: number) {\n focused.value = level;\n hovered.value = level;\n}\nfunction onKey(e: KeyboardEvent, level: number) {\n const n = count.value;\n const to =\n e.key === \"ArrowRight\" ? (level % n) + 1\n : e.key === \"ArrowLeft\" ? ((level - 2 + n) % n) + 1\n : e.key === \"Home\" ? 1\n : e.key === \"End\" ? n\n : undefined;\n if (!to) return;\n e.preventDefault();\n const row = (e.currentTarget as HTMLElement).closest(\"tr\")!;\n nextTick(() => row.cells[to]?.querySelector(\"button\")?.focus());\n}\n</script>\n\n<template>\n <div class=\"ak-skill-sheet\">\n <slot name=\"header\" />\n <div v-if=\"description !== undefined || $slots.description\" class=\"ak-skill-sheet__tpl\">\n <slot name=\"description\" :level=\"shown\" :value=\"valueOf\">\n <AkRichText :text=\"description\" :terms=\"terms\">\n <template #var=\"{ key }\"><span class=\"ak-var\" :data-var=\"key\">{{ valueOf(key) }}</span></template>\n </AkRichText>\n </slot>\n </div>\n <!-- data-no-toggle:皮肤脚本会给页面里的 .ak-skill-matrix 绑一套列高亮 / .ak-var 换值(wikipage.content 时也会扫),这里自己管 -->\n <table class=\"ak-skill-matrix\" :aria-label=\"label\" data-no-toggle @mouseover=\"onOver\" @mouseleave=\"hovered = undefined\" @click=\"onClick\">\n <colgroup><col class=\"label\" /></colgroup>\n <thead>\n <tr>\n <th scope=\"col\">等级</th>\n <th v-for=\"lv in levels\" :key=\"lv\" scope=\"col\" :class=\"cellClass(lv, { 'is-mastery': lv > 7 })\">\n <button\n type=\"button\"\n :aria-pressed=\"model === lv\"\n :tabindex=\"lv === tabStop ? 0 : -1\"\n @focus=\"onFocus(lv)\"\n @blur=\"hovered = undefined\"\n @keydown=\"onKey($event, lv)\"\n >\n <LevelLabel :level=\"lv\" :icons=\"masteryIcons\" numeral />\n </button>\n </th>\n </tr>\n </thead>\n <tbody>\n <tr v-for=\"(row, r) in rows\" :key=\"row.key ?? r\" :data-var=\"row.key\">\n <th scope=\"row\">\n <AkSpValue v-if=\"row.sp\" :kind=\"row.sp\">{{ row.label }}</AkSpValue>\n <template v-else>{{ row.label }}</template>\n </th>\n <td v-for=\"lv in levels\" :key=\"lv\" :class=\"cellClass(lv, { 'is-up': isUp(row, lv - 1) })\">{{ row.values[lv - 1] }}</td>\n </tr>\n </tbody>\n </table>\n <div v-if=\"$slots.footer\" class=\"ak-skill-sheet__note\"><slot name=\"footer\" /></div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nimport AkRichText from \"../RichText/AkRichText.vue\";\n\n/** 天赋表的一行:一个条件下的效果 */\nexport interface TalentRow {\n /** 天赋名;相邻几行同名时合并成一格(rowspan) */\n name: string;\n /** 条件(「精英二 · Y模组 2级」);要放精英化图标时用 #condition 插槽 */\n condition?: string;\n /** 描述:游戏原始标记(<@ba.vup>…</>),由 AkRichText 渲染 */\n description: string;\n /** 潜能加成后的描述(潜能开关打开时换成它;加成部分一般是 <@ba.talpu>(+1%)</>);不写就没有潜能版 */\n potential?: string;\n}\n\nconst props = withDefaults(\n defineProps<{\n /** 第一列的列头(「第一天赋」「第二天赋」) */\n title: string;\n /** 各条件下的效果 */\n rows: TalentRow[];\n /** 潜能开关上写的潜能等级(「潜能5」);有任一行写了 potential 才出现开关 */\n potentialRank?: number;\n /** 潜能开关上的潜能图标地址(游戏 potential_N) */\n potentialIcon?: string;\n /** 表头显示「算法」开关——描述里用 AkCalc 标了加成项进公式的方式时打开;打开后表尾有图例行 */\n calcToggle?: boolean;\n /** 术语说明(termDescriptionDict),给描述里 <$ba.xxx> 的悬停提示 */\n terms?: Record<string, string>;\n }>(),\n { potentialRank: undefined, potentialIcon: undefined, terms: undefined },\n);\n\n/** 潜能加成开关:打开时描述换成潜能版(表上 .is-pot) */\nconst potential = defineModel<boolean>({ default: false });\n/** 算法标记开关:打开时每个加成项前露出 AkCalc、表尾出图例(表上 .is-calc) */\nconst calc = defineModel<boolean>(\"calc\", { default: false });\n\ndefineSlots<{\n /** 自己画条件格(放精英化图标等):{ row, index } */\n condition?: (p: { row: TalentRow; index: number }) => unknown;\n /** 自己画描述(要标 AkCalc 时用):potential = 这是潜能版还是基础版(有潜能版的行调两次) */\n description?: (p: { row: TalentRow; index: number; potential: boolean }) => unknown;\n /** 图例行末尾的附加内容(「详见 属性基本公式」链接) */\n legend?: () => unknown;\n}>();\n\nconst hasPotential = computed(() => props.rows.some(r => r.potential !== undefined));\n\n/** 同名相邻行合并:每组第一行记组长,其余记 0(不画名字格) */\nconst spans = computed(() =>\n props.rows.map((r, i) => {\n if (i > 0 && props.rows[i - 1].name === r.name) return 0;\n let n = 1;\n while (props.rows[i + n]?.name === r.name) n++;\n return n;\n }),\n);\n\nconst CALC_LEGEND = [\n { kind: \"add\", text: \"直接加算\" },\n { kind: \"mul\", text: \"直接乘算\", note: \"(直接乘算之间为加法计算)\" },\n { kind: \"fadd\", text: \"最终加算\" },\n { kind: \"fmul\", text: \"最终乘算\" },\n];\n</script>\n\n<template>\n <table :class=\"['ak-talent-table', { 'is-pot': potential, 'is-calc': calc }]\">\n <thead>\n <tr>\n <th class=\"name\" scope=\"col\">{{ title }}</th>\n <th class=\"cond\" scope=\"col\">条件</th>\n <th class=\"desc\" scope=\"col\">\n 描述<label v-if=\"hasPotential\" class=\"ak-check ak-talent-table__toggle\">\n <input v-model=\"potential\" type=\"checkbox\" />\n <span v-if=\"potentialIcon\" class=\"ak-potential ak-potential--bare\"><img :src=\"potentialIcon\" alt=\"\" /></span>\n 潜能{{ potentialRank }}<span class=\"ak-sr-only\">加成</span>\n </label>\n <label v-if=\"calcToggle\" class=\"ak-check ak-talent-table__toggle\"><input v-model=\"calc\" type=\"checkbox\" />算法</label>\n </th>\n </tr>\n </thead>\n <tbody>\n <tr v-for=\"(row, i) in rows\" :key=\"i\">\n <td v-if=\"spans[i]\" class=\"name\" :rowspan=\"spans[i] > 1 ? spans[i] : undefined\">{{ row.name }}</td>\n <td class=\"cond\"><slot name=\"condition\" :row=\"row\" :index=\"i\">{{ row.condition }}</slot></td>\n <td class=\"desc\">\n <template v-if=\"row.potential !== undefined\">\n <span class=\"ak-talent-table__base\">\n <slot name=\"description\" :row=\"row\" :index=\"i\" :potential=\"false\">\n <AkRichText :text=\"row.description\" :terms=\"terms\" />\n </slot>\n </span>\n <span class=\"ak-talent-table__pot\">\n <slot name=\"description\" :row=\"row\" :index=\"i\" :potential=\"true\">\n <AkRichText :text=\"row.potential\" :terms=\"terms\" />\n </slot>\n </span>\n </template>\n <slot v-else name=\"description\" :row=\"row\" :index=\"i\" :potential=\"false\">\n <AkRichText :text=\"row.description\" :terms=\"terms\" />\n </slot>\n </td>\n </tr>\n </tbody>\n <tfoot v-if=\"calcToggle\">\n <tr class=\"ak-talent-table__legend\">\n <td colspan=\"3\">\n <span v-for=\"l in CALC_LEGEND\" :key=\"l.kind\">\n <i :class=\"['ak-calc', `ak-calc--${l.kind}`]\" aria-hidden=\"true\" />{{ l.text }}<small v-if=\"l.note\">{{ l.note }}</small>\n </span>\n <slot name=\"legend\" />\n </td>\n </tr>\n </tfoot>\n </table>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nimport AkRichText from \"../RichText/AkRichText.vue\";\n\n/** 天赋表的一行:一个条件下的效果 */\nexport interface TalentRow {\n /** 天赋名;相邻几行同名时合并成一格(rowspan) */\n name: string;\n /** 条件(「精英二 · Y模组 2级」);要放精英化图标时用 #condition 插槽 */\n condition?: string;\n /** 描述:游戏原始标记(<@ba.vup>…</>),由 AkRichText 渲染 */\n description: string;\n /** 潜能加成后的描述(潜能开关打开时换成它;加成部分一般是 <@ba.talpu>(+1%)</>);不写就没有潜能版 */\n potential?: string;\n}\n\nconst props = withDefaults(\n defineProps<{\n /** 第一列的列头(「第一天赋」「第二天赋」) */\n title: string;\n /** 各条件下的效果 */\n rows: TalentRow[];\n /** 潜能开关上写的潜能等级(「潜能5」);有任一行写了 potential 才出现开关 */\n potentialRank?: number;\n /** 潜能开关上的潜能图标地址(游戏 potential_N) */\n potentialIcon?: string;\n /** 表头显示「算法」开关——描述里用 AkCalc 标了加成项进公式的方式时打开;打开后表尾有图例行 */\n calcToggle?: boolean;\n /** 术语说明(termDescriptionDict),给描述里 <$ba.xxx> 的悬停提示 */\n terms?: Record<string, string>;\n }>(),\n { potentialRank: undefined, potentialIcon: undefined, terms: undefined },\n);\n\n/** 潜能加成开关:打开时描述换成潜能版(表上 .is-pot) */\nconst potential = defineModel<boolean>({ default: false });\n/** 算法标记开关:打开时每个加成项前露出 AkCalc、表尾出图例(表上 .is-calc) */\nconst calc = defineModel<boolean>(\"calc\", { default: false });\n\ndefineSlots<{\n /** 自己画条件格(放精英化图标等):{ row, index } */\n condition?: (p: { row: TalentRow; index: number }) => unknown;\n /** 自己画描述(要标 AkCalc 时用):potential = 这是潜能版还是基础版(有潜能版的行调两次) */\n description?: (p: { row: TalentRow; index: number; potential: boolean }) => unknown;\n /** 图例行末尾的附加内容(「详见 属性基本公式」链接) */\n legend?: () => unknown;\n}>();\n\nconst hasPotential = computed(() => props.rows.some(r => r.potential !== undefined));\n\n/** 同名相邻行合并:每组第一行记组长,其余记 0(不画名字格) */\nconst spans = computed(() =>\n props.rows.map((r, i) => {\n if (i > 0 && props.rows[i - 1].name === r.name) return 0;\n let n = 1;\n while (props.rows[i + n]?.name === r.name) n++;\n return n;\n }),\n);\n\nconst CALC_LEGEND = [\n { kind: \"add\", text: \"直接加算\" },\n { kind: \"mul\", text: \"直接乘算\", note: \"(直接乘算之间为加法计算)\" },\n { kind: \"fadd\", text: \"最终加算\" },\n { kind: \"fmul\", text: \"最终乘算\" },\n];\n</script>\n\n<template>\n <table :class=\"['ak-talent-table', { 'is-pot': potential, 'is-calc': calc }]\">\n <thead>\n <tr>\n <th class=\"name\" scope=\"col\">{{ title }}</th>\n <th class=\"cond\" scope=\"col\">条件</th>\n <th class=\"desc\" scope=\"col\">\n 描述<label v-if=\"hasPotential\" class=\"ak-check ak-talent-table__toggle\">\n <input v-model=\"potential\" type=\"checkbox\" />\n <span v-if=\"potentialIcon\" class=\"ak-potential ak-potential--bare\"><img :src=\"potentialIcon\" alt=\"\" /></span>\n 潜能{{ potentialRank }}<span class=\"ak-sr-only\">加成</span>\n </label>\n <label v-if=\"calcToggle\" class=\"ak-check ak-talent-table__toggle\"><input v-model=\"calc\" type=\"checkbox\" />算法</label>\n </th>\n </tr>\n </thead>\n <tbody>\n <tr v-for=\"(row, i) in rows\" :key=\"i\">\n <td v-if=\"spans[i]\" class=\"name\" :rowspan=\"spans[i] > 1 ? spans[i] : undefined\">{{ row.name }}</td>\n <td class=\"cond\"><slot name=\"condition\" :row=\"row\" :index=\"i\">{{ row.condition }}</slot></td>\n <td class=\"desc\">\n <template v-if=\"row.potential !== undefined\">\n <span class=\"ak-talent-table__base\">\n <slot name=\"description\" :row=\"row\" :index=\"i\" :potential=\"false\">\n <AkRichText :text=\"row.description\" :terms=\"terms\" />\n </slot>\n </span>\n <span class=\"ak-talent-table__pot\">\n <slot name=\"description\" :row=\"row\" :index=\"i\" :potential=\"true\">\n <AkRichText :text=\"row.potential\" :terms=\"terms\" />\n </slot>\n </span>\n </template>\n <slot v-else name=\"description\" :row=\"row\" :index=\"i\" :potential=\"false\">\n <AkRichText :text=\"row.description\" :terms=\"terms\" />\n </slot>\n </td>\n </tr>\n </tbody>\n <tfoot v-if=\"calcToggle\">\n <tr class=\"ak-talent-table__legend\">\n <td colspan=\"3\">\n <span v-for=\"l in CALC_LEGEND\" :key=\"l.kind\">\n <i :class=\"['ak-calc', `ak-calc--${l.kind}`]\" aria-hidden=\"true\" />{{ l.text }}<small v-if=\"l.note\">{{ l.note }}</small>\n </span>\n <slot name=\"legend\" />\n </td>\n </tr>\n </tfoot>\n </table>\n</template>\n","<script setup lang=\"ts\">\nexport type CalcKind = \"add\" | \"mul\" | \"fadd\" | \"fmul\";\n\ndefineProps<{\n /** 进公式的方式:add 直接加算(绿 +)· mul 直接乘算(蓝 +)· fadd 最终加算(橙 +)· fmul 最终乘算(橙 ×) */\n kind: CalcKind;\n}>();\n\n/* 算法标记:只在 AkTalentTable 打开「算法」开关(.is-calc)时显示,紧贴在数值前;读屏念「直接乘算」,悬停同 */\nconst TEXT: Record<CalcKind, string> = { add: \"直接加算\", mul: \"直接乘算\", fadd: \"最终加算\", fmul: \"最终乘算\" };\n</script>\n\n<template>\n <i :class=\"['ak-calc', `ak-calc--${kind}`]\" role=\"img\" :aria-label=\"TEXT[kind]\" :title=\"TEXT[kind]\" />\n</template>\n","<script setup lang=\"ts\">\nexport type CalcKind = \"add\" | \"mul\" | \"fadd\" | \"fmul\";\n\ndefineProps<{\n /** 进公式的方式:add 直接加算(绿 +)· mul 直接乘算(蓝 +)· fadd 最终加算(橙 +)· fmul 最终乘算(橙 ×) */\n kind: CalcKind;\n}>();\n\n/* 算法标记:只在 AkTalentTable 打开「算法」开关(.is-calc)时显示,紧贴在数值前;读屏念「直接乘算」,悬停同 */\nconst TEXT: Record<CalcKind, string> = { add: \"直接加算\", mul: \"直接乘算\", fadd: \"最终加算\", fmul: \"最终乘算\" };\n</script>\n\n<template>\n <i :class=\"['ak-calc', `ak-calc--${kind}`]\" role=\"img\" :aria-label=\"TEXT[kind]\" :title=\"TEXT[kind]\" />\n</template>\n","<script setup lang=\"ts\">\n/** 一条解锁条件:精英化 / 潜能图标 + 字 */\nexport interface TalentRequirement {\n /** 图标地址(elite_N / potential_N) */\n icon?: string;\n /** 「精英二 · 1级」「潜能5」 */\n text: string;\n}\n\nwithDefaults(\n defineProps<{\n /** 天赋名 */\n name: string;\n /** 解锁条件,跟在名字后面(小号标签字) */\n requirements?: TalentRequirement[];\n }>(),\n { requirements: () => [] },\n);\n\ndefineSlots<{\n /** 描述(游戏原始标记可以套 AkRichText) */\n default?: () => unknown;\n}>();\n</script>\n\n<template>\n <div class=\"ak-talent\">\n <div class=\"ak-talent__name\">\n {{ name }}\n <span v-for=\"(r, i) in requirements\" :key=\"i\" class=\"ak-talent__req\"><img v-if=\"r.icon\" :src=\"r.icon\" alt=\"\" />{{ r.text }}</span>\n </div>\n <div v-if=\"$slots.default\" class=\"ak-talent__desc\"><slot /></div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/** 一条解锁条件:精英化 / 潜能图标 + 字 */\nexport interface TalentRequirement {\n /** 图标地址(elite_N / potential_N) */\n icon?: string;\n /** 「精英二 · 1级」「潜能5」 */\n text: string;\n}\n\nwithDefaults(\n defineProps<{\n /** 天赋名 */\n name: string;\n /** 解锁条件,跟在名字后面(小号标签字) */\n requirements?: TalentRequirement[];\n }>(),\n { requirements: () => [] },\n);\n\ndefineSlots<{\n /** 描述(游戏原始标记可以套 AkRichText) */\n default?: () => unknown;\n}>();\n</script>\n\n<template>\n <div class=\"ak-talent\">\n <div class=\"ak-talent__name\">\n {{ name }}\n <span v-for=\"(r, i) in requirements\" :key=\"i\" class=\"ak-talent__req\"><img v-if=\"r.icon\" :src=\"r.icon\" alt=\"\" />{{ r.text }}</span>\n </div>\n <div v-if=\"$slots.default\" class=\"ak-talent__desc\"><slot /></div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 材料表(= Naive 的 NDescriptions 那种「标签 → 内容」两列):左列阶段 / 等级,右列这一步要的材料。\n * 里面放 AkMaterialsRow(一行)与 AkMaterialsDivider(横跨两列的分段说明)。\n */\ndefineSlots<{\n /** 若干 AkMaterialsRow / AkMaterialsDivider */\n default?: () => unknown;\n}>();\n</script>\n\n<template>\n <div class=\"ak-materials\"><slot /></div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 材料表(= Naive 的 NDescriptions 那种「标签 → 内容」两列):左列阶段 / 等级,右列这一步要的材料。\n * 里面放 AkMaterialsRow(一行)与 AkMaterialsDivider(横跨两列的分段说明)。\n */\ndefineSlots<{\n /** 若干 AkMaterialsRow / AkMaterialsDivider */\n default?: () => unknown;\n}>();\n</script>\n\n<template>\n <div class=\"ak-materials\"><slot /></div>\n</template>\n","<script setup lang=\"ts\">\nimport { provide } from \"vue\";\n\nimport { itemListKey } from \"../Item/context\";\n\n/**\n * 材料表的一行(= Naive 的 NDescriptionsItem),只能直接放在 AkMaterials 里:输出网格的两格——\n * .ak-materials__label(阶段 / 等级)+ .ak-item-list(材料)。两个根元素,所以不继承属性。\n */\ndefineOptions({ inheritAttrs: false });\n\ndefineProps<{\n /** 左列文字(「1 → 2」「精英阶段 0→1」);要放精英化图标时用 #label 插槽 */\n label?: string;\n}>();\n\ndefineSlots<{\n /** 这一步要的材料:若干 AkItem——没写 size 的按表里的规格画成 sm(40px) */\n default?: () => unknown;\n /** 左列内容(代替 label) */\n label?: () => unknown;\n}>();\n\n/** 材料表里的道具统一是 sm:同 AkItemList 的 size,经 provide 给没写 size 的 AkItem */\nprovide(itemListKey, { size: \"sm\" });\n</script>\n\n<template>\n <span class=\"ak-materials__label\"><slot name=\"label\">{{ label }}</slot></span>\n <span class=\"ak-item-list\"><slot /></span>\n</template>\n","<script setup lang=\"ts\">\nimport { provide } from \"vue\";\n\nimport { itemListKey } from \"../Item/context\";\n\n/**\n * 材料表的一行(= Naive 的 NDescriptionsItem),只能直接放在 AkMaterials 里:输出网格的两格——\n * .ak-materials__label(阶段 / 等级)+ .ak-item-list(材料)。两个根元素,所以不继承属性。\n */\ndefineOptions({ inheritAttrs: false });\n\ndefineProps<{\n /** 左列文字(「1 → 2」「精英阶段 0→1」);要放精英化图标时用 #label 插槽 */\n label?: string;\n}>();\n\ndefineSlots<{\n /** 这一步要的材料:若干 AkItem——没写 size 的按表里的规格画成 sm(40px) */\n default?: () => unknown;\n /** 左列内容(代替 label) */\n label?: () => unknown;\n}>();\n\n/** 材料表里的道具统一是 sm:同 AkItemList 的 size,经 provide 给没写 size 的 AkItem */\nprovide(itemListKey, { size: \"sm\" });\n</script>\n\n<template>\n <span class=\"ak-materials__label\"><slot name=\"label\">{{ label }}</slot></span>\n <span class=\"ak-item-list\"><slot /></span>\n</template>\n","<script setup lang=\"ts\">\n/** 材料表里横跨两列的分段说明(「达到精英阶段 1 后解锁」),只能直接放在 AkMaterials 里 */\ndefineSlots<{\n /** 说明文字 */\n default?: () => unknown;\n}>();\n</script>\n\n<template>\n <span class=\"ak-materials__divider\"><slot /></span>\n</template>\n","<script setup lang=\"ts\">\n/** 材料表里横跨两列的分段说明(「达到精英阶段 1 后解锁」),只能直接放在 AkMaterials 里 */\ndefineSlots<{\n /** 说明文字 */\n default?: () => unknown;\n}>();\n</script>\n\n<template>\n <span class=\"ak-materials__divider\"><slot /></span>\n</template>\n","<script setup lang=\"ts\">\n/** 属性表:若干 AkAttr 排成等宽网格(每格最窄 140px,放不下换行),格间 1px 缝线 */\ndefineProps<{\n /** 紧凑:名 / 值左右排开、数值缩到正文字号(档案里的综合体检、侧栏读数) */\n compact?: boolean;\n}>();\n\ndefineSlots<{\n /** 若干 AkAttr */\n default?: () => unknown;\n}>();\n</script>\n\n<template>\n <div :class=\"['ak-attrs', { 'ak-attrs--compact': compact }]\"><slot /></div>\n</template>\n","<script setup lang=\"ts\">\n/** 属性表:若干 AkAttr 排成等宽网格(每格最窄 140px,放不下换行),格间 1px 缝线 */\ndefineProps<{\n /** 紧凑:名 / 值左右排开、数值缩到正文字号(档案里的综合体检、侧栏读数) */\n compact?: boolean;\n}>();\n\ndefineSlots<{\n /** 若干 AkAttr */\n default?: () => unknown;\n}>();\n</script>\n\n<template>\n <div :class=\"['ak-attrs', { 'ak-attrs--compact': compact }]\"><slot /></div>\n</template>\n","<script setup lang=\"ts\">\n/** 属性表的一格(思路同 Naive 的 NStatistic:小标签 + 大数值 + 单位),放在 AkAttrs 里 */\ndefineProps<{\n /** 属性名:英文缩写(HP / ATK …,Bender 大写小字)或直接写中文(物理强度) */\n name: string;\n /** 中文名:跟在英文缩写后,正文字体(生命上限) */\n zh?: string;\n /** 数值;要上色或放别的内容时改用默认插槽 */\n value?: string | number;\n /** 单位:数值后的小号灰字(s) */\n unit?: string;\n /** 强调:顶部 2px 主色线(面板里的四维用,部署类属性不用) */\n accent?: boolean;\n}>();\n\ndefineSlots<{\n /** 数值(代替 value) */\n default?: () => unknown;\n}>();\n</script>\n\n<template>\n <div :class=\"['ak-attr', { 'ak-attr--accent': accent }]\">\n <span class=\"ak-attr__label\">\n {{ name }}<span v-if=\"zh\" class=\"cn\">{{ zh }}</span>\n </span>\n <span class=\"ak-attr__value\"><slot>{{ value }}</slot><small v-if=\"unit\">{{ unit }}</small></span>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/** 属性表的一格(思路同 Naive 的 NStatistic:小标签 + 大数值 + 单位),放在 AkAttrs 里 */\ndefineProps<{\n /** 属性名:英文缩写(HP / ATK …,Bender 大写小字)或直接写中文(物理强度) */\n name: string;\n /** 中文名:跟在英文缩写后,正文字体(生命上限) */\n zh?: string;\n /** 数值;要上色或放别的内容时改用默认插槽 */\n value?: string | number;\n /** 单位:数值后的小号灰字(s) */\n unit?: string;\n /** 强调:顶部 2px 主色线(面板里的四维用,部署类属性不用) */\n accent?: boolean;\n}>();\n\ndefineSlots<{\n /** 数值(代替 value) */\n default?: () => unknown;\n}>();\n</script>\n\n<template>\n <div :class=\"['ak-attr', { 'ak-attr--accent': accent }]\">\n <span class=\"ak-attr__label\">\n {{ name }}<span v-if=\"zh\" class=\"cn\">{{ zh }}</span>\n </span>\n <span class=\"ak-attr__value\"><slot>{{ value }}</slot><small v-if=\"unit\">{{ unit }}</small></span>\n </div>\n</template>\n","import type { InjectionKey } from \"vue\";\n\n/** AkKv 给 AkKvItem 的排法:内联版每对 dt + dd 要包一层 <div>(dl > div > dt + dd) */\nexport const kvKey: InjectionKey<{ readonly inline?: boolean }> = Symbol(\"AkKv\");\n","<script setup lang=\"ts\">\nimport { provide } from \"vue\";\n\nimport { kvKey } from \"./context\";\n\n/**\n * 键值表(同 Naive 的 NDescriptions):一个 <dl>,里面放若干 AkKvItem。\n * 子项自己输出 dt + dd,只有内联版要多包一层 div——这点由 provide 告诉子项,父组件不读子项。\n */\nconst props = defineProps<{\n /** 带框(信息栏):外框 + 键列底色、居中,同现网 infobox 的 th;不带框的是档案里那种只有横线的版本 */\n bordered?: boolean;\n /** 内联:两三对短值一行放下、放不下换行,不画格子(所属势力 / 隐藏势力、获得方式 / 上线时间);与 bordered 同时写时以内联为准 */\n inline?: boolean;\n}>();\n\ndefineSlots<{\n /** 若干 AkKvItem */\n default?: () => unknown;\n}>();\n\nprovide(kvKey, props);\n</script>\n\n<template>\n <dl :class=\"['ak-kv', { 'ak-kv--boxed': bordered && !inline, 'ak-kv--inline': inline }]\"><slot /></dl>\n</template>\n","<script setup lang=\"ts\">\nimport { provide } from \"vue\";\n\nimport { kvKey } from \"./context\";\n\n/**\n * 键值表(同 Naive 的 NDescriptions):一个 <dl>,里面放若干 AkKvItem。\n * 子项自己输出 dt + dd,只有内联版要多包一层 div——这点由 provide 告诉子项,父组件不读子项。\n */\nconst props = defineProps<{\n /** 带框(信息栏):外框 + 键列底色、居中,同现网 infobox 的 th;不带框的是档案里那种只有横线的版本 */\n bordered?: boolean;\n /** 内联:两三对短值一行放下、放不下换行,不画格子(所属势力 / 隐藏势力、获得方式 / 上线时间);与 bordered 同时写时以内联为准 */\n inline?: boolean;\n}>();\n\ndefineSlots<{\n /** 若干 AkKvItem */\n default?: () => unknown;\n}>();\n\nprovide(kvKey, props);\n</script>\n\n<template>\n <dl :class=\"['ak-kv', { 'ak-kv--boxed': bordered && !inline, 'ak-kv--inline': inline }]\"><slot /></dl>\n</template>\n","<script setup lang=\"ts\">\nimport { inject } from \"vue\";\n\nimport { kvKey } from \"./context\";\n\n/** 键值表的一对(同 Naive 的 NDescriptionsItem):输出 <dt> + <dd>;在内联版 AkKv 里包一层 <div>。只能放在 AkKv 里 */\ndefineProps<{\n /** 键(dt)文字;要带悬停解释 / 图标时改用 #term 插槽 */\n term?: string;\n}>();\n\ndefineSlots<{\n /** 值(dd):文字、链接、标签、列表都行 */\n default?: () => unknown;\n /** 键(代替 term) */\n term?: () => unknown;\n}>();\n\nconst kv = inject(kvKey, {});\n</script>\n\n<template>\n <div v-if=\"kv.inline\">\n <dt><slot name=\"term\">{{ term }}</slot></dt>\n <dd><slot /></dd>\n </div>\n <template v-else>\n <dt><slot name=\"term\">{{ term }}</slot></dt>\n <dd><slot /></dd>\n </template>\n</template>\n","<script setup lang=\"ts\">\nimport { inject } from \"vue\";\n\nimport { kvKey } from \"./context\";\n\n/** 键值表的一对(同 Naive 的 NDescriptionsItem):输出 <dt> + <dd>;在内联版 AkKv 里包一层 <div>。只能放在 AkKv 里 */\ndefineProps<{\n /** 键(dt)文字;要带悬停解释 / 图标时改用 #term 插槽 */\n term?: string;\n}>();\n\ndefineSlots<{\n /** 值(dd):文字、链接、标签、列表都行 */\n default?: () => unknown;\n /** 键(代替 term) */\n term?: () => unknown;\n}>();\n\nconst kv = inject(kvKey, {});\n</script>\n\n<template>\n <div v-if=\"kv.inline\">\n <dt><slot name=\"term\">{{ term }}</slot></dt>\n <dd><slot /></dd>\n </div>\n <template v-else>\n <dt><slot name=\"term\">{{ term }}</slot></dt>\n <dd><slot /></dd>\n </template>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\n/** 一格:相对自身的行 / 列(= 游戏 range_table 的 grids 项),或写成 [row, col] */\nexport type RangeGrid = { row: number; col: number } | readonly [row: number, col: number];\n\nconst props = withDefaults(\n defineProps<{\n /** 可攻击的格子(相对自身):{ row, col }(直接传 range_table 的 grids)或 [row, col];col 向前为正,自身 (0, 0) 写不写都行 */\n grids: readonly RangeGrid[];\n /** 尺寸:sm 14 · md 22 · lg 28(px 格边);sm 给技能卡侧槽 / 表格 */\n size?: \"sm\" | \"md\" | \"lg\";\n /** 可访问名(aria-label);默认「攻击范围:自身之外 N 格」 */\n label?: string;\n }>(),\n { size: \"md\", label: undefined },\n);\n\n/** 同现网 Widget:Range:只铺范围的外接矩形(含自身),逐格给 self / on / 空(空格不写 class,CSS 不画) */\nconst layout = computed(() => {\n const on = new Set(props.grids.map(g => (\"row\" in g ? `${g.row},${g.col}` : `${g[0]},${g[1]}`)));\n on.delete(\"0,0\");\n const pts = [[0, 0], ...[...on].map(k => k.split(\",\").map(Number))];\n const rows = pts.map(p => p[0]);\n const cols = pts.map(p => p[1]);\n const [r0, r1, c0, c1] = [Math.min(...rows), Math.max(...rows), Math.min(...cols), Math.max(...cols)];\n const cells: (\"self\" | \"on\" | undefined)[] = [];\n for (let r = r0; r <= r1; r++)\n for (let c = c0; c <= c1; c++) cells.push(r === 0 && c === 0 ? \"self\" : on.has(`${r},${c}`) ? \"on\" : undefined);\n return { cols: c1 - c0 + 1, cells, count: on.size };\n});\n</script>\n\n<template>\n <div\n :class=\"['ak-range', size !== 'md' && `ak-range--${size}`]\"\n :style=\"{ '--cols': layout.cols }\"\n role=\"img\"\n :aria-label=\"label ?? `攻击范围:自身之外 ${layout.count} 格`\"\n >\n <i v-for=\"(c, i) in layout.cells\" :key=\"i\" :class=\"c\" />\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\n/** 一格:相对自身的行 / 列(= 游戏 range_table 的 grids 项),或写成 [row, col] */\nexport type RangeGrid = { row: number; col: number } | readonly [row: number, col: number];\n\nconst props = withDefaults(\n defineProps<{\n /** 可攻击的格子(相对自身):{ row, col }(直接传 range_table 的 grids)或 [row, col];col 向前为正,自身 (0, 0) 写不写都行 */\n grids: readonly RangeGrid[];\n /** 尺寸:sm 14 · md 22 · lg 28(px 格边);sm 给技能卡侧槽 / 表格 */\n size?: \"sm\" | \"md\" | \"lg\";\n /** 可访问名(aria-label);默认「攻击范围:自身之外 N 格」 */\n label?: string;\n }>(),\n { size: \"md\", label: undefined },\n);\n\n/** 同现网 Widget:Range:只铺范围的外接矩形(含自身),逐格给 self / on / 空(空格不写 class,CSS 不画) */\nconst layout = computed(() => {\n const on = new Set(props.grids.map(g => (\"row\" in g ? `${g.row},${g.col}` : `${g[0]},${g[1]}`)));\n on.delete(\"0,0\");\n const pts = [[0, 0], ...[...on].map(k => k.split(\",\").map(Number))];\n const rows = pts.map(p => p[0]);\n const cols = pts.map(p => p[1]);\n const [r0, r1, c0, c1] = [Math.min(...rows), Math.max(...rows), Math.min(...cols), Math.max(...cols)];\n const cells: (\"self\" | \"on\" | undefined)[] = [];\n for (let r = r0; r <= r1; r++)\n for (let c = c0; c <= c1; c++) cells.push(r === 0 && c === 0 ? \"self\" : on.has(`${r},${c}`) ? \"on\" : undefined);\n return { cols: c1 - c0 + 1, cells, count: on.size };\n});\n</script>\n\n<template>\n <div\n :class=\"['ak-range', size !== 'md' && `ak-range--${size}`]\"\n :style=\"{ '--cols': layout.cols }\"\n role=\"img\"\n :aria-label=\"label ?? `攻击范围:自身之外 ${layout.count} 格`\"\n >\n <i v-for=\"(c, i) in layout.cells\" :key=\"i\" :class=\"c\" />\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, useId } from \"vue\";\n\nexport type ModuleColor = \"red\" | \"blue\" | \"green\" | \"yellow\" | \"purple\";\n\n/**\n * 模组卡(= 现网 {{模组}}):一张卡装完型号 + 名称 + 故事 + 三阶段表 + 解锁任务 + 解锁需求与材料。\n * 结构照 Naive 的 NCard(#header-extra);故事默认只露 3 行,「全文阅读」展开同 NEllipsis 的 line-clamp + expand-trigger=\"click\"——\n * 这里用组件内状态(v-model)代替 CSS 版的 data-toggle-class,真皮肤上也能用。\n */\nconst props = withDefaults(\n defineProps<{\n /** 模组名(h4) */\n name: string;\n /** 模组图地址(游戏 uniequip 图;原型证章放分支图标) */\n src?: string;\n /** 型号文字:SWO-X / Original … */\n typeName?: string;\n /** 型号图标地址(游戏模组类型小图标,放在型号文字前) */\n typeIcon?: string;\n /** 型号色(= 模板参数「类型颜色」,游戏模组类型底色):左侧粗色条 + 型号块 + 阶段条;不写 = 原型证章的灰 */\n color?: ModuleColor;\n /** 「说明 ⓘ」的悬停解释(调整效果先于潜能生效 …);不写不显示 */\n hint?: string;\n /** 故事可折叠:默认只露 3 行 +「全文阅读」开关;false 时全文展开、不出开关(原型证章那种短文) */\n collapsible?: boolean;\n /** 模组解锁任务(纯文本,一条一行);要链接关卡时改用 #tasks 插槽 */\n tasks?: string[];\n }>(),\n { src: undefined, typeName: undefined, typeIcon: undefined, color: undefined, hint: undefined, collapsible: true, tasks: undefined },\n);\n\n/** 故事是否展开(「全文阅读」/「收起全文」) */\nconst open = defineModel<boolean>({ default: false });\n\nconst slots = defineSlots<{\n /** 故事(基础信息):若干 <p>,行内换行用 <br> */\n default?: () => unknown;\n /** 名称之后的附加内容(原型证章的说明标签等) */\n \"header-extra\"?: () => unknown;\n /** 三阶段表的行:若干 AkModuleStage */\n stages?: () => unknown;\n /** 解锁任务:若干 <li>(排在 tasks 之后) */\n tasks?: () => unknown;\n /** 解锁需求与材料表的行:若干 AkModuleUnlock */\n unlock?: () => unknown;\n}>();\n\nconst id = useId();\nconst expanded = computed(() => !props.collapsible || open.value);\nconst hasTasks = computed(() => !!props.tasks?.length || !!slots.tasks);\n</script>\n\n<template>\n <div class=\"ak-module\" :data-color=\"color\">\n <div class=\"ak-module__img\"><img v-if=\"src\" :src=\"src\" alt=\"\" /></div>\n <div :class=\"['ak-module__main', { 'is-open': expanded }]\">\n <div class=\"ak-module__head\">\n <span v-if=\"typeName || typeIcon\" class=\"ak-module__type\"><img v-if=\"typeIcon\" :src=\"typeIcon\" alt=\"\" />{{ typeName }}</span>\n <h4 class=\"ak-module__name\">{{ name }}</h4>\n <span v-if=\"hint\" class=\"ak-module__hint ak-tip--wide\" :data-ak-tip=\"hint\" tabindex=\"0\">说明 ⓘ</span>\n <slot name=\"header-extra\" />\n </div>\n <div v-if=\"$slots.default\" :id=\"`${id}-story`\" class=\"ak-module__story\"><slot /></div>\n <label v-if=\"collapsible && $slots.default\" class=\"ak-module__more\">\n <input v-model=\"open\" type=\"checkbox\" :aria-controls=\"`${id}-story`\" />\n <span class=\"off\">全文阅读 »</span><span class=\"on\">收起全文 «</span>\n </label>\n </div>\n <div v-if=\"$slots.stages || hasTasks || $slots.unlock\" class=\"ak-module__body\">\n <table v-if=\"$slots.stages\" class=\"ak-module__stages\">\n <thead>\n <tr><th scope=\"col\">阶段</th><th scope=\"col\">属性</th><th scope=\"col\">特性 / 天赋变化</th></tr>\n </thead>\n <tbody><slot name=\"stages\" /></tbody>\n </table>\n <div v-if=\"hasTasks\" class=\"ak-module__tasks\">\n <span class=\"ak-overline\">模组解锁任务</span>\n <ul>\n <li v-for=\"(t, i) in tasks\" :key=\"i\">{{ t }}</li>\n <slot name=\"tasks\" />\n </ul>\n </div>\n <table v-if=\"$slots.unlock\" class=\"ak-module__unlock\">\n <thead>\n <tr><th scope=\"col\">阶段</th><th scope=\"col\">解锁需求</th><th scope=\"col\">材料消耗</th></tr>\n </thead>\n <tbody><slot name=\"unlock\" /></tbody>\n </table>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, useId } from \"vue\";\n\nexport type ModuleColor = \"red\" | \"blue\" | \"green\" | \"yellow\" | \"purple\";\n\n/**\n * 模组卡(= 现网 {{模组}}):一张卡装完型号 + 名称 + 故事 + 三阶段表 + 解锁任务 + 解锁需求与材料。\n * 结构照 Naive 的 NCard(#header-extra);故事默认只露 3 行,「全文阅读」展开同 NEllipsis 的 line-clamp + expand-trigger=\"click\"——\n * 这里用组件内状态(v-model)代替 CSS 版的 data-toggle-class,真皮肤上也能用。\n */\nconst props = withDefaults(\n defineProps<{\n /** 模组名(h4) */\n name: string;\n /** 模组图地址(游戏 uniequip 图;原型证章放分支图标) */\n src?: string;\n /** 型号文字:SWO-X / Original … */\n typeName?: string;\n /** 型号图标地址(游戏模组类型小图标,放在型号文字前) */\n typeIcon?: string;\n /** 型号色(= 模板参数「类型颜色」,游戏模组类型底色):左侧粗色条 + 型号块 + 阶段条;不写 = 原型证章的灰 */\n color?: ModuleColor;\n /** 「说明 ⓘ」的悬停解释(调整效果先于潜能生效 …);不写不显示 */\n hint?: string;\n /** 故事可折叠:默认只露 3 行 +「全文阅读」开关;false 时全文展开、不出开关(原型证章那种短文) */\n collapsible?: boolean;\n /** 模组解锁任务(纯文本,一条一行);要链接关卡时改用 #tasks 插槽 */\n tasks?: string[];\n }>(),\n { src: undefined, typeName: undefined, typeIcon: undefined, color: undefined, hint: undefined, collapsible: true, tasks: undefined },\n);\n\n/** 故事是否展开(「全文阅读」/「收起全文」) */\nconst open = defineModel<boolean>({ default: false });\n\nconst slots = defineSlots<{\n /** 故事(基础信息):若干 <p>,行内换行用 <br> */\n default?: () => unknown;\n /** 名称之后的附加内容(原型证章的说明标签等) */\n \"header-extra\"?: () => unknown;\n /** 三阶段表的行:若干 AkModuleStage */\n stages?: () => unknown;\n /** 解锁任务:若干 <li>(排在 tasks 之后) */\n tasks?: () => unknown;\n /** 解锁需求与材料表的行:若干 AkModuleUnlock */\n unlock?: () => unknown;\n}>();\n\nconst id = useId();\nconst expanded = computed(() => !props.collapsible || open.value);\nconst hasTasks = computed(() => !!props.tasks?.length || !!slots.tasks);\n</script>\n\n<template>\n <div class=\"ak-module\" :data-color=\"color\">\n <div class=\"ak-module__img\"><img v-if=\"src\" :src=\"src\" alt=\"\" /></div>\n <div :class=\"['ak-module__main', { 'is-open': expanded }]\">\n <div class=\"ak-module__head\">\n <span v-if=\"typeName || typeIcon\" class=\"ak-module__type\"><img v-if=\"typeIcon\" :src=\"typeIcon\" alt=\"\" />{{ typeName }}</span>\n <h4 class=\"ak-module__name\">{{ name }}</h4>\n <span v-if=\"hint\" class=\"ak-module__hint ak-tip--wide\" :data-ak-tip=\"hint\" tabindex=\"0\">说明 ⓘ</span>\n <slot name=\"header-extra\" />\n </div>\n <div v-if=\"$slots.default\" :id=\"`${id}-story`\" class=\"ak-module__story\"><slot /></div>\n <label v-if=\"collapsible && $slots.default\" class=\"ak-module__more\">\n <input v-model=\"open\" type=\"checkbox\" :aria-controls=\"`${id}-story`\" />\n <span class=\"off\">全文阅读 »</span><span class=\"on\">收起全文 «</span>\n </label>\n </div>\n <div v-if=\"$slots.stages || hasTasks || $slots.unlock\" class=\"ak-module__body\">\n <table v-if=\"$slots.stages\" class=\"ak-module__stages\">\n <thead>\n <tr><th scope=\"col\">阶段</th><th scope=\"col\">属性</th><th scope=\"col\">特性 / 天赋变化</th></tr>\n </thead>\n <tbody><slot name=\"stages\" /></tbody>\n </table>\n <div v-if=\"hasTasks\" class=\"ak-module__tasks\">\n <span class=\"ak-overline\">模组解锁任务</span>\n <ul>\n <li v-for=\"(t, i) in tasks\" :key=\"i\">{{ t }}</li>\n <slot name=\"tasks\" />\n </ul>\n </div>\n <table v-if=\"$slots.unlock\" class=\"ak-module__unlock\">\n <thead>\n <tr><th scope=\"col\">阶段</th><th scope=\"col\">解锁需求</th><th scope=\"col\">材料消耗</th></tr>\n </thead>\n <tbody><slot name=\"unlock\" /></tbody>\n </table>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/** 模组三阶段表的一行(阶段条 · 属性加成 · 特性追加 / 天赋更新),放在 AkModule 的 #stages 插槽里 */\ndefineProps<{\n /** 阶段 1–3:「STAGE n」+ 三段条点亮 n 段 */\n stage: 1 | 2 | 3;\n /** 属性加成:{ 攻击: \"+50\", 攻击速度: \"+5\" }(按写的顺序排,数值绿字) */\n stats?: Record<string, string | number>;\n /** 变化类别的反色小标:特性追加 / 天赋更新 */\n kicker?: string;\n}>();\n\ndefineSlots<{\n /** 特性 / 天赋变化的描述(可带富文本) */\n default?: () => unknown;\n}>();\n</script>\n\n<template>\n <tr>\n <td class=\"lv\">\n <span class=\"ak-module__lv\">STAGE {{ stage }}<i aria-hidden=\"true\"><b v-for=\"n in 3\" :key=\"n\" :class=\"{ on: n <= stage }\" /></i></span>\n </td>\n <td class=\"stats\">\n <span class=\"ak-module__stats\">\n <span v-for=\"(v, k) in stats\" :key=\"k\">{{ k }} <span class=\"ak-rt-vup\">{{ v }}</span></span>\n </span>\n </td>\n <td><span v-if=\"kicker\" class=\"ak-module__kicker\">{{ kicker }}</span><slot /></td>\n </tr>\n</template>\n","<script setup lang=\"ts\">\n/** 模组三阶段表的一行(阶段条 · 属性加成 · 特性追加 / 天赋更新),放在 AkModule 的 #stages 插槽里 */\ndefineProps<{\n /** 阶段 1–3:「STAGE n」+ 三段条点亮 n 段 */\n stage: 1 | 2 | 3;\n /** 属性加成:{ 攻击: \"+50\", 攻击速度: \"+5\" }(按写的顺序排,数值绿字) */\n stats?: Record<string, string | number>;\n /** 变化类别的反色小标:特性追加 / 天赋更新 */\n kicker?: string;\n}>();\n\ndefineSlots<{\n /** 特性 / 天赋变化的描述(可带富文本) */\n default?: () => unknown;\n}>();\n</script>\n\n<template>\n <tr>\n <td class=\"lv\">\n <span class=\"ak-module__lv\">STAGE {{ stage }}<i aria-hidden=\"true\"><b v-for=\"n in 3\" :key=\"n\" :class=\"{ on: n <= stage }\" /></i></span>\n </td>\n <td class=\"stats\">\n <span class=\"ak-module__stats\">\n <span v-for=\"(v, k) in stats\" :key=\"k\">{{ k }} <span class=\"ak-rt-vup\">{{ v }}</span></span>\n </span>\n </td>\n <td><span v-if=\"kicker\" class=\"ak-module__kicker\">{{ kicker }}</span><slot /></td>\n </tr>\n</template>\n","<script setup lang=\"ts\">\n/** 模组解锁表的一行(阶段条 · 解锁需求 · 材料消耗),放在 AkModule 的 #unlock 插槽里 */\ndefineProps<{\n /** 阶段 1–3:「STAGE n」+ 三段条点亮 n 段 */\n stage: 1 | 2 | 3;\n}>();\n\ndefineSlots<{\n /** 材料消耗:一排 AkItem(AkItemList) */\n default?: () => unknown;\n /** 解锁需求:信赖 / 精英阶段与等级 / 任务标签,横排换行 */\n requirement?: () => unknown;\n}>();\n</script>\n\n<template>\n <tr>\n <td class=\"lv\">\n <span class=\"ak-module__lv\">STAGE {{ stage }}<i aria-hidden=\"true\"><b v-for=\"n in 3\" :key=\"n\" :class=\"{ on: n <= stage }\" /></i></span>\n </td>\n <td><span class=\"ak-module__req\"><slot name=\"requirement\" /></span></td>\n <td><slot /></td>\n </tr>\n</template>\n","<script setup lang=\"ts\">\n/** 模组解锁表的一行(阶段条 · 解锁需求 · 材料消耗),放在 AkModule 的 #unlock 插槽里 */\ndefineProps<{\n /** 阶段 1–3:「STAGE n」+ 三段条点亮 n 段 */\n stage: 1 | 2 | 3;\n}>();\n\ndefineSlots<{\n /** 材料消耗:一排 AkItem(AkItemList) */\n default?: () => unknown;\n /** 解锁需求:信赖 / 精英阶段与等级 / 任务标签,横排换行 */\n requirement?: () => unknown;\n}>();\n</script>\n\n<template>\n <tr>\n <td class=\"lv\">\n <span class=\"ak-module__lv\">STAGE {{ stage }}<i aria-hidden=\"true\"><b v-for=\"n in 3\" :key=\"n\" :class=\"{ on: n <= stage }\" /></i></span>\n </td>\n <td><span class=\"ak-module__req\"><slot name=\"requirement\" /></span></td>\n <td><slot /></td>\n </tr>\n</template>\n","import type { ComputedRef, InjectionKey } from \"vue\";\n\n/** 语种选项(同 Naive 的 options:value + label) */\nexport interface VoiceLanguage {\n /** 语种键,= AkVoice 的 text / src 对象里的键(cn / yue / jp / en / kr …) */\n value: string;\n /** 切换条上的名字(中文-普通话) */\n label: string;\n /** 配音演员(切换条上名字后的小字) */\n cv?: string;\n}\n\n/** 文本语言选项(台词的语言:中文 / 日文 / 繁体中文 / 中文-方言 …) */\nexport interface VoiceText {\n /** 文本键,= AkVoice 的 text 对象里的键 */\n value: string;\n /** 切换条上的名字 */\n label: string;\n}\n\n/** AkVoiceList 给 AkVoice 的:当前语种、文本语言选项与选中的几种 */\nexport const voiceListKey: InjectionKey<\n ComputedRef<{ lang?: string; languages: readonly VoiceLanguage[]; texts: readonly VoiceText[]; shownTexts: readonly string[] }>\n> = Symbol(\"AkVoiceList\");\n\n/** 游戏语种键 → HTML lang(读屏按语种发音);不认识的键不写 lang */\nexport const HTML_LANG: Record<string, string> = { cn: \"zh-Hans\", yue: \"yue\", jp: \"ja\", en: \"en\", kr: \"ko\" };\n","<script setup lang=\"ts\">\nimport { computed, provide, useId } from \"vue\";\n\nimport { voiceListKey, type VoiceLanguage, type VoiceText } from \"./context\";\n\n/**\n * 语音列表(= 现网 {{:xx/语音记录}} 的 VoiceTable):若干 AkVoice,外框 + 悬停行底色。\n * 上方最多两排切换条(.ak-voice-toolbar 里排一行,放不下时后一排整组换行):\n * - texts:文本(台词的语言),多选、可以一个都不选,v-model:shown-texts;AkVoice 的 text 按文本键给对象,选中的几种一种一行\n * - languages:语种(音频差分,普通话 / 方言 / 日 / 英 / 韩,带 CV 名),单选,v-model;AkVoice 的 src 按语种键给对象\n * 只给 languages 时 AkVoice 的 text 也按语种给,切语种同时换台词和音频地址。\n * 当前语种 / 选中的文本经 provide 给子项;播放全页只有一条(见 player.ts)。\n * 切换条标 data-no-toggle:皮肤脚本会在 document 上替模板输出的纯 CSS 芯片翻 is-active / aria-pressed,这里的状态归 Vue 管,\n * 不退出那层委托就会两边各翻一次(点第二下反而取消选中)。\n */\nconst props = withDefaults(\n defineProps<{\n /** 语种选项 { value, label, cv? }(同 Naive 的 options);不给就没有语种切换条 */\n languages?: VoiceLanguage[];\n /** 文本语言选项 { value, label };不给就没有文本切换条,台词跟语种走 */\n texts?: VoiceText[];\n }>(),\n { languages: () => [], texts: () => [] },\n);\n\n/** 当前语种(languages 里的 value);不绑定时是第一个 */\nconst lang = defineModel<string>();\n/** 选中的文本语言(texts 里的 value,可多个、可为空);不绑定时默认第一个 */\nconst shownTexts = defineModel<string[]>(\"shownTexts\");\n\ndefineSlots<{\n /** 若干 AkVoice */\n default?: () => unknown;\n /** 语种切换条末尾的附注(「灰标 = 游戏内解锁条件」) */\n \"header-extra\"?: () => unknown;\n}>();\n\nconst current = computed(() => lang.value ?? props.languages[0]?.value);\nconst shown = computed(() => shownTexts.value ?? (props.texts[0] ? [props.texts[0].value] : []));\nfunction toggleText(value: string) {\n const on = !shown.value.includes(value);\n shownTexts.value = props.texts.map(t => t.value).filter(v => (v === value ? on : shown.value.includes(v)));\n}\n\nprovide(\n voiceListKey,\n computed(() => ({ lang: current.value, languages: props.languages, texts: props.texts, shownTexts: shown.value })),\n);\n\nconst id = useId();\n</script>\n\n<template>\n <div>\n <div v-if=\"texts.length || languages.length\" class=\"ak-voice-toolbar ak-not-prose\" data-no-toggle>\n <div v-if=\"texts.length\" class=\"ak-voice-langs\" role=\"group\" :aria-labelledby=\"`${id}-texts`\">\n <span :id=\"`${id}-texts`\" class=\"ak-overline\">文本</span>\n <button\n v-for=\"t in texts\"\n :key=\"t.value\"\n type=\"button\"\n :class=\"['ak-chip', { 'is-active': shown.includes(t.value) }]\"\n :aria-pressed=\"shown.includes(t.value)\"\n @click=\"toggleText(t.value)\"\n >\n {{ t.label }}\n </button>\n </div>\n <div v-if=\"languages.length\" class=\"ak-voice-langs\" role=\"group\" :aria-labelledby=\"`${id}-langs`\">\n <span :id=\"`${id}-langs`\" class=\"ak-overline\">语种</span>\n <button\n v-for=\"l in languages\"\n :key=\"l.value\"\n type=\"button\"\n :class=\"['ak-chip', { 'is-active': l.value === current }]\"\n :aria-pressed=\"l.value === current\"\n @click=\"lang = l.value\"\n >\n {{ l.label }}<small v-if=\"l.cv\">{{ l.cv }}</small>\n </button>\n <slot name=\"header-extra\" />\n </div>\n </div>\n <div class=\"ak-voice-list ak-not-prose\"><slot /></div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, provide, useId } from \"vue\";\n\nimport { voiceListKey, type VoiceLanguage, type VoiceText } from \"./context\";\n\n/**\n * 语音列表(= 现网 {{:xx/语音记录}} 的 VoiceTable):若干 AkVoice,外框 + 悬停行底色。\n * 上方最多两排切换条(.ak-voice-toolbar 里排一行,放不下时后一排整组换行):\n * - texts:文本(台词的语言),多选、可以一个都不选,v-model:shown-texts;AkVoice 的 text 按文本键给对象,选中的几种一种一行\n * - languages:语种(音频差分,普通话 / 方言 / 日 / 英 / 韩,带 CV 名),单选,v-model;AkVoice 的 src 按语种键给对象\n * 只给 languages 时 AkVoice 的 text 也按语种给,切语种同时换台词和音频地址。\n * 当前语种 / 选中的文本经 provide 给子项;播放全页只有一条(见 player.ts)。\n * 切换条标 data-no-toggle:皮肤脚本会在 document 上替模板输出的纯 CSS 芯片翻 is-active / aria-pressed,这里的状态归 Vue 管,\n * 不退出那层委托就会两边各翻一次(点第二下反而取消选中)。\n */\nconst props = withDefaults(\n defineProps<{\n /** 语种选项 { value, label, cv? }(同 Naive 的 options);不给就没有语种切换条 */\n languages?: VoiceLanguage[];\n /** 文本语言选项 { value, label };不给就没有文本切换条,台词跟语种走 */\n texts?: VoiceText[];\n }>(),\n { languages: () => [], texts: () => [] },\n);\n\n/** 当前语种(languages 里的 value);不绑定时是第一个 */\nconst lang = defineModel<string>();\n/** 选中的文本语言(texts 里的 value,可多个、可为空);不绑定时默认第一个 */\nconst shownTexts = defineModel<string[]>(\"shownTexts\");\n\ndefineSlots<{\n /** 若干 AkVoice */\n default?: () => unknown;\n /** 语种切换条末尾的附注(「灰标 = 游戏内解锁条件」) */\n \"header-extra\"?: () => unknown;\n}>();\n\nconst current = computed(() => lang.value ?? props.languages[0]?.value);\nconst shown = computed(() => shownTexts.value ?? (props.texts[0] ? [props.texts[0].value] : []));\nfunction toggleText(value: string) {\n const on = !shown.value.includes(value);\n shownTexts.value = props.texts.map(t => t.value).filter(v => (v === value ? on : shown.value.includes(v)));\n}\n\nprovide(\n voiceListKey,\n computed(() => ({ lang: current.value, languages: props.languages, texts: props.texts, shownTexts: shown.value })),\n);\n\nconst id = useId();\n</script>\n\n<template>\n <div>\n <div v-if=\"texts.length || languages.length\" class=\"ak-voice-toolbar ak-not-prose\" data-no-toggle>\n <div v-if=\"texts.length\" class=\"ak-voice-langs\" role=\"group\" :aria-labelledby=\"`${id}-texts`\">\n <span :id=\"`${id}-texts`\" class=\"ak-overline\">文本</span>\n <button\n v-for=\"t in texts\"\n :key=\"t.value\"\n type=\"button\"\n :class=\"['ak-chip', { 'is-active': shown.includes(t.value) }]\"\n :aria-pressed=\"shown.includes(t.value)\"\n @click=\"toggleText(t.value)\"\n >\n {{ t.label }}\n </button>\n </div>\n <div v-if=\"languages.length\" class=\"ak-voice-langs\" role=\"group\" :aria-labelledby=\"`${id}-langs`\">\n <span :id=\"`${id}-langs`\" class=\"ak-overline\">语种</span>\n <button\n v-for=\"l in languages\"\n :key=\"l.value\"\n type=\"button\"\n :class=\"['ak-chip', { 'is-active': l.value === current }]\"\n :aria-pressed=\"l.value === current\"\n @click=\"lang = l.value\"\n >\n {{ l.label }}<small v-if=\"l.cv\">{{ l.cv }}</small>\n </button>\n <slot name=\"header-extra\" />\n </div>\n </div>\n <div class=\"ak-voice-list ak-not-prose\"><slot /></div>\n </div>\n</template>\n","import { shallowRef } from \"vue\";\n\n/**\n * 全页共用一个原生 Audio:同一时间只放一条语音——点另一条先停掉正在放的(同现网 VoiceTable / 干员页脚本)。\n * 第一次点播放时才创建,SSR / 预渲染不碰 Audio。playing 是正在放的那条 AkVoice 的标识。\n */\nexport const playing = shallowRef<symbol | null>(null);\nlet audio: HTMLAudioElement | undefined;\n\nexport function stop() {\n audio?.pause();\n playing.value = null;\n}\n\n/** 放 / 停一条:正在放的就是它 → 停;否则停掉别的、换成它 */\nexport function toggle(id: symbol, src: string) {\n if (playing.value === id) return stop();\n if (!audio) {\n audio = new Audio();\n audio.addEventListener(\"ended\", stop);\n audio.addEventListener(\"error\", stop);\n }\n audio.pause();\n audio.src = src;\n playing.value = id;\n // 播放被拒(自动播放策略 / 很快又点了别的条目打断了加载):只在还是这条时复位\n audio.play().catch(() => {\n if (playing.value === id) playing.value = null;\n });\n}\n","<script setup lang=\"ts\">\nimport { computed, inject, onBeforeUnmount } from \"vue\";\n\nimport AkIcon from \"../Icon/AkIcon.vue\";\nimport { HTML_LANG, voiceListKey } from \"./context\";\nimport { playing, stop, toggle } from \"./player\";\n\n/**\n * 一条语音:播放钮(+ 下载钮)+ 标题行(解锁条件 / 编号)+ 台词。一般放在 AkVoiceList 里,跟列表的语种走。\n * 标题旁不再标语种:当前语种在上面的切换条里,每条再标一遍只是复读,而「方言」这类也没有靠谱的缩写。\n * 播放钮标 data-no-toggle:皮肤脚本会在 document 上替模板输出的纯 CSS 播放钮翻 is-playing(演示用),这里的 is-playing 跟真实播放状态走,\n * 不退出那层委托就会两边各翻一次(点一下在放但图标还是播放,再点停了图标却变成暂停)。\n */\nconst props = withDefaults(\n defineProps<{\n /** 语音标题(任命助理 / 交谈1 …) */\n title: string;\n /** 台词:一个串;或按语种的对象 { cn, jp, en, kr, yue }(取当前语种,缺了退回第一项);列表给了 texts 时按文本键的对象(选中的几种一种一行) */\n text: string | Record<string, string>;\n /** 音频地址:一个串,或按语种的对象(同 text);取不到时播放钮禁用 */\n src?: string | Record<string, string>;\n /** 语音编号(CN_001),标题行里的小字 */\n code?: string;\n /** 游戏内解锁条件(提升至精英阶段1以查看),标题行里的灰标 */\n unlock?: string;\n /** 语种键:不在 AkVoiceList 里时用它取 text / src、标台词的 HTML lang;在列表里时跟列表的 v-model */\n lang?: string;\n /** 下载地址(现网是 torappu 的 wav):一个串,或按语种的对象(同 src);给了就在播放钮旁出一枚同款下载钮 */\n download?: string | Record<string, string>;\n /** 下载存成的文件名(<a download> 的值,任命助理.wav);不写由浏览器按地址定 */\n downloadName?: string;\n }>(),\n { src: undefined, code: undefined, unlock: undefined, lang: undefined, download: undefined, downloadName: undefined },\n);\n\nconst list = inject(voiceListKey, undefined);\nconst lang = computed(() => props.lang ?? list?.value.lang);\n\nfunction pick(v: string | Record<string, string> | undefined) {\n if (v === undefined || typeof v === \"string\") return v;\n return (lang.value !== undefined ? v[lang.value] : undefined) ?? Object.values(v)[0];\n}\nconst text = computed(() => {\n const v = props.text;\n if (typeof v === \"string\" || !list?.value.texts.length) return pick(v);\n return list.value.shownTexts.map(k => v[k]).filter(Boolean).join(\"\\n\");\n});\nconst src = computed(() => pick(props.src));\nconst download = computed(() => pick(props.download));\n\nconst id = Symbol(\"AkVoice\");\nconst isPlaying = computed(() => playing.value === id);\nonBeforeUnmount(() => isPlaying.value && stop());\n\nfunction onClick() {\n if (src.value) toggle(id, src.value);\n}\n</script>\n\n<template>\n <div class=\"ak-voice\">\n <button\n type=\"button\"\n :class=\"['ak-voice__play', { 'is-playing': isPlaying }]\"\n :aria-label=\"`播放 ${title}`\"\n :aria-pressed=\"isPlaying\"\n :disabled=\"!src\"\n data-no-toggle\n @click=\"onClick\"\n />\n <a v-if=\"download\" class=\"ak-voice__download\" :href=\"download\" :download=\"downloadName ?? ''\" :aria-label=\"`下载 ${title}`\" :title=\"`下载 ${title}`\">\n <AkIcon name=\"download\" :size=\"16\" />\n </a>\n <div>\n <div class=\"ak-voice__title\">\n {{ title }}\n <span v-if=\"unlock\" class=\"ak-voice__cond\">{{ unlock }}</span>\n <span v-if=\"code\" class=\"ak-code-id\">{{ code }}</span>\n <span v-if=\"isPlaying\" class=\"ak-voice__wave\" aria-hidden=\"true\"><i v-for=\"n in 5\" :key=\"n\" /></span>\n </div>\n <div class=\"ak-voice__text\" :lang=\"lang && HTML_LANG[lang]\">{{ text }}</div>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, inject, onBeforeUnmount } from \"vue\";\n\nimport AkIcon from \"../Icon/AkIcon.vue\";\nimport { HTML_LANG, voiceListKey } from \"./context\";\nimport { playing, stop, toggle } from \"./player\";\n\n/**\n * 一条语音:播放钮(+ 下载钮)+ 标题行(解锁条件 / 编号)+ 台词。一般放在 AkVoiceList 里,跟列表的语种走。\n * 标题旁不再标语种:当前语种在上面的切换条里,每条再标一遍只是复读,而「方言」这类也没有靠谱的缩写。\n * 播放钮标 data-no-toggle:皮肤脚本会在 document 上替模板输出的纯 CSS 播放钮翻 is-playing(演示用),这里的 is-playing 跟真实播放状态走,\n * 不退出那层委托就会两边各翻一次(点一下在放但图标还是播放,再点停了图标却变成暂停)。\n */\nconst props = withDefaults(\n defineProps<{\n /** 语音标题(任命助理 / 交谈1 …) */\n title: string;\n /** 台词:一个串;或按语种的对象 { cn, jp, en, kr, yue }(取当前语种,缺了退回第一项);列表给了 texts 时按文本键的对象(选中的几种一种一行) */\n text: string | Record<string, string>;\n /** 音频地址:一个串,或按语种的对象(同 text);取不到时播放钮禁用 */\n src?: string | Record<string, string>;\n /** 语音编号(CN_001),标题行里的小字 */\n code?: string;\n /** 游戏内解锁条件(提升至精英阶段1以查看),标题行里的灰标 */\n unlock?: string;\n /** 语种键:不在 AkVoiceList 里时用它取 text / src、标台词的 HTML lang;在列表里时跟列表的 v-model */\n lang?: string;\n /** 下载地址(现网是 torappu 的 wav):一个串,或按语种的对象(同 src);给了就在播放钮旁出一枚同款下载钮 */\n download?: string | Record<string, string>;\n /** 下载存成的文件名(<a download> 的值,任命助理.wav);不写由浏览器按地址定 */\n downloadName?: string;\n }>(),\n { src: undefined, code: undefined, unlock: undefined, lang: undefined, download: undefined, downloadName: undefined },\n);\n\nconst list = inject(voiceListKey, undefined);\nconst lang = computed(() => props.lang ?? list?.value.lang);\n\nfunction pick(v: string | Record<string, string> | undefined) {\n if (v === undefined || typeof v === \"string\") return v;\n return (lang.value !== undefined ? v[lang.value] : undefined) ?? Object.values(v)[0];\n}\nconst text = computed(() => {\n const v = props.text;\n if (typeof v === \"string\" || !list?.value.texts.length) return pick(v);\n return list.value.shownTexts.map(k => v[k]).filter(Boolean).join(\"\\n\");\n});\nconst src = computed(() => pick(props.src));\nconst download = computed(() => pick(props.download));\n\nconst id = Symbol(\"AkVoice\");\nconst isPlaying = computed(() => playing.value === id);\nonBeforeUnmount(() => isPlaying.value && stop());\n\nfunction onClick() {\n if (src.value) toggle(id, src.value);\n}\n</script>\n\n<template>\n <div class=\"ak-voice\">\n <button\n type=\"button\"\n :class=\"['ak-voice__play', { 'is-playing': isPlaying }]\"\n :aria-label=\"`播放 ${title}`\"\n :aria-pressed=\"isPlaying\"\n :disabled=\"!src\"\n data-no-toggle\n @click=\"onClick\"\n />\n <a v-if=\"download\" class=\"ak-voice__download\" :href=\"download\" :download=\"downloadName ?? ''\" :aria-label=\"`下载 ${title}`\" :title=\"`下载 ${title}`\">\n <AkIcon name=\"download\" :size=\"16\" />\n </a>\n <div>\n <div class=\"ak-voice__title\">\n {{ title }}\n <span v-if=\"unlock\" class=\"ak-voice__cond\">{{ unlock }}</span>\n <span v-if=\"code\" class=\"ak-code-id\">{{ code }}</span>\n <span v-if=\"isPlaying\" class=\"ak-voice__wave\" aria-hidden=\"true\"><i v-for=\"n in 5\" :key=\"n\" /></span>\n </div>\n <div class=\"ak-voice__text\" :lang=\"lang && HTML_LANG[lang]\">{{ text }}</div>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 档案条目(= 现网 {{人员档案}} 的一段):标题行(中文 + 英文小标 + 右侧解锁条件)+ 正文。\n * 正文里的 <p> 保留换行(white-space: pre-line),游戏文本的 \\n 可以原样放进一个 <p>。\n * 干员页 9 段档案配竖排标签页:AkTabs placement=\"left\" 的每个 AkTabPane 里放一个 AkDossier。\n */\ndefineProps<{\n /** 标题(客观履历) */\n title: string;\n /** 英文小标(Objective Record) */\n en?: string;\n /** 解锁条件(提升信赖至25%以查看更多信息),标题行右侧;locked 时也是遮罩上的文字 */\n unlock?: string;\n /** 未解锁:正文模糊、不可选,盖斜纹 + 🔒 解锁条件(文本仍在 DOM 里,可被搜索) */\n locked?: boolean;\n}>();\n\ndefineSlots<{\n /** 正文:若干 <p>,或键值表 / 属性表 */\n default?: () => unknown;\n}>();\n</script>\n\n<template>\n <div :class=\"['ak-dossier', { 'is-locked': locked }]\" :data-unlock=\"locked ? unlock : undefined\">\n <div class=\"ak-dossier__title\">\n {{ title }}<span v-if=\"en\" class=\"ak-en\">{{ en }}</span><span v-if=\"unlock\" class=\"ak-dossier__unlock\">{{ unlock }}</span>\n </div>\n <slot />\n </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 档案条目(= 现网 {{人员档案}} 的一段):标题行(中文 + 英文小标 + 右侧解锁条件)+ 正文。\n * 正文里的 <p> 保留换行(white-space: pre-line),游戏文本的 \\n 可以原样放进一个 <p>。\n * 干员页 9 段档案配竖排标签页:AkTabs placement=\"left\" 的每个 AkTabPane 里放一个 AkDossier。\n */\ndefineProps<{\n /** 标题(客观履历) */\n title: string;\n /** 英文小标(Objective Record) */\n en?: string;\n /** 解锁条件(提升信赖至25%以查看更多信息),标题行右侧;locked 时也是遮罩上的文字 */\n unlock?: string;\n /** 未解锁:正文模糊、不可选,盖斜纹 + 🔒 解锁条件(文本仍在 DOM 里,可被搜索) */\n locked?: boolean;\n}>();\n\ndefineSlots<{\n /** 正文:若干 <p>,或键值表 / 属性表 */\n default?: () => unknown;\n}>();\n</script>\n\n<template>\n <div :class=\"['ak-dossier', { 'is-locked': locked }]\" :data-unlock=\"locked ? unlock : undefined\">\n <div class=\"ak-dossier__title\">\n {{ title }}<span v-if=\"en\" class=\"ak-en\">{{ en }}</span><span v-if=\"unlock\" class=\"ak-dossier__unlock\">{{ unlock }}</span>\n </div>\n <slot />\n </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 涂黑文本(剧透 / 不予公开):悬停时显出;CSS 版只认 :hover,这里补上点按 / 键盘——\n * 可聚焦(聚焦时显出),点击或 Enter / Space 切换常显,触屏也能看。档案与剧情对话里都用它。\n */\n\n/** 是否常显(点过一次后保持显出) */\nconst revealed = defineModel<boolean>({ default: false });\n\ndefineSlots<{\n /** 被涂黑的文字 */\n default?: () => unknown;\n}>();\n\nfunction toggle() {\n revealed.value = !revealed.value;\n}\n</script>\n\n<template>\n <span\n :class=\"['ak-redacted', { 'is-revealed': revealed }]\"\n role=\"button\"\n tabindex=\"0\"\n :aria-pressed=\"revealed\"\n @click=\"toggle\"\n @keydown.enter.prevent=\"toggle\"\n @keydown.space.prevent=\"toggle\"\n >\n <slot />\n </span>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 涂黑文本(剧透 / 不予公开):悬停时显出;CSS 版只认 :hover,这里补上点按 / 键盘——\n * 可聚焦(聚焦时显出),点击或 Enter / Space 切换常显,触屏也能看。档案与剧情对话里都用它。\n */\n\n/** 是否常显(点过一次后保持显出) */\nconst revealed = defineModel<boolean>({ default: false });\n\ndefineSlots<{\n /** 被涂黑的文字 */\n default?: () => unknown;\n}>();\n\nfunction toggle() {\n revealed.value = !revealed.value;\n}\n</script>\n\n<template>\n <span\n :class=\"['ak-redacted', { 'is-revealed': revealed }]\"\n role=\"button\"\n tabindex=\"0\"\n :aria-pressed=\"revealed\"\n @click=\"toggle\"\n @keydown.enter.prevent=\"toggle\"\n @keydown.space.prevent=\"toggle\"\n >\n <slot />\n </span>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 档案类卡片(干员密录 / 悖论模拟 / 未获得时档案)——现网那几张「————xx」折叠 wikitable 的替身。\n * 结构同 Naive 的 NCard:头(小标 + 标题 + 右侧解锁条件)+ 体 + #footer 页脚(阅读 / 关卡 / 首通奖励);与 AkDossier 同一张脸。\n */\nwithDefaults(\n defineProps<{\n /** 标题(h4) */\n title: string;\n /** 标题前的小标(Record · 密录 1 / Paradox · 悖论模拟) */\n kicker?: string;\n /** 解锁条件(纯文本);要放精英 / 信赖 / 关卡号时改用 #unlock 插槽 */\n unlock?: string;\n /** 解锁条件前的小标 */\n unlockLabel?: string;\n }>(),\n { kicker: undefined, unlock: undefined, unlockLabel: \"解锁条件\" },\n);\n\ndefineSlots<{\n /** 正文:若干 <p>(保留换行) */\n default?: () => unknown;\n /** 解锁条件(代替 unlock) */\n unlock?: () => unknown;\n /** 页脚:AkArchivePlay「阅读密录」、关卡、首通奖励 … */\n footer?: () => unknown;\n}>();\n</script>\n\n<template>\n <div class=\"ak-archive\">\n <div class=\"ak-archive__head\">\n <span v-if=\"kicker\" class=\"ak-archive__kicker\">{{ kicker }}</span>\n <h4 class=\"ak-archive__title\">{{ title }}</h4>\n <span v-if=\"unlock || $slots.unlock\" class=\"ak-archive__req\">\n <span class=\"ak-overline\">{{ unlockLabel }}</span>\n <slot name=\"unlock\">{{ unlock }}</slot>\n </span>\n </div>\n <div class=\"ak-archive__body\"><slot /></div>\n <div v-if=\"$slots.footer\" class=\"ak-archive__foot\"><slot name=\"footer\" /></div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 档案类卡片(干员密录 / 悖论模拟 / 未获得时档案)——现网那几张「————xx」折叠 wikitable 的替身。\n * 结构同 Naive 的 NCard:头(小标 + 标题 + 右侧解锁条件)+ 体 + #footer 页脚(阅读 / 关卡 / 首通奖励);与 AkDossier 同一张脸。\n */\nwithDefaults(\n defineProps<{\n /** 标题(h4) */\n title: string;\n /** 标题前的小标(Record · 密录 1 / Paradox · 悖论模拟) */\n kicker?: string;\n /** 解锁条件(纯文本);要放精英 / 信赖 / 关卡号时改用 #unlock 插槽 */\n unlock?: string;\n /** 解锁条件前的小标 */\n unlockLabel?: string;\n }>(),\n { kicker: undefined, unlock: undefined, unlockLabel: \"解锁条件\" },\n);\n\ndefineSlots<{\n /** 正文:若干 <p>(保留换行) */\n default?: () => unknown;\n /** 解锁条件(代替 unlock) */\n unlock?: () => unknown;\n /** 页脚:AkArchivePlay「阅读密录」、关卡、首通奖励 … */\n footer?: () => unknown;\n}>();\n</script>\n\n<template>\n <div class=\"ak-archive\">\n <div class=\"ak-archive__head\">\n <span v-if=\"kicker\" class=\"ak-archive__kicker\">{{ kicker }}</span>\n <h4 class=\"ak-archive__title\">{{ title }}</h4>\n <span v-if=\"unlock || $slots.unlock\" class=\"ak-archive__req\">\n <span class=\"ak-overline\">{{ unlockLabel }}</span>\n <slot name=\"unlock\">{{ unlock }}</slot>\n </span>\n </div>\n <div class=\"ak-archive__body\"><slot /></div>\n <div v-if=\"$slots.footer\" class=\"ak-archive__foot\"><slot name=\"footer\" /></div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/** 档案卡页脚的「阅读 / 播放」块:黑底 + 播放三角 + 文字,悬停变主色。有 href 是链接(去密录页),没有是按钮(发 click) */\ndefineProps<{\n /** 链接地址(陈/干员密录/1);不写就渲染成 <button> */\n href?: string;\n}>();\n\ndefineSlots<{\n /** 文字(阅读密录 · 一鼓作气) */\n default?: () => unknown;\n}>();\n</script>\n\n<template>\n <component :is=\"href ? 'a' : 'button'\" class=\"ak-archive__play\" :href=\"href\" :type=\"href ? undefined : 'button'\">\n <span class=\"ak-voice__play\" aria-hidden=\"true\" /><slot />\n </component>\n</template>\n","<script setup lang=\"ts\">\n/** 档案卡页脚的「阅读 / 播放」块:黑底 + 播放三角 + 文字,悬停变主色。有 href 是链接(去密录页),没有是按钮(发 click) */\ndefineProps<{\n /** 链接地址(陈/干员密录/1);不写就渲染成 <button> */\n href?: string;\n}>();\n\ndefineSlots<{\n /** 文字(阅读密录 · 一鼓作气) */\n default?: () => unknown;\n}>();\n</script>\n\n<template>\n <component :is=\"href ? 'a' : 'button'\" class=\"ak-archive__play\" :href=\"href\" :type=\"href ? undefined : 'button'\">\n <span class=\"ak-voice__play\" aria-hidden=\"true\" /><slot />\n </component>\n</template>\n","<script setup lang=\"ts\">\n/** 剧情对话:一个 <dl>,说话人一列右对齐(主色粗体)、台词一列;里面放若干 AkDialogueLine。分段就是几个 AkDialogue 之间插小标题 */\ndefineSlots<{\n /** 若干 AkDialogueLine */\n default?: () => unknown;\n}>();\n</script>\n\n<template>\n <dl class=\"ak-dialogue\"><slot /></dl>\n</template>\n","<script setup lang=\"ts\">\n/** 剧情对话:一个 <dl>,说话人一列右对齐(主色粗体)、台词一列;里面放若干 AkDialogueLine。分段就是几个 AkDialogue 之间插小标题 */\ndefineSlots<{\n /** 若干 AkDialogueLine */\n default?: () => unknown;\n}>();\n</script>\n\n<template>\n <dl class=\"ak-dialogue\"><slot /></dl>\n</template>\n","<script setup lang=\"ts\">\n/** 剧情对话的一句:输出 <dt>(说话人)+ <dd>(台词)。只能放在 AkDialogue 里 */\nconst props = defineProps<{\n /** 说话人;不写(也没有 #speaker 插槽)就是旁白:说话人列写「旁白」,整句灰色斜体 */\n speaker?: string;\n}>();\n\nconst slots = defineSlots<{\n /** 台词 */\n default?: () => unknown;\n /** 说话人(代替 speaker,比如身份要涂黑时放 AkRedacted) */\n speaker?: () => unknown;\n}>();\n\n/** 插槽不是响应式的,放在渲染期判断 */\nconst isNarrator = () => !props.speaker && !slots.speaker;\n</script>\n\n<template>\n <dt :class=\"{ narrator: isNarrator() }\"><slot name=\"speaker\">{{ speaker ?? \"旁白\" }}</slot></dt>\n <dd :class=\"{ narrator: isNarrator() }\"><slot /></dd>\n</template>\n","<script setup lang=\"ts\">\n/** 剧情对话的一句:输出 <dt>(说话人)+ <dd>(台词)。只能放在 AkDialogue 里 */\nconst props = defineProps<{\n /** 说话人;不写(也没有 #speaker 插槽)就是旁白:说话人列写「旁白」,整句灰色斜体 */\n speaker?: string;\n}>();\n\nconst slots = defineSlots<{\n /** 台词 */\n default?: () => unknown;\n /** 说话人(代替 speaker,比如身份要涂黑时放 AkRedacted) */\n speaker?: () => unknown;\n}>();\n\n/** 插槽不是响应式的,放在渲染期判断 */\nconst isNarrator = () => !props.speaker && !slots.speaker;\n</script>\n\n<template>\n <dt :class=\"{ narrator: isNarrator() }\"><slot name=\"speaker\">{{ speaker ?? \"旁白\" }}</slot></dt>\n <dd :class=\"{ narrator: isNarrator() }\"><slot /></dd>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 理智消耗:六边形 + 数字(游戏内理智图标的剪影,不用图片)。读屏念「理智 6」——六边形是纯装饰,前缀字藏在 sr-only 里。\n */\ndefineProps<{\n /** 消耗的理智 */\n value: number | string;\n}>();\n</script>\n\n<template>\n <span class=\"ak-sanity\"><span class=\"ak-sr-only\">理智 </span>{{ value }}</span>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 理智消耗:六边形 + 数字(游戏内理智图标的剪影,不用图片)。读屏念「理智 6」——六边形是纯装饰,前缀字藏在 sr-only 里。\n */\ndefineProps<{\n /** 消耗的理智 */\n value: number | string;\n}>();\n</script>\n\n<template>\n <span class=\"ak-sanity\"><span class=\"ak-sr-only\">理智 </span>{{ value }}</span>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nimport AkSanity from \"./AkSanity.vue\";\n\nconst props = withDefaults(\n defineProps<{\n /** 关卡编号(1-7 / H6-4 / TO-EX-1),展示字大号 */\n code: string;\n /** 关卡名 */\n name?: string;\n /** 编号下的小字:章节 / 类型(Main · Chapter 1 / Hard / Story) */\n caption?: string;\n /** 左侧类型色条:hard 磨难红 · ex 深红 · story 灰;default 无色条。按活动分好组的列表里关卡码已说明类型,不必再上色 */\n variant?: \"default\" | \"hard\" | \"ex\" | \"story\";\n /** 理智消耗:元信息行里的六边形 + 数字 */\n sanity?: number | string;\n /** 推荐等级(LV.30 / E2 LV.40),元信息行里显示为「推荐 LV.30」 */\n level?: string;\n /** 链接到关卡页:整张卡是链接(悬停描边变强调色) */\n href?: string;\n }>(),\n { name: undefined, caption: undefined, variant: \"default\", sanity: undefined, level: undefined, href: undefined },\n);\n\nconst slots = defineSlots<{\n /** 元信息行末尾追加的项(剧情关卡 / 前往关卡页 »),每项一个元素,行内 flex 间距 10 */\n meta?: () => unknown;\n}>();\n\n/** 没有元信息行时关卡名直接作网格的第二列(首页「近期新增」的紧凑格:名字可以单独省略号截断) */\nconst hasMeta = () => props.sanity !== undefined || !!props.level || !!slots.meta; // 插槽不是响应式的,放在渲染期判断\n\nconst classes = computed(() => [\n \"ak-stage\",\n props.variant !== \"default\" && `ak-stage--${props.variant}`,\n // 整块是链接:不带 not-prose 时正文的 a:visited(0,1,1)会压过 .ak-stage 的 color: inherit\n { \"ak-not-prose\": !!props.href },\n]);\n</script>\n\n<template>\n <component :is=\"href ? 'a' : 'div'\" :class=\"classes\" :href=\"href\">\n <span class=\"ak-stage__code\">{{ code }}<small v-if=\"caption\">{{ caption }}</small></span>\n <span v-if=\"hasMeta()\">\n <span v-if=\"name\" class=\"ak-stage__name\">{{ name }}</span>\n <span class=\"ak-stage__meta\">\n <span v-if=\"sanity !== undefined\"><AkSanity :value=\"sanity\" /></span>\n <span v-if=\"level\">推荐 <b>{{ level }}</b></span>\n <slot name=\"meta\" />\n </span>\n </span>\n <span v-else-if=\"name\" class=\"ak-stage__name\">{{ name }}</span>\n </component>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nimport AkSanity from \"./AkSanity.vue\";\n\nconst props = withDefaults(\n defineProps<{\n /** 关卡编号(1-7 / H6-4 / TO-EX-1),展示字大号 */\n code: string;\n /** 关卡名 */\n name?: string;\n /** 编号下的小字:章节 / 类型(Main · Chapter 1 / Hard / Story) */\n caption?: string;\n /** 左侧类型色条:hard 磨难红 · ex 深红 · story 灰;default 无色条。按活动分好组的列表里关卡码已说明类型,不必再上色 */\n variant?: \"default\" | \"hard\" | \"ex\" | \"story\";\n /** 理智消耗:元信息行里的六边形 + 数字 */\n sanity?: number | string;\n /** 推荐等级(LV.30 / E2 LV.40),元信息行里显示为「推荐 LV.30」 */\n level?: string;\n /** 链接到关卡页:整张卡是链接(悬停描边变强调色) */\n href?: string;\n }>(),\n { name: undefined, caption: undefined, variant: \"default\", sanity: undefined, level: undefined, href: undefined },\n);\n\nconst slots = defineSlots<{\n /** 元信息行末尾追加的项(剧情关卡 / 前往关卡页 »),每项一个元素,行内 flex 间距 10 */\n meta?: () => unknown;\n}>();\n\n/** 没有元信息行时关卡名直接作网格的第二列(首页「近期新增」的紧凑格:名字可以单独省略号截断) */\nconst hasMeta = () => props.sanity !== undefined || !!props.level || !!slots.meta; // 插槽不是响应式的,放在渲染期判断\n\nconst classes = computed(() => [\n \"ak-stage\",\n props.variant !== \"default\" && `ak-stage--${props.variant}`,\n // 整块是链接:不带 not-prose 时正文的 a:visited(0,1,1)会压过 .ak-stage 的 color: inherit\n { \"ak-not-prose\": !!props.href },\n]);\n</script>\n\n<template>\n <component :is=\"href ? 'a' : 'div'\" :class=\"classes\" :href=\"href\">\n <span class=\"ak-stage__code\">{{ code }}<small v-if=\"caption\">{{ caption }}</small></span>\n <span v-if=\"hasMeta()\">\n <span v-if=\"name\" class=\"ak-stage__name\">{{ name }}</span>\n <span class=\"ak-stage__meta\">\n <span v-if=\"sanity !== undefined\"><AkSanity :value=\"sanity\" /></span>\n <span v-if=\"level\">推荐 <b>{{ level }}</b></span>\n <slot name=\"meta\" />\n </span>\n </span>\n <span v-else-if=\"name\" class=\"ak-stage__name\">{{ name }}</span>\n </component>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 行内关卡号:黑白反转的小方块(展示字),放在正文 / 解锁条件里(「3星通关主题曲 5-8」)。关卡号写在默认插槽里。\n */\ndefineProps<{\n /** hard = 红底(磨难 / 险地关卡号) */\n variant?: \"default\" | \"hard\";\n /** 链接到关卡页 */\n href?: string;\n}>();\n\ndefineSlots<{\n /** 关卡号(5-8 / H6-4) */\n default?: () => unknown;\n}>();\n</script>\n\n<template>\n <!-- 链接版带 ak-not-prose:正文的 a:visited / a:hover 会把反白字染成链接色 -->\n <component\n :is=\"href ? 'a' : 'span'\"\n :class=\"['ak-stage-code', variant === 'hard' && 'ak-stage-code--hard', href && 'ak-not-prose']\"\n :href=\"href\"\n >\n <slot />\n </component>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 行内关卡号:黑白反转的小方块(展示字),放在正文 / 解锁条件里(「3星通关主题曲 5-8」)。关卡号写在默认插槽里。\n */\ndefineProps<{\n /** hard = 红底(磨难 / 险地关卡号) */\n variant?: \"default\" | \"hard\";\n /** 链接到关卡页 */\n href?: string;\n}>();\n\ndefineSlots<{\n /** 关卡号(5-8 / H6-4) */\n default?: () => unknown;\n}>();\n</script>\n\n<template>\n <!-- 链接版带 ak-not-prose:正文的 a:visited / a:hover 会把反白字染成链接色 -->\n <component\n :is=\"href ? 'a' : 'span'\"\n :class=\"['ak-stage-code', variant === 'hard' && 'ak-stage-code--hard', href && 'ak-not-prose']\"\n :href=\"href\"\n >\n <slot />\n </component>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nexport type EnemyRank = \"normal\" | \"elite\" | \"boss\";\n\nconst props = withDefaults(\n defineProps<{\n /** 敌人名 */\n name: string;\n /** 编号(B003 / E020 / N001),显示在级别后面:「BOSS · B003」 */\n code?: string;\n /** 级别(游戏 enemyLevel):normal 普通 · elite 精英(橙色条)· boss 领袖(红色条);级别字总会写出来,不只靠色条 */\n variant?: EnemyRank;\n /** 头像地址(方图,裁成 64px 圆);不写时是深色空圆 */\n src?: string;\n /** 威胁度:点亮几枚菱形 */\n level?: number;\n /** 菱形总数 */\n levelMax?: number;\n }>(),\n { code: undefined, variant: \"normal\", src: undefined, level: undefined, levelMax: 4 },\n);\n\ndefineSlots<{\n /** 名字 / 威胁度下面追加的内容(属性、能力摘要) */\n default?: () => unknown;\n}>();\n\nconst RANK: Record<EnemyRank, string> = { normal: \"NORMAL\", elite: \"ELITE\", boss: \"BOSS\" };\n\nconst classes = computed(() => [\"ak-enemy\", props.variant !== \"normal\" && `ak-enemy--${props.variant}`]);\nconst codeText = computed(() => [RANK[props.variant], props.code].filter(Boolean).join(\" · \"));\n</script>\n\n<template>\n <div :class=\"classes\">\n <img v-if=\"src\" class=\"ak-enemy__img\" :src=\"src\" alt=\"\" />\n <div v-else class=\"ak-enemy__img\" />\n <div>\n <div class=\"ak-enemy__code\">{{ codeText }}</div>\n <div class=\"ak-enemy__name\">{{ name }}</div>\n <div v-if=\"level !== undefined\" class=\"ak-enemy__level\" role=\"img\" :aria-label=\"`威胁度 ${level} / ${levelMax}`\">\n <i v-for=\"n in levelMax\" :key=\"n\" :class=\"{ on: n <= level }\" />\n </div>\n <slot />\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nexport type EnemyRank = \"normal\" | \"elite\" | \"boss\";\n\nconst props = withDefaults(\n defineProps<{\n /** 敌人名 */\n name: string;\n /** 编号(B003 / E020 / N001),显示在级别后面:「BOSS · B003」 */\n code?: string;\n /** 级别(游戏 enemyLevel):normal 普通 · elite 精英(橙色条)· boss 领袖(红色条);级别字总会写出来,不只靠色条 */\n variant?: EnemyRank;\n /** 头像地址(方图,裁成 64px 圆);不写时是深色空圆 */\n src?: string;\n /** 威胁度:点亮几枚菱形 */\n level?: number;\n /** 菱形总数 */\n levelMax?: number;\n }>(),\n { code: undefined, variant: \"normal\", src: undefined, level: undefined, levelMax: 4 },\n);\n\ndefineSlots<{\n /** 名字 / 威胁度下面追加的内容(属性、能力摘要) */\n default?: () => unknown;\n}>();\n\nconst RANK: Record<EnemyRank, string> = { normal: \"NORMAL\", elite: \"ELITE\", boss: \"BOSS\" };\n\nconst classes = computed(() => [\"ak-enemy\", props.variant !== \"normal\" && `ak-enemy--${props.variant}`]);\nconst codeText = computed(() => [RANK[props.variant], props.code].filter(Boolean).join(\" · \"));\n</script>\n\n<template>\n <div :class=\"classes\">\n <img v-if=\"src\" class=\"ak-enemy__img\" :src=\"src\" alt=\"\" />\n <div v-else class=\"ak-enemy__img\" />\n <div>\n <div class=\"ak-enemy__code\">{{ codeText }}</div>\n <div class=\"ak-enemy__name\">{{ name }}</div>\n <div v-if=\"level !== undefined\" class=\"ak-enemy__level\" role=\"img\" :aria-label=\"`威胁度 ${level} / ${levelMax}`\">\n <i v-for=\"n in levelMax\" :key=\"n\" :class=\"{ on: n <= level }\" />\n </div>\n <slot />\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nconst props = withDefaults(\n defineProps<{\n /** 势力徽标(游戏 spritepack/ui_camp_logo 的白色线稿,亮色下由 CSS 反相成黑) */\n src: string;\n /** 势力名:显示在徽标右侧;logoOnly 时作图片 alt 和悬停提示 */\n name: string;\n /** 徽标高度:md 28 · lg 48(px) */\n size?: \"md\" | \"lg\";\n /** 外观:default 线稿跟主题反相 · box 深底方块、原色白线稿(两套主题下都一样) */\n variant?: \"default\" | \"box\";\n /** 只显示徽标(名字进 alt 与悬停提示) */\n logoOnly?: boolean;\n }>(),\n { size: \"md\", variant: \"default\" },\n);\n\nconst classes = computed(() => [\n \"ak-camp\",\n props.size !== \"md\" && `ak-camp--${props.size}`,\n props.variant !== \"default\" && `ak-camp--${props.variant}`,\n]);\n</script>\n\n<template>\n <span :class=\"classes\" :data-ak-tip=\"logoOnly ? name : undefined\">\n <img :src=\"src\" :alt=\"logoOnly ? name : ''\" />\n <template v-if=\"!logoOnly\">{{ name }}</template>\n </span>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nconst props = withDefaults(\n defineProps<{\n /** 势力徽标(游戏 spritepack/ui_camp_logo 的白色线稿,亮色下由 CSS 反相成黑) */\n src: string;\n /** 势力名:显示在徽标右侧;logoOnly 时作图片 alt 和悬停提示 */\n name: string;\n /** 徽标高度:md 28 · lg 48(px) */\n size?: \"md\" | \"lg\";\n /** 外观:default 线稿跟主题反相 · box 深底方块、原色白线稿(两套主题下都一样) */\n variant?: \"default\" | \"box\";\n /** 只显示徽标(名字进 alt 与悬停提示) */\n logoOnly?: boolean;\n }>(),\n { size: \"md\", variant: \"default\" },\n);\n\nconst classes = computed(() => [\n \"ak-camp\",\n props.size !== \"md\" && `ak-camp--${props.size}`,\n props.variant !== \"default\" && `ak-camp--${props.variant}`,\n]);\n</script>\n\n<template>\n <span :class=\"classes\" :data-ak-tip=\"logoOnly ? name : undefined\">\n <img :src=\"src\" :alt=\"logoOnly ? name : ''\" />\n <template v-if=\"!logoOnly\">{{ name }}</template>\n </span>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nconst props = withDefaults(\n defineProps<{\n /** 活动名 */\n title: string;\n /** 标题上方的类型行(Side Story · 进行中 / 寻访 · 已结束),强调色、大写字距 */\n kind?: string;\n /** 起止时间(2026.08.08 16:00 — 09.07 03:59) */\n time?: string;\n /** 横幅图地址(21:9 裁切铺满);不写且没有 #cover 插槽时不出横幅 */\n cover?: string;\n /** 状态:live 进行中(类型行前闪烁红点)· ended 已结束(类型行转灰)· default 不标 */\n status?: \"default\" | \"live\" | \"ended\";\n }>(),\n { kind: undefined, time: undefined, cover: undefined, status: \"default\" },\n);\n\ndefineSlots<{\n /** 横幅(代替 cover):自己放 .ak-event__banner 元素 */\n cover?: () => unknown;\n /** 标题(代替 title,如包一层链接) */\n title?: () => unknown;\n /** 时间下面的内容:倒计时 AkCountdown、按钮 */\n default?: () => unknown;\n}>();\n\nconst classes = computed(() => [\"ak-event\", { \"is-live\": props.status === \"live\", \"is-ended\": props.status === \"ended\" }]);\n</script>\n\n<template>\n <div :class=\"classes\">\n <slot name=\"cover\"><img v-if=\"cover\" class=\"ak-event__banner\" :src=\"cover\" alt=\"\" /></slot>\n <div class=\"ak-event__body\">\n <div v-if=\"kind\" class=\"ak-event__type\">{{ kind }}</div>\n <div class=\"ak-event__title\"><slot name=\"title\">{{ title }}</slot></div>\n <div v-if=\"time\" class=\"ak-event__time\">{{ time }}</div>\n <slot />\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nconst props = withDefaults(\n defineProps<{\n /** 活动名 */\n title: string;\n /** 标题上方的类型行(Side Story · 进行中 / 寻访 · 已结束),强调色、大写字距 */\n kind?: string;\n /** 起止时间(2026.08.08 16:00 — 09.07 03:59) */\n time?: string;\n /** 横幅图地址(21:9 裁切铺满);不写且没有 #cover 插槽时不出横幅 */\n cover?: string;\n /** 状态:live 进行中(类型行前闪烁红点)· ended 已结束(类型行转灰)· default 不标 */\n status?: \"default\" | \"live\" | \"ended\";\n }>(),\n { kind: undefined, time: undefined, cover: undefined, status: \"default\" },\n);\n\ndefineSlots<{\n /** 横幅(代替 cover):自己放 .ak-event__banner 元素 */\n cover?: () => unknown;\n /** 标题(代替 title,如包一层链接) */\n title?: () => unknown;\n /** 时间下面的内容:倒计时 AkCountdown、按钮 */\n default?: () => unknown;\n}>();\n\nconst classes = computed(() => [\"ak-event\", { \"is-live\": props.status === \"live\", \"is-ended\": props.status === \"ended\" }]);\n</script>\n\n<template>\n <div :class=\"classes\">\n <slot name=\"cover\"><img v-if=\"cover\" class=\"ak-event__banner\" :src=\"cover\" alt=\"\" /></slot>\n <div class=\"ak-event__body\">\n <div v-if=\"kind\" class=\"ak-event__type\">{{ kind }}</div>\n <div class=\"ak-event__title\"><slot name=\"title\">{{ title }}</slot></div>\n <div v-if=\"time\" class=\"ak-event__time\">{{ time }}</div>\n <slot />\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, onBeforeUnmount, onMounted, ref, watch } from \"vue\";\n\nconst props = withDefaults(\n defineProps<{\n /** 截止时刻(ISO 串 / 时间戳 / Date),按当前时间实时倒数——活动、卡池、周常刷新都用它 */\n until?: string | number | Date;\n /** 或者给剩余毫秒数,从挂载时起倒数(同 Naive 的 NCountdown);有 until 时忽略 */\n duration?: number;\n /** 是否走字;false 时停在当前读数(duration 模式下恢复后接着倒数) */\n active?: boolean;\n /** 最小单位:min 到分(默认,每分钟刷新)· sec 到秒 */\n precision?: \"min\" | \"sec\";\n /** 最多显示几格,从最大的单位数起:2 → 「03 days 14 hrs」/ 不足一天时「14 hrs 27 min」(首页幻灯片);不写则一直显示到 precision */\n parts?: number;\n }>(),\n { until: undefined, duration: undefined, active: true, precision: \"min\", parts: undefined },\n);\n\nconst emit = defineEmits<{\n /** 倒数到 0(之后整个倒计时不再渲染) */\n finish: [];\n}>();\n\nconst initial = () => (props.until !== undefined ? new Date(props.until).getTime() - Date.now() : (props.duration ?? 0));\n\n/** 剩余毫秒;到点或无效日期(NaN)时不渲染 */\nconst remaining = ref(initial());\n/** 走字时的截止时间戳 */\nlet endAt = 0;\nlet timer: ReturnType<typeof setTimeout> | undefined;\n\n/** 下一次读数变化时再醒:到分时最多一分钟一次,不每秒重渲染 */\nfunction schedule() {\n clearTimeout(timer);\n if (!props.active || !(remaining.value > 0)) return;\n const unit = props.precision === \"sec\" ? 1e3 : 6e4;\n timer = setTimeout(tick, (remaining.value % unit || unit) + 20);\n}\nfunction tick() {\n const was = remaining.value;\n remaining.value = endAt - Date.now();\n if (was > 0 && !(remaining.value > 0)) emit(\"finish\");\n schedule();\n}\nfunction start() {\n endAt = props.until !== undefined ? new Date(props.until).getTime() : Date.now() + remaining.value;\n tick();\n}\n/** 停下时把读数补到此刻:duration 模式恢复后从这里接着倒数,不丢上一次刷新以来走掉的时间 */\nfunction stop() {\n clearTimeout(timer);\n if (endAt) remaining.value = endAt - Date.now();\n}\n\nonMounted(() => props.active && start());\nonBeforeUnmount(() => clearTimeout(timer));\nwatch(\n () => props.active,\n on => (on ? start() : stop()),\n);\nwatch([() => props.until, () => props.duration], () => {\n remaining.value = initial();\n if (props.active) start();\n});\n\nconst UNITS = [\n { ms: 864e5, mod: Infinity, unit: \"days\", zh: \"天\" },\n { ms: 36e5, mod: 24, unit: \"hrs\", zh: \"小时\" },\n { ms: 6e4, mod: 60, unit: \"min\", zh: \"分\" },\n { ms: 1e3, mod: 60, unit: \"sec\", zh: \"秒\" },\n] as const;\n\n/** 不足一天时从「时」起(时总会显示,00 也显示);到 precision 为止,再按 parts 截断 */\nconst cells = computed(() => {\n const ms = Math.max(0, remaining.value);\n const all = UNITS.map(u => ({ ...u, value: Math.floor(ms / u.ms) % u.mod }));\n const shown = all.slice(all[0].value ? 0 : 1, props.precision === \"sec\" ? 4 : 3);\n return props.parts ? shown.slice(0, props.parts) : shown;\n});\nconst spoken = computed(() => `剩余 ${cells.value.map(c => `${c.value} ${c.zh}`).join(\" \")}`);\nconst pad2 = (n: number) => String(n).padStart(2, \"0\");\n</script>\n\n<template>\n <!-- role=\"timer\"(隐式 aria-live=off,不会每分钟打断读屏);读数是英文单位,读屏名给中文 -->\n <span v-if=\"remaining > 0\" class=\"ak-countdown\" role=\"timer\" :aria-label=\"spoken\">\n <span v-for=\"c in cells\" :key=\"c.unit\" aria-hidden=\"true\"><b>{{ pad2(c.value) }}</b><small>{{ c.unit }}</small></span>\n </span>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, onBeforeUnmount, onMounted, ref, watch } from \"vue\";\n\nconst props = withDefaults(\n defineProps<{\n /** 截止时刻(ISO 串 / 时间戳 / Date),按当前时间实时倒数——活动、卡池、周常刷新都用它 */\n until?: string | number | Date;\n /** 或者给剩余毫秒数,从挂载时起倒数(同 Naive 的 NCountdown);有 until 时忽略 */\n duration?: number;\n /** 是否走字;false 时停在当前读数(duration 模式下恢复后接着倒数) */\n active?: boolean;\n /** 最小单位:min 到分(默认,每分钟刷新)· sec 到秒 */\n precision?: \"min\" | \"sec\";\n /** 最多显示几格,从最大的单位数起:2 → 「03 days 14 hrs」/ 不足一天时「14 hrs 27 min」(首页幻灯片);不写则一直显示到 precision */\n parts?: number;\n }>(),\n { until: undefined, duration: undefined, active: true, precision: \"min\", parts: undefined },\n);\n\nconst emit = defineEmits<{\n /** 倒数到 0(之后整个倒计时不再渲染) */\n finish: [];\n}>();\n\nconst initial = () => (props.until !== undefined ? new Date(props.until).getTime() - Date.now() : (props.duration ?? 0));\n\n/** 剩余毫秒;到点或无效日期(NaN)时不渲染 */\nconst remaining = ref(initial());\n/** 走字时的截止时间戳 */\nlet endAt = 0;\nlet timer: ReturnType<typeof setTimeout> | undefined;\n\n/** 下一次读数变化时再醒:到分时最多一分钟一次,不每秒重渲染 */\nfunction schedule() {\n clearTimeout(timer);\n if (!props.active || !(remaining.value > 0)) return;\n const unit = props.precision === \"sec\" ? 1e3 : 6e4;\n timer = setTimeout(tick, (remaining.value % unit || unit) + 20);\n}\nfunction tick() {\n const was = remaining.value;\n remaining.value = endAt - Date.now();\n if (was > 0 && !(remaining.value > 0)) emit(\"finish\");\n schedule();\n}\nfunction start() {\n endAt = props.until !== undefined ? new Date(props.until).getTime() : Date.now() + remaining.value;\n tick();\n}\n/** 停下时把读数补到此刻:duration 模式恢复后从这里接着倒数,不丢上一次刷新以来走掉的时间 */\nfunction stop() {\n clearTimeout(timer);\n if (endAt) remaining.value = endAt - Date.now();\n}\n\nonMounted(() => props.active && start());\nonBeforeUnmount(() => clearTimeout(timer));\nwatch(\n () => props.active,\n on => (on ? start() : stop()),\n);\nwatch([() => props.until, () => props.duration], () => {\n remaining.value = initial();\n if (props.active) start();\n});\n\nconst UNITS = [\n { ms: 864e5, mod: Infinity, unit: \"days\", zh: \"天\" },\n { ms: 36e5, mod: 24, unit: \"hrs\", zh: \"小时\" },\n { ms: 6e4, mod: 60, unit: \"min\", zh: \"分\" },\n { ms: 1e3, mod: 60, unit: \"sec\", zh: \"秒\" },\n] as const;\n\n/** 不足一天时从「时」起(时总会显示,00 也显示);到 precision 为止,再按 parts 截断 */\nconst cells = computed(() => {\n const ms = Math.max(0, remaining.value);\n const all = UNITS.map(u => ({ ...u, value: Math.floor(ms / u.ms) % u.mod }));\n const shown = all.slice(all[0].value ? 0 : 1, props.precision === \"sec\" ? 4 : 3);\n return props.parts ? shown.slice(0, props.parts) : shown;\n});\nconst spoken = computed(() => `剩余 ${cells.value.map(c => `${c.value} ${c.zh}`).join(\" \")}`);\nconst pad2 = (n: number) => String(n).padStart(2, \"0\");\n</script>\n\n<template>\n <!-- role=\"timer\"(隐式 aria-live=off,不会每分钟打断读屏);读数是英文单位,读屏名给中文 -->\n <span v-if=\"remaining > 0\" class=\"ak-countdown\" role=\"timer\" :aria-label=\"spoken\">\n <span v-for=\"c in cells\" :key=\"c.unit\" aria-hidden=\"true\"><b>{{ pad2(c.value) }}</b><small>{{ c.unit }}</small></span>\n </span>\n</template>\n","<script setup lang=\"ts\">\n/**\n * Breaking news 横幅(游戏主界面那条):左边矩形红块 + 反色底的一行正文,太长时省略号截断。\n * 天然只装一条——同时有好几条活动要列时用列表(首页「进行中的网页活动」),别往这里塞。\n */\nwithDefaults(\n defineProps<{\n /** 红块里的字(Bender 大写) */\n title?: string;\n }>(),\n { title: \"Breaking News\" },\n);\n\ndefineSlots<{\n /** 红块内容(代替 title) */\n title?: () => unknown;\n /** 正文:一行,可含链接 / 加粗;超长省略号截断 */\n default?: () => unknown;\n}>();\n</script>\n\n<template>\n <div class=\"ak-news\">\n <span class=\"ak-news__label\"><slot name=\"title\">{{ title }}</slot></span>\n <span class=\"ak-news__text\"><slot /></span>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * Breaking news 横幅(游戏主界面那条):左边矩形红块 + 反色底的一行正文,太长时省略号截断。\n * 天然只装一条——同时有好几条活动要列时用列表(首页「进行中的网页活动」),别往这里塞。\n */\nwithDefaults(\n defineProps<{\n /** 红块里的字(Bender 大写) */\n title?: string;\n }>(),\n { title: \"Breaking News\" },\n);\n\ndefineSlots<{\n /** 红块内容(代替 title) */\n title?: () => unknown;\n /** 正文:一行,可含链接 / 加粗;超长省略号截断 */\n default?: () => unknown;\n}>();\n</script>\n\n<template>\n <div class=\"ak-news\">\n <span class=\"ak-news__label\"><slot name=\"title\">{{ title }}</slot></span>\n <span class=\"ak-news__text\"><slot /></span>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 大标题横幅(官网风):黑底 + 青色 overline + 大号拉丁标题(中文副标) + 青色横条 + 说明,右侧竖直青色色面叠网点。\n * 两套主题下都是黑底白字。是静态的「页头横幅」,不是轮播——首页的活动轮播是页面自己的结构(见文档页说明)。\n */\nwithDefaults(\n defineProps<{\n /** 大标题(展示字、全大写),拉丁字母最好看:PRTS / RHODES ISLAND */\n title: string;\n /** 标题下的中文副标(正文字体、半号) */\n subtitle?: string;\n /** 标题上方的青色小字(PRTS.WIKI · NEW SKIN DESIGN SYSTEM) */\n eyebrow?: string;\n /** 说明文字(最宽 60 字,70% 白) */\n description?: string;\n /** 标题下的青色横条 */\n bar?: boolean;\n /** 右侧竖直青色色面 */\n side?: boolean;\n }>(),\n { subtitle: undefined, eyebrow: undefined, description: undefined, bar: true, side: true },\n);\n\ndefineSlots<{\n /** 标题(代替 title / subtitle);中文副标放 <span class=\"cn\"> */\n title?: () => unknown;\n /** 说明(代替 description),放在 <p> 里——只放行内内容 */\n description?: () => unknown;\n /** 说明下面的内容(按钮等) */\n default?: () => unknown;\n}>();\n</script>\n\n<template>\n <div class=\"ak-hero\">\n <div v-if=\"eyebrow\" class=\"ak-hero__eyebrow\">{{ eyebrow }}</div>\n <h2 class=\"ak-hero__title\">\n <slot name=\"title\">{{ title }}<span v-if=\"subtitle\" class=\"cn\">{{ subtitle }}</span></slot>\n </h2>\n <div v-if=\"bar\" class=\"ak-hero__bar\" />\n <p v-if=\"description || $slots.description\" class=\"ak-hero__desc\"><slot name=\"description\">{{ description }}</slot></p>\n <slot />\n <div v-if=\"side\" class=\"ak-hero__side\" />\n </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 大标题横幅(官网风):黑底 + 青色 overline + 大号拉丁标题(中文副标) + 青色横条 + 说明,右侧竖直青色色面叠网点。\n * 两套主题下都是黑底白字。是静态的「页头横幅」,不是轮播——首页的活动轮播是页面自己的结构(见文档页说明)。\n */\nwithDefaults(\n defineProps<{\n /** 大标题(展示字、全大写),拉丁字母最好看:PRTS / RHODES ISLAND */\n title: string;\n /** 标题下的中文副标(正文字体、半号) */\n subtitle?: string;\n /** 标题上方的青色小字(PRTS.WIKI · NEW SKIN DESIGN SYSTEM) */\n eyebrow?: string;\n /** 说明文字(最宽 60 字,70% 白) */\n description?: string;\n /** 标题下的青色横条 */\n bar?: boolean;\n /** 右侧竖直青色色面 */\n side?: boolean;\n }>(),\n { subtitle: undefined, eyebrow: undefined, description: undefined, bar: true, side: true },\n);\n\ndefineSlots<{\n /** 标题(代替 title / subtitle);中文副标放 <span class=\"cn\"> */\n title?: () => unknown;\n /** 说明(代替 description),放在 <p> 里——只放行内内容 */\n description?: () => unknown;\n /** 说明下面的内容(按钮等) */\n default?: () => unknown;\n}>();\n</script>\n\n<template>\n <div class=\"ak-hero\">\n <div v-if=\"eyebrow\" class=\"ak-hero__eyebrow\">{{ eyebrow }}</div>\n <h2 class=\"ak-hero__title\">\n <slot name=\"title\">{{ title }}<span v-if=\"subtitle\" class=\"cn\">{{ subtitle }}</span></slot>\n </h2>\n <div v-if=\"bar\" class=\"ak-hero__bar\" />\n <p v-if=\"description || $slots.description\" class=\"ak-hero__desc\"><slot name=\"description\">{{ description }}</slot></p>\n <slot />\n <div v-if=\"side\" class=\"ak-hero__side\" />\n </div>\n</template>\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["_openBlock","_createBlock","_resolveDynamicComponent","_withCtx","_renderSlot","_sfc_main","_hoisted_1","_openBlock","_createElementBlock","_sfc_main","_useSlots","_openBlock","_createBlock","_resolveDynamicComponent","_normalizeClass","_withCtx","AkIcon","_createElementBlock","_Fragment","_createCommentVNode","_renderSlot","_sfc_main","_hoisted_1","props","_openBlock","_createElementBlock","_renderSlot","_sfc_main","_hoisted_1","_hoisted_2","_hoisted_3","_openBlock","_createElementBlock","_normalizeClass","_createCommentVNode","_unref","_renderSlot","_sfc_main","$slots","_hoisted_1","_hoisted_2","_hoisted_3","_openBlock","_createElementBlock","_normalizeClass","_createElementVNode","_renderSlot","_createVNode","AkIcon","_createTextVNode","_toDisplayString","_createCommentVNode","_sfc_main","_renderSlot","_createTextVNode","_toDisplayString","_sfc_main","_hoisted_1","_openBlock","_createElementBlock","_renderSlot","_sfc_main","_hoisted_1","_hoisted_2","_useModel","_useSlots","AkTabPane","AkTab","_openBlock","_createElementBlock","_normalizeClass","_Fragment","_renderList","_createElementVNode","_createVNode","_createBlock","_createCommentVNode","_sfc_main","$slots","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_openBlock","_createBlock","_resolveDynamicComponent","_withCtx","_createElementVNode","_normalizeClass","_createElementBlock","_renderSlot","_createTextVNode","_toDisplayString","_createCommentVNode","_sfc_main","_hoisted_1","props","_openBlock","_createElementBlock","_renderSlot","_sfc_main","_hoisted_1","_useModel","_openBlock","_createElementBlock","_normalizeClass","_createBlock","AkIcon","_createCommentVNode","_renderSlot","_sfc_main","$slots","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_openBlock","_createElementBlock","_renderSlot","_normalizeClass","_Fragment","_toDisplayString","_createCommentVNode","_createElementVNode","_createTextVNode","_sfc_main","$slots","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_useSlots","_openBlock","_createBlock","_resolveDynamicComponent","_normalizeClass","_withCtx","_renderSlot","_createElementBlock","_createCommentVNode","_toDisplayString","_createTextVNode","_createElementVNode","_Fragment","_sfc_main","_sfc_main","_hoisted_1","_sfc_render","_openBlock","_createElementBlock","_renderSlot","$slots","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_useModel","_useSlots","_openBlock","_createElementBlock","_normalizeClass","_createBlock","_resolveDynamicComponent","_withCtx","_unref","_renderSlot","_createTextVNode","_toDisplayString","_createCommentVNode","_Fragment","_createElementVNode","_sfc_main","$slots","_hoisted_1","_hoisted_2","_hoisted_3","_openBlock","_createElementBlock","_normalizeClass","_toDisplayString","_createCommentVNode","_createBlock","_resolveDynamicComponent","_withCtx","_renderSlot","_createTextVNode","_sfc_main","$slots","_hoisted_1","_hoisted_2","_openBlock","_createElementBlock","_renderSlot","_normalizeClass","_sfc_main","_hoisted_1","_hoisted_2","_openBlock","_createElementBlock","_normalizeClass","_renderSlot","_createCommentVNode","_sfc_main","_hoisted_1","_openBlock","_createElementBlock","_Fragment","_renderList","_createBlock","AkAvatar","_withCtx","_createTextVNode","_toDisplayString","_createCommentVNode","_renderSlot","_sfc_main","$slots","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_openBlock","_createElementBlock","_toDisplayString","_renderSlot","_createBlock","AkIcon","_createCommentVNode","_createTextVNode","_sfc_main","$attrs","_openBlock","_createElementBlock","_Fragment","_renderList","_mergeProps","_sfc_main","$slots","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_openBlock","_createElementBlock","_createElementVNode","_renderSlot","_normalizeClass","_normalizeStyle","_Fragment","_createCommentVNode","_createTextVNode","_toDisplayString","_sfc_main","$slots","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_useModel","_openBlock","_createElementBlock","_normalizeClass","_Fragment","_renderSlot","_createBlock","AkIcon","_createCommentVNode","_createElementVNode","_createTextVNode","_toDisplayString","_sfc_main","_hoisted_1","_useModel","_useSlots","_openBlock","_createElementBlock","_mergeProps","_toHandlers","_unref","_createVNode","_createElementVNode","_normalizeClass","_renderSlot","_sfc_main","$slots","_hoisted_1","_hoisted_2","_useModel","_useSlots","_openBlock","_createElementBlock","_mergeProps","_toHandlers","_unref","_createVNode","_createElementVNode","_normalizeClass","_renderSlot","_createTextVNode","_toDisplayString","_createCommentVNode","_sfc_main","_hoisted_1","_hoisted_2","_openBlock","_createElementBlock","_mergeProps","_createBlock","AkIcon","_createCommentVNode","_createTextVNode","_toDisplayString","_createElementVNode","_sfc_main","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_useModel","_useSlots","_openBlock","_createElementBlock","_normalizeClass","_createVNode","_unref","_createElementVNode","_Fragment","_renderList","_toDisplayString","_createBlock","MenuItem","_sfc_main","$slots","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_useModel","_openBlock","_createElementBlock","_normalizeClass","_unref","_renderSlot","_createTextVNode","_toDisplayString","_createBlock","AkButton","_createCommentVNode","_createElementVNode","_withCtx","_sfc_main","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_openBlock","_createElementBlock","_Fragment","_renderSlot","_createBlock","_Teleport","_createElementVNode","_renderList","_normalizeClass","_normalizeStyle","_toDisplayString","_createCommentVNode","_createVNode","_unref","_sfc_main","$slots","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_openBlock","_createElementBlock","_mergeProps","_renderSlot","_createTextVNode","_toDisplayString","_createCommentVNode","_unref","_createElementVNode","_normalizeClass","_normalizeStyle","_Fragment","_renderList","_sfc_main","$slots","_hoisted_1","_hoisted_2","_hoisted_3","_openBlock","_createElementBlock","_normalizeClass","_renderSlot","_createTextVNode","_toDisplayString","_createCommentVNode","_createElementVNode","_sfc_main","_hoisted_1","_openBlock","_createElementBlock","_renderSlot","_sfc_main","_hoisted_1","_hoisted_2","_openBlock","_createElementBlock","_renderSlot","_sfc_main","_hoisted_1","_hoisted_2","_useSlots","AkBreadcrumbItem","_openBlock","_createElementBlock","_createElementVNode","_createVNode","_sfc_main","_hoisted_1","_hoisted_2","_useModel","_openBlock","_createElementBlock","_createBlock","_resolveDynamicComponent","_mergeProps","_withCtx","_renderSlot","_createTextVNode","_Fragment","_renderList","_toDisplayString","_sfc_main","_hoisted_1","_openBlock","_createElementBlock","_renderSlot","_sfc_main","$slots","_hoisted_1","_hoisted_2","_hoisted_3","_openBlock","_createElementBlock","_normalizeClass","_toDisplayString","_createCommentVNode","_renderSlot","_createTextVNode","_sfc_main","_renderSlot","_createTextVNode","_toDisplayString","_sfc_main","_hoisted_1","_hoisted_2","_hoisted_3","_useSlots","AkStep","_openBlock","_createElementBlock","_Fragment","_renderList","_normalizeClass","_createVNode","_createCommentVNode","_sfc_main","_useModel","_openBlock","_createElementBlock","_renderSlot","_sfc_main","_hoisted_1","_hoisted_2","_hoisted_3","_openBlock","_createElementBlock","_createElementVNode","_unref","_renderSlot","_createTextVNode","_toDisplayString","_sfc_main","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_useModel","_openBlock","_createElementBlock","_normalizeClass","_createElementVNode","_Fragment","_renderList","_toDisplayString","_createTextVNode","_renderSlot","_createBlock","_createCommentVNode","_sfc_main","_hoisted_1","_useModel","_openBlock","_createElementBlock","_normalizeClass","_createVNode","AkIcon","_sfc_main","_hoisted_1","_hoisted_2","_useSlots","_openBlock","_createElementBlock","_normalizeClass","_renderSlot","_createTextVNode","_toDisplayString","_Fragment","_createElementVNode","_createCommentVNode","_sfc_main","$attrs","$slots","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_useModel","_useSlots","_withDirectives","_openBlock","_createElementBlock","_mergeProps","_vModelText","_createBlock","_withCtx","_renderSlot","_createCommentVNode","_createElementVNode","_vModelDynamic","_sfc_main","_hoisted_1","_openBlock","_createElementBlock","_renderSlot","_sfc_main","_hoisted_1","_hoisted_2","_hoisted_3","_useModel","_openBlock","_createElementBlock","_mergeProps","_unref","_createCommentVNode","_createElementVNode","_sfc_main","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_useModel","_withDirectives","_openBlock","_createElementBlock","_mergeProps","_unref","_toDisplayString","_createCommentVNode","_Fragment","_renderList","_vModelSelect","_sfc_main","_hoisted_1","_useModel","_useSlots","_openBlock","_createElementBlock","_mergeProps","_unref","_createElementVNode","_renderSlot","_sfc_main","_hoisted_1","_useModel","_openBlock","_createElementBlock","_mergeProps","_unref","_renderSlot","_sfc_main","_hoisted_1","_useModel","_useSlots","_openBlock","_createElementBlock","_mergeProps","_unref","_createElementVNode","_renderSlot","_sfc_main","_hoisted_1","_useSlots","_openBlock","_createElementBlock","_normalizeClass","_unref","_createBlock","AkIcon","_Fragment","_createCommentVNode","_renderSlot","_sfc_main","_useModel","_useSlots","AkRadioButton","_openBlock","_createBlock","_sfc_main","$slots","_hoisted_1","_hoisted_2","_hoisted_3","_useModel","_useSlots","_openBlock","_createElementBlock","_mergeProps","_unref","_withDirectives","_createElementVNode","_vModelCheckbox","_renderSlot","_createCommentVNode","_sfc_main","_hoisted_1","_useModel","_withDirectives","_openBlock","_createElementBlock","_mergeProps","_unref","_vModelText","_sfc_main","_hoisted_1","_hoisted_2","_useModel","_openBlock","_createElementBlock","_mergeProps","_unref","_createVNode","AkIcon","_withDirectives","_createElementVNode","_withKeys","_vModelText","_toDisplayString","_createCommentVNode","_sfc_main","_hoisted_1","_openBlock","_createElementBlock","_renderSlot","_sfc_main","_hoisted_1","_hoisted_2","_openBlock","_createElementBlock","_normalizeClass","_Fragment","_renderList","_sfc_main","_hoisted_1","_hoisted_2","_openBlock","_createElementBlock","_normalizeClass","_createElementVNode","_sfc_main","_hoisted_1","_hoisted_2","_hoisted_3","_openBlock","_createElementBlock","_renderSlot","_createBlock","AkProfession","_createCommentVNode","_toDisplayString","_Fragment","_createTextVNode","_sfc_main","$slots","_hoisted_1","_openBlock","_createElementBlock","_normalizeClass","_createElementVNode","_renderSlot","_createTextVNode","_toDisplayString","_sfc_main","_hoisted_1","_openBlock","_createElementBlock","_normalizeClass","_createElementVNode","_sfc_main","_hoisted_1","_openBlock","_createElementBlock","_normalizeClass","_createElementVNode","_sfc_main","_hoisted_1","_openBlock","_createElementBlock","_normalizeClass","_createElementVNode","_toDisplayString","_sfc_main","_hoisted_1","_hoisted_2","_hoisted_3","_useModel","_openBlock","_createElementBlock","_Fragment","_renderList","_normalizeClass","_createCommentVNode","_createTextVNode","_toDisplayString","_sfc_main","_hoisted_1","_hoisted_2","_openBlock","_createElementBlock","_toDisplayString","_createCommentVNode","_createTextVNode","_sfc_main","_hoisted_1","props","_openBlock","_createElementBlock","_renderSlot","_sfc_main","_hoisted_1","_hoisted_2","_hoisted_3","_openBlock","_createElementBlock","_normalizeClass","_createVNode","AkPotential","_createElementVNode","_toDisplayString","_renderSlot","_createCommentVNode","_sfc_main","$slots","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_openBlock","_createBlock","_resolveDynamicComponent","_normalizeClass","_withCtx","_createElementVNode","_createElementBlock","AkRarity","_createCommentVNode","_renderSlot","_createTextVNode","_toDisplayString","_sfc_main","_hoisted_1","_openBlock","_createElementBlock","_renderSlot","$slots","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_openBlock","_createBlock","_resolveDynamicComponent","_withCtx","_createElementVNode","_toDisplayString","_createElementBlock","AkRarity","_createCommentVNode","_renderSlot","_createTextVNode","_sfc_main","_useSlots","_openBlock","_createBlock","_resolveDynamicComponent","_normalizeClass","_withCtx","_renderSlot","_sfc_main","_hoisted_1","_openBlock","_createElementBlock","_normalizeClass","_unref","_renderSlot","_createTextVNode","_toDisplayString","_sfc_main","_hoisted_1","_openBlock","_createElementBlock","_normalizeClass","_unref","_renderSlot","_createTextVNode","_toDisplayString","_sfc_main","_hoisted_1","_hoisted_2","_openBlock","_createElementBlock","_normalizeClass","_unref","_renderSlot","_createElementVNode","_toDisplayString","_createTextVNode","_sfc_main","$slots","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","_useSlots","_openBlock","_createElementBlock","_normalizeClass","_createElementVNode","_createCommentVNode","_createBlock","_resolveDynamicComponent","_withCtx","_createTextVNode","_toDisplayString","_renderSlot","_createVNode","AkSp","AkSpTrigger","AkSpValue","_sfc_main","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_openBlock","_createElementBlock","_Fragment","_createTextVNode","_toDisplayString","_createElementVNode","_createCommentVNode","_sfc_main","_hoisted_1","_hoisted_2","_useModel","_openBlock","_createElementBlock","_Fragment","_renderList","_normalizeClass","_createVNode","LevelLabel","_sfc_main","$slots","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_openBlock","_createElementBlock","_renderSlot","_createElementVNode","_createVNode","AkSpValue","_withCtx","_createTextVNode","_Fragment","_renderList","_normalizeClass","LevelLabel","AkRichText","_toDisplayString","_createCommentVNode","_sfc_main","$slots","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_useModel","_openBlock","_createElementBlock","_renderSlot","_createVNode","AkRichText","_withCtx","_createElementVNode","_toDisplayString","_createCommentVNode","_Fragment","_renderList","_normalizeClass","LevelLabel","_createBlock","AkSpValue","_createTextVNode","_sfc_main","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","_hoisted_15","_useModel","_openBlock","_createElementBlock","_normalizeClass","_createElementVNode","_toDisplayString","_createTextVNode","_withDirectives","_vModelCheckbox","_createCommentVNode","_Fragment","_renderList","_renderSlot","_createVNode","AkRichText","_sfc_main","_hoisted_1","_openBlock","_createElementBlock","_normalizeClass","_sfc_main","$slots","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_openBlock","_createElementBlock","_createElementVNode","_createTextVNode","_toDisplayString","_Fragment","_renderList","_createCommentVNode","_renderSlot","_sfc_main","_hoisted_1","_openBlock","_createElementBlock","_renderSlot","_sfc_main","_hoisted_1","_hoisted_2","_openBlock","_createElementBlock","_Fragment","_createElementVNode","_renderSlot","_createTextVNode","_toDisplayString","_sfc_main","_hoisted_1","_openBlock","_createElementBlock","_renderSlot","_sfc_main","_openBlock","_createElementBlock","_normalizeClass","_renderSlot","_sfc_main","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_openBlock","_createElementBlock","_normalizeClass","_createElementVNode","_createTextVNode","_toDisplayString","_createCommentVNode","_renderSlot","_sfc_main","props","_openBlock","_createElementBlock","_normalizeClass","_renderSlot","_sfc_main","_hoisted_1","_unref","_openBlock","_createElementBlock","_createElementVNode","_renderSlot","_createTextVNode","_toDisplayString","_Fragment","_sfc_main","_hoisted_1","_openBlock","_createElementBlock","_normalizeClass","_normalizeStyle","_Fragment","_renderList","_sfc_main","$slots","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_useModel","_useSlots","_openBlock","_createElementBlock","_createElementVNode","_createCommentVNode","_normalizeClass","_createTextVNode","_toDisplayString","_renderSlot","_unref","_withDirectives","_vModelCheckbox","_Fragment","_renderList","_sfc_main","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_openBlock","_createElementBlock","_createElementVNode","_createTextVNode","_toDisplayString","_Fragment","_renderList","_normalizeClass","_createCommentVNode","_renderSlot","_sfc_main","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_openBlock","_createElementBlock","_createElementVNode","_createTextVNode","_toDisplayString","_Fragment","_renderList","_normalizeClass","_renderSlot","_sfc_main","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_useModel","_openBlock","_createElementBlock","_unref","_createElementVNode","_Fragment","_renderList","_normalizeClass","_toDisplayString","_createCommentVNode","_createTextVNode","_renderSlot","_sfc_main","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_openBlock","_createElementBlock","_createElementVNode","_normalizeClass","_createVNode","AkIcon","_createCommentVNode","_createTextVNode","_toDisplayString","_Fragment","_renderList","_unref","_sfc_main","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_openBlock","_createElementBlock","_normalizeClass","_createElementVNode","_createTextVNode","_toDisplayString","_createCommentVNode","_renderSlot","_sfc_main","_hoisted_1","_useModel","_openBlock","_createElementBlock","_normalizeClass","_withKeys","_withModifiers","_renderSlot","_sfc_main","$slots","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_openBlock","_createElementBlock","_createElementVNode","_toDisplayString","_createCommentVNode","_renderSlot","_createTextVNode","_sfc_main","_openBlock","_createBlock","_resolveDynamicComponent","_withCtx","_createElementVNode","_renderSlot","_sfc_main","_hoisted_1","_openBlock","_createElementBlock","_renderSlot","_sfc_main","_useSlots","_openBlock","_createElementBlock","_Fragment","_createElementVNode","_normalizeClass","_renderSlot","_createTextVNode","_toDisplayString","_sfc_main","_hoisted_1","_openBlock","_createElementBlock","_createElementVNode","_createTextVNode","_toDisplayString","_sfc_main","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_useSlots","_openBlock","_createBlock","_resolveDynamicComponent","_normalizeClass","_withCtx","_createElementVNode","_createTextVNode","_toDisplayString","_createElementBlock","_createCommentVNode","_createVNode","AkSanity","_renderSlot","_sfc_main","_openBlock","_createBlock","_resolveDynamicComponent","_normalizeClass","_withCtx","_renderSlot","_sfc_main","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_openBlock","_createElementBlock","_normalizeClass","_createElementVNode","_toDisplayString","_Fragment","_renderList","_createCommentVNode","_renderSlot","_sfc_main","_hoisted_1","_hoisted_2","_openBlock","_createElementBlock","_normalizeClass","_createElementVNode","_Fragment","_createTextVNode","_toDisplayString","_createCommentVNode","_sfc_main","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_openBlock","_createElementBlock","_normalizeClass","_renderSlot","_createCommentVNode","_createElementVNode","_toDisplayString","_createTextVNode","_sfc_main","_hoisted_1","_openBlock","_createElementBlock","_Fragment","_renderList","_createElementVNode","_toDisplayString","_createCommentVNode","_sfc_main","_hoisted_1","_hoisted_2","_hoisted_3","_openBlock","_createElementBlock","_createElementVNode","_renderSlot","_createTextVNode","_toDisplayString","_sfc_main","$slots","_openBlock","_createElementBlock","_toDisplayString","_createCommentVNode","_createElementVNode","_renderSlot","_createTextVNode","_sfc_main"],"sources":["../src/icons.ts","../src/components/Scope/AkScope.vue","../src/components/Scope/AkScope.vue","../src/components/Icon/AkIcon.vue","../src/components/Icon/AkIcon.vue","../src/components/Button/context.ts","../src/components/Button/AkButton.vue","../src/components/Button/AkButton.vue","../src/components/Button/AkButtonGroup.vue","../src/components/Button/AkButtonGroup.vue","../src/components/Tag/AkTag.vue","../src/components/Tag/AkTag.vue","../src/components/Cbox/AkCbox.vue","../src/components/Cbox/AkCbox.vue","../src/components/Tabs/AkTab.vue","../src/components/Tabs/AkTab.vue","../src/components/Tabs/AkTabPane.vue","../src/components/Tabs/AkTabPane.vue","../src/components/Tabs/AkTabs.vue","../src/components/Tabs/AkTabs.vue","../src/components/Item/context.ts","../src/components/Item/AkItem.vue","../src/components/Item/AkItem.vue","../src/components/Item/AkItemList.vue","../src/components/Item/AkItemList.vue","../src/components/Chip/AkChip.vue","../src/components/Chip/AkChip.vue","../src/components/Badge/AkBadge.vue","../src/components/Badge/AkBadge.vue","../src/components/Card/AkCard.vue","../src/components/Card/AkCard.vue","../src/components/Card/AkCardGrid.vue","../src/components/Panel/AkPanel.vue","../src/components/Panel/AkPanel.vue","../src/components/Heading/AkHeading.vue","../src/components/Heading/AkHeading.vue","../src/components/Divider/AkDivider.vue","../src/components/Divider/AkDivider.vue","../src/components/Avatar/context.ts","../src/components/Avatar/AkAvatar.vue","../src/components/Avatar/AkAvatar.vue","../src/components/Avatar/AkAvatarGroup.vue","../src/components/Avatar/AkAvatarGroup.vue","../src/components/Empty/AkEmpty.vue","../src/components/Empty/AkEmpty.vue","../src/components/Skeleton/AkSkeleton.vue","../src/components/Skeleton/AkSkeleton.vue","../src/components/Spinner/AkSpinner.vue","../src/components/Spinner/AkSpinner.vue","../src/components/Message/AkMessage.vue","../src/components/Message/AkMessage.vue","../src/components/Tooltip/trigger.ts","../src/components/Tooltip/usePopover.ts","../src/components/Tooltip/AkTooltip.vue","../src/components/Tooltip/AkTooltip.vue","../src/components/Tooltip/AkPopover.vue","../src/components/Tooltip/AkPopover.vue","../src/components/Dropdown/MenuItem.vue","../src/components/Dropdown/MenuItem.vue","../src/components/Dropdown/AkDropdown.vue","../src/components/Dropdown/AkDropdown.vue","../src/components/Dialog/AkDialog.vue","../src/components/Dialog/AkDialog.vue","../src/components/Toast/useToast.ts","../src/components/Toast/AkToastProvider.vue","../src/components/Toast/AkToastProvider.vue","../src/components/Progress/AkProgress.vue","../src/components/Progress/AkProgress.vue","../src/components/Stat/AkStat.vue","../src/components/Stat/AkStat.vue","../src/components/Stat/AkStatRow.vue","../src/components/Stat/AkStatRow.vue","../src/components/Breadcrumb/AkBreadcrumbItem.vue","../src/components/Breadcrumb/AkBreadcrumbItem.vue","../src/components/Breadcrumb/AkBreadcrumb.vue","../src/components/Breadcrumb/AkBreadcrumb.vue","../src/components/Pagination/AkPagination.vue","../src/components/Pagination/AkPagination.vue","../src/components/Timeline/AkTimeline.vue","../src/components/Timeline/AkTimeline.vue","../src/components/Timeline/AkTimelineItem.vue","../src/components/Timeline/AkTimelineItem.vue","../src/components/Stepper/AkStep.vue","../src/components/Stepper/AkStep.vue","../src/components/Stepper/AkSteps.vue","../src/components/Stepper/AkSteps.vue","../src/components/Accordion/context.ts","../src/components/Accordion/AkCollapse.vue","../src/components/Accordion/AkCollapse.vue","../src/components/Accordion/AkCollapseItem.vue","../src/components/Accordion/AkCollapseItem.vue","../src/components/Table/AkDataTable.vue","../src/components/Table/AkDataTable.vue","../src/components/Fab/AkBackTop.vue","../src/components/Fab/AkBackTop.vue","../src/components/Field/context.ts","../src/components/Field/AkField.vue","../src/components/Field/AkField.vue","../src/components/Input/context.ts","../src/components/Input/AkInput.vue","../src/components/Input/AkInput.vue","../src/components/Input/AkInputGroup.vue","../src/components/Input/AkInputGroup.vue","../src/components/InputNumber/AkInputNumber.vue","../src/components/InputNumber/AkInputNumber.vue","../src/components/Select/AkSelect.vue","../src/components/Select/AkSelect.vue","../src/components/Checkbox/context.ts","../src/components/Checkbox/AkCheckbox.vue","../src/components/Checkbox/AkCheckbox.vue","../src/components/Checkbox/AkCheckboxGroup.vue","../src/components/Checkbox/AkCheckboxGroup.vue","../src/components/Radio/context.ts","../src/components/Radio/AkRadio.vue","../src/components/Radio/AkRadio.vue","../src/components/Radio/AkRadioButton.vue","../src/components/Radio/AkRadioButton.vue","../src/components/Radio/AkRadioGroup.vue","../src/components/Radio/AkRadioGroup.vue","../src/components/Switch/AkSwitch.vue","../src/components/Switch/AkSwitch.vue","../src/components/Slider/AkSlider.vue","../src/components/Slider/AkSlider.vue","../src/components/Search/AkSearch.vue","../src/components/Search/AkSearch.vue","../src/components/Kbd/AkKbd.vue","../src/components/Kbd/AkKbd.vue","../src/components/Rarity/AkRarity.vue","../src/components/Rarity/AkRarity.vue","../src/components/Profession/AkProfession.vue","../src/components/Profession/AkProfession.vue","../src/components/Profession/AkProfessionLabel.vue","../src/components/Profession/AkProfessionLabel.vue","../src/components/Elite/AkElite.vue","../src/components/Elite/AkElite.vue","../src/components/Potential/AkPotential.vue","../src/components/Potential/AkPotential.vue","../src/components/Potential/AkSpecialization.vue","../src/components/Potential/AkSpecialization.vue","../src/components/Level/AkLevel.vue","../src/components/Level/AkLevel.vue","../src/components/PhaseTabs/AkPhaseTabs.vue","../src/components/PhaseTabs/AkPhaseTabs.vue","../src/components/Trust/AkTrust.vue","../src/components/Trust/AkTrust.vue","../src/components/PotList/context.ts","../src/components/PotList/AkPotList.vue","../src/components/PotList/AkPotList.vue","../src/components/PotList/AkPot.vue","../src/components/PotList/AkPot.vue","../src/components/OpCard/AkOpCard.vue","../src/components/OpCard/AkOpCard.vue","../src/components/OpCard/AkOpGrid.vue","../src/components/OpRow/AkOpRow.vue","../src/components/OpRow/AkOpRow.vue","../src/components/RichText/parse.ts","../src/components/RichText/AkRichText.vue","../src/components/RichText/AkRichText.vue","../src/components/Sp/sp.ts","../src/components/Sp/AkSp.vue","../src/components/Sp/AkSp.vue","../src/components/Sp/AkSpTrigger.vue","../src/components/Sp/AkSpTrigger.vue","../src/components/Sp/AkSpValue.vue","../src/components/Sp/AkSpValue.vue","../src/components/Skill/AkSkill.vue","../src/components/Skill/AkSkill.vue","../src/components/Skill/LevelLabel.vue","../src/components/Skill/LevelLabel.vue","../src/components/SkillLevels/AkSkillLevels.vue","../src/components/SkillLevels/AkSkillLevels.vue","../src/components/SkillSheet/AkSkillSheet.vue","../src/components/SkillSheet/AkSkillSheet.vue","../src/components/SkillMatrix/AkSkillMatrix.vue","../src/components/SkillMatrix/AkSkillMatrix.vue","../src/components/TalentTable/AkTalentTable.vue","../src/components/TalentTable/AkTalentTable.vue","../src/components/TalentTable/AkCalc.vue","../src/components/TalentTable/AkCalc.vue","../src/components/Talent/AkTalent.vue","../src/components/Talent/AkTalent.vue","../src/components/Materials/AkMaterials.vue","../src/components/Materials/AkMaterials.vue","../src/components/Materials/AkMaterialsRow.vue","../src/components/Materials/AkMaterialsRow.vue","../src/components/Materials/AkMaterialsDivider.vue","../src/components/Materials/AkMaterialsDivider.vue","../src/components/Attrs/AkAttrs.vue","../src/components/Attrs/AkAttrs.vue","../src/components/Attrs/AkAttr.vue","../src/components/Attrs/AkAttr.vue","../src/components/Kv/context.ts","../src/components/Kv/AkKv.vue","../src/components/Kv/AkKv.vue","../src/components/Kv/AkKvItem.vue","../src/components/Kv/AkKvItem.vue","../src/components/Range/AkRange.vue","../src/components/Range/AkRange.vue","../src/components/Module/AkModule.vue","../src/components/Module/AkModule.vue","../src/components/Module/AkModuleStage.vue","../src/components/Module/AkModuleStage.vue","../src/components/Module/AkModuleUnlock.vue","../src/components/Module/AkModuleUnlock.vue","../src/components/Voice/context.ts","../src/components/Voice/AkVoiceList.vue","../src/components/Voice/AkVoiceList.vue","../src/components/Voice/player.ts","../src/components/Voice/AkVoice.vue","../src/components/Voice/AkVoice.vue","../src/components/Dossier/AkDossier.vue","../src/components/Dossier/AkDossier.vue","../src/components/Dossier/AkRedacted.vue","../src/components/Dossier/AkRedacted.vue","../src/components/Archive/AkArchive.vue","../src/components/Archive/AkArchive.vue","../src/components/Archive/AkArchivePlay.vue","../src/components/Archive/AkArchivePlay.vue","../src/components/Dialogue/AkDialogue.vue","../src/components/Dialogue/AkDialogue.vue","../src/components/Dialogue/AkDialogueLine.vue","../src/components/Dialogue/AkDialogueLine.vue","../src/components/Stage/AkSanity.vue","../src/components/Stage/AkSanity.vue","../src/components/Stage/AkStage.vue","../src/components/Stage/AkStage.vue","../src/components/Stage/AkStageCode.vue","../src/components/Stage/AkStageCode.vue","../src/components/Enemy/AkEnemy.vue","../src/components/Enemy/AkEnemy.vue","../src/components/Camp/AkCamp.vue","../src/components/Camp/AkCamp.vue","../src/components/Event/AkEvent.vue","../src/components/Event/AkEvent.vue","../src/components/Event/AkCountdown.vue","../src/components/Event/AkCountdown.vue","../src/components/News/AkNews.vue","../src/components/News/AkNews.vue","../src/components/Hero/AkHero.vue","../src/components/Hero/AkHero.vue"],"sourcesContent":["/**\n * PRTS Design 线稿图标(24×24,stroke / fill 用 currentColor)——与预览骨架 preview/_src/skeleton.html 的 SVG sprite 同一套路径。\n * Vue 组件内联渲染(<AkIcon name=\"search\" />),不依赖页面里有没有 sprite;MW 皮肤 / 模板那边仍走 <svg><use href=\"#i-…\"></svg>。\n */\nexport const icons = {\n \"menu\": \"<path fill=\\\"currentColor\\\" d=\\\"M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z\\\"/>\",\n \"search\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" d=\\\"M10.5 3a7.5 7.5 0 1 1 0 15 7.5 7.5 0 0 1 0-15zM16 16l5 5\\\"/>\",\n \"bell\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" d=\\\"M6 17V11a6 6 0 1 1 12 0v6l2 2H4l2-2zm4 4h4\\\"/>\",\n \"user\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" d=\\\"M12 12a4 4 0 1 0 0-8 4 4 0 0 0 0 8zm-8 9c0-4 3.6-6 8-6s8 2 8 6\\\"/>\",\n \"sun\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" d=\\\"M12 8a4 4 0 1 0 0 8 4 4 0 0 0 0-8zm0-6v3m0 14v3M2 12h3m14 0h3M4.9 4.9l2.1 2.1m10 10 2.1 2.1M4.9 19.1 7 17m10-10 2.1-2.1\\\"/>\",\n \"moon\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" d=\\\"M20 14.5A8 8 0 0 1 9.5 4a8 8 0 1 0 10.5 10.5z\\\"/>\",\n \"monitor\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" d=\\\"M3 4h18v12H3zm5 16h8m-4-4v4\\\"/>\",\n \"edit\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" d=\\\"M4 20h4l11-11-4-4L4 16v4zM13 7l4 4\\\"/>\",\n \"history\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" d=\\\"M3 12a9 9 0 1 0 3-6.7M3 4v5h5m4-1v5l3 2\\\"/>\",\n \"book\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" d=\\\"M4 4h7a3 3 0 0 1 3 3v13a2 2 0 0 0-2-2H4zm16 0h-7a3 3 0 0 0-3 3v13a2 2 0 0 1 2-2h8z\\\"/>\",\n \"talk\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" d=\\\"M4 5h16v11H9l-5 4z\\\"/>\",\n \"more\": \"<path fill=\\\"currentColor\\\" d=\\\"M5 10a2 2 0 1 1 0 4 2 2 0 0 1 0-4zm7 0a2 2 0 1 1 0 4 2 2 0 0 1 0-4zm7 0a2 2 0 1 1 0 4 2 2 0 0 1 0-4z\\\"/>\",\n \"star\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linejoin=\\\"round\\\" d=\\\"M12 3.5l2.6 5.6 6.1.7-4.5 4.2 1.2 6-5.4-3-5.4 3 1.2-6L3.3 9.8l6.1-.7z\\\"/>\",\n \"link\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" d=\\\"M10 14a4 4 0 0 0 5.7 0l3-3a4 4 0 0 0-5.7-5.7l-1.5 1.5M14 10a4 4 0 0 0-5.7 0l-3 3a4 4 0 0 0 5.7 5.7l1.5-1.5\\\"/>\",\n \"linkin\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" d=\\\"M3 12h12m-4-4 4 4-4 4M18 4h3v16h-3\\\"/>\",\n \"arrow-ne\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2.5\\\" d=\\\"M7 17 17 7M9 7h8v8\\\"/>\",\n \"mic\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" d=\\\"M12 3a3 3 0 0 1 3 3v6a3 3 0 0 1-6 0V6a3 3 0 0 1 3-3zM6 11a6 6 0 0 0 12 0M12 17v4m-4 0h8\\\"/>\",\n \"list\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" d=\\\"M4 7h16M4 12h16M4 17h10\\\"/>\",\n \"print\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" d=\\\"M7 8V3h10v5M5 8h14a2 2 0 0 1 2 2v6h-4v-3H7v3H3v-6a2 2 0 0 1 2-2zm2 8v5h10v-5\\\"/>\",\n \"upload\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" d=\\\"M12 16V4m-5 5 5-5 5 5M4 20h16\\\"/>\",\n \"download\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" d=\\\"M12 4v12m-5-5 5 5 5-5M4 20h16\\\"/>\",\n \"grid\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" d=\\\"M4 4h6v6H4zm10 0h6v6h-6zM4 14h6v6H4zm10 0h6v6h-6z\\\"/>\",\n \"refresh\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" d=\\\"M20 12a8 8 0 1 1-2.3-5.7M20 4v5h-5\\\"/>\",\n \"quote\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" d=\\\"M6 16h3l2-4V7H5v5h3zm9 0h3l2-4V7h-6v5h3z\\\"/>\",\n \"table\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" d=\\\"M3 5h18v14H3zm0 5h18M3 14h18M9 5v14\\\"/>\",\n \"source\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" d=\\\"M8 4H5v16h3M16 4h3v16h-3M10 8l-2 4 2 4m4-8 2 4-2 4\\\"/>\",\n \"move\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" d=\\\"M12 2v20M2 12h20M9 5l3-3 3 3M9 19l3 3 3-3M5 9 2 12l3 3m14-6 3 3-3 3\\\"/>\",\n \"lock\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" d=\\\"M7 11V8a5 5 0 0 1 10 0v3M4 11h16v10H4z\\\"/>\",\n \"trash\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" d=\\\"M4 7h16M9 7V4h6v3m-8 0 1 13h8l1-13M10 11v6m4-6v6\\\"/>\",\n \"lang\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" d=\\\"M3 5h10M8 3v2m3 0c-1 4-3.5 7-7 9m1-6c1 3 3 5 6 6M13 21l4-10 4 10m-6.5-3h5\\\"/>\",\n \"gear\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" d=\\\"M12 9a3 3 0 1 0 0 6 3 3 0 0 0 0-6zm-2-6h4l.6 2.4 2.1 1.2 2.4-.7 2 3.4-1.8 1.7v2.4l1.8 1.7-2 3.4-2.4-.7-2.1 1.2L14 21h-4l-.6-2.4-2.1-1.2-2.4.7-2-3.4 1.8-1.7v-2.4L2.9 8.9l2-3.4 2.4.7 2.1-1.2z\\\"/>\",\n \"watchlist\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" d=\\\"M3 6h12M3 11h8M3 16h6m8-4 1.3 2.7 3 .4-2.2 2.1.5 3-2.6-1.4-2.6 1.4.5-3-2.2-2.1 3-.4z\\\"/>\",\n \"contribs\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" d=\\\"M3 6h12M3 11h8M3 16h6m9-5a2.5 2.5 0 1 0 0-5 2.5 2.5 0 0 0 0 5zm-4.5 8c0-2.5 2-4 4.5-4s4.5 1.5 4.5 4\\\"/>\",\n \"logout\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" d=\\\"M10 4H4v16h6m4-12 5 4-5 4m5-4H9\\\"/>\",\n \"info\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" d=\\\"M12 3a9 9 0 1 1 0 18 9 9 0 0 1 0-18zm0 8v5m0-9v1\\\"/>\",\n \"warn\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" d=\\\"M12 3l10 18H2zm0 7v5m0 3v1\\\"/>\",\n \"check\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2.5\\\" d=\\\"M4 12l5 5L20 6\\\"/>\",\n \"x\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2.5\\\" d=\\\"M5 5l14 14M19 5L5 19\\\"/>\",\n \"up\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2.5\\\" d=\\\"M5 15l7-7 7 7\\\"/>\",\n \"chevron-left\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2.5\\\" d=\\\"M15 5l-7 7 7 7\\\"/>\",\n \"chevron-right\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2.5\\\" d=\\\"M9 5l7 7-7 7\\\"/>\",\n \"play\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linejoin=\\\"round\\\" d=\\\"M7 4v16l12-8z\\\"/>\",\n \"pause\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" d=\\\"M6 4h4v16H6zm8 0h4v16h-4z\\\"/>\",\n \"empty\": \"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"1.5\\\" d=\\\"M3 7l9-4 9 4v10l-9 4-9-4zm9 4 9-4M12 11 3 7m9 4v10\\\"/>\",\n} as const;\n\nexport type IconName = keyof typeof icons;\n","<script setup lang=\"ts\">\n/**\n * 作用域根:组件的排版基线(字体 / 字号 / 行高 / 前景色)挂在这一层,不靠宿主页面的 body 继承——prts.wiki 上别的皮肤(Vector 2022 …)、\n * 站外页面里,widget 的根节点包一层,就和 Arknights 皮肤上看起来一样;theme 让这一块局部走终端(暗)/ 档案(亮)配色。\n * Arknights 皮肤上 body.skin-arknights 本身就是作用域,包不包都一样。样式在 CSS 实现的 scope.css(= class=\"ak-scope\")。\n */\nwithDefaults(\n defineProps<{\n /** 局部主题:dark 终端 · light 档案(连画布底色一起换);不传 = 跟随宿主页面(html 上的 clientpref 类 / data-theme,都没有就跟随系统) */\n theme?: \"light\" | \"dark\";\n /** 根元素标签 */\n tag?: string;\n }>(),\n { theme: undefined, tag: \"div\" },\n);\n\ndefineSlots<{\n /** 作用域里的内容:widget 的整棵组件树 */\n default?: () => unknown;\n}>();\n</script>\n\n<template>\n <component :is=\"tag\" class=\"ak-scope\" :data-theme=\"theme\"><slot /></component>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 作用域根:组件的排版基线(字体 / 字号 / 行高 / 前景色)挂在这一层,不靠宿主页面的 body 继承——prts.wiki 上别的皮肤(Vector 2022 …)、\n * 站外页面里,widget 的根节点包一层,就和 Arknights 皮肤上看起来一样;theme 让这一块局部走终端(暗)/ 档案(亮)配色。\n * Arknights 皮肤上 body.skin-arknights 本身就是作用域,包不包都一样。样式在 CSS 实现的 scope.css(= class=\"ak-scope\")。\n */\nwithDefaults(\n defineProps<{\n /** 局部主题:dark 终端 · light 档案(连画布底色一起换);不传 = 跟随宿主页面(html 上的 clientpref 类 / data-theme,都没有就跟随系统) */\n theme?: \"light\" | \"dark\";\n /** 根元素标签 */\n tag?: string;\n }>(),\n { theme: undefined, tag: \"div\" },\n);\n\ndefineSlots<{\n /** 作用域里的内容:widget 的整棵组件树 */\n default?: () => unknown;\n}>();\n</script>\n\n<template>\n <component :is=\"tag\" class=\"ak-scope\" :data-theme=\"theme\"><slot /></component>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nimport { icons, type IconName } from \"../../icons\";\n\nconst props = withDefaults(\n defineProps<{\n /** 图标名(见 icons.ts,与皮肤 sprite 的 #i-* 同名) */\n name: IconName;\n /** 边长(px);不写则由外层 CSS 定(如 .ak-btn__icon 的 1.1em) */\n size?: number | string;\n /** 读屏文本;不写则 aria-hidden(纯装饰,旁边有文字) */\n label?: string;\n }>(),\n { size: undefined, label: undefined },\n);\n\nconst markup = computed(() => icons[props.name]);\n</script>\n\n<template>\n <svg\n class=\"ak-icon\"\n viewBox=\"0 0 24 24\"\n :width=\"size\"\n :height=\"size\"\n :role=\"label ? 'img' : undefined\"\n :aria-label=\"label\"\n :aria-hidden=\"label ? undefined : 'true'\"\n focusable=\"false\"\n v-html=\"markup\"\n />\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nimport { icons, type IconName } from \"../../icons\";\n\nconst props = withDefaults(\n defineProps<{\n /** 图标名(见 icons.ts,与皮肤 sprite 的 #i-* 同名) */\n name: IconName;\n /** 边长(px);不写则由外层 CSS 定(如 .ak-btn__icon 的 1.1em) */\n size?: number | string;\n /** 读屏文本;不写则 aria-hidden(纯装饰,旁边有文字) */\n label?: string;\n }>(),\n { size: undefined, label: undefined },\n);\n\nconst markup = computed(() => icons[props.name]);\n</script>\n\n<template>\n <svg\n class=\"ak-icon\"\n viewBox=\"0 0 24 24\"\n :width=\"size\"\n :height=\"size\"\n :role=\"label ? 'img' : undefined\"\n :aria-label=\"label\"\n :aria-hidden=\"label ? undefined : 'true'\"\n focusable=\"false\"\n v-html=\"markup\"\n />\n</template>\n","import type { InjectionKey } from \"vue\";\n\nexport type ButtonVariant = \"default\" | \"primary\" | \"contrast\" | \"outline\" | \"ghost\" | \"danger\" | \"link\";\nexport type ButtonSize = \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n\n/** AkButtonGroup 给组内 AkButton 的默认尺寸(同 Naive 的 NButtonGroup) */\nexport const buttonGroupKey: InjectionKey<{ size?: ButtonSize }> = Symbol(\"AkButtonGroup\");\n","<script setup lang=\"ts\">\nimport { computed, inject, warn } from \"vue\";\n\nimport type { IconName } from \"../../icons\";\nimport AkIcon from \"../Icon/AkIcon.vue\";\nimport { buttonGroupKey, type ButtonSize, type ButtonVariant } from \"./context\";\n\nconst props = withDefaults(\n defineProps<{\n /** 外观:primary = 主色实底(一处一枚)· contrast = 黑白反转(游戏内 btn_on)· outline 描边 · ghost 幽灵 · danger 危险 · link 链接样式 */\n variant?: ButtonVariant;\n /** 尺寸:xs 24 · sm 30 · md 36 · lg 44 · xl 56(px 高);不写时跟 AkButtonGroup,再不然是 md */\n size?: ButtonSize;\n /** 图标;没有文字(不写默认插槽)时是方形的图标按钮,这时 label 必填 */\n icon?: IconName;\n /** 图标在文字左边还是右边(同 Naive 的 icon-placement) */\n iconPlacement?: \"left\" | \"right\";\n /** 可访问名(aria-label;图标按钮同时作 title)——只有图标的按钮必填,有文字的一般不写 */\n label?: string;\n /** 占满容器宽度 */\n block?: boolean;\n /** 胶囊圆角(系统默认直角,只在确需时用) */\n pill?: boolean;\n /** 危险按钮叠斜纹(只配 variant=\"danger\") */\n stripes?: boolean;\n /** 加载中:文字隐去,居中转圈,不可点 */\n loading?: boolean;\n disabled?: boolean;\n /** 有 href 时渲染成 <a>(禁用时 aria-disabled) */\n href?: string;\n type?: \"button\" | \"submit\" | \"reset\";\n }>(),\n { variant: \"default\", size: undefined, icon: undefined, iconPlacement: \"left\", label: undefined, href: undefined, type: \"button\" },\n);\n\nconst slots = defineSlots<{\n /** 按钮文字;不写就是图标按钮 */\n default?: () => unknown;\n}>();\n\nconst group = inject(buttonGroupKey, null);\nconst size = computed(() => props.size ?? group?.size ?? \"md\");\nconst iconOnly = computed(() => !!props.icon && !slots.default);\nif (iconOnly.value && !props.label) warn(`AkButton:只有图标(${props.icon})的按钮要写 label,否则读屏只念「按钮」`);\n\n/** 图标按钮里的图标边长;有文字时由 .ak-btn__icon 的 1.1em 定 */\nconst ICON_PX: Record<ButtonSize, number> = { xs: 14, sm: 16, md: 18, lg: 20, xl: 24 };\n\nconst classes = computed(() => [\n \"ak-btn\",\n props.variant !== \"default\" && `ak-btn--${props.variant}`,\n size.value !== \"md\" && `ak-btn--${size.value}`,\n {\n \"ak-btn--icon\": iconOnly.value,\n \"ak-btn--block\": props.block,\n \"ak-btn--pill\": props.pill,\n \"ak-stripes\": props.stripes,\n \"is-loading\": props.loading,\n },\n]);\n</script>\n\n<template>\n <component\n :is=\"href ? 'a' : 'button'\"\n :class=\"classes\"\n :href=\"href && !disabled ? href : undefined\"\n :type=\"href ? undefined : type\"\n :disabled=\"href ? undefined : disabled\"\n :aria-disabled=\"(href && disabled) || undefined\"\n :aria-busy=\"loading || undefined\"\n :aria-label=\"label\"\n :title=\"iconOnly ? label : undefined\"\n >\n <AkIcon v-if=\"iconOnly\" :name=\"icon!\" :size=\"ICON_PX[size]\" />\n <template v-else>\n <AkIcon v-if=\"icon && iconPlacement === 'left'\" :name=\"icon\" class=\"ak-btn__icon\" />\n <slot />\n <AkIcon v-if=\"icon && iconPlacement === 'right'\" :name=\"icon\" class=\"ak-btn__icon\" />\n </template>\n </component>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, inject, warn } from \"vue\";\n\nimport type { IconName } from \"../../icons\";\nimport AkIcon from \"../Icon/AkIcon.vue\";\nimport { buttonGroupKey, type ButtonSize, type ButtonVariant } from \"./context\";\n\nconst props = withDefaults(\n defineProps<{\n /** 外观:primary = 主色实底(一处一枚)· contrast = 黑白反转(游戏内 btn_on)· outline 描边 · ghost 幽灵 · danger 危险 · link 链接样式 */\n variant?: ButtonVariant;\n /** 尺寸:xs 24 · sm 30 · md 36 · lg 44 · xl 56(px 高);不写时跟 AkButtonGroup,再不然是 md */\n size?: ButtonSize;\n /** 图标;没有文字(不写默认插槽)时是方形的图标按钮,这时 label 必填 */\n icon?: IconName;\n /** 图标在文字左边还是右边(同 Naive 的 icon-placement) */\n iconPlacement?: \"left\" | \"right\";\n /** 可访问名(aria-label;图标按钮同时作 title)——只有图标的按钮必填,有文字的一般不写 */\n label?: string;\n /** 占满容器宽度 */\n block?: boolean;\n /** 胶囊圆角(系统默认直角,只在确需时用) */\n pill?: boolean;\n /** 危险按钮叠斜纹(只配 variant=\"danger\") */\n stripes?: boolean;\n /** 加载中:文字隐去,居中转圈,不可点 */\n loading?: boolean;\n disabled?: boolean;\n /** 有 href 时渲染成 <a>(禁用时 aria-disabled) */\n href?: string;\n type?: \"button\" | \"submit\" | \"reset\";\n }>(),\n { variant: \"default\", size: undefined, icon: undefined, iconPlacement: \"left\", label: undefined, href: undefined, type: \"button\" },\n);\n\nconst slots = defineSlots<{\n /** 按钮文字;不写就是图标按钮 */\n default?: () => unknown;\n}>();\n\nconst group = inject(buttonGroupKey, null);\nconst size = computed(() => props.size ?? group?.size ?? \"md\");\nconst iconOnly = computed(() => !!props.icon && !slots.default);\nif (iconOnly.value && !props.label) warn(`AkButton:只有图标(${props.icon})的按钮要写 label,否则读屏只念「按钮」`);\n\n/** 图标按钮里的图标边长;有文字时由 .ak-btn__icon 的 1.1em 定 */\nconst ICON_PX: Record<ButtonSize, number> = { xs: 14, sm: 16, md: 18, lg: 20, xl: 24 };\n\nconst classes = computed(() => [\n \"ak-btn\",\n props.variant !== \"default\" && `ak-btn--${props.variant}`,\n size.value !== \"md\" && `ak-btn--${size.value}`,\n {\n \"ak-btn--icon\": iconOnly.value,\n \"ak-btn--block\": props.block,\n \"ak-btn--pill\": props.pill,\n \"ak-stripes\": props.stripes,\n \"is-loading\": props.loading,\n },\n]);\n</script>\n\n<template>\n <component\n :is=\"href ? 'a' : 'button'\"\n :class=\"classes\"\n :href=\"href && !disabled ? href : undefined\"\n :type=\"href ? undefined : type\"\n :disabled=\"href ? undefined : disabled\"\n :aria-disabled=\"(href && disabled) || undefined\"\n :aria-busy=\"loading || undefined\"\n :aria-label=\"label\"\n :title=\"iconOnly ? label : undefined\"\n >\n <AkIcon v-if=\"iconOnly\" :name=\"icon!\" :size=\"ICON_PX[size]\" />\n <template v-else>\n <AkIcon v-if=\"icon && iconPlacement === 'left'\" :name=\"icon\" class=\"ak-btn__icon\" />\n <slot />\n <AkIcon v-if=\"icon && iconPlacement === 'right'\" :name=\"icon\" class=\"ak-btn__icon\" />\n </template>\n </component>\n</template>\n","<script setup lang=\"ts\">\nimport { provide } from \"vue\";\n\nimport { buttonGroupKey, type ButtonSize } from \"./context\";\n\n/** 一排贴在一起的按钮(同 Naive 的 NButtonGroup,纯容器);多选一的分段控件用单选组,不用它 */\nconst props = defineProps<{\n /** 组内按钮的默认尺寸(按钮自己写了 size 以按钮为准) */\n size?: ButtonSize;\n /** 读屏用的组名:一组有意义的动作时写 */\n label?: string;\n}>();\n\ndefineSlots<{\n /** 若干 AkButton */\n default?: () => unknown;\n}>();\n\nprovide(buttonGroupKey, props);\n</script>\n\n<template>\n <!-- data-no-toggle:皮肤脚本会给模板输出的 .ak-btn-group 里被点的 .ak-btn 翻 is-active(分段控件的演示态),这里是一组普通按钮,退出那层委托 -->\n <div class=\"ak-btn-group\" role=\"group\" :aria-label=\"label\" data-no-toggle><slot /></div>\n</template>\n","<script setup lang=\"ts\">\nimport { provide } from \"vue\";\n\nimport { buttonGroupKey, type ButtonSize } from \"./context\";\n\n/** 一排贴在一起的按钮(同 Naive 的 NButtonGroup,纯容器);多选一的分段控件用单选组,不用它 */\nconst props = defineProps<{\n /** 组内按钮的默认尺寸(按钮自己写了 size 以按钮为准) */\n size?: ButtonSize;\n /** 读屏用的组名:一组有意义的动作时写 */\n label?: string;\n}>();\n\ndefineSlots<{\n /** 若干 AkButton */\n default?: () => unknown;\n}>();\n\nprovide(buttonGroupKey, props);\n</script>\n\n<template>\n <!-- data-no-toggle:皮肤脚本会给模板输出的 .ak-btn-group 里被点的 .ak-btn 翻 is-active(分段控件的演示态),这里是一组普通按钮,退出那层委托 -->\n <div class=\"ak-btn-group\" role=\"group\" :aria-label=\"label\" data-no-toggle><slot /></div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, useId } from \"vue\";\n\nexport type TagVariant =\n | \"default\"\n | \"outline\"\n | \"accent\"\n | \"accent-soft\"\n | \"yellow\"\n | \"info\"\n | \"success\"\n | \"warning\"\n | \"danger\"\n | \"danger-solid\"\n | \"new\"\n | \"inverse\";\n\nconst props = withDefaults(\n defineProps<{\n /** 外观:状态色走 info / success / warning / danger(淡底色字);new = 红底 NEW 角标;danger-solid = BREAKING 红;yellow 次强调 */\n variant?: TagVariant;\n /** 尺寸:sm 18 · md 22 · lg 28(px 高) */\n size?: \"sm\" | \"md\" | \"lg\";\n /** 标签字(Bender 大写 + 字距),给版本号 / 状态码这类拉丁短词 */\n caps?: boolean;\n /** 前置小方点 */\n dot?: boolean;\n /** 显示移除按钮,点击触发 remove(读屏名是「移除 + 标签文字」) */\n removable?: boolean;\n }>(),\n { variant: \"default\", size: \"md\" },\n);\n\nconst emit = defineEmits<{\n /** 点了移除按钮 */\n remove: [];\n}>();\n\nconst classes = computed(() => [\n \"ak-tag\",\n props.variant !== \"default\" && `ak-tag--${props.variant}`,\n props.size !== \"md\" && `ak-tag--${props.size}`,\n { \"ak-tag--label\": props.caps },\n]);\n\nconst id = useId();\n</script>\n\n<template>\n <span :class=\"classes\">\n <span v-if=\"dot\" class=\"ak-tag__dot\" aria-hidden=\"true\" />\n <span v-if=\"removable\" :id=\"`${id}-text`\"><slot /></span>\n <slot v-else />\n <button\n v-if=\"removable\"\n :id=\"`${id}-remove`\"\n type=\"button\"\n class=\"ak-tag__remove\"\n aria-label=\"移除\"\n :aria-labelledby=\"`${id}-remove ${id}-text`\"\n @click=\"emit('remove')\"\n >\n ✕\n </button>\n </span>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, useId } from \"vue\";\n\nexport type TagVariant =\n | \"default\"\n | \"outline\"\n | \"accent\"\n | \"accent-soft\"\n | \"yellow\"\n | \"info\"\n | \"success\"\n | \"warning\"\n | \"danger\"\n | \"danger-solid\"\n | \"new\"\n | \"inverse\";\n\nconst props = withDefaults(\n defineProps<{\n /** 外观:状态色走 info / success / warning / danger(淡底色字);new = 红底 NEW 角标;danger-solid = BREAKING 红;yellow 次强调 */\n variant?: TagVariant;\n /** 尺寸:sm 18 · md 22 · lg 28(px 高) */\n size?: \"sm\" | \"md\" | \"lg\";\n /** 标签字(Bender 大写 + 字距),给版本号 / 状态码这类拉丁短词 */\n caps?: boolean;\n /** 前置小方点 */\n dot?: boolean;\n /** 显示移除按钮,点击触发 remove(读屏名是「移除 + 标签文字」) */\n removable?: boolean;\n }>(),\n { variant: \"default\", size: \"md\" },\n);\n\nconst emit = defineEmits<{\n /** 点了移除按钮 */\n remove: [];\n}>();\n\nconst classes = computed(() => [\n \"ak-tag\",\n props.variant !== \"default\" && `ak-tag--${props.variant}`,\n props.size !== \"md\" && `ak-tag--${props.size}`,\n { \"ak-tag--label\": props.caps },\n]);\n\nconst id = useId();\n</script>\n\n<template>\n <span :class=\"classes\">\n <span v-if=\"dot\" class=\"ak-tag__dot\" aria-hidden=\"true\" />\n <span v-if=\"removable\" :id=\"`${id}-text`\"><slot /></span>\n <slot v-else />\n <button\n v-if=\"removable\"\n :id=\"`${id}-remove`\"\n type=\"button\"\n class=\"ak-tag__remove\"\n aria-label=\"移除\"\n :aria-labelledby=\"`${id}-remove ${id}-text`\"\n @click=\"emit('remove')\"\n >\n ✕\n </button>\n </span>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nimport type { IconName } from \"../../icons\";\nimport AkIcon from \"../Icon/AkIcon.vue\";\n\nexport type CboxLevel = \"tip\" | \"info\" | \"warning\" | \"danger\" | \"neutral\";\n\nconst props = withDefaults(\n defineProps<{\n /** 等级(= 现网 {{Cbox2}} 的 lv):tip = lv0 绿「另见 / 提示」· info = lv1 蓝(默认)· warning = lv2 / lv3 · danger = lv4 · neutral 灰 */\n level?: CboxLevel;\n /** 加粗的标题行(等级色) */\n title?: string;\n /** 图标井里的图标;默认按等级:tip → arrow-ne,info / neutral → info,warning / danger → warn */\n icon?: IconName;\n /** 最宽 640px(= 模板 narrow=) */\n narrow?: boolean;\n }>(),\n { level: \"info\", title: undefined, icon: undefined },\n);\n\nconst DEFAULT_ICON: Record<CboxLevel, IconName> = { tip: \"arrow-ne\", info: \"info\", warning: \"warn\", danger: \"warn\", neutral: \"info\" };\n\nconst classes = computed(() => [\n \"ak-cbox\",\n props.level !== \"info\" && `ak-cbox--${props.level}`,\n { \"ak-cbox--narrow\": props.narrow },\n]);\n</script>\n\n<template>\n <div :class=\"classes\" role=\"note\">\n <span class=\"ak-cbox__icon\">\n <slot name=\"icon\"><AkIcon :name=\"icon ?? DEFAULT_ICON[level]\" /></slot>\n </span>\n <div class=\"ak-cbox__body\">\n <div v-if=\"title || $slots.title\" class=\"ak-cbox__title\"><slot name=\"title\">{{ title }}</slot></div>\n <slot />\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nimport type { IconName } from \"../../icons\";\nimport AkIcon from \"../Icon/AkIcon.vue\";\n\nexport type CboxLevel = \"tip\" | \"info\" | \"warning\" | \"danger\" | \"neutral\";\n\nconst props = withDefaults(\n defineProps<{\n /** 等级(= 现网 {{Cbox2}} 的 lv):tip = lv0 绿「另见 / 提示」· info = lv1 蓝(默认)· warning = lv2 / lv3 · danger = lv4 · neutral 灰 */\n level?: CboxLevel;\n /** 加粗的标题行(等级色) */\n title?: string;\n /** 图标井里的图标;默认按等级:tip → arrow-ne,info / neutral → info,warning / danger → warn */\n icon?: IconName;\n /** 最宽 640px(= 模板 narrow=) */\n narrow?: boolean;\n }>(),\n { level: \"info\", title: undefined, icon: undefined },\n);\n\nconst DEFAULT_ICON: Record<CboxLevel, IconName> = { tip: \"arrow-ne\", info: \"info\", warning: \"warn\", danger: \"warn\", neutral: \"info\" };\n\nconst classes = computed(() => [\n \"ak-cbox\",\n props.level !== \"info\" && `ak-cbox--${props.level}`,\n { \"ak-cbox--narrow\": props.narrow },\n]);\n</script>\n\n<template>\n <div :class=\"classes\" role=\"note\">\n <span class=\"ak-cbox__icon\">\n <slot name=\"icon\"><AkIcon :name=\"icon ?? DEFAULT_ICON[level]\" /></slot>\n </span>\n <div class=\"ak-cbox__body\">\n <div v-if=\"title || $slots.title\" class=\"ak-cbox__title\"><slot name=\"title\">{{ title }}</slot></div>\n <slot />\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 只有页签、没有面板(= Naive 的 NTab):一排页签当筛选 / 切换外部内容时用,只能直接放在 AkTabs 里。\n * AkTabs 读它的 name / tab / disabled / 默认插槽自己画页签,这个组件本身不会被挂载。\n */\ndefineProps<{\n /** 标识,= AkTabs 的 v-model 值 */\n name: string | number;\n /** 页签文字(也可以写在默认插槽里) */\n tab?: string;\n /** 禁用:页签不可选,方向键跳过 */\n disabled?: boolean;\n}>();\n\ndefineSlots<{\n /** 页签内容(代替 tab) */\n default?: () => unknown;\n}>();\n</script>\n\n<template>\n <slot>{{ tab }}</slot>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 只有页签、没有面板(= Naive 的 NTab):一排页签当筛选 / 切换外部内容时用,只能直接放在 AkTabs 里。\n * AkTabs 读它的 name / tab / disabled / 默认插槽自己画页签,这个组件本身不会被挂载。\n */\ndefineProps<{\n /** 标识,= AkTabs 的 v-model 值 */\n name: string | number;\n /** 页签文字(也可以写在默认插槽里) */\n tab?: string;\n /** 禁用:页签不可选,方向键跳过 */\n disabled?: boolean;\n}>();\n\ndefineSlots<{\n /** 页签内容(代替 tab) */\n default?: () => unknown;\n}>();\n</script>\n\n<template>\n <slot>{{ tab }}</slot>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 一个页签 + 它的面板(= Naive 的 NTabPane),只能直接放在 AkTabs 里。\n * AkTabs 读它的 name / tab / disabled / #tab 画页签,再把它渲染成面板(id、aria-labelledby、hidden 由 AkTabs 补上)。\n */\ndefineProps<{\n /** 标识,= AkTabs 的 v-model 值 */\n name: string | number;\n /** 页签文字;要第二行小字(「信赖 25%」)或图标时改用 #tab 插槽 */\n tab?: string;\n /** 禁用:页签不可选,方向键跳过 */\n disabled?: boolean;\n /** 面板渲染方式(同 Naive):if 只渲染当前页(默认)· show 全部渲染、非当前页 hidden · show:lazy 第一次切到时渲染,之后保留 */\n displayDirective?: \"if\" | \"show\" | \"show:lazy\";\n}>();\n\ndefineSlots<{\n /** 面板内容 */\n default?: () => unknown;\n /** 页签内容(代替 tab) */\n tab?: () => unknown;\n}>();\n</script>\n\n<template>\n <div class=\"ak-tabpanel\" role=\"tabpanel\" tabindex=\"0\"><slot /></div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 一个页签 + 它的面板(= Naive 的 NTabPane),只能直接放在 AkTabs 里。\n * AkTabs 读它的 name / tab / disabled / #tab 画页签,再把它渲染成面板(id、aria-labelledby、hidden 由 AkTabs 补上)。\n */\ndefineProps<{\n /** 标识,= AkTabs 的 v-model 值 */\n name: string | number;\n /** 页签文字;要第二行小字(「信赖 25%」)或图标时改用 #tab 插槽 */\n tab?: string;\n /** 禁用:页签不可选,方向键跳过 */\n disabled?: boolean;\n /** 面板渲染方式(同 Naive):if 只渲染当前页(默认)· show 全部渲染、非当前页 hidden · show:lazy 第一次切到时渲染,之后保留 */\n displayDirective?: \"if\" | \"show\" | \"show:lazy\";\n}>();\n\ndefineSlots<{\n /** 面板内容 */\n default?: () => unknown;\n /** 页签内容(代替 tab) */\n tab?: () => unknown;\n}>();\n</script>\n\n<template>\n <div class=\"ak-tabpanel\" role=\"tabpanel\" tabindex=\"0\"><slot /></div>\n</template>\n","<script setup lang=\"ts\">\nimport { Comment, Fragment, cloneVNode, nextTick, useId, type VNode } from \"vue\";\n\nimport AkTab from \"./AkTab.vue\";\nimport AkTabPane from \"./AkTabPane.vue\";\n\ntype Name = string | number;\n\nconst props = withDefaults(\n defineProps<{\n /** 外观:underline 下划线(默认)· pill 胶囊底 · block 游戏内块状(选中黑白反转) */\n variant?: \"underline\" | \"pill\" | \"block\";\n /** 页签位置:top 在上(默认)· left 竖排在左、面板在右(干员档案),上下方向键切换 */\n placement?: \"top\" | \"left\";\n /** 读屏用的页签组名 */\n label?: string;\n }>(),\n { variant: \"underline\", placement: \"top\", label: undefined },\n);\n\n/** 当前页签的 name;不绑定时默认第一个 */\nconst model = defineModel<Name>();\n\nconst slots = defineSlots<{\n /** AkTabPane(页签 + 面板)或 AkTab(只有页签)若干 */\n default?: () => VNode[];\n}>();\n\ninterface TabDef {\n index: number;\n name: Name;\n disabled: boolean;\n /** 页签内容:#tab 插槽(AkTab 是默认插槽),没有就用 tab 字符串 */\n label: (() => unknown) | string | undefined;\n /** AkTabPane 的 vnode;AkTab 没有面板 */\n pane?: VNode;\n directive: \"if\" | \"show\" | \"show:lazy\";\n}\n\nconst flatten = (nodes: VNode[]): VNode[] =>\n nodes.flatMap(n => (n.type === Fragment && Array.isArray(n.children) ? flatten(n.children as VNode[]) : n.type === Comment ? [] : [n]));\n\n/**\n * 同 Naive 的 NTabs:从默认插槽里挑出 AkTabPane / AkTab 读 props 和插槽,自己画页签。\n * 不走子组件注册(provide / inject),这样首次渲染 / SSR 预渲染就有完整的页签。插槽只能在渲染期调用,所以由模板调用。\n */\nfunction collect(): TabDef[] {\n const nodes = flatten(slots.default?.() ?? []);\n const panes = nodes.filter(n => n.type === AkTabPane);\n return (panes.length ? panes : nodes.filter(n => n.type === AkTab)).map((n, index) => {\n const p = (n.props ?? {}) as Record<string, unknown>;\n const s = (n.children ?? {}) as Record<string, (() => unknown) | undefined>;\n const isPane = n.type === AkTabPane;\n return {\n index,\n name: p.name as Name,\n disabled: p.disabled !== undefined && p.disabled !== false, // <AkTabPane disabled> 在 vnode.props 里是 \"\"\n label: (isPane ? s.tab : s.default) ?? (p.tab as string | undefined),\n pane: isPane ? n : undefined,\n directive: (p.displayDirective ?? p[\"display-directive\"] ?? \"if\") as TabDef[\"directive\"],\n };\n });\n}\n\nconst current = (tabs: TabDef[]) => model.value ?? tabs[0]?.name;\n\n/** show:lazy 已经切到过的页;只在渲染期随当前页一起变,不需要响应式 */\nconst visited = new Set<Name>();\nfunction isRendered(t: TabDef, tabs: TabDef[]) {\n if (!t.pane) return false;\n if (t.name === current(tabs)) {\n visited.add(t.name);\n return true;\n }\n return t.directive === \"show\" || (t.directive === \"show:lazy\" && visited.has(t.name));\n}\n\nconst id = useId();\nconst tabId = (t: TabDef) => `${id}-tab-${t.index}`;\nconst panelId = (t: TabDef) => `${id}-panel-${t.index}`;\n\n/** 方向键 / Home / End 在页签间移动并选中(WAI-ARIA Tabs,自动激活) */\nfunction onKey(e: KeyboardEvent, tabs: TabDef[]) {\n const enabled = tabs.filter(t => !t.disabled);\n const i = enabled.findIndex(t => t.name === current(tabs));\n const [prev, next] = props.placement === \"left\" ? [\"ArrowUp\", \"ArrowDown\"] : [\"ArrowLeft\", \"ArrowRight\"];\n const to =\n e.key === next ? enabled[(i + 1) % enabled.length]\n : e.key === prev ? enabled[(i - 1 + enabled.length) % enabled.length]\n : e.key === \"Home\" ? enabled[0]\n : e.key === \"End\" ? enabled.at(-1)\n : undefined;\n if (!to) return;\n e.preventDefault();\n model.value = to.name;\n const tablist = e.currentTarget as HTMLElement;\n nextTick(() => tablist.querySelector<HTMLElement>(`#${CSS.escape(tabId(to))}`)?.focus());\n}\n\n/** 把插槽函数 / 字符串 / vnode 原样渲染;定义在外面保持同一个组件类型,重渲染时不重建 */\nconst Render = (p: { content: unknown }) => (typeof p.content === \"function\" ? p.content() : p.content);\n</script>\n\n<template>\n <div :class=\"['ak-tabset', placement === 'left' && 'ak-tabset--left']\">\n <template v-for=\"tabs in [collect()]\" :key=\"0\">\n <div\n :class=\"['ak-tabs', variant !== 'underline' && `ak-tabs--${variant}`, placement === 'left' && 'ak-tabs--vertical']\"\n role=\"tablist\"\n :aria-label=\"label\"\n :aria-orientation=\"placement === 'left' ? 'vertical' : undefined\"\n @keydown=\"onKey($event, tabs)\"\n >\n <button\n v-for=\"t in tabs\"\n :id=\"tabId(t)\"\n :key=\"t.name\"\n type=\"button\"\n role=\"tab\"\n :class=\"['ak-tab', { 'is-active': t.name === current(tabs) }]\"\n :aria-selected=\"t.name === current(tabs)\"\n :aria-controls=\"isRendered(t, tabs) ? panelId(t) : undefined\"\n :tabindex=\"t.name === current(tabs) ? 0 : -1\"\n :disabled=\"t.disabled\"\n @click=\"model = t.name\"\n >\n <Render :content=\"t.label\" />\n </button>\n </div>\n <template v-for=\"t in tabs\" :key=\"t.name\">\n <Render\n v-if=\"t.pane && isRendered(t, tabs)\"\n :content=\"cloneVNode(t.pane, { id: panelId(t), 'aria-labelledby': tabId(t), hidden: t.name !== current(tabs) || undefined })\"\n />\n </template>\n </template>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { Comment, Fragment, cloneVNode, nextTick, useId, type VNode } from \"vue\";\n\nimport AkTab from \"./AkTab.vue\";\nimport AkTabPane from \"./AkTabPane.vue\";\n\ntype Name = string | number;\n\nconst props = withDefaults(\n defineProps<{\n /** 外观:underline 下划线(默认)· pill 胶囊底 · block 游戏内块状(选中黑白反转) */\n variant?: \"underline\" | \"pill\" | \"block\";\n /** 页签位置:top 在上(默认)· left 竖排在左、面板在右(干员档案),上下方向键切换 */\n placement?: \"top\" | \"left\";\n /** 读屏用的页签组名 */\n label?: string;\n }>(),\n { variant: \"underline\", placement: \"top\", label: undefined },\n);\n\n/** 当前页签的 name;不绑定时默认第一个 */\nconst model = defineModel<Name>();\n\nconst slots = defineSlots<{\n /** AkTabPane(页签 + 面板)或 AkTab(只有页签)若干 */\n default?: () => VNode[];\n}>();\n\ninterface TabDef {\n index: number;\n name: Name;\n disabled: boolean;\n /** 页签内容:#tab 插槽(AkTab 是默认插槽),没有就用 tab 字符串 */\n label: (() => unknown) | string | undefined;\n /** AkTabPane 的 vnode;AkTab 没有面板 */\n pane?: VNode;\n directive: \"if\" | \"show\" | \"show:lazy\";\n}\n\nconst flatten = (nodes: VNode[]): VNode[] =>\n nodes.flatMap(n => (n.type === Fragment && Array.isArray(n.children) ? flatten(n.children as VNode[]) : n.type === Comment ? [] : [n]));\n\n/**\n * 同 Naive 的 NTabs:从默认插槽里挑出 AkTabPane / AkTab 读 props 和插槽,自己画页签。\n * 不走子组件注册(provide / inject),这样首次渲染 / SSR 预渲染就有完整的页签。插槽只能在渲染期调用,所以由模板调用。\n */\nfunction collect(): TabDef[] {\n const nodes = flatten(slots.default?.() ?? []);\n const panes = nodes.filter(n => n.type === AkTabPane);\n return (panes.length ? panes : nodes.filter(n => n.type === AkTab)).map((n, index) => {\n const p = (n.props ?? {}) as Record<string, unknown>;\n const s = (n.children ?? {}) as Record<string, (() => unknown) | undefined>;\n const isPane = n.type === AkTabPane;\n return {\n index,\n name: p.name as Name,\n disabled: p.disabled !== undefined && p.disabled !== false, // <AkTabPane disabled> 在 vnode.props 里是 \"\"\n label: (isPane ? s.tab : s.default) ?? (p.tab as string | undefined),\n pane: isPane ? n : undefined,\n directive: (p.displayDirective ?? p[\"display-directive\"] ?? \"if\") as TabDef[\"directive\"],\n };\n });\n}\n\nconst current = (tabs: TabDef[]) => model.value ?? tabs[0]?.name;\n\n/** show:lazy 已经切到过的页;只在渲染期随当前页一起变,不需要响应式 */\nconst visited = new Set<Name>();\nfunction isRendered(t: TabDef, tabs: TabDef[]) {\n if (!t.pane) return false;\n if (t.name === current(tabs)) {\n visited.add(t.name);\n return true;\n }\n return t.directive === \"show\" || (t.directive === \"show:lazy\" && visited.has(t.name));\n}\n\nconst id = useId();\nconst tabId = (t: TabDef) => `${id}-tab-${t.index}`;\nconst panelId = (t: TabDef) => `${id}-panel-${t.index}`;\n\n/** 方向键 / Home / End 在页签间移动并选中(WAI-ARIA Tabs,自动激活) */\nfunction onKey(e: KeyboardEvent, tabs: TabDef[]) {\n const enabled = tabs.filter(t => !t.disabled);\n const i = enabled.findIndex(t => t.name === current(tabs));\n const [prev, next] = props.placement === \"left\" ? [\"ArrowUp\", \"ArrowDown\"] : [\"ArrowLeft\", \"ArrowRight\"];\n const to =\n e.key === next ? enabled[(i + 1) % enabled.length]\n : e.key === prev ? enabled[(i - 1 + enabled.length) % enabled.length]\n : e.key === \"Home\" ? enabled[0]\n : e.key === \"End\" ? enabled.at(-1)\n : undefined;\n if (!to) return;\n e.preventDefault();\n model.value = to.name;\n const tablist = e.currentTarget as HTMLElement;\n nextTick(() => tablist.querySelector<HTMLElement>(`#${CSS.escape(tabId(to))}`)?.focus());\n}\n\n/** 把插槽函数 / 字符串 / vnode 原样渲染;定义在外面保持同一个组件类型,重渲染时不重建 */\nconst Render = (p: { content: unknown }) => (typeof p.content === \"function\" ? p.content() : p.content);\n</script>\n\n<template>\n <div :class=\"['ak-tabset', placement === 'left' && 'ak-tabset--left']\">\n <template v-for=\"tabs in [collect()]\" :key=\"0\">\n <div\n :class=\"['ak-tabs', variant !== 'underline' && `ak-tabs--${variant}`, placement === 'left' && 'ak-tabs--vertical']\"\n role=\"tablist\"\n :aria-label=\"label\"\n :aria-orientation=\"placement === 'left' ? 'vertical' : undefined\"\n @keydown=\"onKey($event, tabs)\"\n >\n <button\n v-for=\"t in tabs\"\n :id=\"tabId(t)\"\n :key=\"t.name\"\n type=\"button\"\n role=\"tab\"\n :class=\"['ak-tab', { 'is-active': t.name === current(tabs) }]\"\n :aria-selected=\"t.name === current(tabs)\"\n :aria-controls=\"isRendered(t, tabs) ? panelId(t) : undefined\"\n :tabindex=\"t.name === current(tabs) ? 0 : -1\"\n :disabled=\"t.disabled\"\n @click=\"model = t.name\"\n >\n <Render :content=\"t.label\" />\n </button>\n </div>\n <template v-for=\"t in tabs\" :key=\"t.name\">\n <Render\n v-if=\"t.pane && isRendered(t, tabs)\"\n :content=\"cloneVNode(t.pane, { id: panelId(t), 'aria-labelledby': tabId(t), hidden: t.name !== current(tabs) || undefined })\"\n />\n </template>\n </template>\n </div>\n</template>\n","import type { InjectionKey } from \"vue\";\n\nexport type ItemSize = \"sm\" | \"md\" | \"lg\";\n\n/** AkItemList / AkMaterialsRow 给里面 AkItem 的默认尺寸(同 AkButtonGroup → AkButton) */\nexport const itemListKey: InjectionKey<{ size?: ItemSize }> = Symbol(\"AkItemList\");\n","<script setup lang=\"ts\">\nimport { computed, inject } from \"vue\";\n\nimport { itemListKey, type ItemSize } from \"./context\";\n\nconst props = withDefaults(\n defineProps<{\n /** 图片地址:默认是现网拼好的「道具_带框_<名>.png」(底框 + 图标);bare 时是裸图标 */\n src: string;\n /** 道具名:作 alt,并默认作悬停提示 */\n name: string;\n /** 数量:数字或写好的串(\"30K\" / \"99+\");不写不显示。inline 时显示成图后的「×数量」 */\n count?: number | string;\n /** 数量不足(红字) */\n insufficient?: boolean;\n /** 尺寸:sm 40 · md 56 · lg 76(px);不写时跟 AkItemList 的 size(材料表里是 sm),再不然是 md;inline 时固定 22 */\n size?: ItemSize;\n /** 裸图标:底框由 CSS 按 rarity 画(只有 torappu 透明图标、没有合成图时用) */\n bare?: boolean;\n /** bare 时的底框稀有度 1–6(白 / 绿 / 蓝 / 紫 / 金 / 特殊) */\n rarity?: 1 | 2 | 3 | 4 | 5 | 6;\n /** 去色(未获得 / 不可用) */\n disabled?: boolean;\n /** 招聘合同那种:叠在底图空框里的干员头像;inline 时不显示 */\n avatar?: string;\n /** 链接到道具页 */\n href?: string;\n /** 悬停提示(data-ak-tip):默认是 name,可改写;false 关掉 */\n tip?: string | false;\n /** 行内:22px 小图 + 文字,放在正文里(龙门币×30000);文字默认是「×count」,可用默认插槽改写 */\n inline?: boolean;\n }>(),\n { count: undefined, size: undefined, rarity: undefined, avatar: undefined, href: undefined, tip: undefined },\n);\n\nconst list = inject(itemListKey, null);\nconst size = computed(() => props.size ?? list?.size ?? \"md\");\n\nconst classes = computed(() => [\n \"ak-item\",\n !props.inline && size.value !== \"md\" && `ak-item--${size.value}`,\n { \"ak-item--bare\": props.bare, \"is-disabled\": props.disabled },\n]);\nconst tipText = computed(() => (props.tip === false ? undefined : (props.tip ?? props.name)));\n</script>\n\n<template>\n <component :is=\"href ? 'a' : 'span'\" v-if=\"inline\" class=\"ak-item-inline\" :href=\"href\" :data-ak-tip=\"tipText\">\n <span :class=\"classes\" :data-rarity=\"bare ? rarity : undefined\"><img :src=\"src\" :alt=\"name\" /></span>\n <span v-if=\"$slots.default || count !== undefined\" :class=\"insufficient ? 'ak-fg-danger' : undefined\"><slot>×{{ count }}</slot></span>\n </component>\n <component\n :is=\"href ? 'a' : 'span'\"\n v-else\n :class=\"classes\"\n :href=\"href\"\n :data-rarity=\"bare ? rarity : undefined\"\n :data-ak-tip=\"tipText\"\n >\n <img :src=\"src\" :alt=\"name\" />\n <img v-if=\"avatar\" class=\"ak-item__avatar\" :src=\"avatar\" alt=\"\" />\n <span v-if=\"count !== undefined\" :class=\"['ak-item__count', { 'is-short': insufficient }]\">{{ count }}</span>\n </component>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, inject } from \"vue\";\n\nimport { itemListKey, type ItemSize } from \"./context\";\n\nconst props = withDefaults(\n defineProps<{\n /** 图片地址:默认是现网拼好的「道具_带框_<名>.png」(底框 + 图标);bare 时是裸图标 */\n src: string;\n /** 道具名:作 alt,并默认作悬停提示 */\n name: string;\n /** 数量:数字或写好的串(\"30K\" / \"99+\");不写不显示。inline 时显示成图后的「×数量」 */\n count?: number | string;\n /** 数量不足(红字) */\n insufficient?: boolean;\n /** 尺寸:sm 40 · md 56 · lg 76(px);不写时跟 AkItemList 的 size(材料表里是 sm),再不然是 md;inline 时固定 22 */\n size?: ItemSize;\n /** 裸图标:底框由 CSS 按 rarity 画(只有 torappu 透明图标、没有合成图时用) */\n bare?: boolean;\n /** bare 时的底框稀有度 1–6(白 / 绿 / 蓝 / 紫 / 金 / 特殊) */\n rarity?: 1 | 2 | 3 | 4 | 5 | 6;\n /** 去色(未获得 / 不可用) */\n disabled?: boolean;\n /** 招聘合同那种:叠在底图空框里的干员头像;inline 时不显示 */\n avatar?: string;\n /** 链接到道具页 */\n href?: string;\n /** 悬停提示(data-ak-tip):默认是 name,可改写;false 关掉 */\n tip?: string | false;\n /** 行内:22px 小图 + 文字,放在正文里(龙门币×30000);文字默认是「×count」,可用默认插槽改写 */\n inline?: boolean;\n }>(),\n { count: undefined, size: undefined, rarity: undefined, avatar: undefined, href: undefined, tip: undefined },\n);\n\nconst list = inject(itemListKey, null);\nconst size = computed(() => props.size ?? list?.size ?? \"md\");\n\nconst classes = computed(() => [\n \"ak-item\",\n !props.inline && size.value !== \"md\" && `ak-item--${size.value}`,\n { \"ak-item--bare\": props.bare, \"is-disabled\": props.disabled },\n]);\nconst tipText = computed(() => (props.tip === false ? undefined : (props.tip ?? props.name)));\n</script>\n\n<template>\n <component :is=\"href ? 'a' : 'span'\" v-if=\"inline\" class=\"ak-item-inline\" :href=\"href\" :data-ak-tip=\"tipText\">\n <span :class=\"classes\" :data-rarity=\"bare ? rarity : undefined\"><img :src=\"src\" :alt=\"name\" /></span>\n <span v-if=\"$slots.default || count !== undefined\" :class=\"insufficient ? 'ak-fg-danger' : undefined\"><slot>×{{ count }}</slot></span>\n </component>\n <component\n :is=\"href ? 'a' : 'span'\"\n v-else\n :class=\"classes\"\n :href=\"href\"\n :data-rarity=\"bare ? rarity : undefined\"\n :data-ak-tip=\"tipText\"\n >\n <img :src=\"src\" :alt=\"name\" />\n <img v-if=\"avatar\" class=\"ak-item__avatar\" :src=\"avatar\" alt=\"\" />\n <span v-if=\"count !== undefined\" :class=\"['ak-item__count', { 'is-short': insufficient }]\">{{ count }}</span>\n </component>\n</template>\n","<script setup lang=\"ts\">\nimport { provide } from \"vue\";\n\nimport { itemListKey, type ItemSize } from \"./context\";\n\n/** 一排道具:换行、间距 6 / 8 */\nconst props = defineProps<{\n /** 里面道具的默认尺寸(道具自己写了 size 以道具为准,同 AkButtonGroup) */\n size?: ItemSize;\n}>();\n\ndefineSlots<{\n /** 若干 AkItem */\n default?: () => unknown;\n}>();\n\nprovide(itemListKey, props);\n</script>\n\n<template>\n <div class=\"ak-item-list\"><slot /></div>\n</template>\n","<script setup lang=\"ts\">\nimport { provide } from \"vue\";\n\nimport { itemListKey, type ItemSize } from \"./context\";\n\n/** 一排道具:换行、间距 6 / 8 */\nconst props = defineProps<{\n /** 里面道具的默认尺寸(道具自己写了 size 以道具为准,同 AkButtonGroup) */\n size?: ItemSize;\n}>();\n\ndefineSlots<{\n /** 若干 AkItem */\n default?: () => unknown;\n}>();\n\nprovide(itemListKey, props);\n</script>\n\n<template>\n <div class=\"ak-item-list\"><slot /></div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 可交互的筛选芯片(= Naive 的 NTag checkable):一个开关按钮,点一下选中 / 取消,aria-pressed 报状态。\n * 选中 = 主色实底 + 左上角三角角标(同 .ak-tab / .ak-card 的选中角标)。\n * data-no-toggle:皮肤 / 预览脚本会在 document 上把所有 .ak-chip 的 is-active / aria-pressed 翻一遍(给模板输出的纯 CSS 芯片用),\n * 状态归 Vue 管的芯片要用它退出,否则两边各翻一次、DOM 与 v-model 对不上。\n */\nimport type { IconName } from \"../../icons\";\nimport AkIcon from \"../Icon/AkIcon.vue\";\n\nwithDefaults(\n defineProps<{\n /** 文字前的图标(芯片自带 6px 间距) */\n icon?: IconName;\n }>(),\n { icon: undefined },\n);\n\n/** 是否选中(= Naive 的 checked);点击切换 */\nconst checked = defineModel<boolean>({ default: false });\n\ndefineSlots<{\n /** 芯片文字 */\n default?: () => unknown;\n}>();\n</script>\n\n<template>\n <button type=\"button\" :class=\"['ak-chip', { 'is-active': checked }]\" :aria-pressed=\"checked\" data-no-toggle @click=\"checked = !checked\">\n <AkIcon v-if=\"icon\" :name=\"icon\" :size=\"14\" />\n <slot />\n </button>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 可交互的筛选芯片(= Naive 的 NTag checkable):一个开关按钮,点一下选中 / 取消,aria-pressed 报状态。\n * 选中 = 主色实底 + 左上角三角角标(同 .ak-tab / .ak-card 的选中角标)。\n * data-no-toggle:皮肤 / 预览脚本会在 document 上把所有 .ak-chip 的 is-active / aria-pressed 翻一遍(给模板输出的纯 CSS 芯片用),\n * 状态归 Vue 管的芯片要用它退出,否则两边各翻一次、DOM 与 v-model 对不上。\n */\nimport type { IconName } from \"../../icons\";\nimport AkIcon from \"../Icon/AkIcon.vue\";\n\nwithDefaults(\n defineProps<{\n /** 文字前的图标(芯片自带 6px 间距) */\n icon?: IconName;\n }>(),\n { icon: undefined },\n);\n\n/** 是否选中(= Naive 的 checked);点击切换 */\nconst checked = defineModel<boolean>({ default: false });\n\ndefineSlots<{\n /** 芯片文字 */\n default?: () => unknown;\n}>();\n</script>\n\n<template>\n <button type=\"button\" :class=\"['ak-chip', { 'is-active': checked }]\" :aria-pressed=\"checked\" data-no-toggle @click=\"checked = !checked\">\n <AkIcon v-if=\"icon\" :name=\"icon\" :size=\"14\" />\n <slot />\n </button>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 计数徽标 / 未读点(= Naive 的 NBadge)。默认插槽写了内容时,徽标骑在它右上角(.ak-badge-wrap);不写就是一枚行内徽标。\n * 默认黄(次强调「提示」):未读数不是高危信息,红只给回退 / 权限变更这类 alerts;NEW 角标是 AkTag variant=\"new\",不是徽标。\n */\nimport { computed } from \"vue\";\n\nconst props = withDefaults(\n defineProps<{\n /** 数字或短串;数字为 0 时默认不显示(见 showZero) */\n value?: number | string;\n /** 封顶:value 按数字大于它时显示「max+」(99+) */\n max?: number;\n /** 圆点:不显示数字,只提示「有新的」 */\n dot?: boolean;\n /** 是否显示徽标(同 Naive);false 时只剩包住的内容 */\n show?: boolean;\n /** value 为 0 时也显示 */\n showZero?: boolean;\n /** 颜色:default 黄(未读计数 / 点)· accent 主色 · danger 红(只给回退 / 权限变更这类 alerts) */\n variant?: \"default\" | \"accent\" | \"danger\";\n /** 读屏文本(「3 条未读通知」):写了就把数字对读屏隐藏、改念这句;圆点徽标一定要写 */\n label?: string;\n }>(),\n { value: undefined, max: undefined, show: true, variant: \"default\", label: undefined },\n);\n\ndefineSlots<{\n /** 被标记的内容(头像、图标按钮…):徽标骑在它右上角;不写就是独立的行内徽标 */\n default?: () => unknown;\n}>();\n\nconst visible = computed(() => {\n if (!props.show) return false;\n if (props.dot) return true;\n if (props.value === undefined || props.value === \"\") return false;\n return props.showZero || !(Number(props.value) <= 0);\n});\n\nconst text = computed(() => {\n if (props.dot) return \"\";\n const v = props.value;\n return props.max !== undefined && Number(v) > props.max ? `${props.max}+` : String(v ?? \"\");\n});\n\nconst classes = computed(() => [\n \"ak-badge\",\n props.variant !== \"default\" && `ak-badge--${props.variant}`,\n { \"ak-badge--dot\": props.dot },\n]);\n</script>\n\n<template>\n <span v-if=\"$slots.default\" class=\"ak-badge-wrap\">\n <slot />\n <span v-if=\"visible\" :class=\"classes\">\n <template v-if=\"label\"><span v-if=\"text\" aria-hidden=\"true\">{{ text }}</span><span class=\"ak-sr-only\">{{ label }}</span></template>\n <template v-else>{{ text }}</template>\n </span>\n </span>\n <span v-else-if=\"visible\" :class=\"classes\">\n <template v-if=\"label\"><span v-if=\"text\" aria-hidden=\"true\">{{ text }}</span><span class=\"ak-sr-only\">{{ label }}</span></template>\n <template v-else>{{ text }}</template>\n </span>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 计数徽标 / 未读点(= Naive 的 NBadge)。默认插槽写了内容时,徽标骑在它右上角(.ak-badge-wrap);不写就是一枚行内徽标。\n * 默认黄(次强调「提示」):未读数不是高危信息,红只给回退 / 权限变更这类 alerts;NEW 角标是 AkTag variant=\"new\",不是徽标。\n */\nimport { computed } from \"vue\";\n\nconst props = withDefaults(\n defineProps<{\n /** 数字或短串;数字为 0 时默认不显示(见 showZero) */\n value?: number | string;\n /** 封顶:value 按数字大于它时显示「max+」(99+) */\n max?: number;\n /** 圆点:不显示数字,只提示「有新的」 */\n dot?: boolean;\n /** 是否显示徽标(同 Naive);false 时只剩包住的内容 */\n show?: boolean;\n /** value 为 0 时也显示 */\n showZero?: boolean;\n /** 颜色:default 黄(未读计数 / 点)· accent 主色 · danger 红(只给回退 / 权限变更这类 alerts) */\n variant?: \"default\" | \"accent\" | \"danger\";\n /** 读屏文本(「3 条未读通知」):写了就把数字对读屏隐藏、改念这句;圆点徽标一定要写 */\n label?: string;\n }>(),\n { value: undefined, max: undefined, show: true, variant: \"default\", label: undefined },\n);\n\ndefineSlots<{\n /** 被标记的内容(头像、图标按钮…):徽标骑在它右上角;不写就是独立的行内徽标 */\n default?: () => unknown;\n}>();\n\nconst visible = computed(() => {\n if (!props.show) return false;\n if (props.dot) return true;\n if (props.value === undefined || props.value === \"\") return false;\n return props.showZero || !(Number(props.value) <= 0);\n});\n\nconst text = computed(() => {\n if (props.dot) return \"\";\n const v = props.value;\n return props.max !== undefined && Number(v) > props.max ? `${props.max}+` : String(v ?? \"\");\n});\n\nconst classes = computed(() => [\n \"ak-badge\",\n props.variant !== \"default\" && `ak-badge--${props.variant}`,\n { \"ak-badge--dot\": props.dot },\n]);\n</script>\n\n<template>\n <span v-if=\"$slots.default\" class=\"ak-badge-wrap\">\n <slot />\n <span v-if=\"visible\" :class=\"classes\">\n <template v-if=\"label\"><span v-if=\"text\" aria-hidden=\"true\">{{ text }}</span><span class=\"ak-sr-only\">{{ label }}</span></template>\n <template v-else>{{ text }}</template>\n </span>\n </span>\n <span v-else-if=\"visible\" :class=\"classes\">\n <template v-if=\"label\"><span v-if=\"text\" aria-hidden=\"true\">{{ text }}</span><span class=\"ak-sr-only\">{{ label }}</span></template>\n <template v-else>{{ text }}</template>\n </span>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 卡片(= Naive 的 NCard):1px 边、直角、表面色。标题 / 眉题默认直接排在正文顶部;\n * segmented(或写了 #header-extra)时标题单独成一栏、下面一道分隔线。页脚是表面 2 底的一栏。\n */\nimport { computed } from \"vue\";\n\ntype TitleTag = \"div\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\";\n\nconst props = withDefaults(\n defineProps<{\n /** 标题(也可用 #header 插槽) */\n title?: string;\n /** 标题上方的灰色小字(Bender 大写:「Side Story」「01 · Foundations」) */\n eyebrow?: string;\n /** 标题元素:默认 div;卡片是页面大纲里的一节时用 h2–h6 */\n titleTag?: TitleTag;\n /** 标题独立成栏、下面一道分隔线(同 Naive 的 segmented);写了 #header-extra 时自动成栏 */\n segmented?: boolean;\n /** 封面图地址:16:9 裁切铺满顶部;horizontal 时在左边占 40%。要自定义用 #cover */\n cover?: string;\n /** 外观:default 表面色 + 1px 边 · flat 无边、表面 2 底 · inset 凹陷底 */\n variant?: \"default\" | \"flat\" | \"inset\";\n /** 主色色条:top 顶部 3px · left 左侧 4px(公告 / 提示 / 天赋条目) */\n accent?: \"top\" | \"left\";\n /** 悬停时主色描边 + 投影 + 上移 2px(同 Naive 的 hoverable);整卡可点时用 */\n hoverable?: boolean;\n /** 选中:主色内描边 + 左上角三角角标(源自游戏内技能选中框) */\n selected?: boolean;\n /** 横排:封面在左、正文在右 */\n horizontal?: boolean;\n /** 整张卡是一个链接:渲染成 <a>(带 ak-not-prose,正文链接色 / 下划线不进来);这时正文里别再放链接 */\n href?: string;\n }>(),\n { title: undefined, eyebrow: undefined, titleTag: \"div\", cover: undefined, variant: \"default\", accent: undefined, href: undefined },\n);\n\nconst slots = defineSlots<{\n /** 正文 */\n default?: () => unknown;\n /** 标题内容(代替 title) */\n header?: () => unknown;\n /** 标题栏右侧(标签、按钮);写了它标题自动成栏 */\n \"header-extra\"?: () => unknown;\n /** 页脚(日期 + 操作):表面 2 底、上面一道线 */\n footer?: () => unknown;\n /** 自定义封面(代替 cover);图片自己加 class=\"ak-card__media\" */\n cover?: () => unknown;\n}>();\n\nconst bar = computed(() => props.segmented || !!slots[\"header-extra\"]);\nconst hasTitle = computed(() => !!props.title || !!slots.header);\n\nconst classes = computed(() => [\n \"ak-card\",\n props.variant !== \"default\" && `ak-card--${props.variant}`,\n props.accent && `ak-card--accent-${props.accent}`,\n {\n \"ak-card--hover\": props.hoverable,\n \"ak-card--selected\": props.selected,\n \"ak-card--horizontal\": props.horizontal,\n /* 整块是链接:挡掉正文的 a:hover 下划线 / a:visited 褪色(base/typography.css prose / not-prose) */\n \"ak-not-prose\": !!props.href,\n },\n]);\n</script>\n\n<template>\n <component :is=\"href ? 'a' : 'div'\" :class=\"classes\" :href=\"href\">\n <slot name=\"cover\"><img v-if=\"cover\" class=\"ak-card__media\" :src=\"cover\" alt=\"\" /></slot>\n <div v-if=\"bar\" class=\"ak-card__header\">\n <component :is=\"titleTag\" class=\"ak-card__title\">\n <span v-if=\"eyebrow\" class=\"ak-card__eyebrow\">{{ eyebrow }}</span>\n <slot name=\"header\">{{ title }}</slot>\n </component>\n <slot name=\"header-extra\" />\n </div>\n <div class=\"ak-card__body\">\n <template v-if=\"!bar\">\n <span v-if=\"eyebrow\" class=\"ak-card__eyebrow\">{{ eyebrow }}</span>\n <component :is=\"titleTag\" v-if=\"hasTitle\" class=\"ak-card__title\"><slot name=\"header\">{{ title }}</slot></component>\n </template>\n <slot />\n </div>\n <div v-if=\"$slots.footer\" class=\"ak-card__footer\"><slot name=\"footer\" /></div>\n </component>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 卡片(= Naive 的 NCard):1px 边、直角、表面色。标题 / 眉题默认直接排在正文顶部;\n * segmented(或写了 #header-extra)时标题单独成一栏、下面一道分隔线。页脚是表面 2 底的一栏。\n */\nimport { computed } from \"vue\";\n\ntype TitleTag = \"div\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\";\n\nconst props = withDefaults(\n defineProps<{\n /** 标题(也可用 #header 插槽) */\n title?: string;\n /** 标题上方的灰色小字(Bender 大写:「Side Story」「01 · Foundations」) */\n eyebrow?: string;\n /** 标题元素:默认 div;卡片是页面大纲里的一节时用 h2–h6 */\n titleTag?: TitleTag;\n /** 标题独立成栏、下面一道分隔线(同 Naive 的 segmented);写了 #header-extra 时自动成栏 */\n segmented?: boolean;\n /** 封面图地址:16:9 裁切铺满顶部;horizontal 时在左边占 40%。要自定义用 #cover */\n cover?: string;\n /** 外观:default 表面色 + 1px 边 · flat 无边、表面 2 底 · inset 凹陷底 */\n variant?: \"default\" | \"flat\" | \"inset\";\n /** 主色色条:top 顶部 3px · left 左侧 4px(公告 / 提示 / 天赋条目) */\n accent?: \"top\" | \"left\";\n /** 悬停时主色描边 + 投影 + 上移 2px(同 Naive 的 hoverable);整卡可点时用 */\n hoverable?: boolean;\n /** 选中:主色内描边 + 左上角三角角标(源自游戏内技能选中框) */\n selected?: boolean;\n /** 横排:封面在左、正文在右 */\n horizontal?: boolean;\n /** 整张卡是一个链接:渲染成 <a>(带 ak-not-prose,正文链接色 / 下划线不进来);这时正文里别再放链接 */\n href?: string;\n }>(),\n { title: undefined, eyebrow: undefined, titleTag: \"div\", cover: undefined, variant: \"default\", accent: undefined, href: undefined },\n);\n\nconst slots = defineSlots<{\n /** 正文 */\n default?: () => unknown;\n /** 标题内容(代替 title) */\n header?: () => unknown;\n /** 标题栏右侧(标签、按钮);写了它标题自动成栏 */\n \"header-extra\"?: () => unknown;\n /** 页脚(日期 + 操作):表面 2 底、上面一道线 */\n footer?: () => unknown;\n /** 自定义封面(代替 cover);图片自己加 class=\"ak-card__media\" */\n cover?: () => unknown;\n}>();\n\nconst bar = computed(() => props.segmented || !!slots[\"header-extra\"]);\nconst hasTitle = computed(() => !!props.title || !!slots.header);\n\nconst classes = computed(() => [\n \"ak-card\",\n props.variant !== \"default\" && `ak-card--${props.variant}`,\n props.accent && `ak-card--accent-${props.accent}`,\n {\n \"ak-card--hover\": props.hoverable,\n \"ak-card--selected\": props.selected,\n \"ak-card--horizontal\": props.horizontal,\n /* 整块是链接:挡掉正文的 a:hover 下划线 / a:visited 褪色(base/typography.css prose / not-prose) */\n \"ak-not-prose\": !!props.href,\n },\n]);\n</script>\n\n<template>\n <component :is=\"href ? 'a' : 'div'\" :class=\"classes\" :href=\"href\">\n <slot name=\"cover\"><img v-if=\"cover\" class=\"ak-card__media\" :src=\"cover\" alt=\"\" /></slot>\n <div v-if=\"bar\" class=\"ak-card__header\">\n <component :is=\"titleTag\" class=\"ak-card__title\">\n <span v-if=\"eyebrow\" class=\"ak-card__eyebrow\">{{ eyebrow }}</span>\n <slot name=\"header\">{{ title }}</slot>\n </component>\n <slot name=\"header-extra\" />\n </div>\n <div class=\"ak-card__body\">\n <template v-if=\"!bar\">\n <span v-if=\"eyebrow\" class=\"ak-card__eyebrow\">{{ eyebrow }}</span>\n <component :is=\"titleTag\" v-if=\"hasTitle\" class=\"ak-card__title\"><slot name=\"header\">{{ title }}</slot></component>\n </template>\n <slot />\n </div>\n <div v-if=\"$slots.footer\" class=\"ak-card__footer\"><slot name=\"footer\" /></div>\n </component>\n</template>\n","<template>\n <!-- 卡片网格:自动填充,每列至少 260px(窄屏一列),间距 16 -->\n <div class=\"ak-card-grid\"><slot /></div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 面板:带标题栏的容器(游戏内 announce panel)——标题栏表面 2 底、左侧 4px 主色条;标题后可跟 Bender 英文。\n * 与 AkCard 的分工:卡片是一件可并列 / 可点的东西,面板是页面上一块有名字的区域(首页「今日信息」「新增关卡」)。\n * collapsible 时点标题栏收起 / 展开(同 Naive NCollapseItem 的单项用法),展开状态是 v-model;\n * 键盘:标题文字是 role=\"button\"(在标题元素里面,h3 的大纲语义不丢,同 WAI-ARIA Accordion),Enter / Space 切换。\n */\nimport { computed, useId, useTemplateRef } from \"vue\";\n\ntype TitleTag = \"div\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\";\n\nconst props = withDefaults(\n defineProps<{\n /** 标题(也可用 #header 插槽) */\n title?: string;\n /** 标题后的英文(Bender 大写灰字:「Today」「Operations」) */\n en?: string;\n /** 标题元素:默认 div;面板是页面大纲里的一节时用 h2–h6(首页「新增关卡」是 h3) */\n titleTag?: TitleTag;\n /** 标题栏反转(亮色下黑底白字、暗色下白底黑字,同 .ak-inverse):公告这类要跳出来的区域 */\n inverse?: boolean;\n /** 可折叠:点标题栏收起 / 展开正文(右端出现开合记号:收起 + / 展开 −);需要有标题 */\n collapsible?: boolean;\n }>(),\n { title: undefined, en: undefined, titleTag: \"div\" },\n);\n\n/** 是否展开(collapsible 时有效);默认展开 */\nconst expanded = defineModel<boolean>({ default: true });\n\nconst slots = defineSlots<{\n /** 正文 */\n default?: () => unknown;\n /** 标题内容(代替 title) */\n header?: () => unknown;\n /** 标题栏右侧(标签、日期、按钮) */\n \"header-extra\"?: () => unknown;\n}>();\n\nconst id = useId();\nconst toggle = useTemplateRef<HTMLElement>(\"toggle\");\nconst hasHead = computed(() => !!props.title || !!slots.header || !!slots[\"header-extra\"]);\nconst collapsed = computed(() => props.collapsible && !expanded.value);\n\n/**\n * 整条标题栏都能点(同 CSS 的 cursor: pointer);标题栏里别的链接 / 按钮自己的点击不算。\n * 皮肤 / 预览脚本也会给纯 CSS 面板的标题栏点击翻 is-collapsed——标题栏上的 data-no-toggle 让它跳过这里(放在标题栏而不是根上,免得正文里的纯 CSS 芯片也被豁免),状态只看 v-model。\n */\nfunction onHeadClick(e: MouseEvent) {\n if (!props.collapsible) return;\n const hit = (e.target as Element).closest(\"a, button, input, select, textarea, label, [role='button']\");\n if (!hit || hit === toggle.value) expanded.value = !expanded.value;\n}\n\nfunction onKey(e: KeyboardEvent) {\n if (e.key !== \"Enter\" && e.key !== \" \") return;\n e.preventDefault();\n expanded.value = !expanded.value;\n}\n</script>\n\n<template>\n <div :class=\"['ak-panel', { 'ak-panel--collapsible': collapsible, 'is-collapsed': collapsed }]\">\n <div v-if=\"hasHead\" :class=\"['ak-panel__head', { 'ak-panel__head--inverse': inverse }]\" data-no-toggle @click=\"onHeadClick\">\n <component :is=\"titleTag\" v-if=\"title || $slots.header\" class=\"ak-panel__title\">\n <span\n v-if=\"collapsible\"\n ref=\"toggle\"\n role=\"button\"\n tabindex=\"0\"\n :aria-expanded=\"expanded\"\n :aria-controls=\"`${id}-body`\"\n @keydown=\"onKey\"\n >\n <slot name=\"header\">{{ title }}</slot><span v-if=\"en\" class=\"ak-en\" lang=\"en\">{{ en }}</span>\n </span>\n <template v-else>\n <slot name=\"header\">{{ title }}</slot><span v-if=\"en\" class=\"ak-en\" lang=\"en\">{{ en }}</span>\n </template>\n </component>\n <slot name=\"header-extra\" />\n </div>\n <div :id=\"`${id}-body`\" class=\"ak-panel__body\"><slot /></div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 面板:带标题栏的容器(游戏内 announce panel)——标题栏表面 2 底、左侧 4px 主色条;标题后可跟 Bender 英文。\n * 与 AkCard 的分工:卡片是一件可并列 / 可点的东西,面板是页面上一块有名字的区域(首页「今日信息」「新增关卡」)。\n * collapsible 时点标题栏收起 / 展开(同 Naive NCollapseItem 的单项用法),展开状态是 v-model;\n * 键盘:标题文字是 role=\"button\"(在标题元素里面,h3 的大纲语义不丢,同 WAI-ARIA Accordion),Enter / Space 切换。\n */\nimport { computed, useId, useTemplateRef } from \"vue\";\n\ntype TitleTag = \"div\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\";\n\nconst props = withDefaults(\n defineProps<{\n /** 标题(也可用 #header 插槽) */\n title?: string;\n /** 标题后的英文(Bender 大写灰字:「Today」「Operations」) */\n en?: string;\n /** 标题元素:默认 div;面板是页面大纲里的一节时用 h2–h6(首页「新增关卡」是 h3) */\n titleTag?: TitleTag;\n /** 标题栏反转(亮色下黑底白字、暗色下白底黑字,同 .ak-inverse):公告这类要跳出来的区域 */\n inverse?: boolean;\n /** 可折叠:点标题栏收起 / 展开正文(右端出现开合记号:收起 + / 展开 −);需要有标题 */\n collapsible?: boolean;\n }>(),\n { title: undefined, en: undefined, titleTag: \"div\" },\n);\n\n/** 是否展开(collapsible 时有效);默认展开 */\nconst expanded = defineModel<boolean>({ default: true });\n\nconst slots = defineSlots<{\n /** 正文 */\n default?: () => unknown;\n /** 标题内容(代替 title) */\n header?: () => unknown;\n /** 标题栏右侧(标签、日期、按钮) */\n \"header-extra\"?: () => unknown;\n}>();\n\nconst id = useId();\nconst toggle = useTemplateRef<HTMLElement>(\"toggle\");\nconst hasHead = computed(() => !!props.title || !!slots.header || !!slots[\"header-extra\"]);\nconst collapsed = computed(() => props.collapsible && !expanded.value);\n\n/**\n * 整条标题栏都能点(同 CSS 的 cursor: pointer);标题栏里别的链接 / 按钮自己的点击不算。\n * 皮肤 / 预览脚本也会给纯 CSS 面板的标题栏点击翻 is-collapsed——标题栏上的 data-no-toggle 让它跳过这里(放在标题栏而不是根上,免得正文里的纯 CSS 芯片也被豁免),状态只看 v-model。\n */\nfunction onHeadClick(e: MouseEvent) {\n if (!props.collapsible) return;\n const hit = (e.target as Element).closest(\"a, button, input, select, textarea, label, [role='button']\");\n if (!hit || hit === toggle.value) expanded.value = !expanded.value;\n}\n\nfunction onKey(e: KeyboardEvent) {\n if (e.key !== \"Enter\" && e.key !== \" \") return;\n e.preventDefault();\n expanded.value = !expanded.value;\n}\n</script>\n\n<template>\n <div :class=\"['ak-panel', { 'ak-panel--collapsible': collapsible, 'is-collapsed': collapsed }]\">\n <div v-if=\"hasHead\" :class=\"['ak-panel__head', { 'ak-panel__head--inverse': inverse }]\" data-no-toggle @click=\"onHeadClick\">\n <component :is=\"titleTag\" v-if=\"title || $slots.header\" class=\"ak-panel__title\">\n <span\n v-if=\"collapsible\"\n ref=\"toggle\"\n role=\"button\"\n tabindex=\"0\"\n :aria-expanded=\"expanded\"\n :aria-controls=\"`${id}-body`\"\n @keydown=\"onKey\"\n >\n <slot name=\"header\">{{ title }}</slot><span v-if=\"en\" class=\"ak-en\" lang=\"en\">{{ en }}</span>\n </span>\n <template v-else>\n <slot name=\"header\">{{ title }}</slot><span v-if=\"en\" class=\"ak-en\" lang=\"en\">{{ en }}</span>\n </template>\n </component>\n <slot name=\"header-extra\" />\n </div>\n <div :id=\"`${id}-body`\" class=\"ak-panel__body\"><slot /></div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 区块标题:中文标题 + Bender 大写英文副题(「技能 SKILLS」),左侧主色粗竖条;右侧可放「查看全部 ›」这类附加。\n * Naive 没有对应组件(最近的是 NPageHeader 的 title / subtitle / #extra)。标题元素是真正的 h1–h6,进页面大纲。\n */\nimport { computed } from \"vue\";\n\nconst props = withDefaults(\n defineProps<{\n /** 标题(也可写在默认插槽里) */\n title?: string;\n /** 英文副题(Bender 大写灰字):并排时跟在标题右边,stack 时叠在标题上方当眉题(「Chapter 08」) */\n en?: string;\n /** 标题级别,渲染成 h1–h6 */\n level?: 1 | 2 | 3 | 4 | 5 | 6;\n /** 外观:bar 左侧主色粗竖条(默认)· underline 底线 + 左段 120px 主色粗线 */\n variant?: \"bar\" | \"underline\";\n /** 英文叠在标题上方(章节号、活动代号) */\n stack?: boolean;\n /** 尺寸:md = h2 字号(默认)· lg = display 字号(专题页 / 活动页头) */\n size?: \"md\" | \"lg\";\n }>(),\n { title: undefined, en: undefined, level: 2, variant: \"bar\", size: \"md\" },\n);\n\ndefineSlots<{\n /** 标题内容(代替 title) */\n default?: () => unknown;\n /** 右侧附加(链接、开关),推到最右 */\n extra?: () => unknown;\n}>();\n\nconst classes = computed(() => [\n \"ak-heading\",\n props.variant === \"underline\" && \"ak-heading--underline\",\n props.size === \"lg\" && \"ak-heading--lg\",\n { \"ak-heading--stack\": props.stack },\n]);\n</script>\n\n<template>\n <div :class=\"classes\">\n <span v-if=\"en && stack\" class=\"ak-heading__en\" lang=\"en\">{{ en }}</span>\n <component :is=\"`h${level}`\" class=\"ak-heading__title\"><slot>{{ title }}</slot></component>\n <span v-if=\"en && !stack\" class=\"ak-heading__en\" lang=\"en\">{{ en }}</span>\n <span v-if=\"$slots.extra\" class=\"ak-heading__aside\"><slot name=\"extra\" /></span>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 区块标题:中文标题 + Bender 大写英文副题(「技能 SKILLS」),左侧主色粗竖条;右侧可放「查看全部 ›」这类附加。\n * Naive 没有对应组件(最近的是 NPageHeader 的 title / subtitle / #extra)。标题元素是真正的 h1–h6,进页面大纲。\n */\nimport { computed } from \"vue\";\n\nconst props = withDefaults(\n defineProps<{\n /** 标题(也可写在默认插槽里) */\n title?: string;\n /** 英文副题(Bender 大写灰字):并排时跟在标题右边,stack 时叠在标题上方当眉题(「Chapter 08」) */\n en?: string;\n /** 标题级别,渲染成 h1–h6 */\n level?: 1 | 2 | 3 | 4 | 5 | 6;\n /** 外观:bar 左侧主色粗竖条(默认)· underline 底线 + 左段 120px 主色粗线 */\n variant?: \"bar\" | \"underline\";\n /** 英文叠在标题上方(章节号、活动代号) */\n stack?: boolean;\n /** 尺寸:md = h2 字号(默认)· lg = display 字号(专题页 / 活动页头) */\n size?: \"md\" | \"lg\";\n }>(),\n { title: undefined, en: undefined, level: 2, variant: \"bar\", size: \"md\" },\n);\n\ndefineSlots<{\n /** 标题内容(代替 title) */\n default?: () => unknown;\n /** 右侧附加(链接、开关),推到最右 */\n extra?: () => unknown;\n}>();\n\nconst classes = computed(() => [\n \"ak-heading\",\n props.variant === \"underline\" && \"ak-heading--underline\",\n props.size === \"lg\" && \"ak-heading--lg\",\n { \"ak-heading--stack\": props.stack },\n]);\n</script>\n\n<template>\n <div :class=\"classes\">\n <span v-if=\"en && stack\" class=\"ak-heading__en\" lang=\"en\">{{ en }}</span>\n <component :is=\"`h${level}`\" class=\"ak-heading__title\"><slot>{{ title }}</slot></component>\n <span v-if=\"en && !stack\" class=\"ak-heading__en\" lang=\"en\">{{ en }}</span>\n <span v-if=\"$slots.extra\" class=\"ak-heading__aside\"><slot name=\"extra\" /></span>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 分隔线(= Naive 的 NDivider):默认 <hr>;默认插槽写了文字就是「——文字——」(小号大写标签字,两侧线段);vertical 是行内竖线。\n */\nimport { computed } from \"vue\";\n\nconst props = withDefaults(\n defineProps<{\n /** 外观:default 1px 线 · accent 左段 80px 主色 + 其余 1 色线(2px 高)· stripes 6px 斜纹带;带文字 / 竖线时不适用 */\n variant?: \"default\" | \"accent\" | \"stripes\";\n /** 竖线:行内 1px × 1em,隔开同一行里的几项(「编辑 | 历史」) */\n vertical?: boolean;\n }>(),\n { variant: \"default\" },\n);\n\ndefineSlots<{\n /** 线中间的文字(同 Naive 的标题);竖线时不适用 */\n default?: () => unknown;\n}>();\n\nconst classes = computed(() => [\"ak-divider\", props.variant !== \"default\" && `ak-divider--${props.variant}`]);\n</script>\n\n<template>\n <span v-if=\"vertical\" class=\"ak-divider ak-divider--vertical\" role=\"separator\" aria-orientation=\"vertical\" />\n <div v-else-if=\"$slots.default\" class=\"ak-divider ak-divider--text\" role=\"separator\"><slot /></div>\n <hr v-else :class=\"classes\" />\n</template>\n","<script setup lang=\"ts\">\n/**\n * 分隔线(= Naive 的 NDivider):默认 <hr>;默认插槽写了文字就是「——文字——」(小号大写标签字,两侧线段);vertical 是行内竖线。\n */\nimport { computed } from \"vue\";\n\nconst props = withDefaults(\n defineProps<{\n /** 外观:default 1px 线 · accent 左段 80px 主色 + 其余 1 色线(2px 高)· stripes 6px 斜纹带;带文字 / 竖线时不适用 */\n variant?: \"default\" | \"accent\" | \"stripes\";\n /** 竖线:行内 1px × 1em,隔开同一行里的几项(「编辑 | 历史」) */\n vertical?: boolean;\n }>(),\n { variant: \"default\" },\n);\n\ndefineSlots<{\n /** 线中间的文字(同 Naive 的标题);竖线时不适用 */\n default?: () => unknown;\n}>();\n\nconst classes = computed(() => [\"ak-divider\", props.variant !== \"default\" && `ak-divider--${props.variant}`]);\n</script>\n\n<template>\n <span v-if=\"vertical\" class=\"ak-divider ak-divider--vertical\" role=\"separator\" aria-orientation=\"vertical\" />\n <div v-else-if=\"$slots.default\" class=\"ak-divider ak-divider--text\" role=\"separator\"><slot /></div>\n <hr v-else :class=\"classes\" />\n</template>\n","import type { InjectionKey } from \"vue\";\n\nexport type AvatarSize = \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n\n/** AkAvatarGroup 给组内 AkAvatar 的默认尺寸(同 Naive 的 NAvatarGroup size) */\nexport const avatarGroupKey: InjectionKey<{ size?: AvatarSize }> = Symbol(\"AkAvatarGroup\");\n","<script setup lang=\"ts\">\n/** 头像(= Naive 的 NAvatar):直角 1px 边的方块,图片铺满;没有图 / 图挂了时显示默认插槽的文字(「DR」「+9」)。 */\nimport { computed, inject, ref, watch } from \"vue\";\n\nimport { avatarGroupKey, type AvatarSize } from \"./context\";\n\nconst props = withDefaults(\n defineProps<{\n /** 图片地址(干员头像等);不写或加载失败时显示默认插槽的文字 */\n src?: string;\n /** 图片替代文本:旁边已经写了名字时留空(默认),头像单独出现时写人名 */\n alt?: string;\n /** 尺寸:xs 24 · sm 32 · md 40 · lg 56 · xl 80(px);不写时跟 AkAvatarGroup,再不然是 md */\n size?: AvatarSize;\n /** 圆形(系统默认直角,只给用户头像这类确需时用) */\n round?: boolean;\n /** 右下角绿色状态点(在线 / 可用):纯视觉,含义要在旁边的文字里说出来 */\n status?: boolean;\n }>(),\n { src: undefined, alt: \"\", size: undefined },\n);\n\ndefineSlots<{\n /** 没有图片时显示的文字(缩写、「+9」) */\n default?: () => unknown;\n}>();\n\nconst group = inject(avatarGroupKey, null);\nconst size = computed(() => props.size ?? group?.size ?? \"md\");\n\n/** 图片加载失败就退回文字(同 Naive 的 fallback);换了地址重新试 */\nconst failed = ref(false);\nwatch(\n () => props.src,\n () => (failed.value = false),\n);\n\nconst classes = computed(() => [\"ak-avatar\", size.value !== \"md\" && `ak-avatar--${size.value}`, { \"ak-avatar--round\": props.round }]);\n</script>\n\n<template>\n <span :class=\"classes\">\n <img v-if=\"src && !failed\" :src=\"src\" :alt=\"alt\" @error=\"failed = true\" />\n <slot v-else />\n <span v-if=\"status\" class=\"ak-avatar__status\" aria-hidden=\"true\" />\n </span>\n</template>\n","<script setup lang=\"ts\">\n/** 头像(= Naive 的 NAvatar):直角 1px 边的方块,图片铺满;没有图 / 图挂了时显示默认插槽的文字(「DR」「+9」)。 */\nimport { computed, inject, ref, watch } from \"vue\";\n\nimport { avatarGroupKey, type AvatarSize } from \"./context\";\n\nconst props = withDefaults(\n defineProps<{\n /** 图片地址(干员头像等);不写或加载失败时显示默认插槽的文字 */\n src?: string;\n /** 图片替代文本:旁边已经写了名字时留空(默认),头像单独出现时写人名 */\n alt?: string;\n /** 尺寸:xs 24 · sm 32 · md 40 · lg 56 · xl 80(px);不写时跟 AkAvatarGroup,再不然是 md */\n size?: AvatarSize;\n /** 圆形(系统默认直角,只给用户头像这类确需时用) */\n round?: boolean;\n /** 右下角绿色状态点(在线 / 可用):纯视觉,含义要在旁边的文字里说出来 */\n status?: boolean;\n }>(),\n { src: undefined, alt: \"\", size: undefined },\n);\n\ndefineSlots<{\n /** 没有图片时显示的文字(缩写、「+9」) */\n default?: () => unknown;\n}>();\n\nconst group = inject(avatarGroupKey, null);\nconst size = computed(() => props.size ?? group?.size ?? \"md\");\n\n/** 图片加载失败就退回文字(同 Naive 的 fallback);换了地址重新试 */\nconst failed = ref(false);\nwatch(\n () => props.src,\n () => (failed.value = false),\n);\n\nconst classes = computed(() => [\"ak-avatar\", size.value !== \"md\" && `ak-avatar--${size.value}`, { \"ak-avatar--round\": props.round }]);\n</script>\n\n<template>\n <span :class=\"classes\">\n <img v-if=\"src && !failed\" :src=\"src\" :alt=\"alt\" @error=\"failed = true\" />\n <slot v-else />\n <span v-if=\"status\" class=\"ak-avatar__status\" aria-hidden=\"true\" />\n </span>\n</template>\n","<script setup lang=\"ts\">\n/** 一叠头像(= Naive 的 NAvatarGroup):后一枚压前一枚 8px。给 options 由组件画(可用 max 收成「+N」),或者在默认插槽里直接放 AkAvatar。 */\nimport { computed, provide } from \"vue\";\n\nimport AkAvatar from \"./AkAvatar.vue\";\nimport { avatarGroupKey, type AvatarSize } from \"./context\";\n\nexport interface AvatarOption {\n /** 图片地址 */\n src: string;\n /** 替代文本(人名);组有意义时每枚都写 */\n alt?: string;\n}\n\nconst props = withDefaults(\n defineProps<{\n /** 头像列表(同 Naive 的 options);不写就用默认插槽里的 AkAvatar */\n options?: AvatarOption[];\n /** 最多画几枚,其余收成一枚「+N」(只对 options 生效) */\n max?: number;\n /** 组内头像的尺寸(头像自己写了 size 以头像为准) */\n size?: AvatarSize;\n /** 读屏用的组名(「参与干员」) */\n label?: string;\n }>(),\n { options: undefined, max: undefined, size: undefined, label: undefined },\n);\n\ndefineSlots<{\n /** 若干 AkAvatar(不用 options 时) */\n default?: () => unknown;\n}>();\n\nprovide(avatarGroupKey, props);\n\nconst shown = computed(() => (props.options && props.max !== undefined ? props.options.slice(0, props.max) : (props.options ?? [])));\nconst rest = computed(() => (props.options?.length ?? 0) - shown.value.length);\n</script>\n\n<template>\n <div class=\"ak-avatar-group\" :role=\"label ? 'group' : undefined\" :aria-label=\"label\">\n <template v-if=\"options\">\n <AkAvatar v-for=\"(o, i) in shown\" :key=\"i\" :src=\"o.src\" :alt=\"o.alt\" />\n <AkAvatar v-if=\"rest > 0\">+{{ rest }}</AkAvatar>\n </template>\n <slot v-else />\n </div>\n</template>\n","<script setup lang=\"ts\">\n/** 一叠头像(= Naive 的 NAvatarGroup):后一枚压前一枚 8px。给 options 由组件画(可用 max 收成「+N」),或者在默认插槽里直接放 AkAvatar。 */\nimport { computed, provide } from \"vue\";\n\nimport AkAvatar from \"./AkAvatar.vue\";\nimport { avatarGroupKey, type AvatarSize } from \"./context\";\n\nexport interface AvatarOption {\n /** 图片地址 */\n src: string;\n /** 替代文本(人名);组有意义时每枚都写 */\n alt?: string;\n}\n\nconst props = withDefaults(\n defineProps<{\n /** 头像列表(同 Naive 的 options);不写就用默认插槽里的 AkAvatar */\n options?: AvatarOption[];\n /** 最多画几枚,其余收成一枚「+N」(只对 options 生效) */\n max?: number;\n /** 组内头像的尺寸(头像自己写了 size 以头像为准) */\n size?: AvatarSize;\n /** 读屏用的组名(「参与干员」) */\n label?: string;\n }>(),\n { options: undefined, max: undefined, size: undefined, label: undefined },\n);\n\ndefineSlots<{\n /** 若干 AkAvatar(不用 options 时) */\n default?: () => unknown;\n}>();\n\nprovide(avatarGroupKey, props);\n\nconst shown = computed(() => (props.options && props.max !== undefined ? props.options.slice(0, props.max) : (props.options ?? [])));\nconst rest = computed(() => (props.options?.length ?? 0) - shown.value.length);\n</script>\n\n<template>\n <div class=\"ak-avatar-group\" :role=\"label ? 'group' : undefined\" :aria-label=\"label\">\n <template v-if=\"options\">\n <AkAvatar v-for=\"(o, i) in shown\" :key=\"i\" :src=\"o.src\" :alt=\"o.alt\" />\n <AkAvatar v-if=\"rest > 0\">+{{ rest }}</AkAvatar>\n </template>\n <slot v-else />\n </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 空状态(= Naive 的 NEmpty):虚线框里居中一枚线稿图标 + 标题 + 说明 + 可选的操作。\n * 404 / 403 这类页面级的空,用 code 换成大号状态码。\n */\nimport type { IconName } from \"../../icons\";\nimport AkIcon from \"../Icon/AkIcon.vue\";\n\nwithDefaults(\n defineProps<{\n /** 标题(粗体一行);传空串不显示 */\n title?: string;\n /** 说明文字(小字,标题下一行);要放链接时改用默认插槽 */\n description?: string;\n /** 大号状态码(404 / 403):放在图标的位置,写了就不显示图标 */\n code?: string;\n /** 图标(48px 半透明线稿);false 不显示 */\n icon?: IconName | false;\n }>(),\n { title: \"暂无数据\", description: undefined, code: undefined, icon: \"empty\" },\n);\n\ndefineSlots<{\n /** 说明(代替 description) */\n default?: () => unknown;\n /** 自定义图标(代替 icon);自己加 class=\"ak-empty__icon\" 得到 48px 半透明 */\n icon?: () => unknown;\n /** 说明下方的操作(按钮 / 链接) */\n extra?: () => unknown;\n}>();\n</script>\n\n<template>\n <div class=\"ak-empty\">\n <span v-if=\"code\" class=\"ak-empty__code\">{{ code }}</span>\n <slot v-else name=\"icon\"><AkIcon v-if=\"icon\" :name=\"icon\" class=\"ak-empty__icon\" /></slot>\n <div v-if=\"title\" class=\"ak-empty__title\">{{ title }}</div>\n <div v-if=\"description || $slots.default\" class=\"ak-fs-xs\"><slot>{{ description }}</slot></div>\n <div v-if=\"$slots.extra\" class=\"ak-flex ak-wrap ak-gap-2 ak-justify-center ak-mt-2\"><slot name=\"extra\" /></div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 空状态(= Naive 的 NEmpty):虚线框里居中一枚线稿图标 + 标题 + 说明 + 可选的操作。\n * 404 / 403 这类页面级的空,用 code 换成大号状态码。\n */\nimport type { IconName } from \"../../icons\";\nimport AkIcon from \"../Icon/AkIcon.vue\";\n\nwithDefaults(\n defineProps<{\n /** 标题(粗体一行);传空串不显示 */\n title?: string;\n /** 说明文字(小字,标题下一行);要放链接时改用默认插槽 */\n description?: string;\n /** 大号状态码(404 / 403):放在图标的位置,写了就不显示图标 */\n code?: string;\n /** 图标(48px 半透明线稿);false 不显示 */\n icon?: IconName | false;\n }>(),\n { title: \"暂无数据\", description: undefined, code: undefined, icon: \"empty\" },\n);\n\ndefineSlots<{\n /** 说明(代替 description) */\n default?: () => unknown;\n /** 自定义图标(代替 icon);自己加 class=\"ak-empty__icon\" 得到 48px 半透明 */\n icon?: () => unknown;\n /** 说明下方的操作(按钮 / 链接) */\n extra?: () => unknown;\n}>();\n</script>\n\n<template>\n <div class=\"ak-empty\">\n <span v-if=\"code\" class=\"ak-empty__code\">{{ code }}</span>\n <slot v-else name=\"icon\"><AkIcon v-if=\"icon\" :name=\"icon\" class=\"ak-empty__icon\" /></slot>\n <div v-if=\"title\" class=\"ak-empty__title\">{{ title }}</div>\n <div v-if=\"description || $slots.default\" class=\"ak-fs-xs\"><slot>{{ description }}</slot></div>\n <div v-if=\"$slots.extra\" class=\"ak-flex ak-wrap ak-gap-2 ak-justify-center ak-mt-2\"><slot name=\"extra\" /></div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 骨架占位(= Naive 的 NSkeleton):内容到之前先占住它的形状,底色两级表面之间扫光。\n * 骨架对读屏隐藏(aria-hidden);「正在加载」由外层容器的 aria-busy 或 AkSpinner 报。\n */\nimport { computed } from \"vue\";\n\ndefineOptions({ inheritAttrs: false });\n\nconst props = withDefaults(\n defineProps<{\n /** 文字行:.9em 高、上下 .35em 间距;一组里最后一行 60% 宽 */\n text?: boolean;\n /** 圆形(头像占位):宽高相等,由 width 定 */\n circle?: boolean;\n /** 方形(道具 / 头像占位):宽高相等,由 width 定 */\n square?: boolean;\n /** 重复几个(同 Naive):配 text 画一段文字 */\n repeat?: number;\n /** 宽度:数字按 px,字符串原样(\"60%\");不写时占满一行 */\n width?: number | string;\n /** 高度:数字按 px;不写时 1em(text 时 .9em,圆 / 方形跟宽度) */\n height?: number | string;\n }>(),\n { repeat: 1, width: undefined, height: undefined },\n);\n\nconst classes = computed(() => [\n \"ak-skeleton\",\n { \"ak-skeleton--text\": props.text, \"ak-skeleton--circle\": props.circle, \"ak-skeleton--square\": props.square && !props.circle },\n]);\n\nconst px = (v: number | string | undefined) => (typeof v === \"number\" ? `${v}px` : v);\n/** 宽高是每一处占位自己的数据(同 Naive 的 width / height),CSS 里没有对应的类 */\nconst size = computed(() => (props.width === undefined && props.height === undefined ? undefined : { width: px(props.width), height: px(props.height) }));\n</script>\n\n<template>\n <span v-for=\"i in repeat\" :key=\"i\" v-bind=\"$attrs\" :class=\"classes\" :style=\"size\" aria-hidden=\"true\" />\n</template>\n","<script setup lang=\"ts\">\n/**\n * 骨架占位(= Naive 的 NSkeleton):内容到之前先占住它的形状,底色两级表面之间扫光。\n * 骨架对读屏隐藏(aria-hidden);「正在加载」由外层容器的 aria-busy 或 AkSpinner 报。\n */\nimport { computed } from \"vue\";\n\ndefineOptions({ inheritAttrs: false });\n\nconst props = withDefaults(\n defineProps<{\n /** 文字行:.9em 高、上下 .35em 间距;一组里最后一行 60% 宽 */\n text?: boolean;\n /** 圆形(头像占位):宽高相等,由 width 定 */\n circle?: boolean;\n /** 方形(道具 / 头像占位):宽高相等,由 width 定 */\n square?: boolean;\n /** 重复几个(同 Naive):配 text 画一段文字 */\n repeat?: number;\n /** 宽度:数字按 px,字符串原样(\"60%\");不写时占满一行 */\n width?: number | string;\n /** 高度:数字按 px;不写时 1em(text 时 .9em,圆 / 方形跟宽度) */\n height?: number | string;\n }>(),\n { repeat: 1, width: undefined, height: undefined },\n);\n\nconst classes = computed(() => [\n \"ak-skeleton\",\n { \"ak-skeleton--text\": props.text, \"ak-skeleton--circle\": props.circle, \"ak-skeleton--square\": props.square && !props.circle },\n]);\n\nconst px = (v: number | string | undefined) => (typeof v === \"number\" ? `${v}px` : v);\n/** 宽高是每一处占位自己的数据(同 Naive 的 width / height),CSS 里没有对应的类 */\nconst size = computed(() => (props.width === undefined && props.height === undefined ? undefined : { width: px(props.width), height: px(props.height) }));\n</script>\n\n<template>\n <span v-for=\"i in repeat\" :key=\"i\" v-bind=\"$attrs\" :class=\"classes\" :style=\"size\" aria-hidden=\"true\" />\n</template>\n","<script setup lang=\"ts\">\n/**\n * 加载中(= Naive 的 NSpin)。三种输出:\n * - 只有图形:<span class=\"ak-spinner\" role=\"status\" aria-label>\n * - 有 description:.ak-spin(图形 + 说明竖排)\n * - 默认插槽包住内容:.ak-spin-container,show 时内容压淡不可点、.ak-spin 叠在正中,容器 aria-busy\n */\nimport { computed } from \"vue\";\n\nconst props = withDefaults(\n defineProps<{\n /** 样子:diamond 菱形涟漪(游戏内 loading,默认)· bars 三根竖条(行内、更轻) */\n variant?: \"diamond\" | \"bars\";\n /** 说明文字,排在图形下方(同 Naive) */\n description?: string;\n /** 包住内容时是否在加载(同 Naive);不包内容时无效,要藏起来直接 v-if */\n show?: boolean;\n /** 换色:写到 CSS 的 --_c(只对 diamond 生效),如 \"var(--ak-yellow-500)\" */\n color?: string;\n /** 读屏文本;有 description 时念 description */\n label?: string;\n }>(),\n { variant: \"diamond\", description: undefined, show: true, color: undefined, label: \"加载中\" },\n);\n\ndefineSlots<{\n /** 正在加载的内容:加载层叠在它上面 */\n default?: () => unknown;\n /** 说明(代替 description) */\n description?: () => unknown;\n}>();\n\nconst graphicClass = computed(() => (props.variant === \"bars\" ? \"ak-loader\" : \"ak-spinner\"));\n/** --_c 是 .ak-spinner 约定的换色接口(spinner.css 头注),不是随手写的内联样式 */\nconst graphicStyle = computed(() => (props.color && props.variant === \"diamond\" ? { \"--_c\": props.color } : undefined));\n</script>\n\n<template>\n <div v-if=\"$slots.default\" class=\"ak-spin-container\" :aria-busy=\"show\">\n <div class=\"ak-spin-container__content\"><slot /></div>\n <div v-if=\"show\" class=\"ak-spin\" role=\"status\">\n <span :class=\"graphicClass\" :style=\"graphicStyle\" aria-hidden=\"true\"><template v-if=\"variant === 'bars'\"><i /><i /><i /></template></span>\n <span v-if=\"description || $slots.description\" class=\"ak-spin__desc\"><slot name=\"description\">{{ description }}</slot></span>\n <span v-else class=\"ak-sr-only\">{{ label }}</span>\n </div>\n </div>\n <div v-else-if=\"description || $slots.description\" class=\"ak-spin\" role=\"status\">\n <span :class=\"graphicClass\" :style=\"graphicStyle\" aria-hidden=\"true\"><template v-if=\"variant === 'bars'\"><i /><i /><i /></template></span>\n <span class=\"ak-spin__desc\"><slot name=\"description\">{{ description }}</slot></span>\n </div>\n <span v-else :class=\"graphicClass\" :style=\"graphicStyle\" role=\"status\" :aria-label=\"label\">\n <template v-if=\"variant === 'bars'\"><i /><i /><i /></template>\n </span>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 加载中(= Naive 的 NSpin)。三种输出:\n * - 只有图形:<span class=\"ak-spinner\" role=\"status\" aria-label>\n * - 有 description:.ak-spin(图形 + 说明竖排)\n * - 默认插槽包住内容:.ak-spin-container,show 时内容压淡不可点、.ak-spin 叠在正中,容器 aria-busy\n */\nimport { computed } from \"vue\";\n\nconst props = withDefaults(\n defineProps<{\n /** 样子:diamond 菱形涟漪(游戏内 loading,默认)· bars 三根竖条(行内、更轻) */\n variant?: \"diamond\" | \"bars\";\n /** 说明文字,排在图形下方(同 Naive) */\n description?: string;\n /** 包住内容时是否在加载(同 Naive);不包内容时无效,要藏起来直接 v-if */\n show?: boolean;\n /** 换色:写到 CSS 的 --_c(只对 diamond 生效),如 \"var(--ak-yellow-500)\" */\n color?: string;\n /** 读屏文本;有 description 时念 description */\n label?: string;\n }>(),\n { variant: \"diamond\", description: undefined, show: true, color: undefined, label: \"加载中\" },\n);\n\ndefineSlots<{\n /** 正在加载的内容:加载层叠在它上面 */\n default?: () => unknown;\n /** 说明(代替 description) */\n description?: () => unknown;\n}>();\n\nconst graphicClass = computed(() => (props.variant === \"bars\" ? \"ak-loader\" : \"ak-spinner\"));\n/** --_c 是 .ak-spinner 约定的换色接口(spinner.css 头注),不是随手写的内联样式 */\nconst graphicStyle = computed(() => (props.color && props.variant === \"diamond\" ? { \"--_c\": props.color } : undefined));\n</script>\n\n<template>\n <div v-if=\"$slots.default\" class=\"ak-spin-container\" :aria-busy=\"show\">\n <div class=\"ak-spin-container__content\"><slot /></div>\n <div v-if=\"show\" class=\"ak-spin\" role=\"status\">\n <span :class=\"graphicClass\" :style=\"graphicStyle\" aria-hidden=\"true\"><template v-if=\"variant === 'bars'\"><i /><i /><i /></template></span>\n <span v-if=\"description || $slots.description\" class=\"ak-spin__desc\"><slot name=\"description\">{{ description }}</slot></span>\n <span v-else class=\"ak-sr-only\">{{ label }}</span>\n </div>\n </div>\n <div v-else-if=\"description || $slots.description\" class=\"ak-spin\" role=\"status\">\n <span :class=\"graphicClass\" :style=\"graphicStyle\" aria-hidden=\"true\"><template v-if=\"variant === 'bars'\"><i /><i /><i /></template></span>\n <span class=\"ak-spin__desc\"><slot name=\"description\">{{ description }}</slot></span>\n </div>\n <span v-else :class=\"graphicClass\" :style=\"graphicStyle\" role=\"status\" :aria-label=\"label\">\n <template v-if=\"variant === 'bars'\"><i /><i /><i /></template>\n </span>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nimport type { IconName } from \"../../icons\";\nimport AkIcon from \"../Icon/AkIcon.vue\";\n\nexport type MessageVariant = \"info\" | \"success\" | \"warning\" | \"danger\" | \"neutral\" | \"accent\";\n\n/** 界面 / 系统反馈的提示条(同 Naive 的 NAlert):左色条 + 淡底;编辑写在正文里的提示用 AkCbox */\nconst props = withDefaults(\n defineProps<{\n /** 外观(等级色):info 蓝(默认)· success 绿 · warning 黄 · danger 红 · neutral 灰 · accent 主色 */\n variant?: MessageVariant;\n /** 加粗的标题行(等级色);要带链接 / 格式时用 #header 插槽 */\n title?: string;\n /** 图标;默认按 variant:success → check,warning / danger → warn,其余 → info */\n icon?: IconName;\n /** 显示图标(同 Naive 的 show-icon) */\n showIcon?: boolean;\n /** 右侧 ✕ 关闭按钮:点了隐藏自己(v-model 变 false)并触发 close */\n closable?: boolean;\n /** 横幅:顶边 3px 色条、文字居中——站点公告 / 页顶通知 */\n banner?: boolean;\n /** 叠斜纹(危险横幅,配 variant=\"danger\") */\n stripes?: boolean;\n }>(),\n { variant: \"info\", title: undefined, icon: undefined, showIcon: true },\n);\n\n/** 是否显示;不绑定时自己管(关掉就没了),绑定了可以再打开 */\nconst show = defineModel<boolean>({ default: true });\n\nconst emit = defineEmits<{\n /** 点了关闭按钮(之后自己隐藏) */\n close: [];\n}>();\n\ndefineSlots<{\n /** 正文 */\n default?: () => unknown;\n /** 标题行(代替 title) */\n header?: () => unknown;\n /** 图标(代替 icon;放进 20px 的图标位,颜色跟等级色) */\n icon?: () => unknown;\n}>();\n\nconst DEFAULT_ICON: Record<MessageVariant, IconName> = {\n info: \"info\",\n success: \"check\",\n warning: \"warn\",\n danger: \"warn\",\n neutral: \"info\",\n accent: \"info\",\n};\n\nconst classes = computed(() => [\n \"ak-message\",\n props.variant !== \"info\" && `ak-message--${props.variant}`,\n { \"ak-message--banner\": props.banner, \"ak-message--stripes\": props.stripes },\n]);\n\nfunction close() {\n show.value = false;\n emit(\"close\");\n}\n</script>\n\n<template>\n <!-- 警告 / 危险是 alert(动态插入时读屏立刻念),其余是 status(礼貌播报) -->\n <div v-if=\"show\" :class=\"classes\" :role=\"variant === 'warning' || variant === 'danger' ? 'alert' : 'status'\">\n <template v-if=\"showIcon\">\n <span v-if=\"$slots.icon\" class=\"ak-message__icon\"><slot name=\"icon\" /></span>\n <AkIcon v-else :name=\"icon ?? DEFAULT_ICON[variant]\" class=\"ak-message__icon\" />\n </template>\n <div class=\"ak-message__body\">\n <div v-if=\"title || $slots.header\" class=\"ak-message__title\"><slot name=\"header\">{{ title }}</slot></div>\n <slot />\n </div>\n <button v-if=\"closable\" type=\"button\" class=\"ak-message__close\" aria-label=\"关闭\" @click=\"close\">✕</button>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nimport type { IconName } from \"../../icons\";\nimport AkIcon from \"../Icon/AkIcon.vue\";\n\nexport type MessageVariant = \"info\" | \"success\" | \"warning\" | \"danger\" | \"neutral\" | \"accent\";\n\n/** 界面 / 系统反馈的提示条(同 Naive 的 NAlert):左色条 + 淡底;编辑写在正文里的提示用 AkCbox */\nconst props = withDefaults(\n defineProps<{\n /** 外观(等级色):info 蓝(默认)· success 绿 · warning 黄 · danger 红 · neutral 灰 · accent 主色 */\n variant?: MessageVariant;\n /** 加粗的标题行(等级色);要带链接 / 格式时用 #header 插槽 */\n title?: string;\n /** 图标;默认按 variant:success → check,warning / danger → warn,其余 → info */\n icon?: IconName;\n /** 显示图标(同 Naive 的 show-icon) */\n showIcon?: boolean;\n /** 右侧 ✕ 关闭按钮:点了隐藏自己(v-model 变 false)并触发 close */\n closable?: boolean;\n /** 横幅:顶边 3px 色条、文字居中——站点公告 / 页顶通知 */\n banner?: boolean;\n /** 叠斜纹(危险横幅,配 variant=\"danger\") */\n stripes?: boolean;\n }>(),\n { variant: \"info\", title: undefined, icon: undefined, showIcon: true },\n);\n\n/** 是否显示;不绑定时自己管(关掉就没了),绑定了可以再打开 */\nconst show = defineModel<boolean>({ default: true });\n\nconst emit = defineEmits<{\n /** 点了关闭按钮(之后自己隐藏) */\n close: [];\n}>();\n\ndefineSlots<{\n /** 正文 */\n default?: () => unknown;\n /** 标题行(代替 title) */\n header?: () => unknown;\n /** 图标(代替 icon;放进 20px 的图标位,颜色跟等级色) */\n icon?: () => unknown;\n}>();\n\nconst DEFAULT_ICON: Record<MessageVariant, IconName> = {\n info: \"info\",\n success: \"check\",\n warning: \"warn\",\n danger: \"warn\",\n neutral: \"info\",\n accent: \"info\",\n};\n\nconst classes = computed(() => [\n \"ak-message\",\n props.variant !== \"info\" && `ak-message--${props.variant}`,\n { \"ak-message--banner\": props.banner, \"ak-message--stripes\": props.stripes },\n]);\n\nfunction close() {\n show.value = false;\n emit(\"close\");\n}\n</script>\n\n<template>\n <!-- 警告 / 危险是 alert(动态插入时读屏立刻念),其余是 status(礼貌播报) -->\n <div v-if=\"show\" :class=\"classes\" :role=\"variant === 'warning' || variant === 'danger' ? 'alert' : 'status'\">\n <template v-if=\"showIcon\">\n <span v-if=\"$slots.icon\" class=\"ak-message__icon\"><slot name=\"icon\" /></span>\n <AkIcon v-else :name=\"icon ?? DEFAULT_ICON[variant]\" class=\"ak-message__icon\" />\n </template>\n <div class=\"ak-message__body\">\n <div v-if=\"title || $slots.header\" class=\"ak-message__title\"><slot name=\"header\">{{ title }}</slot></div>\n <slot />\n </div>\n <button v-if=\"closable\" type=\"button\" class=\"ak-message__close\" aria-label=\"关闭\" @click=\"close\">✕</button>\n </div>\n</template>\n","import { Comment, Fragment, Text, cloneVNode, h, type VNode } from \"vue\";\n\n/** 原生就在 Tab 顺序里的标签(a 要有 href 才算,交给调用方自己保证) */\nconst FOCUSABLE = new Set([\"a\", \"button\", \"input\", \"select\", \"textarea\", \"summary\"]);\n\nconst flatten = (nodes: VNode[]): VNode[] =>\n nodes.flatMap(n => (n.type === Fragment && Array.isArray(n.children) ? flatten(n.children as VNode[]) : n.type === Comment ? [] : [n]));\n\n/** 触发元素(插槽里第一个元素 / 组件)自己写的 id;只有文字、没写时 undefined */\nexport function firstId(nodes: VNode[] | undefined): string | undefined {\n const first = flatten(nodes ?? []).find(n => n.type !== Text || String(n.children).trim());\n const id = first && first.type !== Text ? first.props?.id : undefined;\n return id == null || id === \"\" ? undefined : String(id);\n}\n\n/**\n * 触发元素写在插槽里(同 Naive 的 NPopover #trigger / NDropdown 默认插槽):取第一个元素 / 组件 vnode 克隆一份,\n * 补上 ARIA 属性与事件(与它自己的合并,不覆盖)。只有文字时包一层 <span>;\n * focusable 时,原生不可聚焦的元素(span / abbr / img …)补 tabindex=\"0\",键盘也能触发——组件(AkButton 等)假定自己渲染可聚焦元素。\n */\nexport function decorateTrigger(nodes: VNode[] | undefined, extra: Record<string, unknown>, focusable = true): VNode | undefined {\n const list = flatten(nodes ?? []).filter(n => n.type !== Text || String(n.children).trim());\n const first = list[0];\n if (!first) return undefined;\n if (first.type === Text) return h(\"span\", { tabindex: focusable ? 0 : undefined, ...extra }, list);\n const p = first.props ?? {};\n const needsTab = focusable && typeof first.type === \"string\" && !FOCUSABLE.has(first.type) && p.tabindex == null && p.tabIndex == null;\n return cloneVNode(first, needsTab ? { tabindex: 0, ...extra } : extra, true);\n}\n\n/** 把 vnode 原样渲染;定义在组件外保持同一个组件类型,重渲染时不重建(同 AkTabs) */\nexport const Render = (p: { content: unknown }) => (typeof p.content === \"function\" ? p.content() : p.content);\n","import { computed, onBeforeUnmount, watch, type Ref } from \"vue\";\n\nexport type PopoverPlacement = \"top\" | \"top-start\" | \"top-end\" | \"bottom\" | \"bottom-start\" | \"bottom-end\" | \"left\" | \"right\";\nexport type PopoverTrigger = \"hover\" | \"click\" | \"focus\" | \"manual\";\n\nexport interface PopoverBaseProps {\n trigger: PopoverTrigger;\n delay: number;\n duration: number;\n disabled?: boolean;\n}\n\n/**\n * AkTooltip / AkPopover 共用的开合逻辑(同 Naive 的 NPopover):\n * hover = 悬停(delay 后出现、离开 duration 后消失,能移进气泡里)+ 键盘聚焦 · focus = 只看聚焦 · click = 点触发元素开合、点外面关 · manual = 只听 v-model。\n * 任何方式打开的都能按 Esc 关(WAI-ARIA Tooltip)。事件挂在外层 .ak-tip-anchor 上(气泡是它的后代,移进气泡不算离开)。\n */\nexport function usePopover(props: PopoverBaseProps, model: Ref<boolean | undefined>, anchor: Ref<HTMLElement | null>) {\n let timer: ReturnType<typeof setTimeout> | undefined;\n const open = computed(() => !!model.value && !props.disabled);\n\n function set(v: boolean, wait = 0) {\n clearTimeout(timer);\n if (wait > 0) timer = setTimeout(() => (model.value = v), wait);\n else model.value = v;\n }\n\n const hover = () => props.trigger === \"hover\";\n const focus = () => props.trigger === \"hover\" || props.trigger === \"focus\";\n\n const anchorOn = {\n mouseenter: () => hover() && set(true, props.delay),\n mouseleave: () => hover() && set(false, props.duration),\n focusin: () => focus() && set(true),\n focusout: (e: FocusEvent) => {\n if (focus() && !anchor.value?.contains(e.relatedTarget as Node | null)) set(false);\n },\n keydown: (e: KeyboardEvent) => {\n if (e.key !== \"Escape\" || !open.value) return;\n e.preventDefault(); // 在对话框里时别顺带把对话框也关了\n e.stopPropagation();\n // 触发元素是 anchor 的第一个子元素,气泡在它后面:焦点在气泡里时关掉后还给触发元素\n const trigger = anchor.value?.firstElementChild as HTMLElement | null | undefined;\n const inBubble = !trigger?.contains(e.target as Node);\n set(false);\n if (inBubble) trigger?.focus();\n },\n };\n\n /** 给触发元素:click 模式开合 */\n const onTriggerClick = () => {\n if (props.trigger === \"click\" && !props.disabled) set(!model.value);\n };\n\n /** click 模式:点外面关(监听挂在 anchor 所在的文档上——示例在 iframe 里时不是全局 document) */\n function onOutside(e: PointerEvent) {\n if (!anchor.value?.contains(e.target as Node)) set(false);\n }\n let doc: Document | undefined;\n watch(\n () => open.value && props.trigger === \"click\",\n on => {\n doc?.removeEventListener(\"pointerdown\", onOutside, true);\n doc = on ? anchor.value?.ownerDocument : undefined;\n doc?.addEventListener(\"pointerdown\", onOutside, true);\n },\n { flush: \"post\" },\n );\n onBeforeUnmount(() => {\n clearTimeout(timer);\n doc?.removeEventListener(\"pointerdown\", onOutside, true);\n });\n\n return { open, anchorOn, onTriggerClick };\n}\n","<script setup lang=\"ts\">\n/**\n * 文字提示(同 Naive 的 NTooltip):#trigger 里放触发元素,默认插槽是提示内容。\n * 与纯 CSS 的 [data-ak-tip] 分工:那个只是属性里的一句字符串、只能在上方、没有 JS(模板 / AkItem 的 tip 用它);\n * 这个能放任意内容、四个方向、点击 / 手动触发,触发元素带 aria-describedby,Esc 可关。\n */\nimport { useId, useTemplateRef, type VNode } from \"vue\";\n\nimport { Render, decorateTrigger } from \"./trigger\";\nimport { usePopover, type PopoverPlacement, type PopoverTrigger } from \"./usePopover\";\n\nconst props = withDefaults(\n defineProps<{\n /** 出现在触发元素的哪一边:top(默认)· bottom · left · right;-start / -end 与触发元素左 / 右缘对齐。不自动翻转,贴边的触发元素自己选 */\n placement?: PopoverPlacement;\n /** 触发方式:hover 悬停 + 键盘聚焦(默认)· focus 只看聚焦 · click 点击开合 · manual 只由 v-model 控制 */\n trigger?: PopoverTrigger;\n /** 悬停多久后出现(ms) */\n delay?: number;\n /** 移开多久后消失(ms);这段时间里鼠标能移进提示里 */\n duration?: number;\n /** 禁用:不再出现 */\n disabled?: boolean;\n }>(),\n { placement: \"top\", trigger: \"hover\", delay: 100, duration: 100 },\n);\n\n/** 是否显示;不绑定时由 trigger 决定 */\nconst model = defineModel<boolean>({ default: false });\n\nconst slots = defineSlots<{\n /** 触发元素:取第一个元素 / 组件;只有文字时自动包一层 <span>,不可聚焦的元素自动补 tabindex=\"0\" */\n trigger?: () => VNode[];\n /** 提示内容(短句;较长的解释会在 280px 处折行) */\n default?: () => unknown;\n}>();\n\nconst id = useId();\nconst anchor = useTemplateRef<HTMLElement>(\"anchor\");\nconst { open, anchorOn, onTriggerClick } = usePopover(props, model, anchor);\n</script>\n\n<template>\n <span ref=\"anchor\" class=\"ak-tip-anchor\" v-on=\"anchorOn\">\n <Render :content=\"decorateTrigger(slots.trigger?.(), { 'aria-describedby': id, onClick: onTriggerClick })\" />\n <span :id=\"id\" role=\"tooltip\" :class=\"['ak-tooltip', `ak-tooltip--${placement}`]\" :hidden=\"!open\"><slot /></span>\n </span>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 文字提示(同 Naive 的 NTooltip):#trigger 里放触发元素,默认插槽是提示内容。\n * 与纯 CSS 的 [data-ak-tip] 分工:那个只是属性里的一句字符串、只能在上方、没有 JS(模板 / AkItem 的 tip 用它);\n * 这个能放任意内容、四个方向、点击 / 手动触发,触发元素带 aria-describedby,Esc 可关。\n */\nimport { useId, useTemplateRef, type VNode } from \"vue\";\n\nimport { Render, decorateTrigger } from \"./trigger\";\nimport { usePopover, type PopoverPlacement, type PopoverTrigger } from \"./usePopover\";\n\nconst props = withDefaults(\n defineProps<{\n /** 出现在触发元素的哪一边:top(默认)· bottom · left · right;-start / -end 与触发元素左 / 右缘对齐。不自动翻转,贴边的触发元素自己选 */\n placement?: PopoverPlacement;\n /** 触发方式:hover 悬停 + 键盘聚焦(默认)· focus 只看聚焦 · click 点击开合 · manual 只由 v-model 控制 */\n trigger?: PopoverTrigger;\n /** 悬停多久后出现(ms) */\n delay?: number;\n /** 移开多久后消失(ms);这段时间里鼠标能移进提示里 */\n duration?: number;\n /** 禁用:不再出现 */\n disabled?: boolean;\n }>(),\n { placement: \"top\", trigger: \"hover\", delay: 100, duration: 100 },\n);\n\n/** 是否显示;不绑定时由 trigger 决定 */\nconst model = defineModel<boolean>({ default: false });\n\nconst slots = defineSlots<{\n /** 触发元素:取第一个元素 / 组件;只有文字时自动包一层 <span>,不可聚焦的元素自动补 tabindex=\"0\" */\n trigger?: () => VNode[];\n /** 提示内容(短句;较长的解释会在 280px 处折行) */\n default?: () => unknown;\n}>();\n\nconst id = useId();\nconst anchor = useTemplateRef<HTMLElement>(\"anchor\");\nconst { open, anchorOn, onTriggerClick } = usePopover(props, model, anchor);\n</script>\n\n<template>\n <span ref=\"anchor\" class=\"ak-tip-anchor\" v-on=\"anchorOn\">\n <Render :content=\"decorateTrigger(slots.trigger?.(), { 'aria-describedby': id, onClick: onTriggerClick })\" />\n <span :id=\"id\" role=\"tooltip\" :class=\"['ak-tooltip', `ak-tooltip--${placement}`]\" :hidden=\"!open\"><slot /></span>\n </span>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 弹出卡片(同 Naive 的 NPopover):比 AkTooltip 大、白底、顶边主色条,能放标题、段落、链接、道具。\n * 默认点击开合(里面常有可点的东西,悬停弹出的卡片键盘用户够不着);点外面 / Esc 关,焦点在卡片里时还给触发元素。\n */\nimport { computed, useId, useTemplateRef, type VNode } from \"vue\";\n\nimport { Render, decorateTrigger } from \"./trigger\";\nimport { usePopover, type PopoverPlacement, type PopoverTrigger } from \"./usePopover\";\n\nconst props = withDefaults(\n defineProps<{\n /** 标题(粗体一行);也可以用 #header 插槽 */\n title?: string;\n /** 出现在触发元素的哪一边:bottom(默认)· top · left · right;-start / -end 与触发元素左 / 右缘对齐。不自动翻转,贴边的触发元素自己选 */\n placement?: PopoverPlacement;\n /** 触发方式:click 点击开合(默认)· hover 悬停 + 键盘聚焦 · focus 只看聚焦 · manual 只由 v-model 控制 */\n trigger?: PopoverTrigger;\n /** hover 模式:悬停多久后出现(ms) */\n delay?: number;\n /** hover 模式:移开多久后消失(ms);这段时间里鼠标能移进卡片里 */\n duration?: number;\n /** 禁用:不再弹出 */\n disabled?: boolean;\n }>(),\n { title: undefined, placement: \"bottom\", trigger: \"click\", delay: 100, duration: 100 },\n);\n\n/** 是否显示;不绑定时由 trigger 决定 */\nconst model = defineModel<boolean>({ default: false });\n\nconst slots = defineSlots<{\n /** 触发元素:取第一个元素 / 组件;只有文字时自动包一层 <span>,不可聚焦的元素自动补 tabindex=\"0\" */\n trigger?: () => VNode[];\n /** 卡片正文 */\n default?: () => unknown;\n /** 标题行(代替 title) */\n header?: () => unknown;\n}>();\n\nconst id = useId();\nconst anchor = useTemplateRef<HTMLElement>(\"anchor\");\nconst { open, anchorOn, onTriggerClick } = usePopover(props, model, anchor);\n\n/** 点击打开的是非模态对话框(触发元素 aria-expanded / aria-controls);悬停 / 聚焦打开的等同富文本提示(aria-describedby) */\nconst isDialog = computed(() => props.trigger === \"click\" || props.trigger === \"manual\");\nconst triggerAttrs = computed(() =>\n isDialog.value\n ? { \"aria-haspopup\": \"dialog\", \"aria-expanded\": open.value, \"aria-controls\": id, onClick: onTriggerClick }\n : { \"aria-describedby\": id, onClick: onTriggerClick },\n);\n</script>\n\n<template>\n <span ref=\"anchor\" class=\"ak-tip-anchor\" v-on=\"anchorOn\">\n <Render :content=\"decorateTrigger(slots.trigger?.(), triggerAttrs)\" />\n <div\n :id=\"id\"\n :role=\"isDialog ? 'dialog' : 'tooltip'\"\n :aria-labelledby=\"isDialog && (title || $slots.header) ? `${id}-title` : undefined\"\n :class=\"['ak-popover', `ak-popover--${placement}`]\"\n :hidden=\"!open\"\n >\n <div v-if=\"title || $slots.header\" :id=\"`${id}-title`\" class=\"ak-popover__title\"><slot name=\"header\">{{ title }}</slot></div>\n <slot />\n </div>\n </span>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 弹出卡片(同 Naive 的 NPopover):比 AkTooltip 大、白底、顶边主色条,能放标题、段落、链接、道具。\n * 默认点击开合(里面常有可点的东西,悬停弹出的卡片键盘用户够不着);点外面 / Esc 关,焦点在卡片里时还给触发元素。\n */\nimport { computed, useId, useTemplateRef, type VNode } from \"vue\";\n\nimport { Render, decorateTrigger } from \"./trigger\";\nimport { usePopover, type PopoverPlacement, type PopoverTrigger } from \"./usePopover\";\n\nconst props = withDefaults(\n defineProps<{\n /** 标题(粗体一行);也可以用 #header 插槽 */\n title?: string;\n /** 出现在触发元素的哪一边:bottom(默认)· top · left · right;-start / -end 与触发元素左 / 右缘对齐。不自动翻转,贴边的触发元素自己选 */\n placement?: PopoverPlacement;\n /** 触发方式:click 点击开合(默认)· hover 悬停 + 键盘聚焦 · focus 只看聚焦 · manual 只由 v-model 控制 */\n trigger?: PopoverTrigger;\n /** hover 模式:悬停多久后出现(ms) */\n delay?: number;\n /** hover 模式:移开多久后消失(ms);这段时间里鼠标能移进卡片里 */\n duration?: number;\n /** 禁用:不再弹出 */\n disabled?: boolean;\n }>(),\n { title: undefined, placement: \"bottom\", trigger: \"click\", delay: 100, duration: 100 },\n);\n\n/** 是否显示;不绑定时由 trigger 决定 */\nconst model = defineModel<boolean>({ default: false });\n\nconst slots = defineSlots<{\n /** 触发元素:取第一个元素 / 组件;只有文字时自动包一层 <span>,不可聚焦的元素自动补 tabindex=\"0\" */\n trigger?: () => VNode[];\n /** 卡片正文 */\n default?: () => unknown;\n /** 标题行(代替 title) */\n header?: () => unknown;\n}>();\n\nconst id = useId();\nconst anchor = useTemplateRef<HTMLElement>(\"anchor\");\nconst { open, anchorOn, onTriggerClick } = usePopover(props, model, anchor);\n\n/** 点击打开的是非模态对话框(触发元素 aria-expanded / aria-controls);悬停 / 聚焦打开的等同富文本提示(aria-describedby) */\nconst isDialog = computed(() => props.trigger === \"click\" || props.trigger === \"manual\");\nconst triggerAttrs = computed(() =>\n isDialog.value\n ? { \"aria-haspopup\": \"dialog\", \"aria-expanded\": open.value, \"aria-controls\": id, onClick: onTriggerClick }\n : { \"aria-describedby\": id, onClick: onTriggerClick },\n);\n</script>\n\n<template>\n <span ref=\"anchor\" class=\"ak-tip-anchor\" v-on=\"anchorOn\">\n <Render :content=\"decorateTrigger(slots.trigger?.(), triggerAttrs)\" />\n <div\n :id=\"id\"\n :role=\"isDialog ? 'dialog' : 'tooltip'\"\n :aria-labelledby=\"isDialog && (title || $slots.header) ? `${id}-title` : undefined\"\n :class=\"['ak-popover', `ak-popover--${placement}`]\"\n :hidden=\"!open\"\n >\n <div v-if=\"title || $slots.header\" :id=\"`${id}-title`\" class=\"ak-popover__title\"><slot name=\"header\">{{ title }}</slot></div>\n <slot />\n </div>\n </span>\n</template>\n","<script setup lang=\"ts\">\n/** AkDropdown 内部用的一个菜单项(不导出):普通项是 li[role=menuitem];有 href 的是 li[role=none] > a[role=menuitem](MW 门户链接的结构) */\nimport { computed } from \"vue\";\n\nimport AkIcon from \"../Icon/AkIcon.vue\";\nimport type { DropdownKey, DropdownOption } from \"./types\";\n\nconst props = defineProps<{\n /** 菜单项 */\n option: DropdownOption;\n /** AkDropdown 的 value:有值时是单选菜单项 */\n value?: DropdownKey;\n}>();\n\nconst emit = defineEmits<{\n /** 点了这一项(禁用项也会触发,由 AkDropdown 判断) */\n select: [e: MouseEvent];\n}>();\n\nconst radio = computed(() => props.value !== undefined);\nconst active = computed(() => radio.value && props.option.key === props.value);\nconst attrs = computed(() => ({\n role: radio.value ? \"menuitemradio\" : \"menuitem\",\n tabindex: -1,\n \"aria-checked\": radio.value ? active.value : undefined,\n \"aria-disabled\": props.option.disabled || undefined,\n class: [\"ak-menu__item\", { \"is-active\": active.value, \"ak-menu__item--danger\": props.option.danger }],\n}));\n</script>\n\n<template>\n <li v-if=\"!option.href\" v-bind=\"attrs\" @click=\"emit('select', $event)\">\n <AkIcon v-if=\"option.icon\" :name=\"option.icon\" :size=\"16\" />{{ option.label }}\n </li>\n <li v-else role=\"none\">\n <a :href=\"option.disabled ? undefined : option.href\" v-bind=\"attrs\" @click=\"emit('select', $event)\">\n <AkIcon v-if=\"option.icon\" :name=\"option.icon\" :size=\"16\" />{{ option.label }}\n </a>\n </li>\n</template>\n","<script setup lang=\"ts\">\n/** AkDropdown 内部用的一个菜单项(不导出):普通项是 li[role=menuitem];有 href 的是 li[role=none] > a[role=menuitem](MW 门户链接的结构) */\nimport { computed } from \"vue\";\n\nimport AkIcon from \"../Icon/AkIcon.vue\";\nimport type { DropdownKey, DropdownOption } from \"./types\";\n\nconst props = defineProps<{\n /** 菜单项 */\n option: DropdownOption;\n /** AkDropdown 的 value:有值时是单选菜单项 */\n value?: DropdownKey;\n}>();\n\nconst emit = defineEmits<{\n /** 点了这一项(禁用项也会触发,由 AkDropdown 判断) */\n select: [e: MouseEvent];\n}>();\n\nconst radio = computed(() => props.value !== undefined);\nconst active = computed(() => radio.value && props.option.key === props.value);\nconst attrs = computed(() => ({\n role: radio.value ? \"menuitemradio\" : \"menuitem\",\n tabindex: -1,\n \"aria-checked\": radio.value ? active.value : undefined,\n \"aria-disabled\": props.option.disabled || undefined,\n class: [\"ak-menu__item\", { \"is-active\": active.value, \"ak-menu__item--danger\": props.option.danger }],\n}));\n</script>\n\n<template>\n <li v-if=\"!option.href\" v-bind=\"attrs\" @click=\"emit('select', $event)\">\n <AkIcon v-if=\"option.icon\" :name=\"option.icon\" :size=\"16\" />{{ option.label }}\n </li>\n <li v-else role=\"none\">\n <a :href=\"option.disabled ? undefined : option.href\" v-bind=\"attrs\" @click=\"emit('select', $event)\">\n <AkIcon v-if=\"option.icon\" :name=\"option.icon\" :size=\"16\" />{{ option.label }}\n </a>\n </li>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 下拉菜单(同 Naive 的 NDropdown):默认插槽放触发元素(一般是 AkButton),options 给菜单项,选中触发 select。\n * 键盘与 ARIA 按 WAI-ARIA 菜单按钮(Menu Button):Enter / 空格 / ↓ 打开并落在第一项,↑ 落在最后一项;\n * 菜单里 ↑ ↓ Home End 移动、首字母跳转、Enter / 空格选中、Esc 收起并把焦点还给触发元素、Tab 收起并离开;点外面收起。\n */\nimport { computed, nextTick, onBeforeUnmount, onMounted, useId, useTemplateRef, watch, type VNode } from \"vue\";\n\nimport { Render, decorateTrigger, firstId } from \"../Tooltip/trigger\";\nimport MenuItem from \"./MenuItem.vue\";\nimport type { DropdownKey, DropdownMixedOption, DropdownOption } from \"./types\";\n\nconst props = withDefaults(\n defineProps<{\n /** 菜单项:{ key, label, icon?, disabled?, danger?, href? };{ type: \"divider\" } 分隔线;{ type: \"group\", label, children } 带小标题的一组 */\n options: DropdownMixedOption[];\n /** 菜单对齐:bottom-start 与触发元素左对齐(默认)· bottom-end 右对齐(靠页面右边的触发元素用) */\n placement?: \"bottom-start\" | \"bottom-end\";\n /** 当前选中项的 key:该项高亮,菜单变成单选菜单(menuitemradio + aria-checked),打开时落在它上面 */\n value?: DropdownKey;\n /** 读屏用的菜单名;不写时用触发元素的文字 */\n label?: string;\n /** 禁用:触发元素点了不展开 */\n disabled?: boolean;\n }>(),\n { placement: \"bottom-start\", value: undefined, label: undefined },\n);\n\n/** 菜单是否展开 */\nconst model = defineModel<boolean>({ default: false });\n\nconst emit = defineEmits<{\n /** 选了一项(点击 / Enter / 空格);之后菜单收起、焦点回到触发元素。有 href 的项照常跳转 */\n select: [key: DropdownKey, option: DropdownOption];\n}>();\n\nconst slots = defineSlots<{\n /** 触发元素:取第一个元素 / 组件,自动补 aria-haspopup / aria-expanded / aria-controls 与键盘;id 它自己写了就沿用,没写才补一个(菜单的 aria-labelledby 指向它) */\n default?: () => VNode[];\n}>();\n\nconst id = useId();\nconst triggerId = `${id}-trigger`;\nconst menuId = `${id}-menu`;\nconst root = useTemplateRef<HTMLElement>(\"root\");\nconst menu = useTemplateRef<HTMLElement>(\"menu\");\n\nconst items = () => [...(menu.value?.querySelectorAll<HTMLElement>('[role=\"menuitem\"], [role=\"menuitemradio\"]') ?? [])];\n/** 触发元素 = 根的第一个子元素 */\nconst triggerEl = () => root.value?.firstElementChild as HTMLElement | null | undefined;\n\nasync function openMenu(focus: \"first\" | \"last\") {\n model.value = true;\n await nextTick(); // 等 .is-open 生效(收起时菜单 display: none,聚焦不了)\n const list = items();\n const checked = list.find(el => el.getAttribute(\"aria-checked\") === \"true\");\n (checked ?? (focus === \"first\" ? list[0] : list.at(-1)))?.focus();\n}\n\nfunction closeMenu(returnFocus: boolean) {\n model.value = false;\n if (returnFocus) triggerEl()?.focus();\n}\n\nfunction onTriggerClick() {\n if (props.disabled) return;\n if (model.value) closeMenu(false);\n else openMenu(\"first\");\n}\n\nfunction onTriggerKeydown(e: KeyboardEvent) {\n if (props.disabled || ![\"Enter\", \" \", \"ArrowDown\", \"ArrowUp\"].includes(e.key)) return;\n e.preventDefault(); // 也拦掉 Enter / 空格随后合成的 click,免得刚打开又关上\n openMenu(e.key === \"ArrowUp\" ? \"last\" : \"first\");\n}\n\nconst triggerAttrs = computed(() => ({\n \"aria-haspopup\": \"menu\",\n \"aria-expanded\": model.value,\n \"aria-controls\": menuId,\n onClick: onTriggerClick,\n onKeydown: onTriggerKeydown,\n}));\n\n/** 渲染期取触发元素:它自己写了 id 就沿用(菜单的 aria-labelledby 跟着它),没写才补生成的 triggerId。\n * 插槽只能在渲染期调用,所以由模板调用,结果记在 rendered 里给后面的菜单用(同一次渲染、触发元素在前) */\nconst rendered = { triggerId };\nfunction renderTrigger() {\n const nodes = slots.default?.();\n const own = firstId(nodes);\n rendered.triggerId = own ?? triggerId;\n return decorateTrigger(nodes, own === undefined ? { id: triggerId, ...triggerAttrs.value } : triggerAttrs.value);\n}\n\n/** 首字母跳转:从当前项往后找第一个文字以这个字符开头的 */\nfunction typeahead(list: HTMLElement[], from: number, ch: string) {\n const c = ch.toLowerCase();\n for (let k = 1; k <= list.length; k++) {\n const el = list[(from + k) % list.length];\n if (el.textContent?.trim().toLowerCase().startsWith(c)) return el.focus();\n }\n}\n\nfunction onMenuKeydown(e: KeyboardEvent) {\n const list = items();\n const i = list.indexOf(e.target as HTMLElement);\n const go = (n: number) => list[(n + list.length) % list.length]?.focus();\n switch (e.key) {\n case \"ArrowDown\":\n go(i + 1);\n break;\n case \"ArrowUp\":\n go(i < 0 ? -1 : i - 1);\n break;\n case \"Home\":\n case \"PageUp\":\n go(0);\n break;\n case \"End\":\n case \"PageDown\":\n go(-1);\n break;\n case \"Escape\":\n closeMenu(true);\n break;\n case \"Tab\":\n closeMenu(false); // 不拦:焦点照常移到菜单后面的元素\n return;\n case \"Enter\":\n case \" \":\n list[i]?.click(); // <a> 项会照常跳转\n break;\n default:\n if (e.key.length !== 1 || e.ctrlKey || e.metaKey || e.altKey) return;\n typeahead(list, i, e.key);\n }\n e.preventDefault();\n e.stopPropagation(); // Esc 不要顺带关掉外面的对话框\n}\n\nfunction onSelect(e: MouseEvent, o: DropdownOption) {\n if (o.disabled) {\n e.preventDefault();\n return;\n }\n emit(\"select\", o.key, o);\n closeMenu(true);\n}\n\n/** 展开时点外面收起(监听挂在组件所在的文档上——示例在 iframe 里时不是全局 document) */\nfunction onOutside(e: PointerEvent) {\n if (!root.value?.contains(e.target as Node)) closeMenu(false);\n}\nlet doc: Document | undefined;\nfunction syncOutside() {\n doc?.removeEventListener(\"pointerdown\", onOutside, true);\n doc = model.value ? root.value?.ownerDocument : undefined;\n doc?.addEventListener(\"pointerdown\", onOutside, true);\n}\nwatch(model, syncOutside, { flush: \"post\" });\nonMounted(syncOutside);\nonBeforeUnmount(() => doc?.removeEventListener(\"pointerdown\", onOutside, true));\n</script>\n\n<template>\n <!-- ak-not-prose:菜单是 ul / li / a,别吃正文的列表符、段距与链接色 -->\n <div ref=\"root\" :class=\"['ak-dropdown', 'ak-not-prose', { 'is-open': model }]\">\n <Render :content=\"renderTrigger()\" />\n <ul\n :id=\"menuId\"\n ref=\"menu\"\n role=\"menu\"\n :class=\"['ak-menu', placement === 'bottom-end' && 'ak-menu--right']\"\n :aria-labelledby=\"label ? undefined : rendered.triggerId\"\n :aria-label=\"label\"\n @keydown=\"onMenuKeydown\"\n >\n <template v-for=\"(o, i) in options\" :key=\"o.key ?? `_${i}`\">\n <li v-if=\"o.type === 'divider'\" class=\"ak-menu__sep\" role=\"separator\" />\n <li v-else-if=\"o.type === 'group'\" class=\"ak-menu__group\" role=\"group\" :aria-label=\"o.label\">\n <!-- 组名由 aria-label 念,这里只给眼睛看 -->\n <div class=\"ak-menu__label\" aria-hidden=\"true\">{{ o.label }}</div>\n <ul role=\"none\">\n <template v-for=\"(c, j) in o.children\" :key=\"c.key ?? `_${j}`\">\n <li v-if=\"c.type === 'divider'\" class=\"ak-menu__sep\" role=\"separator\" />\n <MenuItem v-else :option=\"c\" :value=\"value\" @select=\"onSelect($event, c)\" />\n </template>\n </ul>\n </li>\n <MenuItem v-else :option=\"o\" :value=\"value\" @select=\"onSelect($event, o)\" />\n </template>\n </ul>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 下拉菜单(同 Naive 的 NDropdown):默认插槽放触发元素(一般是 AkButton),options 给菜单项,选中触发 select。\n * 键盘与 ARIA 按 WAI-ARIA 菜单按钮(Menu Button):Enter / 空格 / ↓ 打开并落在第一项,↑ 落在最后一项;\n * 菜单里 ↑ ↓ Home End 移动、首字母跳转、Enter / 空格选中、Esc 收起并把焦点还给触发元素、Tab 收起并离开;点外面收起。\n */\nimport { computed, nextTick, onBeforeUnmount, onMounted, useId, useTemplateRef, watch, type VNode } from \"vue\";\n\nimport { Render, decorateTrigger, firstId } from \"../Tooltip/trigger\";\nimport MenuItem from \"./MenuItem.vue\";\nimport type { DropdownKey, DropdownMixedOption, DropdownOption } from \"./types\";\n\nconst props = withDefaults(\n defineProps<{\n /** 菜单项:{ key, label, icon?, disabled?, danger?, href? };{ type: \"divider\" } 分隔线;{ type: \"group\", label, children } 带小标题的一组 */\n options: DropdownMixedOption[];\n /** 菜单对齐:bottom-start 与触发元素左对齐(默认)· bottom-end 右对齐(靠页面右边的触发元素用) */\n placement?: \"bottom-start\" | \"bottom-end\";\n /** 当前选中项的 key:该项高亮,菜单变成单选菜单(menuitemradio + aria-checked),打开时落在它上面 */\n value?: DropdownKey;\n /** 读屏用的菜单名;不写时用触发元素的文字 */\n label?: string;\n /** 禁用:触发元素点了不展开 */\n disabled?: boolean;\n }>(),\n { placement: \"bottom-start\", value: undefined, label: undefined },\n);\n\n/** 菜单是否展开 */\nconst model = defineModel<boolean>({ default: false });\n\nconst emit = defineEmits<{\n /** 选了一项(点击 / Enter / 空格);之后菜单收起、焦点回到触发元素。有 href 的项照常跳转 */\n select: [key: DropdownKey, option: DropdownOption];\n}>();\n\nconst slots = defineSlots<{\n /** 触发元素:取第一个元素 / 组件,自动补 aria-haspopup / aria-expanded / aria-controls 与键盘;id 它自己写了就沿用,没写才补一个(菜单的 aria-labelledby 指向它) */\n default?: () => VNode[];\n}>();\n\nconst id = useId();\nconst triggerId = `${id}-trigger`;\nconst menuId = `${id}-menu`;\nconst root = useTemplateRef<HTMLElement>(\"root\");\nconst menu = useTemplateRef<HTMLElement>(\"menu\");\n\nconst items = () => [...(menu.value?.querySelectorAll<HTMLElement>('[role=\"menuitem\"], [role=\"menuitemradio\"]') ?? [])];\n/** 触发元素 = 根的第一个子元素 */\nconst triggerEl = () => root.value?.firstElementChild as HTMLElement | null | undefined;\n\nasync function openMenu(focus: \"first\" | \"last\") {\n model.value = true;\n await nextTick(); // 等 .is-open 生效(收起时菜单 display: none,聚焦不了)\n const list = items();\n const checked = list.find(el => el.getAttribute(\"aria-checked\") === \"true\");\n (checked ?? (focus === \"first\" ? list[0] : list.at(-1)))?.focus();\n}\n\nfunction closeMenu(returnFocus: boolean) {\n model.value = false;\n if (returnFocus) triggerEl()?.focus();\n}\n\nfunction onTriggerClick() {\n if (props.disabled) return;\n if (model.value) closeMenu(false);\n else openMenu(\"first\");\n}\n\nfunction onTriggerKeydown(e: KeyboardEvent) {\n if (props.disabled || ![\"Enter\", \" \", \"ArrowDown\", \"ArrowUp\"].includes(e.key)) return;\n e.preventDefault(); // 也拦掉 Enter / 空格随后合成的 click,免得刚打开又关上\n openMenu(e.key === \"ArrowUp\" ? \"last\" : \"first\");\n}\n\nconst triggerAttrs = computed(() => ({\n \"aria-haspopup\": \"menu\",\n \"aria-expanded\": model.value,\n \"aria-controls\": menuId,\n onClick: onTriggerClick,\n onKeydown: onTriggerKeydown,\n}));\n\n/** 渲染期取触发元素:它自己写了 id 就沿用(菜单的 aria-labelledby 跟着它),没写才补生成的 triggerId。\n * 插槽只能在渲染期调用,所以由模板调用,结果记在 rendered 里给后面的菜单用(同一次渲染、触发元素在前) */\nconst rendered = { triggerId };\nfunction renderTrigger() {\n const nodes = slots.default?.();\n const own = firstId(nodes);\n rendered.triggerId = own ?? triggerId;\n return decorateTrigger(nodes, own === undefined ? { id: triggerId, ...triggerAttrs.value } : triggerAttrs.value);\n}\n\n/** 首字母跳转:从当前项往后找第一个文字以这个字符开头的 */\nfunction typeahead(list: HTMLElement[], from: number, ch: string) {\n const c = ch.toLowerCase();\n for (let k = 1; k <= list.length; k++) {\n const el = list[(from + k) % list.length];\n if (el.textContent?.trim().toLowerCase().startsWith(c)) return el.focus();\n }\n}\n\nfunction onMenuKeydown(e: KeyboardEvent) {\n const list = items();\n const i = list.indexOf(e.target as HTMLElement);\n const go = (n: number) => list[(n + list.length) % list.length]?.focus();\n switch (e.key) {\n case \"ArrowDown\":\n go(i + 1);\n break;\n case \"ArrowUp\":\n go(i < 0 ? -1 : i - 1);\n break;\n case \"Home\":\n case \"PageUp\":\n go(0);\n break;\n case \"End\":\n case \"PageDown\":\n go(-1);\n break;\n case \"Escape\":\n closeMenu(true);\n break;\n case \"Tab\":\n closeMenu(false); // 不拦:焦点照常移到菜单后面的元素\n return;\n case \"Enter\":\n case \" \":\n list[i]?.click(); // <a> 项会照常跳转\n break;\n default:\n if (e.key.length !== 1 || e.ctrlKey || e.metaKey || e.altKey) return;\n typeahead(list, i, e.key);\n }\n e.preventDefault();\n e.stopPropagation(); // Esc 不要顺带关掉外面的对话框\n}\n\nfunction onSelect(e: MouseEvent, o: DropdownOption) {\n if (o.disabled) {\n e.preventDefault();\n return;\n }\n emit(\"select\", o.key, o);\n closeMenu(true);\n}\n\n/** 展开时点外面收起(监听挂在组件所在的文档上——示例在 iframe 里时不是全局 document) */\nfunction onOutside(e: PointerEvent) {\n if (!root.value?.contains(e.target as Node)) closeMenu(false);\n}\nlet doc: Document | undefined;\nfunction syncOutside() {\n doc?.removeEventListener(\"pointerdown\", onOutside, true);\n doc = model.value ? root.value?.ownerDocument : undefined;\n doc?.addEventListener(\"pointerdown\", onOutside, true);\n}\nwatch(model, syncOutside, { flush: \"post\" });\nonMounted(syncOutside);\nonBeforeUnmount(() => doc?.removeEventListener(\"pointerdown\", onOutside, true));\n</script>\n\n<template>\n <!-- ak-not-prose:菜单是 ul / li / a,别吃正文的列表符、段距与链接色 -->\n <div ref=\"root\" :class=\"['ak-dropdown', 'ak-not-prose', { 'is-open': model }]\">\n <Render :content=\"renderTrigger()\" />\n <ul\n :id=\"menuId\"\n ref=\"menu\"\n role=\"menu\"\n :class=\"['ak-menu', placement === 'bottom-end' && 'ak-menu--right']\"\n :aria-labelledby=\"label ? undefined : rendered.triggerId\"\n :aria-label=\"label\"\n @keydown=\"onMenuKeydown\"\n >\n <template v-for=\"(o, i) in options\" :key=\"o.key ?? `_${i}`\">\n <li v-if=\"o.type === 'divider'\" class=\"ak-menu__sep\" role=\"separator\" />\n <li v-else-if=\"o.type === 'group'\" class=\"ak-menu__group\" role=\"group\" :aria-label=\"o.label\">\n <!-- 组名由 aria-label 念,这里只给眼睛看 -->\n <div class=\"ak-menu__label\" aria-hidden=\"true\">{{ o.label }}</div>\n <ul role=\"none\">\n <template v-for=\"(c, j) in o.children\" :key=\"c.key ?? `_${j}`\">\n <li v-if=\"c.type === 'divider'\" class=\"ak-menu__sep\" role=\"separator\" />\n <MenuItem v-else :option=\"c\" :value=\"value\" @select=\"onSelect($event, c)\" />\n </template>\n </ul>\n </li>\n <MenuItem v-else :option=\"o\" :value=\"value\" @select=\"onSelect($event, o)\" />\n </template>\n </ul>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 模态对话框(同 Naive 的 NModal + NDialog):原生 <dialog> + showModal()——焦点圈在对话框里、背后的页面 inert、Esc 关闭都由浏览器负责;\n * 这里补上:v-model 开合、点遮罩关闭、关闭后焦点还给打开前的元素、标题作可访问名。\n */\nimport { computed, onBeforeUnmount, onMounted, useId, useTemplateRef, watch } from \"vue\";\n\nimport AkButton from \"../Button/AkButton.vue\";\n\nconst props = withDefaults(\n defineProps<{\n /** 标题(同时作对话框的可访问名);要带格式时用 #header 插槽 */\n title?: string;\n /** 可访问名:没有标题时写(aria-label) */\n label?: string;\n /** 宽度:sm 420 · md 640(默认)· lg 900 · full 占满 96vw × 92vh */\n size?: \"sm\" | \"md\" | \"lg\" | \"full\";\n /** 标题栏右侧的 ✕ 关闭按钮 */\n closable?: boolean;\n /** 点遮罩关闭(同 Naive 的 mask-closable) */\n maskClosable?: boolean;\n /** 按 Esc 关闭(同 Naive 的 close-on-esc) */\n closeOnEsc?: boolean;\n /** 确认按钮文字:写了就在底栏放一枚黑白反转的确认按钮,点了触发 positive-click 并关闭 */\n positiveText?: string;\n /** 取消按钮文字:写了就在底栏放一枚默认按钮,点了触发 negative-click 并关闭 */\n negativeText?: string;\n }>(),\n {\n title: undefined,\n label: undefined,\n size: \"md\",\n closable: true,\n maskClosable: true,\n closeOnEsc: true,\n positiveText: undefined,\n negativeText: undefined,\n },\n);\n\n/** 是否打开 */\nconst model = defineModel<boolean>({ default: false });\n\nconst emit = defineEmits<{\n /** 点了确认按钮(之后关闭) */\n \"positive-click\": [];\n /** 点了取消按钮(之后关闭) */\n \"negative-click\": [];\n}>();\n\ndefineSlots<{\n /** 正文 */\n default?: () => unknown;\n /** 标题(代替 title) */\n header?: () => unknown;\n /** 底栏按钮(代替 positive-text / negative-text 那两枚),右对齐 */\n footer?: () => unknown;\n}>();\n\nconst id = useId();\nconst el = useTemplateRef<HTMLDialogElement>(\"el\");\nconst classes = computed(() => [\"ak-dialog\", props.size !== \"md\" && `ak-dialog--${props.size}`]);\n\n/** 打开前的焦点:关闭后还回去 */\nlet returnTo: HTMLElement | null = null;\n\nfunction sync(open: boolean) {\n const d = el.value;\n if (!d) return;\n if (open && !d.open) {\n returnTo = d.ownerDocument.activeElement as HTMLElement | null;\n d.showModal();\n } else if (!open && d.open) d.close();\n}\nwatch(model, sync, { flush: \"post\" });\nonMounted(() => sync(model.value));\n// 开着就被卸载(路由切走等):不会有 close 事件,焦点也要还回去\nonBeforeUnmount(() => {\n if (el.value?.open && returnTo?.isConnected) returnTo.focus();\n});\n\n/** 原生 close 事件:Esc、form[method=dialog]、d.close() 都走这里 */\nfunction onClose() {\n model.value = false;\n if (returnTo?.isConnected) returnTo.focus();\n returnTo = null;\n}\n\n/** Esc 触发的 cancel:不许 Esc 关时拦下 */\nfunction onCancel(e: Event) {\n if (!props.closeOnEsc) e.preventDefault();\n}\n\n/** 遮罩点击 = 点在 <dialog> 自身、且落在框外(::backdrop 的点击算在 dialog 上);按下也要在框外,免得从框里拖选到框外被当成点遮罩 */\nlet downOutside = false;\nconst outside = (e: MouseEvent) => {\n const r = el.value!.getBoundingClientRect();\n return e.target === el.value && (e.clientX < r.left || e.clientX > r.right || e.clientY < r.top || e.clientY > r.bottom);\n};\nfunction onPointerdown(e: PointerEvent) {\n downOutside = outside(e);\n}\nfunction onClick(e: MouseEvent) {\n if (props.maskClosable && downOutside && outside(e)) model.value = false;\n downOutside = false;\n}\n\nfunction onPositive() {\n emit(\"positive-click\");\n model.value = false;\n}\nfunction onNegative() {\n emit(\"negative-click\");\n model.value = false;\n}\n</script>\n\n<template>\n <dialog\n ref=\"el\"\n :class=\"classes\"\n :aria-labelledby=\"title || $slots.header ? `${id}-title` : undefined\"\n :aria-label=\"label\"\n @close=\"onClose\"\n @cancel=\"onCancel\"\n @pointerdown=\"onPointerdown\"\n @click=\"onClick\"\n >\n <div v-if=\"title || $slots.header || closable\" class=\"ak-dialog__head\">\n <h2 v-if=\"title || $slots.header\" :id=\"`${id}-title`\" class=\"ak-dialog__title\"><slot name=\"header\">{{ title }}</slot></h2>\n <span v-else class=\"ak-dialog__title\" /><!-- 只有关闭按钮时占位,把它推到右边 -->\n <AkButton v-if=\"closable\" icon=\"x\" label=\"关闭\" variant=\"ghost\" size=\"sm\" @click=\"model = false\" />\n </div>\n <div class=\"ak-dialog__body\"><slot /></div>\n <div v-if=\"$slots.footer || positiveText || negativeText\" class=\"ak-dialog__foot\">\n <slot name=\"footer\">\n <AkButton v-if=\"negativeText\" @click=\"onNegative\">{{ negativeText }}</AkButton>\n <AkButton v-if=\"positiveText\" variant=\"contrast\" @click=\"onPositive\">{{ positiveText }}</AkButton>\n </slot>\n </div>\n </dialog>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 模态对话框(同 Naive 的 NModal + NDialog):原生 <dialog> + showModal()——焦点圈在对话框里、背后的页面 inert、Esc 关闭都由浏览器负责;\n * 这里补上:v-model 开合、点遮罩关闭、关闭后焦点还给打开前的元素、标题作可访问名。\n */\nimport { computed, onBeforeUnmount, onMounted, useId, useTemplateRef, watch } from \"vue\";\n\nimport AkButton from \"../Button/AkButton.vue\";\n\nconst props = withDefaults(\n defineProps<{\n /** 标题(同时作对话框的可访问名);要带格式时用 #header 插槽 */\n title?: string;\n /** 可访问名:没有标题时写(aria-label) */\n label?: string;\n /** 宽度:sm 420 · md 640(默认)· lg 900 · full 占满 96vw × 92vh */\n size?: \"sm\" | \"md\" | \"lg\" | \"full\";\n /** 标题栏右侧的 ✕ 关闭按钮 */\n closable?: boolean;\n /** 点遮罩关闭(同 Naive 的 mask-closable) */\n maskClosable?: boolean;\n /** 按 Esc 关闭(同 Naive 的 close-on-esc) */\n closeOnEsc?: boolean;\n /** 确认按钮文字:写了就在底栏放一枚黑白反转的确认按钮,点了触发 positive-click 并关闭 */\n positiveText?: string;\n /** 取消按钮文字:写了就在底栏放一枚默认按钮,点了触发 negative-click 并关闭 */\n negativeText?: string;\n }>(),\n {\n title: undefined,\n label: undefined,\n size: \"md\",\n closable: true,\n maskClosable: true,\n closeOnEsc: true,\n positiveText: undefined,\n negativeText: undefined,\n },\n);\n\n/** 是否打开 */\nconst model = defineModel<boolean>({ default: false });\n\nconst emit = defineEmits<{\n /** 点了确认按钮(之后关闭) */\n \"positive-click\": [];\n /** 点了取消按钮(之后关闭) */\n \"negative-click\": [];\n}>();\n\ndefineSlots<{\n /** 正文 */\n default?: () => unknown;\n /** 标题(代替 title) */\n header?: () => unknown;\n /** 底栏按钮(代替 positive-text / negative-text 那两枚),右对齐 */\n footer?: () => unknown;\n}>();\n\nconst id = useId();\nconst el = useTemplateRef<HTMLDialogElement>(\"el\");\nconst classes = computed(() => [\"ak-dialog\", props.size !== \"md\" && `ak-dialog--${props.size}`]);\n\n/** 打开前的焦点:关闭后还回去 */\nlet returnTo: HTMLElement | null = null;\n\nfunction sync(open: boolean) {\n const d = el.value;\n if (!d) return;\n if (open && !d.open) {\n returnTo = d.ownerDocument.activeElement as HTMLElement | null;\n d.showModal();\n } else if (!open && d.open) d.close();\n}\nwatch(model, sync, { flush: \"post\" });\nonMounted(() => sync(model.value));\n// 开着就被卸载(路由切走等):不会有 close 事件,焦点也要还回去\nonBeforeUnmount(() => {\n if (el.value?.open && returnTo?.isConnected) returnTo.focus();\n});\n\n/** 原生 close 事件:Esc、form[method=dialog]、d.close() 都走这里 */\nfunction onClose() {\n model.value = false;\n if (returnTo?.isConnected) returnTo.focus();\n returnTo = null;\n}\n\n/** Esc 触发的 cancel:不许 Esc 关时拦下 */\nfunction onCancel(e: Event) {\n if (!props.closeOnEsc) e.preventDefault();\n}\n\n/** 遮罩点击 = 点在 <dialog> 自身、且落在框外(::backdrop 的点击算在 dialog 上);按下也要在框外,免得从框里拖选到框外被当成点遮罩 */\nlet downOutside = false;\nconst outside = (e: MouseEvent) => {\n const r = el.value!.getBoundingClientRect();\n return e.target === el.value && (e.clientX < r.left || e.clientX > r.right || e.clientY < r.top || e.clientY > r.bottom);\n};\nfunction onPointerdown(e: PointerEvent) {\n downOutside = outside(e);\n}\nfunction onClick(e: MouseEvent) {\n if (props.maskClosable && downOutside && outside(e)) model.value = false;\n downOutside = false;\n}\n\nfunction onPositive() {\n emit(\"positive-click\");\n model.value = false;\n}\nfunction onNegative() {\n emit(\"negative-click\");\n model.value = false;\n}\n</script>\n\n<template>\n <dialog\n ref=\"el\"\n :class=\"classes\"\n :aria-labelledby=\"title || $slots.header ? `${id}-title` : undefined\"\n :aria-label=\"label\"\n @close=\"onClose\"\n @cancel=\"onCancel\"\n @pointerdown=\"onPointerdown\"\n @click=\"onClick\"\n >\n <div v-if=\"title || $slots.header || closable\" class=\"ak-dialog__head\">\n <h2 v-if=\"title || $slots.header\" :id=\"`${id}-title`\" class=\"ak-dialog__title\"><slot name=\"header\">{{ title }}</slot></h2>\n <span v-else class=\"ak-dialog__title\" /><!-- 只有关闭按钮时占位,把它推到右边 -->\n <AkButton v-if=\"closable\" icon=\"x\" label=\"关闭\" variant=\"ghost\" size=\"sm\" @click=\"model = false\" />\n </div>\n <div class=\"ak-dialog__body\"><slot /></div>\n <div v-if=\"$slots.footer || positiveText || negativeText\" class=\"ak-dialog__foot\">\n <slot name=\"footer\">\n <AkButton v-if=\"negativeText\" @click=\"onNegative\">{{ negativeText }}</AkButton>\n <AkButton v-if=\"positiveText\" variant=\"contrast\" @click=\"onPositive\">{{ positiveText }}</AkButton>\n </slot>\n </div>\n </dialog>\n</template>\n","import { inject, type InjectionKey, type VNodeChild } from \"vue\";\n\n/** 颜色:info 主色(默认)· success 绿 · warning 黄 · danger 红(= toast.error) */\nexport type ToastVariant = \"info\" | \"success\" | \"warning\" | \"danger\";\n\n/** 正文:字符串,或返回 vnode 的函数(要放链接 / 加粗时) */\nexport type ToastContent = string | (() => VNodeChild);\n\n/** 单条的选项(同 Naive 的 MessageOptions;不写的跟 AkToastProvider) */\nexport interface ToastOptions {\n /** 加粗的标题行 */\n title?: string;\n /** 停留时长(ms),0 = 不自动消失 */\n duration?: number;\n /** 显示 ✕ 关闭按钮 */\n closable?: boolean;\n /** 关掉时(到时 / 点 ✕ / destroy)调用 */\n onClose?: () => void;\n}\n\n/** 已弹出的一条:destroy() 提前关掉 */\nexport interface ToastHandle {\n destroy: () => void;\n}\n\n/** useToast() 的返回值(同 Naive 的 MessageApi) */\nexport interface ToastApi {\n create: (content: ToastContent, options?: ToastOptions & { variant?: ToastVariant }) => ToastHandle;\n info: (content: ToastContent, options?: ToastOptions) => ToastHandle;\n success: (content: ToastContent, options?: ToastOptions) => ToastHandle;\n warning: (content: ToastContent, options?: ToastOptions) => ToastHandle;\n error: (content: ToastContent, options?: ToastOptions) => ToastHandle;\n /** 全部关掉 */\n destroyAll: () => void;\n}\n\nexport const toastKey: InjectionKey<ToastApi> = Symbol(\"AkToastProvider\");\n\n/**\n * 弹轻提示(同 Naive 的 useMessage):要在 <AkToastProvider> 里面的组件的 setup 里调用。\n * const toast = useToast();\n * toast.success(\"页面已加入监视列表\", { title: \"完成\" });\n */\nexport function useToast(): ToastApi {\n const api = inject(toastKey, null);\n if (!api) throw new Error(\"useToast() 要在 <AkToastProvider> 里面的组件中调用\");\n return api;\n}\n","<script setup lang=\"ts\">\n/**\n * 轻提示的容器(同 Naive 的 NMessageProvider):包在应用 / 小部件的最外层,里面的组件用 useToast() 弹提示。\n * 提示栈 .ak-toasts 固定在视口右下角,是一个 aria-live=\"polite\" 的区域:新弹出的提示读屏会念,不打断当前朗读。\n * 也可以拿组件 ref 直接调(ref 上有和 useToast() 一样的方法)。\n */\nimport { onBeforeUnmount, provide, reactive } from \"vue\";\n\nimport { Render } from \"../Tooltip/trigger\";\nimport { toastKey, type ToastApi, type ToastContent, type ToastOptions, type ToastVariant } from \"./useToast\";\n\nconst props = withDefaults(\n defineProps<{\n /** 默认停留时长(ms),0 = 不自动消失;单条可以在选项里改 */\n duration?: number;\n /** 默认显示 ✕ 关闭按钮 */\n closable?: boolean;\n /** 鼠标悬停 / 键盘聚焦在某条上时暂停它的倒计时(同 Naive 的 keep-alive-on-hover) */\n keepAliveOnHover?: boolean;\n /** 最多同时显示几条,多了先关最早的 */\n max?: number;\n /** 把提示栈传送到别处(Teleport 的 to,如 \"body\");不写就渲染在原地——它是 fixed 定位,一般用不着 */\n to?: string | HTMLElement;\n /** 读屏里提示栈的名字 */\n label?: string;\n }>(),\n { duration: 5000, closable: true, keepAliveOnHover: true, max: undefined, to: undefined, label: \"通知\" },\n);\n\ndefineSlots<{\n /** 应用内容:里面的组件可以 useToast() */\n default?: () => unknown;\n}>();\n\ninterface Item {\n key: number;\n variant: ToastVariant;\n content: ToastContent;\n title?: string;\n duration: number;\n closable: boolean;\n onClose?: () => void;\n hovered: boolean;\n focused: boolean;\n /** 剩余时长(暂停时扣掉已走的)与本轮开始计时的时刻 */\n remaining: number;\n started: number;\n timer?: ReturnType<typeof setTimeout>;\n}\n\nconst list = reactive<Item[]>([]);\nlet seq = 0;\n\nfunction destroy(key: number) {\n const i = list.findIndex(t => t.key === key);\n if (i < 0) return;\n const [t] = list.splice(i, 1);\n clearTimeout(t.timer);\n t.onClose?.();\n}\n\nfunction run(t: Item) {\n clearTimeout(t.timer);\n if (t.duration <= 0) return;\n t.started = Date.now();\n t.timer = setTimeout(() => destroy(t.key), t.remaining);\n}\n\nconst held = (t: Item) => props.keepAliveOnHover && t.duration > 0 && (t.hovered || t.focused);\n\n/** 悬停 / 聚焦:暂停倒计时(进度条由 .is-paused 停住),都离开后接着走剩下的 */\nfunction hold(t: Item, kind: \"hovered\" | \"focused\", on: boolean) {\n const was = held(t);\n t[kind] = on;\n const now = held(t);\n if (!was && now) {\n clearTimeout(t.timer);\n t.remaining -= Date.now() - t.started;\n } else if (was && !now) run(t);\n}\n\nfunction onFocusout(e: FocusEvent, t: Item) {\n if (!(e.currentTarget as HTMLElement).contains(e.relatedTarget as Node | null)) hold(t, \"focused\", false);\n}\n\nfunction create(content: ToastContent, options: ToastOptions & { variant?: ToastVariant } = {}) {\n const duration = options.duration ?? props.duration;\n list.push({\n key: ++seq,\n variant: options.variant ?? \"info\",\n content,\n title: options.title,\n duration,\n closable: options.closable ?? props.closable,\n onClose: options.onClose,\n hovered: false,\n focused: false,\n remaining: duration,\n started: 0,\n });\n const t = list[list.length - 1];\n if (props.max && list.length > props.max) destroy(list[0].key);\n run(t);\n return { destroy: () => destroy(t.key) };\n}\n\nconst api: ToastApi = {\n create,\n info: (c, o) => create(c, { ...o, variant: \"info\" }),\n success: (c, o) => create(c, { ...o, variant: \"success\" }),\n warning: (c, o) => create(c, { ...o, variant: \"warning\" }),\n error: (c, o) => create(c, { ...o, variant: \"danger\" }),\n destroyAll: () => [...list].forEach(t => destroy(t.key)),\n};\nprovide(toastKey, api);\ndefineExpose(api);\n\nonBeforeUnmount(() => list.forEach(t => clearTimeout(t.timer)));\n</script>\n\n<template>\n <slot />\n <Teleport :to=\"to\" :disabled=\"!to\">\n <div class=\"ak-toasts\" role=\"region\" :aria-label=\"label\" aria-live=\"polite\" aria-relevant=\"additions\">\n <div\n v-for=\"t in list\"\n :key=\"t.key\"\n :class=\"['ak-toast', t.variant !== 'info' && `ak-toast--${t.variant}`, { 'is-paused': held(t) }]\"\n :style=\"t.duration > 0 ? { '--_dur': `${t.duration}ms` } : undefined\"\n @mouseenter=\"hold(t, 'hovered', true)\"\n @mouseleave=\"hold(t, 'hovered', false)\"\n @focusin=\"hold(t, 'focused', true)\"\n @focusout=\"onFocusout($event, t)\"\n >\n <div class=\"ak-toast__body\">\n <div v-if=\"t.title\" class=\"ak-toast__title\">{{ t.title }}</div>\n <div><Render :content=\"t.content\" /></div>\n </div>\n <button v-if=\"t.closable\" type=\"button\" class=\"ak-message__close\" aria-label=\"关闭\" @click=\"destroy(t.key)\">✕</button>\n <i v-if=\"t.duration > 0\" class=\"ak-toast__progress\" aria-hidden=\"true\" />\n </div>\n </div>\n </Teleport>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 轻提示的容器(同 Naive 的 NMessageProvider):包在应用 / 小部件的最外层,里面的组件用 useToast() 弹提示。\n * 提示栈 .ak-toasts 固定在视口右下角,是一个 aria-live=\"polite\" 的区域:新弹出的提示读屏会念,不打断当前朗读。\n * 也可以拿组件 ref 直接调(ref 上有和 useToast() 一样的方法)。\n */\nimport { onBeforeUnmount, provide, reactive } from \"vue\";\n\nimport { Render } from \"../Tooltip/trigger\";\nimport { toastKey, type ToastApi, type ToastContent, type ToastOptions, type ToastVariant } from \"./useToast\";\n\nconst props = withDefaults(\n defineProps<{\n /** 默认停留时长(ms),0 = 不自动消失;单条可以在选项里改 */\n duration?: number;\n /** 默认显示 ✕ 关闭按钮 */\n closable?: boolean;\n /** 鼠标悬停 / 键盘聚焦在某条上时暂停它的倒计时(同 Naive 的 keep-alive-on-hover) */\n keepAliveOnHover?: boolean;\n /** 最多同时显示几条,多了先关最早的 */\n max?: number;\n /** 把提示栈传送到别处(Teleport 的 to,如 \"body\");不写就渲染在原地——它是 fixed 定位,一般用不着 */\n to?: string | HTMLElement;\n /** 读屏里提示栈的名字 */\n label?: string;\n }>(),\n { duration: 5000, closable: true, keepAliveOnHover: true, max: undefined, to: undefined, label: \"通知\" },\n);\n\ndefineSlots<{\n /** 应用内容:里面的组件可以 useToast() */\n default?: () => unknown;\n}>();\n\ninterface Item {\n key: number;\n variant: ToastVariant;\n content: ToastContent;\n title?: string;\n duration: number;\n closable: boolean;\n onClose?: () => void;\n hovered: boolean;\n focused: boolean;\n /** 剩余时长(暂停时扣掉已走的)与本轮开始计时的时刻 */\n remaining: number;\n started: number;\n timer?: ReturnType<typeof setTimeout>;\n}\n\nconst list = reactive<Item[]>([]);\nlet seq = 0;\n\nfunction destroy(key: number) {\n const i = list.findIndex(t => t.key === key);\n if (i < 0) return;\n const [t] = list.splice(i, 1);\n clearTimeout(t.timer);\n t.onClose?.();\n}\n\nfunction run(t: Item) {\n clearTimeout(t.timer);\n if (t.duration <= 0) return;\n t.started = Date.now();\n t.timer = setTimeout(() => destroy(t.key), t.remaining);\n}\n\nconst held = (t: Item) => props.keepAliveOnHover && t.duration > 0 && (t.hovered || t.focused);\n\n/** 悬停 / 聚焦:暂停倒计时(进度条由 .is-paused 停住),都离开后接着走剩下的 */\nfunction hold(t: Item, kind: \"hovered\" | \"focused\", on: boolean) {\n const was = held(t);\n t[kind] = on;\n const now = held(t);\n if (!was && now) {\n clearTimeout(t.timer);\n t.remaining -= Date.now() - t.started;\n } else if (was && !now) run(t);\n}\n\nfunction onFocusout(e: FocusEvent, t: Item) {\n if (!(e.currentTarget as HTMLElement).contains(e.relatedTarget as Node | null)) hold(t, \"focused\", false);\n}\n\nfunction create(content: ToastContent, options: ToastOptions & { variant?: ToastVariant } = {}) {\n const duration = options.duration ?? props.duration;\n list.push({\n key: ++seq,\n variant: options.variant ?? \"info\",\n content,\n title: options.title,\n duration,\n closable: options.closable ?? props.closable,\n onClose: options.onClose,\n hovered: false,\n focused: false,\n remaining: duration,\n started: 0,\n });\n const t = list[list.length - 1];\n if (props.max && list.length > props.max) destroy(list[0].key);\n run(t);\n return { destroy: () => destroy(t.key) };\n}\n\nconst api: ToastApi = {\n create,\n info: (c, o) => create(c, { ...o, variant: \"info\" }),\n success: (c, o) => create(c, { ...o, variant: \"success\" }),\n warning: (c, o) => create(c, { ...o, variant: \"warning\" }),\n error: (c, o) => create(c, { ...o, variant: \"danger\" }),\n destroyAll: () => [...list].forEach(t => destroy(t.key)),\n};\nprovide(toastKey, api);\ndefineExpose(api);\n\nonBeforeUnmount(() => list.forEach(t => clearTimeout(t.timer)));\n</script>\n\n<template>\n <slot />\n <Teleport :to=\"to\" :disabled=\"!to\">\n <div class=\"ak-toasts\" role=\"region\" :aria-label=\"label\" aria-live=\"polite\" aria-relevant=\"additions\">\n <div\n v-for=\"t in list\"\n :key=\"t.key\"\n :class=\"['ak-toast', t.variant !== 'info' && `ak-toast--${t.variant}`, { 'is-paused': held(t) }]\"\n :style=\"t.duration > 0 ? { '--_dur': `${t.duration}ms` } : undefined\"\n @mouseenter=\"hold(t, 'hovered', true)\"\n @mouseleave=\"hold(t, 'hovered', false)\"\n @focusin=\"hold(t, 'focused', true)\"\n @focusout=\"onFocusout($event, t)\"\n >\n <div class=\"ak-toast__body\">\n <div v-if=\"t.title\" class=\"ak-toast__title\">{{ t.title }}</div>\n <div><Render :content=\"t.content\" /></div>\n </div>\n <button v-if=\"t.closable\" type=\"button\" class=\"ak-message__close\" aria-label=\"关闭\" @click=\"destroy(t.key)\">✕</button>\n <i v-if=\"t.duration > 0\" class=\"ak-toast__progress\" aria-hidden=\"true\" />\n </div>\n </div>\n </Teleport>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 进度(同 Naive 的 NProgress):默认线形 .ak-progress(可带上方的标签行 .ak-progress-label),circle 是环形 .ak-ring。\n * 输出 role=\"progressbar\" + aria-valuenow;有 label 时标签行的名字作可访问名。\n */\nimport { computed, useId } from \"vue\";\n\nconst props = withDefaults(\n defineProps<{\n /** 百分比 0–100 */\n percentage?: number;\n /** 颜色:accent 主色(默认)· yellow 黄(信赖 / 次强调)· success 绿 · danger 红 */\n variant?: \"accent\" | \"yellow\" | \"success\" | \"danger\";\n /** 线形粗细:sm 4 · md 8(默认)· lg 14(px);环形不适用 */\n size?: \"sm\" | \"md\" | \"lg\";\n /** 名称:线形显示在条上方标签行的左边(并作可访问名);环形只作可访问名(aria-label) */\n label?: string;\n /** 显示数值:默认「N%」,默认插槽可改写(「200 / 200」);线形的数值在标签行右边,只在有 label 或插槽时出标签行 */\n showIndicator?: boolean;\n /** 斜纹(线形) */\n stripes?: boolean;\n /** 不定进度:一段色块来回滑,不报数值(线形) */\n indeterminate?: boolean;\n /** 分段:条切成 N 格,按百分比点亮(3 / 5 格 = steps 5 + percentage 60)(线形) */\n steps?: number;\n /** 环形(= .ak-ring:直径 56,中间是数值)——信赖、完成度 */\n circle?: boolean;\n }>(),\n { percentage: 0, variant: \"accent\", size: \"md\", label: undefined, showIndicator: true, steps: undefined },\n);\n\ndefineSlots<{\n /** 数值文字(代替「N%」) */\n default?: () => unknown;\n}>();\n\nconst id = useId();\nconst pct = computed(() => Math.min(100, Math.max(0, props.percentage)));\n/** 分段时点亮几格 */\nconst lit = computed(() => (props.steps ? Math.round((props.steps * pct.value) / 100) : 0));\n\nconst aria = computed(() => ({\n role: \"progressbar\",\n \"aria-valuemin\": props.indeterminate ? undefined : 0,\n \"aria-valuemax\": props.indeterminate ? undefined : 100,\n \"aria-valuenow\": props.indeterminate ? undefined : pct.value,\n \"aria-valuetext\": props.steps ? `${lit.value} / ${props.steps}` : undefined,\n}));\n\nconst barClasses = computed(() => [\n \"ak-progress\",\n props.size !== \"md\" && `ak-progress--${props.size}`,\n props.variant !== \"accent\" && `ak-progress--${props.variant}`,\n {\n \"ak-progress--stripes\": props.stripes,\n \"ak-progress--indeterminate\": props.indeterminate,\n \"ak-progress--segmented\": props.steps,\n },\n]);\n/** 条宽走 CSS 的 --_v;不定进度 / 分段不用它 */\nconst barStyle = computed(() => (props.indeterminate || props.steps ? undefined : { \"--_v\": `${pct.value}%` }));\n</script>\n\n<template>\n <div\n v-if=\"circle\"\n v-bind=\"aria\"\n :aria-label=\"label\"\n :class=\"['ak-ring', variant !== 'accent' && `ak-ring--${variant}`]\"\n :style=\"{ '--_v': pct }\"\n >\n <span v-if=\"showIndicator || $slots.default\"><slot>{{ pct }}%</slot></span>\n </div>\n <!-- 带标签行:progressbar 在外层,标签行的名字作可访问名 -->\n <div v-else-if=\"label || $slots.default\" v-bind=\"aria\" :aria-labelledby=\"label ? `${id}-label` : undefined\">\n <div class=\"ak-progress-label\">\n <span :id=\"`${id}-label`\">{{ label }}</span>\n <span v-if=\"showIndicator || $slots.default\"><slot>{{ pct }}%</slot></span>\n </div>\n <div :class=\"barClasses\" :style=\"barStyle\"><i v-for=\"n in steps\" :key=\"n\" :class=\"{ 'is-on': n <= lit }\" /></div>\n </div>\n <div v-else v-bind=\"aria\" :class=\"barClasses\" :style=\"barStyle\"><i v-for=\"n in steps\" :key=\"n\" :class=\"{ 'is-on': n <= lit }\" /></div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 进度(同 Naive 的 NProgress):默认线形 .ak-progress(可带上方的标签行 .ak-progress-label),circle 是环形 .ak-ring。\n * 输出 role=\"progressbar\" + aria-valuenow;有 label 时标签行的名字作可访问名。\n */\nimport { computed, useId } from \"vue\";\n\nconst props = withDefaults(\n defineProps<{\n /** 百分比 0–100 */\n percentage?: number;\n /** 颜色:accent 主色(默认)· yellow 黄(信赖 / 次强调)· success 绿 · danger 红 */\n variant?: \"accent\" | \"yellow\" | \"success\" | \"danger\";\n /** 线形粗细:sm 4 · md 8(默认)· lg 14(px);环形不适用 */\n size?: \"sm\" | \"md\" | \"lg\";\n /** 名称:线形显示在条上方标签行的左边(并作可访问名);环形只作可访问名(aria-label) */\n label?: string;\n /** 显示数值:默认「N%」,默认插槽可改写(「200 / 200」);线形的数值在标签行右边,只在有 label 或插槽时出标签行 */\n showIndicator?: boolean;\n /** 斜纹(线形) */\n stripes?: boolean;\n /** 不定进度:一段色块来回滑,不报数值(线形) */\n indeterminate?: boolean;\n /** 分段:条切成 N 格,按百分比点亮(3 / 5 格 = steps 5 + percentage 60)(线形) */\n steps?: number;\n /** 环形(= .ak-ring:直径 56,中间是数值)——信赖、完成度 */\n circle?: boolean;\n }>(),\n { percentage: 0, variant: \"accent\", size: \"md\", label: undefined, showIndicator: true, steps: undefined },\n);\n\ndefineSlots<{\n /** 数值文字(代替「N%」) */\n default?: () => unknown;\n}>();\n\nconst id = useId();\nconst pct = computed(() => Math.min(100, Math.max(0, props.percentage)));\n/** 分段时点亮几格 */\nconst lit = computed(() => (props.steps ? Math.round((props.steps * pct.value) / 100) : 0));\n\nconst aria = computed(() => ({\n role: \"progressbar\",\n \"aria-valuemin\": props.indeterminate ? undefined : 0,\n \"aria-valuemax\": props.indeterminate ? undefined : 100,\n \"aria-valuenow\": props.indeterminate ? undefined : pct.value,\n \"aria-valuetext\": props.steps ? `${lit.value} / ${props.steps}` : undefined,\n}));\n\nconst barClasses = computed(() => [\n \"ak-progress\",\n props.size !== \"md\" && `ak-progress--${props.size}`,\n props.variant !== \"accent\" && `ak-progress--${props.variant}`,\n {\n \"ak-progress--stripes\": props.stripes,\n \"ak-progress--indeterminate\": props.indeterminate,\n \"ak-progress--segmented\": props.steps,\n },\n]);\n/** 条宽走 CSS 的 --_v;不定进度 / 分段不用它 */\nconst barStyle = computed(() => (props.indeterminate || props.steps ? undefined : { \"--_v\": `${pct.value}%` }));\n</script>\n\n<template>\n <div\n v-if=\"circle\"\n v-bind=\"aria\"\n :aria-label=\"label\"\n :class=\"['ak-ring', variant !== 'accent' && `ak-ring--${variant}`]\"\n :style=\"{ '--_v': pct }\"\n >\n <span v-if=\"showIndicator || $slots.default\"><slot>{{ pct }}%</slot></span>\n </div>\n <!-- 带标签行:progressbar 在外层,标签行的名字作可访问名 -->\n <div v-else-if=\"label || $slots.default\" v-bind=\"aria\" :aria-labelledby=\"label ? `${id}-label` : undefined\">\n <div class=\"ak-progress-label\">\n <span :id=\"`${id}-label`\">{{ label }}</span>\n <span v-if=\"showIndicator || $slots.default\"><slot>{{ pct }}%</slot></span>\n </div>\n <div :class=\"barClasses\" :style=\"barStyle\"><i v-for=\"n in steps\" :key=\"n\" :class=\"{ 'is-on': n <= lit }\" /></div>\n </div>\n <div v-else v-bind=\"aria\" :class=\"barClasses\" :style=\"barStyle\"><i v-for=\"n in steps\" :key=\"n\" :class=\"{ 'is-on': n <= lit }\" /></div>\n</template>\n","<script setup lang=\"ts\">\n/** 统计数字(同 Naive 的 NStatistic):小号大写的名称 + 大号等宽数字 + 可选的变化量;一排放进 AkStatRow */\nimport { computed } from \"vue\";\n\nconst props = withDefaults(\n defineProps<{\n /** 名称(小号大写 overline:Operators / Edits / 24h);要带格式时用 #label 插槽 */\n label?: string;\n /** 数值,原样显示(千分位等格式由调用方先排好:「1,204」);也可以写在默认插槽里 */\n value?: string | number;\n /** 变化量(「+4 本月」「-12%」),显示在数值下面 */\n delta?: string;\n /** 变化方向(颜色取游戏富文本的升 / 降色);不写时按 delta 开头的 + / - 判断 */\n trend?: \"up\" | \"down\";\n /** 行内:一行「名称 数值」,不要卡片框(放进正文 / 表格里) */\n inline?: boolean;\n }>(),\n { label: undefined, value: undefined, delta: undefined, trend: undefined },\n);\n\ndefineSlots<{\n /** 数值(代替 value) */\n default?: () => unknown;\n /** 名称(代替 label) */\n label?: () => unknown;\n /** 数值前面的内容(货币符号、图标) */\n prefix?: () => unknown;\n /** 数值后面的小字单位(渲染成 <small>:2.3<small>k</small>) */\n suffix?: () => unknown;\n}>();\n\nconst direction = computed(() => props.trend ?? (/^\\+/.test(props.delta ?? \"\") ? \"up\" : /^[-−]/.test(props.delta ?? \"\") ? \"down\" : undefined));\n</script>\n\n<template>\n <div :class=\"['ak-stat', inline && 'ak-stat--inline']\">\n <span v-if=\"label || $slots.label\" class=\"ak-stat__label\"><slot name=\"label\">{{ label }}</slot></span>\n <span class=\"ak-stat__value\">\n <slot name=\"prefix\" /><slot>{{ value }}</slot><small v-if=\"$slots.suffix\"><slot name=\"suffix\" /></small>\n </span>\n <span v-if=\"delta\" :class=\"['ak-stat__delta', direction && `ak-stat__delta--${direction}`]\">{{ delta }}</span>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/** 统计数字(同 Naive 的 NStatistic):小号大写的名称 + 大号等宽数字 + 可选的变化量;一排放进 AkStatRow */\nimport { computed } from \"vue\";\n\nconst props = withDefaults(\n defineProps<{\n /** 名称(小号大写 overline:Operators / Edits / 24h);要带格式时用 #label 插槽 */\n label?: string;\n /** 数值,原样显示(千分位等格式由调用方先排好:「1,204」);也可以写在默认插槽里 */\n value?: string | number;\n /** 变化量(「+4 本月」「-12%」),显示在数值下面 */\n delta?: string;\n /** 变化方向(颜色取游戏富文本的升 / 降色);不写时按 delta 开头的 + / - 判断 */\n trend?: \"up\" | \"down\";\n /** 行内:一行「名称 数值」,不要卡片框(放进正文 / 表格里) */\n inline?: boolean;\n }>(),\n { label: undefined, value: undefined, delta: undefined, trend: undefined },\n);\n\ndefineSlots<{\n /** 数值(代替 value) */\n default?: () => unknown;\n /** 名称(代替 label) */\n label?: () => unknown;\n /** 数值前面的内容(货币符号、图标) */\n prefix?: () => unknown;\n /** 数值后面的小字单位(渲染成 <small>:2.3<small>k</small>) */\n suffix?: () => unknown;\n}>();\n\nconst direction = computed(() => props.trend ?? (/^\\+/.test(props.delta ?? \"\") ? \"up\" : /^[-−]/.test(props.delta ?? \"\") ? \"down\" : undefined));\n</script>\n\n<template>\n <div :class=\"['ak-stat', inline && 'ak-stat--inline']\">\n <span v-if=\"label || $slots.label\" class=\"ak-stat__label\"><slot name=\"label\">{{ label }}</slot></span>\n <span class=\"ak-stat__value\">\n <slot name=\"prefix\" /><slot>{{ value }}</slot><small v-if=\"$slots.suffix\"><slot name=\"suffix\" /></small>\n </span>\n <span v-if=\"delta\" :class=\"['ak-stat__delta', direction && `ak-stat__delta--${direction}`]\">{{ delta }}</span>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/** 一排统计卡片:自动铺满(每格至少 120px,放不下就换行),间距 12 */\ndefineSlots<{\n /** 若干 AkStat */\n default?: () => unknown;\n}>();\n</script>\n\n<template>\n <div class=\"ak-stat-row\"><slot /></div>\n</template>\n","<script setup lang=\"ts\">\n/** 一排统计卡片:自动铺满(每格至少 120px,放不下就换行),间距 12 */\ndefineSlots<{\n /** 若干 AkStat */\n default?: () => unknown;\n}>();\n</script>\n\n<template>\n <div class=\"ak-stat-row\"><slot /></div>\n</template>\n","<script setup lang=\"ts\">\n/** 面包屑的一项(= Naive 的 NBreadcrumbItem),只能放在 AkBreadcrumb 里 */\ndefineProps<{\n /** 链接地址;不写就是纯文字(当前页一般不写) */\n href?: string;\n /** 当前页:aria-current=\"page\" + 加粗。一项都没写时 AkBreadcrumb 自动把最后一项当作当前页 */\n current?: boolean;\n}>();\n\ndefineSlots<{\n /** 文字;要用路由链接(RouterLink)时整个写在这里、不写 href */\n default?: () => unknown;\n}>();\n</script>\n\n<template>\n <li :aria-current=\"current && !href ? 'page' : undefined\">\n <a v-if=\"href\" :href=\"href\" :aria-current=\"current ? 'page' : undefined\"><slot /></a>\n <slot v-else />\n </li>\n</template>\n","<script setup lang=\"ts\">\n/** 面包屑的一项(= Naive 的 NBreadcrumbItem),只能放在 AkBreadcrumb 里 */\ndefineProps<{\n /** 链接地址;不写就是纯文字(当前页一般不写) */\n href?: string;\n /** 当前页:aria-current=\"page\" + 加粗。一项都没写时 AkBreadcrumb 自动把最后一项当作当前页 */\n current?: boolean;\n}>();\n\ndefineSlots<{\n /** 文字;要用路由链接(RouterLink)时整个写在这里、不写 href */\n default?: () => unknown;\n}>();\n</script>\n\n<template>\n <li :aria-current=\"current && !href ? 'page' : undefined\">\n <a v-if=\"href\" :href=\"href\" :aria-current=\"current ? 'page' : undefined\"><slot /></a>\n <slot v-else />\n </li>\n</template>\n","<script setup lang=\"ts\">\nimport { Comment, Fragment, cloneVNode, type VNode } from \"vue\";\n\nimport AkBreadcrumbItem from \"./AkBreadcrumbItem.vue\";\n\n/**\n * 面包屑(= Naive 的 NBreadcrumb):<nav> 地标里一条 <ol class=\"ak-breadcrumb\">,里面放 AkBreadcrumbItem。\n * 分隔符是 CSS 画的斜角(li + li::before),不能换字符。外层标 ak-not-prose:正文的列表缩进 / 项目符号不进来。\n * 没有哪一项写了 current 时,最后一项自动标成当前页(aria-current=\"page\",加粗)——所以这里要读子组件 vnode(同 AkTabs)。\n */\nwithDefaults(\n defineProps<{\n /** 导航地标的可访问名(nav 的 aria-label) */\n label?: string;\n }>(),\n { label: \"面包屑\" },\n);\n\nconst slots = defineSlots<{\n /** 若干 AkBreadcrumbItem,从上级到当前页 */\n default?: () => VNode[];\n}>();\n\nconst flatten = (nodes: VNode[]): VNode[] =>\n nodes.flatMap(n => (n.type === Fragment && Array.isArray(n.children) ? flatten(n.children as VNode[]) : n.type === Comment ? [] : [n]));\n\n/** 插槽只能在渲染期调用,所以由模板调用 */\nfunction items(): VNode[] {\n const nodes = flatten(slots.default?.() ?? []);\n const crumbs = nodes.filter(n => n.type === AkBreadcrumbItem);\n if (crumbs.some(n => n.props && \"current\" in n.props)) return nodes;\n const last = crumbs.at(-1);\n return nodes.map(n => (n === last ? cloneVNode(n, { current: true }) : n));\n}\n\nconst Render = (p: { nodes: VNode[] }) => p.nodes;\n</script>\n\n<template>\n <nav class=\"ak-not-prose\" :aria-label=\"label\">\n <ol class=\"ak-breadcrumb\"><Render :nodes=\"items()\" /></ol>\n </nav>\n</template>\n","<script setup lang=\"ts\">\nimport { Comment, Fragment, cloneVNode, type VNode } from \"vue\";\n\nimport AkBreadcrumbItem from \"./AkBreadcrumbItem.vue\";\n\n/**\n * 面包屑(= Naive 的 NBreadcrumb):<nav> 地标里一条 <ol class=\"ak-breadcrumb\">,里面放 AkBreadcrumbItem。\n * 分隔符是 CSS 画的斜角(li + li::before),不能换字符。外层标 ak-not-prose:正文的列表缩进 / 项目符号不进来。\n * 没有哪一项写了 current 时,最后一项自动标成当前页(aria-current=\"page\",加粗)——所以这里要读子组件 vnode(同 AkTabs)。\n */\nwithDefaults(\n defineProps<{\n /** 导航地标的可访问名(nav 的 aria-label) */\n label?: string;\n }>(),\n { label: \"面包屑\" },\n);\n\nconst slots = defineSlots<{\n /** 若干 AkBreadcrumbItem,从上级到当前页 */\n default?: () => VNode[];\n}>();\n\nconst flatten = (nodes: VNode[]): VNode[] =>\n nodes.flatMap(n => (n.type === Fragment && Array.isArray(n.children) ? flatten(n.children as VNode[]) : n.type === Comment ? [] : [n]));\n\n/** 插槽只能在渲染期调用,所以由模板调用 */\nfunction items(): VNode[] {\n const nodes = flatten(slots.default?.() ?? []);\n const crumbs = nodes.filter(n => n.type === AkBreadcrumbItem);\n if (crumbs.some(n => n.props && \"current\" in n.props)) return nodes;\n const last = crumbs.at(-1);\n return nodes.map(n => (n === last ? cloneVNode(n, { current: true }) : n));\n}\n\nconst Render = (p: { nodes: VNode[] }) => p.nodes;\n</script>\n\n<template>\n <nav class=\"ak-not-prose\" :aria-label=\"label\">\n <ol class=\"ak-breadcrumb\"><Render :nodes=\"items()\" /></ol>\n </nav>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\n/**\n * 分页(= Naive 的 NPagination,精简):‹ 页码 … 页码 ›,当前页主色实底。\n * 不给 page-href 时页码是页内切换的 <button>;给了就渲染成 <a href>(MW 页面上真能打开的地址,同 CSS 版)。\n */\nconst props = withDefaults(\n defineProps<{\n /** 总页数;不写时由 itemCount ÷ pageSize 算出 */\n pageCount?: number;\n /** 总条数(配合 pageSize 算页数) */\n itemCount?: number;\n /** 每页条数(只在用 itemCount 算页数时有用) */\n pageSize?: number;\n /** 最多显示几格页码(含首页、尾页和省略号,同 Naive 的 page-slot,最少 5);每格约 50px,窄处调小 */\n pageSlot?: number;\n /** 整组禁用 */\n disabled?: boolean;\n /** 页码链接:给了就渲染成 <a href=\"pageHref(n)\">,点击照常跳转;不给就是 <button>,只更新 v-model */\n pageHref?: (page: number) => string;\n /** 导航地标的可访问名(nav 的 aria-label) */\n label?: string;\n }>(),\n { pageCount: undefined, itemCount: undefined, pageSize: 10, pageSlot: 7, pageHref: undefined, label: \"分页\" },\n);\n\n/** 当前页(从 1 数) */\nconst page = defineModel<number>({ default: 1 });\n\ndefineSlots<{\n /** 「上一页」按钮的内容(默认 ‹) */\n prev?: () => unknown;\n /** 「下一页」按钮的内容(默认 ›) */\n next?: () => unknown;\n}>();\n\nconst count = computed(() => Math.max(1, props.pageCount ?? Math.ceil((props.itemCount ?? 0) / props.pageSize)));\nconst current = computed(() => Math.min(Math.max(1, page.value), count.value));\n\nconst range = (from: number, to: number) => Array.from({ length: to - from + 1 }, (_, i) => from + i);\n\n/** 页码格:数字 = 页码,\"…\" = 省略号。首尾页常驻、当前页居中,两边放不下的收成省略号(同 Naive 的算法,省略号不可点) */\nconst cells = computed<(number | \"…\")[]>(() => {\n const n = count.value;\n const c = current.value;\n const slot = Math.max(5, props.pageSlot);\n if (n <= slot) return range(1, n);\n const width = slot - 4; // 两个省略号之间的窗口\n const left = c - Math.floor((width - 1) / 2);\n const right = left + width - 1;\n if (left <= 3) return [...range(1, slot - 2), \"…\", n];\n if (right >= n - 2) return [1, \"…\", ...range(n - slot + 3, n)];\n return [1, \"…\", ...range(left, right), \"…\", n];\n});\n\nconst tag = computed(() => (props.pageHref ? \"a\" : \"button\"));\n\n/** <a> / <button> 各自的属性:禁用的链接去掉 href、标 aria-disabled;禁用的按钮用 disabled */\nfunction attrs(target: number, off: boolean) {\n return props.pageHref ? { href: off ? undefined : props.pageHref(target), \"aria-disabled\": off || undefined } : { type: \"button\", disabled: off };\n}\n\nfunction go(target: number, e: MouseEvent) {\n if (props.disabled || target < 1 || target > count.value) return e.preventDefault();\n page.value = target;\n}\n</script>\n\n<template>\n <nav class=\"ak-pagination\" :aria-label=\"label\">\n <component\n :is=\"tag\"\n v-bind=\"attrs(current - 1, disabled || current <= 1)\"\n :class=\"['ak-pagination__item', { 'is-disabled': disabled || current <= 1 }]\"\n aria-label=\"上一页\"\n @click=\"go(current - 1, $event)\"\n >\n <slot name=\"prev\">‹</slot>\n </component>\n <template v-for=\"(cell, i) in cells\" :key=\"cell === '…' ? `gap-${i}` : cell\">\n <span v-if=\"cell === '…'\" class=\"ak-pagination__ellipsis\" aria-hidden=\"true\">…</span>\n <component\n :is=\"tag\"\n v-else\n v-bind=\"attrs(cell, disabled)\"\n :class=\"['ak-pagination__item', { 'is-active': cell === current, 'is-disabled': disabled }]\"\n :aria-current=\"cell === current ? 'page' : undefined\"\n :aria-label=\"`第 ${cell} 页`\"\n @click=\"go(cell, $event)\"\n >\n {{ cell }}\n </component>\n </template>\n <component\n :is=\"tag\"\n v-bind=\"attrs(current + 1, disabled || current >= count)\"\n :class=\"['ak-pagination__item', { 'is-disabled': disabled || current >= count }]\"\n aria-label=\"下一页\"\n @click=\"go(current + 1, $event)\"\n >\n <slot name=\"next\">›</slot>\n </component>\n </nav>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\n/**\n * 分页(= Naive 的 NPagination,精简):‹ 页码 … 页码 ›,当前页主色实底。\n * 不给 page-href 时页码是页内切换的 <button>;给了就渲染成 <a href>(MW 页面上真能打开的地址,同 CSS 版)。\n */\nconst props = withDefaults(\n defineProps<{\n /** 总页数;不写时由 itemCount ÷ pageSize 算出 */\n pageCount?: number;\n /** 总条数(配合 pageSize 算页数) */\n itemCount?: number;\n /** 每页条数(只在用 itemCount 算页数时有用) */\n pageSize?: number;\n /** 最多显示几格页码(含首页、尾页和省略号,同 Naive 的 page-slot,最少 5);每格约 50px,窄处调小 */\n pageSlot?: number;\n /** 整组禁用 */\n disabled?: boolean;\n /** 页码链接:给了就渲染成 <a href=\"pageHref(n)\">,点击照常跳转;不给就是 <button>,只更新 v-model */\n pageHref?: (page: number) => string;\n /** 导航地标的可访问名(nav 的 aria-label) */\n label?: string;\n }>(),\n { pageCount: undefined, itemCount: undefined, pageSize: 10, pageSlot: 7, pageHref: undefined, label: \"分页\" },\n);\n\n/** 当前页(从 1 数) */\nconst page = defineModel<number>({ default: 1 });\n\ndefineSlots<{\n /** 「上一页」按钮的内容(默认 ‹) */\n prev?: () => unknown;\n /** 「下一页」按钮的内容(默认 ›) */\n next?: () => unknown;\n}>();\n\nconst count = computed(() => Math.max(1, props.pageCount ?? Math.ceil((props.itemCount ?? 0) / props.pageSize)));\nconst current = computed(() => Math.min(Math.max(1, page.value), count.value));\n\nconst range = (from: number, to: number) => Array.from({ length: to - from + 1 }, (_, i) => from + i);\n\n/** 页码格:数字 = 页码,\"…\" = 省略号。首尾页常驻、当前页居中,两边放不下的收成省略号(同 Naive 的算法,省略号不可点) */\nconst cells = computed<(number | \"…\")[]>(() => {\n const n = count.value;\n const c = current.value;\n const slot = Math.max(5, props.pageSlot);\n if (n <= slot) return range(1, n);\n const width = slot - 4; // 两个省略号之间的窗口\n const left = c - Math.floor((width - 1) / 2);\n const right = left + width - 1;\n if (left <= 3) return [...range(1, slot - 2), \"…\", n];\n if (right >= n - 2) return [1, \"…\", ...range(n - slot + 3, n)];\n return [1, \"…\", ...range(left, right), \"…\", n];\n});\n\nconst tag = computed(() => (props.pageHref ? \"a\" : \"button\"));\n\n/** <a> / <button> 各自的属性:禁用的链接去掉 href、标 aria-disabled;禁用的按钮用 disabled */\nfunction attrs(target: number, off: boolean) {\n return props.pageHref ? { href: off ? undefined : props.pageHref(target), \"aria-disabled\": off || undefined } : { type: \"button\", disabled: off };\n}\n\nfunction go(target: number, e: MouseEvent) {\n if (props.disabled || target < 1 || target > count.value) return e.preventDefault();\n page.value = target;\n}\n</script>\n\n<template>\n <nav class=\"ak-pagination\" :aria-label=\"label\">\n <component\n :is=\"tag\"\n v-bind=\"attrs(current - 1, disabled || current <= 1)\"\n :class=\"['ak-pagination__item', { 'is-disabled': disabled || current <= 1 }]\"\n aria-label=\"上一页\"\n @click=\"go(current - 1, $event)\"\n >\n <slot name=\"prev\">‹</slot>\n </component>\n <template v-for=\"(cell, i) in cells\" :key=\"cell === '…' ? `gap-${i}` : cell\">\n <span v-if=\"cell === '…'\" class=\"ak-pagination__ellipsis\" aria-hidden=\"true\">…</span>\n <component\n :is=\"tag\"\n v-else\n v-bind=\"attrs(cell, disabled)\"\n :class=\"['ak-pagination__item', { 'is-active': cell === current, 'is-disabled': disabled }]\"\n :aria-current=\"cell === current ? 'page' : undefined\"\n :aria-label=\"`第 ${cell} 页`\"\n @click=\"go(cell, $event)\"\n >\n {{ cell }}\n </component>\n </template>\n <component\n :is=\"tag\"\n v-bind=\"attrs(current + 1, disabled || current >= count)\"\n :class=\"['ak-pagination__item', { 'is-disabled': disabled || current >= count }]\"\n aria-label=\"下一页\"\n @click=\"go(current + 1, $event)\"\n >\n <slot name=\"next\">›</slot>\n </component>\n </nav>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 时间线(= Naive 的 NTimeline):左侧一条竖线 + 菱形节点,里面放 AkTimelineItem。\n * 不标 ak-not-prose:timeline.css 自己压得过正文列表规则,说明里的链接照常是正文链接。\n */\ndefineSlots<{\n /** 若干 AkTimelineItem,从早到晚 */\n default?: () => unknown;\n}>();\n</script>\n\n<template>\n <ul class=\"ak-timeline\"><slot /></ul>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 时间线(= Naive 的 NTimeline):左侧一条竖线 + 菱形节点,里面放 AkTimelineItem。\n * 不标 ak-not-prose:timeline.css 自己压得过正文列表规则,说明里的链接照常是正文链接。\n */\ndefineSlots<{\n /** 若干 AkTimelineItem,从早到晚 */\n default?: () => unknown;\n}>();\n</script>\n\n<template>\n <ul class=\"ak-timeline\"><slot /></ul>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nexport type TimelineStatus = \"wait\" | \"active\" | \"done\";\n\n/** 时间线的一项(= Naive 的 NTimelineItem),只能放在 AkTimeline 里 */\nconst props = withDefaults(\n defineProps<{\n /** 时间(Bender 小字,在标题上方) */\n time?: string;\n /** 标题 */\n title?: string;\n /** 说明文字(也可以写在默认插槽里) */\n content?: string;\n /** 节点状态:wait 空心菱形(默认)· active 当前 · done 已发生(后两者都是主色实心) */\n status?: TimelineStatus;\n }>(),\n { time: undefined, title: undefined, content: undefined, status: \"wait\" },\n);\n\ndefineSlots<{\n /** 标题(代替 title) */\n header?: () => unknown;\n /** 说明(代替 content) */\n default?: () => unknown;\n}>();\n\nconst classes = computed(() => ({ \"is-active\": props.status === \"active\", \"is-done\": props.status === \"done\" }));\n</script>\n\n<template>\n <li :class=\"classes\">\n <span v-if=\"time\" class=\"ak-timeline__date\">{{ time }}</span>\n <div v-if=\"title || $slots.header\" class=\"ak-timeline__title\"><slot name=\"header\">{{ title }}</slot></div>\n <div v-if=\"content || $slots.default\" class=\"ak-timeline__desc\"><slot>{{ content }}</slot></div>\n </li>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nexport type TimelineStatus = \"wait\" | \"active\" | \"done\";\n\n/** 时间线的一项(= Naive 的 NTimelineItem),只能放在 AkTimeline 里 */\nconst props = withDefaults(\n defineProps<{\n /** 时间(Bender 小字,在标题上方) */\n time?: string;\n /** 标题 */\n title?: string;\n /** 说明文字(也可以写在默认插槽里) */\n content?: string;\n /** 节点状态:wait 空心菱形(默认)· active 当前 · done 已发生(后两者都是主色实心) */\n status?: TimelineStatus;\n }>(),\n { time: undefined, title: undefined, content: undefined, status: \"wait\" },\n);\n\ndefineSlots<{\n /** 标题(代替 title) */\n header?: () => unknown;\n /** 说明(代替 content) */\n default?: () => unknown;\n}>();\n\nconst classes = computed(() => ({ \"is-active\": props.status === \"active\", \"is-done\": props.status === \"done\" }));\n</script>\n\n<template>\n <li :class=\"classes\">\n <span v-if=\"time\" class=\"ak-timeline__date\">{{ time }}</span>\n <div v-if=\"title || $slots.header\" class=\"ak-timeline__title\"><slot name=\"header\">{{ title }}</slot></div>\n <div v-if=\"content || $slots.default\" class=\"ak-timeline__desc\"><slot>{{ content }}</slot></div>\n </li>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 步骤条的一步(= Naive 的 NStep),只能直接放在 AkSteps 里。\n * AkSteps 读它的 title / status / 默认插槽自己画这一步(序号由 CSS 计数器给),这个组件本身不会被挂载。\n */\nexport type StepStatus = \"wait\" | \"active\" | \"done\";\n\ndefineProps<{\n /** 步骤名(也可以写在默认插槽里) */\n title?: string;\n /** 状态:wait 未到 · active 当前(主色序号 + 加粗)· done 已完成(主色序号 + 主色连线);不写时按 AkSteps 的 current 推算 */\n status?: StepStatus;\n}>();\n\ndefineSlots<{\n /** 步骤名(代替 title) */\n default?: () => unknown;\n}>();\n</script>\n\n<template>\n <slot>{{ title }}</slot>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 步骤条的一步(= Naive 的 NStep),只能直接放在 AkSteps 里。\n * AkSteps 读它的 title / status / 默认插槽自己画这一步(序号由 CSS 计数器给),这个组件本身不会被挂载。\n */\nexport type StepStatus = \"wait\" | \"active\" | \"done\";\n\ndefineProps<{\n /** 步骤名(也可以写在默认插槽里) */\n title?: string;\n /** 状态:wait 未到 · active 当前(主色序号 + 加粗)· done 已完成(主色序号 + 主色连线);不写时按 AkSteps 的 current 推算 */\n status?: StepStatus;\n}>();\n\ndefineSlots<{\n /** 步骤名(代替 title) */\n default?: () => unknown;\n}>();\n</script>\n\n<template>\n <slot>{{ title }}</slot>\n</template>\n","<script setup lang=\"ts\">\nimport { Comment, Fragment, type VNode } from \"vue\";\n\nimport AkStep, { type StepStatus } from \"./AkStep.vue\";\n\n/**\n * 步骤条(= Naive 的 NSteps,只有横排):一排带序号的步骤 + 连线,放若干 AkStep。\n * 同 AkTabs:从默认插槽读 AkStep 的 props 自己画,首次渲染 / SSR 预渲染就是完整的。只是展示进度,不可点。\n * 输出 ol > li;ol 上显式 role=\"list\":Safari(VoiceOver)对 list-style: none 的列表不报列表语义,写上补回。\n */\nconst props = defineProps<{\n /** 当前步骤(从 1 数,同 Naive):之前的已完成、这一步是当前、之后未到;超过步数 = 全部完成;不写则各步按自己的 status */\n current?: number;\n /** 读屏用的列表名(如「精英化进度」) */\n label?: string;\n}>();\n\nconst slots = defineSlots<{\n /** 若干 AkStep */\n default?: () => VNode[];\n}>();\n\ninterface StepDef {\n key: PropertyKey;\n status: StepStatus;\n /** 步骤名:默认插槽,没有就用 title 字符串 */\n title: (() => unknown) | string | undefined;\n}\n\nconst flatten = (nodes: VNode[]): VNode[] =>\n nodes.flatMap(n => (n.type === Fragment && Array.isArray(n.children) ? flatten(n.children as VNode[]) : n.type === Comment ? [] : [n]));\n\n/** 插槽只能在渲染期调用,所以由模板调用 */\nfunction collect(): StepDef[] {\n return flatten(slots.default?.() ?? [])\n .filter(n => n.type === AkStep)\n .map((n, i) => {\n const p = (n.props ?? {}) as Record<string, unknown>;\n const s = (n.children ?? {}) as Record<string, (() => unknown) | undefined>;\n const c = props.current;\n const derived: StepStatus = c === undefined ? \"wait\" : i + 1 < c ? \"done\" : i + 1 === c ? \"active\" : \"wait\";\n return { key: n.key ?? i, status: (p.status as StepStatus | undefined) ?? derived, title: s.default ?? (p.title as string | undefined) };\n });\n}\n\n/** 把插槽函数 / 字符串原样渲染;定义在外面保持同一个组件类型,重渲染时不重建 */\nconst Render = (p: { content: unknown }) => (typeof p.content === \"function\" ? p.content() : p.content);\n</script>\n\n<template>\n <ol class=\"ak-stepper\" role=\"list\" :aria-label=\"label\">\n <li\n v-for=\"s in collect()\"\n :key=\"s.key\"\n :class=\"['ak-step', s.status !== 'wait' && `is-${s.status}`]\"\n :aria-current=\"s.status === 'active' ? 'step' : undefined\"\n >\n <Render :content=\"s.title\" /><span v-if=\"s.status === 'done'\" class=\"ak-sr-only\">(已完成)</span>\n </li>\n </ol>\n</template>\n","<script setup lang=\"ts\">\nimport { Comment, Fragment, type VNode } from \"vue\";\n\nimport AkStep, { type StepStatus } from \"./AkStep.vue\";\n\n/**\n * 步骤条(= Naive 的 NSteps,只有横排):一排带序号的步骤 + 连线,放若干 AkStep。\n * 同 AkTabs:从默认插槽读 AkStep 的 props 自己画,首次渲染 / SSR 预渲染就是完整的。只是展示进度,不可点。\n * 输出 ol > li;ol 上显式 role=\"list\":Safari(VoiceOver)对 list-style: none 的列表不报列表语义,写上补回。\n */\nconst props = defineProps<{\n /** 当前步骤(从 1 数,同 Naive):之前的已完成、这一步是当前、之后未到;超过步数 = 全部完成;不写则各步按自己的 status */\n current?: number;\n /** 读屏用的列表名(如「精英化进度」) */\n label?: string;\n}>();\n\nconst slots = defineSlots<{\n /** 若干 AkStep */\n default?: () => VNode[];\n}>();\n\ninterface StepDef {\n key: PropertyKey;\n status: StepStatus;\n /** 步骤名:默认插槽,没有就用 title 字符串 */\n title: (() => unknown) | string | undefined;\n}\n\nconst flatten = (nodes: VNode[]): VNode[] =>\n nodes.flatMap(n => (n.type === Fragment && Array.isArray(n.children) ? flatten(n.children as VNode[]) : n.type === Comment ? [] : [n]));\n\n/** 插槽只能在渲染期调用,所以由模板调用 */\nfunction collect(): StepDef[] {\n return flatten(slots.default?.() ?? [])\n .filter(n => n.type === AkStep)\n .map((n, i) => {\n const p = (n.props ?? {}) as Record<string, unknown>;\n const s = (n.children ?? {}) as Record<string, (() => unknown) | undefined>;\n const c = props.current;\n const derived: StepStatus = c === undefined ? \"wait\" : i + 1 < c ? \"done\" : i + 1 === c ? \"active\" : \"wait\";\n return { key: n.key ?? i, status: (p.status as StepStatus | undefined) ?? derived, title: s.default ?? (p.title as string | undefined) };\n });\n}\n\n/** 把插槽函数 / 字符串原样渲染;定义在外面保持同一个组件类型,重渲染时不重建 */\nconst Render = (p: { content: unknown }) => (typeof p.content === \"function\" ? p.content() : p.content);\n</script>\n\n<template>\n <ol class=\"ak-stepper\" role=\"list\" :aria-label=\"label\">\n <li\n v-for=\"s in collect()\"\n :key=\"s.key\"\n :class=\"['ak-step', s.status !== 'wait' && `is-${s.status}`]\"\n :aria-current=\"s.status === 'active' ? 'step' : undefined\"\n >\n <Render :content=\"s.title\" /><span v-if=\"s.status === 'done'\" class=\"ak-sr-only\">(已完成)</span>\n </li>\n </ol>\n</template>\n","import type { InjectionKey } from \"vue\";\n\nexport type CollapseName = string | number;\n\n/** AkCollapse 给 AkCollapseItem 的展开状态(同 Naive 的 NCollapse:子项只需要父组件的状态,走 provide / inject) */\nexport const collapseKey: InjectionKey<{\n isOpen: (name: CollapseName) => boolean;\n set: (name: CollapseName, open: boolean) => void;\n}> = Symbol(\"AkCollapse\");\n","<script setup lang=\"ts\">\nimport { provide } from \"vue\";\n\nimport { collapseKey, type CollapseName } from \"./context\";\n\n/**\n * 折叠面板组(= Naive 的 NCollapse;CSS 叫 Accordion / .ak-details):放若干 AkCollapseItem,每项是一个原生 <details>。\n * 本身不输出类名,只是个容器;开合状态收在 v-model 里,accordion 时同一时间只开一项。\n */\nconst props = defineProps<{\n /** 手风琴:同一时间只展开一项(展开一项时收起其他) */\n accordion?: boolean;\n}>();\n\n/** 展开项的 name 数组 */\nconst expanded = defineModel<CollapseName[]>({ default: () => [] });\n\ndefineSlots<{\n /** 若干 AkCollapseItem */\n default?: () => unknown;\n}>();\n\nprovide(collapseKey, {\n isOpen: name => expanded.value.includes(name),\n set(name, open) {\n const rest = expanded.value.filter(n => n !== name);\n expanded.value = open ? (props.accordion ? [name] : [...rest, name]) : rest;\n },\n});\n\n/** ↑ / ↓ / Home / End 在各项标题间移动焦点(WAI-ARIA Accordion 的可选键盘支持);Enter / 空格开合是 <summary> 自带的 */\nfunction onKey(e: KeyboardEvent) {\n const t = e.target as HTMLElement;\n if (t.tagName !== \"SUMMARY\") return;\n const heads = [...(e.currentTarget as HTMLElement).querySelectorAll<HTMLElement>(\":scope > details > summary\")];\n const i = heads.indexOf(t);\n if (i < 0) return;\n const to =\n e.key === \"ArrowDown\" ? heads[(i + 1) % heads.length]\n : e.key === \"ArrowUp\" ? heads[(i - 1 + heads.length) % heads.length]\n : e.key === \"Home\" ? heads[0]\n : e.key === \"End\" ? heads.at(-1)\n : undefined;\n if (!to) return;\n e.preventDefault();\n to.focus();\n}\n</script>\n\n<template>\n <div @keydown=\"onKey\"><slot /></div>\n</template>\n","<script setup lang=\"ts\">\nimport { provide } from \"vue\";\n\nimport { collapseKey, type CollapseName } from \"./context\";\n\n/**\n * 折叠面板组(= Naive 的 NCollapse;CSS 叫 Accordion / .ak-details):放若干 AkCollapseItem,每项是一个原生 <details>。\n * 本身不输出类名,只是个容器;开合状态收在 v-model 里,accordion 时同一时间只开一项。\n */\nconst props = defineProps<{\n /** 手风琴:同一时间只展开一项(展开一项时收起其他) */\n accordion?: boolean;\n}>();\n\n/** 展开项的 name 数组 */\nconst expanded = defineModel<CollapseName[]>({ default: () => [] });\n\ndefineSlots<{\n /** 若干 AkCollapseItem */\n default?: () => unknown;\n}>();\n\nprovide(collapseKey, {\n isOpen: name => expanded.value.includes(name),\n set(name, open) {\n const rest = expanded.value.filter(n => n !== name);\n expanded.value = open ? (props.accordion ? [name] : [...rest, name]) : rest;\n },\n});\n\n/** ↑ / ↓ / Home / End 在各项标题间移动焦点(WAI-ARIA Accordion 的可选键盘支持);Enter / 空格开合是 <summary> 自带的 */\nfunction onKey(e: KeyboardEvent) {\n const t = e.target as HTMLElement;\n if (t.tagName !== \"SUMMARY\") return;\n const heads = [...(e.currentTarget as HTMLElement).querySelectorAll<HTMLElement>(\":scope > details > summary\")];\n const i = heads.indexOf(t);\n if (i < 0) return;\n const to =\n e.key === \"ArrowDown\" ? heads[(i + 1) % heads.length]\n : e.key === \"ArrowUp\" ? heads[(i - 1 + heads.length) % heads.length]\n : e.key === \"Home\" ? heads[0]\n : e.key === \"End\" ? heads.at(-1)\n : undefined;\n if (!to) return;\n e.preventDefault();\n to.focus();\n}\n</script>\n\n<template>\n <div @keydown=\"onKey\"><slot /></div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, inject, nextTick, ref, useId, useTemplateRef } from \"vue\";\n\nimport { collapseKey, type CollapseName } from \"./context\";\n\n/**\n * 折叠面板的一项(= Naive 的 NCollapseItem):原生 <details class=\"ak-details\"> + <summary> + .ak-details__body。\n * 开合交给浏览器(点击 / Enter / 空格,页内查找命中时自动展开),toggle 事件里同步回 AkCollapse 的 v-model;\n * <summary> 自带按钮语义与展开状态,不另加 aria-expanded。单独用(不放在 AkCollapse 里)时自己记开合。\n */\nconst props = defineProps<{\n /** 标识,= AkCollapse 的 v-model 数组里的值;不写时自动生成(只能靠点击开合) */\n name?: CollapseName;\n /** 标题;要放图标 / 标签时改用 #header 插槽 */\n title?: string;\n}>();\n\ndefineSlots<{\n /** 标题(代替 title) */\n header?: () => unknown;\n /** 展开后的内容(正文排版照常生效) */\n default?: () => unknown;\n}>();\n\nconst id = useId();\nconst key = computed(() => props.name ?? id);\nconst group = inject(collapseKey, null);\nconst local = ref(false);\nconst open = computed(() => (group ? group.isOpen(key.value) : local.value));\n\nconst el = useTemplateRef<HTMLDetailsElement>(\"el\");\nfunction onToggle() {\n const now = el.value!.open;\n if (now === open.value) return;\n if (group) group.set(key.value, now);\n else local.value = now;\n // v-model 没接住(绑了固定值、不更新)时把 DOM 拨回去,保持与状态一致\n nextTick(() => {\n if (el.value && el.value.open !== open.value) el.value.open = open.value;\n });\n}\n</script>\n\n<template>\n <details ref=\"el\" class=\"ak-details\" :open=\"open\" @toggle=\"onToggle\">\n <summary :id=\"`${id}-head`\" :aria-controls=\"`${id}-body`\"><slot name=\"header\">{{ title }}</slot></summary>\n <div :id=\"`${id}-body`\" class=\"ak-details__body\"><slot /></div>\n </details>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, inject, nextTick, ref, useId, useTemplateRef } from \"vue\";\n\nimport { collapseKey, type CollapseName } from \"./context\";\n\n/**\n * 折叠面板的一项(= Naive 的 NCollapseItem):原生 <details class=\"ak-details\"> + <summary> + .ak-details__body。\n * 开合交给浏览器(点击 / Enter / 空格,页内查找命中时自动展开),toggle 事件里同步回 AkCollapse 的 v-model;\n * <summary> 自带按钮语义与展开状态,不另加 aria-expanded。单独用(不放在 AkCollapse 里)时自己记开合。\n */\nconst props = defineProps<{\n /** 标识,= AkCollapse 的 v-model 数组里的值;不写时自动生成(只能靠点击开合) */\n name?: CollapseName;\n /** 标题;要放图标 / 标签时改用 #header 插槽 */\n title?: string;\n}>();\n\ndefineSlots<{\n /** 标题(代替 title) */\n header?: () => unknown;\n /** 展开后的内容(正文排版照常生效) */\n default?: () => unknown;\n}>();\n\nconst id = useId();\nconst key = computed(() => props.name ?? id);\nconst group = inject(collapseKey, null);\nconst local = ref(false);\nconst open = computed(() => (group ? group.isOpen(key.value) : local.value));\n\nconst el = useTemplateRef<HTMLDetailsElement>(\"el\");\nfunction onToggle() {\n const now = el.value!.open;\n if (now === open.value) return;\n if (group) group.set(key.value, now);\n else local.value = now;\n // v-model 没接住(绑了固定值、不更新)时把 DOM 拨回去,保持与状态一致\n nextTick(() => {\n if (el.value && el.value.open !== open.value) el.value.open = open.value;\n });\n}\n</script>\n\n<template>\n <details ref=\"el\" class=\"ak-details\" :open=\"open\" @toggle=\"onToggle\">\n <summary :id=\"`${id}-head`\" :aria-controls=\"`${id}-body`\"><slot name=\"header\">{{ title }}</slot></summary>\n <div :id=\"`${id}-body`\" class=\"ak-details__body\"><slot /></div>\n </details>\n</template>\n","<script setup lang=\"ts\" generic=\"T extends object\">\nimport { computed } from \"vue\";\n\nimport type { DataTableColumn, DataTableSort } from \"./types\";\n\n/**\n * 数据表(= Naive 的 NDataTable,精简):columns + data 渲染成 <table class=\"ak-table\">。\n * 单元格默认是 row[key];自定义用 #cell-<key> 插槽或列的 render。可排序的列表头里放一枚 <button>(WAI-ARIA APG Sortable Table),\n * 当前排序列标 aria-sort,↑ / ↓ 由 CSS 画。不做分页 / 勾选 / 固定列——CSS 没有这些。\n */\nconst props = withDefaults(\n defineProps<{\n /** 列定义:key 取值字段 · title 表头 · num 数字列 · sorter 可排序 · render 自定义单元格 · className */\n columns: DataTableColumn<T>[];\n /** 行数据 */\n data: T[];\n /** 行的唯一标识(同 Naive 的 row-key);不写用原始下标 */\n rowKey?: (row: T) => string | number;\n /** 行的额外类名(同 Naive 的 row-class-name):给当前行 / 选中行加 is-selected(淡主色底) */\n rowClassName?: string | ((row: T, index: number) => string | undefined);\n /** 斑马纹 */\n striped?: boolean;\n /** 紧凑:格内边距 4 / 8 */\n compact?: boolean;\n /** 表格的可访问名(aria-label);上方已有标题说明这张表时可以不写 */\n label?: string;\n }>(),\n { rowKey: undefined, rowClassName: undefined, label: undefined },\n);\n\n/** 排序状态 { key, order: \"ascending\" | \"descending\" },null = 原顺序;点可排序的表头依次切换 升序 → 降序 → 原顺序 */\nconst sort = defineModel<DataTableSort | null>({ default: null });\n\ndefineSlots<\n {\n /** 没有数据时整行显示的内容(默认「暂无数据」) */\n empty?: () => unknown;\n } & {\n /** 某一列的单元格:#cell-<列 key>=\"{ row, index, value }\"(优先于列的 render) */\n [K in `cell-${string}`]?: (p: { row: T; index: number; value: unknown }) => unknown;\n }\n>();\n\nconst get = (row: T, key: string) => (row as Record<string, unknown>)[key];\nconst compare = (a: unknown, b: unknown) =>\n typeof a === \"number\" && typeof b === \"number\" ? a - b : String(a ?? \"\").localeCompare(String(b ?? \"\"), \"zh-Hans-CN\", { numeric: true });\n\nconst rows = computed(() => {\n const list = props.data.map((row, index) => ({ row, index }));\n const s = sort.value;\n const col = s && props.columns.find(c => c.key === s.key);\n if (!s || !col?.sorter) return list;\n const cmp = typeof col.sorter === \"function\" ? col.sorter : (a: T, b: T) => compare(get(a, col.key), get(b, col.key));\n const dir = s.order === \"ascending\" ? 1 : -1;\n return list.sort((a, b) => cmp(a.row, b.row) * dir || a.index - b.index);\n});\n\nconst ariaSort = (c: DataTableColumn<T>) => (sort.value?.key === c.key ? sort.value.order : undefined);\n\nfunction toggle(c: DataTableColumn<T>) {\n const s = sort.value;\n sort.value = s?.key !== c.key ? { key: c.key, order: \"ascending\" } : s.order === \"ascending\" ? { key: c.key, order: \"descending\" } : null;\n}\n\nconst rowClass = (row: T, i: number) => (typeof props.rowClassName === \"function\" ? props.rowClassName(row, i) : props.rowClassName);\n\n/** 把 render 的返回值原样渲染 */\nconst Render = (p: { content: () => unknown }) => p.content();\n</script>\n\n<template>\n <table :class=\"['ak-table', { 'ak-table--striped': striped, 'ak-table--compact': compact }]\" :aria-label=\"label\">\n <thead>\n <tr>\n <th v-for=\"c in columns\" :key=\"c.key\" scope=\"col\" :class=\"[c.num && 'num', c.className]\" :aria-sort=\"ariaSort(c)\">\n <button v-if=\"c.sorter\" type=\"button\" class=\"ak-table__sort\" @click=\"toggle(c)\">{{ c.title }}</button>\n <template v-else>{{ c.title }}</template>\n </th>\n </tr>\n </thead>\n <tbody>\n <tr v-for=\"(r, i) in rows\" :key=\"rowKey ? rowKey(r.row) : r.index\" :class=\"rowClass(r.row, i)\">\n <td v-for=\"c in columns\" :key=\"c.key\" :class=\"[c.num && 'num', c.className]\">\n <slot :name=\"`cell-${c.key}`\" :row=\"r.row\" :index=\"i\" :value=\"get(r.row, c.key)\">\n <Render v-if=\"c.render\" :content=\"() => c.render!(r.row, i)\" />\n <template v-else>{{ get(r.row, c.key) }}</template>\n </slot>\n </td>\n </tr>\n <tr v-if=\"!rows.length\">\n <td :colspan=\"columns.length\" class=\"ak-fg-muted\"><slot name=\"empty\">暂无数据</slot></td>\n </tr>\n </tbody>\n </table>\n</template>\n","<script setup lang=\"ts\" generic=\"T extends object\">\nimport { computed } from \"vue\";\n\nimport type { DataTableColumn, DataTableSort } from \"./types\";\n\n/**\n * 数据表(= Naive 的 NDataTable,精简):columns + data 渲染成 <table class=\"ak-table\">。\n * 单元格默认是 row[key];自定义用 #cell-<key> 插槽或列的 render。可排序的列表头里放一枚 <button>(WAI-ARIA APG Sortable Table),\n * 当前排序列标 aria-sort,↑ / ↓ 由 CSS 画。不做分页 / 勾选 / 固定列——CSS 没有这些。\n */\nconst props = withDefaults(\n defineProps<{\n /** 列定义:key 取值字段 · title 表头 · num 数字列 · sorter 可排序 · render 自定义单元格 · className */\n columns: DataTableColumn<T>[];\n /** 行数据 */\n data: T[];\n /** 行的唯一标识(同 Naive 的 row-key);不写用原始下标 */\n rowKey?: (row: T) => string | number;\n /** 行的额外类名(同 Naive 的 row-class-name):给当前行 / 选中行加 is-selected(淡主色底) */\n rowClassName?: string | ((row: T, index: number) => string | undefined);\n /** 斑马纹 */\n striped?: boolean;\n /** 紧凑:格内边距 4 / 8 */\n compact?: boolean;\n /** 表格的可访问名(aria-label);上方已有标题说明这张表时可以不写 */\n label?: string;\n }>(),\n { rowKey: undefined, rowClassName: undefined, label: undefined },\n);\n\n/** 排序状态 { key, order: \"ascending\" | \"descending\" },null = 原顺序;点可排序的表头依次切换 升序 → 降序 → 原顺序 */\nconst sort = defineModel<DataTableSort | null>({ default: null });\n\ndefineSlots<\n {\n /** 没有数据时整行显示的内容(默认「暂无数据」) */\n empty?: () => unknown;\n } & {\n /** 某一列的单元格:#cell-<列 key>=\"{ row, index, value }\"(优先于列的 render) */\n [K in `cell-${string}`]?: (p: { row: T; index: number; value: unknown }) => unknown;\n }\n>();\n\nconst get = (row: T, key: string) => (row as Record<string, unknown>)[key];\nconst compare = (a: unknown, b: unknown) =>\n typeof a === \"number\" && typeof b === \"number\" ? a - b : String(a ?? \"\").localeCompare(String(b ?? \"\"), \"zh-Hans-CN\", { numeric: true });\n\nconst rows = computed(() => {\n const list = props.data.map((row, index) => ({ row, index }));\n const s = sort.value;\n const col = s && props.columns.find(c => c.key === s.key);\n if (!s || !col?.sorter) return list;\n const cmp = typeof col.sorter === \"function\" ? col.sorter : (a: T, b: T) => compare(get(a, col.key), get(b, col.key));\n const dir = s.order === \"ascending\" ? 1 : -1;\n return list.sort((a, b) => cmp(a.row, b.row) * dir || a.index - b.index);\n});\n\nconst ariaSort = (c: DataTableColumn<T>) => (sort.value?.key === c.key ? sort.value.order : undefined);\n\nfunction toggle(c: DataTableColumn<T>) {\n const s = sort.value;\n sort.value = s?.key !== c.key ? { key: c.key, order: \"ascending\" } : s.order === \"ascending\" ? { key: c.key, order: \"descending\" } : null;\n}\n\nconst rowClass = (row: T, i: number) => (typeof props.rowClassName === \"function\" ? props.rowClassName(row, i) : props.rowClassName);\n\n/** 把 render 的返回值原样渲染 */\nconst Render = (p: { content: () => unknown }) => p.content();\n</script>\n\n<template>\n <table :class=\"['ak-table', { 'ak-table--striped': striped, 'ak-table--compact': compact }]\" :aria-label=\"label\">\n <thead>\n <tr>\n <th v-for=\"c in columns\" :key=\"c.key\" scope=\"col\" :class=\"[c.num && 'num', c.className]\" :aria-sort=\"ariaSort(c)\">\n <button v-if=\"c.sorter\" type=\"button\" class=\"ak-table__sort\" @click=\"toggle(c)\">{{ c.title }}</button>\n <template v-else>{{ c.title }}</template>\n </th>\n </tr>\n </thead>\n <tbody>\n <tr v-for=\"(r, i) in rows\" :key=\"rowKey ? rowKey(r.row) : r.index\" :class=\"rowClass(r.row, i)\">\n <td v-for=\"c in columns\" :key=\"c.key\" :class=\"[c.num && 'num', c.className]\">\n <slot :name=\"`cell-${c.key}`\" :row=\"r.row\" :index=\"i\" :value=\"get(r.row, c.key)\">\n <Render v-if=\"c.render\" :content=\"() => c.render!(r.row, i)\" />\n <template v-else>{{ get(r.row, c.key) }}</template>\n </slot>\n </td>\n </tr>\n <tr v-if=\"!rows.length\">\n <td :colspan=\"columns.length\" class=\"ak-fg-muted\"><slot name=\"empty\">暂无数据</slot></td>\n </tr>\n </tbody>\n </table>\n</template>\n","<script setup lang=\"ts\">\nimport { onBeforeUnmount, onMounted, watch } from \"vue\";\n\nimport type { IconName } from \"../../icons\";\nimport AkIcon from \"../Icon/AkIcon.vue\";\n\n/**\n * 回到顶部(= Naive 的 NBackTop;CSS 叫 FAB / .ak-fab):右下角 44px 反色方块,滚过 visibility-height 淡入,点了平滑滚回顶部。\n * 整页那枚由皮肤输出(skin.js 同样 600px 出现),而且 < 1400 时皮肤把它收进目录浮层——Vue 版主要给「页面里某个滚动区域」用:\n * position=\"absolute\" + listen-to 指向那个容器。隐藏时 inert:不可点、不进 Tab 顺序、读屏读不到。\n */\nconst props = withDefaults(\n defineProps<{\n /** 可访问名(aria-label,同时作 title) */\n label?: string;\n /** 图标 */\n icon?: IconName;\n /** 滚动超过多少 px 出现(同 Naive 的 visibility-height);false = 不看滚动,显隐完全由 v-model 定 */\n visibilityHeight?: number | false;\n /** 监听、并滚回顶部的滚动容器(元素或选择器);不写 = 整页。模板 ref 还没就绪(null)时先不监听 */\n listenTo?: HTMLElement | string | null;\n /** 定位:fixed 贴视口右下(默认,整页一枚)· absolute 贴最近的定位祖先右下(配合 listen-to 给页面里的滚动区域) */\n position?: \"fixed\" | \"absolute\";\n }>(),\n { label: \"回到顶部\", icon: \"up\", visibilityHeight: 600, listenTo: undefined, position: \"fixed\" },\n);\n\n/** 是否显示;visibility-height 是数字时组件按滚动距离自己更新它 */\nconst visible = defineModel<boolean>({ default: false });\n\ntype Scroller = HTMLElement | Window;\nfunction target(): Scroller | null {\n const t = props.listenTo;\n if (t === undefined) return window;\n return typeof t === \"string\" ? document.querySelector<HTMLElement>(t) : t;\n}\nconst scrollTop = (s: Scroller) => (s instanceof Window ? s.scrollY : s.scrollTop);\n\nlet bound: Scroller | null = null;\nfunction update() {\n if (bound && props.visibilityHeight !== false) visible.value = scrollTop(bound) > props.visibilityHeight;\n}\nfunction bind() {\n bound?.removeEventListener(\"scroll\", update);\n bound = props.visibilityHeight === false ? null : target();\n bound?.addEventListener(\"scroll\", update, { passive: true });\n update();\n}\nonMounted(bind);\nwatch(() => [props.listenTo, props.visibilityHeight], bind);\nonBeforeUnmount(() => bound?.removeEventListener(\"scroll\", update));\n\nfunction toTop() {\n const reduce = matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\n (target() ?? window).scrollTo({ top: 0, behavior: reduce ? \"auto\" : \"smooth\" });\n}\n</script>\n\n<template>\n <button\n type=\"button\"\n :class=\"['ak-fab', { 'ak-fab--absolute': position === 'absolute', 'is-visible': visible }]\"\n :aria-label=\"label\"\n :title=\"label\"\n :inert=\"!visible\"\n @click=\"toTop\"\n >\n <AkIcon :name=\"icon\" :size=\"18\" />\n </button>\n</template>\n","<script setup lang=\"ts\">\nimport { onBeforeUnmount, onMounted, watch } from \"vue\";\n\nimport type { IconName } from \"../../icons\";\nimport AkIcon from \"../Icon/AkIcon.vue\";\n\n/**\n * 回到顶部(= Naive 的 NBackTop;CSS 叫 FAB / .ak-fab):右下角 44px 反色方块,滚过 visibility-height 淡入,点了平滑滚回顶部。\n * 整页那枚由皮肤输出(skin.js 同样 600px 出现),而且 < 1400 时皮肤把它收进目录浮层——Vue 版主要给「页面里某个滚动区域」用:\n * position=\"absolute\" + listen-to 指向那个容器。隐藏时 inert:不可点、不进 Tab 顺序、读屏读不到。\n */\nconst props = withDefaults(\n defineProps<{\n /** 可访问名(aria-label,同时作 title) */\n label?: string;\n /** 图标 */\n icon?: IconName;\n /** 滚动超过多少 px 出现(同 Naive 的 visibility-height);false = 不看滚动,显隐完全由 v-model 定 */\n visibilityHeight?: number | false;\n /** 监听、并滚回顶部的滚动容器(元素或选择器);不写 = 整页。模板 ref 还没就绪(null)时先不监听 */\n listenTo?: HTMLElement | string | null;\n /** 定位:fixed 贴视口右下(默认,整页一枚)· absolute 贴最近的定位祖先右下(配合 listen-to 给页面里的滚动区域) */\n position?: \"fixed\" | \"absolute\";\n }>(),\n { label: \"回到顶部\", icon: \"up\", visibilityHeight: 600, listenTo: undefined, position: \"fixed\" },\n);\n\n/** 是否显示;visibility-height 是数字时组件按滚动距离自己更新它 */\nconst visible = defineModel<boolean>({ default: false });\n\ntype Scroller = HTMLElement | Window;\nfunction target(): Scroller | null {\n const t = props.listenTo;\n if (t === undefined) return window;\n return typeof t === \"string\" ? document.querySelector<HTMLElement>(t) : t;\n}\nconst scrollTop = (s: Scroller) => (s instanceof Window ? s.scrollY : s.scrollTop);\n\nlet bound: Scroller | null = null;\nfunction update() {\n if (bound && props.visibilityHeight !== false) visible.value = scrollTop(bound) > props.visibilityHeight;\n}\nfunction bind() {\n bound?.removeEventListener(\"scroll\", update);\n bound = props.visibilityHeight === false ? null : target();\n bound?.addEventListener(\"scroll\", update, { passive: true });\n update();\n}\nonMounted(bind);\nwatch(() => [props.listenTo, props.visibilityHeight], bind);\nonBeforeUnmount(() => bound?.removeEventListener(\"scroll\", update));\n\nfunction toTop() {\n const reduce = matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\n (target() ?? window).scrollTo({ top: 0, behavior: reduce ? \"auto\" : \"smooth\" });\n}\n</script>\n\n<template>\n <button\n type=\"button\"\n :class=\"['ak-fab', { 'ak-fab--absolute': position === 'absolute', 'is-visible': visible }]\"\n :aria-label=\"label\"\n :title=\"label\"\n :inert=\"!visible\"\n @click=\"toTop\"\n >\n <AkIcon :name=\"icon\" :size=\"18\" />\n </button>\n</template>\n","import { computed, inject, onBeforeUnmount, provide, useAttrs, type InjectionKey } from \"vue\";\n\n/** 校验状态(同 Naive 的 FormValidationStatus,只有 CSS 画得出来的两种) */\nexport type ValidationStatus = \"error\" | \"success\";\n\n/** AkField 给字段里控件的状态(响应式对象) */\nexport interface FieldContext {\n /** 控件 id:<label for> 指向它 */\n readonly id: string;\n readonly labelId: string;\n readonly helpId: string;\n readonly hasLabel: boolean;\n readonly hasHelp: boolean;\n readonly status: ValidationStatus | undefined;\n readonly required: boolean;\n /** 谁占着标签:第一个挂上来的控件(label for 指向它)· 组(复选组 / 单选组:label 不写 for,组用 aria-labelledby)· null 还没有 */\n owner: \"control\" | \"group\" | null;\n}\n\nexport const fieldKey: InjectionKey<FieldContext | null> = Symbol(\"AkField\");\n\n/**\n * 控件接入 AkField(同 Naive 表单项与控件之间的 formItem 注入):返回要绑到原生控件上的 id / aria-labelledby / aria-describedby,\n * 以及字段的校验状态、必填。不在字段里时 attrs 为空。\n * 一个字段只有第一个控件拿 id;kind = \"group\" 的复选组 / 单选组改用 aria-labelledby,并把组里的选项与字段隔开(它们不再各自认字段)。\n */\nexport function useField(kind: \"control\" | \"group\" = \"control\") {\n const field = inject(fieldKey, null);\n const own = !!field && field.owner === null;\n if (own) field!.owner = kind;\n onBeforeUnmount(() => {\n if (own) field!.owner = null;\n });\n if (kind === \"group\") provide(fieldKey, null);\n\n const attrs = computed(() =>\n field\n ? {\n id: own && kind === \"control\" ? field.id : undefined,\n \"aria-labelledby\": own && kind === \"group\" && field.hasLabel ? field.labelId : undefined,\n \"aria-describedby\": field.hasHelp ? field.helpId : undefined,\n }\n : {},\n );\n return {\n attrs,\n status: computed(() => field?.status),\n required: computed(() => own && !!field?.required),\n };\n}\n\n/**\n * 外面包了一层 <label> / <div> 的控件(勾选、开关、步进器、搜索框):class / style 给外层,其余属性(name、autocomplete、@focus …)给原生控件。\n * 配合 defineOptions({ inheritAttrs: false })。\n */\nexport function useSplitAttrs() {\n const attrs = useAttrs();\n return {\n root: computed(() => ({ class: attrs.class, style: attrs.style })),\n control: computed(() => {\n const { class: _c, style: _s, ...rest } = attrs;\n return rest;\n }),\n };\n}\n","<script setup lang=\"ts\">\nimport { provide, reactive, useId } from \"vue\";\n\nimport { fieldKey, type FieldContext, type ValidationStatus } from \"./context\";\n\n/** 表单字段:标签 + 控件 + 说明 / 校验文案(同 Naive 的 NFormItem)。字段里的 AkInput / AkSelect … 自动拿到 id、aria-describedby、aria-invalid */\nconst props = withDefaults(\n defineProps<{\n /** 标签文字:渲染成 <label for>,指向字段里的第一个控件(= 控件的可访问名);复选组 / 单选组改由组 aria-labelledby 指向它 */\n label?: string;\n /** 必填:标签后出红色 *(读屏不念,控件自己带 required) */\n required?: boolean;\n /** 说明或校验文案(.ak-help),经 aria-describedby 关联到控件;validation-status=\"error\" 时是红字 */\n feedback?: string;\n /** 校验状态(同 Naive 的 validation-status):error = 红边 + 红字文案 + aria-invalid · success = 绿边 */\n validationStatus?: ValidationStatus;\n }>(),\n { label: undefined, feedback: undefined, validationStatus: undefined },\n);\n\nconst slots = defineSlots<{\n /** 控件;自己写的原生控件用插槽参数里的 id 对上标签 */\n default?: (props: { id: string }) => unknown;\n /** 标签内容(代替 label,要放链接 / 图标时用) */\n label?: () => unknown;\n /** 说明 / 校验文案(代替 feedback) */\n feedback?: () => unknown;\n}>();\n\nconst id = useId();\nconst ctx: FieldContext = reactive({\n id: `${id}-control`,\n labelId: `${id}-label`,\n helpId: `${id}-help`,\n get hasLabel() {\n return !!(props.label || slots.label);\n },\n get hasHelp() {\n return !!(props.feedback || slots.feedback);\n },\n get status() {\n return props.validationStatus;\n },\n get required() {\n return props.required;\n },\n owner: null,\n});\nprovide(fieldKey, ctx);\n</script>\n\n<template>\n <div :class=\"['ak-field', { 'is-invalid': validationStatus === 'error' }]\">\n <label v-if=\"ctx.hasLabel\" :id=\"ctx.labelId\" class=\"ak-label\" :for=\"ctx.owner === 'group' ? undefined : ctx.id\">\n <slot name=\"label\">{{ label }}</slot>\n <template v-if=\"required\">{{ \" \" }}<span class=\"req\" aria-hidden=\"true\">*</span></template>\n </label>\n <slot :id=\"ctx.id\" />\n <div v-if=\"ctx.hasHelp\" :id=\"ctx.helpId\" :class=\"['ak-help', { 'ak-help--error': validationStatus === 'error' }]\">\n <slot name=\"feedback\">{{ feedback }}</slot>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { provide, reactive, useId } from \"vue\";\n\nimport { fieldKey, type FieldContext, type ValidationStatus } from \"./context\";\n\n/** 表单字段:标签 + 控件 + 说明 / 校验文案(同 Naive 的 NFormItem)。字段里的 AkInput / AkSelect … 自动拿到 id、aria-describedby、aria-invalid */\nconst props = withDefaults(\n defineProps<{\n /** 标签文字:渲染成 <label for>,指向字段里的第一个控件(= 控件的可访问名);复选组 / 单选组改由组 aria-labelledby 指向它 */\n label?: string;\n /** 必填:标签后出红色 *(读屏不念,控件自己带 required) */\n required?: boolean;\n /** 说明或校验文案(.ak-help),经 aria-describedby 关联到控件;validation-status=\"error\" 时是红字 */\n feedback?: string;\n /** 校验状态(同 Naive 的 validation-status):error = 红边 + 红字文案 + aria-invalid · success = 绿边 */\n validationStatus?: ValidationStatus;\n }>(),\n { label: undefined, feedback: undefined, validationStatus: undefined },\n);\n\nconst slots = defineSlots<{\n /** 控件;自己写的原生控件用插槽参数里的 id 对上标签 */\n default?: (props: { id: string }) => unknown;\n /** 标签内容(代替 label,要放链接 / 图标时用) */\n label?: () => unknown;\n /** 说明 / 校验文案(代替 feedback) */\n feedback?: () => unknown;\n}>();\n\nconst id = useId();\nconst ctx: FieldContext = reactive({\n id: `${id}-control`,\n labelId: `${id}-label`,\n helpId: `${id}-help`,\n get hasLabel() {\n return !!(props.label || slots.label);\n },\n get hasHelp() {\n return !!(props.feedback || slots.feedback);\n },\n get status() {\n return props.validationStatus;\n },\n get required() {\n return props.required;\n },\n owner: null,\n});\nprovide(fieldKey, ctx);\n</script>\n\n<template>\n <div :class=\"['ak-field', { 'is-invalid': validationStatus === 'error' }]\">\n <label v-if=\"ctx.hasLabel\" :id=\"ctx.labelId\" class=\"ak-label\" :for=\"ctx.owner === 'group' ? undefined : ctx.id\">\n <slot name=\"label\">{{ label }}</slot>\n <template v-if=\"required\">{{ \" \" }}<span class=\"req\" aria-hidden=\"true\">*</span></template>\n </label>\n <slot :id=\"ctx.id\" />\n <div v-if=\"ctx.hasHelp\" :id=\"ctx.helpId\" :class=\"['ak-help', { 'ak-help--error': validationStatus === 'error' }]\">\n <slot name=\"feedback\">{{ feedback }}</slot>\n </div>\n </div>\n</template>\n","import type { InjectionKey } from \"vue\";\n\nexport type InputSize = \"sm\" | \"md\" | \"lg\";\n\n/** AkInputGroup 给组内 AkInput 的默认尺寸,也告诉它「前后缀直接作为组的子项输出,不要再包一层 .ak-input-group」 */\nexport const inputGroupKey: InjectionKey<{ size?: InputSize }> = Symbol(\"AkInputGroup\");\n","<script setup lang=\"ts\">\nimport { computed, h, inject, type FunctionalComponent } from \"vue\";\n\nimport { useField, type ValidationStatus } from \"../Field/context\";\nimport { inputGroupKey, type InputSize } from \"./context\";\n\n/** 其余属性(name、autocomplete、@focus / @blur / @keydown …)都落到原生 <input> / <textarea> 上 */\ndefineOptions({ inheritAttrs: false });\n\nconst props = withDefaults(\n defineProps<{\n /** 类型:textarea 渲染多行 <textarea class=\"ak-textarea\">(同 Naive);其余是 <input> 的 type。数字用 AkInputNumber,搜索用 AkSearch */\n type?: \"text\" | \"textarea\" | \"password\" | \"email\" | \"url\" | \"tel\";\n /** 占位提示(只做提示,不承载必填等信息) */\n placeholder?: string;\n /** 尺寸:sm 30 · md 36 · lg 44(px 高),与按钮同一刻度;多行输入不适用。不写时跟 AkInputGroup,再不然是 md */\n size?: InputSize;\n /** 校验状态:error 红边(aria-invalid)· success 绿边;不写时跟 AkField 的 validation-status */\n status?: ValidationStatus;\n /** 禁用 */\n disabled?: boolean;\n /** 只读:下沉底色,仍可选中复制——计算器「只显示不编辑」的结果用它,不要用 disabled */\n readonly?: boolean;\n /** 最多字数(原生 maxlength) */\n maxlength?: number;\n /** 多行输入的可见行数(原生 rows);不写时由 CSS 的最小高 90px 定 */\n rows?: number;\n /** 可访问名(aria-label):不在 AkField 里、旁边也没有 <label> 时必填 */\n label?: string;\n }>(),\n { type: \"text\", placeholder: undefined, size: undefined, status: undefined, maxlength: undefined, rows: undefined, label: undefined },\n);\n\n/** 输入的文字 */\nconst model = defineModel<string>();\n\nconst slots = defineSlots<{\n /** 前缀(输入框左边的 .ak-input-group__addon,如「wiki/」);多行输入不适用 */\n prefix?: () => unknown;\n /** 后缀(输入框右边的 .ak-input-group__addon,如单位「%」);多行输入不适用 */\n suffix?: () => unknown;\n}>();\n\nconst group = inject(inputGroupKey, null);\nconst field = useField();\nconst size = computed(() => props.size ?? group?.size ?? \"md\");\nconst status = computed(() => props.status ?? field.status.value);\n\n/** 有前后缀时包一层 .ak-input-group;已经在 AkInputGroup 里就直接作为组的子项输出(CSS 是 .ak-input-group > .ak-input) */\nconst Wrap: FunctionalComponent<{ bare: boolean }> = (p, { slots: s }) =>\n p.bare ? s.default?.() : h(\"div\", { class: \"ak-input-group\" }, s.default?.());\nconst bare = computed(() => !!group || !(slots.prefix || slots.suffix));\n\nconst common = computed(() => ({\n ...field.attrs.value,\n placeholder: props.placeholder,\n disabled: props.disabled,\n readonly: props.readonly,\n maxlength: props.maxlength,\n required: field.required.value || undefined,\n \"aria-invalid\": status.value === \"error\" || undefined,\n \"aria-label\": props.label,\n}));\n</script>\n\n<template>\n <textarea\n v-if=\"type === 'textarea'\"\n v-model=\"model\"\n v-bind=\"{ ...common, ...$attrs }\"\n :class=\"['ak-textarea', { 'is-valid': status === 'success' }]\"\n :rows=\"rows\"\n />\n <Wrap v-else :bare=\"bare\">\n <span v-if=\"$slots.prefix\" class=\"ak-input-group__addon\"><slot name=\"prefix\" /></span>\n <input\n v-model=\"model\"\n :type=\"type\"\n v-bind=\"{ ...common, ...$attrs }\"\n :class=\"['ak-input', size !== 'md' && `ak-input--${size}`, { 'is-valid': status === 'success' }]\"\n />\n <span v-if=\"$slots.suffix\" class=\"ak-input-group__addon\"><slot name=\"suffix\" /></span>\n </Wrap>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, h, inject, type FunctionalComponent } from \"vue\";\n\nimport { useField, type ValidationStatus } from \"../Field/context\";\nimport { inputGroupKey, type InputSize } from \"./context\";\n\n/** 其余属性(name、autocomplete、@focus / @blur / @keydown …)都落到原生 <input> / <textarea> 上 */\ndefineOptions({ inheritAttrs: false });\n\nconst props = withDefaults(\n defineProps<{\n /** 类型:textarea 渲染多行 <textarea class=\"ak-textarea\">(同 Naive);其余是 <input> 的 type。数字用 AkInputNumber,搜索用 AkSearch */\n type?: \"text\" | \"textarea\" | \"password\" | \"email\" | \"url\" | \"tel\";\n /** 占位提示(只做提示,不承载必填等信息) */\n placeholder?: string;\n /** 尺寸:sm 30 · md 36 · lg 44(px 高),与按钮同一刻度;多行输入不适用。不写时跟 AkInputGroup,再不然是 md */\n size?: InputSize;\n /** 校验状态:error 红边(aria-invalid)· success 绿边;不写时跟 AkField 的 validation-status */\n status?: ValidationStatus;\n /** 禁用 */\n disabled?: boolean;\n /** 只读:下沉底色,仍可选中复制——计算器「只显示不编辑」的结果用它,不要用 disabled */\n readonly?: boolean;\n /** 最多字数(原生 maxlength) */\n maxlength?: number;\n /** 多行输入的可见行数(原生 rows);不写时由 CSS 的最小高 90px 定 */\n rows?: number;\n /** 可访问名(aria-label):不在 AkField 里、旁边也没有 <label> 时必填 */\n label?: string;\n }>(),\n { type: \"text\", placeholder: undefined, size: undefined, status: undefined, maxlength: undefined, rows: undefined, label: undefined },\n);\n\n/** 输入的文字 */\nconst model = defineModel<string>();\n\nconst slots = defineSlots<{\n /** 前缀(输入框左边的 .ak-input-group__addon,如「wiki/」);多行输入不适用 */\n prefix?: () => unknown;\n /** 后缀(输入框右边的 .ak-input-group__addon,如单位「%」);多行输入不适用 */\n suffix?: () => unknown;\n}>();\n\nconst group = inject(inputGroupKey, null);\nconst field = useField();\nconst size = computed(() => props.size ?? group?.size ?? \"md\");\nconst status = computed(() => props.status ?? field.status.value);\n\n/** 有前后缀时包一层 .ak-input-group;已经在 AkInputGroup 里就直接作为组的子项输出(CSS 是 .ak-input-group > .ak-input) */\nconst Wrap: FunctionalComponent<{ bare: boolean }> = (p, { slots: s }) =>\n p.bare ? s.default?.() : h(\"div\", { class: \"ak-input-group\" }, s.default?.());\nconst bare = computed(() => !!group || !(slots.prefix || slots.suffix));\n\nconst common = computed(() => ({\n ...field.attrs.value,\n placeholder: props.placeholder,\n disabled: props.disabled,\n readonly: props.readonly,\n maxlength: props.maxlength,\n required: field.required.value || undefined,\n \"aria-invalid\": status.value === \"error\" || undefined,\n \"aria-label\": props.label,\n}));\n</script>\n\n<template>\n <textarea\n v-if=\"type === 'textarea'\"\n v-model=\"model\"\n v-bind=\"{ ...common, ...$attrs }\"\n :class=\"['ak-textarea', { 'is-valid': status === 'success' }]\"\n :rows=\"rows\"\n />\n <Wrap v-else :bare=\"bare\">\n <span v-if=\"$slots.prefix\" class=\"ak-input-group__addon\"><slot name=\"prefix\" /></span>\n <input\n v-model=\"model\"\n :type=\"type\"\n v-bind=\"{ ...common, ...$attrs }\"\n :class=\"['ak-input', size !== 'md' && `ak-input--${size}`, { 'is-valid': status === 'success' }]\"\n />\n <span v-if=\"$slots.suffix\" class=\"ak-input-group__addon\"><slot name=\"suffix\" /></span>\n </Wrap>\n</template>\n","<script setup lang=\"ts\">\nimport { provide } from \"vue\";\n\nimport { buttonGroupKey } from \"../Button/context\";\nimport { inputGroupKey, type InputSize } from \"./context\";\n\n/** 把输入框和按钮拼成一条(同 Naive 的 NInputGroup):相邻边重叠、中间不留圆角。前后缀文字用 AkInput 的 #prefix / #suffix */\nconst props = defineProps<{\n /** 组内输入框与按钮的默认尺寸(各自写了 size 以各自为准) */\n size?: InputSize;\n}>();\n\ndefineSlots<{\n /** AkInput(可带 #prefix / #suffix)与 AkButton */\n default?: () => unknown;\n}>();\n\nprovide(inputGroupKey, props);\nprovide(buttonGroupKey, props);\n</script>\n\n<template>\n <div class=\"ak-input-group\"><slot /></div>\n</template>\n","<script setup lang=\"ts\">\nimport { provide } from \"vue\";\n\nimport { buttonGroupKey } from \"../Button/context\";\nimport { inputGroupKey, type InputSize } from \"./context\";\n\n/** 把输入框和按钮拼成一条(同 Naive 的 NInputGroup):相邻边重叠、中间不留圆角。前后缀文字用 AkInput 的 #prefix / #suffix */\nconst props = defineProps<{\n /** 组内输入框与按钮的默认尺寸(各自写了 size 以各自为准) */\n size?: InputSize;\n}>();\n\ndefineSlots<{\n /** AkInput(可带 #prefix / #suffix)与 AkButton */\n default?: () => unknown;\n}>();\n\nprovide(inputGroupKey, props);\nprovide(buttonGroupKey, props);\n</script>\n\n<template>\n <div class=\"ak-input-group\"><slot /></div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, ref, watch } from \"vue\";\n\nimport { useField, useSplitAttrs } from \"../Field/context\";\n\n/**\n * 数字输入(同 Naive 的 NInputNumber):.ak-number 里 − / 输入 / + 三段,按钮常显。\n * 输入框是 role=\"spinbutton\":↑↓ 一步、PageUp / PageDown 十步、Home / End 到上下限;两个按钮不进 Tab 顺序(键盘用方向键)。\n * class / style 给外层,其余属性给 <input>。\n */\ndefineOptions({ inheritAttrs: false });\n\nconst props = withDefaults(\n defineProps<{\n /** 最小值 */\n min?: number;\n /** 最大值 */\n max?: number;\n /** 步长:按钮 / 方向键每次加减多少 */\n step?: number;\n /** 禁用 */\n disabled?: boolean;\n /** 只读:值能看能复制,不能改 */\n readonly?: boolean;\n /** 清空时的占位提示 */\n placeholder?: string;\n /** 显示 − / + 按钮(同 Naive 的 show-button) */\n showButton?: boolean;\n /** 可访问名(aria-label):不在 AkField 里、旁边也没有 <label> 时必填 */\n label?: string;\n }>(),\n { min: undefined, max: undefined, step: 1, placeholder: undefined, showButton: true, label: undefined },\n);\n\n/** 当前值;输入框清空后是 null */\nconst model = defineModel<number | null>();\n\nconst field = useField();\nconst attrs = useSplitAttrs();\n\nconst format = (v: number | null | undefined) => (v === null || v === undefined ? \"\" : String(v));\n/** 输入框里的文字:打字时可以暂时是「12.」「-」这类还不是数字的样子,失焦 / 回车时再落到 model */\nconst text = ref(format(model.value));\nwatch(model, v => {\n if (parse(text.value) !== v) text.value = format(v);\n});\n\n/** 文字 → 数字;空 = null,不合法 = undefined */\nfunction parse(s: string): number | null | undefined {\n const t = s.trim();\n if (t === \"\") return null;\n const n = Number(t);\n return Number.isFinite(n) ? n : undefined;\n}\nconst clamp = (n: number) => Math.min(props.max ?? Infinity, Math.max(props.min ?? -Infinity, n));\n/** 加减步长时按步长与当前值的小数位取整,避免 0.1 + 0.2 这类尾巴 */\nconst decimals = (n: number) => (String(n).split(\".\")[1] ?? \"\").length;\n\nfunction set(n: number | null) {\n model.value = n;\n text.value = format(n);\n}\n/** 打字时:是合法数字且在范围内就实时更新(同 Naive 的 update-value-on-input),否则等失焦 */\nfunction onInput(e: Event) {\n text.value = (e.target as HTMLInputElement).value;\n const n = parse(text.value);\n if (typeof n === \"number\" && n === clamp(n)) model.value = n;\n}\n/** 失焦 / 回车:落到范围内;不合法就退回原值 */\nfunction commit() {\n const n = parse(text.value);\n if (n === undefined) text.value = format(model.value);\n else set(n === null ? null : clamp(n));\n}\nfunction add(steps: number) {\n if (props.disabled || props.readonly) return;\n const base = model.value ?? props.min ?? 0;\n const next = base + steps * props.step;\n set(clamp(Number(next.toFixed(Math.max(decimals(props.step), decimals(base))))));\n}\n\nconst atMin = computed(() => props.min !== undefined && model.value !== null && model.value !== undefined && model.value <= props.min);\nconst atMax = computed(() => props.max !== undefined && model.value !== null && model.value !== undefined && model.value >= props.max);\nconst locked = computed(() => props.disabled || props.readonly);\n\n/** Home / End 只在有上下限时接管(否则留给光标移动) */\nfunction onKey(e: KeyboardEvent) {\n const { min, max } = props;\n const act: Record<string, (() => void) | undefined> = {\n ArrowUp: () => add(1),\n ArrowDown: () => add(-1),\n PageUp: () => add(10),\n PageDown: () => add(-10),\n Home: min === undefined ? undefined : () => locked.value || set(min),\n End: max === undefined ? undefined : () => locked.value || set(max),\n Enter: commit,\n };\n const fn = act[e.key];\n if (!fn) return;\n e.preventDefault();\n fn();\n}\n\n/** 整数、不会是负数时给手机弹数字键盘;否则要能输小数点 / 负号 */\nconst inputmode = computed(() => (Number.isInteger(props.step) && (props.min ?? -1) >= 0 ? \"numeric\" : \"decimal\"));\n</script>\n\n<template>\n <div v-bind=\"attrs.root.value\" class=\"ak-number\">\n <button v-if=\"showButton\" type=\"button\" tabindex=\"-1\" aria-label=\"减少\" :disabled=\"locked || atMin\" @click=\"add(-1)\">−</button>\n <input\n type=\"text\"\n role=\"spinbutton\"\n autocomplete=\"off\"\n :inputmode=\"inputmode\"\n v-bind=\"{ ...field.attrs.value, ...attrs.control.value }\"\n :value=\"text\"\n :placeholder=\"placeholder\"\n :disabled=\"disabled\"\n :readonly=\"readonly\"\n :required=\"field.required.value || undefined\"\n :aria-invalid=\"field.status.value === 'error' || undefined\"\n :aria-label=\"label\"\n :aria-valuenow=\"model ?? undefined\"\n :aria-valuemin=\"min\"\n :aria-valuemax=\"max\"\n @input=\"onInput\"\n @blur=\"commit\"\n @keydown=\"onKey\"\n />\n <button v-if=\"showButton\" type=\"button\" tabindex=\"-1\" aria-label=\"增加\" :disabled=\"locked || atMax\" @click=\"add(1)\">+</button>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, ref, watch } from \"vue\";\n\nimport { useField, useSplitAttrs } from \"../Field/context\";\n\n/**\n * 数字输入(同 Naive 的 NInputNumber):.ak-number 里 − / 输入 / + 三段,按钮常显。\n * 输入框是 role=\"spinbutton\":↑↓ 一步、PageUp / PageDown 十步、Home / End 到上下限;两个按钮不进 Tab 顺序(键盘用方向键)。\n * class / style 给外层,其余属性给 <input>。\n */\ndefineOptions({ inheritAttrs: false });\n\nconst props = withDefaults(\n defineProps<{\n /** 最小值 */\n min?: number;\n /** 最大值 */\n max?: number;\n /** 步长:按钮 / 方向键每次加减多少 */\n step?: number;\n /** 禁用 */\n disabled?: boolean;\n /** 只读:值能看能复制,不能改 */\n readonly?: boolean;\n /** 清空时的占位提示 */\n placeholder?: string;\n /** 显示 − / + 按钮(同 Naive 的 show-button) */\n showButton?: boolean;\n /** 可访问名(aria-label):不在 AkField 里、旁边也没有 <label> 时必填 */\n label?: string;\n }>(),\n { min: undefined, max: undefined, step: 1, placeholder: undefined, showButton: true, label: undefined },\n);\n\n/** 当前值;输入框清空后是 null */\nconst model = defineModel<number | null>();\n\nconst field = useField();\nconst attrs = useSplitAttrs();\n\nconst format = (v: number | null | undefined) => (v === null || v === undefined ? \"\" : String(v));\n/** 输入框里的文字:打字时可以暂时是「12.」「-」这类还不是数字的样子,失焦 / 回车时再落到 model */\nconst text = ref(format(model.value));\nwatch(model, v => {\n if (parse(text.value) !== v) text.value = format(v);\n});\n\n/** 文字 → 数字;空 = null,不合法 = undefined */\nfunction parse(s: string): number | null | undefined {\n const t = s.trim();\n if (t === \"\") return null;\n const n = Number(t);\n return Number.isFinite(n) ? n : undefined;\n}\nconst clamp = (n: number) => Math.min(props.max ?? Infinity, Math.max(props.min ?? -Infinity, n));\n/** 加减步长时按步长与当前值的小数位取整,避免 0.1 + 0.2 这类尾巴 */\nconst decimals = (n: number) => (String(n).split(\".\")[1] ?? \"\").length;\n\nfunction set(n: number | null) {\n model.value = n;\n text.value = format(n);\n}\n/** 打字时:是合法数字且在范围内就实时更新(同 Naive 的 update-value-on-input),否则等失焦 */\nfunction onInput(e: Event) {\n text.value = (e.target as HTMLInputElement).value;\n const n = parse(text.value);\n if (typeof n === \"number\" && n === clamp(n)) model.value = n;\n}\n/** 失焦 / 回车:落到范围内;不合法就退回原值 */\nfunction commit() {\n const n = parse(text.value);\n if (n === undefined) text.value = format(model.value);\n else set(n === null ? null : clamp(n));\n}\nfunction add(steps: number) {\n if (props.disabled || props.readonly) return;\n const base = model.value ?? props.min ?? 0;\n const next = base + steps * props.step;\n set(clamp(Number(next.toFixed(Math.max(decimals(props.step), decimals(base))))));\n}\n\nconst atMin = computed(() => props.min !== undefined && model.value !== null && model.value !== undefined && model.value <= props.min);\nconst atMax = computed(() => props.max !== undefined && model.value !== null && model.value !== undefined && model.value >= props.max);\nconst locked = computed(() => props.disabled || props.readonly);\n\n/** Home / End 只在有上下限时接管(否则留给光标移动) */\nfunction onKey(e: KeyboardEvent) {\n const { min, max } = props;\n const act: Record<string, (() => void) | undefined> = {\n ArrowUp: () => add(1),\n ArrowDown: () => add(-1),\n PageUp: () => add(10),\n PageDown: () => add(-10),\n Home: min === undefined ? undefined : () => locked.value || set(min),\n End: max === undefined ? undefined : () => locked.value || set(max),\n Enter: commit,\n };\n const fn = act[e.key];\n if (!fn) return;\n e.preventDefault();\n fn();\n}\n\n/** 整数、不会是负数时给手机弹数字键盘;否则要能输小数点 / 负号 */\nconst inputmode = computed(() => (Number.isInteger(props.step) && (props.min ?? -1) >= 0 ? \"numeric\" : \"decimal\"));\n</script>\n\n<template>\n <div v-bind=\"attrs.root.value\" class=\"ak-number\">\n <button v-if=\"showButton\" type=\"button\" tabindex=\"-1\" aria-label=\"减少\" :disabled=\"locked || atMin\" @click=\"add(-1)\">−</button>\n <input\n type=\"text\"\n role=\"spinbutton\"\n autocomplete=\"off\"\n :inputmode=\"inputmode\"\n v-bind=\"{ ...field.attrs.value, ...attrs.control.value }\"\n :value=\"text\"\n :placeholder=\"placeholder\"\n :disabled=\"disabled\"\n :readonly=\"readonly\"\n :required=\"field.required.value || undefined\"\n :aria-invalid=\"field.status.value === 'error' || undefined\"\n :aria-label=\"label\"\n :aria-valuenow=\"model ?? undefined\"\n :aria-valuemin=\"min\"\n :aria-valuemax=\"max\"\n @input=\"onInput\"\n @blur=\"commit\"\n @keydown=\"onKey\"\n />\n <button v-if=\"showButton\" type=\"button\" tabindex=\"-1\" aria-label=\"增加\" :disabled=\"locked || atMax\" @click=\"add(1)\">+</button>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nimport { useField, type ValidationStatus } from \"../Field/context\";\n\nexport type SelectValue = string | number;\n/** 一个选项(同 Naive 的 SelectOption) */\nexport interface SelectOption {\n label: string;\n value: SelectValue;\n disabled?: boolean;\n}\n/** 一组选项,渲染成 <optgroup>(同 Naive 的 SelectGroupOption) */\nexport interface SelectGroupOption {\n type: \"group\";\n label: string;\n children: SelectOption[];\n}\n\n/** 原生 <select> 换肤(与裸 <select> 同一枚 ▾):下拉列表、键盘、读屏都是浏览器自己的。其余属性(name、@change …)落到 <select> 上 */\nconst props = withDefaults(\n defineProps<{\n /** 选项(同 Naive 的 options):{ label, value, disabled };{ type: \"group\", label, children } 是一组(<optgroup>) */\n options: (SelectOption | SelectGroupOption)[];\n /** 没选时显示的提示(一个选不到的空选项);不写则默认选中第一项的样子 */\n placeholder?: string;\n /** 尺寸:sm 30 · md 36 · lg 44(px 高),与输入框同一刻度 */\n size?: \"sm\" | \"md\" | \"lg\";\n /** 校验状态:error 红边(aria-invalid)· success 绿边;不写时跟 AkField 的 validation-status */\n status?: ValidationStatus;\n /** 禁用 */\n disabled?: boolean;\n /** 可访问名(aria-label):不在 AkField 里、旁边也没有 <label> 时必填 */\n label?: string;\n }>(),\n { placeholder: undefined, size: \"md\", status: undefined, label: undefined },\n);\n\n/** 选中项的 value;没选是 null / undefined */\nconst model = defineModel<SelectValue | null>();\n\nconst field = useField();\nconst status = computed(() => props.status ?? field.status.value);\n/** 没选时落到 placeholder 那个空选项上(它的 value 是 null) */\nconst current = computed({\n get: () => model.value ?? null,\n set: v => (model.value = v),\n});\n\nconst isGroup = (o: SelectOption | SelectGroupOption): o is SelectGroupOption => \"type\" in o && o.type === \"group\";\n</script>\n\n<template>\n <select\n v-model=\"current\"\n v-bind=\"field.attrs.value\"\n :class=\"['ak-select', size !== 'md' && `ak-select--${size}`, { 'is-valid': status === 'success' }]\"\n :disabled=\"disabled\"\n :required=\"field.required.value || undefined\"\n :aria-invalid=\"status === 'error' || undefined\"\n :aria-label=\"label\"\n >\n <option v-if=\"placeholder\" :value=\"null\" disabled hidden>{{ placeholder }}</option>\n <template v-for=\"o in options\" :key=\"isGroup(o) ? `g:${o.label}` : o.value\">\n <optgroup v-if=\"isGroup(o)\" :label=\"o.label\">\n <option v-for=\"c in o.children\" :key=\"c.value\" :value=\"c.value\" :disabled=\"c.disabled\">{{ c.label }}</option>\n </optgroup>\n <option v-else :value=\"o.value\" :disabled=\"o.disabled\">{{ o.label }}</option>\n </template>\n </select>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nimport { useField, type ValidationStatus } from \"../Field/context\";\n\nexport type SelectValue = string | number;\n/** 一个选项(同 Naive 的 SelectOption) */\nexport interface SelectOption {\n label: string;\n value: SelectValue;\n disabled?: boolean;\n}\n/** 一组选项,渲染成 <optgroup>(同 Naive 的 SelectGroupOption) */\nexport interface SelectGroupOption {\n type: \"group\";\n label: string;\n children: SelectOption[];\n}\n\n/** 原生 <select> 换肤(与裸 <select> 同一枚 ▾):下拉列表、键盘、读屏都是浏览器自己的。其余属性(name、@change …)落到 <select> 上 */\nconst props = withDefaults(\n defineProps<{\n /** 选项(同 Naive 的 options):{ label, value, disabled };{ type: \"group\", label, children } 是一组(<optgroup>) */\n options: (SelectOption | SelectGroupOption)[];\n /** 没选时显示的提示(一个选不到的空选项);不写则默认选中第一项的样子 */\n placeholder?: string;\n /** 尺寸:sm 30 · md 36 · lg 44(px 高),与输入框同一刻度 */\n size?: \"sm\" | \"md\" | \"lg\";\n /** 校验状态:error 红边(aria-invalid)· success 绿边;不写时跟 AkField 的 validation-status */\n status?: ValidationStatus;\n /** 禁用 */\n disabled?: boolean;\n /** 可访问名(aria-label):不在 AkField 里、旁边也没有 <label> 时必填 */\n label?: string;\n }>(),\n { placeholder: undefined, size: \"md\", status: undefined, label: undefined },\n);\n\n/** 选中项的 value;没选是 null / undefined */\nconst model = defineModel<SelectValue | null>();\n\nconst field = useField();\nconst status = computed(() => props.status ?? field.status.value);\n/** 没选时落到 placeholder 那个空选项上(它的 value 是 null) */\nconst current = computed({\n get: () => model.value ?? null,\n set: v => (model.value = v),\n});\n\nconst isGroup = (o: SelectOption | SelectGroupOption): o is SelectGroupOption => \"type\" in o && o.type === \"group\";\n</script>\n\n<template>\n <select\n v-model=\"current\"\n v-bind=\"field.attrs.value\"\n :class=\"['ak-select', size !== 'md' && `ak-select--${size}`, { 'is-valid': status === 'success' }]\"\n :disabled=\"disabled\"\n :required=\"field.required.value || undefined\"\n :aria-invalid=\"status === 'error' || undefined\"\n :aria-label=\"label\"\n >\n <option v-if=\"placeholder\" :value=\"null\" disabled hidden>{{ placeholder }}</option>\n <template v-for=\"o in options\" :key=\"isGroup(o) ? `g:${o.label}` : o.value\">\n <optgroup v-if=\"isGroup(o)\" :label=\"o.label\">\n <option v-for=\"c in o.children\" :key=\"c.value\" :value=\"c.value\" :disabled=\"c.disabled\">{{ c.label }}</option>\n </optgroup>\n <option v-else :value=\"o.value\" :disabled=\"o.disabled\">{{ o.label }}</option>\n </template>\n </select>\n</template>\n","import type { InjectionKey } from \"vue\";\n\nexport type CheckValue = string | number;\nexport type CheckSize = \"sm\" | \"md\";\n\n/** AkCheckboxGroup 给组内 AkCheckbox 的状态(同 Naive 的 NCheckboxGroup 注入);都是 getter,读的时候才取值 */\nexport interface CheckboxGroupContext {\n readonly value: CheckValue[];\n readonly disabled: boolean;\n readonly size: CheckSize | undefined;\n /** 已选满 max:没勾的不能再勾 */\n readonly full: boolean;\n /** 已到 min:勾着的不能再取消 */\n readonly atMin: boolean;\n toggle(value: CheckValue, checked: boolean): void;\n}\n\nexport const checkboxGroupKey: InjectionKey<CheckboxGroupContext> = Symbol(\"AkCheckboxGroup\");\n","<script setup lang=\"ts\">\nimport { computed, inject, onMounted, onUpdated, useTemplateRef, warn } from \"vue\";\n\nimport { useField, useSplitAttrs } from \"../Field/context\";\nimport { checkboxGroupKey, type CheckSize, type CheckValue } from \"./context\";\n\n/** class / style 给外层 <label>,其余属性(name、@change …)给原生 <input type=\"checkbox\"> */\ndefineOptions({ inheritAttrs: false });\n\nconst props = withDefaults(\n defineProps<{\n /** 在 AkCheckboxGroup 里的取值:勾上时进组的 v-model 数组 */\n value?: CheckValue;\n /** 半选(一横):「全选」框在部分子项勾上时用。只管外观与读屏的「部分选中」,点击照常切换 */\n indeterminate?: boolean;\n /** 禁用 */\n disabled?: boolean;\n /** 尺寸:sm 16px 框(表头里的开关)· md 18px;不写时跟 AkCheckboxGroup */\n size?: CheckSize;\n /** 可访问名(aria-label):不写文字(默认插槽)时必填 */\n label?: string;\n }>(),\n { value: undefined, size: undefined, label: undefined },\n);\n\n/** 单独用时是否勾上;放在 AkCheckboxGroup 里时由组的 v-model 决定,不用绑 */\nconst model = defineModel<boolean>({ default: false });\n\nconst slots = defineSlots<{\n /** 文字 */\n default?: () => unknown;\n}>();\n\nconst group = inject(checkboxGroupKey, null);\nconst inGroup = computed(() => !!group && props.value !== undefined);\nconst checked = computed(() => (inGroup.value ? group!.value.includes(props.value!) : model.value));\nconst disabled = computed(\n () => props.disabled || !!group?.disabled || (inGroup.value && (checked.value ? group!.atMin : group!.full)),\n);\nconst size = computed(() => props.size ?? group?.size ?? \"md\");\n\nconst field = useField();\nconst attrs = useSplitAttrs();\nif (!slots.default && !props.label && !field.attrs.value.id) warn(\"AkCheckbox:没有文字的勾选框要写 label,否则读屏只念「复选框」\");\n\nfunction onChange(e: Event) {\n const c = (e.target as HTMLInputElement).checked;\n if (inGroup.value) group!.toggle(props.value!, c);\n else model.value = c;\n}\n\n/** checked / indeterminate 是 DOM 属性:点击会先改掉 DOM,父组件没接受(或仍是半选)时 vnode 没变、Vue 不会补写,这里每次渲染后对齐 */\nconst input = useTemplateRef<HTMLInputElement>(\"input\");\nconst sync = () => {\n if (!input.value) return;\n input.value.checked = checked.value;\n input.value.indeterminate = props.indeterminate;\n};\nonMounted(sync);\nonUpdated(sync);\n</script>\n\n<template>\n <label v-bind=\"attrs.root.value\" :class=\"['ak-check', size === 'sm' && 'ak-check--sm', { 'is-disabled': disabled }]\">\n <input\n ref=\"input\"\n type=\"checkbox\"\n v-bind=\"{ ...field.attrs.value, ...attrs.control.value }\"\n :value=\"value\"\n :checked=\"checked\"\n :disabled=\"disabled\"\n :aria-label=\"label\"\n @change=\"onChange\"\n />\n <slot />\n </label>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, inject, onMounted, onUpdated, useTemplateRef, warn } from \"vue\";\n\nimport { useField, useSplitAttrs } from \"../Field/context\";\nimport { checkboxGroupKey, type CheckSize, type CheckValue } from \"./context\";\n\n/** class / style 给外层 <label>,其余属性(name、@change …)给原生 <input type=\"checkbox\"> */\ndefineOptions({ inheritAttrs: false });\n\nconst props = withDefaults(\n defineProps<{\n /** 在 AkCheckboxGroup 里的取值:勾上时进组的 v-model 数组 */\n value?: CheckValue;\n /** 半选(一横):「全选」框在部分子项勾上时用。只管外观与读屏的「部分选中」,点击照常切换 */\n indeterminate?: boolean;\n /** 禁用 */\n disabled?: boolean;\n /** 尺寸:sm 16px 框(表头里的开关)· md 18px;不写时跟 AkCheckboxGroup */\n size?: CheckSize;\n /** 可访问名(aria-label):不写文字(默认插槽)时必填 */\n label?: string;\n }>(),\n { value: undefined, size: undefined, label: undefined },\n);\n\n/** 单独用时是否勾上;放在 AkCheckboxGroup 里时由组的 v-model 决定,不用绑 */\nconst model = defineModel<boolean>({ default: false });\n\nconst slots = defineSlots<{\n /** 文字 */\n default?: () => unknown;\n}>();\n\nconst group = inject(checkboxGroupKey, null);\nconst inGroup = computed(() => !!group && props.value !== undefined);\nconst checked = computed(() => (inGroup.value ? group!.value.includes(props.value!) : model.value));\nconst disabled = computed(\n () => props.disabled || !!group?.disabled || (inGroup.value && (checked.value ? group!.atMin : group!.full)),\n);\nconst size = computed(() => props.size ?? group?.size ?? \"md\");\n\nconst field = useField();\nconst attrs = useSplitAttrs();\nif (!slots.default && !props.label && !field.attrs.value.id) warn(\"AkCheckbox:没有文字的勾选框要写 label,否则读屏只念「复选框」\");\n\nfunction onChange(e: Event) {\n const c = (e.target as HTMLInputElement).checked;\n if (inGroup.value) group!.toggle(props.value!, c);\n else model.value = c;\n}\n\n/** checked / indeterminate 是 DOM 属性:点击会先改掉 DOM,父组件没接受(或仍是半选)时 vnode 没变、Vue 不会补写,这里每次渲染后对齐 */\nconst input = useTemplateRef<HTMLInputElement>(\"input\");\nconst sync = () => {\n if (!input.value) return;\n input.value.checked = checked.value;\n input.value.indeterminate = props.indeterminate;\n};\nonMounted(sync);\nonUpdated(sync);\n</script>\n\n<template>\n <label v-bind=\"attrs.root.value\" :class=\"['ak-check', size === 'sm' && 'ak-check--sm', { 'is-disabled': disabled }]\">\n <input\n ref=\"input\"\n type=\"checkbox\"\n v-bind=\"{ ...field.attrs.value, ...attrs.control.value }\"\n :value=\"value\"\n :checked=\"checked\"\n :disabled=\"disabled\"\n :aria-label=\"label\"\n @change=\"onChange\"\n />\n <slot />\n </label>\n</template>\n","<script setup lang=\"ts\">\nimport { provide } from \"vue\";\n\nimport { useField } from \"../Field/context\";\nimport { checkboxGroupKey, type CheckSize, type CheckValue } from \"./context\";\n\n/** 一组复选框(同 Naive 的 NCheckboxGroup):v-model 是勾上的 value 数组。role=\"group\",组名来自 AkField 的标签或 label */\nconst props = withDefaults(\n defineProps<{\n /** 整组禁用 */\n disabled?: boolean;\n /** 最多勾几个:选满后没勾的变成禁用(公开招募最多选 3 个标签) */\n max?: number;\n /** 最少勾几个:到了之后勾着的不能再取消 */\n min?: number;\n /** 组内勾选框的尺寸 */\n size?: CheckSize;\n /** 竖排(默认横排、放不下换行) */\n vertical?: boolean;\n /** 读屏用的组名(aria-label);放在带标签的 AkField 里时不用写 */\n label?: string;\n }>(),\n { max: undefined, min: undefined, size: undefined, label: undefined },\n);\n\n/** 勾上的 value 数组 */\nconst model = defineModel<CheckValue[]>({ default: () => [] });\n\ndefineSlots<{\n /** 若干 AkCheckbox(各写 value) */\n default?: () => unknown;\n}>();\n\nconst field = useField(\"group\");\n\nprovide(checkboxGroupKey, {\n get value() {\n return model.value;\n },\n get disabled() {\n return props.disabled;\n },\n get size() {\n return props.size;\n },\n get full() {\n return props.max !== undefined && model.value.length >= props.max;\n },\n get atMin() {\n return props.min !== undefined && model.value.length <= props.min;\n },\n toggle(value, checked) {\n const rest = model.value.filter(v => v !== value);\n model.value = checked ? [...rest, value] : rest;\n },\n});\n</script>\n\n<template>\n <div :class=\"['ak-check-group', { 'ak-check-group--vertical': vertical }]\" role=\"group\" :aria-label=\"label\" v-bind=\"field.attrs.value\">\n <slot />\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { provide } from \"vue\";\n\nimport { useField } from \"../Field/context\";\nimport { checkboxGroupKey, type CheckSize, type CheckValue } from \"./context\";\n\n/** 一组复选框(同 Naive 的 NCheckboxGroup):v-model 是勾上的 value 数组。role=\"group\",组名来自 AkField 的标签或 label */\nconst props = withDefaults(\n defineProps<{\n /** 整组禁用 */\n disabled?: boolean;\n /** 最多勾几个:选满后没勾的变成禁用(公开招募最多选 3 个标签) */\n max?: number;\n /** 最少勾几个:到了之后勾着的不能再取消 */\n min?: number;\n /** 组内勾选框的尺寸 */\n size?: CheckSize;\n /** 竖排(默认横排、放不下换行) */\n vertical?: boolean;\n /** 读屏用的组名(aria-label);放在带标签的 AkField 里时不用写 */\n label?: string;\n }>(),\n { max: undefined, min: undefined, size: undefined, label: undefined },\n);\n\n/** 勾上的 value 数组 */\nconst model = defineModel<CheckValue[]>({ default: () => [] });\n\ndefineSlots<{\n /** 若干 AkCheckbox(各写 value) */\n default?: () => unknown;\n}>();\n\nconst field = useField(\"group\");\n\nprovide(checkboxGroupKey, {\n get value() {\n return model.value;\n },\n get disabled() {\n return props.disabled;\n },\n get size() {\n return props.size;\n },\n get full() {\n return props.max !== undefined && model.value.length >= props.max;\n },\n get atMin() {\n return props.min !== undefined && model.value.length <= props.min;\n },\n toggle(value, checked) {\n const rest = model.value.filter(v => v !== value);\n model.value = checked ? [...rest, value] : rest;\n },\n});\n</script>\n\n<template>\n <div :class=\"['ak-check-group', { 'ak-check-group--vertical': vertical }]\" role=\"group\" :aria-label=\"label\" v-bind=\"field.attrs.value\">\n <slot />\n </div>\n</template>\n","import type { InjectionKey } from \"vue\";\n\nexport type RadioValue = string | number;\nexport type RadioSize = \"sm\" | \"md\" | \"lg\";\n\n/** AkRadioGroup 给组内 AkRadio / AkRadioButton 的状态(同 Naive 的 NRadioGroup 注入);都是 getter,读的时候才取值 */\nexport interface RadioGroupContext {\n readonly value: RadioValue | undefined;\n readonly name: string;\n readonly disabled: boolean;\n readonly size: RadioSize | undefined;\n select(value: RadioValue): void;\n}\n\nexport const radioGroupKey: InjectionKey<RadioGroupContext> = Symbol(\"AkRadioGroup\");\n","<script setup lang=\"ts\">\nimport { computed, inject, warn } from \"vue\";\n\nimport { useField, useSplitAttrs } from \"../Field/context\";\nimport { radioGroupKey, type RadioValue } from \"./context\";\n\n/** class / style 给外层 <label>,其余属性给原生 <input type=\"radio\"> */\ndefineOptions({ inheritAttrs: false });\n\nconst props = withDefaults(\n defineProps<{\n /** 这一项的值:选中时成为 v-model(或所在 AkRadioGroup 的 v-model)的值 */\n value: RadioValue;\n /** 禁用 */\n disabled?: boolean;\n /** 尺寸:sm 16px 圆 · md 18px;不写时跟 AkRadioGroup(lg 对单选圆点不起作用) */\n size?: \"sm\" | \"md\";\n /** 原生 name:同名的单选互斥、方向键在其间移动;放在 AkRadioGroup 里时由组统一给 */\n name?: string;\n /** 可访问名(aria-label):不写文字(默认插槽)时必填 */\n label?: string;\n }>(),\n { size: undefined, name: undefined, label: undefined },\n);\n\n/** 单独用时 = 选中项的值(同原生 <input type=\"radio\" v-model>);放在 AkRadioGroup 里时由组的 v-model 决定,不用绑 */\nconst model = defineModel<RadioValue>();\n\nconst slots = defineSlots<{\n /** 文字 */\n default?: () => unknown;\n}>();\n\nconst group = inject(radioGroupKey, null);\nconst checked = computed(() => (group ? group.value : model.value) === props.value);\nconst disabled = computed(() => props.disabled || !!group?.disabled);\nconst size = computed(() => props.size ?? group?.size);\n\nconst field = useField();\nconst attrs = useSplitAttrs();\nif (!slots.default && !props.label && !field.attrs.value.id) warn(\"AkRadio:没有文字的单选要写 label,否则读屏只念「单选按钮」\");\n\nfunction onChange() {\n if (group) group.select(props.value);\n else model.value = props.value;\n}\n</script>\n\n<template>\n <label v-bind=\"attrs.root.value\" :class=\"['ak-check', size === 'sm' && 'ak-check--sm', { 'is-disabled': disabled }]\">\n <input\n type=\"radio\"\n v-bind=\"{ ...field.attrs.value, ...attrs.control.value }\"\n :name=\"group?.name ?? name\"\n :value=\"value\"\n :checked=\"checked\"\n :disabled=\"disabled\"\n :aria-label=\"label\"\n @change=\"onChange\"\n />\n <slot />\n </label>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, inject, warn } from \"vue\";\n\nimport { useField, useSplitAttrs } from \"../Field/context\";\nimport { radioGroupKey, type RadioValue } from \"./context\";\n\n/** class / style 给外层 <label>,其余属性给原生 <input type=\"radio\"> */\ndefineOptions({ inheritAttrs: false });\n\nconst props = withDefaults(\n defineProps<{\n /** 这一项的值:选中时成为 v-model(或所在 AkRadioGroup 的 v-model)的值 */\n value: RadioValue;\n /** 禁用 */\n disabled?: boolean;\n /** 尺寸:sm 16px 圆 · md 18px;不写时跟 AkRadioGroup(lg 对单选圆点不起作用) */\n size?: \"sm\" | \"md\";\n /** 原生 name:同名的单选互斥、方向键在其间移动;放在 AkRadioGroup 里时由组统一给 */\n name?: string;\n /** 可访问名(aria-label):不写文字(默认插槽)时必填 */\n label?: string;\n }>(),\n { size: undefined, name: undefined, label: undefined },\n);\n\n/** 单独用时 = 选中项的值(同原生 <input type=\"radio\" v-model>);放在 AkRadioGroup 里时由组的 v-model 决定,不用绑 */\nconst model = defineModel<RadioValue>();\n\nconst slots = defineSlots<{\n /** 文字 */\n default?: () => unknown;\n}>();\n\nconst group = inject(radioGroupKey, null);\nconst checked = computed(() => (group ? group.value : model.value) === props.value);\nconst disabled = computed(() => props.disabled || !!group?.disabled);\nconst size = computed(() => props.size ?? group?.size);\n\nconst field = useField();\nconst attrs = useSplitAttrs();\nif (!slots.default && !props.label && !field.attrs.value.id) warn(\"AkRadio:没有文字的单选要写 label,否则读屏只念「单选按钮」\");\n\nfunction onChange() {\n if (group) group.select(props.value);\n else model.value = props.value;\n}\n</script>\n\n<template>\n <label v-bind=\"attrs.root.value\" :class=\"['ak-check', size === 'sm' && 'ak-check--sm', { 'is-disabled': disabled }]\">\n <input\n type=\"radio\"\n v-bind=\"{ ...field.attrs.value, ...attrs.control.value }\"\n :name=\"group?.name ?? name\"\n :value=\"value\"\n :checked=\"checked\"\n :disabled=\"disabled\"\n :aria-label=\"label\"\n @change=\"onChange\"\n />\n <slot />\n </label>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, inject, warn } from \"vue\";\n\nimport type { IconName } from \"../../icons\";\nimport AkIcon from \"../Icon/AkIcon.vue\";\nimport { radioGroupKey, type RadioValue } from \"./context\";\n\n/**\n * 按钮样式的单选(同 Naive 的 NRadioButton):分段控件——视图切换、排序方式这类「几个里选一个、立即生效」。\n * 只能放在 AkRadioGroup 里:组渲染成 .ak-btn-group[role=radiogroup],这一项是 .ak-btn[role=radio],选中 .is-active(主色实底)。\n * tabindex 由组按 roving tabindex 补上(只有选中项在 Tab 顺序里),方向键由组处理。\n */\nconst props = withDefaults(\n defineProps<{\n /** 这一项的值:选中时成为 AkRadioGroup 的 v-model */\n value: RadioValue;\n /** 禁用:不可选,方向键跳过 */\n disabled?: boolean;\n /** 图标;不写文字(默认插槽)时是方形的图标按钮,这时 label 必填 */\n icon?: IconName;\n /** 可访问名(aria-label;图标按钮同时作 title)——只有图标时必填 */\n label?: string;\n }>(),\n { icon: undefined, label: undefined },\n);\n\nconst slots = defineSlots<{\n /** 文字;不写就是图标按钮 */\n default?: () => unknown;\n}>();\n\nconst group = inject(radioGroupKey, null);\nif (!group) warn(\"AkRadioButton 要放在 AkRadioGroup 里\");\nconst checked = computed(() => group?.value === props.value);\nconst disabled = computed(() => props.disabled || !!group?.disabled);\nconst size = computed(() => group?.size ?? \"md\");\nconst iconOnly = computed(() => !!props.icon && !slots.default);\nif (iconOnly.value && !props.label) warn(`AkRadioButton:只有图标(${props.icon})的单选按钮要写 label`);\n\n/** 图标按钮里的图标边长(同 AkButton) */\nconst ICON_PX = { sm: 16, md: 18, lg: 20 } as const;\n</script>\n\n<template>\n <button\n type=\"button\"\n role=\"radio\"\n :class=\"['ak-btn', size !== 'md' && `ak-btn--${size}`, { 'ak-btn--icon': iconOnly, 'is-active': checked }]\"\n :aria-checked=\"checked\"\n :disabled=\"disabled\"\n :aria-label=\"label\"\n :title=\"iconOnly ? label : undefined\"\n @click=\"group?.select(value)\"\n >\n <AkIcon v-if=\"iconOnly\" :name=\"icon!\" :size=\"ICON_PX[size]\" />\n <template v-else>\n <AkIcon v-if=\"icon\" :name=\"icon\" class=\"ak-btn__icon\" />\n <slot />\n </template>\n </button>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, inject, warn } from \"vue\";\n\nimport type { IconName } from \"../../icons\";\nimport AkIcon from \"../Icon/AkIcon.vue\";\nimport { radioGroupKey, type RadioValue } from \"./context\";\n\n/**\n * 按钮样式的单选(同 Naive 的 NRadioButton):分段控件——视图切换、排序方式这类「几个里选一个、立即生效」。\n * 只能放在 AkRadioGroup 里:组渲染成 .ak-btn-group[role=radiogroup],这一项是 .ak-btn[role=radio],选中 .is-active(主色实底)。\n * tabindex 由组按 roving tabindex 补上(只有选中项在 Tab 顺序里),方向键由组处理。\n */\nconst props = withDefaults(\n defineProps<{\n /** 这一项的值:选中时成为 AkRadioGroup 的 v-model */\n value: RadioValue;\n /** 禁用:不可选,方向键跳过 */\n disabled?: boolean;\n /** 图标;不写文字(默认插槽)时是方形的图标按钮,这时 label 必填 */\n icon?: IconName;\n /** 可访问名(aria-label;图标按钮同时作 title)——只有图标时必填 */\n label?: string;\n }>(),\n { icon: undefined, label: undefined },\n);\n\nconst slots = defineSlots<{\n /** 文字;不写就是图标按钮 */\n default?: () => unknown;\n}>();\n\nconst group = inject(radioGroupKey, null);\nif (!group) warn(\"AkRadioButton 要放在 AkRadioGroup 里\");\nconst checked = computed(() => group?.value === props.value);\nconst disabled = computed(() => props.disabled || !!group?.disabled);\nconst size = computed(() => group?.size ?? \"md\");\nconst iconOnly = computed(() => !!props.icon && !slots.default);\nif (iconOnly.value && !props.label) warn(`AkRadioButton:只有图标(${props.icon})的单选按钮要写 label`);\n\n/** 图标按钮里的图标边长(同 AkButton) */\nconst ICON_PX = { sm: 16, md: 18, lg: 20 } as const;\n</script>\n\n<template>\n <button\n type=\"button\"\n role=\"radio\"\n :class=\"['ak-btn', size !== 'md' && `ak-btn--${size}`, { 'ak-btn--icon': iconOnly, 'is-active': checked }]\"\n :aria-checked=\"checked\"\n :disabled=\"disabled\"\n :aria-label=\"label\"\n :title=\"iconOnly ? label : undefined\"\n @click=\"group?.select(value)\"\n >\n <AkIcon v-if=\"iconOnly\" :name=\"icon!\" :size=\"ICON_PX[size]\" />\n <template v-else>\n <AkIcon v-if=\"icon\" :name=\"icon\" class=\"ak-btn__icon\" />\n <slot />\n </template>\n </button>\n</template>\n","<script setup lang=\"ts\">\nimport { Comment, Fragment, cloneVNode, h, mergeProps, provide, useAttrs, useId, type VNode } from \"vue\";\n\nimport { useField } from \"../Field/context\";\nimport AkRadioButton from \"./AkRadioButton.vue\";\nimport { radioGroupKey, type RadioSize, type RadioValue } from \"./context\";\n\n/**\n * 一组单选(同 Naive 的 NRadioGroup):v-model 是选中项的 value。role=\"radiogroup\",组名来自 AkField 的标签或 label。\n * 里面放 AkRadio → 一排原生单选(.ak-check-group,同名互斥、方向键是浏览器自己的);\n * 放 AkRadioButton → 分段控件(.ak-btn-group 里的 .ak-btn,选中 .is-active),roving tabindex 与方向键由这里处理。\n */\ndefineOptions({ inheritAttrs: false });\n\nconst props = withDefaults(\n defineProps<{\n /** 原生 name(普通单选靠它互斥);不写自动生成 */\n name?: string;\n /** 整组禁用 */\n disabled?: boolean;\n /** 尺寸:单选按钮 sm 30 · md 36 · lg 44(px 高);普通单选只有 sm(16px 圆)与 md */\n size?: RadioSize;\n /** 竖排(只对普通单选;单选按钮总是连成一排) */\n vertical?: boolean;\n /** 读屏用的组名(aria-label);放在带标签的 AkField 里时不用写 */\n label?: string;\n }>(),\n { name: undefined, size: undefined, label: undefined },\n);\n\n/** 选中项的 value */\nconst model = defineModel<RadioValue>();\n\nconst slots = defineSlots<{\n /** 若干 AkRadio,或若干 AkRadioButton */\n default?: () => VNode[];\n}>();\n\nconst field = useField(\"group\");\nconst attrs = useAttrs();\nconst autoName = useId();\n\nprovide(radioGroupKey, {\n get value() {\n return model.value;\n },\n get name() {\n return props.name ?? autoName;\n },\n get disabled() {\n return props.disabled;\n },\n get size() {\n return props.size;\n },\n select(value) {\n model.value = value;\n },\n});\n\nconst flatten = (nodes: VNode[]): VNode[] =>\n nodes.flatMap(n => (n.type === Fragment && Array.isArray(n.children) ? flatten(n.children as VNode[]) : n.type === Comment ? [] : [n]));\n/** <AkRadioButton disabled> 在 vnode.props 里是 \"\" */\nconst isOn = (v: unknown) => v !== undefined && v !== false;\n\n/** 单选按钮:←/↑ 上一个、→/↓ 下一个(跳过禁用、首尾循环),移过去即选中(WAI-ARIA Radio Group) */\nfunction onKey(e: KeyboardEvent) {\n const step = ({ ArrowRight: 1, ArrowDown: 1, ArrowLeft: -1, ArrowUp: -1 } as Record<string, number>)[e.key];\n if (!step) return;\n const radios = [...(e.currentTarget as HTMLElement).querySelectorAll<HTMLButtonElement>(':scope > [role=\"radio\"]')];\n const from = radios.indexOf((e.target as HTMLElement).closest<HTMLButtonElement>('[role=\"radio\"]')!);\n if (from < 0) return;\n e.preventDefault();\n for (let i = 1; i < radios.length; i++) {\n const to = radios[(((from + step * i) % radios.length) + radios.length) % radios.length];\n if (!to.disabled) return void (to.focus(), to.click());\n }\n}\n\n/**\n * 同 Naive 的 NRadioGroup:从默认插槽里看子项是不是单选按钮,决定整组的结构;单选按钮再补上 roving tabindex\n * (选中项 0、其余 -1;没有选中项时第一个可用的是 0)。插槽只能在渲染期调用,所以整个根节点在这里画。\n */\nconst Root = () => {\n const nodes = flatten(slots.default?.() ?? []);\n const common = mergeProps(attrs, field.attrs.value, {\n role: \"radiogroup\",\n \"aria-label\": props.label,\n \"aria-required\": field.required.value || undefined,\n });\n const buttons = nodes.filter(n => n.type === AkRadioButton);\n if (!buttons.length) return h(\"div\", mergeProps(common, { class: [\"ak-check-group\", props.vertical && \"ak-check-group--vertical\"] }), nodes);\n\n const enabled = buttons.filter(n => !props.disabled && !isOn(n.props?.disabled)).map(n => n.props?.value as RadioValue);\n const stop = enabled.includes(model.value!) ? model.value : enabled[0];\n return h(\n \"div\",\n // data-no-toggle:皮肤脚本会替模板输出的 .ak-btn-group 翻 is-active,这里的选中只看 v-model\n mergeProps(common, { class: \"ak-btn-group\", \"data-no-toggle\": \"\", onKeydown: onKey }),\n nodes.map(n => (n.type === AkRadioButton ? cloneVNode(n, { tabindex: n.props?.value === stop ? 0 : -1 }) : n)),\n );\n};\n</script>\n\n<template>\n <Root />\n</template>\n","<script setup lang=\"ts\">\nimport { Comment, Fragment, cloneVNode, h, mergeProps, provide, useAttrs, useId, type VNode } from \"vue\";\n\nimport { useField } from \"../Field/context\";\nimport AkRadioButton from \"./AkRadioButton.vue\";\nimport { radioGroupKey, type RadioSize, type RadioValue } from \"./context\";\n\n/**\n * 一组单选(同 Naive 的 NRadioGroup):v-model 是选中项的 value。role=\"radiogroup\",组名来自 AkField 的标签或 label。\n * 里面放 AkRadio → 一排原生单选(.ak-check-group,同名互斥、方向键是浏览器自己的);\n * 放 AkRadioButton → 分段控件(.ak-btn-group 里的 .ak-btn,选中 .is-active),roving tabindex 与方向键由这里处理。\n */\ndefineOptions({ inheritAttrs: false });\n\nconst props = withDefaults(\n defineProps<{\n /** 原生 name(普通单选靠它互斥);不写自动生成 */\n name?: string;\n /** 整组禁用 */\n disabled?: boolean;\n /** 尺寸:单选按钮 sm 30 · md 36 · lg 44(px 高);普通单选只有 sm(16px 圆)与 md */\n size?: RadioSize;\n /** 竖排(只对普通单选;单选按钮总是连成一排) */\n vertical?: boolean;\n /** 读屏用的组名(aria-label);放在带标签的 AkField 里时不用写 */\n label?: string;\n }>(),\n { name: undefined, size: undefined, label: undefined },\n);\n\n/** 选中项的 value */\nconst model = defineModel<RadioValue>();\n\nconst slots = defineSlots<{\n /** 若干 AkRadio,或若干 AkRadioButton */\n default?: () => VNode[];\n}>();\n\nconst field = useField(\"group\");\nconst attrs = useAttrs();\nconst autoName = useId();\n\nprovide(radioGroupKey, {\n get value() {\n return model.value;\n },\n get name() {\n return props.name ?? autoName;\n },\n get disabled() {\n return props.disabled;\n },\n get size() {\n return props.size;\n },\n select(value) {\n model.value = value;\n },\n});\n\nconst flatten = (nodes: VNode[]): VNode[] =>\n nodes.flatMap(n => (n.type === Fragment && Array.isArray(n.children) ? flatten(n.children as VNode[]) : n.type === Comment ? [] : [n]));\n/** <AkRadioButton disabled> 在 vnode.props 里是 \"\" */\nconst isOn = (v: unknown) => v !== undefined && v !== false;\n\n/** 单选按钮:←/↑ 上一个、→/↓ 下一个(跳过禁用、首尾循环),移过去即选中(WAI-ARIA Radio Group) */\nfunction onKey(e: KeyboardEvent) {\n const step = ({ ArrowRight: 1, ArrowDown: 1, ArrowLeft: -1, ArrowUp: -1 } as Record<string, number>)[e.key];\n if (!step) return;\n const radios = [...(e.currentTarget as HTMLElement).querySelectorAll<HTMLButtonElement>(':scope > [role=\"radio\"]')];\n const from = radios.indexOf((e.target as HTMLElement).closest<HTMLButtonElement>('[role=\"radio\"]')!);\n if (from < 0) return;\n e.preventDefault();\n for (let i = 1; i < radios.length; i++) {\n const to = radios[(((from + step * i) % radios.length) + radios.length) % radios.length];\n if (!to.disabled) return void (to.focus(), to.click());\n }\n}\n\n/**\n * 同 Naive 的 NRadioGroup:从默认插槽里看子项是不是单选按钮,决定整组的结构;单选按钮再补上 roving tabindex\n * (选中项 0、其余 -1;没有选中项时第一个可用的是 0)。插槽只能在渲染期调用,所以整个根节点在这里画。\n */\nconst Root = () => {\n const nodes = flatten(slots.default?.() ?? []);\n const common = mergeProps(attrs, field.attrs.value, {\n role: \"radiogroup\",\n \"aria-label\": props.label,\n \"aria-required\": field.required.value || undefined,\n });\n const buttons = nodes.filter(n => n.type === AkRadioButton);\n if (!buttons.length) return h(\"div\", mergeProps(common, { class: [\"ak-check-group\", props.vertical && \"ak-check-group--vertical\"] }), nodes);\n\n const enabled = buttons.filter(n => !props.disabled && !isOn(n.props?.disabled)).map(n => n.props?.value as RadioValue);\n const stop = enabled.includes(model.value!) ? model.value : enabled[0];\n return h(\n \"div\",\n // data-no-toggle:皮肤脚本会替模板输出的 .ak-btn-group 翻 is-active,这里的选中只看 v-model\n mergeProps(common, { class: \"ak-btn-group\", \"data-no-toggle\": \"\", onKeydown: onKey }),\n nodes.map(n => (n.type === AkRadioButton ? cloneVNode(n, { tabindex: n.props?.value === stop ? 0 : -1 }) : n)),\n );\n};\n</script>\n\n<template>\n <Root />\n</template>\n","<script setup lang=\"ts\">\nimport { warn } from \"vue\";\n\nimport { useField, useSplitAttrs } from \"../Field/context\";\n\n/**\n * 开关(同 Naive 的 NSwitch):方形轨道,开 = 游戏内 toggle_on 蓝。原生 <input type=\"checkbox\" role=\"switch\">,\n * 读屏念「开关,开 / 关」,Space 切换。class / style 给外层 <label>,其余属性给 <input>。\n */\ndefineOptions({ inheritAttrs: false });\n\nconst props = withDefaults(\n defineProps<{\n /** 禁用 */\n disabled?: boolean;\n /** 尺寸:sm 32 × 18(标题栏旁、表头里)· md 40 × 22 */\n size?: \"sm\" | \"md\";\n /** 可访问名(aria-label):没有默认插槽的文字、也不在带标签的 AkField 里时必填 */\n label?: string;\n }>(),\n { size: \"md\", label: undefined },\n);\n\n/** 是否打开 */\nconst model = defineModel<boolean>({ default: false });\n\nconst slots = defineSlots<{\n /** 开关的名称(「显示潜能加成」)——就是它的可访问名,开 / 关时不变 */\n default?: () => unknown;\n /** 打开时名称后面的状态文字(同 Naive 的 #checked);只给眼睛看,读屏已经念「开」 */\n checked?: () => unknown;\n /** 关闭时名称后面的状态文字(同 Naive 的 #unchecked) */\n unchecked?: () => unknown;\n}>();\n\nconst field = useField();\nconst attrs = useSplitAttrs();\nif (!slots.default && !props.label && !field.attrs.value.id) warn(\"AkSwitch:没有名称文字的开关要写 label,否则读屏只念「开关」\");\n</script>\n\n<template>\n <label v-bind=\"attrs.root.value\" :class=\"['ak-switch', size === 'sm' && 'ak-switch--sm', { 'is-disabled': disabled }]\">\n <input\n v-model=\"model\"\n type=\"checkbox\"\n role=\"switch\"\n v-bind=\"{ ...field.attrs.value, ...attrs.control.value }\"\n :disabled=\"disabled\"\n :aria-label=\"label\"\n />\n <span v-if=\"$slots.default\"><slot /></span>\n <span v-if=\"model ? $slots.checked : $slots.unchecked\" aria-hidden=\"true\"><slot :name=\"model ? 'checked' : 'unchecked'\" /></span>\n </label>\n</template>\n","<script setup lang=\"ts\">\nimport { warn } from \"vue\";\n\nimport { useField, useSplitAttrs } from \"../Field/context\";\n\n/**\n * 开关(同 Naive 的 NSwitch):方形轨道,开 = 游戏内 toggle_on 蓝。原生 <input type=\"checkbox\" role=\"switch\">,\n * 读屏念「开关,开 / 关」,Space 切换。class / style 给外层 <label>,其余属性给 <input>。\n */\ndefineOptions({ inheritAttrs: false });\n\nconst props = withDefaults(\n defineProps<{\n /** 禁用 */\n disabled?: boolean;\n /** 尺寸:sm 32 × 18(标题栏旁、表头里)· md 40 × 22 */\n size?: \"sm\" | \"md\";\n /** 可访问名(aria-label):没有默认插槽的文字、也不在带标签的 AkField 里时必填 */\n label?: string;\n }>(),\n { size: \"md\", label: undefined },\n);\n\n/** 是否打开 */\nconst model = defineModel<boolean>({ default: false });\n\nconst slots = defineSlots<{\n /** 开关的名称(「显示潜能加成」)——就是它的可访问名,开 / 关时不变 */\n default?: () => unknown;\n /** 打开时名称后面的状态文字(同 Naive 的 #checked);只给眼睛看,读屏已经念「开」 */\n checked?: () => unknown;\n /** 关闭时名称后面的状态文字(同 Naive 的 #unchecked) */\n unchecked?: () => unknown;\n}>();\n\nconst field = useField();\nconst attrs = useSplitAttrs();\nif (!slots.default && !props.label && !field.attrs.value.id) warn(\"AkSwitch:没有名称文字的开关要写 label,否则读屏只念「开关」\");\n</script>\n\n<template>\n <label v-bind=\"attrs.root.value\" :class=\"['ak-switch', size === 'sm' && 'ak-switch--sm', { 'is-disabled': disabled }]\">\n <input\n v-model=\"model\"\n type=\"checkbox\"\n role=\"switch\"\n v-bind=\"{ ...field.attrs.value, ...attrs.control.value }\"\n :disabled=\"disabled\"\n :aria-label=\"label\"\n />\n <span v-if=\"$slots.default\"><slot /></span>\n <span v-if=\"model ? $slots.checked : $slots.unchecked\" aria-hidden=\"true\"><slot :name=\"model ? 'checked' : 'unchecked'\" /></span>\n </label>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nimport { useField } from \"../Field/context\";\n\n/**\n * 滑杆(同 Naive 的 NSlider):原生 <input type=\"range\" class=\"ak-slider\">,方形滑块、4px 轨道。\n * 键盘(←→↑↓ 一步、PageUp/PageDown、Home/End)和读屏都是浏览器自己的。其余属性落到 <input> 上。\n */\nconst props = withDefaults(\n defineProps<{\n /** 最小值 */\n min?: number;\n /** 最大值 */\n max?: number;\n /** 步长 */\n step?: number;\n /** 禁用 */\n disabled?: boolean;\n /** 可访问名(aria-label):不在 AkField 里、旁边也没有 <label> 时必填 */\n label?: string;\n /** 读屏念的值(aria-valuetext),如 v => `信赖 ${v}%`;不写就念数字 */\n formatValue?: (value: number) => string;\n }>(),\n { min: 0, max: 100, step: 1, label: undefined, formatValue: undefined },\n);\n\n/** 当前值 */\nconst model = defineModel<number>();\n\nconst field = useField();\nconst valueText = computed(() => (props.formatValue && model.value !== undefined ? props.formatValue(model.value) : undefined));\n</script>\n\n<template>\n <input\n v-model.number=\"model\"\n type=\"range\"\n class=\"ak-slider\"\n v-bind=\"field.attrs.value\"\n :min=\"min\"\n :max=\"max\"\n :step=\"step\"\n :disabled=\"disabled\"\n :aria-label=\"label\"\n :aria-valuetext=\"valueText\"\n />\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nimport { useField } from \"../Field/context\";\n\n/**\n * 滑杆(同 Naive 的 NSlider):原生 <input type=\"range\" class=\"ak-slider\">,方形滑块、4px 轨道。\n * 键盘(←→↑↓ 一步、PageUp/PageDown、Home/End)和读屏都是浏览器自己的。其余属性落到 <input> 上。\n */\nconst props = withDefaults(\n defineProps<{\n /** 最小值 */\n min?: number;\n /** 最大值 */\n max?: number;\n /** 步长 */\n step?: number;\n /** 禁用 */\n disabled?: boolean;\n /** 可访问名(aria-label):不在 AkField 里、旁边也没有 <label> 时必填 */\n label?: string;\n /** 读屏念的值(aria-valuetext),如 v => `信赖 ${v}%`;不写就念数字 */\n formatValue?: (value: number) => string;\n }>(),\n { min: 0, max: 100, step: 1, label: undefined, formatValue: undefined },\n);\n\n/** 当前值 */\nconst model = defineModel<number>();\n\nconst field = useField();\nconst valueText = computed(() => (props.formatValue && model.value !== undefined ? props.formatValue(model.value) : undefined));\n</script>\n\n<template>\n <input\n v-model.number=\"model\"\n type=\"range\"\n class=\"ak-slider\"\n v-bind=\"field.attrs.value\"\n :min=\"min\"\n :max=\"max\"\n :step=\"step\"\n :disabled=\"disabled\"\n :aria-label=\"label\"\n :aria-valuetext=\"valueText\"\n />\n</template>\n","<script setup lang=\"ts\">\nimport { computed, onBeforeUnmount, onMounted, useTemplateRef } from \"vue\";\n\nimport { useField, useSplitAttrs } from \"../Field/context\";\nimport AkIcon from \"../Icon/AkIcon.vue\";\n\n/**\n * 搜索框:左侧放大镜 + <input type=\"search\" class=\"ak-input\">(+ 右侧快捷键键帽),同页眉里无 JS 时的搜索表单。\n * 站点级搜索外面包 <form role=\"search\">;页内筛选直接用。class / style 给外层 .ak-search,其余属性给 <input>。\n */\ndefineOptions({ inheritAttrs: false });\n\nconst props = withDefaults(\n defineProps<{\n /** 占位提示 */\n placeholder?: string;\n /** 尺寸:sm 30 · md 36 · lg 44(px 高) */\n size?: \"sm\" | \"md\" | \"lg\";\n /** 禁用 */\n disabled?: boolean;\n /** 可访问名(aria-label);在带标签的 AkField 里时由标签给,否则默认「搜索」 */\n label?: string;\n /** 聚焦快捷键(单个按键,如 \"/\"):右侧显示键帽(有字时隐去),在页面上别处按下它就聚焦到这里(正在别的输入框里打字时不抢) */\n shortcut?: string;\n }>(),\n { placeholder: undefined, size: \"md\", label: undefined, shortcut: undefined },\n);\n\n/** 搜索词 */\nconst model = defineModel<string>();\n\nconst emit = defineEmits<{\n /** 在输入框里按了回车 */\n search: [query: string];\n}>();\n\nconst field = useField();\nconst attrs = useSplitAttrs();\nconst name = computed(() => props.label ?? (field.attrs.value.id ? undefined : \"搜索\"));\n\nconst input = useTemplateRef<HTMLInputElement>(\"input\");\n/** 监听挂在输入框所在的 document 上(文档站示例在 iframe 里,全局 document 不是它) */\nlet doc: Document | undefined;\nfunction onDocKey(e: KeyboardEvent) {\n if (!props.shortcut || e.key !== props.shortcut || e.ctrlKey || e.metaKey || e.altKey || e.defaultPrevented) return;\n const t = e.target as HTMLElement | null;\n if (t && (t.isContentEditable || /^(INPUT|TEXTAREA|SELECT)$/.test(t.tagName))) return;\n e.preventDefault();\n input.value?.focus();\n}\n/** 输入法选字时的回车(isComposing)不算 */\nfunction onEnter(e: KeyboardEvent) {\n if (!e.isComposing) emit(\"search\", model.value ?? \"\");\n}\nonMounted(() => {\n doc = input.value?.ownerDocument;\n doc?.addEventListener(\"keydown\", onDocKey);\n});\nonBeforeUnmount(() => doc?.removeEventListener(\"keydown\", onDocKey));\n</script>\n\n<template>\n <div v-bind=\"attrs.root.value\" class=\"ak-search\">\n <AkIcon name=\"search\" class=\"ak-search__icon\" />\n <input\n ref=\"input\"\n v-model=\"model\"\n type=\"search\"\n v-bind=\"{ ...field.attrs.value, ...attrs.control.value }\"\n :class=\"['ak-input', size !== 'md' && `ak-input--${size}`]\"\n :placeholder=\"placeholder\"\n :disabled=\"disabled\"\n :aria-label=\"name\"\n :aria-keyshortcuts=\"shortcut\"\n @keydown.enter=\"onEnter\"\n />\n <kbd v-if=\"shortcut && !model\" class=\"ak-search__kbd\" aria-hidden=\"true\">{{ shortcut }}</kbd>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, onBeforeUnmount, onMounted, useTemplateRef } from \"vue\";\n\nimport { useField, useSplitAttrs } from \"../Field/context\";\nimport AkIcon from \"../Icon/AkIcon.vue\";\n\n/**\n * 搜索框:左侧放大镜 + <input type=\"search\" class=\"ak-input\">(+ 右侧快捷键键帽),同页眉里无 JS 时的搜索表单。\n * 站点级搜索外面包 <form role=\"search\">;页内筛选直接用。class / style 给外层 .ak-search,其余属性给 <input>。\n */\ndefineOptions({ inheritAttrs: false });\n\nconst props = withDefaults(\n defineProps<{\n /** 占位提示 */\n placeholder?: string;\n /** 尺寸:sm 30 · md 36 · lg 44(px 高) */\n size?: \"sm\" | \"md\" | \"lg\";\n /** 禁用 */\n disabled?: boolean;\n /** 可访问名(aria-label);在带标签的 AkField 里时由标签给,否则默认「搜索」 */\n label?: string;\n /** 聚焦快捷键(单个按键,如 \"/\"):右侧显示键帽(有字时隐去),在页面上别处按下它就聚焦到这里(正在别的输入框里打字时不抢) */\n shortcut?: string;\n }>(),\n { placeholder: undefined, size: \"md\", label: undefined, shortcut: undefined },\n);\n\n/** 搜索词 */\nconst model = defineModel<string>();\n\nconst emit = defineEmits<{\n /** 在输入框里按了回车 */\n search: [query: string];\n}>();\n\nconst field = useField();\nconst attrs = useSplitAttrs();\nconst name = computed(() => props.label ?? (field.attrs.value.id ? undefined : \"搜索\"));\n\nconst input = useTemplateRef<HTMLInputElement>(\"input\");\n/** 监听挂在输入框所在的 document 上(文档站示例在 iframe 里,全局 document 不是它) */\nlet doc: Document | undefined;\nfunction onDocKey(e: KeyboardEvent) {\n if (!props.shortcut || e.key !== props.shortcut || e.ctrlKey || e.metaKey || e.altKey || e.defaultPrevented) return;\n const t = e.target as HTMLElement | null;\n if (t && (t.isContentEditable || /^(INPUT|TEXTAREA|SELECT)$/.test(t.tagName))) return;\n e.preventDefault();\n input.value?.focus();\n}\n/** 输入法选字时的回车(isComposing)不算 */\nfunction onEnter(e: KeyboardEvent) {\n if (!e.isComposing) emit(\"search\", model.value ?? \"\");\n}\nonMounted(() => {\n doc = input.value?.ownerDocument;\n doc?.addEventListener(\"keydown\", onDocKey);\n});\nonBeforeUnmount(() => doc?.removeEventListener(\"keydown\", onDocKey));\n</script>\n\n<template>\n <div v-bind=\"attrs.root.value\" class=\"ak-search\">\n <AkIcon name=\"search\" class=\"ak-search__icon\" />\n <input\n ref=\"input\"\n v-model=\"model\"\n type=\"search\"\n v-bind=\"{ ...field.attrs.value, ...attrs.control.value }\"\n :class=\"['ak-input', size !== 'md' && `ak-input--${size}`]\"\n :placeholder=\"placeholder\"\n :disabled=\"disabled\"\n :aria-label=\"name\"\n :aria-keyshortcuts=\"shortcut\"\n @keydown.enter=\"onEnter\"\n />\n <kbd v-if=\"shortcut && !model\" class=\"ak-search__kbd\" aria-hidden=\"true\">{{ shortcut }}</kbd>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/** 键帽(<kbd class=\"ak-kbd\">):快捷键提示——面板页脚、触发器右侧、行内说明。组合键写成几枚键帽,中间的「+」写在外面 */\ndefineSlots<{\n /** 键名:Ctrl、K、Esc、↵、/ … */\n default?: () => unknown;\n}>();\n</script>\n\n<template>\n <kbd class=\"ak-kbd\"><slot /></kbd>\n</template>\n","<script setup lang=\"ts\">\n/** 键帽(<kbd class=\"ak-kbd\">):快捷键提示——面板页脚、触发器右侧、行内说明。组合键写成几枚键帽,中间的「+」写在外面 */\ndefineSlots<{\n /** 键名:Ctrl、K、Esc、↵、/ … */\n default?: () => unknown;\n}>();\n</script>\n\n<template>\n <kbd class=\"ak-kbd\"><slot /></kbd>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\n/** 稀有度 = 星数 1–6(游戏数据里的 rarity 是 0–5,用的时候 +1) */\nexport type Rarity = 1 | 2 | 3 | 4 | 5 | 6;\n\nconst props = withDefaults(\n defineProps<{\n /** 星数 1–6 */\n value: Rarity;\n /** 颜色:default 游戏星黄 · white 正文色(亮黑暗白)· tier 按稀有度色阶(跟 value 走,= .ak-rarity--r{value}) */\n variant?: \"default\" | \"white\" | \"tier\";\n /** 尺寸:sm 0.8em · md 1em · lg 1.4em——星形跟字号走,放进哪行字就是那行的大小 */\n size?: \"sm\" | \"md\" | \"lg\";\n /** 改用游戏原图(rarity_yellow_N.png 黄星 / rarity_N.png 白星,N = 星数 − 1),固定 14px 高;这时 variant / size 不适用 */\n src?: string;\n /** 原图是白色的那套(rarity_N.png):亮色主题下反相为黑(.ak-glyph) */\n glyph?: boolean;\n /** 可访问名:默认「六星」这种(星形是 CSS 画的空元素,读屏读不到) */\n label?: string;\n }>(),\n { variant: \"default\", size: \"md\", src: undefined, label: undefined },\n);\n\nconst CN = [\"\", \"一\", \"二\", \"三\", \"四\", \"五\", \"六\"];\nconst name = computed(() => props.label ?? `${CN[props.value]}星`);\n\nconst classes = computed(() => [\n \"ak-rarity\",\n props.variant === \"white\" && \"ak-rarity--white\",\n props.variant === \"tier\" && `ak-rarity--r${props.value}`,\n props.size !== \"md\" && `ak-rarity--${props.size}`,\n]);\n</script>\n\n<template>\n <img v-if=\"src\" :class=\"['ak-rarity-img', { 'ak-glyph': glyph }]\" :src=\"src\" :alt=\"name\" />\n <span v-else :class=\"classes\" role=\"img\" :aria-label=\"name\"><i v-for=\"n in value\" :key=\"n\" /></span>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\n/** 稀有度 = 星数 1–6(游戏数据里的 rarity 是 0–5,用的时候 +1) */\nexport type Rarity = 1 | 2 | 3 | 4 | 5 | 6;\n\nconst props = withDefaults(\n defineProps<{\n /** 星数 1–6 */\n value: Rarity;\n /** 颜色:default 游戏星黄 · white 正文色(亮黑暗白)· tier 按稀有度色阶(跟 value 走,= .ak-rarity--r{value}) */\n variant?: \"default\" | \"white\" | \"tier\";\n /** 尺寸:sm 0.8em · md 1em · lg 1.4em——星形跟字号走,放进哪行字就是那行的大小 */\n size?: \"sm\" | \"md\" | \"lg\";\n /** 改用游戏原图(rarity_yellow_N.png 黄星 / rarity_N.png 白星,N = 星数 − 1),固定 14px 高;这时 variant / size 不适用 */\n src?: string;\n /** 原图是白色的那套(rarity_N.png):亮色主题下反相为黑(.ak-glyph) */\n glyph?: boolean;\n /** 可访问名:默认「六星」这种(星形是 CSS 画的空元素,读屏读不到) */\n label?: string;\n }>(),\n { variant: \"default\", size: \"md\", src: undefined, label: undefined },\n);\n\nconst CN = [\"\", \"一\", \"二\", \"三\", \"四\", \"五\", \"六\"];\nconst name = computed(() => props.label ?? `${CN[props.value]}星`);\n\nconst classes = computed(() => [\n \"ak-rarity\",\n props.variant === \"white\" && \"ak-rarity--white\",\n props.variant === \"tier\" && `ak-rarity--r${props.value}`,\n props.size !== \"md\" && `ak-rarity--${props.size}`,\n]);\n</script>\n\n<template>\n <img v-if=\"src\" :class=\"['ak-rarity-img', { 'ak-glyph': glyph }]\" :src=\"src\" :alt=\"name\" />\n <span v-else :class=\"classes\" role=\"img\" :aria-label=\"name\"><i v-for=\"n in value\" :key=\"n\" /></span>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nconst props = withDefaults(\n defineProps<{\n /** 图标地址:职业 profession/<职业>.png、分支 subprofession/<分支>.png(torappu 白线稿,亮色主题下 CSS 反相为黑) */\n src: string;\n /** 职业 / 分支名:作图标的 alt,并默认作悬停提示;不写 = 装饰图标(旁边已经有文字) */\n name?: string;\n /** 分支图标(.ak-subprof,26px,图占 90%):size / variant 不适用 */\n branch?: boolean;\n /** 尺寸:sm 22 · md 32 · lg 48 · xl 72(px 边长) */\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\";\n /** 外观:default 透明底(线稿跟主题反相)· box 深底白线稿(两套主题不变,同游戏内)· outline 1px 描边 */\n variant?: \"default\" | \"box\" | \"outline\";\n /** 悬停提示(data-ak-tip):默认是 name,可改写;false 关掉 */\n tip?: string | false;\n }>(),\n { name: undefined, size: \"md\", variant: \"default\", tip: undefined },\n);\n\nconst classes = computed(() =>\n props.branch\n ? [\"ak-subprof\"]\n : [\"ak-prof\", props.size !== \"md\" && `ak-prof--${props.size}`, props.variant !== \"default\" && `ak-prof--${props.variant}`],\n);\nconst tipText = computed(() => (props.tip === false ? undefined : (props.tip ?? props.name)));\n</script>\n\n<template>\n <span :class=\"classes\" :data-ak-tip=\"tipText\"><img :src=\"src\" :alt=\"name ?? ''\" /></span>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nconst props = withDefaults(\n defineProps<{\n /** 图标地址:职业 profession/<职业>.png、分支 subprofession/<分支>.png(torappu 白线稿,亮色主题下 CSS 反相为黑) */\n src: string;\n /** 职业 / 分支名:作图标的 alt,并默认作悬停提示;不写 = 装饰图标(旁边已经有文字) */\n name?: string;\n /** 分支图标(.ak-subprof,26px,图占 90%):size / variant 不适用 */\n branch?: boolean;\n /** 尺寸:sm 22 · md 32 · lg 48 · xl 72(px 边长) */\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\";\n /** 外观:default 透明底(线稿跟主题反相)· box 深底白线稿(两套主题不变,同游戏内)· outline 1px 描边 */\n variant?: \"default\" | \"box\" | \"outline\";\n /** 悬停提示(data-ak-tip):默认是 name,可改写;false 关掉 */\n tip?: string | false;\n }>(),\n { name: undefined, size: \"md\", variant: \"default\", tip: undefined },\n);\n\nconst classes = computed(() =>\n props.branch\n ? [\"ak-subprof\"]\n : [\"ak-prof\", props.size !== \"md\" && `ak-prof--${props.size}`, props.variant !== \"default\" && `ak-prof--${props.variant}`],\n);\nconst tipText = computed(() => (props.tip === false ? undefined : (props.tip ?? props.name)));\n</script>\n\n<template>\n <span :class=\"classes\" :data-ak-tip=\"tipText\"><img :src=\"src\" :alt=\"name ?? ''\" /></span>\n</template>\n","<script setup lang=\"ts\">\nimport AkProfession from \"./AkProfession.vue\";\n\n/** 带文字的职业 / 分支名(.ak-prof-label):图标 + 中文名 + Bender 英文小字,放在信息栏 / 表格里 */\nwithDefaults(\n defineProps<{\n /** 职业 / 分支名 */\n name: string;\n /** 英文名(Bender 小字,.ak-en) */\n en?: string;\n /** 图标地址:画成分支图标(AkProfession branch,装饰,不带提示);要职业图标或别的写法用 #icon 插槽 */\n src?: string;\n /** 名字链接到职业 / 分支页 */\n href?: string;\n }>(),\n { en: undefined, src: undefined, href: undefined },\n);\n\ndefineSlots<{\n /** 图标(代替 src),如 <AkProfession size=\"sm\" :src /> */\n icon?: () => unknown;\n}>();\n</script>\n\n<template>\n <span class=\"ak-prof-label\">\n <slot name=\"icon\"><AkProfession v-if=\"src\" :src=\"src\" branch :tip=\"false\" /></slot>\n <a v-if=\"href\" :href=\"href\">{{ name }}</a>\n <template v-else>{{ name }}</template>\n <span v-if=\"en\" class=\"ak-en\">{{ en }}</span>\n </span>\n</template>\n","<script setup lang=\"ts\">\nimport AkProfession from \"./AkProfession.vue\";\n\n/** 带文字的职业 / 分支名(.ak-prof-label):图标 + 中文名 + Bender 英文小字,放在信息栏 / 表格里 */\nwithDefaults(\n defineProps<{\n /** 职业 / 分支名 */\n name: string;\n /** 英文名(Bender 小字,.ak-en) */\n en?: string;\n /** 图标地址:画成分支图标(AkProfession branch,装饰,不带提示);要职业图标或别的写法用 #icon 插槽 */\n src?: string;\n /** 名字链接到职业 / 分支页 */\n href?: string;\n }>(),\n { en: undefined, src: undefined, href: undefined },\n);\n\ndefineSlots<{\n /** 图标(代替 src),如 <AkProfession size=\"sm\" :src /> */\n icon?: () => unknown;\n}>();\n</script>\n\n<template>\n <span class=\"ak-prof-label\">\n <slot name=\"icon\"><AkProfession v-if=\"src\" :src=\"src\" branch :tip=\"false\" /></slot>\n <a v-if=\"href\" :href=\"href\">{{ name }}</a>\n <template v-else>{{ name }}</template>\n <span v-if=\"en\" class=\"ak-en\">{{ en }}</span>\n </span>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nconst props = withDefaults(\n defineProps<{\n /** 图标地址:elite/elite_N.png(白线稿,亮色主题下 CSS 反相为黑);lg 用 elite_N_large.png */\n src: string;\n /** 精英阶段 0–2:给出默认文字「精英零 / 一 / 二」 */\n phase?: 0 | 1 | 2;\n /** 等级:接在阶段名后面,「精英二 Lv60」 */\n level?: number;\n /** 文字:默认由 phase + level 拼出,可改写(「提升至精英阶段 1 等级 1」「专精 Ⅰ」);false 只显示图标 */\n text?: string | false;\n /** 尺寸:md 图标 16px 高(默认,配文字)· lg 28px 高(一般只放图标) */\n size?: \"md\" | \"lg\";\n /** 可访问名:只显示图标时作图标的 alt,默认是阶段名;有文字时图标是装饰 */\n label?: string;\n }>(),\n { phase: undefined, level: undefined, text: undefined, size: \"md\", label: undefined },\n);\n\ndefineSlots<{\n /** 文字(代替 text),可以带链接 / 加粗 */\n default?: () => unknown;\n}>();\n\nconst CN = [\"零\", \"一\", \"二\"];\nconst phaseName = computed(() => (props.phase === undefined ? undefined : `精英${CN[props.phase]}`));\nconst content = computed(() => {\n if (props.text !== undefined) return props.text || undefined;\n if (!phaseName.value) return undefined;\n return props.level === undefined ? phaseName.value : `${phaseName.value} Lv${props.level}`;\n});\n</script>\n\n<template>\n <span :class=\"['ak-elite', size === 'lg' && 'ak-elite--lg']\">\n <img :src=\"src\" :alt=\"$slots.default || content ? '' : (label ?? phaseName ?? '')\" />\n <slot>{{ content }}</slot>\n </span>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nconst props = withDefaults(\n defineProps<{\n /** 图标地址:elite/elite_N.png(白线稿,亮色主题下 CSS 反相为黑);lg 用 elite_N_large.png */\n src: string;\n /** 精英阶段 0–2:给出默认文字「精英零 / 一 / 二」 */\n phase?: 0 | 1 | 2;\n /** 等级:接在阶段名后面,「精英二 Lv60」 */\n level?: number;\n /** 文字:默认由 phase + level 拼出,可改写(「提升至精英阶段 1 等级 1」「专精 Ⅰ」);false 只显示图标 */\n text?: string | false;\n /** 尺寸:md 图标 16px 高(默认,配文字)· lg 28px 高(一般只放图标) */\n size?: \"md\" | \"lg\";\n /** 可访问名:只显示图标时作图标的 alt,默认是阶段名;有文字时图标是装饰 */\n label?: string;\n }>(),\n { phase: undefined, level: undefined, text: undefined, size: \"md\", label: undefined },\n);\n\ndefineSlots<{\n /** 文字(代替 text),可以带链接 / 加粗 */\n default?: () => unknown;\n}>();\n\nconst CN = [\"零\", \"一\", \"二\"];\nconst phaseName = computed(() => (props.phase === undefined ? undefined : `精英${CN[props.phase]}`));\nconst content = computed(() => {\n if (props.text !== undefined) return props.text || undefined;\n if (!phaseName.value) return undefined;\n return props.level === undefined ? phaseName.value : `${phaseName.value} Lv${props.level}`;\n});\n</script>\n\n<template>\n <span :class=\"['ak-elite', size === 'lg' && 'ak-elite--lg']\">\n <img :src=\"src\" :alt=\"$slots.default || content ? '' : (label ?? phaseName ?? '')\" />\n <slot>{{ content }}</slot>\n </span>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nconst props = withDefaults(\n defineProps<{\n /** 图标地址:potential/potential_{N−1}.png(游戏图标自带颜色,不随主题反相) */\n src: string;\n /** 潜能 1–6:给出默认 alt「潜能 N」 */\n value?: 1 | 2 | 3 | 4 | 5 | 6;\n /** 可访问名(图标的 alt):默认「潜能 N」;旁边已有同样的文字时写 \"\" 当装饰 */\n label?: string;\n /** 去掉深色底座(放进已有深底 / 表头开关这类行内位置) */\n bare?: boolean;\n }>(),\n { value: undefined, label: undefined },\n);\n\nconst alt = computed(() => props.label ?? (props.value ? `潜能 ${props.value}` : \"\"));\n</script>\n\n<template>\n <span :class=\"['ak-potential', { 'ak-potential--bare': bare }]\"><img :src=\"src\" :alt=\"alt\" /></span>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nconst props = withDefaults(\n defineProps<{\n /** 图标地址:potential/potential_{N−1}.png(游戏图标自带颜色,不随主题反相) */\n src: string;\n /** 潜能 1–6:给出默认 alt「潜能 N」 */\n value?: 1 | 2 | 3 | 4 | 5 | 6;\n /** 可访问名(图标的 alt):默认「潜能 N」;旁边已有同样的文字时写 \"\" 当装饰 */\n label?: string;\n /** 去掉深色底座(放进已有深底 / 表头开关这类行内位置) */\n bare?: boolean;\n }>(),\n { value: undefined, label: undefined },\n);\n\nconst alt = computed(() => props.label ?? (props.value ? `潜能 ${props.value}` : \"\"));\n</script>\n\n<template>\n <span :class=\"['ak-potential', { 'ak-potential--bare': bare }]\"><img :src=\"src\" :alt=\"alt\" /></span>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nconst props = withDefaults(\n defineProps<{\n /** 图标地址:specialized/specialized_N.png */\n src: string;\n /** 专精 1–3:给出默认 alt「专精 N」 */\n value?: 1 | 2 | 3;\n /** 可访问名(图标的 alt):默认「专精 N」;旁边已有同样的文字时写 \"\" 当装饰 */\n label?: string;\n /** 去掉深色底座 */\n bare?: boolean;\n }>(),\n { value: undefined, label: undefined },\n);\n\nconst alt = computed(() => props.label ?? (props.value ? `专精 ${props.value}` : \"\"));\n</script>\n\n<template>\n <span :class=\"['ak-spec', { 'ak-spec--bare': bare }]\"><img :src=\"src\" :alt=\"alt\" /></span>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nconst props = withDefaults(\n defineProps<{\n /** 图标地址:specialized/specialized_N.png */\n src: string;\n /** 专精 1–3:给出默认 alt「专精 N」 */\n value?: 1 | 2 | 3;\n /** 可访问名(图标的 alt):默认「专精 N」;旁边已有同样的文字时写 \"\" 当装饰 */\n label?: string;\n /** 去掉深色底座 */\n bare?: boolean;\n }>(),\n { value: undefined, label: undefined },\n);\n\nconst alt = computed(() => props.label ?? (props.value ? `专精 ${props.value}` : \"\"));\n</script>\n\n<template>\n <span :class=\"['ak-spec', { 'ak-spec--bare': bare }]\"><img :src=\"src\" :alt=\"alt\" /></span>\n</template>\n","<script setup lang=\"ts\">\nwithDefaults(\n defineProps<{\n /** 等级 */\n value: number;\n /** 外观:default 纯读数 · badge 主题灰块(24px 高,与阶段选择器 / 开关 / 信赖同一条线;是读数不是按钮,不反白) */\n variant?: \"default\" | \"badge\";\n }>(),\n { variant: \"default\" },\n);\n</script>\n\n<template>\n <span :class=\"['ak-level', variant === 'badge' && 'ak-level--badge']\">\n <span class=\"ak-level__lv\">LV</span><span class=\"ak-level__n\">{{ value }}</span>\n </span>\n</template>\n","<script setup lang=\"ts\">\nwithDefaults(\n defineProps<{\n /** 等级 */\n value: number;\n /** 外观:default 纯读数 · badge 主题灰块(24px 高,与阶段选择器 / 开关 / 信赖同一条线;是读数不是按钮,不反白) */\n variant?: \"default\" | \"badge\";\n }>(),\n { variant: \"default\" },\n);\n</script>\n\n<template>\n <span :class=\"['ak-level', variant === 'badge' && 'ak-level--badge']\">\n <span class=\"ak-level__lv\">LV</span><span class=\"ak-level__n\">{{ value }}</span>\n </span>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, nextTick } from \"vue\";\n\n/**\n * 精英阶段选择器(E0 / E1 / E2):属性计算器 / 攻击范围这类「同一块数据按阶段重算」的地方用。\n * 语义是单选组(WAI-ARIA Radio Group)而不是页签:它不切换面板,只改一个值,下游数据跟着重算。\n */\nconst props = withDefaults(\n defineProps<{\n /** 最高精英阶段:只画到这一阶(三星干员 1,一 / 二星 0) */\n max?: 0 | 1 | 2;\n /** 各阶段图标地址,下标 = 阶段(elite/elite_N.png,白线稿;选中项在反色块上自动反相);不传只有文字 */\n icons?: string[];\n /** 读屏用的组名 */\n label?: string;\n }>(),\n { max: 2, icons: () => [], label: \"精英阶段\" },\n);\n\n/** 当前精英阶段 0–2 */\nconst model = defineModel<number>({ default: 0 });\n\nconst phases = computed(() => Array.from({ length: props.max + 1 }, (_, i) => i));\n/** 绑定的值超出 max(换了个星级低的干员)时按最高阶显示,保证总有一项在 Tab 顺序里 */\nconst current = computed(() => Math.min(Math.max(model.value, 0), props.max));\n\n/** 方向键在阶段间移动并选中,首尾循环(WAI-ARIA Radio Group);Space / Enter 由 <button> 自己触发 click */\nfunction onKey(e: KeyboardEvent) {\n const n = phases.value.length;\n const i = current.value;\n const to =\n e.key === \"ArrowRight\" || e.key === \"ArrowDown\" ? (i + 1) % n\n : e.key === \"ArrowLeft\" || e.key === \"ArrowUp\" ? (i - 1 + n) % n\n : undefined;\n if (to === undefined) return;\n e.preventDefault();\n model.value = to;\n const group = e.currentTarget as HTMLElement;\n nextTick(() => group.querySelectorAll<HTMLElement>(\"[role=radio]\")[to]?.focus());\n}\n</script>\n\n<template>\n <!-- data-no-toggle:皮肤脚本会替模板输出的 .ak-phase-tabs 翻 is-active 并发 akds:select,这里的选中只看 v-model -->\n <div class=\"ak-phase-tabs\" role=\"radiogroup\" :aria-label=\"label\" data-no-toggle @keydown=\"onKey\">\n <button\n v-for=\"p in phases\"\n :key=\"p\"\n type=\"button\"\n role=\"radio\"\n :class=\"{ 'is-active': p === current }\"\n :aria-checked=\"p === current\"\n :tabindex=\"p === current ? 0 : -1\"\n @click=\"model = p\"\n >\n <img v-if=\"icons[p]\" :src=\"icons[p]\" alt=\"\" />E{{ p }}\n </button>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, nextTick } from \"vue\";\n\n/**\n * 精英阶段选择器(E0 / E1 / E2):属性计算器 / 攻击范围这类「同一块数据按阶段重算」的地方用。\n * 语义是单选组(WAI-ARIA Radio Group)而不是页签:它不切换面板,只改一个值,下游数据跟着重算。\n */\nconst props = withDefaults(\n defineProps<{\n /** 最高精英阶段:只画到这一阶(三星干员 1,一 / 二星 0) */\n max?: 0 | 1 | 2;\n /** 各阶段图标地址,下标 = 阶段(elite/elite_N.png,白线稿;选中项在反色块上自动反相);不传只有文字 */\n icons?: string[];\n /** 读屏用的组名 */\n label?: string;\n }>(),\n { max: 2, icons: () => [], label: \"精英阶段\" },\n);\n\n/** 当前精英阶段 0–2 */\nconst model = defineModel<number>({ default: 0 });\n\nconst phases = computed(() => Array.from({ length: props.max + 1 }, (_, i) => i));\n/** 绑定的值超出 max(换了个星级低的干员)时按最高阶显示,保证总有一项在 Tab 顺序里 */\nconst current = computed(() => Math.min(Math.max(model.value, 0), props.max));\n\n/** 方向键在阶段间移动并选中,首尾循环(WAI-ARIA Radio Group);Space / Enter 由 <button> 自己触发 click */\nfunction onKey(e: KeyboardEvent) {\n const n = phases.value.length;\n const i = current.value;\n const to =\n e.key === \"ArrowRight\" || e.key === \"ArrowDown\" ? (i + 1) % n\n : e.key === \"ArrowLeft\" || e.key === \"ArrowUp\" ? (i - 1 + n) % n\n : undefined;\n if (to === undefined) return;\n e.preventDefault();\n model.value = to;\n const group = e.currentTarget as HTMLElement;\n nextTick(() => group.querySelectorAll<HTMLElement>(\"[role=radio]\")[to]?.focus());\n}\n</script>\n\n<template>\n <!-- data-no-toggle:皮肤脚本会替模板输出的 .ak-phase-tabs 翻 is-active 并发 akds:select,这里的选中只看 v-model -->\n <div class=\"ak-phase-tabs\" role=\"radiogroup\" :aria-label=\"label\" data-no-toggle @keydown=\"onKey\">\n <button\n v-for=\"p in phases\"\n :key=\"p\"\n type=\"button\"\n role=\"radio\"\n :class=\"{ 'is-active': p === current }\"\n :aria-checked=\"p === current\"\n :tabindex=\"p === current ? 0 : -1\"\n @click=\"model = p\"\n >\n <img v-if=\"icons[p]\" :src=\"icons[p]\" alt=\"\" />E{{ p }}\n </button>\n </div>\n</template>\n","<script setup lang=\"ts\">\nwithDefaults(\n defineProps<{\n /** 信赖(%):0–200 */\n value: number;\n /** 读屏前缀:心形是 CSS 画的、读屏读不到,默认补一段隐藏的「信赖」 */\n label?: string;\n }>(),\n { label: \"信赖\" },\n);\n</script>\n\n<template>\n <span class=\"ak-trust\"><span v-if=\"label\" class=\"ak-sr-only\">{{ label }}</span>{{ value }}%</span>\n</template>\n","<script setup lang=\"ts\">\nwithDefaults(\n defineProps<{\n /** 信赖(%):0–200 */\n value: number;\n /** 读屏前缀:心形是 CSS 画的、读屏读不到,默认补一段隐藏的「信赖」 */\n label?: string;\n }>(),\n { label: \"信赖\" },\n);\n</script>\n\n<template>\n <span class=\"ak-trust\"><span v-if=\"label\" class=\"ak-sr-only\">{{ label }}</span>{{ value }}%</span>\n</template>\n","import type { InjectionKey } from \"vue\";\n\n/** AkPotList 给格子的当前潜能(格子自己比较决定是否点亮) */\nexport const potListKey: InjectionKey<{ value?: number }> = Symbol(\"AkPotList\");\n","<script setup lang=\"ts\">\nimport { provide } from \"vue\";\n\nimport { potListKey } from \"./context\";\n\n/** 潜能提升一览(同现网 {{潜能提升}} 的五格表):潜能 2–6 各一格 AkPot,自动折行 */\nconst props = defineProps<{\n /** 当前潜能 1–6:潜能等级不超过它的格子点亮(顶部青条 + 青色小标);不写都不亮 */\n value?: number;\n}>();\n\ndefineSlots<{\n /** 若干 AkPot */\n default?: () => unknown;\n}>();\n\nprovide(potListKey, props);\n</script>\n\n<template>\n <div class=\"ak-pot-list\" role=\"list\"><slot /></div>\n</template>\n","<script setup lang=\"ts\">\nimport { provide } from \"vue\";\n\nimport { potListKey } from \"./context\";\n\n/** 潜能提升一览(同现网 {{潜能提升}} 的五格表):潜能 2–6 各一格 AkPot,自动折行 */\nconst props = defineProps<{\n /** 当前潜能 1–6:潜能等级不超过它的格子点亮(顶部青条 + 青色小标);不写都不亮 */\n value?: number;\n}>();\n\ndefineSlots<{\n /** 若干 AkPot */\n default?: () => unknown;\n}>();\n\nprovide(potListKey, props);\n</script>\n\n<template>\n <div class=\"ak-pot-list\" role=\"list\"><slot /></div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, inject } from \"vue\";\n\nimport AkPotential from \"../Potential/AkPotential.vue\";\nimport { potListKey } from \"./context\";\n\n/** 潜能提升一览里的一格:图标 + 小标「潜能 N」+ 效果(默认插槽),只能放在 AkPotList 里 */\nconst props = withDefaults(\n defineProps<{\n /** 潜能等级 2–6:给出小标「潜能 N」,并与 AkPotList 的 value 比较决定是否点亮 */\n level: 2 | 3 | 4 | 5 | 6;\n /** 潜能图标地址(potential/potential_{N−1}.png) */\n src: string;\n /** 小标:默认「潜能 N」 */\n title?: string;\n /** 点亮(已生效):不写时按 AkPotList 的 value 算 */\n active?: boolean;\n }>(),\n { title: undefined, active: undefined },\n);\n\ndefineSlots<{\n /** 效果:「部署费用<span class=\"ak-rt-vup\">-1</span>」这种,可带富文本 */\n default?: () => unknown;\n}>();\n\nconst list = inject(potListKey, null);\nconst on = computed(() => props.active ?? (list?.value !== undefined && props.level <= list.value));\n</script>\n\n<template>\n <div :class=\"['ak-pot', { 'is-on': on }]\" role=\"listitem\" :data-pot=\"level\">\n <AkPotential :src=\"src\" label=\"\" />\n <div>\n <span class=\"ak-pot__label\">{{ title ?? `潜能 ${level}` }}</span>\n <slot />\n <span v-if=\"on\" class=\"ak-sr-only\">(已生效)</span>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, inject } from \"vue\";\n\nimport AkPotential from \"../Potential/AkPotential.vue\";\nimport { potListKey } from \"./context\";\n\n/** 潜能提升一览里的一格:图标 + 小标「潜能 N」+ 效果(默认插槽),只能放在 AkPotList 里 */\nconst props = withDefaults(\n defineProps<{\n /** 潜能等级 2–6:给出小标「潜能 N」,并与 AkPotList 的 value 比较决定是否点亮 */\n level: 2 | 3 | 4 | 5 | 6;\n /** 潜能图标地址(potential/potential_{N−1}.png) */\n src: string;\n /** 小标:默认「潜能 N」 */\n title?: string;\n /** 点亮(已生效):不写时按 AkPotList 的 value 算 */\n active?: boolean;\n }>(),\n { title: undefined, active: undefined },\n);\n\ndefineSlots<{\n /** 效果:「部署费用<span class=\"ak-rt-vup\">-1</span>」这种,可带富文本 */\n default?: () => unknown;\n}>();\n\nconst list = inject(potListKey, null);\nconst on = computed(() => props.active ?? (list?.value !== undefined && props.level <= list.value));\n</script>\n\n<template>\n <div :class=\"['ak-pot', { 'is-on': on }]\" role=\"listitem\" :data-pot=\"level\">\n <AkPotential :src=\"src\" label=\"\" />\n <div>\n <span class=\"ak-pot__label\">{{ title ?? `潜能 ${level}` }}</span>\n <slot />\n <span v-if=\"on\" class=\"ak-sr-only\">(已生效)</span>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nimport AkRarity, { type Rarity } from \"../Rarity/AkRarity.vue\";\n\nconst props = withDefaults(\n defineProps<{\n /** 干员名 */\n name: string;\n /** 名字下的小字(Bender 大写):英文名 · 编号(Ch'en · LM04)/ 生日 / 获得方式 */\n sub?: string;\n /** 头像地址(正方形,avatar/char_xxx_2.png) */\n avatar: string;\n /** 稀有度 1–6:名字上方的色线(rail 时是左边条),并作左上角星级的 alt */\n rarity: Rarity;\n /** 左上角星级原图地址(rarity/rarity_yellow_{rarity−1}.png);不传时画 CSS 星形 */\n rarityIcon?: string;\n /** 职业名:左下角职业图标的 alt */\n profession?: string;\n /** 左下角职业图标地址:md / lg 用 profession/<职业>.png,sm 用头像同款小图标 profession/icon_<职业>.png;不传不显示 */\n professionIcon?: string;\n /** 精英阶段 0–2:右下角精英图标的 alt */\n elite?: 0 | 1 | 2;\n /** 右下角精英图标地址(elite/elite_N.png);不传不显示 */\n eliteIcon?: string;\n /** 尺寸:sm 88 · md 128 · lg 180(px 宽);放进 AkOpGrid 时宽度由网格定 */\n size?: \"sm\" | \"md\" | \"lg\";\n /** 外观:default 稀有度色顶线 · rail 稀有度色左边条(与 1px 框直角拼接) */\n variant?: \"default\" | \"rail\";\n /** 链接到干员页;不写渲染成 <div> */\n href?: string;\n /** 当前项(异格一览里正在看的这位):青色描边 + aria-current=\"page\" */\n current?: boolean;\n }>(),\n {\n sub: undefined,\n rarityIcon: undefined,\n profession: undefined,\n professionIcon: undefined,\n elite: undefined,\n eliteIcon: undefined,\n size: \"md\",\n variant: \"default\",\n href: undefined,\n },\n);\n\ndefineSlots<{\n /** 头像右上角的角标(.ak-op-card__badge:首页「兑」字标、模组类型小图标…) */\n badge?: () => unknown;\n}>();\n\nconst CN = [\"零\", \"一\", \"二\", \"三\", \"四\", \"五\", \"六\"];\n\nconst classes = computed(() => [\n \"ak-op-card\",\n \"ak-not-prose\",\n props.size !== \"md\" && `ak-op-card--${props.size}`,\n { \"ak-op-card--rail\": props.variant === \"rail\", \"is-current\": props.current },\n]);\n</script>\n\n<template>\n <!-- 整块是链接:ak-not-prose 挡掉正文的 a:visited / a:hover 链接色 -->\n <component :is=\"href ? 'a' : 'div'\" :class=\"classes\" :href=\"href\" :data-rarity=\"rarity\" :aria-current=\"current ? 'page' : undefined\">\n <span class=\"ak-op-card__portrait\">\n <img :src=\"avatar\" alt=\"\" />\n <span class=\"ak-op-card__rarity\">\n <img v-if=\"rarityIcon\" :src=\"rarityIcon\" :alt=\"`${CN[rarity]}星`\" />\n <AkRarity v-else :value=\"rarity\" />\n </span>\n <span v-if=\"professionIcon\" class=\"ak-op-card__prof\"><img :src=\"professionIcon\" :alt=\"profession ?? ''\" /></span>\n <span v-if=\"eliteIcon\" class=\"ak-op-card__elite\"><img :src=\"eliteIcon\" :alt=\"elite === undefined ? '' : `精英${CN[elite]}`\" /></span>\n <span v-if=\"$slots.badge\" class=\"ak-op-card__badge\"><slot name=\"badge\" /></span>\n </span>\n <span class=\"ak-op-card__name\">{{ name }}<span v-if=\"sub\" class=\"ak-op-card__sub\">{{ sub }}</span></span>\n </component>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nimport AkRarity, { type Rarity } from \"../Rarity/AkRarity.vue\";\n\nconst props = withDefaults(\n defineProps<{\n /** 干员名 */\n name: string;\n /** 名字下的小字(Bender 大写):英文名 · 编号(Ch'en · LM04)/ 生日 / 获得方式 */\n sub?: string;\n /** 头像地址(正方形,avatar/char_xxx_2.png) */\n avatar: string;\n /** 稀有度 1–6:名字上方的色线(rail 时是左边条),并作左上角星级的 alt */\n rarity: Rarity;\n /** 左上角星级原图地址(rarity/rarity_yellow_{rarity−1}.png);不传时画 CSS 星形 */\n rarityIcon?: string;\n /** 职业名:左下角职业图标的 alt */\n profession?: string;\n /** 左下角职业图标地址:md / lg 用 profession/<职业>.png,sm 用头像同款小图标 profession/icon_<职业>.png;不传不显示 */\n professionIcon?: string;\n /** 精英阶段 0–2:右下角精英图标的 alt */\n elite?: 0 | 1 | 2;\n /** 右下角精英图标地址(elite/elite_N.png);不传不显示 */\n eliteIcon?: string;\n /** 尺寸:sm 88 · md 128 · lg 180(px 宽);放进 AkOpGrid 时宽度由网格定 */\n size?: \"sm\" | \"md\" | \"lg\";\n /** 外观:default 稀有度色顶线 · rail 稀有度色左边条(与 1px 框直角拼接) */\n variant?: \"default\" | \"rail\";\n /** 链接到干员页;不写渲染成 <div> */\n href?: string;\n /** 当前项(异格一览里正在看的这位):青色描边 + aria-current=\"page\" */\n current?: boolean;\n }>(),\n {\n sub: undefined,\n rarityIcon: undefined,\n profession: undefined,\n professionIcon: undefined,\n elite: undefined,\n eliteIcon: undefined,\n size: \"md\",\n variant: \"default\",\n href: undefined,\n },\n);\n\ndefineSlots<{\n /** 头像右上角的角标(.ak-op-card__badge:首页「兑」字标、模组类型小图标…) */\n badge?: () => unknown;\n}>();\n\nconst CN = [\"零\", \"一\", \"二\", \"三\", \"四\", \"五\", \"六\"];\n\nconst classes = computed(() => [\n \"ak-op-card\",\n \"ak-not-prose\",\n props.size !== \"md\" && `ak-op-card--${props.size}`,\n { \"ak-op-card--rail\": props.variant === \"rail\", \"is-current\": props.current },\n]);\n</script>\n\n<template>\n <!-- 整块是链接:ak-not-prose 挡掉正文的 a:visited / a:hover 链接色 -->\n <component :is=\"href ? 'a' : 'div'\" :class=\"classes\" :href=\"href\" :data-rarity=\"rarity\" :aria-current=\"current ? 'page' : undefined\">\n <span class=\"ak-op-card__portrait\">\n <img :src=\"avatar\" alt=\"\" />\n <span class=\"ak-op-card__rarity\">\n <img v-if=\"rarityIcon\" :src=\"rarityIcon\" :alt=\"`${CN[rarity]}星`\" />\n <AkRarity v-else :value=\"rarity\" />\n </span>\n <span v-if=\"professionIcon\" class=\"ak-op-card__prof\"><img :src=\"professionIcon\" :alt=\"profession ?? ''\" /></span>\n <span v-if=\"eliteIcon\" class=\"ak-op-card__elite\"><img :src=\"eliteIcon\" :alt=\"elite === undefined ? '' : `精英${CN[elite]}`\" /></span>\n <span v-if=\"$slots.badge\" class=\"ak-op-card__badge\"><slot name=\"badge\" /></span>\n </span>\n <span class=\"ak-op-card__name\">{{ name }}<span v-if=\"sub\" class=\"ak-op-card__sub\">{{ sub }}</span></span>\n </component>\n</template>\n","<template>\n <!-- 干员卡网格:auto-fill 每列最窄 112px,卡片宽度由网格定 -->\n <div class=\"ak-op-grid\"><slot /></div>\n</template>\n","<script setup lang=\"ts\">\nimport AkRarity, { type Rarity } from \"../Rarity/AkRarity.vue\";\n\n/** 干员横向条目:列表 / 表格里一行一位——头像(稀有度色左边条)+ 名字 + 第二行小字 */\nwithDefaults(\n defineProps<{\n /** 干员名 */\n name: string;\n /** 头像地址(正方形,36px 显示) */\n avatar: string;\n /** 稀有度 1–6:头像左边的色条;stars 时第二行的星也按它画 */\n rarity?: Rarity;\n /** 第二行小字:分支 / 职业 / 获得方式 */\n meta?: string;\n /** 在第二行前面画稀有度星(按稀有度色阶着色;要写 rarity) */\n stars?: boolean;\n /** 链接到干员页;不写渲染成 <span> */\n href?: string;\n }>(),\n { rarity: undefined, meta: undefined, href: undefined },\n);\n\ndefineSlots<{\n /** 第二行(代替 meta),可放标签 / 链接 */\n meta?: () => unknown;\n}>();\n</script>\n\n<template>\n <!-- 整块是链接:ak-not-prose 挡掉正文的 a:visited / a:hover 链接色 -->\n <component :is=\"href ? 'a' : 'span'\" class=\"ak-op-row ak-not-prose\" :href=\"href\">\n <span class=\"ak-avatar\" :data-rarity=\"rarity\"><img :src=\"avatar\" alt=\"\" /></span>\n <span>\n <span class=\"ak-op-row__name\">{{ name }}</span>\n <span v-if=\"meta || $slots.meta || (stars && rarity)\" class=\"ak-op-row__meta\">\n <AkRarity v-if=\"stars && rarity\" :value=\"rarity\" variant=\"tier\" size=\"sm\" />\n <slot name=\"meta\">{{ meta }}</slot>\n </span>\n </span>\n </component>\n</template>\n","<script setup lang=\"ts\">\nimport AkRarity, { type Rarity } from \"../Rarity/AkRarity.vue\";\n\n/** 干员横向条目:列表 / 表格里一行一位——头像(稀有度色左边条)+ 名字 + 第二行小字 */\nwithDefaults(\n defineProps<{\n /** 干员名 */\n name: string;\n /** 头像地址(正方形,36px 显示) */\n avatar: string;\n /** 稀有度 1–6:头像左边的色条;stars 时第二行的星也按它画 */\n rarity?: Rarity;\n /** 第二行小字:分支 / 职业 / 获得方式 */\n meta?: string;\n /** 在第二行前面画稀有度星(按稀有度色阶着色;要写 rarity) */\n stars?: boolean;\n /** 链接到干员页;不写渲染成 <span> */\n href?: string;\n }>(),\n { rarity: undefined, meta: undefined, href: undefined },\n);\n\ndefineSlots<{\n /** 第二行(代替 meta),可放标签 / 链接 */\n meta?: () => unknown;\n}>();\n</script>\n\n<template>\n <!-- 整块是链接:ak-not-prose 挡掉正文的 a:visited / a:hover 链接色 -->\n <component :is=\"href ? 'a' : 'span'\" class=\"ak-op-row ak-not-prose\" :href=\"href\">\n <span class=\"ak-avatar\" :data-rarity=\"rarity\"><img :src=\"avatar\" alt=\"\" /></span>\n <span>\n <span class=\"ak-op-row__name\">{{ name }}</span>\n <span v-if=\"meta || $slots.meta || (stars && rarity)\" class=\"ak-op-row__meta\">\n <AkRarity v-if=\"stars && rarity\" :value=\"rarity\" variant=\"tier\" size=\"sm\" />\n <slot name=\"meta\">{{ meta }}</slot>\n </span>\n </span>\n </component>\n</template>\n","/**\n * 游戏内富文本:gamedata 里技能 / 天赋 / 关卡描述的原始标记 → 结点树(AkRichText 再画成 .ak-rt-* 的 span)。\n *\n * <@ba.vup>…</> 样式标签(gamedata_const.richTextStyles)→ .ak-rt-vup;命名空间不论(cc.vup / ba.vup 同色),认不得的样式只留文字\n * <$ba.stun>…</> 术语(termDescriptionDict)→ .ak-rt-term,说明作悬停提示\n * {atk_scale:0%} blackboard 占位符:前缀 - 取负;:0% 乘 100 加 %、:0.0 保留一位(# 位去掉末尾的 0);没有格式就原样\n * 换行 → <br>\n *\n * 标签可以嵌套(<@ba.kw><$ba.stun>晕眩</></>);没闭合的在末尾自动闭合,多出来的 </> 忽略。\n */\n\nexport type RtNode =\n | { type: \"text\"; text: string }\n | { type: \"br\" }\n | { type: \"var\"; key: string; negative: boolean; format?: string; raw: string }\n | { type: \"style\" | \"term\"; key: string; children: RtNode[] };\n\nconst TOKEN = /<([@$])([^<>\\s]+?)>|<\\/>|\\{(-)?([^{}:\\s]+?)(?::([^{}\\s]+))?\\}|\\r?\\n/g;\n\nexport function parseRichText(src: string): RtNode[] {\n const root: RtNode[] = [];\n const stack: RtNode[][] = [root];\n const top = () => stack[stack.length - 1];\n let last = 0;\n for (const m of src.matchAll(TOKEN)) {\n if (m.index > last) top().push({ type: \"text\", text: src.slice(last, m.index) });\n last = m.index + m[0].length;\n if (m[1]) {\n const node: RtNode = { type: m[1] === \"$\" ? \"term\" : \"style\", key: m[2], children: [] };\n top().push(node);\n stack.push(node.children);\n } else if (m[0] === \"</>\") {\n if (stack.length > 1) stack.pop();\n } else if (m[4]) {\n top().push({ type: \"var\", key: m[4], negative: !!m[3], format: m[5], raw: m[0] });\n } else {\n top().push({ type: \"br\" });\n }\n }\n if (last < src.length) top().push({ type: \"text\", text: src.slice(last) });\n return root;\n}\n\n/** 有 .ak-rt-* 类的样式名(rich-text.css);mission.levelname 另算 */\nconst STYLES = new Set([\"vup\", \"vdown\", \"rem\", \"kw\", \"imp\", \"drop\", \"enemy\", \"gild\", \"acrem\", \"level\", \"talpu\", \"pn\"]);\n\n/** <@ns.name> → 类名;认不得的返回 undefined(只留文字) */\nexport function styleClass(key: string): string | undefined {\n if (key === \"mission.levelname\") return \"ak-rt-level\";\n const name = key.slice(key.lastIndexOf(\".\") + 1).toLowerCase();\n return STYLES.has(name) ? `ak-rt-${name}` : undefined;\n}\n\n/** 占位符取值 → 文字:{atk_scale:0%} + 2.6 → \"260%\",{-cost:0.0} + 1.25 → \"-1.3\" */\nexport function formatVar(value: number | string, format?: string, negative = false): string {\n if (typeof value !== \"number\") return negative ? `-${value}` : value;\n const percent = format?.endsWith(\"%\") ?? false;\n const n = (negative ? -value : value) * (percent ? 100 : 1);\n const digits = format ? (/\\.([0#]+)/.exec(format)?.[1] ?? \"\") : undefined;\n let s: string;\n if (digits === undefined) s = String(Math.round(n * 1e6) / 1e6);\n else {\n s = n.toFixed(digits.length);\n if (digits.includes(\"#\") && s.includes(\".\")) s = s.replace(/\\.?0+$/, \"\");\n }\n return percent ? `${s}%` : s;\n}\n\n/** 一两句话的说明(术语 / SP 说明)用可折行的宽气泡 .ak-tip--wide,短的一行放下 */\nexport const isWideTip = (tip: string | undefined) => !!tip && tip.length > 12;\n","<script setup lang=\"ts\">\nimport { computed, h, type VNodeChild } from \"vue\";\n\nimport { formatVar, isWideTip, parseRichText, styleClass, type RtNode } from \"./parse\";\n\nexport type RichTextVariant =\n | \"vup\"\n | \"vdown\"\n | \"rem\"\n | \"kw\"\n | \"talpu\"\n | \"term\"\n | \"imp\"\n | \"enemy\"\n | \"gild\"\n | \"drop\"\n | \"acrem\"\n | \"level\"\n | \"pn\";\n\nconst props = withDefaults(\n defineProps<{\n /** 游戏原始标记:<@ba.vup>…</> 样式 · <$ba.stun>…</> 术语 · {atk_scale:0%} 占位符 · 换行;不写就渲染默认插槽 */\n text?: string;\n /** 占位符的取值(技能等级的 blackboard,如 { atk_scale: 2.6 });键不分大小写,没给的占位符原样留着 */\n vars?: Record<string, number | string>;\n /** 术语说明(termDescriptionDict,如 { \"ba.stun\": \"晕眩:…\" }),作 <$…> 的悬停提示 */\n terms?: Record<string, string>;\n /** 只包一层、不解析时的样式:vup 增益 · vdown 减益 · rem 提醒 · kw 关键词 · talpu 潜能加成 · term 术语 · imp 重要 · enemy 敌方 · gild 镀层 · level 关卡名 · pn 斜体 … */\n variant?: RichTextVariant;\n /** 悬停提示(data-ak-tip);variant=\"term\" 时写术语说明 */\n tip?: string;\n /** 外层元素 */\n tag?: string;\n }>(),\n { text: undefined, vars: undefined, terms: undefined, variant: undefined, tip: undefined, tag: \"span\" },\n);\n\nconst slots = defineSlots<{\n /** 不写 text 时的内容(用 variant 包一层) */\n default?: () => unknown;\n /** 占位符怎么画(技能参数矩阵用它把变量位画成 .ak-var);不写就按 vars 填数 */\n var?: (p: { key: string; value: string | undefined }) => unknown;\n}>();\n\nconst tree = computed(() => (props.text === undefined ? [] : parseRichText(props.text)));\n\n/** vars 的键按小写查(游戏里模板和 blackboard 的大小写不总一致) */\nconst lowerVars = computed(() => {\n const out: Record<string, number | string> = {};\n for (const [k, v] of Object.entries(props.vars ?? {})) out[k.toLowerCase()] = v;\n return out;\n});\n\nfunction render(nodes: RtNode[]): VNodeChild[] {\n return nodes.map(n => {\n switch (n.type) {\n case \"text\":\n return n.text;\n case \"br\":\n return h(\"br\");\n case \"var\": {\n const v = lowerVars.value[n.key.toLowerCase()];\n const value = v === undefined ? undefined : formatVar(v, n.format, n.negative);\n return slots.var ? (slots.var({ key: n.key, value }) as VNodeChild) : (value ?? n.raw);\n }\n case \"term\": {\n const tip = props.terms?.[n.key];\n return h(\"span\", { class: [\"ak-rt-term\", isWideTip(tip) && \"ak-tip--wide\"], \"data-ak-tip\": tip }, render(n.children));\n }\n case \"style\": {\n const cls = styleClass(n.key);\n return cls ? h(\"span\", { class: cls }, render(n.children)) : render(n.children);\n }\n }\n });\n}\n\nconst classes = computed(() => [props.variant && `ak-rt-${props.variant}`, isWideTip(props.tip) && \"ak-tip--wide\"].filter(Boolean).join(\" \") || undefined);\n\n/** 渲染期才调插槽(var 插槽要在父组件的渲染里调用),所以包成一个函数组件交给模板 */\nconst Nodes = () => render(tree.value);\n</script>\n\n<template>\n <component :is=\"tag\" :class=\"classes\" :data-ak-tip=\"tip\">\n <Nodes v-if=\"text !== undefined\" />\n <slot v-else />\n </component>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, h, type VNodeChild } from \"vue\";\n\nimport { formatVar, isWideTip, parseRichText, styleClass, type RtNode } from \"./parse\";\n\nexport type RichTextVariant =\n | \"vup\"\n | \"vdown\"\n | \"rem\"\n | \"kw\"\n | \"talpu\"\n | \"term\"\n | \"imp\"\n | \"enemy\"\n | \"gild\"\n | \"drop\"\n | \"acrem\"\n | \"level\"\n | \"pn\";\n\nconst props = withDefaults(\n defineProps<{\n /** 游戏原始标记:<@ba.vup>…</> 样式 · <$ba.stun>…</> 术语 · {atk_scale:0%} 占位符 · 换行;不写就渲染默认插槽 */\n text?: string;\n /** 占位符的取值(技能等级的 blackboard,如 { atk_scale: 2.6 });键不分大小写,没给的占位符原样留着 */\n vars?: Record<string, number | string>;\n /** 术语说明(termDescriptionDict,如 { \"ba.stun\": \"晕眩:…\" }),作 <$…> 的悬停提示 */\n terms?: Record<string, string>;\n /** 只包一层、不解析时的样式:vup 增益 · vdown 减益 · rem 提醒 · kw 关键词 · talpu 潜能加成 · term 术语 · imp 重要 · enemy 敌方 · gild 镀层 · level 关卡名 · pn 斜体 … */\n variant?: RichTextVariant;\n /** 悬停提示(data-ak-tip);variant=\"term\" 时写术语说明 */\n tip?: string;\n /** 外层元素 */\n tag?: string;\n }>(),\n { text: undefined, vars: undefined, terms: undefined, variant: undefined, tip: undefined, tag: \"span\" },\n);\n\nconst slots = defineSlots<{\n /** 不写 text 时的内容(用 variant 包一层) */\n default?: () => unknown;\n /** 占位符怎么画(技能参数矩阵用它把变量位画成 .ak-var);不写就按 vars 填数 */\n var?: (p: { key: string; value: string | undefined }) => unknown;\n}>();\n\nconst tree = computed(() => (props.text === undefined ? [] : parseRichText(props.text)));\n\n/** vars 的键按小写查(游戏里模板和 blackboard 的大小写不总一致) */\nconst lowerVars = computed(() => {\n const out: Record<string, number | string> = {};\n for (const [k, v] of Object.entries(props.vars ?? {})) out[k.toLowerCase()] = v;\n return out;\n});\n\nfunction render(nodes: RtNode[]): VNodeChild[] {\n return nodes.map(n => {\n switch (n.type) {\n case \"text\":\n return n.text;\n case \"br\":\n return h(\"br\");\n case \"var\": {\n const v = lowerVars.value[n.key.toLowerCase()];\n const value = v === undefined ? undefined : formatVar(v, n.format, n.negative);\n return slots.var ? (slots.var({ key: n.key, value }) as VNodeChild) : (value ?? n.raw);\n }\n case \"term\": {\n const tip = props.terms?.[n.key];\n return h(\"span\", { class: [\"ak-rt-term\", isWideTip(tip) && \"ak-tip--wide\"], \"data-ak-tip\": tip }, render(n.children));\n }\n case \"style\": {\n const cls = styleClass(n.key);\n return cls ? h(\"span\", { class: cls }, render(n.children)) : render(n.children);\n }\n }\n });\n}\n\nconst classes = computed(() => [props.variant && `ak-rt-${props.variant}`, isWideTip(props.tip) && \"ak-tip--wide\"].filter(Boolean).join(\" \") || undefined);\n\n/** 渲染期才调插槽(var 插槽要在父组件的渲染里调用),所以包成一个函数组件交给模板 */\nconst Nodes = () => render(tree.value);\n</script>\n\n<template>\n <component :is=\"tag\" :class=\"classes\" :data-ak-tip=\"tip\">\n <Nodes v-if=\"text !== undefined\" />\n <slot v-else />\n </component>\n</template>\n","/** 技力回复方式(游戏内 spType):自动回复 绿 · 攻击回复 橙 · 受击回复 黄 · 被动 灰 */\nexport type SpType = \"auto\" | \"attack\" | \"hit\" | \"passive\";\n\n/** SP 数值芯片:cost 消耗(荧光绿闪电)· init 初始(▶)· duration 持续(⏱) */\nexport type SpValueKind = \"cost\" | \"init\" | \"duration\";\n\nexport const SP_TYPE_TEXT: Record<SpType, string> = { auto: \"自动回复\", attack: \"攻击回复\", hit: \"受击回复\", passive: \"被动\" };\n\n/** 游戏内的技力说明(prts.wiki 干员页的悬停提示);被动技能没有技力,不给 */\nexport const SP_TYPE_TIP: Record<SpType, string | undefined> = {\n auto: \"每秒回复1点技力\",\n attack: \"每次攻击回复1点技力\",\n hit: \"每次受到攻击回复1点技力\",\n passive: undefined,\n};\n\nexport const TRIGGER_TEXT = { manual: \"手动触发\", auto: \"自动触发\" } as const;\nexport const TRIGGER_TIP = {\n manual: \"技力达到需求并满足开启条件后,需要玩家手动开启的技能\",\n auto: \"技力达到需求并满足开启条件后,自动开启的技能\",\n} as const;\n\nexport const SP_VALUE_CLASS: Record<SpValueKind, string> = { cost: \"ak-sp-cost\", init: \"ak-sp-init\", duration: \"ak-sp-dur\" };\n/** 读屏用的名字(芯片的图形是 CSS mask,读不出来) */\nexport const SP_VALUE_NAME: Record<SpValueKind, string> = { cost: \"消耗\", init: \"初始\", duration: \"持续\" };\nexport const SP_VALUE_TIP: Record<SpValueKind, string> = {\n cost: \"消耗:该技能所需要消耗的技力数\",\n init: \"初始:干员部署后预置的技力数(每次部署仅一次)\",\n duration: \"持续:该技能的持续时间(秒)\",\n};\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nimport { isWideTip } from \"../RichText/parse\";\nimport { SP_TYPE_TEXT, SP_TYPE_TIP, type SpType } from \"./sp\";\n\nconst props = withDefaults(\n defineProps<{\n /** 技力回复方式:auto 自动回复(绿)· attack 攻击回复(橙)· hit 受击回复(黄)· passive 被动(灰) */\n spType?: SpType;\n /** 悬停提示(data-ak-tip):默认是游戏内的说明(「每次攻击回复1点技力」),可改写;false 关掉 */\n tip?: string | false;\n }>(),\n { spType: \"auto\", tip: undefined },\n);\n\ndefineSlots<{\n /** 文字;默认「自动回复」「攻击回复」「受击回复」「被动」 */\n default?: () => unknown;\n}>();\n\nconst tipText = computed(() => (props.tip === false ? undefined : (props.tip ?? SP_TYPE_TIP[props.spType])));\n</script>\n\n<template>\n <span\n :class=\"['ak-sp', spType !== 'auto' && `ak-sp--${spType}`, isWideTip(tipText) && 'ak-tip--wide']\"\n :data-ak-tip=\"tipText\"\n >\n <slot>{{ SP_TYPE_TEXT[spType] }}</slot>\n </span>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nimport { isWideTip } from \"../RichText/parse\";\nimport { SP_TYPE_TEXT, SP_TYPE_TIP, type SpType } from \"./sp\";\n\nconst props = withDefaults(\n defineProps<{\n /** 技力回复方式:auto 自动回复(绿)· attack 攻击回复(橙)· hit 受击回复(黄)· passive 被动(灰) */\n spType?: SpType;\n /** 悬停提示(data-ak-tip):默认是游戏内的说明(「每次攻击回复1点技力」),可改写;false 关掉 */\n tip?: string | false;\n }>(),\n { spType: \"auto\", tip: undefined },\n);\n\ndefineSlots<{\n /** 文字;默认「自动回复」「攻击回复」「受击回复」「被动」 */\n default?: () => unknown;\n}>();\n\nconst tipText = computed(() => (props.tip === false ? undefined : (props.tip ?? SP_TYPE_TIP[props.spType])));\n</script>\n\n<template>\n <span\n :class=\"['ak-sp', spType !== 'auto' && `ak-sp--${spType}`, isWideTip(tipText) && 'ak-tip--wide']\"\n :data-ak-tip=\"tipText\"\n >\n <slot>{{ SP_TYPE_TEXT[spType] }}</slot>\n </span>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nimport { isWideTip } from \"../RichText/parse\";\nimport { TRIGGER_TEXT, TRIGGER_TIP } from \"./sp\";\n\nconst props = withDefaults(\n defineProps<{\n /** 自动触发(灰底);默认手动触发(黑白反转) */\n auto?: boolean;\n /** 悬停提示(data-ak-tip):默认是游戏内的说明,可改写;false 关掉 */\n tip?: string | false;\n }>(),\n { tip: undefined },\n);\n\ndefineSlots<{\n /** 文字;默认「手动触发」/「自动触发」 */\n default?: () => unknown;\n}>();\n\nconst mode = computed(() => (props.auto ? \"auto\" : \"manual\"));\nconst tipText = computed(() => (props.tip === false ? undefined : (props.tip ?? TRIGGER_TIP[mode.value])));\n</script>\n\n<template>\n <span :class=\"['ak-sp-trigger', { 'ak-sp-trigger--auto': auto, 'ak-tip--wide': isWideTip(tipText) }]\" :data-ak-tip=\"tipText\">\n <slot>{{ TRIGGER_TEXT[mode] }}</slot>\n </span>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nimport { isWideTip } from \"../RichText/parse\";\nimport { TRIGGER_TEXT, TRIGGER_TIP } from \"./sp\";\n\nconst props = withDefaults(\n defineProps<{\n /** 自动触发(灰底);默认手动触发(黑白反转) */\n auto?: boolean;\n /** 悬停提示(data-ak-tip):默认是游戏内的说明,可改写;false 关掉 */\n tip?: string | false;\n }>(),\n { tip: undefined },\n);\n\ndefineSlots<{\n /** 文字;默认「手动触发」/「自动触发」 */\n default?: () => unknown;\n}>();\n\nconst mode = computed(() => (props.auto ? \"auto\" : \"manual\"));\nconst tipText = computed(() => (props.tip === false ? undefined : (props.tip ?? TRIGGER_TIP[mode.value])));\n</script>\n\n<template>\n <span :class=\"['ak-sp-trigger', { 'ak-sp-trigger--auto': auto, 'ak-tip--wide': isWideTip(tipText) }]\" :data-ak-tip=\"tipText\">\n <slot>{{ TRIGGER_TEXT[mode] }}</slot>\n </span>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nimport { isWideTip } from \"../RichText/parse\";\nimport { SP_VALUE_CLASS, SP_VALUE_NAME, SP_VALUE_TIP, type SpValueKind } from \"./sp\";\n\nconst props = withDefaults(\n defineProps<{\n /** 哪一枚芯片:cost 消耗(荧光绿闪电)· init 初始(▶)· duration 持续(⏱) */\n kind: SpValueKind;\n /** 数值;也可以写在默认插槽里(表头图例写「消耗」「初始」这种字) */\n value?: number | string;\n /** 悬停提示(data-ak-tip):默认是这一项的说明(「消耗:该技能所需要消耗的技力数」),可改写;false 关掉 */\n tip?: string | false;\n }>(),\n { value: undefined, tip: undefined },\n);\n\ndefineSlots<{\n /** 芯片里的字(代替 value) */\n default?: () => unknown;\n}>();\n\n/*\n * 图形是 CSS mask,读屏只念得出数字:写 value 时在数字前补一个看不见的名字(.ak-sr-only「消耗」)。\n * 提示长(一句话)时用可折行的宽气泡 .ak-tip--wide。\n */\nconst tipText = computed(() => (props.tip === false ? undefined : (props.tip ?? SP_VALUE_TIP[props.kind])));\n</script>\n\n<template>\n <span :class=\"[SP_VALUE_CLASS[kind], isWideTip(tipText) && 'ak-tip--wide']\" :data-ak-tip=\"tipText\">\n <slot><span class=\"ak-sr-only\">{{ SP_VALUE_NAME[kind] }}</span>{{ value }}</slot>\n </span>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nimport { isWideTip } from \"../RichText/parse\";\nimport { SP_VALUE_CLASS, SP_VALUE_NAME, SP_VALUE_TIP, type SpValueKind } from \"./sp\";\n\nconst props = withDefaults(\n defineProps<{\n /** 哪一枚芯片:cost 消耗(荧光绿闪电)· init 初始(▶)· duration 持续(⏱) */\n kind: SpValueKind;\n /** 数值;也可以写在默认插槽里(表头图例写「消耗」「初始」这种字) */\n value?: number | string;\n /** 悬停提示(data-ak-tip):默认是这一项的说明(「消耗:该技能所需要消耗的技力数」),可改写;false 关掉 */\n tip?: string | false;\n }>(),\n { value: undefined, tip: undefined },\n);\n\ndefineSlots<{\n /** 芯片里的字(代替 value) */\n default?: () => unknown;\n}>();\n\n/*\n * 图形是 CSS mask,读屏只念得出数字:写 value 时在数字前补一个看不见的名字(.ak-sr-only「消耗」)。\n * 提示长(一句话)时用可折行的宽气泡 .ak-tip--wide。\n */\nconst tipText = computed(() => (props.tip === false ? undefined : (props.tip ?? SP_VALUE_TIP[props.kind])));\n</script>\n\n<template>\n <span :class=\"[SP_VALUE_CLASS[kind], isWideTip(tipText) && 'ak-tip--wide']\" :data-ak-tip=\"tipText\">\n <slot><span class=\"ak-sr-only\">{{ SP_VALUE_NAME[kind] }}</span>{{ value }}</slot>\n </span>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nimport AkSp from \"../Sp/AkSp.vue\";\nimport AkSpTrigger from \"../Sp/AkSpTrigger.vue\";\nimport AkSpValue from \"../Sp/AkSpValue.vue\";\nimport type { SpType } from \"../Sp/sp\";\n\nconst props = withDefaults(\n defineProps<{\n /** 技能名 */\n name: string;\n /** 别名,跟在技能名后的灰色小字(干员页全等级表的表头):en 英文名(Bender 大写)· ja 日文名;要放别的内容用 #alias 插槽 */\n alias?: { en?: string; ja?: string };\n /** 技能图标地址(游戏 skill_icon,64px 见方) */\n icon?: string;\n /** 技力回复方式:决定图标描边 + 底条色与 SP 标签;auto 自动回复 · attack 攻击回复 · hit 受击回复 · passive 被动 */\n spType?: SpType;\n /** 触发方式:manual 手动触发 · auto 自动触发;不写不显示(被动技能) */\n trigger?: \"manual\" | \"auto\";\n /** 技力消耗;不写不显示 */\n cost?: number | string;\n /** 初始技力;不写不显示 */\n init?: number | string;\n /** 持续时间:数字按秒写成「25s」,字符串原样(「—」);不写不显示 */\n duration?: number | string;\n /** 开放条件(「技能2 · 精英一开放」),显示在右侧槽 */\n unlock?: string;\n /** 开放条件前的精英化图标地址 */\n unlockIcon?: string;\n /** 选中(蓝框 + 左上角标,游戏内 selected_back) */\n selected?: boolean;\n /** 未解锁:图标灰化 + 锁 */\n locked?: boolean;\n /** 技能名的标题级别(干员页正文里是 3,列表 / 侧栏里一般是 4) */\n headingLevel?: 2 | 3 | 4 | 5 | 6;\n }>(),\n {\n alias: undefined,\n icon: undefined,\n spType: \"auto\",\n trigger: undefined,\n cost: undefined,\n init: undefined,\n duration: undefined,\n unlock: undefined,\n unlockIcon: undefined,\n headingLevel: 4,\n },\n);\n\nconst slots = defineSlots<{\n /** 技能描述(游戏原始标记可以套 AkRichText) */\n default?: () => unknown;\n /** 技能名后的别名(代替 alias),放进 .ak-skill__alias */\n alias?: () => unknown;\n /** 名称行末尾的附加内容(「未解锁」标签等) */\n \"header-extra\"?: () => unknown;\n /** 右侧槽(开放条件之后):技能范围等;写了就是三栏的宽卡(.ak-skill--wide) */\n aside?: () => unknown;\n}>();\n\nconst hasAlias = computed(() => !!props.alias?.en || !!props.alias?.ja || !!slots.alias);\nconst wide = computed(() => !!props.unlock || !!slots.aside);\nconst hasStats = computed(() => props.cost !== undefined || props.init !== undefined || props.duration !== undefined);\nconst durationText = computed(() => (typeof props.duration === \"number\" ? `${props.duration}s` : props.duration));\n</script>\n\n<template>\n <div :class=\"['ak-skill', { 'ak-skill--wide': wide, 'is-selected': selected }]\">\n <div :class=\"['ak-skill__icon', `ak-skill__icon--${spType}`, { 'is-locked': locked }]\">\n <img v-if=\"icon\" :src=\"icon\" alt=\"\" />\n </div>\n <div>\n <div class=\"ak-skill__head\">\n <component :is=\"`h${headingLevel}`\" class=\"ak-skill__name\">{{ name }}</component>\n <span v-if=\"hasAlias\" class=\"ak-skill__alias\">\n <slot name=\"alias\">\n <span v-if=\"alias?.en\" class=\"ak-en\" lang=\"en\">{{ alias.en }}</span>\n <span v-if=\"alias?.ja\" lang=\"ja\">{{ alias.ja }}</span>\n </slot>\n </span>\n <AkSp :sp-type=\"spType\" />\n <AkSpTrigger v-if=\"trigger\" :auto=\"trigger === 'auto'\" />\n <slot name=\"header-extra\" />\n </div>\n <div v-if=\"hasStats\" class=\"ak-skill__stats\">\n <span v-if=\"cost !== undefined\"><AkSpValue kind=\"cost\" :value=\"cost\" /></span>\n <span v-if=\"init !== undefined\"><AkSpValue kind=\"init\" :value=\"init\" /></span>\n <span v-if=\"duration !== undefined\">持续 <b>{{ durationText }}</b></span>\n </div>\n </div>\n <div v-if=\"wide\" class=\"ak-skill__aside\">\n <span v-if=\"unlock\" class=\"ak-skill__open\"><img v-if=\"unlockIcon\" :src=\"unlockIcon\" alt=\"\" />{{ unlock }}</span>\n <slot name=\"aside\" />\n </div>\n <div v-if=\"$slots.default\" class=\"ak-skill__desc\"><slot /></div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nimport AkSp from \"../Sp/AkSp.vue\";\nimport AkSpTrigger from \"../Sp/AkSpTrigger.vue\";\nimport AkSpValue from \"../Sp/AkSpValue.vue\";\nimport type { SpType } from \"../Sp/sp\";\n\nconst props = withDefaults(\n defineProps<{\n /** 技能名 */\n name: string;\n /** 别名,跟在技能名后的灰色小字(干员页全等级表的表头):en 英文名(Bender 大写)· ja 日文名;要放别的内容用 #alias 插槽 */\n alias?: { en?: string; ja?: string };\n /** 技能图标地址(游戏 skill_icon,64px 见方) */\n icon?: string;\n /** 技力回复方式:决定图标描边 + 底条色与 SP 标签;auto 自动回复 · attack 攻击回复 · hit 受击回复 · passive 被动 */\n spType?: SpType;\n /** 触发方式:manual 手动触发 · auto 自动触发;不写不显示(被动技能) */\n trigger?: \"manual\" | \"auto\";\n /** 技力消耗;不写不显示 */\n cost?: number | string;\n /** 初始技力;不写不显示 */\n init?: number | string;\n /** 持续时间:数字按秒写成「25s」,字符串原样(「—」);不写不显示 */\n duration?: number | string;\n /** 开放条件(「技能2 · 精英一开放」),显示在右侧槽 */\n unlock?: string;\n /** 开放条件前的精英化图标地址 */\n unlockIcon?: string;\n /** 选中(蓝框 + 左上角标,游戏内 selected_back) */\n selected?: boolean;\n /** 未解锁:图标灰化 + 锁 */\n locked?: boolean;\n /** 技能名的标题级别(干员页正文里是 3,列表 / 侧栏里一般是 4) */\n headingLevel?: 2 | 3 | 4 | 5 | 6;\n }>(),\n {\n alias: undefined,\n icon: undefined,\n spType: \"auto\",\n trigger: undefined,\n cost: undefined,\n init: undefined,\n duration: undefined,\n unlock: undefined,\n unlockIcon: undefined,\n headingLevel: 4,\n },\n);\n\nconst slots = defineSlots<{\n /** 技能描述(游戏原始标记可以套 AkRichText) */\n default?: () => unknown;\n /** 技能名后的别名(代替 alias),放进 .ak-skill__alias */\n alias?: () => unknown;\n /** 名称行末尾的附加内容(「未解锁」标签等) */\n \"header-extra\"?: () => unknown;\n /** 右侧槽(开放条件之后):技能范围等;写了就是三栏的宽卡(.ak-skill--wide) */\n aside?: () => unknown;\n}>();\n\nconst hasAlias = computed(() => !!props.alias?.en || !!props.alias?.ja || !!slots.alias);\nconst wide = computed(() => !!props.unlock || !!slots.aside);\nconst hasStats = computed(() => props.cost !== undefined || props.init !== undefined || props.duration !== undefined);\nconst durationText = computed(() => (typeof props.duration === \"number\" ? `${props.duration}s` : props.duration));\n</script>\n\n<template>\n <div :class=\"['ak-skill', { 'ak-skill--wide': wide, 'is-selected': selected }]\">\n <div :class=\"['ak-skill__icon', `ak-skill__icon--${spType}`, { 'is-locked': locked }]\">\n <img v-if=\"icon\" :src=\"icon\" alt=\"\" />\n </div>\n <div>\n <div class=\"ak-skill__head\">\n <component :is=\"`h${headingLevel}`\" class=\"ak-skill__name\">{{ name }}</component>\n <span v-if=\"hasAlias\" class=\"ak-skill__alias\">\n <slot name=\"alias\">\n <span v-if=\"alias?.en\" class=\"ak-en\" lang=\"en\">{{ alias.en }}</span>\n <span v-if=\"alias?.ja\" lang=\"ja\">{{ alias.ja }}</span>\n </slot>\n </span>\n <AkSp :sp-type=\"spType\" />\n <AkSpTrigger v-if=\"trigger\" :auto=\"trigger === 'auto'\" />\n <slot name=\"header-extra\" />\n </div>\n <div v-if=\"hasStats\" class=\"ak-skill__stats\">\n <span v-if=\"cost !== undefined\"><AkSpValue kind=\"cost\" :value=\"cost\" /></span>\n <span v-if=\"init !== undefined\"><AkSpValue kind=\"init\" :value=\"init\" /></span>\n <span v-if=\"duration !== undefined\">持续 <b>{{ durationText }}</b></span>\n </div>\n </div>\n <div v-if=\"wide\" class=\"ak-skill__aside\">\n <span v-if=\"unlock\" class=\"ak-skill__open\"><img v-if=\"unlockIcon\" :src=\"unlockIcon\" alt=\"\" />{{ unlock }}</span>\n <slot name=\"aside\" />\n </div>\n <div v-if=\"$slots.default\" class=\"ak-skill__desc\"><slot /></div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * (内部)技能等级的写法,等级选择器 / 全等级表 / 参数矩阵共用:1–7 是数字,8–10 是专精 Ⅰ–Ⅲ。\n * 专精画游戏图标(specialized_tiny_N,由调用方给地址);numeral 时图标后再跟罗马数字(表格里);没给图标时写 M1–M3。\n */\ndefineProps<{\n /** 1–10(8–10 = 专精 Ⅰ–Ⅲ) */\n level: number;\n /** 专精 Ⅰ–Ⅲ 的图标地址 */\n icons?: readonly string[];\n /** 图标后跟罗马数字 */\n numeral?: boolean;\n}>();\n\nconst NUMERALS = [\"Ⅰ\", \"Ⅱ\", \"Ⅲ\"];\n</script>\n\n<template>\n <template v-if=\"level <= 7\">{{ level }}</template>\n <template v-else-if=\"icons?.[level - 8]\">\n <img :src=\"icons[level - 8]\" :alt=\"`专精${level - 7}`\" /><span v-if=\"numeral\" aria-hidden=\"true\">{{ NUMERALS[level - 8] }}</span>\n </template>\n <template v-else><span aria-hidden=\"true\">M{{ level - 7 }}</span><span class=\"ak-sr-only\">专精{{ level - 7 }}</span></template>\n</template>\n","<script setup lang=\"ts\">\n/**\n * (内部)技能等级的写法,等级选择器 / 全等级表 / 参数矩阵共用:1–7 是数字,8–10 是专精 Ⅰ–Ⅲ。\n * 专精画游戏图标(specialized_tiny_N,由调用方给地址);numeral 时图标后再跟罗马数字(表格里);没给图标时写 M1–M3。\n */\ndefineProps<{\n /** 1–10(8–10 = 专精 Ⅰ–Ⅲ) */\n level: number;\n /** 专精 Ⅰ–Ⅲ 的图标地址 */\n icons?: readonly string[];\n /** 图标后跟罗马数字 */\n numeral?: boolean;\n}>();\n\nconst NUMERALS = [\"Ⅰ\", \"Ⅱ\", \"Ⅲ\"];\n</script>\n\n<template>\n <template v-if=\"level <= 7\">{{ level }}</template>\n <template v-else-if=\"icons?.[level - 8]\">\n <img :src=\"icons[level - 8]\" :alt=\"`专精${level - 7}`\" /><span v-if=\"numeral\" aria-hidden=\"true\">{{ NUMERALS[level - 8] }}</span>\n </template>\n <template v-else><span aria-hidden=\"true\">M{{ level - 7 }}</span><span class=\"ak-sr-only\">专精{{ level - 7 }}</span></template>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, nextTick } from \"vue\";\n\nimport LevelLabel from \"../Skill/LevelLabel.vue\";\n\nconst props = withDefaults(\n defineProps<{\n /** 最高等级:7 = 只有 1–7(三星及以下 / 未精二),10 = 再加专精 Ⅰ–Ⅲ */\n max?: number;\n /** 专精 Ⅰ–Ⅲ 的图标地址(游戏 specialized_tiny_1–3);不给时写 M1–M3 */\n masteryIcons?: readonly string[];\n /** 读屏用的组名 */\n label?: string;\n /** 整组禁用 */\n disabled?: boolean;\n }>(),\n { max: 10, masteryIcons: undefined, label: \"技能等级\" },\n);\n\n/** 当前等级 1–10(8–10 = 专精 Ⅰ–Ⅲ);不绑定时没有选中项 */\nconst model = defineModel<number>();\n\nconst levels = computed(() => Array.from({ length: props.max }, (_, i) => i + 1));\n/** roving tabindex:Tab 只停在选中项上(没选中时停在第一项) */\nconst tabStop = computed(() => (model.value && model.value <= props.max ? model.value : 1));\n\n/** 类名;普通等级未选中时不输出 class 属性(同 CSS 实现里的 <button>1</button>) */\nconst btnClass = (lv: number) => [lv === model.value && \"is-active\", lv > 7 && \"is-mastery\"].filter(Boolean).join(\" \") || undefined;\n\n/** 方向键 / Home / End 移到上一级 / 下一级并选中(WAI-ARIA Radio Group) */\nfunction onKey(e: KeyboardEvent) {\n const n = props.max;\n const i = tabStop.value;\n const to =\n e.key === \"ArrowRight\" || e.key === \"ArrowDown\" ? (i % n) + 1\n : e.key === \"ArrowLeft\" || e.key === \"ArrowUp\" ? ((i - 2 + n) % n) + 1\n : e.key === \"Home\" ? 1\n : e.key === \"End\" ? n\n : undefined;\n if (!to) return;\n e.preventDefault();\n model.value = to;\n const group = e.currentTarget as HTMLElement;\n nextTick(() => (group.children[to - 1] as HTMLElement | undefined)?.focus());\n}\n</script>\n\n<template>\n <!-- data-no-toggle:皮肤脚本会替模板输出的 .ak-skill-levels 翻 is-active 并发 akds:select,这里的选中只看 v-model -->\n <div class=\"ak-skill-levels\" role=\"radiogroup\" :aria-label=\"label\" :aria-disabled=\"disabled || undefined\" data-no-toggle @keydown=\"onKey\">\n <button\n v-for=\"lv in levels\"\n :key=\"lv\"\n type=\"button\"\n role=\"radio\"\n :class=\"btnClass(lv)\"\n :aria-checked=\"lv === model\"\n :tabindex=\"lv === tabStop ? 0 : -1\"\n :disabled=\"disabled\"\n @click=\"model = lv\"\n >\n <LevelLabel :level=\"lv\" :icons=\"masteryIcons\" />\n </button>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, nextTick } from \"vue\";\n\nimport LevelLabel from \"../Skill/LevelLabel.vue\";\n\nconst props = withDefaults(\n defineProps<{\n /** 最高等级:7 = 只有 1–7(三星及以下 / 未精二),10 = 再加专精 Ⅰ–Ⅲ */\n max?: number;\n /** 专精 Ⅰ–Ⅲ 的图标地址(游戏 specialized_tiny_1–3);不给时写 M1–M3 */\n masteryIcons?: readonly string[];\n /** 读屏用的组名 */\n label?: string;\n /** 整组禁用 */\n disabled?: boolean;\n }>(),\n { max: 10, masteryIcons: undefined, label: \"技能等级\" },\n);\n\n/** 当前等级 1–10(8–10 = 专精 Ⅰ–Ⅲ);不绑定时没有选中项 */\nconst model = defineModel<number>();\n\nconst levels = computed(() => Array.from({ length: props.max }, (_, i) => i + 1));\n/** roving tabindex:Tab 只停在选中项上(没选中时停在第一项) */\nconst tabStop = computed(() => (model.value && model.value <= props.max ? model.value : 1));\n\n/** 类名;普通等级未选中时不输出 class 属性(同 CSS 实现里的 <button>1</button>) */\nconst btnClass = (lv: number) => [lv === model.value && \"is-active\", lv > 7 && \"is-mastery\"].filter(Boolean).join(\" \") || undefined;\n\n/** 方向键 / Home / End 移到上一级 / 下一级并选中(WAI-ARIA Radio Group) */\nfunction onKey(e: KeyboardEvent) {\n const n = props.max;\n const i = tabStop.value;\n const to =\n e.key === \"ArrowRight\" || e.key === \"ArrowDown\" ? (i % n) + 1\n : e.key === \"ArrowLeft\" || e.key === \"ArrowUp\" ? ((i - 2 + n) % n) + 1\n : e.key === \"Home\" ? 1\n : e.key === \"End\" ? n\n : undefined;\n if (!to) return;\n e.preventDefault();\n model.value = to;\n const group = e.currentTarget as HTMLElement;\n nextTick(() => (group.children[to - 1] as HTMLElement | undefined)?.focus());\n}\n</script>\n\n<template>\n <!-- data-no-toggle:皮肤脚本会替模板输出的 .ak-skill-levels 翻 is-active 并发 akds:select,这里的选中只看 v-model -->\n <div class=\"ak-skill-levels\" role=\"radiogroup\" :aria-label=\"label\" :aria-disabled=\"disabled || undefined\" data-no-toggle @keydown=\"onKey\">\n <button\n v-for=\"lv in levels\"\n :key=\"lv\"\n type=\"button\"\n role=\"radio\"\n :class=\"btnClass(lv)\"\n :aria-checked=\"lv === model\"\n :tabindex=\"lv === tabStop ? 0 : -1\"\n :disabled=\"disabled\"\n @click=\"model = lv\"\n >\n <LevelLabel :level=\"lv\" :icons=\"masteryIcons\" />\n </button>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport AkRichText from \"../RichText/AkRichText.vue\";\nimport LevelLabel from \"../Skill/LevelLabel.vue\";\nimport AkSpValue from \"../Sp/AkSpValue.vue\";\n\n/** 一个技能等级(第 i 项 = 等级 i+1,第 8–10 项 = 专精 Ⅰ–Ⅲ) */\nexport interface SkillSheetLevel {\n /** 描述:游戏原始标记(<@ba.vup>…</>、{atk_scale:0%}),由 AkRichText 渲染 */\n description: string;\n /** 描述里占位符的取值(这一级的 blackboard) */\n vars?: Record<string, number | string>;\n /** 初始技力 */\n init?: number | string;\n /** 技力消耗 */\n cost?: number | string;\n /** 持续时间(秒);没有就空着(表里显示「—」) */\n duration?: number | string;\n}\n\nconst props = withDefaults(\n defineProps<{\n /** 各级数据:1–7 级,之后是专精 Ⅰ–Ⅲ(三星及以下只有 7 项) */\n levels: SkillSheetLevel[];\n /** 高亮一行(当前等级,1–10);常与 AkSkillLevels 的 v-model 绑同一个值 */\n highlight?: number;\n /** 专精 Ⅰ–Ⅲ 的图标地址(游戏 specialized_tiny_1–3);不给时写 M1–M3 */\n masteryIcons?: readonly string[];\n /** 术语说明(termDescriptionDict),给描述里 <$ba.xxx> 的悬停提示 */\n terms?: Record<string, string>;\n /** 表格的可访问名(如「鞘击 · 各等级数据」) */\n label?: string;\n }>(),\n { highlight: undefined, masteryIcons: undefined, terms: undefined, label: undefined },\n);\n\ndefineSlots<{\n /** 表头卡:一般放 <AkSkill>(名称 / SP 类型 / 开放条件 / 范围),不写 cost / init,名称行居中对齐图标 */\n header?: () => unknown;\n /** 表下的注释(.ak-skill-sheet__note,每条一个 <p>:「※不可对空」) */\n footer?: () => unknown;\n /** 自己画某一级的描述(代替 AkRichText):{ row, level } */\n description?: (p: { row: SkillSheetLevel; level: number }) => unknown;\n}>();\n\n/** 行的类名:专精行 .is-mastery,高亮行 .is-hl;都没有时不输出 class */\nconst rowClass = (level: number) => [level > 7 && \"is-mastery\", level === props.highlight && \"is-hl\"].filter(Boolean).join(\" \") || undefined;\n/** 数值格:没有值时整格留空(CSS 的 :empty 画「—」),不能留空文字结点 */\nconst num = (v: number | string | undefined) => (v === undefined || v === \"\" ? \"\" : String(v));\n</script>\n\n<template>\n <div class=\"ak-skill-sheet\">\n <slot name=\"header\" />\n <table class=\"ak-skill-table\" :aria-label=\"label\">\n <thead>\n <tr>\n <th class=\"lv\" scope=\"col\">等级</th>\n <th class=\"desc\" scope=\"col\">描述</th>\n <th class=\"num\" scope=\"col\"><AkSpValue kind=\"init\">初始</AkSpValue></th>\n <th class=\"num\" scope=\"col\"><AkSpValue kind=\"cost\">消耗</AkSpValue></th>\n <th class=\"num\" scope=\"col\"><AkSpValue kind=\"duration\">持续</AkSpValue></th>\n </tr>\n </thead>\n <tbody>\n <tr v-for=\"(row, i) in levels\" :key=\"i\" :class=\"rowClass(i + 1)\" :aria-current=\"i + 1 === highlight || undefined\">\n <td class=\"lv\"><LevelLabel :level=\"i + 1\" :icons=\"masteryIcons\" numeral /></td>\n <td class=\"desc\">\n <slot name=\"description\" :row=\"row\" :level=\"i + 1\">\n <AkRichText :text=\"row.description\" :vars=\"row.vars\" :terms=\"terms\" />\n </slot>\n </td>\n <td class=\"num\" v-text=\"num(row.init)\" />\n <td class=\"num\" v-text=\"num(row.cost)\" />\n <td class=\"num\" v-text=\"num(row.duration)\" />\n </tr>\n </tbody>\n </table>\n <div v-if=\"$slots.footer\" class=\"ak-skill-sheet__note\"><slot name=\"footer\" /></div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport AkRichText from \"../RichText/AkRichText.vue\";\nimport LevelLabel from \"../Skill/LevelLabel.vue\";\nimport AkSpValue from \"../Sp/AkSpValue.vue\";\n\n/** 一个技能等级(第 i 项 = 等级 i+1,第 8–10 项 = 专精 Ⅰ–Ⅲ) */\nexport interface SkillSheetLevel {\n /** 描述:游戏原始标记(<@ba.vup>…</>、{atk_scale:0%}),由 AkRichText 渲染 */\n description: string;\n /** 描述里占位符的取值(这一级的 blackboard) */\n vars?: Record<string, number | string>;\n /** 初始技力 */\n init?: number | string;\n /** 技力消耗 */\n cost?: number | string;\n /** 持续时间(秒);没有就空着(表里显示「—」) */\n duration?: number | string;\n}\n\nconst props = withDefaults(\n defineProps<{\n /** 各级数据:1–7 级,之后是专精 Ⅰ–Ⅲ(三星及以下只有 7 项) */\n levels: SkillSheetLevel[];\n /** 高亮一行(当前等级,1–10);常与 AkSkillLevels 的 v-model 绑同一个值 */\n highlight?: number;\n /** 专精 Ⅰ–Ⅲ 的图标地址(游戏 specialized_tiny_1–3);不给时写 M1–M3 */\n masteryIcons?: readonly string[];\n /** 术语说明(termDescriptionDict),给描述里 <$ba.xxx> 的悬停提示 */\n terms?: Record<string, string>;\n /** 表格的可访问名(如「鞘击 · 各等级数据」) */\n label?: string;\n }>(),\n { highlight: undefined, masteryIcons: undefined, terms: undefined, label: undefined },\n);\n\ndefineSlots<{\n /** 表头卡:一般放 <AkSkill>(名称 / SP 类型 / 开放条件 / 范围),不写 cost / init,名称行居中对齐图标 */\n header?: () => unknown;\n /** 表下的注释(.ak-skill-sheet__note,每条一个 <p>:「※不可对空」) */\n footer?: () => unknown;\n /** 自己画某一级的描述(代替 AkRichText):{ row, level } */\n description?: (p: { row: SkillSheetLevel; level: number }) => unknown;\n}>();\n\n/** 行的类名:专精行 .is-mastery,高亮行 .is-hl;都没有时不输出 class */\nconst rowClass = (level: number) => [level > 7 && \"is-mastery\", level === props.highlight && \"is-hl\"].filter(Boolean).join(\" \") || undefined;\n/** 数值格:没有值时整格留空(CSS 的 :empty 画「—」),不能留空文字结点 */\nconst num = (v: number | string | undefined) => (v === undefined || v === \"\" ? \"\" : String(v));\n</script>\n\n<template>\n <div class=\"ak-skill-sheet\">\n <slot name=\"header\" />\n <table class=\"ak-skill-table\" :aria-label=\"label\">\n <thead>\n <tr>\n <th class=\"lv\" scope=\"col\">等级</th>\n <th class=\"desc\" scope=\"col\">描述</th>\n <th class=\"num\" scope=\"col\"><AkSpValue kind=\"init\">初始</AkSpValue></th>\n <th class=\"num\" scope=\"col\"><AkSpValue kind=\"cost\">消耗</AkSpValue></th>\n <th class=\"num\" scope=\"col\"><AkSpValue kind=\"duration\">持续</AkSpValue></th>\n </tr>\n </thead>\n <tbody>\n <tr v-for=\"(row, i) in levels\" :key=\"i\" :class=\"rowClass(i + 1)\" :aria-current=\"i + 1 === highlight || undefined\">\n <td class=\"lv\"><LevelLabel :level=\"i + 1\" :icons=\"masteryIcons\" numeral /></td>\n <td class=\"desc\">\n <slot name=\"description\" :row=\"row\" :level=\"i + 1\">\n <AkRichText :text=\"row.description\" :vars=\"row.vars\" :terms=\"terms\" />\n </slot>\n </td>\n <td class=\"num\" v-text=\"num(row.init)\" />\n <td class=\"num\" v-text=\"num(row.cost)\" />\n <td class=\"num\" v-text=\"num(row.duration)\" />\n </tr>\n </tbody>\n </table>\n <div v-if=\"$slots.footer\" class=\"ak-skill-sheet__note\"><slot name=\"footer\" /></div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, nextTick, ref } from \"vue\";\n\nimport AkRichText from \"../RichText/AkRichText.vue\";\nimport LevelLabel from \"../Skill/LevelLabel.vue\";\nimport AkSpValue from \"../Sp/AkSpValue.vue\";\nimport type { SpValueKind } from \"../Sp/sp\";\n\n/** 矩阵的一行:一个参数在各级的值 */\nexport interface SkillMatrixRow {\n /** 描述模板里的占位符名({key});写了这一行就对应描述里的一个变量位 */\n key?: string;\n /** 参数名(「伤害倍率」「晕眩(秒)」);sp 行是芯片里的字 */\n label: string;\n /** 用 SP 芯片当参数名:init 初始 · cost 消耗 · duration 持续 */\n sp?: SpValueKind;\n /** 各级的值(已经写好的字,「200%」):第 i 项 = 等级 i+1,第 8–10 项 = 专精 Ⅰ–Ⅲ */\n values: (number | string)[];\n}\n\nconst props = withDefaults(\n defineProps<{\n /** 参数行 */\n rows: SkillMatrixRow[];\n /** 描述模板(游戏原始标记):只写一遍,{key} 变量位画成 .ak-var——平时是区间(200%→320%),悬停 / 选中某一列时换成该级的值 */\n description?: string;\n /** 专精 Ⅰ–Ⅲ 的图标地址(游戏 specialized_tiny_1–3);不给时写 M1–M3 */\n masteryIcons?: readonly string[];\n /** 术语说明(termDescriptionDict),给描述里 <$ba.xxx> 的悬停提示 */\n terms?: Record<string, string>;\n /** 表格的可访问名(如「鞘击 · 各等级参数」) */\n label?: string;\n }>(),\n { description: undefined, masteryIcons: undefined, terms: undefined, label: undefined },\n);\n\n/** 钉住的一列(等级 1–10,没有是 undefined):点列里任一格 / 列头按钮钉住、再点取消;可以和 AkSkillLevels 绑同一个值 */\nconst model = defineModel<number>();\n\ndefineSlots<{\n /** 表头卡:一般放 <AkSkill>(名称 / SP 类型 / 开放条件 / 范围) */\n header?: () => unknown;\n /** 表下的注释(.ak-skill-sheet__note,每条一个 <p>) */\n footer?: () => unknown;\n /** 自己画描述(代替 description):level = 正在看的等级(没有是 undefined),value(key) = 该变量此刻该显示的字 */\n description?: (p: { level: number | undefined; value: (key: string) => string }) => unknown;\n}>();\n\n/** 列数 = 最长那行的值个数 */\nconst count = computed(() => Math.max(0, ...props.rows.map(r => r.values.length)));\nconst levels = computed(() => Array.from({ length: count.value }, (_, i) => i + 1));\n\n/** 悬停 / 键盘聚焦中的列;离开就回到钉住的列 */\nconst hovered = ref<number>();\nconst shown = computed(() => hovered.value ?? model.value);\n\n/** 变量位此刻的字:看某一列时是该级的值,否则是「首级→末级」区间(没变化就一个值) */\nfunction valueOf(key: string): string {\n const row = props.rows.find(r => r.key?.toLowerCase() === key.toLowerCase());\n if (!row) return `{${key}}`;\n if (shown.value) return String(row.values[shown.value - 1] ?? \"\");\n const first = String(row.values[0] ?? \"\");\n const last = String(row.values.at(-1) ?? \"\");\n return first === last ? first : `${first}→${last}`;\n}\n\n/** 格子的类名:7 与专精 Ⅰ 之间的分隔 .m-start、列头专精色 .is-mastery、当前列 .is-hl、较上一级有变化 .is-up */\nfunction cellClass(level: number, extra?: Record<string, boolean>) {\n const c = [level === 8 && \"m-start\", level === shown.value && \"is-hl\", ...Object.entries(extra ?? {}).map(([k, v]) => v && k)];\n return c.filter(Boolean).join(\" \") || undefined;\n}\nconst isUp = (row: SkillMatrixRow, i: number) => i === 0 || String(row.values[i]) !== String(row.values[i - 1]);\n\n/** 鼠标:悬停某格 → 整列高亮;点某格 → 钉住 / 取消(第 0 列是参数名,不算) */\nfunction columnOf(e: Event) {\n const cell = (e.target as Element).closest(\"th, td\") as HTMLTableCellElement | null;\n return cell && cell.cellIndex > 0 && cell.cellIndex <= count.value ? cell.cellIndex : null;\n}\nfunction onOver(e: MouseEvent) {\n const col = columnOf(e);\n if (col) hovered.value = col;\n}\nfunction onClick(e: MouseEvent) {\n const col = columnOf(e);\n if (col) model.value = model.value === col ? undefined : col;\n}\n\n/** 列头按钮:roving tabindex(Tab 只停一个:上次聚焦的列,否则钉住的列,否则第 1 列),←/→/Home/End 在列间移动;聚焦即预览该列,Enter / Space 钉住 */\nconst focused = ref<number>();\nconst tabStop = computed(() => focused.value ?? model.value ?? 1);\nfunction onFocus(level: number) {\n focused.value = level;\n hovered.value = level;\n}\nfunction onKey(e: KeyboardEvent, level: number) {\n const n = count.value;\n const to =\n e.key === \"ArrowRight\" ? (level % n) + 1\n : e.key === \"ArrowLeft\" ? ((level - 2 + n) % n) + 1\n : e.key === \"Home\" ? 1\n : e.key === \"End\" ? n\n : undefined;\n if (!to) return;\n e.preventDefault();\n const row = (e.currentTarget as HTMLElement).closest(\"tr\")!;\n nextTick(() => row.cells[to]?.querySelector(\"button\")?.focus());\n}\n</script>\n\n<template>\n <div class=\"ak-skill-sheet\">\n <slot name=\"header\" />\n <div v-if=\"description !== undefined || $slots.description\" class=\"ak-skill-sheet__tpl\">\n <slot name=\"description\" :level=\"shown\" :value=\"valueOf\">\n <AkRichText :text=\"description\" :terms=\"terms\">\n <template #var=\"{ key }\"><span class=\"ak-var\" :data-var=\"key\">{{ valueOf(key) }}</span></template>\n </AkRichText>\n </slot>\n </div>\n <!-- data-no-toggle:皮肤脚本会给页面里的 .ak-skill-matrix 绑一套列高亮 / .ak-var 换值(wikipage.content 时也会扫),这里自己管 -->\n <table class=\"ak-skill-matrix\" :aria-label=\"label\" data-no-toggle @mouseover=\"onOver\" @mouseleave=\"hovered = undefined\" @click=\"onClick\">\n <colgroup><col class=\"label\" /></colgroup>\n <thead>\n <tr>\n <th scope=\"col\">等级</th>\n <th v-for=\"lv in levels\" :key=\"lv\" scope=\"col\" :class=\"cellClass(lv, { 'is-mastery': lv > 7 })\">\n <button\n type=\"button\"\n :aria-pressed=\"model === lv\"\n :tabindex=\"lv === tabStop ? 0 : -1\"\n @focus=\"onFocus(lv)\"\n @blur=\"hovered = undefined\"\n @keydown=\"onKey($event, lv)\"\n >\n <LevelLabel :level=\"lv\" :icons=\"masteryIcons\" numeral />\n </button>\n </th>\n </tr>\n </thead>\n <tbody>\n <tr v-for=\"(row, r) in rows\" :key=\"row.key ?? r\" :data-var=\"row.key\">\n <th scope=\"row\">\n <AkSpValue v-if=\"row.sp\" :kind=\"row.sp\">{{ row.label }}</AkSpValue>\n <template v-else>{{ row.label }}</template>\n </th>\n <td v-for=\"lv in levels\" :key=\"lv\" :class=\"cellClass(lv, { 'is-up': isUp(row, lv - 1) })\">{{ row.values[lv - 1] }}</td>\n </tr>\n </tbody>\n </table>\n <div v-if=\"$slots.footer\" class=\"ak-skill-sheet__note\"><slot name=\"footer\" /></div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, nextTick, ref } from \"vue\";\n\nimport AkRichText from \"../RichText/AkRichText.vue\";\nimport LevelLabel from \"../Skill/LevelLabel.vue\";\nimport AkSpValue from \"../Sp/AkSpValue.vue\";\nimport type { SpValueKind } from \"../Sp/sp\";\n\n/** 矩阵的一行:一个参数在各级的值 */\nexport interface SkillMatrixRow {\n /** 描述模板里的占位符名({key});写了这一行就对应描述里的一个变量位 */\n key?: string;\n /** 参数名(「伤害倍率」「晕眩(秒)」);sp 行是芯片里的字 */\n label: string;\n /** 用 SP 芯片当参数名:init 初始 · cost 消耗 · duration 持续 */\n sp?: SpValueKind;\n /** 各级的值(已经写好的字,「200%」):第 i 项 = 等级 i+1,第 8–10 项 = 专精 Ⅰ–Ⅲ */\n values: (number | string)[];\n}\n\nconst props = withDefaults(\n defineProps<{\n /** 参数行 */\n rows: SkillMatrixRow[];\n /** 描述模板(游戏原始标记):只写一遍,{key} 变量位画成 .ak-var——平时是区间(200%→320%),悬停 / 选中某一列时换成该级的值 */\n description?: string;\n /** 专精 Ⅰ–Ⅲ 的图标地址(游戏 specialized_tiny_1–3);不给时写 M1–M3 */\n masteryIcons?: readonly string[];\n /** 术语说明(termDescriptionDict),给描述里 <$ba.xxx> 的悬停提示 */\n terms?: Record<string, string>;\n /** 表格的可访问名(如「鞘击 · 各等级参数」) */\n label?: string;\n }>(),\n { description: undefined, masteryIcons: undefined, terms: undefined, label: undefined },\n);\n\n/** 钉住的一列(等级 1–10,没有是 undefined):点列里任一格 / 列头按钮钉住、再点取消;可以和 AkSkillLevels 绑同一个值 */\nconst model = defineModel<number>();\n\ndefineSlots<{\n /** 表头卡:一般放 <AkSkill>(名称 / SP 类型 / 开放条件 / 范围) */\n header?: () => unknown;\n /** 表下的注释(.ak-skill-sheet__note,每条一个 <p>) */\n footer?: () => unknown;\n /** 自己画描述(代替 description):level = 正在看的等级(没有是 undefined),value(key) = 该变量此刻该显示的字 */\n description?: (p: { level: number | undefined; value: (key: string) => string }) => unknown;\n}>();\n\n/** 列数 = 最长那行的值个数 */\nconst count = computed(() => Math.max(0, ...props.rows.map(r => r.values.length)));\nconst levels = computed(() => Array.from({ length: count.value }, (_, i) => i + 1));\n\n/** 悬停 / 键盘聚焦中的列;离开就回到钉住的列 */\nconst hovered = ref<number>();\nconst shown = computed(() => hovered.value ?? model.value);\n\n/** 变量位此刻的字:看某一列时是该级的值,否则是「首级→末级」区间(没变化就一个值) */\nfunction valueOf(key: string): string {\n const row = props.rows.find(r => r.key?.toLowerCase() === key.toLowerCase());\n if (!row) return `{${key}}`;\n if (shown.value) return String(row.values[shown.value - 1] ?? \"\");\n const first = String(row.values[0] ?? \"\");\n const last = String(row.values.at(-1) ?? \"\");\n return first === last ? first : `${first}→${last}`;\n}\n\n/** 格子的类名:7 与专精 Ⅰ 之间的分隔 .m-start、列头专精色 .is-mastery、当前列 .is-hl、较上一级有变化 .is-up */\nfunction cellClass(level: number, extra?: Record<string, boolean>) {\n const c = [level === 8 && \"m-start\", level === shown.value && \"is-hl\", ...Object.entries(extra ?? {}).map(([k, v]) => v && k)];\n return c.filter(Boolean).join(\" \") || undefined;\n}\nconst isUp = (row: SkillMatrixRow, i: number) => i === 0 || String(row.values[i]) !== String(row.values[i - 1]);\n\n/** 鼠标:悬停某格 → 整列高亮;点某格 → 钉住 / 取消(第 0 列是参数名,不算) */\nfunction columnOf(e: Event) {\n const cell = (e.target as Element).closest(\"th, td\") as HTMLTableCellElement | null;\n return cell && cell.cellIndex > 0 && cell.cellIndex <= count.value ? cell.cellIndex : null;\n}\nfunction onOver(e: MouseEvent) {\n const col = columnOf(e);\n if (col) hovered.value = col;\n}\nfunction onClick(e: MouseEvent) {\n const col = columnOf(e);\n if (col) model.value = model.value === col ? undefined : col;\n}\n\n/** 列头按钮:roving tabindex(Tab 只停一个:上次聚焦的列,否则钉住的列,否则第 1 列),←/→/Home/End 在列间移动;聚焦即预览该列,Enter / Space 钉住 */\nconst focused = ref<number>();\nconst tabStop = computed(() => focused.value ?? model.value ?? 1);\nfunction onFocus(level: number) {\n focused.value = level;\n hovered.value = level;\n}\nfunction onKey(e: KeyboardEvent, level: number) {\n const n = count.value;\n const to =\n e.key === \"ArrowRight\" ? (level % n) + 1\n : e.key === \"ArrowLeft\" ? ((level - 2 + n) % n) + 1\n : e.key === \"Home\" ? 1\n : e.key === \"End\" ? n\n : undefined;\n if (!to) return;\n e.preventDefault();\n const row = (e.currentTarget as HTMLElement).closest(\"tr\")!;\n nextTick(() => row.cells[to]?.querySelector(\"button\")?.focus());\n}\n</script>\n\n<template>\n <div class=\"ak-skill-sheet\">\n <slot name=\"header\" />\n <div v-if=\"description !== undefined || $slots.description\" class=\"ak-skill-sheet__tpl\">\n <slot name=\"description\" :level=\"shown\" :value=\"valueOf\">\n <AkRichText :text=\"description\" :terms=\"terms\">\n <template #var=\"{ key }\"><span class=\"ak-var\" :data-var=\"key\">{{ valueOf(key) }}</span></template>\n </AkRichText>\n </slot>\n </div>\n <!-- data-no-toggle:皮肤脚本会给页面里的 .ak-skill-matrix 绑一套列高亮 / .ak-var 换值(wikipage.content 时也会扫),这里自己管 -->\n <table class=\"ak-skill-matrix\" :aria-label=\"label\" data-no-toggle @mouseover=\"onOver\" @mouseleave=\"hovered = undefined\" @click=\"onClick\">\n <colgroup><col class=\"label\" /></colgroup>\n <thead>\n <tr>\n <th scope=\"col\">等级</th>\n <th v-for=\"lv in levels\" :key=\"lv\" scope=\"col\" :class=\"cellClass(lv, { 'is-mastery': lv > 7 })\">\n <button\n type=\"button\"\n :aria-pressed=\"model === lv\"\n :tabindex=\"lv === tabStop ? 0 : -1\"\n @focus=\"onFocus(lv)\"\n @blur=\"hovered = undefined\"\n @keydown=\"onKey($event, lv)\"\n >\n <LevelLabel :level=\"lv\" :icons=\"masteryIcons\" numeral />\n </button>\n </th>\n </tr>\n </thead>\n <tbody>\n <tr v-for=\"(row, r) in rows\" :key=\"row.key ?? r\" :data-var=\"row.key\">\n <th scope=\"row\">\n <AkSpValue v-if=\"row.sp\" :kind=\"row.sp\">{{ row.label }}</AkSpValue>\n <template v-else>{{ row.label }}</template>\n </th>\n <td v-for=\"lv in levels\" :key=\"lv\" :class=\"cellClass(lv, { 'is-up': isUp(row, lv - 1) })\">{{ row.values[lv - 1] }}</td>\n </tr>\n </tbody>\n </table>\n <div v-if=\"$slots.footer\" class=\"ak-skill-sheet__note\"><slot name=\"footer\" /></div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nimport AkRichText from \"../RichText/AkRichText.vue\";\n\n/** 天赋表的一行:一个条件下的效果 */\nexport interface TalentRow {\n /** 天赋名;相邻几行同名时合并成一格(rowspan) */\n name: string;\n /** 条件(「精英二 · Y模组 2级」);要放精英化图标时用 #condition 插槽 */\n condition?: string;\n /** 描述:游戏原始标记(<@ba.vup>…</>),由 AkRichText 渲染 */\n description: string;\n /** 潜能加成后的描述(潜能开关打开时换成它;加成部分一般是 <@ba.talpu>(+1%)</>);不写就没有潜能版 */\n potential?: string;\n}\n\nconst props = withDefaults(\n defineProps<{\n /** 第一列的列头(「第一天赋」「第二天赋」) */\n title: string;\n /** 各条件下的效果 */\n rows: TalentRow[];\n /** 潜能开关上写的潜能等级(「潜能5」);有任一行写了 potential 才出现开关 */\n potentialRank?: number;\n /** 潜能开关上的潜能图标地址(游戏 potential_N) */\n potentialIcon?: string;\n /** 表头显示「算法」开关——描述里用 AkCalc 标了加成项进公式的方式时打开;打开后表尾有图例行 */\n calcToggle?: boolean;\n /** 术语说明(termDescriptionDict),给描述里 <$ba.xxx> 的悬停提示 */\n terms?: Record<string, string>;\n }>(),\n { potentialRank: undefined, potentialIcon: undefined, terms: undefined },\n);\n\n/** 潜能加成开关:打开时描述换成潜能版(表上 .is-pot) */\nconst potential = defineModel<boolean>({ default: false });\n/** 算法标记开关:打开时每个加成项前露出 AkCalc、表尾出图例(表上 .is-calc) */\nconst calc = defineModel<boolean>(\"calc\", { default: false });\n\ndefineSlots<{\n /** 自己画条件格(放精英化图标等):{ row, index } */\n condition?: (p: { row: TalentRow; index: number }) => unknown;\n /** 自己画描述(要标 AkCalc 时用):potential = 这是潜能版还是基础版(有潜能版的行调两次) */\n description?: (p: { row: TalentRow; index: number; potential: boolean }) => unknown;\n /** 图例行末尾的附加内容(「详见 属性基本公式」链接) */\n legend?: () => unknown;\n}>();\n\nconst hasPotential = computed(() => props.rows.some(r => r.potential !== undefined));\n\n/** 同名相邻行合并:每组第一行记组长,其余记 0(不画名字格) */\nconst spans = computed(() =>\n props.rows.map((r, i) => {\n if (i > 0 && props.rows[i - 1].name === r.name) return 0;\n let n = 1;\n while (props.rows[i + n]?.name === r.name) n++;\n return n;\n }),\n);\n\nconst CALC_LEGEND = [\n { kind: \"add\", text: \"直接加算\" },\n { kind: \"mul\", text: \"直接乘算\", note: \"(直接乘算之间为加法计算)\" },\n { kind: \"fadd\", text: \"最终加算\" },\n { kind: \"fmul\", text: \"最终乘算\" },\n];\n</script>\n\n<template>\n <table :class=\"['ak-talent-table', { 'is-pot': potential, 'is-calc': calc }]\">\n <thead>\n <tr>\n <th class=\"name\" scope=\"col\">{{ title }}</th>\n <th class=\"cond\" scope=\"col\">条件</th>\n <th class=\"desc\" scope=\"col\">\n 描述<label v-if=\"hasPotential\" class=\"ak-check ak-talent-table__toggle\">\n <input v-model=\"potential\" type=\"checkbox\" />\n <span v-if=\"potentialIcon\" class=\"ak-potential ak-potential--bare\"><img :src=\"potentialIcon\" alt=\"\" /></span>\n 潜能{{ potentialRank }}<span class=\"ak-sr-only\">加成</span>\n </label>\n <label v-if=\"calcToggle\" class=\"ak-check ak-talent-table__toggle\"><input v-model=\"calc\" type=\"checkbox\" />算法</label>\n </th>\n </tr>\n </thead>\n <tbody>\n <tr v-for=\"(row, i) in rows\" :key=\"i\">\n <td v-if=\"spans[i]\" class=\"name\" :rowspan=\"spans[i] > 1 ? spans[i] : undefined\">{{ row.name }}</td>\n <td class=\"cond\"><slot name=\"condition\" :row=\"row\" :index=\"i\">{{ row.condition }}</slot></td>\n <td class=\"desc\">\n <template v-if=\"row.potential !== undefined\">\n <span class=\"ak-talent-table__base\">\n <slot name=\"description\" :row=\"row\" :index=\"i\" :potential=\"false\">\n <AkRichText :text=\"row.description\" :terms=\"terms\" />\n </slot>\n </span>\n <span class=\"ak-talent-table__pot\">\n <slot name=\"description\" :row=\"row\" :index=\"i\" :potential=\"true\">\n <AkRichText :text=\"row.potential\" :terms=\"terms\" />\n </slot>\n </span>\n </template>\n <slot v-else name=\"description\" :row=\"row\" :index=\"i\" :potential=\"false\">\n <AkRichText :text=\"row.description\" :terms=\"terms\" />\n </slot>\n </td>\n </tr>\n </tbody>\n <tfoot v-if=\"calcToggle\">\n <tr class=\"ak-talent-table__legend\">\n <td colspan=\"3\">\n <span v-for=\"l in CALC_LEGEND\" :key=\"l.kind\">\n <i :class=\"['ak-calc', `ak-calc--${l.kind}`]\" aria-hidden=\"true\" />{{ l.text }}<small v-if=\"l.note\">{{ l.note }}</small>\n </span>\n <slot name=\"legend\" />\n </td>\n </tr>\n </tfoot>\n </table>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nimport AkRichText from \"../RichText/AkRichText.vue\";\n\n/** 天赋表的一行:一个条件下的效果 */\nexport interface TalentRow {\n /** 天赋名;相邻几行同名时合并成一格(rowspan) */\n name: string;\n /** 条件(「精英二 · Y模组 2级」);要放精英化图标时用 #condition 插槽 */\n condition?: string;\n /** 描述:游戏原始标记(<@ba.vup>…</>),由 AkRichText 渲染 */\n description: string;\n /** 潜能加成后的描述(潜能开关打开时换成它;加成部分一般是 <@ba.talpu>(+1%)</>);不写就没有潜能版 */\n potential?: string;\n}\n\nconst props = withDefaults(\n defineProps<{\n /** 第一列的列头(「第一天赋」「第二天赋」) */\n title: string;\n /** 各条件下的效果 */\n rows: TalentRow[];\n /** 潜能开关上写的潜能等级(「潜能5」);有任一行写了 potential 才出现开关 */\n potentialRank?: number;\n /** 潜能开关上的潜能图标地址(游戏 potential_N) */\n potentialIcon?: string;\n /** 表头显示「算法」开关——描述里用 AkCalc 标了加成项进公式的方式时打开;打开后表尾有图例行 */\n calcToggle?: boolean;\n /** 术语说明(termDescriptionDict),给描述里 <$ba.xxx> 的悬停提示 */\n terms?: Record<string, string>;\n }>(),\n { potentialRank: undefined, potentialIcon: undefined, terms: undefined },\n);\n\n/** 潜能加成开关:打开时描述换成潜能版(表上 .is-pot) */\nconst potential = defineModel<boolean>({ default: false });\n/** 算法标记开关:打开时每个加成项前露出 AkCalc、表尾出图例(表上 .is-calc) */\nconst calc = defineModel<boolean>(\"calc\", { default: false });\n\ndefineSlots<{\n /** 自己画条件格(放精英化图标等):{ row, index } */\n condition?: (p: { row: TalentRow; index: number }) => unknown;\n /** 自己画描述(要标 AkCalc 时用):potential = 这是潜能版还是基础版(有潜能版的行调两次) */\n description?: (p: { row: TalentRow; index: number; potential: boolean }) => unknown;\n /** 图例行末尾的附加内容(「详见 属性基本公式」链接) */\n legend?: () => unknown;\n}>();\n\nconst hasPotential = computed(() => props.rows.some(r => r.potential !== undefined));\n\n/** 同名相邻行合并:每组第一行记组长,其余记 0(不画名字格) */\nconst spans = computed(() =>\n props.rows.map((r, i) => {\n if (i > 0 && props.rows[i - 1].name === r.name) return 0;\n let n = 1;\n while (props.rows[i + n]?.name === r.name) n++;\n return n;\n }),\n);\n\nconst CALC_LEGEND = [\n { kind: \"add\", text: \"直接加算\" },\n { kind: \"mul\", text: \"直接乘算\", note: \"(直接乘算之间为加法计算)\" },\n { kind: \"fadd\", text: \"最终加算\" },\n { kind: \"fmul\", text: \"最终乘算\" },\n];\n</script>\n\n<template>\n <table :class=\"['ak-talent-table', { 'is-pot': potential, 'is-calc': calc }]\">\n <thead>\n <tr>\n <th class=\"name\" scope=\"col\">{{ title }}</th>\n <th class=\"cond\" scope=\"col\">条件</th>\n <th class=\"desc\" scope=\"col\">\n 描述<label v-if=\"hasPotential\" class=\"ak-check ak-talent-table__toggle\">\n <input v-model=\"potential\" type=\"checkbox\" />\n <span v-if=\"potentialIcon\" class=\"ak-potential ak-potential--bare\"><img :src=\"potentialIcon\" alt=\"\" /></span>\n 潜能{{ potentialRank }}<span class=\"ak-sr-only\">加成</span>\n </label>\n <label v-if=\"calcToggle\" class=\"ak-check ak-talent-table__toggle\"><input v-model=\"calc\" type=\"checkbox\" />算法</label>\n </th>\n </tr>\n </thead>\n <tbody>\n <tr v-for=\"(row, i) in rows\" :key=\"i\">\n <td v-if=\"spans[i]\" class=\"name\" :rowspan=\"spans[i] > 1 ? spans[i] : undefined\">{{ row.name }}</td>\n <td class=\"cond\"><slot name=\"condition\" :row=\"row\" :index=\"i\">{{ row.condition }}</slot></td>\n <td class=\"desc\">\n <template v-if=\"row.potential !== undefined\">\n <span class=\"ak-talent-table__base\">\n <slot name=\"description\" :row=\"row\" :index=\"i\" :potential=\"false\">\n <AkRichText :text=\"row.description\" :terms=\"terms\" />\n </slot>\n </span>\n <span class=\"ak-talent-table__pot\">\n <slot name=\"description\" :row=\"row\" :index=\"i\" :potential=\"true\">\n <AkRichText :text=\"row.potential\" :terms=\"terms\" />\n </slot>\n </span>\n </template>\n <slot v-else name=\"description\" :row=\"row\" :index=\"i\" :potential=\"false\">\n <AkRichText :text=\"row.description\" :terms=\"terms\" />\n </slot>\n </td>\n </tr>\n </tbody>\n <tfoot v-if=\"calcToggle\">\n <tr class=\"ak-talent-table__legend\">\n <td colspan=\"3\">\n <span v-for=\"l in CALC_LEGEND\" :key=\"l.kind\">\n <i :class=\"['ak-calc', `ak-calc--${l.kind}`]\" aria-hidden=\"true\" />{{ l.text }}<small v-if=\"l.note\">{{ l.note }}</small>\n </span>\n <slot name=\"legend\" />\n </td>\n </tr>\n </tfoot>\n </table>\n</template>\n","<script setup lang=\"ts\">\nexport type CalcKind = \"add\" | \"mul\" | \"fadd\" | \"fmul\";\n\ndefineProps<{\n /** 进公式的方式:add 直接加算(绿 +)· mul 直接乘算(蓝 +)· fadd 最终加算(橙 +)· fmul 最终乘算(橙 ×) */\n kind: CalcKind;\n}>();\n\n/* 算法标记:只在 AkTalentTable 打开「算法」开关(.is-calc)时显示,紧贴在数值前;读屏念「直接乘算」,悬停同 */\nconst TEXT: Record<CalcKind, string> = { add: \"直接加算\", mul: \"直接乘算\", fadd: \"最终加算\", fmul: \"最终乘算\" };\n</script>\n\n<template>\n <i :class=\"['ak-calc', `ak-calc--${kind}`]\" role=\"img\" :aria-label=\"TEXT[kind]\" :title=\"TEXT[kind]\" />\n</template>\n","<script setup lang=\"ts\">\nexport type CalcKind = \"add\" | \"mul\" | \"fadd\" | \"fmul\";\n\ndefineProps<{\n /** 进公式的方式:add 直接加算(绿 +)· mul 直接乘算(蓝 +)· fadd 最终加算(橙 +)· fmul 最终乘算(橙 ×) */\n kind: CalcKind;\n}>();\n\n/* 算法标记:只在 AkTalentTable 打开「算法」开关(.is-calc)时显示,紧贴在数值前;读屏念「直接乘算」,悬停同 */\nconst TEXT: Record<CalcKind, string> = { add: \"直接加算\", mul: \"直接乘算\", fadd: \"最终加算\", fmul: \"最终乘算\" };\n</script>\n\n<template>\n <i :class=\"['ak-calc', `ak-calc--${kind}`]\" role=\"img\" :aria-label=\"TEXT[kind]\" :title=\"TEXT[kind]\" />\n</template>\n","<script setup lang=\"ts\">\n/** 一条解锁条件:精英化 / 潜能图标 + 字 */\nexport interface TalentRequirement {\n /** 图标地址(elite_N / potential_N) */\n icon?: string;\n /** 「精英二 · 1级」「潜能5」 */\n text: string;\n}\n\nwithDefaults(\n defineProps<{\n /** 天赋名 */\n name: string;\n /** 解锁条件,跟在名字后面(小号标签字) */\n requirements?: TalentRequirement[];\n }>(),\n { requirements: () => [] },\n);\n\ndefineSlots<{\n /** 描述(游戏原始标记可以套 AkRichText) */\n default?: () => unknown;\n}>();\n</script>\n\n<template>\n <div class=\"ak-talent\">\n <div class=\"ak-talent__name\">\n {{ name }}\n <span v-for=\"(r, i) in requirements\" :key=\"i\" class=\"ak-talent__req\"><img v-if=\"r.icon\" :src=\"r.icon\" alt=\"\" />{{ r.text }}</span>\n </div>\n <div v-if=\"$slots.default\" class=\"ak-talent__desc\"><slot /></div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/** 一条解锁条件:精英化 / 潜能图标 + 字 */\nexport interface TalentRequirement {\n /** 图标地址(elite_N / potential_N) */\n icon?: string;\n /** 「精英二 · 1级」「潜能5」 */\n text: string;\n}\n\nwithDefaults(\n defineProps<{\n /** 天赋名 */\n name: string;\n /** 解锁条件,跟在名字后面(小号标签字) */\n requirements?: TalentRequirement[];\n }>(),\n { requirements: () => [] },\n);\n\ndefineSlots<{\n /** 描述(游戏原始标记可以套 AkRichText) */\n default?: () => unknown;\n}>();\n</script>\n\n<template>\n <div class=\"ak-talent\">\n <div class=\"ak-talent__name\">\n {{ name }}\n <span v-for=\"(r, i) in requirements\" :key=\"i\" class=\"ak-talent__req\"><img v-if=\"r.icon\" :src=\"r.icon\" alt=\"\" />{{ r.text }}</span>\n </div>\n <div v-if=\"$slots.default\" class=\"ak-talent__desc\"><slot /></div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 材料表(= Naive 的 NDescriptions 那种「标签 → 内容」两列):左列阶段 / 等级,右列这一步要的材料。\n * 里面放 AkMaterialsRow(一行)与 AkMaterialsDivider(横跨两列的分段说明)。\n */\ndefineSlots<{\n /** 若干 AkMaterialsRow / AkMaterialsDivider */\n default?: () => unknown;\n}>();\n</script>\n\n<template>\n <div class=\"ak-materials\"><slot /></div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 材料表(= Naive 的 NDescriptions 那种「标签 → 内容」两列):左列阶段 / 等级,右列这一步要的材料。\n * 里面放 AkMaterialsRow(一行)与 AkMaterialsDivider(横跨两列的分段说明)。\n */\ndefineSlots<{\n /** 若干 AkMaterialsRow / AkMaterialsDivider */\n default?: () => unknown;\n}>();\n</script>\n\n<template>\n <div class=\"ak-materials\"><slot /></div>\n</template>\n","<script setup lang=\"ts\">\nimport { provide } from \"vue\";\n\nimport { itemListKey } from \"../Item/context\";\n\n/**\n * 材料表的一行(= Naive 的 NDescriptionsItem),只能直接放在 AkMaterials 里:输出网格的两格——\n * .ak-materials__label(阶段 / 等级)+ .ak-item-list(材料)。两个根元素,所以不继承属性。\n */\ndefineOptions({ inheritAttrs: false });\n\ndefineProps<{\n /** 左列文字(「1 → 2」「精英阶段 0→1」);要放精英化图标时用 #label 插槽 */\n label?: string;\n}>();\n\ndefineSlots<{\n /** 这一步要的材料:若干 AkItem——没写 size 的按表里的规格画成 sm(40px) */\n default?: () => unknown;\n /** 左列内容(代替 label) */\n label?: () => unknown;\n}>();\n\n/** 材料表里的道具统一是 sm:同 AkItemList 的 size,经 provide 给没写 size 的 AkItem */\nprovide(itemListKey, { size: \"sm\" });\n</script>\n\n<template>\n <span class=\"ak-materials__label\"><slot name=\"label\">{{ label }}</slot></span>\n <span class=\"ak-item-list\"><slot /></span>\n</template>\n","<script setup lang=\"ts\">\nimport { provide } from \"vue\";\n\nimport { itemListKey } from \"../Item/context\";\n\n/**\n * 材料表的一行(= Naive 的 NDescriptionsItem),只能直接放在 AkMaterials 里:输出网格的两格——\n * .ak-materials__label(阶段 / 等级)+ .ak-item-list(材料)。两个根元素,所以不继承属性。\n */\ndefineOptions({ inheritAttrs: false });\n\ndefineProps<{\n /** 左列文字(「1 → 2」「精英阶段 0→1」);要放精英化图标时用 #label 插槽 */\n label?: string;\n}>();\n\ndefineSlots<{\n /** 这一步要的材料:若干 AkItem——没写 size 的按表里的规格画成 sm(40px) */\n default?: () => unknown;\n /** 左列内容(代替 label) */\n label?: () => unknown;\n}>();\n\n/** 材料表里的道具统一是 sm:同 AkItemList 的 size,经 provide 给没写 size 的 AkItem */\nprovide(itemListKey, { size: \"sm\" });\n</script>\n\n<template>\n <span class=\"ak-materials__label\"><slot name=\"label\">{{ label }}</slot></span>\n <span class=\"ak-item-list\"><slot /></span>\n</template>\n","<script setup lang=\"ts\">\n/** 材料表里横跨两列的分段说明(「达到精英阶段 1 后解锁」),只能直接放在 AkMaterials 里 */\ndefineSlots<{\n /** 说明文字 */\n default?: () => unknown;\n}>();\n</script>\n\n<template>\n <span class=\"ak-materials__divider\"><slot /></span>\n</template>\n","<script setup lang=\"ts\">\n/** 材料表里横跨两列的分段说明(「达到精英阶段 1 后解锁」),只能直接放在 AkMaterials 里 */\ndefineSlots<{\n /** 说明文字 */\n default?: () => unknown;\n}>();\n</script>\n\n<template>\n <span class=\"ak-materials__divider\"><slot /></span>\n</template>\n","<script setup lang=\"ts\">\n/** 属性表:若干 AkAttr 排成等宽网格(每格最窄 140px,放不下换行),格间 1px 缝线 */\ndefineProps<{\n /** 紧凑:名 / 值左右排开、数值缩到正文字号(档案里的综合体检、侧栏读数) */\n compact?: boolean;\n}>();\n\ndefineSlots<{\n /** 若干 AkAttr */\n default?: () => unknown;\n}>();\n</script>\n\n<template>\n <div :class=\"['ak-attrs', { 'ak-attrs--compact': compact }]\"><slot /></div>\n</template>\n","<script setup lang=\"ts\">\n/** 属性表:若干 AkAttr 排成等宽网格(每格最窄 140px,放不下换行),格间 1px 缝线 */\ndefineProps<{\n /** 紧凑:名 / 值左右排开、数值缩到正文字号(档案里的综合体检、侧栏读数) */\n compact?: boolean;\n}>();\n\ndefineSlots<{\n /** 若干 AkAttr */\n default?: () => unknown;\n}>();\n</script>\n\n<template>\n <div :class=\"['ak-attrs', { 'ak-attrs--compact': compact }]\"><slot /></div>\n</template>\n","<script setup lang=\"ts\">\n/** 属性表的一格(思路同 Naive 的 NStatistic:小标签 + 大数值 + 单位),放在 AkAttrs 里 */\ndefineProps<{\n /** 属性名:英文缩写(HP / ATK …,Bender 大写小字)或直接写中文(物理强度) */\n name: string;\n /** 中文名:跟在英文缩写后,正文字体(生命上限) */\n zh?: string;\n /** 数值;要上色或放别的内容时改用默认插槽 */\n value?: string | number;\n /** 单位:数值后的小号灰字(s) */\n unit?: string;\n /** 强调:顶部 2px 主色线(面板里的四维用,部署类属性不用) */\n accent?: boolean;\n}>();\n\ndefineSlots<{\n /** 数值(代替 value) */\n default?: () => unknown;\n}>();\n</script>\n\n<template>\n <div :class=\"['ak-attr', { 'ak-attr--accent': accent }]\">\n <span class=\"ak-attr__label\">\n {{ name }}<span v-if=\"zh\" class=\"cn\">{{ zh }}</span>\n </span>\n <span class=\"ak-attr__value\"><slot>{{ value }}</slot><small v-if=\"unit\">{{ unit }}</small></span>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/** 属性表的一格(思路同 Naive 的 NStatistic:小标签 + 大数值 + 单位),放在 AkAttrs 里 */\ndefineProps<{\n /** 属性名:英文缩写(HP / ATK …,Bender 大写小字)或直接写中文(物理强度) */\n name: string;\n /** 中文名:跟在英文缩写后,正文字体(生命上限) */\n zh?: string;\n /** 数值;要上色或放别的内容时改用默认插槽 */\n value?: string | number;\n /** 单位:数值后的小号灰字(s) */\n unit?: string;\n /** 强调:顶部 2px 主色线(面板里的四维用,部署类属性不用) */\n accent?: boolean;\n}>();\n\ndefineSlots<{\n /** 数值(代替 value) */\n default?: () => unknown;\n}>();\n</script>\n\n<template>\n <div :class=\"['ak-attr', { 'ak-attr--accent': accent }]\">\n <span class=\"ak-attr__label\">\n {{ name }}<span v-if=\"zh\" class=\"cn\">{{ zh }}</span>\n </span>\n <span class=\"ak-attr__value\"><slot>{{ value }}</slot><small v-if=\"unit\">{{ unit }}</small></span>\n </div>\n</template>\n","import type { InjectionKey } from \"vue\";\n\n/** AkKv 给 AkKvItem 的排法:内联版每对 dt + dd 要包一层 <div>(dl > div > dt + dd) */\nexport const kvKey: InjectionKey<{ readonly inline?: boolean }> = Symbol(\"AkKv\");\n","<script setup lang=\"ts\">\nimport { provide } from \"vue\";\n\nimport { kvKey } from \"./context\";\n\n/**\n * 键值表(同 Naive 的 NDescriptions):一个 <dl>,里面放若干 AkKvItem。\n * 子项自己输出 dt + dd,只有内联版要多包一层 div——这点由 provide 告诉子项,父组件不读子项。\n */\nconst props = defineProps<{\n /** 带框(信息栏):外框 + 键列底色、居中,同现网 infobox 的 th;不带框的是档案里那种只有横线的版本 */\n bordered?: boolean;\n /** 内联:两三对短值一行放下、放不下换行,不画格子(所属势力 / 隐藏势力、获得方式 / 上线时间);与 bordered 同时写时以内联为准 */\n inline?: boolean;\n}>();\n\ndefineSlots<{\n /** 若干 AkKvItem */\n default?: () => unknown;\n}>();\n\nprovide(kvKey, props);\n</script>\n\n<template>\n <dl :class=\"['ak-kv', { 'ak-kv--boxed': bordered && !inline, 'ak-kv--inline': inline }]\"><slot /></dl>\n</template>\n","<script setup lang=\"ts\">\nimport { provide } from \"vue\";\n\nimport { kvKey } from \"./context\";\n\n/**\n * 键值表(同 Naive 的 NDescriptions):一个 <dl>,里面放若干 AkKvItem。\n * 子项自己输出 dt + dd,只有内联版要多包一层 div——这点由 provide 告诉子项,父组件不读子项。\n */\nconst props = defineProps<{\n /** 带框(信息栏):外框 + 键列底色、居中,同现网 infobox 的 th;不带框的是档案里那种只有横线的版本 */\n bordered?: boolean;\n /** 内联:两三对短值一行放下、放不下换行,不画格子(所属势力 / 隐藏势力、获得方式 / 上线时间);与 bordered 同时写时以内联为准 */\n inline?: boolean;\n}>();\n\ndefineSlots<{\n /** 若干 AkKvItem */\n default?: () => unknown;\n}>();\n\nprovide(kvKey, props);\n</script>\n\n<template>\n <dl :class=\"['ak-kv', { 'ak-kv--boxed': bordered && !inline, 'ak-kv--inline': inline }]\"><slot /></dl>\n</template>\n","<script setup lang=\"ts\">\nimport { inject } from \"vue\";\n\nimport { kvKey } from \"./context\";\n\n/** 键值表的一对(同 Naive 的 NDescriptionsItem):输出 <dt> + <dd>;在内联版 AkKv 里包一层 <div>。只能放在 AkKv 里 */\ndefineProps<{\n /** 键(dt)文字;要带悬停解释 / 图标时改用 #term 插槽 */\n term?: string;\n}>();\n\ndefineSlots<{\n /** 值(dd):文字、链接、标签、列表都行 */\n default?: () => unknown;\n /** 键(代替 term) */\n term?: () => unknown;\n}>();\n\nconst kv = inject(kvKey, {});\n</script>\n\n<template>\n <div v-if=\"kv.inline\">\n <dt><slot name=\"term\">{{ term }}</slot></dt>\n <dd><slot /></dd>\n </div>\n <template v-else>\n <dt><slot name=\"term\">{{ term }}</slot></dt>\n <dd><slot /></dd>\n </template>\n</template>\n","<script setup lang=\"ts\">\nimport { inject } from \"vue\";\n\nimport { kvKey } from \"./context\";\n\n/** 键值表的一对(同 Naive 的 NDescriptionsItem):输出 <dt> + <dd>;在内联版 AkKv 里包一层 <div>。只能放在 AkKv 里 */\ndefineProps<{\n /** 键(dt)文字;要带悬停解释 / 图标时改用 #term 插槽 */\n term?: string;\n}>();\n\ndefineSlots<{\n /** 值(dd):文字、链接、标签、列表都行 */\n default?: () => unknown;\n /** 键(代替 term) */\n term?: () => unknown;\n}>();\n\nconst kv = inject(kvKey, {});\n</script>\n\n<template>\n <div v-if=\"kv.inline\">\n <dt><slot name=\"term\">{{ term }}</slot></dt>\n <dd><slot /></dd>\n </div>\n <template v-else>\n <dt><slot name=\"term\">{{ term }}</slot></dt>\n <dd><slot /></dd>\n </template>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\n/** 一格:相对自身的行 / 列(= 游戏 range_table 的 grids 项),或写成 [row, col] */\nexport type RangeGrid = { row: number; col: number } | readonly [row: number, col: number];\n\nconst props = withDefaults(\n defineProps<{\n /** 可攻击的格子(相对自身):{ row, col }(直接传 range_table 的 grids)或 [row, col];col 向前为正,自身 (0, 0) 写不写都行 */\n grids: readonly RangeGrid[];\n /** 尺寸:sm 14 · md 22 · lg 28(px 格边);sm 给技能卡侧槽 / 表格 */\n size?: \"sm\" | \"md\" | \"lg\";\n /** 可访问名(aria-label);默认「攻击范围:自身之外 N 格」 */\n label?: string;\n }>(),\n { size: \"md\", label: undefined },\n);\n\n/** 同现网 Widget:Range:只铺范围的外接矩形(含自身),逐格给 self / on / 空(空格不写 class,CSS 不画) */\nconst layout = computed(() => {\n const on = new Set(props.grids.map(g => (\"row\" in g ? `${g.row},${g.col}` : `${g[0]},${g[1]}`)));\n on.delete(\"0,0\");\n const pts = [[0, 0], ...[...on].map(k => k.split(\",\").map(Number))];\n const rows = pts.map(p => p[0]);\n const cols = pts.map(p => p[1]);\n const [r0, r1, c0, c1] = [Math.min(...rows), Math.max(...rows), Math.min(...cols), Math.max(...cols)];\n const cells: (\"self\" | \"on\" | undefined)[] = [];\n for (let r = r0; r <= r1; r++)\n for (let c = c0; c <= c1; c++) cells.push(r === 0 && c === 0 ? \"self\" : on.has(`${r},${c}`) ? \"on\" : undefined);\n return { cols: c1 - c0 + 1, cells, count: on.size };\n});\n</script>\n\n<template>\n <div\n :class=\"['ak-range', size !== 'md' && `ak-range--${size}`]\"\n :style=\"{ '--cols': layout.cols }\"\n role=\"img\"\n :aria-label=\"label ?? `攻击范围:自身之外 ${layout.count} 格`\"\n >\n <i v-for=\"(c, i) in layout.cells\" :key=\"i\" :class=\"c\" />\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\n/** 一格:相对自身的行 / 列(= 游戏 range_table 的 grids 项),或写成 [row, col] */\nexport type RangeGrid = { row: number; col: number } | readonly [row: number, col: number];\n\nconst props = withDefaults(\n defineProps<{\n /** 可攻击的格子(相对自身):{ row, col }(直接传 range_table 的 grids)或 [row, col];col 向前为正,自身 (0, 0) 写不写都行 */\n grids: readonly RangeGrid[];\n /** 尺寸:sm 14 · md 22 · lg 28(px 格边);sm 给技能卡侧槽 / 表格 */\n size?: \"sm\" | \"md\" | \"lg\";\n /** 可访问名(aria-label);默认「攻击范围:自身之外 N 格」 */\n label?: string;\n }>(),\n { size: \"md\", label: undefined },\n);\n\n/** 同现网 Widget:Range:只铺范围的外接矩形(含自身),逐格给 self / on / 空(空格不写 class,CSS 不画) */\nconst layout = computed(() => {\n const on = new Set(props.grids.map(g => (\"row\" in g ? `${g.row},${g.col}` : `${g[0]},${g[1]}`)));\n on.delete(\"0,0\");\n const pts = [[0, 0], ...[...on].map(k => k.split(\",\").map(Number))];\n const rows = pts.map(p => p[0]);\n const cols = pts.map(p => p[1]);\n const [r0, r1, c0, c1] = [Math.min(...rows), Math.max(...rows), Math.min(...cols), Math.max(...cols)];\n const cells: (\"self\" | \"on\" | undefined)[] = [];\n for (let r = r0; r <= r1; r++)\n for (let c = c0; c <= c1; c++) cells.push(r === 0 && c === 0 ? \"self\" : on.has(`${r},${c}`) ? \"on\" : undefined);\n return { cols: c1 - c0 + 1, cells, count: on.size };\n});\n</script>\n\n<template>\n <div\n :class=\"['ak-range', size !== 'md' && `ak-range--${size}`]\"\n :style=\"{ '--cols': layout.cols }\"\n role=\"img\"\n :aria-label=\"label ?? `攻击范围:自身之外 ${layout.count} 格`\"\n >\n <i v-for=\"(c, i) in layout.cells\" :key=\"i\" :class=\"c\" />\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, useId } from \"vue\";\n\nexport type ModuleColor = \"red\" | \"blue\" | \"green\" | \"yellow\" | \"purple\";\n\n/**\n * 模组卡(= 现网 {{模组}}):一张卡装完型号 + 名称 + 故事 + 三阶段表 + 解锁任务 + 解锁需求与材料。\n * 结构照 Naive 的 NCard(#header-extra);故事默认只露 3 行,「全文阅读」展开同 NEllipsis 的 line-clamp + expand-trigger=\"click\"——\n * 这里用组件内状态(v-model)代替 CSS 版的 data-toggle-class,真皮肤上也能用。\n */\nconst props = withDefaults(\n defineProps<{\n /** 模组名(h4) */\n name: string;\n /** 模组图地址(游戏 uniequip 图;原型证章放分支图标) */\n src?: string;\n /** 型号文字:SWO-X / Original … */\n typeName?: string;\n /** 型号图标地址(游戏模组类型小图标,放在型号文字前) */\n typeIcon?: string;\n /** 型号色(= 模板参数「类型颜色」,游戏模组类型底色):左侧粗色条 + 型号块 + 阶段条;不写 = 原型证章的灰 */\n color?: ModuleColor;\n /** 「说明 ⓘ」的悬停解释(调整效果先于潜能生效 …);不写不显示 */\n hint?: string;\n /** 故事可折叠:默认只露 3 行 +「全文阅读」开关;false 时全文展开、不出开关(原型证章那种短文) */\n collapsible?: boolean;\n /** 模组解锁任务(纯文本,一条一行);要链接关卡时改用 #tasks 插槽 */\n tasks?: string[];\n }>(),\n { src: undefined, typeName: undefined, typeIcon: undefined, color: undefined, hint: undefined, collapsible: true, tasks: undefined },\n);\n\n/** 故事是否展开(「全文阅读」/「收起全文」) */\nconst open = defineModel<boolean>({ default: false });\n\nconst slots = defineSlots<{\n /** 故事(基础信息):若干 <p>,行内换行用 <br> */\n default?: () => unknown;\n /** 名称之后的附加内容(原型证章的说明标签等) */\n \"header-extra\"?: () => unknown;\n /** 三阶段表的行:若干 AkModuleStage */\n stages?: () => unknown;\n /** 解锁任务:若干 <li>(排在 tasks 之后) */\n tasks?: () => unknown;\n /** 解锁需求与材料表的行:若干 AkModuleUnlock */\n unlock?: () => unknown;\n}>();\n\nconst id = useId();\nconst expanded = computed(() => !props.collapsible || open.value);\nconst hasTasks = computed(() => !!props.tasks?.length || !!slots.tasks);\n</script>\n\n<template>\n <div class=\"ak-module\" :data-color=\"color\">\n <div class=\"ak-module__img\"><img v-if=\"src\" :src=\"src\" alt=\"\" /></div>\n <div :class=\"['ak-module__main', { 'is-open': expanded }]\">\n <div class=\"ak-module__head\">\n <span v-if=\"typeName || typeIcon\" class=\"ak-module__type\"><img v-if=\"typeIcon\" :src=\"typeIcon\" alt=\"\" />{{ typeName }}</span>\n <h4 class=\"ak-module__name\">{{ name }}</h4>\n <span v-if=\"hint\" class=\"ak-module__hint ak-tip--wide\" :data-ak-tip=\"hint\" tabindex=\"0\">说明 ⓘ</span>\n <slot name=\"header-extra\" />\n </div>\n <div v-if=\"$slots.default\" :id=\"`${id}-story`\" class=\"ak-module__story\"><slot /></div>\n <label v-if=\"collapsible && $slots.default\" class=\"ak-module__more\">\n <input v-model=\"open\" type=\"checkbox\" :aria-controls=\"`${id}-story`\" />\n <span class=\"off\">全文阅读 »</span><span class=\"on\">收起全文 «</span>\n </label>\n </div>\n <div v-if=\"$slots.stages || hasTasks || $slots.unlock\" class=\"ak-module__body\">\n <table v-if=\"$slots.stages\" class=\"ak-module__stages\">\n <thead>\n <tr><th scope=\"col\">阶段</th><th scope=\"col\">属性</th><th scope=\"col\">特性 / 天赋变化</th></tr>\n </thead>\n <tbody><slot name=\"stages\" /></tbody>\n </table>\n <div v-if=\"hasTasks\" class=\"ak-module__tasks\">\n <span class=\"ak-overline\">模组解锁任务</span>\n <ul>\n <li v-for=\"(t, i) in tasks\" :key=\"i\">{{ t }}</li>\n <slot name=\"tasks\" />\n </ul>\n </div>\n <table v-if=\"$slots.unlock\" class=\"ak-module__unlock\">\n <thead>\n <tr><th scope=\"col\">阶段</th><th scope=\"col\">解锁需求</th><th scope=\"col\">材料消耗</th></tr>\n </thead>\n <tbody><slot name=\"unlock\" /></tbody>\n </table>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, useId } from \"vue\";\n\nexport type ModuleColor = \"red\" | \"blue\" | \"green\" | \"yellow\" | \"purple\";\n\n/**\n * 模组卡(= 现网 {{模组}}):一张卡装完型号 + 名称 + 故事 + 三阶段表 + 解锁任务 + 解锁需求与材料。\n * 结构照 Naive 的 NCard(#header-extra);故事默认只露 3 行,「全文阅读」展开同 NEllipsis 的 line-clamp + expand-trigger=\"click\"——\n * 这里用组件内状态(v-model)代替 CSS 版的 data-toggle-class,真皮肤上也能用。\n */\nconst props = withDefaults(\n defineProps<{\n /** 模组名(h4) */\n name: string;\n /** 模组图地址(游戏 uniequip 图;原型证章放分支图标) */\n src?: string;\n /** 型号文字:SWO-X / Original … */\n typeName?: string;\n /** 型号图标地址(游戏模组类型小图标,放在型号文字前) */\n typeIcon?: string;\n /** 型号色(= 模板参数「类型颜色」,游戏模组类型底色):左侧粗色条 + 型号块 + 阶段条;不写 = 原型证章的灰 */\n color?: ModuleColor;\n /** 「说明 ⓘ」的悬停解释(调整效果先于潜能生效 …);不写不显示 */\n hint?: string;\n /** 故事可折叠:默认只露 3 行 +「全文阅读」开关;false 时全文展开、不出开关(原型证章那种短文) */\n collapsible?: boolean;\n /** 模组解锁任务(纯文本,一条一行);要链接关卡时改用 #tasks 插槽 */\n tasks?: string[];\n }>(),\n { src: undefined, typeName: undefined, typeIcon: undefined, color: undefined, hint: undefined, collapsible: true, tasks: undefined },\n);\n\n/** 故事是否展开(「全文阅读」/「收起全文」) */\nconst open = defineModel<boolean>({ default: false });\n\nconst slots = defineSlots<{\n /** 故事(基础信息):若干 <p>,行内换行用 <br> */\n default?: () => unknown;\n /** 名称之后的附加内容(原型证章的说明标签等) */\n \"header-extra\"?: () => unknown;\n /** 三阶段表的行:若干 AkModuleStage */\n stages?: () => unknown;\n /** 解锁任务:若干 <li>(排在 tasks 之后) */\n tasks?: () => unknown;\n /** 解锁需求与材料表的行:若干 AkModuleUnlock */\n unlock?: () => unknown;\n}>();\n\nconst id = useId();\nconst expanded = computed(() => !props.collapsible || open.value);\nconst hasTasks = computed(() => !!props.tasks?.length || !!slots.tasks);\n</script>\n\n<template>\n <div class=\"ak-module\" :data-color=\"color\">\n <div class=\"ak-module__img\"><img v-if=\"src\" :src=\"src\" alt=\"\" /></div>\n <div :class=\"['ak-module__main', { 'is-open': expanded }]\">\n <div class=\"ak-module__head\">\n <span v-if=\"typeName || typeIcon\" class=\"ak-module__type\"><img v-if=\"typeIcon\" :src=\"typeIcon\" alt=\"\" />{{ typeName }}</span>\n <h4 class=\"ak-module__name\">{{ name }}</h4>\n <span v-if=\"hint\" class=\"ak-module__hint ak-tip--wide\" :data-ak-tip=\"hint\" tabindex=\"0\">说明 ⓘ</span>\n <slot name=\"header-extra\" />\n </div>\n <div v-if=\"$slots.default\" :id=\"`${id}-story`\" class=\"ak-module__story\"><slot /></div>\n <label v-if=\"collapsible && $slots.default\" class=\"ak-module__more\">\n <input v-model=\"open\" type=\"checkbox\" :aria-controls=\"`${id}-story`\" />\n <span class=\"off\">全文阅读 »</span><span class=\"on\">收起全文 «</span>\n </label>\n </div>\n <div v-if=\"$slots.stages || hasTasks || $slots.unlock\" class=\"ak-module__body\">\n <table v-if=\"$slots.stages\" class=\"ak-module__stages\">\n <thead>\n <tr><th scope=\"col\">阶段</th><th scope=\"col\">属性</th><th scope=\"col\">特性 / 天赋变化</th></tr>\n </thead>\n <tbody><slot name=\"stages\" /></tbody>\n </table>\n <div v-if=\"hasTasks\" class=\"ak-module__tasks\">\n <span class=\"ak-overline\">模组解锁任务</span>\n <ul>\n <li v-for=\"(t, i) in tasks\" :key=\"i\">{{ t }}</li>\n <slot name=\"tasks\" />\n </ul>\n </div>\n <table v-if=\"$slots.unlock\" class=\"ak-module__unlock\">\n <thead>\n <tr><th scope=\"col\">阶段</th><th scope=\"col\">解锁需求</th><th scope=\"col\">材料消耗</th></tr>\n </thead>\n <tbody><slot name=\"unlock\" /></tbody>\n </table>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/** 模组三阶段表的一行(阶段条 · 属性加成 · 特性追加 / 天赋更新),放在 AkModule 的 #stages 插槽里 */\ndefineProps<{\n /** 阶段 1–3:「STAGE n」+ 三段条点亮 n 段 */\n stage: 1 | 2 | 3;\n /** 属性加成:{ 攻击: \"+50\", 攻击速度: \"+5\" }(按写的顺序排,数值绿字) */\n stats?: Record<string, string | number>;\n /** 变化类别的反色小标:特性追加 / 天赋更新 */\n kicker?: string;\n}>();\n\ndefineSlots<{\n /** 特性 / 天赋变化的描述(可带富文本) */\n default?: () => unknown;\n}>();\n</script>\n\n<template>\n <tr>\n <td class=\"lv\">\n <span class=\"ak-module__lv\">STAGE {{ stage }}<i aria-hidden=\"true\"><b v-for=\"n in 3\" :key=\"n\" :class=\"{ on: n <= stage }\" /></i></span>\n </td>\n <td class=\"stats\">\n <span class=\"ak-module__stats\">\n <span v-for=\"(v, k) in stats\" :key=\"k\">{{ k }} <span class=\"ak-rt-vup\">{{ v }}</span></span>\n </span>\n </td>\n <td><span v-if=\"kicker\" class=\"ak-module__kicker\">{{ kicker }}</span><slot /></td>\n </tr>\n</template>\n","<script setup lang=\"ts\">\n/** 模组三阶段表的一行(阶段条 · 属性加成 · 特性追加 / 天赋更新),放在 AkModule 的 #stages 插槽里 */\ndefineProps<{\n /** 阶段 1–3:「STAGE n」+ 三段条点亮 n 段 */\n stage: 1 | 2 | 3;\n /** 属性加成:{ 攻击: \"+50\", 攻击速度: \"+5\" }(按写的顺序排,数值绿字) */\n stats?: Record<string, string | number>;\n /** 变化类别的反色小标:特性追加 / 天赋更新 */\n kicker?: string;\n}>();\n\ndefineSlots<{\n /** 特性 / 天赋变化的描述(可带富文本) */\n default?: () => unknown;\n}>();\n</script>\n\n<template>\n <tr>\n <td class=\"lv\">\n <span class=\"ak-module__lv\">STAGE {{ stage }}<i aria-hidden=\"true\"><b v-for=\"n in 3\" :key=\"n\" :class=\"{ on: n <= stage }\" /></i></span>\n </td>\n <td class=\"stats\">\n <span class=\"ak-module__stats\">\n <span v-for=\"(v, k) in stats\" :key=\"k\">{{ k }} <span class=\"ak-rt-vup\">{{ v }}</span></span>\n </span>\n </td>\n <td><span v-if=\"kicker\" class=\"ak-module__kicker\">{{ kicker }}</span><slot /></td>\n </tr>\n</template>\n","<script setup lang=\"ts\">\n/** 模组解锁表的一行(阶段条 · 解锁需求 · 材料消耗),放在 AkModule 的 #unlock 插槽里 */\ndefineProps<{\n /** 阶段 1–3:「STAGE n」+ 三段条点亮 n 段 */\n stage: 1 | 2 | 3;\n}>();\n\ndefineSlots<{\n /** 材料消耗:一排 AkItem(AkItemList) */\n default?: () => unknown;\n /** 解锁需求:信赖 / 精英阶段与等级 / 任务标签,横排换行 */\n requirement?: () => unknown;\n}>();\n</script>\n\n<template>\n <tr>\n <td class=\"lv\">\n <span class=\"ak-module__lv\">STAGE {{ stage }}<i aria-hidden=\"true\"><b v-for=\"n in 3\" :key=\"n\" :class=\"{ on: n <= stage }\" /></i></span>\n </td>\n <td><span class=\"ak-module__req\"><slot name=\"requirement\" /></span></td>\n <td><slot /></td>\n </tr>\n</template>\n","<script setup lang=\"ts\">\n/** 模组解锁表的一行(阶段条 · 解锁需求 · 材料消耗),放在 AkModule 的 #unlock 插槽里 */\ndefineProps<{\n /** 阶段 1–3:「STAGE n」+ 三段条点亮 n 段 */\n stage: 1 | 2 | 3;\n}>();\n\ndefineSlots<{\n /** 材料消耗:一排 AkItem(AkItemList) */\n default?: () => unknown;\n /** 解锁需求:信赖 / 精英阶段与等级 / 任务标签,横排换行 */\n requirement?: () => unknown;\n}>();\n</script>\n\n<template>\n <tr>\n <td class=\"lv\">\n <span class=\"ak-module__lv\">STAGE {{ stage }}<i aria-hidden=\"true\"><b v-for=\"n in 3\" :key=\"n\" :class=\"{ on: n <= stage }\" /></i></span>\n </td>\n <td><span class=\"ak-module__req\"><slot name=\"requirement\" /></span></td>\n <td><slot /></td>\n </tr>\n</template>\n","import type { ComputedRef, InjectionKey } from \"vue\";\n\n/** 语种选项(同 Naive 的 options:value + label) */\nexport interface VoiceLanguage {\n /** 语种键,= AkVoice 的 text / src 对象里的键(cn / yue / jp / en / kr …) */\n value: string;\n /** 切换条上的名字(中文-普通话) */\n label: string;\n /** 配音演员(切换条上名字后的小字) */\n cv?: string;\n}\n\n/** 文本语言选项(台词的语言:中文 / 日文 / 繁体中文 / 中文-方言 …) */\nexport interface VoiceText {\n /** 文本键,= AkVoice 的 text 对象里的键 */\n value: string;\n /** 切换条上的名字 */\n label: string;\n}\n\n/** AkVoiceList 给 AkVoice 的:当前语种、文本语言选项与选中的几种 */\nexport const voiceListKey: InjectionKey<\n ComputedRef<{ lang?: string; languages: readonly VoiceLanguage[]; texts: readonly VoiceText[]; shownTexts: readonly string[] }>\n> = Symbol(\"AkVoiceList\");\n\n/** 游戏语种键 → HTML lang(读屏按语种发音);不认识的键不写 lang */\nexport const HTML_LANG: Record<string, string> = { cn: \"zh-Hans\", yue: \"yue\", jp: \"ja\", en: \"en\", kr: \"ko\" };\n","<script setup lang=\"ts\">\nimport { computed, provide, useId } from \"vue\";\n\nimport { voiceListKey, type VoiceLanguage, type VoiceText } from \"./context\";\n\n/**\n * 语音列表(= 现网 {{:xx/语音记录}} 的 VoiceTable):若干 AkVoice,外框 + 悬停行底色。\n * 上方最多两排切换条(.ak-voice-toolbar 里排一行,放不下时后一排整组换行):\n * - texts:文本(台词的语言),多选、可以一个都不选,v-model:shown-texts;AkVoice 的 text 按文本键给对象,选中的几种一种一行\n * - languages:语种(音频差分,普通话 / 方言 / 日 / 英 / 韩,带 CV 名),单选,v-model;AkVoice 的 src 按语种键给对象\n * 只给 languages 时 AkVoice 的 text 也按语种给,切语种同时换台词和音频地址。\n * 当前语种 / 选中的文本经 provide 给子项;播放全页只有一条(见 player.ts)。\n * 切换条标 data-no-toggle:皮肤脚本会在 document 上替模板输出的纯 CSS 芯片翻 is-active / aria-pressed,这里的状态归 Vue 管,\n * 不退出那层委托就会两边各翻一次(点第二下反而取消选中)。\n */\nconst props = withDefaults(\n defineProps<{\n /** 语种选项 { value, label, cv? }(同 Naive 的 options);不给就没有语种切换条 */\n languages?: VoiceLanguage[];\n /** 文本语言选项 { value, label };不给就没有文本切换条,台词跟语种走 */\n texts?: VoiceText[];\n }>(),\n { languages: () => [], texts: () => [] },\n);\n\n/** 当前语种(languages 里的 value);不绑定时是第一个 */\nconst lang = defineModel<string>();\n/** 选中的文本语言(texts 里的 value,可多个、可为空);不绑定时默认第一个 */\nconst shownTexts = defineModel<string[]>(\"shownTexts\");\n\ndefineSlots<{\n /** 若干 AkVoice */\n default?: () => unknown;\n /** 语种切换条末尾的附注(「灰标 = 游戏内解锁条件」) */\n \"header-extra\"?: () => unknown;\n}>();\n\nconst current = computed(() => lang.value ?? props.languages[0]?.value);\nconst shown = computed(() => shownTexts.value ?? (props.texts[0] ? [props.texts[0].value] : []));\nfunction toggleText(value: string) {\n const on = !shown.value.includes(value);\n shownTexts.value = props.texts.map(t => t.value).filter(v => (v === value ? on : shown.value.includes(v)));\n}\n\nprovide(\n voiceListKey,\n computed(() => ({ lang: current.value, languages: props.languages, texts: props.texts, shownTexts: shown.value })),\n);\n\nconst id = useId();\n</script>\n\n<template>\n <div>\n <div v-if=\"texts.length || languages.length\" class=\"ak-voice-toolbar ak-not-prose\" data-no-toggle>\n <div v-if=\"texts.length\" class=\"ak-voice-langs\" role=\"group\" :aria-labelledby=\"`${id}-texts`\">\n <span :id=\"`${id}-texts`\" class=\"ak-overline\">文本</span>\n <button\n v-for=\"t in texts\"\n :key=\"t.value\"\n type=\"button\"\n :class=\"['ak-chip', { 'is-active': shown.includes(t.value) }]\"\n :aria-pressed=\"shown.includes(t.value)\"\n @click=\"toggleText(t.value)\"\n >\n {{ t.label }}\n </button>\n </div>\n <div v-if=\"languages.length\" class=\"ak-voice-langs\" role=\"group\" :aria-labelledby=\"`${id}-langs`\">\n <span :id=\"`${id}-langs`\" class=\"ak-overline\">语种</span>\n <button\n v-for=\"l in languages\"\n :key=\"l.value\"\n type=\"button\"\n :class=\"['ak-chip', { 'is-active': l.value === current }]\"\n :aria-pressed=\"l.value === current\"\n @click=\"lang = l.value\"\n >\n {{ l.label }}<small v-if=\"l.cv\">{{ l.cv }}</small>\n </button>\n <slot name=\"header-extra\" />\n </div>\n </div>\n <div class=\"ak-voice-list ak-not-prose\"><slot /></div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, provide, useId } from \"vue\";\n\nimport { voiceListKey, type VoiceLanguage, type VoiceText } from \"./context\";\n\n/**\n * 语音列表(= 现网 {{:xx/语音记录}} 的 VoiceTable):若干 AkVoice,外框 + 悬停行底色。\n * 上方最多两排切换条(.ak-voice-toolbar 里排一行,放不下时后一排整组换行):\n * - texts:文本(台词的语言),多选、可以一个都不选,v-model:shown-texts;AkVoice 的 text 按文本键给对象,选中的几种一种一行\n * - languages:语种(音频差分,普通话 / 方言 / 日 / 英 / 韩,带 CV 名),单选,v-model;AkVoice 的 src 按语种键给对象\n * 只给 languages 时 AkVoice 的 text 也按语种给,切语种同时换台词和音频地址。\n * 当前语种 / 选中的文本经 provide 给子项;播放全页只有一条(见 player.ts)。\n * 切换条标 data-no-toggle:皮肤脚本会在 document 上替模板输出的纯 CSS 芯片翻 is-active / aria-pressed,这里的状态归 Vue 管,\n * 不退出那层委托就会两边各翻一次(点第二下反而取消选中)。\n */\nconst props = withDefaults(\n defineProps<{\n /** 语种选项 { value, label, cv? }(同 Naive 的 options);不给就没有语种切换条 */\n languages?: VoiceLanguage[];\n /** 文本语言选项 { value, label };不给就没有文本切换条,台词跟语种走 */\n texts?: VoiceText[];\n }>(),\n { languages: () => [], texts: () => [] },\n);\n\n/** 当前语种(languages 里的 value);不绑定时是第一个 */\nconst lang = defineModel<string>();\n/** 选中的文本语言(texts 里的 value,可多个、可为空);不绑定时默认第一个 */\nconst shownTexts = defineModel<string[]>(\"shownTexts\");\n\ndefineSlots<{\n /** 若干 AkVoice */\n default?: () => unknown;\n /** 语种切换条末尾的附注(「灰标 = 游戏内解锁条件」) */\n \"header-extra\"?: () => unknown;\n}>();\n\nconst current = computed(() => lang.value ?? props.languages[0]?.value);\nconst shown = computed(() => shownTexts.value ?? (props.texts[0] ? [props.texts[0].value] : []));\nfunction toggleText(value: string) {\n const on = !shown.value.includes(value);\n shownTexts.value = props.texts.map(t => t.value).filter(v => (v === value ? on : shown.value.includes(v)));\n}\n\nprovide(\n voiceListKey,\n computed(() => ({ lang: current.value, languages: props.languages, texts: props.texts, shownTexts: shown.value })),\n);\n\nconst id = useId();\n</script>\n\n<template>\n <div>\n <div v-if=\"texts.length || languages.length\" class=\"ak-voice-toolbar ak-not-prose\" data-no-toggle>\n <div v-if=\"texts.length\" class=\"ak-voice-langs\" role=\"group\" :aria-labelledby=\"`${id}-texts`\">\n <span :id=\"`${id}-texts`\" class=\"ak-overline\">文本</span>\n <button\n v-for=\"t in texts\"\n :key=\"t.value\"\n type=\"button\"\n :class=\"['ak-chip', { 'is-active': shown.includes(t.value) }]\"\n :aria-pressed=\"shown.includes(t.value)\"\n @click=\"toggleText(t.value)\"\n >\n {{ t.label }}\n </button>\n </div>\n <div v-if=\"languages.length\" class=\"ak-voice-langs\" role=\"group\" :aria-labelledby=\"`${id}-langs`\">\n <span :id=\"`${id}-langs`\" class=\"ak-overline\">语种</span>\n <button\n v-for=\"l in languages\"\n :key=\"l.value\"\n type=\"button\"\n :class=\"['ak-chip', { 'is-active': l.value === current }]\"\n :aria-pressed=\"l.value === current\"\n @click=\"lang = l.value\"\n >\n {{ l.label }}<small v-if=\"l.cv\">{{ l.cv }}</small>\n </button>\n <slot name=\"header-extra\" />\n </div>\n </div>\n <div class=\"ak-voice-list ak-not-prose\"><slot /></div>\n </div>\n</template>\n","import { shallowRef } from \"vue\";\n\n/**\n * 全页共用一个原生 Audio:同一时间只放一条语音——点另一条先停掉正在放的(同现网 VoiceTable / 干员页脚本)。\n * 第一次点播放时才创建,SSR / 预渲染不碰 Audio。playing 是正在放的那条 AkVoice 的标识。\n */\nexport const playing = shallowRef<symbol | null>(null);\nlet audio: HTMLAudioElement | undefined;\n\nexport function stop() {\n audio?.pause();\n playing.value = null;\n}\n\n/** 放 / 停一条:正在放的就是它 → 停;否则停掉别的、换成它 */\nexport function toggle(id: symbol, src: string) {\n if (playing.value === id) return stop();\n if (!audio) {\n audio = new Audio();\n audio.addEventListener(\"ended\", stop);\n audio.addEventListener(\"error\", stop);\n }\n audio.pause();\n audio.src = src;\n playing.value = id;\n // 播放被拒(自动播放策略 / 很快又点了别的条目打断了加载):只在还是这条时复位\n audio.play().catch(() => {\n if (playing.value === id) playing.value = null;\n });\n}\n","<script setup lang=\"ts\">\nimport { computed, inject, onBeforeUnmount } from \"vue\";\n\nimport AkIcon from \"../Icon/AkIcon.vue\";\nimport { HTML_LANG, voiceListKey } from \"./context\";\nimport { playing, stop, toggle } from \"./player\";\n\n/**\n * 一条语音:播放钮(+ 下载钮)+ 标题行(解锁条件 / 编号)+ 台词。一般放在 AkVoiceList 里,跟列表的语种走。\n * 标题旁不再标语种:当前语种在上面的切换条里,每条再标一遍只是复读,而「方言」这类也没有靠谱的缩写。\n * 播放钮标 data-no-toggle:皮肤脚本会在 document 上替模板输出的纯 CSS 播放钮翻 is-playing(演示用),这里的 is-playing 跟真实播放状态走,\n * 不退出那层委托就会两边各翻一次(点一下在放但图标还是播放,再点停了图标却变成暂停)。\n */\nconst props = withDefaults(\n defineProps<{\n /** 语音标题(任命助理 / 交谈1 …) */\n title: string;\n /** 台词:一个串;或按语种的对象 { cn, jp, en, kr, yue }(取当前语种,缺了退回第一项);列表给了 texts 时按文本键的对象(选中的几种一种一行) */\n text: string | Record<string, string>;\n /** 音频地址:一个串,或按语种的对象(同 text);取不到时播放钮禁用 */\n src?: string | Record<string, string>;\n /** 语音编号(CN_001),标题行里的小字 */\n code?: string;\n /** 游戏内解锁条件(提升至精英阶段1以查看),标题行里的灰标 */\n unlock?: string;\n /** 语种键:不在 AkVoiceList 里时用它取 text / src、标台词的 HTML lang;在列表里时跟列表的 v-model */\n lang?: string;\n /** 下载地址(现网是 torappu 的 wav):一个串,或按语种的对象(同 src);给了就在播放钮旁出一枚同款下载钮 */\n download?: string | Record<string, string>;\n /** 下载存成的文件名(<a download> 的值,任命助理.wav);不写由浏览器按地址定 */\n downloadName?: string;\n }>(),\n { src: undefined, code: undefined, unlock: undefined, lang: undefined, download: undefined, downloadName: undefined },\n);\n\nconst list = inject(voiceListKey, undefined);\nconst lang = computed(() => props.lang ?? list?.value.lang);\n\nfunction pick(v: string | Record<string, string> | undefined) {\n if (v === undefined || typeof v === \"string\") return v;\n return (lang.value !== undefined ? v[lang.value] : undefined) ?? Object.values(v)[0];\n}\nconst text = computed(() => {\n const v = props.text;\n if (typeof v === \"string\" || !list?.value.texts.length) return pick(v);\n return list.value.shownTexts.map(k => v[k]).filter(Boolean).join(\"\\n\");\n});\nconst src = computed(() => pick(props.src));\nconst download = computed(() => pick(props.download));\n\nconst id = Symbol(\"AkVoice\");\nconst isPlaying = computed(() => playing.value === id);\nonBeforeUnmount(() => isPlaying.value && stop());\n\nfunction onClick() {\n if (src.value) toggle(id, src.value);\n}\n</script>\n\n<template>\n <div class=\"ak-voice\">\n <button\n type=\"button\"\n :class=\"['ak-voice__play', { 'is-playing': isPlaying }]\"\n :aria-label=\"`播放 ${title}`\"\n :aria-pressed=\"isPlaying\"\n :disabled=\"!src\"\n data-no-toggle\n @click=\"onClick\"\n />\n <a v-if=\"download\" class=\"ak-voice__download\" :href=\"download\" :download=\"downloadName ?? ''\" :aria-label=\"`下载 ${title}`\" :title=\"`下载 ${title}`\">\n <AkIcon name=\"download\" :size=\"16\" />\n </a>\n <div>\n <div class=\"ak-voice__title\">\n {{ title }}\n <span v-if=\"unlock\" class=\"ak-voice__cond\">{{ unlock }}</span>\n <span v-if=\"code\" class=\"ak-code-id\">{{ code }}</span>\n <span v-if=\"isPlaying\" class=\"ak-voice__wave\" aria-hidden=\"true\"><i v-for=\"n in 5\" :key=\"n\" /></span>\n </div>\n <div class=\"ak-voice__text\" :lang=\"lang && HTML_LANG[lang]\">{{ text }}</div>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, inject, onBeforeUnmount } from \"vue\";\n\nimport AkIcon from \"../Icon/AkIcon.vue\";\nimport { HTML_LANG, voiceListKey } from \"./context\";\nimport { playing, stop, toggle } from \"./player\";\n\n/**\n * 一条语音:播放钮(+ 下载钮)+ 标题行(解锁条件 / 编号)+ 台词。一般放在 AkVoiceList 里,跟列表的语种走。\n * 标题旁不再标语种:当前语种在上面的切换条里,每条再标一遍只是复读,而「方言」这类也没有靠谱的缩写。\n * 播放钮标 data-no-toggle:皮肤脚本会在 document 上替模板输出的纯 CSS 播放钮翻 is-playing(演示用),这里的 is-playing 跟真实播放状态走,\n * 不退出那层委托就会两边各翻一次(点一下在放但图标还是播放,再点停了图标却变成暂停)。\n */\nconst props = withDefaults(\n defineProps<{\n /** 语音标题(任命助理 / 交谈1 …) */\n title: string;\n /** 台词:一个串;或按语种的对象 { cn, jp, en, kr, yue }(取当前语种,缺了退回第一项);列表给了 texts 时按文本键的对象(选中的几种一种一行) */\n text: string | Record<string, string>;\n /** 音频地址:一个串,或按语种的对象(同 text);取不到时播放钮禁用 */\n src?: string | Record<string, string>;\n /** 语音编号(CN_001),标题行里的小字 */\n code?: string;\n /** 游戏内解锁条件(提升至精英阶段1以查看),标题行里的灰标 */\n unlock?: string;\n /** 语种键:不在 AkVoiceList 里时用它取 text / src、标台词的 HTML lang;在列表里时跟列表的 v-model */\n lang?: string;\n /** 下载地址(现网是 torappu 的 wav):一个串,或按语种的对象(同 src);给了就在播放钮旁出一枚同款下载钮 */\n download?: string | Record<string, string>;\n /** 下载存成的文件名(<a download> 的值,任命助理.wav);不写由浏览器按地址定 */\n downloadName?: string;\n }>(),\n { src: undefined, code: undefined, unlock: undefined, lang: undefined, download: undefined, downloadName: undefined },\n);\n\nconst list = inject(voiceListKey, undefined);\nconst lang = computed(() => props.lang ?? list?.value.lang);\n\nfunction pick(v: string | Record<string, string> | undefined) {\n if (v === undefined || typeof v === \"string\") return v;\n return (lang.value !== undefined ? v[lang.value] : undefined) ?? Object.values(v)[0];\n}\nconst text = computed(() => {\n const v = props.text;\n if (typeof v === \"string\" || !list?.value.texts.length) return pick(v);\n return list.value.shownTexts.map(k => v[k]).filter(Boolean).join(\"\\n\");\n});\nconst src = computed(() => pick(props.src));\nconst download = computed(() => pick(props.download));\n\nconst id = Symbol(\"AkVoice\");\nconst isPlaying = computed(() => playing.value === id);\nonBeforeUnmount(() => isPlaying.value && stop());\n\nfunction onClick() {\n if (src.value) toggle(id, src.value);\n}\n</script>\n\n<template>\n <div class=\"ak-voice\">\n <button\n type=\"button\"\n :class=\"['ak-voice__play', { 'is-playing': isPlaying }]\"\n :aria-label=\"`播放 ${title}`\"\n :aria-pressed=\"isPlaying\"\n :disabled=\"!src\"\n data-no-toggle\n @click=\"onClick\"\n />\n <a v-if=\"download\" class=\"ak-voice__download\" :href=\"download\" :download=\"downloadName ?? ''\" :aria-label=\"`下载 ${title}`\" :title=\"`下载 ${title}`\">\n <AkIcon name=\"download\" :size=\"16\" />\n </a>\n <div>\n <div class=\"ak-voice__title\">\n {{ title }}\n <span v-if=\"unlock\" class=\"ak-voice__cond\">{{ unlock }}</span>\n <span v-if=\"code\" class=\"ak-code-id\">{{ code }}</span>\n <span v-if=\"isPlaying\" class=\"ak-voice__wave\" aria-hidden=\"true\"><i v-for=\"n in 5\" :key=\"n\" /></span>\n </div>\n <div class=\"ak-voice__text\" :lang=\"lang && HTML_LANG[lang]\">{{ text }}</div>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 档案条目(= 现网 {{人员档案}} 的一段):标题行(中文 + 英文小标 + 右侧解锁条件)+ 正文。\n * 正文里的 <p> 保留换行(white-space: pre-line),游戏文本的 \\n 可以原样放进一个 <p>。\n * 干员页 9 段档案配竖排标签页:AkTabs placement=\"left\" 的每个 AkTabPane 里放一个 AkDossier。\n */\ndefineProps<{\n /** 标题(客观履历) */\n title: string;\n /** 英文小标(Objective Record) */\n en?: string;\n /** 解锁条件(提升信赖至25%以查看更多信息),标题行右侧;locked 时也是遮罩上的文字 */\n unlock?: string;\n /** 未解锁:正文模糊、不可选,盖斜纹 + 🔒 解锁条件(文本仍在 DOM 里,可被搜索) */\n locked?: boolean;\n}>();\n\ndefineSlots<{\n /** 正文:若干 <p>,或键值表 / 属性表 */\n default?: () => unknown;\n}>();\n</script>\n\n<template>\n <div :class=\"['ak-dossier', { 'is-locked': locked }]\" :data-unlock=\"locked ? unlock : undefined\">\n <div class=\"ak-dossier__title\">\n {{ title }}<span v-if=\"en\" class=\"ak-en\">{{ en }}</span><span v-if=\"unlock\" class=\"ak-dossier__unlock\">{{ unlock }}</span>\n </div>\n <slot />\n </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 档案条目(= 现网 {{人员档案}} 的一段):标题行(中文 + 英文小标 + 右侧解锁条件)+ 正文。\n * 正文里的 <p> 保留换行(white-space: pre-line),游戏文本的 \\n 可以原样放进一个 <p>。\n * 干员页 9 段档案配竖排标签页:AkTabs placement=\"left\" 的每个 AkTabPane 里放一个 AkDossier。\n */\ndefineProps<{\n /** 标题(客观履历) */\n title: string;\n /** 英文小标(Objective Record) */\n en?: string;\n /** 解锁条件(提升信赖至25%以查看更多信息),标题行右侧;locked 时也是遮罩上的文字 */\n unlock?: string;\n /** 未解锁:正文模糊、不可选,盖斜纹 + 🔒 解锁条件(文本仍在 DOM 里,可被搜索) */\n locked?: boolean;\n}>();\n\ndefineSlots<{\n /** 正文:若干 <p>,或键值表 / 属性表 */\n default?: () => unknown;\n}>();\n</script>\n\n<template>\n <div :class=\"['ak-dossier', { 'is-locked': locked }]\" :data-unlock=\"locked ? unlock : undefined\">\n <div class=\"ak-dossier__title\">\n {{ title }}<span v-if=\"en\" class=\"ak-en\">{{ en }}</span><span v-if=\"unlock\" class=\"ak-dossier__unlock\">{{ unlock }}</span>\n </div>\n <slot />\n </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 涂黑文本(剧透 / 不予公开):悬停时显出;CSS 版只认 :hover,这里补上点按 / 键盘——\n * 可聚焦(聚焦时显出),点击或 Enter / Space 切换常显,触屏也能看。档案与剧情对话里都用它。\n */\n\n/** 是否常显(点过一次后保持显出) */\nconst revealed = defineModel<boolean>({ default: false });\n\ndefineSlots<{\n /** 被涂黑的文字 */\n default?: () => unknown;\n}>();\n\nfunction toggle() {\n revealed.value = !revealed.value;\n}\n</script>\n\n<template>\n <span\n :class=\"['ak-redacted', { 'is-revealed': revealed }]\"\n role=\"button\"\n tabindex=\"0\"\n :aria-pressed=\"revealed\"\n @click=\"toggle\"\n @keydown.enter.prevent=\"toggle\"\n @keydown.space.prevent=\"toggle\"\n >\n <slot />\n </span>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 涂黑文本(剧透 / 不予公开):悬停时显出;CSS 版只认 :hover,这里补上点按 / 键盘——\n * 可聚焦(聚焦时显出),点击或 Enter / Space 切换常显,触屏也能看。档案与剧情对话里都用它。\n */\n\n/** 是否常显(点过一次后保持显出) */\nconst revealed = defineModel<boolean>({ default: false });\n\ndefineSlots<{\n /** 被涂黑的文字 */\n default?: () => unknown;\n}>();\n\nfunction toggle() {\n revealed.value = !revealed.value;\n}\n</script>\n\n<template>\n <span\n :class=\"['ak-redacted', { 'is-revealed': revealed }]\"\n role=\"button\"\n tabindex=\"0\"\n :aria-pressed=\"revealed\"\n @click=\"toggle\"\n @keydown.enter.prevent=\"toggle\"\n @keydown.space.prevent=\"toggle\"\n >\n <slot />\n </span>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 档案类卡片(干员密录 / 悖论模拟 / 未获得时档案)——现网那几张「————xx」折叠 wikitable 的替身。\n * 结构同 Naive 的 NCard:头(小标 + 标题 + 右侧解锁条件)+ 体 + #footer 页脚(阅读 / 关卡 / 首通奖励);与 AkDossier 同一张脸。\n */\nwithDefaults(\n defineProps<{\n /** 标题(h4) */\n title: string;\n /** 标题前的小标(Record · 密录 1 / Paradox · 悖论模拟) */\n kicker?: string;\n /** 解锁条件(纯文本);要放精英 / 信赖 / 关卡号时改用 #unlock 插槽 */\n unlock?: string;\n /** 解锁条件前的小标 */\n unlockLabel?: string;\n }>(),\n { kicker: undefined, unlock: undefined, unlockLabel: \"解锁条件\" },\n);\n\ndefineSlots<{\n /** 正文:若干 <p>(保留换行) */\n default?: () => unknown;\n /** 解锁条件(代替 unlock) */\n unlock?: () => unknown;\n /** 页脚:AkArchivePlay「阅读密录」、关卡、首通奖励 … */\n footer?: () => unknown;\n}>();\n</script>\n\n<template>\n <div class=\"ak-archive\">\n <div class=\"ak-archive__head\">\n <span v-if=\"kicker\" class=\"ak-archive__kicker\">{{ kicker }}</span>\n <h4 class=\"ak-archive__title\">{{ title }}</h4>\n <span v-if=\"unlock || $slots.unlock\" class=\"ak-archive__req\">\n <span class=\"ak-overline\">{{ unlockLabel }}</span>\n <slot name=\"unlock\">{{ unlock }}</slot>\n </span>\n </div>\n <div class=\"ak-archive__body\"><slot /></div>\n <div v-if=\"$slots.footer\" class=\"ak-archive__foot\"><slot name=\"footer\" /></div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 档案类卡片(干员密录 / 悖论模拟 / 未获得时档案)——现网那几张「————xx」折叠 wikitable 的替身。\n * 结构同 Naive 的 NCard:头(小标 + 标题 + 右侧解锁条件)+ 体 + #footer 页脚(阅读 / 关卡 / 首通奖励);与 AkDossier 同一张脸。\n */\nwithDefaults(\n defineProps<{\n /** 标题(h4) */\n title: string;\n /** 标题前的小标(Record · 密录 1 / Paradox · 悖论模拟) */\n kicker?: string;\n /** 解锁条件(纯文本);要放精英 / 信赖 / 关卡号时改用 #unlock 插槽 */\n unlock?: string;\n /** 解锁条件前的小标 */\n unlockLabel?: string;\n }>(),\n { kicker: undefined, unlock: undefined, unlockLabel: \"解锁条件\" },\n);\n\ndefineSlots<{\n /** 正文:若干 <p>(保留换行) */\n default?: () => unknown;\n /** 解锁条件(代替 unlock) */\n unlock?: () => unknown;\n /** 页脚:AkArchivePlay「阅读密录」、关卡、首通奖励 … */\n footer?: () => unknown;\n}>();\n</script>\n\n<template>\n <div class=\"ak-archive\">\n <div class=\"ak-archive__head\">\n <span v-if=\"kicker\" class=\"ak-archive__kicker\">{{ kicker }}</span>\n <h4 class=\"ak-archive__title\">{{ title }}</h4>\n <span v-if=\"unlock || $slots.unlock\" class=\"ak-archive__req\">\n <span class=\"ak-overline\">{{ unlockLabel }}</span>\n <slot name=\"unlock\">{{ unlock }}</slot>\n </span>\n </div>\n <div class=\"ak-archive__body\"><slot /></div>\n <div v-if=\"$slots.footer\" class=\"ak-archive__foot\"><slot name=\"footer\" /></div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/** 档案卡页脚的「阅读 / 播放」块:黑底 + 播放三角 + 文字,悬停变主色。有 href 是链接(去密录页),没有是按钮(发 click) */\ndefineProps<{\n /** 链接地址(陈/干员密录/1);不写就渲染成 <button> */\n href?: string;\n}>();\n\ndefineSlots<{\n /** 文字(阅读密录 · 一鼓作气) */\n default?: () => unknown;\n}>();\n</script>\n\n<template>\n <component :is=\"href ? 'a' : 'button'\" class=\"ak-archive__play\" :href=\"href\" :type=\"href ? undefined : 'button'\">\n <span class=\"ak-voice__play\" aria-hidden=\"true\" /><slot />\n </component>\n</template>\n","<script setup lang=\"ts\">\n/** 档案卡页脚的「阅读 / 播放」块:黑底 + 播放三角 + 文字,悬停变主色。有 href 是链接(去密录页),没有是按钮(发 click) */\ndefineProps<{\n /** 链接地址(陈/干员密录/1);不写就渲染成 <button> */\n href?: string;\n}>();\n\ndefineSlots<{\n /** 文字(阅读密录 · 一鼓作气) */\n default?: () => unknown;\n}>();\n</script>\n\n<template>\n <component :is=\"href ? 'a' : 'button'\" class=\"ak-archive__play\" :href=\"href\" :type=\"href ? undefined : 'button'\">\n <span class=\"ak-voice__play\" aria-hidden=\"true\" /><slot />\n </component>\n</template>\n","<script setup lang=\"ts\">\n/** 剧情对话:一个 <dl>,说话人一列右对齐(主色粗体)、台词一列;里面放若干 AkDialogueLine。分段就是几个 AkDialogue 之间插小标题 */\ndefineSlots<{\n /** 若干 AkDialogueLine */\n default?: () => unknown;\n}>();\n</script>\n\n<template>\n <dl class=\"ak-dialogue\"><slot /></dl>\n</template>\n","<script setup lang=\"ts\">\n/** 剧情对话:一个 <dl>,说话人一列右对齐(主色粗体)、台词一列;里面放若干 AkDialogueLine。分段就是几个 AkDialogue 之间插小标题 */\ndefineSlots<{\n /** 若干 AkDialogueLine */\n default?: () => unknown;\n}>();\n</script>\n\n<template>\n <dl class=\"ak-dialogue\"><slot /></dl>\n</template>\n","<script setup lang=\"ts\">\n/** 剧情对话的一句:输出 <dt>(说话人)+ <dd>(台词)。只能放在 AkDialogue 里 */\nconst props = defineProps<{\n /** 说话人;不写(也没有 #speaker 插槽)就是旁白:说话人列写「旁白」,整句灰色斜体 */\n speaker?: string;\n}>();\n\nconst slots = defineSlots<{\n /** 台词 */\n default?: () => unknown;\n /** 说话人(代替 speaker,比如身份要涂黑时放 AkRedacted) */\n speaker?: () => unknown;\n}>();\n\n/** 插槽不是响应式的,放在渲染期判断 */\nconst isNarrator = () => !props.speaker && !slots.speaker;\n</script>\n\n<template>\n <dt :class=\"{ narrator: isNarrator() }\"><slot name=\"speaker\">{{ speaker ?? \"旁白\" }}</slot></dt>\n <dd :class=\"{ narrator: isNarrator() }\"><slot /></dd>\n</template>\n","<script setup lang=\"ts\">\n/** 剧情对话的一句:输出 <dt>(说话人)+ <dd>(台词)。只能放在 AkDialogue 里 */\nconst props = defineProps<{\n /** 说话人;不写(也没有 #speaker 插槽)就是旁白:说话人列写「旁白」,整句灰色斜体 */\n speaker?: string;\n}>();\n\nconst slots = defineSlots<{\n /** 台词 */\n default?: () => unknown;\n /** 说话人(代替 speaker,比如身份要涂黑时放 AkRedacted) */\n speaker?: () => unknown;\n}>();\n\n/** 插槽不是响应式的,放在渲染期判断 */\nconst isNarrator = () => !props.speaker && !slots.speaker;\n</script>\n\n<template>\n <dt :class=\"{ narrator: isNarrator() }\"><slot name=\"speaker\">{{ speaker ?? \"旁白\" }}</slot></dt>\n <dd :class=\"{ narrator: isNarrator() }\"><slot /></dd>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 理智消耗:六边形 + 数字(游戏内理智图标的剪影,不用图片)。读屏念「理智 6」——六边形是纯装饰,前缀字藏在 sr-only 里。\n */\ndefineProps<{\n /** 消耗的理智 */\n value: number | string;\n}>();\n</script>\n\n<template>\n <span class=\"ak-sanity\"><span class=\"ak-sr-only\">理智 </span>{{ value }}</span>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 理智消耗:六边形 + 数字(游戏内理智图标的剪影,不用图片)。读屏念「理智 6」——六边形是纯装饰,前缀字藏在 sr-only 里。\n */\ndefineProps<{\n /** 消耗的理智 */\n value: number | string;\n}>();\n</script>\n\n<template>\n <span class=\"ak-sanity\"><span class=\"ak-sr-only\">理智 </span>{{ value }}</span>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nimport AkSanity from \"./AkSanity.vue\";\n\nconst props = withDefaults(\n defineProps<{\n /** 关卡编号(1-7 / H6-4 / TO-EX-1),展示字大号 */\n code: string;\n /** 关卡名 */\n name?: string;\n /** 编号下的小字:章节 / 类型(Main · Chapter 1 / Hard / Story) */\n caption?: string;\n /** 左侧类型色条:hard 磨难红 · ex 深红 · story 灰;default 无色条。按活动分好组的列表里关卡码已说明类型,不必再上色 */\n variant?: \"default\" | \"hard\" | \"ex\" | \"story\";\n /** 理智消耗:元信息行里的六边形 + 数字 */\n sanity?: number | string;\n /** 推荐等级(LV.30 / E2 LV.40),元信息行里显示为「推荐 LV.30」 */\n level?: string;\n /** 链接到关卡页:整张卡是链接(悬停描边变强调色) */\n href?: string;\n }>(),\n { name: undefined, caption: undefined, variant: \"default\", sanity: undefined, level: undefined, href: undefined },\n);\n\nconst slots = defineSlots<{\n /** 元信息行末尾追加的项(剧情关卡 / 前往关卡页 »),每项一个元素,行内 flex 间距 10 */\n meta?: () => unknown;\n}>();\n\n/** 没有元信息行时关卡名直接作网格的第二列(首页「近期新增」的紧凑格:名字可以单独省略号截断) */\nconst hasMeta = () => props.sanity !== undefined || !!props.level || !!slots.meta; // 插槽不是响应式的,放在渲染期判断\n\nconst classes = computed(() => [\n \"ak-stage\",\n props.variant !== \"default\" && `ak-stage--${props.variant}`,\n // 整块是链接:不带 not-prose 时正文的 a:visited(0,1,1)会压过 .ak-stage 的 color: inherit\n { \"ak-not-prose\": !!props.href },\n]);\n</script>\n\n<template>\n <component :is=\"href ? 'a' : 'div'\" :class=\"classes\" :href=\"href\">\n <span class=\"ak-stage__code\">{{ code }}<small v-if=\"caption\">{{ caption }}</small></span>\n <span v-if=\"hasMeta()\">\n <span v-if=\"name\" class=\"ak-stage__name\">{{ name }}</span>\n <span class=\"ak-stage__meta\">\n <span v-if=\"sanity !== undefined\"><AkSanity :value=\"sanity\" /></span>\n <span v-if=\"level\">推荐 <b>{{ level }}</b></span>\n <slot name=\"meta\" />\n </span>\n </span>\n <span v-else-if=\"name\" class=\"ak-stage__name\">{{ name }}</span>\n </component>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nimport AkSanity from \"./AkSanity.vue\";\n\nconst props = withDefaults(\n defineProps<{\n /** 关卡编号(1-7 / H6-4 / TO-EX-1),展示字大号 */\n code: string;\n /** 关卡名 */\n name?: string;\n /** 编号下的小字:章节 / 类型(Main · Chapter 1 / Hard / Story) */\n caption?: string;\n /** 左侧类型色条:hard 磨难红 · ex 深红 · story 灰;default 无色条。按活动分好组的列表里关卡码已说明类型,不必再上色 */\n variant?: \"default\" | \"hard\" | \"ex\" | \"story\";\n /** 理智消耗:元信息行里的六边形 + 数字 */\n sanity?: number | string;\n /** 推荐等级(LV.30 / E2 LV.40),元信息行里显示为「推荐 LV.30」 */\n level?: string;\n /** 链接到关卡页:整张卡是链接(悬停描边变强调色) */\n href?: string;\n }>(),\n { name: undefined, caption: undefined, variant: \"default\", sanity: undefined, level: undefined, href: undefined },\n);\n\nconst slots = defineSlots<{\n /** 元信息行末尾追加的项(剧情关卡 / 前往关卡页 »),每项一个元素,行内 flex 间距 10 */\n meta?: () => unknown;\n}>();\n\n/** 没有元信息行时关卡名直接作网格的第二列(首页「近期新增」的紧凑格:名字可以单独省略号截断) */\nconst hasMeta = () => props.sanity !== undefined || !!props.level || !!slots.meta; // 插槽不是响应式的,放在渲染期判断\n\nconst classes = computed(() => [\n \"ak-stage\",\n props.variant !== \"default\" && `ak-stage--${props.variant}`,\n // 整块是链接:不带 not-prose 时正文的 a:visited(0,1,1)会压过 .ak-stage 的 color: inherit\n { \"ak-not-prose\": !!props.href },\n]);\n</script>\n\n<template>\n <component :is=\"href ? 'a' : 'div'\" :class=\"classes\" :href=\"href\">\n <span class=\"ak-stage__code\">{{ code }}<small v-if=\"caption\">{{ caption }}</small></span>\n <span v-if=\"hasMeta()\">\n <span v-if=\"name\" class=\"ak-stage__name\">{{ name }}</span>\n <span class=\"ak-stage__meta\">\n <span v-if=\"sanity !== undefined\"><AkSanity :value=\"sanity\" /></span>\n <span v-if=\"level\">推荐 <b>{{ level }}</b></span>\n <slot name=\"meta\" />\n </span>\n </span>\n <span v-else-if=\"name\" class=\"ak-stage__name\">{{ name }}</span>\n </component>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 行内关卡号:黑白反转的小方块(展示字),放在正文 / 解锁条件里(「3星通关主题曲 5-8」)。关卡号写在默认插槽里。\n */\ndefineProps<{\n /** hard = 红底(磨难 / 险地关卡号) */\n variant?: \"default\" | \"hard\";\n /** 链接到关卡页 */\n href?: string;\n}>();\n\ndefineSlots<{\n /** 关卡号(5-8 / H6-4) */\n default?: () => unknown;\n}>();\n</script>\n\n<template>\n <!-- 链接版带 ak-not-prose:正文的 a:visited / a:hover 会把反白字染成链接色 -->\n <component\n :is=\"href ? 'a' : 'span'\"\n :class=\"['ak-stage-code', variant === 'hard' && 'ak-stage-code--hard', href && 'ak-not-prose']\"\n :href=\"href\"\n >\n <slot />\n </component>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 行内关卡号:黑白反转的小方块(展示字),放在正文 / 解锁条件里(「3星通关主题曲 5-8」)。关卡号写在默认插槽里。\n */\ndefineProps<{\n /** hard = 红底(磨难 / 险地关卡号) */\n variant?: \"default\" | \"hard\";\n /** 链接到关卡页 */\n href?: string;\n}>();\n\ndefineSlots<{\n /** 关卡号(5-8 / H6-4) */\n default?: () => unknown;\n}>();\n</script>\n\n<template>\n <!-- 链接版带 ak-not-prose:正文的 a:visited / a:hover 会把反白字染成链接色 -->\n <component\n :is=\"href ? 'a' : 'span'\"\n :class=\"['ak-stage-code', variant === 'hard' && 'ak-stage-code--hard', href && 'ak-not-prose']\"\n :href=\"href\"\n >\n <slot />\n </component>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nexport type EnemyRank = \"normal\" | \"elite\" | \"boss\";\n\nconst props = withDefaults(\n defineProps<{\n /** 敌人名 */\n name: string;\n /** 编号(B003 / E020 / N001),显示在级别后面:「BOSS · B003」 */\n code?: string;\n /** 级别(游戏 enemyLevel):normal 普通 · elite 精英(橙色条)· boss 领袖(红色条);级别字总会写出来,不只靠色条 */\n variant?: EnemyRank;\n /** 头像地址(方图,裁成 64px 圆);不写时是深色空圆 */\n src?: string;\n /** 威胁度:点亮几枚菱形 */\n level?: number;\n /** 菱形总数 */\n levelMax?: number;\n }>(),\n { code: undefined, variant: \"normal\", src: undefined, level: undefined, levelMax: 4 },\n);\n\ndefineSlots<{\n /** 名字 / 威胁度下面追加的内容(属性、能力摘要) */\n default?: () => unknown;\n}>();\n\nconst RANK: Record<EnemyRank, string> = { normal: \"NORMAL\", elite: \"ELITE\", boss: \"BOSS\" };\n\nconst classes = computed(() => [\"ak-enemy\", props.variant !== \"normal\" && `ak-enemy--${props.variant}`]);\nconst codeText = computed(() => [RANK[props.variant], props.code].filter(Boolean).join(\" · \"));\n</script>\n\n<template>\n <div :class=\"classes\">\n <img v-if=\"src\" class=\"ak-enemy__img\" :src=\"src\" alt=\"\" />\n <div v-else class=\"ak-enemy__img\" />\n <div>\n <div class=\"ak-enemy__code\">{{ codeText }}</div>\n <div class=\"ak-enemy__name\">{{ name }}</div>\n <div v-if=\"level !== undefined\" class=\"ak-enemy__level\" role=\"img\" :aria-label=\"`威胁度 ${level} / ${levelMax}`\">\n <i v-for=\"n in levelMax\" :key=\"n\" :class=\"{ on: n <= level }\" />\n </div>\n <slot />\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nexport type EnemyRank = \"normal\" | \"elite\" | \"boss\";\n\nconst props = withDefaults(\n defineProps<{\n /** 敌人名 */\n name: string;\n /** 编号(B003 / E020 / N001),显示在级别后面:「BOSS · B003」 */\n code?: string;\n /** 级别(游戏 enemyLevel):normal 普通 · elite 精英(橙色条)· boss 领袖(红色条);级别字总会写出来,不只靠色条 */\n variant?: EnemyRank;\n /** 头像地址(方图,裁成 64px 圆);不写时是深色空圆 */\n src?: string;\n /** 威胁度:点亮几枚菱形 */\n level?: number;\n /** 菱形总数 */\n levelMax?: number;\n }>(),\n { code: undefined, variant: \"normal\", src: undefined, level: undefined, levelMax: 4 },\n);\n\ndefineSlots<{\n /** 名字 / 威胁度下面追加的内容(属性、能力摘要) */\n default?: () => unknown;\n}>();\n\nconst RANK: Record<EnemyRank, string> = { normal: \"NORMAL\", elite: \"ELITE\", boss: \"BOSS\" };\n\nconst classes = computed(() => [\"ak-enemy\", props.variant !== \"normal\" && `ak-enemy--${props.variant}`]);\nconst codeText = computed(() => [RANK[props.variant], props.code].filter(Boolean).join(\" · \"));\n</script>\n\n<template>\n <div :class=\"classes\">\n <img v-if=\"src\" class=\"ak-enemy__img\" :src=\"src\" alt=\"\" />\n <div v-else class=\"ak-enemy__img\" />\n <div>\n <div class=\"ak-enemy__code\">{{ codeText }}</div>\n <div class=\"ak-enemy__name\">{{ name }}</div>\n <div v-if=\"level !== undefined\" class=\"ak-enemy__level\" role=\"img\" :aria-label=\"`威胁度 ${level} / ${levelMax}`\">\n <i v-for=\"n in levelMax\" :key=\"n\" :class=\"{ on: n <= level }\" />\n </div>\n <slot />\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nconst props = withDefaults(\n defineProps<{\n /** 势力徽标(游戏 spritepack/ui_camp_logo 的白色线稿,亮色下由 CSS 反相成黑) */\n src: string;\n /** 势力名:显示在徽标右侧;logoOnly 时作图片 alt 和悬停提示 */\n name: string;\n /** 徽标高度:md 28 · lg 48(px) */\n size?: \"md\" | \"lg\";\n /** 外观:default 线稿跟主题反相 · box 深底方块、原色白线稿(两套主题下都一样) */\n variant?: \"default\" | \"box\";\n /** 只显示徽标(名字进 alt 与悬停提示) */\n logoOnly?: boolean;\n }>(),\n { size: \"md\", variant: \"default\" },\n);\n\nconst classes = computed(() => [\n \"ak-camp\",\n props.size !== \"md\" && `ak-camp--${props.size}`,\n props.variant !== \"default\" && `ak-camp--${props.variant}`,\n]);\n</script>\n\n<template>\n <span :class=\"classes\" :data-ak-tip=\"logoOnly ? name : undefined\">\n <img :src=\"src\" :alt=\"logoOnly ? name : ''\" />\n <template v-if=\"!logoOnly\">{{ name }}</template>\n </span>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nconst props = withDefaults(\n defineProps<{\n /** 势力徽标(游戏 spritepack/ui_camp_logo 的白色线稿,亮色下由 CSS 反相成黑) */\n src: string;\n /** 势力名:显示在徽标右侧;logoOnly 时作图片 alt 和悬停提示 */\n name: string;\n /** 徽标高度:md 28 · lg 48(px) */\n size?: \"md\" | \"lg\";\n /** 外观:default 线稿跟主题反相 · box 深底方块、原色白线稿(两套主题下都一样) */\n variant?: \"default\" | \"box\";\n /** 只显示徽标(名字进 alt 与悬停提示) */\n logoOnly?: boolean;\n }>(),\n { size: \"md\", variant: \"default\" },\n);\n\nconst classes = computed(() => [\n \"ak-camp\",\n props.size !== \"md\" && `ak-camp--${props.size}`,\n props.variant !== \"default\" && `ak-camp--${props.variant}`,\n]);\n</script>\n\n<template>\n <span :class=\"classes\" :data-ak-tip=\"logoOnly ? name : undefined\">\n <img :src=\"src\" :alt=\"logoOnly ? name : ''\" />\n <template v-if=\"!logoOnly\">{{ name }}</template>\n </span>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nconst props = withDefaults(\n defineProps<{\n /** 活动名 */\n title: string;\n /** 标题上方的类型行(Side Story · 进行中 / 寻访 · 已结束),强调色、大写字距 */\n kind?: string;\n /** 起止时间(2026.08.08 16:00 — 09.07 03:59) */\n time?: string;\n /** 横幅图地址(21:9 裁切铺满);不写且没有 #cover 插槽时不出横幅 */\n cover?: string;\n /** 状态:live 进行中(类型行前闪烁红点)· ended 已结束(类型行转灰)· default 不标 */\n status?: \"default\" | \"live\" | \"ended\";\n }>(),\n { kind: undefined, time: undefined, cover: undefined, status: \"default\" },\n);\n\ndefineSlots<{\n /** 横幅(代替 cover):自己放 .ak-event__banner 元素 */\n cover?: () => unknown;\n /** 标题(代替 title,如包一层链接) */\n title?: () => unknown;\n /** 时间下面的内容:倒计时 AkCountdown、按钮 */\n default?: () => unknown;\n}>();\n\nconst classes = computed(() => [\"ak-event\", { \"is-live\": props.status === \"live\", \"is-ended\": props.status === \"ended\" }]);\n</script>\n\n<template>\n <div :class=\"classes\">\n <slot name=\"cover\"><img v-if=\"cover\" class=\"ak-event__banner\" :src=\"cover\" alt=\"\" /></slot>\n <div class=\"ak-event__body\">\n <div v-if=\"kind\" class=\"ak-event__type\">{{ kind }}</div>\n <div class=\"ak-event__title\"><slot name=\"title\">{{ title }}</slot></div>\n <div v-if=\"time\" class=\"ak-event__time\">{{ time }}</div>\n <slot />\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nconst props = withDefaults(\n defineProps<{\n /** 活动名 */\n title: string;\n /** 标题上方的类型行(Side Story · 进行中 / 寻访 · 已结束),强调色、大写字距 */\n kind?: string;\n /** 起止时间(2026.08.08 16:00 — 09.07 03:59) */\n time?: string;\n /** 横幅图地址(21:9 裁切铺满);不写且没有 #cover 插槽时不出横幅 */\n cover?: string;\n /** 状态:live 进行中(类型行前闪烁红点)· ended 已结束(类型行转灰)· default 不标 */\n status?: \"default\" | \"live\" | \"ended\";\n }>(),\n { kind: undefined, time: undefined, cover: undefined, status: \"default\" },\n);\n\ndefineSlots<{\n /** 横幅(代替 cover):自己放 .ak-event__banner 元素 */\n cover?: () => unknown;\n /** 标题(代替 title,如包一层链接) */\n title?: () => unknown;\n /** 时间下面的内容:倒计时 AkCountdown、按钮 */\n default?: () => unknown;\n}>();\n\nconst classes = computed(() => [\"ak-event\", { \"is-live\": props.status === \"live\", \"is-ended\": props.status === \"ended\" }]);\n</script>\n\n<template>\n <div :class=\"classes\">\n <slot name=\"cover\"><img v-if=\"cover\" class=\"ak-event__banner\" :src=\"cover\" alt=\"\" /></slot>\n <div class=\"ak-event__body\">\n <div v-if=\"kind\" class=\"ak-event__type\">{{ kind }}</div>\n <div class=\"ak-event__title\"><slot name=\"title\">{{ title }}</slot></div>\n <div v-if=\"time\" class=\"ak-event__time\">{{ time }}</div>\n <slot />\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, onBeforeUnmount, onMounted, ref, watch } from \"vue\";\n\nconst props = withDefaults(\n defineProps<{\n /** 截止时刻(ISO 串 / 时间戳 / Date),按当前时间实时倒数——活动、卡池、周常刷新都用它 */\n until?: string | number | Date;\n /** 或者给剩余毫秒数,从挂载时起倒数(同 Naive 的 NCountdown);有 until 时忽略 */\n duration?: number;\n /** 是否走字;false 时停在当前读数(duration 模式下恢复后接着倒数) */\n active?: boolean;\n /** 最小单位:min 到分(默认,每分钟刷新)· sec 到秒 */\n precision?: \"min\" | \"sec\";\n /** 最多显示几格,从最大的单位数起:2 → 「03 days 14 hrs」/ 不足一天时「14 hrs 27 mins」(首页幻灯片);不写则一直显示到 precision */\n parts?: number;\n }>(),\n { until: undefined, duration: undefined, active: true, precision: \"min\", parts: undefined },\n);\n\nconst emit = defineEmits<{\n /** 倒数到 0(之后整个倒计时不再渲染) */\n finish: [];\n}>();\n\nconst initial = () => (props.until !== undefined ? new Date(props.until).getTime() - Date.now() : (props.duration ?? 0));\n\n/** 剩余毫秒;到点或无效日期(NaN)时不渲染 */\nconst remaining = ref(initial());\n/** 走字时的截止时间戳 */\nlet endAt = 0;\nlet timer: ReturnType<typeof setTimeout> | undefined;\n\n/** 下一次读数变化时再醒:到分时最多一分钟一次,不每秒重渲染 */\nfunction schedule() {\n clearTimeout(timer);\n if (!props.active || !(remaining.value > 0)) return;\n const unit = props.precision === \"sec\" ? 1e3 : 6e4;\n timer = setTimeout(tick, (remaining.value % unit || unit) + 20);\n}\nfunction tick() {\n const was = remaining.value;\n remaining.value = endAt - Date.now();\n if (was > 0 && !(remaining.value > 0)) emit(\"finish\");\n schedule();\n}\nfunction start() {\n endAt = props.until !== undefined ? new Date(props.until).getTime() : Date.now() + remaining.value;\n tick();\n}\n/** 停下时把读数补到此刻:duration 模式恢复后从这里接着倒数,不丢上一次刷新以来走掉的时间 */\nfunction stop() {\n clearTimeout(timer);\n if (endAt) remaining.value = endAt - Date.now();\n}\n\nonMounted(() => props.active && start());\nonBeforeUnmount(() => clearTimeout(timer));\nwatch(\n () => props.active,\n on => (on ? start() : stop()),\n);\nwatch([() => props.until, () => props.duration], () => {\n remaining.value = initial();\n if (props.active) start();\n});\n\nconst UNITS = [\n { ms: 864e5, mod: Infinity, unit: \"day\", zh: \"天\" },\n { ms: 36e5, mod: 24, unit: \"hr\", zh: \"小时\" },\n { ms: 6e4, mod: 60, unit: \"min\", zh: \"分\" },\n { ms: 1e3, mod: 60, unit: \"sec\", zh: \"秒\" },\n] as const;\n\n/** 不足一天时从「时」起(时总会显示,00 也显示);到 precision 为止,再按 parts 截断 */\nconst cells = computed(() => {\n const ms = Math.max(0, remaining.value);\n const all = UNITS.map(u => ({ ...u, value: Math.floor(ms / u.ms) % u.mod }));\n const shown = all.slice(all[0].value ? 0 : 1, props.precision === \"sec\" ? 4 : 3);\n return props.parts ? shown.slice(0, props.parts) : shown;\n});\nconst spoken = computed(() => `剩余 ${cells.value.map(c => `${c.value} ${c.zh}`).join(\" \")}`);\nconst pad2 = (n: number) => String(n).padStart(2, \"0\");\n/** 单位都是缩写 + 复数 s,数值为 1 时用单数:01 day / 01 hr / 01 min / 01 sec */\nconst label = (c: { unit: string; value: number }) => (c.value === 1 ? c.unit : `${c.unit}s`);\n</script>\n\n<template>\n <!-- role=\"timer\"(隐式 aria-live=off,不会每分钟打断读屏);读数是英文单位,读屏名给中文 -->\n <span v-if=\"remaining > 0\" class=\"ak-countdown\" role=\"timer\" :aria-label=\"spoken\">\n <span v-for=\"c in cells\" :key=\"c.unit\" aria-hidden=\"true\"><b>{{ pad2(c.value) }}</b><small>{{ label(c) }}</small></span>\n </span>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, onBeforeUnmount, onMounted, ref, watch } from \"vue\";\n\nconst props = withDefaults(\n defineProps<{\n /** 截止时刻(ISO 串 / 时间戳 / Date),按当前时间实时倒数——活动、卡池、周常刷新都用它 */\n until?: string | number | Date;\n /** 或者给剩余毫秒数,从挂载时起倒数(同 Naive 的 NCountdown);有 until 时忽略 */\n duration?: number;\n /** 是否走字;false 时停在当前读数(duration 模式下恢复后接着倒数) */\n active?: boolean;\n /** 最小单位:min 到分(默认,每分钟刷新)· sec 到秒 */\n precision?: \"min\" | \"sec\";\n /** 最多显示几格,从最大的单位数起:2 → 「03 days 14 hrs」/ 不足一天时「14 hrs 27 mins」(首页幻灯片);不写则一直显示到 precision */\n parts?: number;\n }>(),\n { until: undefined, duration: undefined, active: true, precision: \"min\", parts: undefined },\n);\n\nconst emit = defineEmits<{\n /** 倒数到 0(之后整个倒计时不再渲染) */\n finish: [];\n}>();\n\nconst initial = () => (props.until !== undefined ? new Date(props.until).getTime() - Date.now() : (props.duration ?? 0));\n\n/** 剩余毫秒;到点或无效日期(NaN)时不渲染 */\nconst remaining = ref(initial());\n/** 走字时的截止时间戳 */\nlet endAt = 0;\nlet timer: ReturnType<typeof setTimeout> | undefined;\n\n/** 下一次读数变化时再醒:到分时最多一分钟一次,不每秒重渲染 */\nfunction schedule() {\n clearTimeout(timer);\n if (!props.active || !(remaining.value > 0)) return;\n const unit = props.precision === \"sec\" ? 1e3 : 6e4;\n timer = setTimeout(tick, (remaining.value % unit || unit) + 20);\n}\nfunction tick() {\n const was = remaining.value;\n remaining.value = endAt - Date.now();\n if (was > 0 && !(remaining.value > 0)) emit(\"finish\");\n schedule();\n}\nfunction start() {\n endAt = props.until !== undefined ? new Date(props.until).getTime() : Date.now() + remaining.value;\n tick();\n}\n/** 停下时把读数补到此刻:duration 模式恢复后从这里接着倒数,不丢上一次刷新以来走掉的时间 */\nfunction stop() {\n clearTimeout(timer);\n if (endAt) remaining.value = endAt - Date.now();\n}\n\nonMounted(() => props.active && start());\nonBeforeUnmount(() => clearTimeout(timer));\nwatch(\n () => props.active,\n on => (on ? start() : stop()),\n);\nwatch([() => props.until, () => props.duration], () => {\n remaining.value = initial();\n if (props.active) start();\n});\n\nconst UNITS = [\n { ms: 864e5, mod: Infinity, unit: \"day\", zh: \"天\" },\n { ms: 36e5, mod: 24, unit: \"hr\", zh: \"小时\" },\n { ms: 6e4, mod: 60, unit: \"min\", zh: \"分\" },\n { ms: 1e3, mod: 60, unit: \"sec\", zh: \"秒\" },\n] as const;\n\n/** 不足一天时从「时」起(时总会显示,00 也显示);到 precision 为止,再按 parts 截断 */\nconst cells = computed(() => {\n const ms = Math.max(0, remaining.value);\n const all = UNITS.map(u => ({ ...u, value: Math.floor(ms / u.ms) % u.mod }));\n const shown = all.slice(all[0].value ? 0 : 1, props.precision === \"sec\" ? 4 : 3);\n return props.parts ? shown.slice(0, props.parts) : shown;\n});\nconst spoken = computed(() => `剩余 ${cells.value.map(c => `${c.value} ${c.zh}`).join(\" \")}`);\nconst pad2 = (n: number) => String(n).padStart(2, \"0\");\n/** 单位都是缩写 + 复数 s,数值为 1 时用单数:01 day / 01 hr / 01 min / 01 sec */\nconst label = (c: { unit: string; value: number }) => (c.value === 1 ? c.unit : `${c.unit}s`);\n</script>\n\n<template>\n <!-- role=\"timer\"(隐式 aria-live=off,不会每分钟打断读屏);读数是英文单位,读屏名给中文 -->\n <span v-if=\"remaining > 0\" class=\"ak-countdown\" role=\"timer\" :aria-label=\"spoken\">\n <span v-for=\"c in cells\" :key=\"c.unit\" aria-hidden=\"true\"><b>{{ pad2(c.value) }}</b><small>{{ label(c) }}</small></span>\n </span>\n</template>\n","<script setup lang=\"ts\">\n/**\n * Breaking news 横幅(游戏主界面那条):左边矩形红块 + 反色底的一行正文,太长时省略号截断。\n * 天然只装一条——同时有好几条活动要列时用列表(首页「进行中的网页活动」),别往这里塞。\n */\nwithDefaults(\n defineProps<{\n /** 红块里的字(Bender 大写) */\n title?: string;\n }>(),\n { title: \"Breaking News\" },\n);\n\ndefineSlots<{\n /** 红块内容(代替 title) */\n title?: () => unknown;\n /** 正文:一行,可含链接 / 加粗;超长省略号截断 */\n default?: () => unknown;\n}>();\n</script>\n\n<template>\n <div class=\"ak-news\">\n <span class=\"ak-news__label\"><slot name=\"title\">{{ title }}</slot></span>\n <span class=\"ak-news__text\"><slot /></span>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * Breaking news 横幅(游戏主界面那条):左边矩形红块 + 反色底的一行正文,太长时省略号截断。\n * 天然只装一条——同时有好几条活动要列时用列表(首页「进行中的网页活动」),别往这里塞。\n */\nwithDefaults(\n defineProps<{\n /** 红块里的字(Bender 大写) */\n title?: string;\n }>(),\n { title: \"Breaking News\" },\n);\n\ndefineSlots<{\n /** 红块内容(代替 title) */\n title?: () => unknown;\n /** 正文:一行,可含链接 / 加粗;超长省略号截断 */\n default?: () => unknown;\n}>();\n</script>\n\n<template>\n <div class=\"ak-news\">\n <span class=\"ak-news__label\"><slot name=\"title\">{{ title }}</slot></span>\n <span class=\"ak-news__text\"><slot /></span>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 大标题横幅(官网风):黑底 + 青色 overline + 大号拉丁标题(中文副标) + 青色横条 + 说明,右侧竖直青色色面叠网点。\n * 两套主题下都是黑底白字。是静态的「页头横幅」,不是轮播——首页的活动轮播是页面自己的结构(见文档页说明)。\n */\nwithDefaults(\n defineProps<{\n /** 大标题(展示字、全大写),拉丁字母最好看:PRTS / RHODES ISLAND */\n title: string;\n /** 标题下的中文副标(正文字体、半号) */\n subtitle?: string;\n /** 标题上方的青色小字(PRTS.WIKI · NEW SKIN DESIGN SYSTEM) */\n eyebrow?: string;\n /** 说明文字(最宽 60 字,70% 白) */\n description?: string;\n /** 标题下的青色横条 */\n bar?: boolean;\n /** 右侧竖直青色色面 */\n side?: boolean;\n }>(),\n { subtitle: undefined, eyebrow: undefined, description: undefined, bar: true, side: true },\n);\n\ndefineSlots<{\n /** 标题(代替 title / subtitle);中文副标放 <span class=\"cn\"> */\n title?: () => unknown;\n /** 说明(代替 description),放在 <p> 里——只放行内内容 */\n description?: () => unknown;\n /** 说明下面的内容(按钮等) */\n default?: () => unknown;\n}>();\n</script>\n\n<template>\n <div class=\"ak-hero\">\n <div v-if=\"eyebrow\" class=\"ak-hero__eyebrow\">{{ eyebrow }}</div>\n <h2 class=\"ak-hero__title\">\n <slot name=\"title\">{{ title }}<span v-if=\"subtitle\" class=\"cn\">{{ subtitle }}</span></slot>\n </h2>\n <div v-if=\"bar\" class=\"ak-hero__bar\" />\n <p v-if=\"description || $slots.description\" class=\"ak-hero__desc\"><slot name=\"description\">{{ description }}</slot></p>\n <slot />\n <div v-if=\"side\" class=\"ak-hero__side\" />\n </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * 大标题横幅(官网风):黑底 + 青色 overline + 大号拉丁标题(中文副标) + 青色横条 + 说明,右侧竖直青色色面叠网点。\n * 两套主题下都是黑底白字。是静态的「页头横幅」,不是轮播——首页的活动轮播是页面自己的结构(见文档页说明)。\n */\nwithDefaults(\n defineProps<{\n /** 大标题(展示字、全大写),拉丁字母最好看:PRTS / RHODES ISLAND */\n title: string;\n /** 标题下的中文副标(正文字体、半号) */\n subtitle?: string;\n /** 标题上方的青色小字(PRTS.WIKI · NEW SKIN DESIGN SYSTEM) */\n eyebrow?: string;\n /** 说明文字(最宽 60 字,70% 白) */\n description?: string;\n /** 标题下的青色横条 */\n bar?: boolean;\n /** 右侧竖直青色色面 */\n side?: boolean;\n }>(),\n { subtitle: undefined, eyebrow: undefined, description: undefined, bar: true, side: true },\n);\n\ndefineSlots<{\n /** 标题(代替 title / subtitle);中文副标放 <span class=\"cn\"> */\n title?: () => unknown;\n /** 说明(代替 description),放在 <p> 里——只放行内内容 */\n description?: () => unknown;\n /** 说明下面的内容(按钮等) */\n default?: () => unknown;\n}>();\n</script>\n\n<template>\n <div class=\"ak-hero\">\n <div v-if=\"eyebrow\" class=\"ak-hero__eyebrow\">{{ eyebrow }}</div>\n <h2 class=\"ak-hero__title\">\n <slot name=\"title\">{{ title }}<span v-if=\"subtitle\" class=\"cn\">{{ subtitle }}</span></slot>\n </h2>\n <div v-if=\"bar\" class=\"ak-hero__bar\" />\n <p v-if=\"description || $slots.description\" class=\"ak-hero__desc\"><slot name=\"description\">{{ description }}</slot></p>\n <slot />\n <div v-if=\"side\" class=\"ak-hero__side\" />\n </div>\n</template>\n"],"mappings":"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"}