@xihan-ui/vue 3.1.0 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (133) hide show
  1. package/CHANGELOG.md +160 -0
  2. package/dist/components/carousel/carousel.d.ts +7 -1
  3. package/dist/components/carousel/carousel.d.ts.map +1 -1
  4. package/dist/components/carousel/carousel.js +1 -0
  5. package/dist/components/carousel/carousel.js.map +1 -1
  6. package/dist/components/cartesian-chart/cartesian-chart.d.ts.map +1 -1
  7. package/dist/components/cartesian-chart/cartesian-chart.js +2 -2
  8. package/dist/components/cartesian-chart/cartesian-chart.js.map +1 -1
  9. package/dist/components/cascader/cascader.js +2 -1
  10. package/dist/components/cascader/cascader.js.map +1 -1
  11. package/dist/components/citation/citation.d.ts.map +1 -1
  12. package/dist/components/citation/citation.js +8 -6
  13. package/dist/components/citation/citation.js.map +1 -1
  14. package/dist/components/color-picker/color-picker.js +2 -1
  15. package/dist/components/color-picker/color-picker.js.map +1 -1
  16. package/dist/components/combobox/combobox.js +3 -3
  17. package/dist/components/combobox/combobox.js.map +1 -1
  18. package/dist/components/command/command.d.ts +3 -3
  19. package/dist/components/context-menu/context-menu.js +2 -1
  20. package/dist/components/context-menu/context-menu.js.map +1 -1
  21. package/dist/components/date-picker/date-picker.d.ts +4 -1
  22. package/dist/components/date-picker/date-picker.d.ts.map +1 -1
  23. package/dist/components/date-picker/date-picker.js +9 -1
  24. package/dist/components/date-picker/date-picker.js.map +1 -1
  25. package/dist/components/date-range-picker/date-range-picker.d.ts +4 -1
  26. package/dist/components/date-range-picker/date-range-picker.d.ts.map +1 -1
  27. package/dist/components/date-range-picker/date-range-picker.js +9 -1
  28. package/dist/components/date-range-picker/date-range-picker.js.map +1 -1
  29. package/dist/components/dialog/dialog.d.ts +12 -1
  30. package/dist/components/dialog/dialog.d.ts.map +1 -1
  31. package/dist/components/dialog/dialog.js +14 -4
  32. package/dist/components/dialog/dialog.js.map +1 -1
  33. package/dist/components/drawer/drawer.d.ts +12 -1
  34. package/dist/components/drawer/drawer.d.ts.map +1 -1
  35. package/dist/components/drawer/drawer.js +14 -4
  36. package/dist/components/drawer/drawer.js.map +1 -1
  37. package/dist/components/fieldset/context.d.ts +1 -0
  38. package/dist/components/fieldset/context.d.ts.map +1 -1
  39. package/dist/components/fieldset/context.js +9 -1
  40. package/dist/components/fieldset/context.js.map +1 -1
  41. package/dist/components/fieldset/fieldset.d.ts.map +1 -1
  42. package/dist/components/fieldset/fieldset.js +8 -3
  43. package/dist/components/fieldset/fieldset.js.map +1 -1
  44. package/dist/components/floating-panel/floating-panel.js +4 -1
  45. package/dist/components/floating-panel/floating-panel.js.map +1 -1
  46. package/dist/components/form/form.d.ts +8 -0
  47. package/dist/components/form/form.d.ts.map +1 -1
  48. package/dist/components/form/form.js +4 -1
  49. package/dist/components/form/form.js.map +1 -1
  50. package/dist/components/funnel-chart/funnel-chart.d.ts.map +1 -1
  51. package/dist/components/funnel-chart/funnel-chart.js +2 -2
  52. package/dist/components/funnel-chart/funnel-chart.js.map +1 -1
  53. package/dist/components/graph-chart/graph-chart.d.ts.map +1 -1
  54. package/dist/components/graph-chart/graph-chart.js +2 -2
  55. package/dist/components/graph-chart/graph-chart.js.map +1 -1
  56. package/dist/components/hierarchy-chart/hierarchy-chart.d.ts.map +1 -1
  57. package/dist/components/hierarchy-chart/hierarchy-chart.js +2 -2
  58. package/dist/components/hierarchy-chart/hierarchy-chart.js.map +1 -1
  59. package/dist/components/hover-card/hover-card.js +2 -1
  60. package/dist/components/hover-card/hover-card.js.map +1 -1
  61. package/dist/components/image-viewer/image-viewer.d.ts +7 -1
  62. package/dist/components/image-viewer/image-viewer.d.ts.map +1 -1
  63. package/dist/components/image-viewer/image-viewer.js +1 -0
  64. package/dist/components/image-viewer/image-viewer.js.map +1 -1
  65. package/dist/components/mention/mention.d.ts +1 -1
  66. package/dist/components/mention/mention.js +5 -4
  67. package/dist/components/mention/mention.js.map +1 -1
  68. package/dist/components/menu/menu.js +2 -1
  69. package/dist/components/menu/menu.js.map +1 -1
  70. package/dist/components/menubar/context.d.ts.map +1 -1
  71. package/dist/components/menubar/context.js.map +1 -1
  72. package/dist/components/menubar/menubar.d.ts.map +1 -1
  73. package/dist/components/menubar/menubar.js +16 -2
  74. package/dist/components/menubar/menubar.js.map +1 -1
  75. package/dist/components/pagination/pagination.js +4 -2
  76. package/dist/components/pagination/pagination.js.map +1 -1
  77. package/dist/components/pie-chart/pie-chart.d.ts.map +1 -1
  78. package/dist/components/pie-chart/pie-chart.js +2 -2
  79. package/dist/components/pie-chart/pie-chart.js.map +1 -1
  80. package/dist/components/popconfirm/popconfirm.js +2 -1
  81. package/dist/components/popconfirm/popconfirm.js.map +1 -1
  82. package/dist/components/popover/popover.d.ts +1 -1
  83. package/dist/components/popover/popover.js +2 -1
  84. package/dist/components/popover/popover.js.map +1 -1
  85. package/dist/components/radar-chart/radar-chart.d.ts.map +1 -1
  86. package/dist/components/radar-chart/radar-chart.js +2 -2
  87. package/dist/components/radar-chart/radar-chart.js.map +1 -1
  88. package/dist/components/sankey-chart/sankey-chart.d.ts.map +1 -1
  89. package/dist/components/sankey-chart/sankey-chart.js +2 -2
  90. package/dist/components/sankey-chart/sankey-chart.js.map +1 -1
  91. package/dist/components/select/select.d.ts +11 -0
  92. package/dist/components/select/select.d.ts.map +1 -1
  93. package/dist/components/select/select.js +12 -3
  94. package/dist/components/select/select.js.map +1 -1
  95. package/dist/components/side-nav/side-nav.d.ts.map +1 -1
  96. package/dist/components/side-nav/side-nav.js +8 -2
  97. package/dist/components/side-nav/side-nav.js.map +1 -1
  98. package/dist/components/spinner/spinner.d.ts +9 -1
  99. package/dist/components/spinner/spinner.d.ts.map +1 -1
  100. package/dist/components/spinner/spinner.js +2 -0
  101. package/dist/components/spinner/spinner.js.map +1 -1
  102. package/dist/components/time-picker/time-picker.d.ts +4 -1
  103. package/dist/components/time-picker/time-picker.d.ts.map +1 -1
  104. package/dist/components/time-picker/time-picker.js +10 -2
  105. package/dist/components/time-picker/time-picker.js.map +1 -1
  106. package/dist/components/time-range-picker/time-range-picker.js +2 -1
  107. package/dist/components/time-range-picker/time-range-picker.js.map +1 -1
  108. package/dist/components/tooltip/tooltip.js +2 -1
  109. package/dist/components/tooltip/tooltip.js.map +1 -1
  110. package/dist/components/tour/tour.js +12 -3
  111. package/dist/components/tour/tour.js.map +1 -1
  112. package/dist/components/tree-select/tree-select.js +3 -3
  113. package/dist/components/tree-select/tree-select.js.map +1 -1
  114. package/dist/config/config.js +1 -0
  115. package/dist/config/config.js.map +1 -1
  116. package/dist/index.d.ts +4 -4
  117. package/dist/index.js +4 -4
  118. package/dist/locale.d.ts +2 -0
  119. package/dist/locale.js +2 -0
  120. package/dist/package.js +1 -1
  121. package/dist/runtime/as-child.js +7 -2
  122. package/dist/runtime/as-child.js.map +1 -1
  123. package/dist/runtime/portal.js +11 -1
  124. package/dist/runtime/portal.js.map +1 -1
  125. package/dist/runtime/use-overlay-exit.js +6 -1
  126. package/dist/runtime/use-overlay-exit.js.map +1 -1
  127. package/dist/services/dialog-service.d.ts +3 -3
  128. package/dist/services/dialog-service.d.ts.map +1 -1
  129. package/dist/services/dialog-service.js +8 -6
  130. package/dist/services/dialog-service.js.map +1 -1
  131. package/dist/services/service-config.js +2 -1
  132. package/dist/services/service-config.js.map +1 -1
  133. package/package.json +19 -15
@@ -1 +1 @@
1
- {"version":3,"file":"pagination.js","names":[],"sources":["../../../src/components/pagination/pagination.ts"],"sourcesContent":["/*\n * Copyright (c) 2021-Present XiHanFun and contributors.\n * Licensed under the MIT License. See LICENSE in the project root for license information.\n */\n\n// 提供 pagination 相关实现。\n\nimport type { Direction, Placement, Size, Tone } from '@xihan-ui/core'\nimport type { PaginationApi, PaginationEllipsisSide, PaginationPageSizeChangeDetails, PaginationSchema, PaginationTranslations } from '@xihan-ui/headless'\nimport type { PropType, SlotsType, VNode } from 'vue'\nimport type { PayloadOf } from '../../runtime/payload'\nimport { defineComponent, h, mergeProps } from 'vue'\nimport { withXhConfig } from '../../config/config'\nimport { XhPortal } from '../../runtime/portal'\nimport { useScrollbars } from '../../runtime/use-scrollbars'\nimport { providePagination, usePaginationContext } from './context'\nimport { usePagination } from './use-pagination'\n\ntype PaginationProps = PaginationSchema['props']\n\n/** 默认插槽的载荷:当前页与总量口径、页码序列与条目区间、前后页页码,以及翻页与按当前页切分数据的动作。 */\nexport type PaginationRootSlotProps = Pick<\n PaginationApi,\n | 'page'\n | 'pageSize'\n | 'pageSizeOptions'\n | 'pageItems'\n | 'openEllipsis'\n | 'count'\n | 'totalPages'\n | 'pages'\n | 'pageRange'\n | 'previousPage'\n | 'nextPage'\n | 'setPage'\n | 'goToPrevPage'\n | 'goToNextPage'\n | 'setPageSize'\n | 'slice'\n>\n\nexport const XhPaginationRoot = defineComponent({\n name: 'XhPaginationRoot',\n // 缺省值由 connect 给出;普通类型省略 default,Boolean 显式保留 undefined\n props: {\n count: { type: Number },\n pageSize: { type: Number },\n defaultPageSize: { type: Number },\n pageSizeOptions: { type: Array as PropType<number[]> },\n page: { type: Number },\n defaultPage: { type: Number },\n siblingCount: { type: Number },\n /** 整组不可交互:按钮、跳页与每页条数一并禁用。 */\n disabled: { type: Boolean, default: undefined },\n dir: { type: String as PropType<Direction> },\n translations: { type: Object as PropType<Partial<PaginationTranslations>> },\n placement: { type: String as PropType<Placement> },\n offset: { type: Number },\n openDelay: { type: Number },\n closeDelay: { type: Number },\n tone: { type: String as PropType<Tone> },\n size: { type: String as PropType<Size> },\n },\n // page-change 携带 { page, pageSize },update:page 携带裸页码;\n // 换档同时改页码,两个 update 都发,v-model:page 与 v-model:page-size 才不会各说各话\n emits: {\n 'page-change': (_details: PayloadOf<PaginationProps, 'onPageChange'>) => true,\n 'update:page': (_page: PayloadOf<PaginationProps, 'onPageChange'>['page']) => true,\n 'page-size-change': (_details: PaginationPageSizeChangeDetails) => true,\n 'update:pageSize': (_pageSize: PaginationPageSizeChangeDetails['pageSize']) => true,\n },\n slots: Object as SlotsType<{\n default?: (props: PaginationRootSlotProps) => VNode[]\n }>,\n setup(props, { slots, emit }) {\n const notify: PaginationProps['onPageChange'] = (details) => {\n emit('page-change', details)\n emit('update:page', details.page)\n }\n const notifyPageSize: PaginationProps['onPageSizeChange'] = (details) => {\n emit('page-size-change', details)\n emit('update:pageSize', details.pageSize)\n emit('update:page', details.page)\n }\n const ctx = usePagination(withXhConfig('pagination', props) as PaginationProps, notify, notifyPageSize)\n providePagination(ctx)\n // 根节点渲染为 nav 地标\n return () => h('nav', ctx.api.value.getRootProps() as Record<string, unknown>, slots.default?.({\n page: ctx.api.value.page,\n pageSize: ctx.api.value.pageSize,\n pageSizeOptions: ctx.api.value.pageSizeOptions,\n count: ctx.api.value.count,\n totalPages: ctx.api.value.totalPages,\n pages: ctx.api.value.pages,\n pageItems: ctx.api.value.pageItems,\n openEllipsis: ctx.api.value.openEllipsis,\n pageRange: ctx.api.value.pageRange,\n previousPage: ctx.api.value.previousPage,\n nextPage: ctx.api.value.nextPage,\n setPage: ctx.api.value.setPage,\n goToPrevPage: ctx.api.value.goToPrevPage,\n goToNextPage: ctx.api.value.goToNextPage,\n setPageSize: ctx.api.value.setPageSize,\n slice: ctx.api.value.slice,\n }))\n },\n})\n\n/** 跳到首页;按需放在上一页之前,没写内容时由皮肤画双箭头。 */\nexport const XhPaginationFirstTrigger = defineComponent({\n name: 'XhPaginationFirstTrigger',\n setup(_, { slots }) {\n const ctx = usePaginationContext()\n return () => h('button', ctx.api.value.getFirstTriggerProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhPaginationPrevTrigger = defineComponent({\n name: 'XhPaginationPrevTrigger',\n setup(_, { slots }) {\n const ctx = usePaginationContext()\n return () => h('button', ctx.api.value.getPrevTriggerProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhPaginationNextTrigger = defineComponent({\n name: 'XhPaginationNextTrigger',\n setup(_, { slots }) {\n const ctx = usePaginationContext()\n return () => h('button', ctx.api.value.getNextTriggerProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\n/** 跳到末页;按需放在下一页之后,没写内容时由皮肤画双箭头。 */\nexport const XhPaginationLastTrigger = defineComponent({\n name: 'XhPaginationLastTrigger',\n setup(_, { slots }) {\n const ctx = usePaginationContext()\n return () => h('button', ctx.api.value.getLastTriggerProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhPaginationItem = defineComponent({\n name: 'XhPaginationItem',\n props: {\n // 这一项对应的页码,兼收字符串\n value: { type: [Number, String] as PropType<number | string>, required: true },\n },\n setup(props, { slots }) {\n const ctx = usePaginationContext()\n return () => h(\n 'button',\n ctx.api.value.getItemProps({ page: Number(props.value) }) as Record<string, unknown>,\n slots.default?.(),\n )\n },\n})\n\nexport const XhPaginationEllipsisTrigger = defineComponent({\n name: 'XhPaginationEllipsisTrigger',\n props: {\n /** 该省略位所在的一侧:首页与窗口之间是 start,窗口与末页之间是 end。 */\n side: { type: String as PropType<PaginationEllipsisSide>, default: 'start' },\n },\n setup(props, { slots }) {\n const ctx = usePaginationContext()\n // 摊开的那一个是定位锚点;两个省略位共用一份定位层,谁开着谁认领\n return () => {\n const open = ctx.api.value.openEllipsis === props.side\n return h('button', {\n ...ctx.api.value.getEllipsisTriggerProps({ side: props.side }) as Record<string, unknown>,\n ref: (el: unknown) => {\n if (open)\n ctx.ellipsisRef.value = el as HTMLElement\n },\n }, slots.default?.())\n }\n },\n})\n\n/** 信息区:未写默认插槽时铺设 api.summaryText */\nexport const XhPaginationSummary = defineComponent({\n name: 'XhPaginationSummary',\n slots: Object as SlotsType<{\n default?: (props: { summaryText: string, start: number, end: number, count: number }) => VNode[]\n }>,\n setup(_, { slots }) {\n const ctx = usePaginationContext()\n return () => {\n const api = ctx.api.value\n return h(\n 'div',\n api.getSummaryProps() as Record<string, unknown>,\n slots.default\n ? slots.default({\n summaryText: api.summaryText,\n start: api.pageRange.start,\n end: api.pageRange.end,\n count: api.count,\n })\n : api.summaryText,\n )\n }\n },\n})\n\n/** 跳页输入框:输入页码按回车即跳转 */\nexport const XhPaginationJumper = defineComponent({\n name: 'XhPaginationJumper',\n setup() {\n const ctx = usePaginationContext()\n return () => h('input', ctx.api.value.getJumperProps() as Record<string, unknown>)\n },\n})\n\n/**\n * 每页条数控制器:装配的是库内的 select,不再是原生下拉。\n *\n * 组合发生在这一层:连接层把整份 select 的 api 放在 api.pageSizeSelect 上,\n * 这里据此铺设角色节点(DOM 上带 data-scope=\"select\",使用 select 的皮肤)。\n * 档位与档位文字都由连接层从 pageSizeOptions 与 translations.pageSizeOption 计算。\n */\nexport const XhPaginationPageSizeSelect = defineComponent({\n name: 'XhPaginationPageSizeSelect',\n props: {\n /** 本实例的 PageSizeSelect Portal 容器;优先于应用级配置。 */\n container: { type: Object as PropType<Element> },\n },\n // 渲染出来是「挂载点 + 被搬走的浮层」两截,作者写的 class 与 style 得自己接住落到挂载点上\n inheritAttrs: false,\n setup(props, { attrs }) {\n const ctx = usePaginationContext()\n return () => {\n const api = ctx.api.value\n const select = api.pageSizeSelect\n return [\n h('div', mergeProps(api.getPageSizeSelectProps() as Record<string, unknown>, attrs), [\n h('div', select.getRootProps() as Record<string, unknown>, [\n h('div', select.getControlProps() as Record<string, unknown>, [\n h('button', {\n ...select.getTriggerProps() as Record<string, unknown>,\n ref: (el: unknown) => { ctx.pageSizeTriggerRef.value = el as HTMLElement },\n }, [\n h('span', select.getValueTextProps() as Record<string, unknown>, select.displayText),\n h('span', select.getIndicatorProps() as Record<string, unknown>),\n ]),\n ]),\n ]),\n ]),\n h(XhPortal, { to: props.container ?? ctx.portalTarget.value, source: ctx.pageSizeTriggerRef }, () => [\n h('div', {\n ...select.getPositionerProps() as Record<string, unknown>,\n ref: (el: unknown) => { ctx.pageSizePositionerRef.value = el as HTMLElement },\n }, [\n h('div', {\n ...select.getContentProps() as Record<string, unknown>,\n // 收起跟着退场闸门走,与省略位那层同一套写法\n style: ctx.pageSizeVisible.value ? undefined : { display: 'none' },\n ref: (el: unknown) => { ctx.pageSizeContentRef.value = el as HTMLElement },\n }, [\n h('div', select.getListProps() as Record<string, unknown>, select.collection.map(option =>\n h('div', {\n ...select.getItemProps({ value: option.value }) as Record<string, unknown>,\n key: option.value,\n }, [\n h('span', select.getItemTextProps({ value: option.value }) as Record<string, unknown>, option.label),\n h('span', select.getItemIndicatorProps({ value: option.value }) as Record<string, unknown>),\n ]))),\n ]),\n ]),\n ]),\n ]\n }\n },\n})\n\nexport const XhPaginationPositioner = defineComponent({\n name: 'XhPaginationPositioner',\n props: {\n /** 本实例的省略页 Portal 容器;优先于应用级配置。 */\n container: { type: Object as PropType<Element> },\n },\n // 根是 Teleport,Vue 不会把直通属性合上去,作者写的 class 与 style 得自己接住落到 positioner 上\n inheritAttrs: false,\n setup(props, { slots, attrs }) {\n const ctx = usePaginationContext()\n // 折叠页码列表的自绘条:与 content 同级、绝对定位不占布局,壳是这层已经 fixed 的 positioner\n // 浮层里的条子走 4px 档\n const bars = useScrollbars({ scrollable: () => ctx.contentRef.value, props: { size: 'sm' } })\n // 搬到 portal 落点:留在原地的话,宿主祖先只要建了层叠上下文就能盖住浮层\n return () => h(XhPortal, { to: props.container ?? ctx.portalTarget.value, source: ctx.ellipsisRef }, () => [\n h('div', {\n ...mergeProps(ctx.api.value.getPositionerProps() as Record<string, unknown>, attrs),\n ref: (el: unknown) => { ctx.positionerRef.value = el as HTMLElement },\n }, [...(slots.default?.() ?? []), ...bars.render()]),\n ])\n },\n})\n\nexport const XhPaginationContent = defineComponent({\n name: 'XhPaginationContent',\n slots: Object as SlotsType<{\n default?: (props: { pages: number[] }) => VNode[]\n }>,\n setup(_, { slots }) {\n const ctx = usePaginationContext()\n return () => {\n const open = ctx.api.value.openEllipsis\n const folded = ctx.api.value.pageItems.find(\n item => item.type === 'ellipsis' && item.side === open,\n )\n return h('div', {\n ...ctx.api.value.getContentProps() as Record<string, unknown>,\n // 收起跟着退场闸门走:皮肤刻意没给 content 补 [hidden]{display:none}\n // (补了退场就一帧都播不出来),真正的收起落成内联 display\n style: ctx.visible.value ? undefined : { display: 'none' },\n ref: (el: unknown) => { ctx.contentRef.value = el as HTMLElement },\n }, slots.default?.({ pages: folded?.type === 'ellipsis' ? folded.pages : [] }))\n }\n },\n})\n"],"mappings":"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"}
1
+ {"version":3,"file":"pagination.js","names":[],"sources":["../../../src/components/pagination/pagination.ts"],"sourcesContent":["/*\n * Copyright (c) 2021-Present XiHanFun and contributors.\n * Licensed under the MIT License. See LICENSE in the project root for license information.\n */\n\n// 提供 pagination 相关实现。\n\nimport type { Direction, Placement, Size, Tone } from '@xihan-ui/core'\nimport type { PaginationApi, PaginationEllipsisSide, PaginationPageSizeChangeDetails, PaginationSchema, PaginationTranslations } from '@xihan-ui/headless'\nimport type { PropType, SlotsType, VNode } from 'vue'\nimport type { PayloadOf } from '../../runtime/payload'\nimport { defineComponent, h, mergeProps } from 'vue'\nimport { withXhConfig } from '../../config/config'\nimport { XhPortal } from '../../runtime/portal'\nimport { useScrollbars } from '../../runtime/use-scrollbars'\nimport { providePagination, usePaginationContext } from './context'\nimport { usePagination } from './use-pagination'\n\ntype PaginationProps = PaginationSchema['props']\n\n/** 默认插槽的载荷:当前页与总量口径、页码序列与条目区间、前后页页码,以及翻页与按当前页切分数据的动作。 */\nexport type PaginationRootSlotProps = Pick<\n PaginationApi,\n | 'page'\n | 'pageSize'\n | 'pageSizeOptions'\n | 'pageItems'\n | 'openEllipsis'\n | 'count'\n | 'totalPages'\n | 'pages'\n | 'pageRange'\n | 'previousPage'\n | 'nextPage'\n | 'setPage'\n | 'goToPrevPage'\n | 'goToNextPage'\n | 'setPageSize'\n | 'slice'\n>\n\nexport const XhPaginationRoot = defineComponent({\n name: 'XhPaginationRoot',\n // 缺省值由 connect 给出;普通类型省略 default,Boolean 显式保留 undefined\n props: {\n count: { type: Number },\n pageSize: { type: Number },\n defaultPageSize: { type: Number },\n pageSizeOptions: { type: Array as PropType<number[]> },\n page: { type: Number },\n defaultPage: { type: Number },\n siblingCount: { type: Number },\n /** 整组不可交互:按钮、跳页与每页条数一并禁用。 */\n disabled: { type: Boolean, default: undefined },\n dir: { type: String as PropType<Direction> },\n translations: { type: Object as PropType<Partial<PaginationTranslations>> },\n placement: { type: String as PropType<Placement> },\n offset: { type: Number },\n openDelay: { type: Number },\n closeDelay: { type: Number },\n tone: { type: String as PropType<Tone> },\n size: { type: String as PropType<Size> },\n },\n // page-change 携带 { page, pageSize },update:page 携带裸页码;\n // 换档同时改页码,两个 update 都发,v-model:page 与 v-model:page-size 才不会各说各话\n emits: {\n 'page-change': (_details: PayloadOf<PaginationProps, 'onPageChange'>) => true,\n 'update:page': (_page: PayloadOf<PaginationProps, 'onPageChange'>['page']) => true,\n 'page-size-change': (_details: PaginationPageSizeChangeDetails) => true,\n 'update:pageSize': (_pageSize: PaginationPageSizeChangeDetails['pageSize']) => true,\n },\n slots: Object as SlotsType<{\n default?: (props: PaginationRootSlotProps) => VNode[]\n }>,\n setup(props, { slots, emit }) {\n const notify: PaginationProps['onPageChange'] = (details) => {\n emit('page-change', details)\n emit('update:page', details.page)\n }\n const notifyPageSize: PaginationProps['onPageSizeChange'] = (details) => {\n emit('page-size-change', details)\n emit('update:pageSize', details.pageSize)\n emit('update:page', details.page)\n }\n const ctx = usePagination(withXhConfig('pagination', props) as PaginationProps, notify, notifyPageSize)\n providePagination(ctx)\n // 根节点渲染为 nav 地标\n return () => h('nav', ctx.api.value.getRootProps() as Record<string, unknown>, slots.default?.({\n page: ctx.api.value.page,\n pageSize: ctx.api.value.pageSize,\n pageSizeOptions: ctx.api.value.pageSizeOptions,\n count: ctx.api.value.count,\n totalPages: ctx.api.value.totalPages,\n pages: ctx.api.value.pages,\n pageItems: ctx.api.value.pageItems,\n openEllipsis: ctx.api.value.openEllipsis,\n pageRange: ctx.api.value.pageRange,\n previousPage: ctx.api.value.previousPage,\n nextPage: ctx.api.value.nextPage,\n setPage: ctx.api.value.setPage,\n goToPrevPage: ctx.api.value.goToPrevPage,\n goToNextPage: ctx.api.value.goToNextPage,\n setPageSize: ctx.api.value.setPageSize,\n slice: ctx.api.value.slice,\n }))\n },\n})\n\n/** 跳到首页;按需放在上一页之前,没写内容时由皮肤画双箭头。 */\nexport const XhPaginationFirstTrigger = defineComponent({\n name: 'XhPaginationFirstTrigger',\n setup(_, { slots }) {\n const ctx = usePaginationContext()\n return () => h('button', ctx.api.value.getFirstTriggerProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhPaginationPrevTrigger = defineComponent({\n name: 'XhPaginationPrevTrigger',\n setup(_, { slots }) {\n const ctx = usePaginationContext()\n return () => h('button', ctx.api.value.getPrevTriggerProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhPaginationNextTrigger = defineComponent({\n name: 'XhPaginationNextTrigger',\n setup(_, { slots }) {\n const ctx = usePaginationContext()\n return () => h('button', ctx.api.value.getNextTriggerProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\n/** 跳到末页;按需放在下一页之后,没写内容时由皮肤画双箭头。 */\nexport const XhPaginationLastTrigger = defineComponent({\n name: 'XhPaginationLastTrigger',\n setup(_, { slots }) {\n const ctx = usePaginationContext()\n return () => h('button', ctx.api.value.getLastTriggerProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhPaginationItem = defineComponent({\n name: 'XhPaginationItem',\n props: {\n // 这一项对应的页码,兼收字符串\n value: { type: [Number, String] as PropType<number | string>, required: true },\n },\n setup(props, { slots }) {\n const ctx = usePaginationContext()\n return () => h(\n 'button',\n ctx.api.value.getItemProps({ page: Number(props.value) }) as Record<string, unknown>,\n slots.default?.(),\n )\n },\n})\n\nexport const XhPaginationEllipsisTrigger = defineComponent({\n name: 'XhPaginationEllipsisTrigger',\n props: {\n /** 该省略位所在的一侧:首页与窗口之间是 start,窗口与末页之间是 end。 */\n side: { type: String as PropType<PaginationEllipsisSide>, default: 'start' },\n },\n setup(props, { slots }) {\n const ctx = usePaginationContext()\n // 摊开的那一个是定位锚点;两个省略位共用一份定位层,谁开着谁认领\n return () => {\n const open = ctx.api.value.openEllipsis === props.side\n return h('button', {\n ...ctx.api.value.getEllipsisTriggerProps({ side: props.side }) as Record<string, unknown>,\n ref: (el: unknown) => {\n if (open)\n ctx.ellipsisRef.value = el as HTMLElement\n },\n }, slots.default?.())\n }\n },\n})\n\n/** 信息区:未写默认插槽时铺设 api.summaryText */\nexport const XhPaginationSummary = defineComponent({\n name: 'XhPaginationSummary',\n slots: Object as SlotsType<{\n default?: (props: { summaryText: string, start: number, end: number, count: number }) => VNode[]\n }>,\n setup(_, { slots }) {\n const ctx = usePaginationContext()\n return () => {\n const api = ctx.api.value\n return h(\n 'div',\n api.getSummaryProps() as Record<string, unknown>,\n slots.default\n ? slots.default({\n summaryText: api.summaryText,\n start: api.pageRange.start,\n end: api.pageRange.end,\n count: api.count,\n })\n : api.summaryText,\n )\n }\n },\n})\n\n/** 跳页输入框:输入页码按回车即跳转 */\nexport const XhPaginationJumper = defineComponent({\n name: 'XhPaginationJumper',\n setup() {\n const ctx = usePaginationContext()\n return () => h('input', ctx.api.value.getJumperProps() as Record<string, unknown>)\n },\n})\n\n/**\n * 每页条数控制器:装配的是库内的 select,不再是原生下拉。\n *\n * 组合发生在这一层:连接层把整份 select 的 api 放在 api.pageSizeSelect 上,\n * 这里据此铺设角色节点(DOM 上带 data-scope=\"select\",使用 select 的皮肤)。\n * 档位与档位文字都由连接层从 pageSizeOptions 与 translations.pageSizeOption 计算。\n */\nexport const XhPaginationPageSizeSelect = defineComponent({\n name: 'XhPaginationPageSizeSelect',\n props: {\n /** 本实例的 PageSizeSelect Portal 容器;优先于应用级配置。 */\n container: { type: Object as PropType<Element> },\n },\n // 渲染出来是「挂载点 + 被搬走的浮层」两截,作者写的 class 与 style 得自己接住落到挂载点上\n inheritAttrs: false,\n setup(props, { attrs }) {\n const ctx = usePaginationContext()\n return () => {\n const api = ctx.api.value\n const select = api.pageSizeSelect\n return [\n h('div', mergeProps(api.getPageSizeSelectProps() as Record<string, unknown>, attrs), [\n h('div', select.getRootProps() as Record<string, unknown>, [\n h('div', select.getControlProps() as Record<string, unknown>, [\n h('button', {\n ...select.getTriggerProps() as Record<string, unknown>,\n ref: (el: unknown) => { ctx.pageSizeTriggerRef.value = el as HTMLElement },\n }, [\n h('span', select.getValueTextProps() as Record<string, unknown>, select.displayText),\n h('span', select.getIndicatorProps() as Record<string, unknown>),\n ]),\n ]),\n ]),\n ]),\n h(XhPortal, { to: props.container ?? ctx.portalTarget.value, source: ctx.pageSizeTriggerRef, present: ctx.pageSizeVisible.value }, () => [\n h('div', {\n ...select.getPositionerProps() as Record<string, unknown>,\n ref: (el: unknown) => { ctx.pageSizePositionerRef.value = el as HTMLElement },\n }, [\n h('div', {\n ...select.getContentProps() as Record<string, unknown>,\n // 收起跟着退场闸门走,与省略位那层同一套写法\n style: ctx.pageSizeVisible.value ? undefined : { display: 'none' },\n ref: (el: unknown) => { ctx.pageSizeContentRef.value = el as HTMLElement },\n }, [\n h('div', select.getListProps() as Record<string, unknown>, select.collection.map(option =>\n h('div', {\n ...select.getItemProps({ value: option.value }) as Record<string, unknown>,\n key: option.value,\n }, [\n h('span', select.getItemTextProps({ value: option.value }) as Record<string, unknown>, option.label),\n h('span', select.getItemIndicatorProps({ value: option.value }) as Record<string, unknown>),\n ]))),\n ]),\n ]),\n ]),\n ]\n }\n },\n})\n\nexport const XhPaginationPositioner = defineComponent({\n name: 'XhPaginationPositioner',\n props: {\n /** 本实例的省略页 Portal 容器;优先于应用级配置。 */\n container: { type: Object as PropType<Element> },\n },\n // 根是 Teleport,Vue 不会把直通属性合上去,作者写的 class 与 style 得自己接住落到 positioner 上\n inheritAttrs: false,\n setup(props, { slots, attrs }) {\n const ctx = usePaginationContext()\n // 折叠页码列表的自绘条:与 content 同级、绝对定位不占布局,壳是这层已经 fixed 的 positioner\n // 浮层里的条子走 4px 档\n const bars = useScrollbars({ scrollable: () => ctx.contentRef.value, props: { size: 'sm' } })\n // 搬到 portal 落点:留在原地的话,宿主祖先只要建了层叠上下文就能盖住浮层\n return () => h(XhPortal, { to: props.container ?? ctx.portalTarget.value, source: ctx.ellipsisRef, present: ctx.visible.value }, () => [\n h('div', {\n ...mergeProps(ctx.api.value.getPositionerProps() as Record<string, unknown>, attrs),\n ref: (el: unknown) => { ctx.positionerRef.value = el as HTMLElement },\n }, [...(slots.default?.() ?? []), ...bars.render()]),\n ])\n },\n})\n\nexport const XhPaginationContent = defineComponent({\n name: 'XhPaginationContent',\n slots: Object as SlotsType<{\n default?: (props: { pages: number[] }) => VNode[]\n }>,\n setup(_, { slots }) {\n const ctx = usePaginationContext()\n return () => {\n const open = ctx.api.value.openEllipsis\n const folded = ctx.api.value.pageItems.find(\n item => item.type === 'ellipsis' && item.side === open,\n )\n return h('div', {\n ...ctx.api.value.getContentProps() as Record<string, unknown>,\n // 收起跟着退场闸门走:皮肤刻意没给 content 补 [hidden]{display:none}\n // (补了退场就一帧都播不出来),真正的收起落成内联 display\n style: ctx.visible.value ? undefined : { display: 'none' },\n ref: (el: unknown) => { ctx.contentRef.value = el as HTMLElement },\n }, slots.default?.({ pages: folded?.type === 'ellipsis' ? folded.pages : [] }))\n }\n },\n})\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"pie-chart.d.ts","names":[],"sources":["../../../src/components/pie-chart/pie-chart.ts"],"mappings":";;;;KA+BK,gBAAgB;;KAGT,wBAAwB,KAAK;;UAGxB;EACf,QAAQ;EACR,SAAS;;;UAIM;EACf,QAAQ;EACR,QAAQ;;;cAmDG,iCAAiB,0BAAA,oBAAA,4BAAA;;8BAM5B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;;cAGW,gCAAgB,0BAAA,oBAAA,4BAAA;;8BAa3B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;;cAGW,kCAAkB,0BAAA,oBAAA,4BAAA;;8BAS7B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;;cAGW,8BAAc,0BAAA,oBAAA,4BAAA;;8BAUzB,qCAAA,iDAAA,aAAA,eAAA,oDAAA;;cAGW,gCAAgB,0BAAA,oBAAA,4BAAA;;;EAGf,WAAC,OAAO,4BAA4B;kCAchD;;cAGW,iCAAiB,0BAAA,oBAAA,4BAAA;;;EAGhB,WAAC,OAAO,6BAA6B;kCAWjD;;cAGW,+BAAe,0BAAA,oBAAA,4BAAA;;8BAM1B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;;cAGW,8BAAc,8BAAA;;IAIA,MAAA,kBAAkB;;;;;;;;;IAGd,MAAA,SAAS;;;;;;;IAEX,MAAA,SAAS;;;IACV,MAAA,SAAS;;;;;;IAEP,MAAA,SAAS;;;;IAES,MAAA,SAAS,oBAAoB,SAAS;;;IAC5C,MAAA,SAAS,qBAAqB;;;IACrC,MAAA;;;IACO,MAAA;;;IACa,MAAA,SAAS;;;;;;;;;;;;;;IAI5B,MAAA,SAAS,QAAQ;;;;;EAId,yBAAA,UAAA,UAAU;EACZ,wBAAA,SAAA,UAAU;EACX,sBAAA,UAAA,UAAU;EACf,qBAAA,MAAA,UAAU;EACV,iBAAA,UAAA,UAAU;EACX,gBAAA,UAAA,UAAU;;;IA3Bb,MAAA,kBAAkB;;;;;;;;;IAGd,MAAA,SAAS;;;;;;;IAEX,MAAA,SAAS;;;IACV,MAAA,SAAS;;;;;;IAEP,MAAA,SAAS;;;;IAES,MAAA,SAAS,oBAAoB,SAAS;;;IAC5C,MAAA,SAAS,qBAAqB;;;IACrC,MAAA;;;IACO,MAAA;;;IACa,MAAA,SAAS;;;;;;;;;;;;;;IAI5B,MAAA,SAAS,QAAQ;;;;;;;;;;;;;;;EAavC,WAAC,OAAO,0BAA0B;;EAElC,gBAAM;;EAEP,UAAC,OAAO,4BAA4B;;EAEnC,WAAC,OAAO,6BAA6B;;EAEvC,cAAM;kCAgDhB"}
1
+ {"version":3,"file":"pie-chart.d.ts","names":[],"sources":["../../../src/components/pie-chart/pie-chart.ts"],"mappings":";;;;KA+BK,gBAAgB;;KAGT,wBAAwB,KAAK;;UAGxB;EACf,QAAQ;EACR,SAAS;;;UAIM;EACf,QAAQ;EACR,QAAQ;;;cAsDG,iCAAiB,0BAAA,oBAAA,4BAAA;;8BAM5B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;;cAGW,gCAAgB,0BAAA,oBAAA,4BAAA;;8BAa3B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;;cAGW,kCAAkB,0BAAA,oBAAA,4BAAA;;8BAS7B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;;cAGW,8BAAc,0BAAA,oBAAA,4BAAA;;8BAUzB,qCAAA,iDAAA,aAAA,eAAA,oDAAA;;cAGW,gCAAgB,0BAAA,oBAAA,4BAAA;;;EAGf,WAAC,OAAO,4BAA4B;kCAchD;;cAGW,iCAAiB,0BAAA,oBAAA,4BAAA;;;EAGhB,WAAC,OAAO,6BAA6B;kCAWjD;;cAGW,+BAAe,0BAAA,oBAAA,4BAAA;;8BAM1B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;;cAGW,8BAAc,8BAAA;;IAIA,MAAA,kBAAkB;;;;;;;;;IAGd,MAAA,SAAS;;;;;;;IAEX,MAAA,SAAS;;;IACV,MAAA,SAAS;;;;;;IAEP,MAAA,SAAS;;;;IAES,MAAA,SAAS,oBAAoB,SAAS;;;IAC5C,MAAA,SAAS,qBAAqB;;;IACrC,MAAA;;;IACO,MAAA;;;IACa,MAAA,SAAS;;;;;;;;;;;;;;IAI5B,MAAA,SAAS,QAAQ;;;;;EAId,yBAAA,UAAA,UAAU;EACZ,wBAAA,SAAA,UAAU;EACX,sBAAA,UAAA,UAAU;EACf,qBAAA,MAAA,UAAU;EACV,iBAAA,UAAA,UAAU;EACX,gBAAA,UAAA,UAAU;;;IA3Bb,MAAA,kBAAkB;;;;;;;;;IAGd,MAAA,SAAS;;;;;;;IAEX,MAAA,SAAS;;;IACV,MAAA,SAAS;;;;;;IAEP,MAAA,SAAS;;;;IAES,MAAA,SAAS,oBAAoB,SAAS;;;IAC5C,MAAA,SAAS,qBAAqB;;;IACrC,MAAA;;;IACO,MAAA;;;IACa,MAAA,SAAS;;;;;;;;;;;;;;IAI5B,MAAA,SAAS,QAAQ;;;;;;;;;;;;;;;EAavC,WAAC,OAAO,0BAA0B;;EAElC,gBAAM;;EAEP,UAAC,OAAO,4BAA4B;;EAEnC,WAAC,OAAO,6BAA6B;;EAEvC,cAAM;kCAgDhB"}
@@ -36,7 +36,7 @@ function renderTooltipContent(api) {
36
36
  /** 摘要与数据表:由根自动生成、视觉隐藏,保证无障碍等价物始终存在。 */
37
37
  function renderA11y(api) {
38
38
  const { columns, rows } = api.table;
39
- return [h("p", api.getSummaryProps(), api.summary), h("table", api.getTableProps(), [
39
+ return [h("p", api.getSummaryProps(), api.summary), h("div", api.getTableRegionProps(), [h("table", api.getTableProps(), [
40
40
  h("caption", api.tableCaption),
41
41
  h("thead", [h("tr", columns.map((column) => h("th", {
42
42
  key: column.id,
@@ -46,7 +46,7 @@ function renderA11y(api) {
46
46
  key: c,
47
47
  scope: "row"
48
48
  }, cell.text) : h("td", { key: c }, cell.text)))))
49
- ])];
49
+ ])])];
50
50
  }
51
51
  /** 标题:图表的可及名来源。 */
52
52
  const XhPieChartCaption = defineComponent({
@@ -1 +1 @@
1
- {"version":3,"file":"pie-chart.js","names":[],"sources":["../../../src/components/pie-chart/pie-chart.ts"],"sourcesContent":["/*\n * Copyright (c) 2021-Present XiHanFun and contributors.\n * Licensed under the MIT License. See LICENSE in the project root for license information.\n */\n\n// 提供 pie chart 相关实现。\n\nimport type {\n ChartDatumDetails,\n ChartKey,\n ChartMark,\n ChartRow,\n NumberFormatSpec,\n PieChartApi,\n PieChartSchema,\n PieChartTranslations,\n PieLabelContent,\n PieLabelDetails,\n PieLabels,\n PieSort,\n PieSweep,\n PieTooltipModel,\n PieVariant,\n} from '@xihan-ui/headless'\nimport type { PropType, SlotsType, VNode } from 'vue'\nimport type { PayloadOf } from '../../runtime/payload'\nimport { defineComponent, h } from 'vue'\nimport { withXhConfig } from '../../config/config'\nimport { providePieChart, usePieChartContext } from './context'\nimport { usePieChart } from './use-pie-chart'\n\ntype PieChartProps = PieChartSchema['props']\n\n/** 默认插槽的载荷:自行摆放部件时用得上的状态与动作。 */\nexport type PieChartRootSlotProps = Pick<PieChartApi, 'legendItems' | 'active' | 'tooltip' | 'center' | 'empty' | 'hiddenSeries' | 'activeKey' | 'toggleSeries' | 'setFocusedDatum' | 'table'>\n\n/** 提示框插槽的载荷:激活的扇区与缺省的内容模型。 */\nexport interface PieChartTooltipSlotProps {\n active: ChartDatumDetails | null\n tooltip: PieTooltipModel | null\n}\n\n/** 环形中心插槽的载荷:可见扇区的合计与说明文字,以及激活的扇区。 */\nexport interface PieChartCenterSlotProps {\n center: PieChartApi['center']\n active: ChartDatumDetails | null\n}\n\n/** 纹理定义:绘图区的第一个子节点,每种纹理一个 pattern、里面一条线。 */\nfunction renderDefs(api: PieChartApi): VNode {\n return h('defs', api.getDefsProps() as Record<string, unknown>, api.patterns.map(pattern =>\n h('pattern', { ...api.getPatternProps(pattern) as Record<string, unknown>, key: pattern.id }, [\n h('path', api.getPatternLineProps(pattern) as Record<string, unknown>),\n ])))\n}\n\n/** 一个场景标记画成 SVG 元素;文字标记带文字。 */\nfunction renderMark(api: PieChartApi, mark: ChartMark): VNode {\n const props = { ...api.getMarkProps(mark) as Record<string, unknown>, key: mark.key }\n if (mark.kind === 'group')\n return h('g', props, mark.children.map(child => renderMark(api, child)))\n if (mark.kind === 'text')\n return h('text', props, mark.text)\n return h('path', props)\n}\n\n/** 缺省的提示框内容:头部是扇区名,下面是数值与占比;「其他」另列出被合并的各项。 */\nfunction renderTooltipContent(api: PieChartApi): VNode[] {\n const tooltip = api.tooltip\n if (!tooltip)\n return []\n return [\n h('div', api.getTooltipHeaderProps() as Record<string, unknown>, tooltip.header),\n ...tooltip.rows.map(row => h('div', { ...api.getTooltipRowProps(row) as Record<string, unknown>, key: row.key }, [\n h('span', api.getTooltipSwatchProps(row) as Record<string, unknown>),\n h('span', api.getTooltipValueProps(row) as Record<string, unknown>, row.value),\n h('span', api.getTooltipNameProps(row) as Record<string, unknown>, row.name),\n ])),\n ]\n}\n\n/** 摘要与数据表:由根自动生成、视觉隐藏,保证无障碍等价物始终存在。 */\nfunction renderA11y(api: PieChartApi): VNode[] {\n const { columns, rows } = api.table\n return [\n h('p', api.getSummaryProps() as Record<string, unknown>, api.summary),\n h('table', api.getTableProps() as Record<string, unknown>, [\n h('caption', api.tableCaption),\n h('thead', [h('tr', columns.map(column => h('th', { key: column.id, scope: 'col' }, column.label)))]),\n h('tbody', rows.map((row, i) => h('tr', { key: i }, row.cells.map((cell, c) =>\n c === 0 ? h('th', { key: c, scope: 'row' }, cell.text) : h('td', { key: c }, cell.text))))),\n ]),\n ]\n}\n\n/** 标题:图表的可及名来源。 */\nexport const XhPieChartCaption = defineComponent({\n name: 'XhPieChartCaption',\n setup(_, { slots }) {\n const ctx = usePieChartContext()\n return () => h('figcaption', ctx.api.value.getCaptionProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\n/** 图例:项由组件按扇区生成;只有一个扇区时整条收起。 */\nexport const XhPieChartLegend = defineComponent({\n name: 'XhPieChartLegend',\n setup() {\n const ctx = usePieChartContext()\n return () => {\n const api = ctx.api.value\n return h('div', api.getLegendProps() as Record<string, unknown>, api.legendItems.map(item =>\n h('button', { ...api.getLegendItemProps(item) as Record<string, unknown>, key: item.id }, [\n h('span', api.getLegendSwatchProps(item) as Record<string, unknown>),\n h('span', api.getLegendLabelProps(item) as Record<string, unknown>, item.name),\n ])))\n }\n },\n})\n\n/** 视口:尺寸观测的宿主,块尺寸由组件槽决定。 */\nexport const XhPieChartViewport = defineComponent({\n name: 'XhPieChartViewport',\n setup(_, { slots }) {\n const ctx = usePieChartContext()\n return () => h('div', {\n ...ctx.api.value.getViewportProps() as Record<string, unknown>,\n ref: (el: unknown) => { ctx.viewportRef.value = el as HTMLElement },\n }, slots.default?.())\n },\n})\n\n/** 绘图区:扇区在下,引导线与标签在上,焦点环最上。 */\nexport const XhPieChartPlot = defineComponent({\n name: 'XhPieChartPlot',\n setup() {\n const ctx = usePieChartContext()\n return () => {\n const api = ctx.api.value\n const marks = [...api.scene.layers.data, ...api.scene.layers.front, ...api.overlay.over]\n return h('svg', api.getPlotProps() as Record<string, unknown>, [renderDefs(api), ...marks.map(mark => renderMark(api, mark))])\n }\n },\n})\n\n/** 环形中心:缺省显示可见扇区的合计,作用域插槽可替换。 */\nexport const XhPieChartCenter = defineComponent({\n name: 'XhPieChartCenter',\n slots: Object as SlotsType<{\n default?: (props: PieChartCenterSlotProps) => VNode[]\n }>,\n setup(_, { slots }) {\n const ctx = usePieChartContext()\n return () => {\n const api = ctx.api.value\n return h('div', api.getCenterProps() as Record<string, unknown>, slots.default\n ? slots.default({ center: api.center, active: api.active })\n : [\n h('span', api.getCenterValueProps() as Record<string, unknown>, api.center.value),\n h('span', api.getCenterLabelProps() as Record<string, unknown>, api.center.label),\n ])\n }\n },\n})\n\n/** 提示框:缺省内容按激活的扇区生成,作用域插槽可替换。 */\nexport const XhPieChartTooltip = defineComponent({\n name: 'XhPieChartTooltip',\n slots: Object as SlotsType<{\n default?: (props: PieChartTooltipSlotProps) => VNode[]\n }>,\n setup(_, { slots }) {\n const ctx = usePieChartContext()\n return () => {\n const api = ctx.api.value\n return h('div', api.getTooltipProps() as Record<string, unknown>, slots.default\n ? slots.default({ active: api.active, tooltip: api.tooltip })\n : renderTooltipContent(api))\n }\n },\n})\n\n/** 空态:没有可画的扇区时显示,缺省文字取文案。 */\nexport const XhPieChartEmpty = defineComponent({\n name: 'XhPieChartEmpty',\n setup(_, { slots }) {\n const ctx = usePieChartContext()\n return () => h('div', ctx.api.value.getEmptyProps() as Record<string, unknown>, slots.default?.() ?? ctx.api.value.emptyText)\n },\n})\n\n/** 根:铺开缺省结构或交给默认插槽,并在末尾追加摘要与数据表。 */\nexport const XhPieChartRoot = defineComponent({\n name: 'XhPieChartRoot',\n // 缺省值由机器与 connect 决定;普通类型省略 default,Boolean 显式保留 undefined\n props: {\n data: { type: Array as PropType<readonly ChartRow[]> },\n nameField: { type: String },\n valueField: { type: String },\n variant: { type: String as PropType<PieVariant> },\n rose: { type: Boolean, default: undefined },\n sweep: { type: String as PropType<PieSweep> },\n sort: { type: String as PropType<PieSort> },\n maxSlices: { type: Number },\n labels: { type: String as PropType<PieLabels> },\n /** 扇区标签写什么:内建写法之一,或自己拼的函数。 */\n labelContent: { type: [String, Function] as PropType<PieLabelContent | ((details: PieLabelDetails) => string)> },\n format: { type: [Object, Function] as PropType<NumberFormatSpec | ((value: number) => string)> },\n hiddenSeries: { type: Array as PropType<string[]> },\n defaultHiddenSeries: { type: Array as PropType<string[]> },\n activeKey: { type: [String, Number, Date, null] as PropType<ChartKey | null> },\n pending: { type: Boolean, default: undefined },\n animated: { type: Boolean, default: undefined },\n locale: { type: String },\n translations: { type: Object as PropType<Partial<PieChartTranslations>> },\n },\n // hidden-series-change / active-key-change 携带 details;update:* 携带裸值,支持 v-model\n emits: {\n 'hidden-series-change': (_details: PayloadOf<PieChartProps, 'onHiddenSeriesChange'>) => true,\n 'update:hiddenSeries': (_hidden: PayloadOf<PieChartProps, 'onHiddenSeriesChange'>['hiddenSeries']) => true,\n 'active-key-change': (_details: PayloadOf<PieChartProps, 'onActiveKeyChange'>) => true,\n 'update:activeKey': (_key: PayloadOf<PieChartProps, 'onActiveKeyChange'>['activeKey']) => true,\n 'datum-active': (_details: PayloadOf<PieChartProps, 'onDatumActive'>) => true,\n 'datum-press': (_details: PayloadOf<PieChartProps, 'onDatumPress'>) => true,\n },\n slots: Object as SlotsType<{\n /** 自行摆放部件;不写时铺开缺省结构:图例、视口(绘图区、环形中心与空态)、提示框。 */\n default?: (props: PieChartRootSlotProps) => VNode[]\n /** 缺省结构里的标题内容。 */\n caption?: () => VNode[]\n /** 缺省结构里的环形中心内容。 */\n center?: (props: PieChartCenterSlotProps) => VNode[]\n /** 缺省结构里的提示框内容。 */\n tooltip?: (props: PieChartTooltipSlotProps) => VNode[]\n /** 缺省结构里的空态内容。 */\n empty?: () => VNode[]\n }>,\n setup(props, { slots, emit }) {\n const ctx = usePieChart(withXhConfig('pie-chart', props) as PieChartProps, {\n onHiddenSeriesChange: (details) => {\n emit('hidden-series-change', details)\n emit('update:hiddenSeries', details.hiddenSeries)\n },\n onActiveKeyChange: (details) => {\n emit('active-key-change', details)\n emit('update:activeKey', details.activeKey)\n },\n onDatumActive: details => emit('datum-active', details),\n onDatumPress: details => emit('datum-press', details),\n })\n providePieChart(ctx)\n return () => {\n const api = ctx.api.value\n const content = slots.default\n ? slots.default({\n legendItems: api.legendItems,\n active: api.active,\n tooltip: api.tooltip,\n center: api.center,\n empty: api.empty,\n table: api.table,\n hiddenSeries: api.hiddenSeries,\n activeKey: api.activeKey,\n toggleSeries: api.toggleSeries,\n setFocusedDatum: api.setFocusedDatum,\n })\n : [\n ...(slots.caption ? [h(XhPieChartCaption, null, () => slots.caption?.())] : []),\n h(XhPieChartLegend),\n // 环形中心与空态放进视口:叠在绘图区上,标题与图例不被盖住\n h(XhPieChartViewport, null, () => [\n h(XhPieChartPlot),\n h(XhPieChartCenter, null, slots.center ? { default: slots.center } : undefined),\n h(XhPieChartEmpty, null, slots.empty ? () => slots.empty?.() : undefined),\n ]),\n h(XhPieChartTooltip, null, slots.tooltip ? { default: slots.tooltip } : undefined),\n ]\n return h('figure', {\n ...api.getRootProps() as Record<string, unknown>,\n ref: (el: unknown) => { ctx.rootRef.value = el as HTMLElement },\n }, [...content, ...renderA11y(api)])\n }\n },\n})\n"],"mappings":"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"}
1
+ {"version":3,"file":"pie-chart.js","names":[],"sources":["../../../src/components/pie-chart/pie-chart.ts"],"sourcesContent":["/*\n * Copyright (c) 2021-Present XiHanFun and contributors.\n * Licensed under the MIT License. See LICENSE in the project root for license information.\n */\n\n// 提供 pie chart 相关实现。\n\nimport type {\n ChartDatumDetails,\n ChartKey,\n ChartMark,\n ChartRow,\n NumberFormatSpec,\n PieChartApi,\n PieChartSchema,\n PieChartTranslations,\n PieLabelContent,\n PieLabelDetails,\n PieLabels,\n PieSort,\n PieSweep,\n PieTooltipModel,\n PieVariant,\n} from '@xihan-ui/headless'\nimport type { PropType, SlotsType, VNode } from 'vue'\nimport type { PayloadOf } from '../../runtime/payload'\nimport { defineComponent, h } from 'vue'\nimport { withXhConfig } from '../../config/config'\nimport { providePieChart, usePieChartContext } from './context'\nimport { usePieChart } from './use-pie-chart'\n\ntype PieChartProps = PieChartSchema['props']\n\n/** 默认插槽的载荷:自行摆放部件时用得上的状态与动作。 */\nexport type PieChartRootSlotProps = Pick<PieChartApi, 'legendItems' | 'active' | 'tooltip' | 'center' | 'empty' | 'hiddenSeries' | 'activeKey' | 'toggleSeries' | 'setFocusedDatum' | 'table'>\n\n/** 提示框插槽的载荷:激活的扇区与缺省的内容模型。 */\nexport interface PieChartTooltipSlotProps {\n active: ChartDatumDetails | null\n tooltip: PieTooltipModel | null\n}\n\n/** 环形中心插槽的载荷:可见扇区的合计与说明文字,以及激活的扇区。 */\nexport interface PieChartCenterSlotProps {\n center: PieChartApi['center']\n active: ChartDatumDetails | null\n}\n\n/** 纹理定义:绘图区的第一个子节点,每种纹理一个 pattern、里面一条线。 */\nfunction renderDefs(api: PieChartApi): VNode {\n return h('defs', api.getDefsProps() as Record<string, unknown>, api.patterns.map(pattern =>\n h('pattern', { ...api.getPatternProps(pattern) as Record<string, unknown>, key: pattern.id }, [\n h('path', api.getPatternLineProps(pattern) as Record<string, unknown>),\n ])))\n}\n\n/** 一个场景标记画成 SVG 元素;文字标记带文字。 */\nfunction renderMark(api: PieChartApi, mark: ChartMark): VNode {\n const props = { ...api.getMarkProps(mark) as Record<string, unknown>, key: mark.key }\n if (mark.kind === 'group')\n return h('g', props, mark.children.map(child => renderMark(api, child)))\n if (mark.kind === 'text')\n return h('text', props, mark.text)\n return h('path', props)\n}\n\n/** 缺省的提示框内容:头部是扇区名,下面是数值与占比;「其他」另列出被合并的各项。 */\nfunction renderTooltipContent(api: PieChartApi): VNode[] {\n const tooltip = api.tooltip\n if (!tooltip)\n return []\n return [\n h('div', api.getTooltipHeaderProps() as Record<string, unknown>, tooltip.header),\n ...tooltip.rows.map(row => h('div', { ...api.getTooltipRowProps(row) as Record<string, unknown>, key: row.key }, [\n h('span', api.getTooltipSwatchProps(row) as Record<string, unknown>),\n h('span', api.getTooltipValueProps(row) as Record<string, unknown>, row.value),\n h('span', api.getTooltipNameProps(row) as Record<string, unknown>, row.name),\n ])),\n ]\n}\n\n/** 摘要与数据表:由根自动生成、视觉隐藏,保证无障碍等价物始终存在。 */\nfunction renderA11y(api: PieChartApi): VNode[] {\n const { columns, rows } = api.table\n return [\n h('p', api.getSummaryProps() as Record<string, unknown>, api.summary),\n // 视觉隐藏落在包着表格的区域上,表格在里面照常排版:隐藏写在表格上收不住它的高度\n h('div', api.getTableRegionProps() as Record<string, unknown>, [\n h('table', api.getTableProps() as Record<string, unknown>, [\n h('caption', api.tableCaption),\n h('thead', [h('tr', columns.map(column => h('th', { key: column.id, scope: 'col' }, column.label)))]),\n h('tbody', rows.map((row, i) => h('tr', { key: i }, row.cells.map((cell, c) =>\n c === 0 ? h('th', { key: c, scope: 'row' }, cell.text) : h('td', { key: c }, cell.text))))),\n ]),\n ]),\n ]\n}\n\n/** 标题:图表的可及名来源。 */\nexport const XhPieChartCaption = defineComponent({\n name: 'XhPieChartCaption',\n setup(_, { slots }) {\n const ctx = usePieChartContext()\n return () => h('figcaption', ctx.api.value.getCaptionProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\n/** 图例:项由组件按扇区生成;只有一个扇区时整条收起。 */\nexport const XhPieChartLegend = defineComponent({\n name: 'XhPieChartLegend',\n setup() {\n const ctx = usePieChartContext()\n return () => {\n const api = ctx.api.value\n return h('div', api.getLegendProps() as Record<string, unknown>, api.legendItems.map(item =>\n h('button', { ...api.getLegendItemProps(item) as Record<string, unknown>, key: item.id }, [\n h('span', api.getLegendSwatchProps(item) as Record<string, unknown>),\n h('span', api.getLegendLabelProps(item) as Record<string, unknown>, item.name),\n ])))\n }\n },\n})\n\n/** 视口:尺寸观测的宿主,块尺寸由组件槽决定。 */\nexport const XhPieChartViewport = defineComponent({\n name: 'XhPieChartViewport',\n setup(_, { slots }) {\n const ctx = usePieChartContext()\n return () => h('div', {\n ...ctx.api.value.getViewportProps() as Record<string, unknown>,\n ref: (el: unknown) => { ctx.viewportRef.value = el as HTMLElement },\n }, slots.default?.())\n },\n})\n\n/** 绘图区:扇区在下,引导线与标签在上,焦点环最上。 */\nexport const XhPieChartPlot = defineComponent({\n name: 'XhPieChartPlot',\n setup() {\n const ctx = usePieChartContext()\n return () => {\n const api = ctx.api.value\n const marks = [...api.scene.layers.data, ...api.scene.layers.front, ...api.overlay.over]\n return h('svg', api.getPlotProps() as Record<string, unknown>, [renderDefs(api), ...marks.map(mark => renderMark(api, mark))])\n }\n },\n})\n\n/** 环形中心:缺省显示可见扇区的合计,作用域插槽可替换。 */\nexport const XhPieChartCenter = defineComponent({\n name: 'XhPieChartCenter',\n slots: Object as SlotsType<{\n default?: (props: PieChartCenterSlotProps) => VNode[]\n }>,\n setup(_, { slots }) {\n const ctx = usePieChartContext()\n return () => {\n const api = ctx.api.value\n return h('div', api.getCenterProps() as Record<string, unknown>, slots.default\n ? slots.default({ center: api.center, active: api.active })\n : [\n h('span', api.getCenterValueProps() as Record<string, unknown>, api.center.value),\n h('span', api.getCenterLabelProps() as Record<string, unknown>, api.center.label),\n ])\n }\n },\n})\n\n/** 提示框:缺省内容按激活的扇区生成,作用域插槽可替换。 */\nexport const XhPieChartTooltip = defineComponent({\n name: 'XhPieChartTooltip',\n slots: Object as SlotsType<{\n default?: (props: PieChartTooltipSlotProps) => VNode[]\n }>,\n setup(_, { slots }) {\n const ctx = usePieChartContext()\n return () => {\n const api = ctx.api.value\n return h('div', api.getTooltipProps() as Record<string, unknown>, slots.default\n ? slots.default({ active: api.active, tooltip: api.tooltip })\n : renderTooltipContent(api))\n }\n },\n})\n\n/** 空态:没有可画的扇区时显示,缺省文字取文案。 */\nexport const XhPieChartEmpty = defineComponent({\n name: 'XhPieChartEmpty',\n setup(_, { slots }) {\n const ctx = usePieChartContext()\n return () => h('div', ctx.api.value.getEmptyProps() as Record<string, unknown>, slots.default?.() ?? ctx.api.value.emptyText)\n },\n})\n\n/** 根:铺开缺省结构或交给默认插槽,并在末尾追加摘要与数据表。 */\nexport const XhPieChartRoot = defineComponent({\n name: 'XhPieChartRoot',\n // 缺省值由机器与 connect 决定;普通类型省略 default,Boolean 显式保留 undefined\n props: {\n data: { type: Array as PropType<readonly ChartRow[]> },\n nameField: { type: String },\n valueField: { type: String },\n variant: { type: String as PropType<PieVariant> },\n rose: { type: Boolean, default: undefined },\n sweep: { type: String as PropType<PieSweep> },\n sort: { type: String as PropType<PieSort> },\n maxSlices: { type: Number },\n labels: { type: String as PropType<PieLabels> },\n /** 扇区标签写什么:内建写法之一,或自己拼的函数。 */\n labelContent: { type: [String, Function] as PropType<PieLabelContent | ((details: PieLabelDetails) => string)> },\n format: { type: [Object, Function] as PropType<NumberFormatSpec | ((value: number) => string)> },\n hiddenSeries: { type: Array as PropType<string[]> },\n defaultHiddenSeries: { type: Array as PropType<string[]> },\n activeKey: { type: [String, Number, Date, null] as PropType<ChartKey | null> },\n pending: { type: Boolean, default: undefined },\n animated: { type: Boolean, default: undefined },\n locale: { type: String },\n translations: { type: Object as PropType<Partial<PieChartTranslations>> },\n },\n // hidden-series-change / active-key-change 携带 details;update:* 携带裸值,支持 v-model\n emits: {\n 'hidden-series-change': (_details: PayloadOf<PieChartProps, 'onHiddenSeriesChange'>) => true,\n 'update:hiddenSeries': (_hidden: PayloadOf<PieChartProps, 'onHiddenSeriesChange'>['hiddenSeries']) => true,\n 'active-key-change': (_details: PayloadOf<PieChartProps, 'onActiveKeyChange'>) => true,\n 'update:activeKey': (_key: PayloadOf<PieChartProps, 'onActiveKeyChange'>['activeKey']) => true,\n 'datum-active': (_details: PayloadOf<PieChartProps, 'onDatumActive'>) => true,\n 'datum-press': (_details: PayloadOf<PieChartProps, 'onDatumPress'>) => true,\n },\n slots: Object as SlotsType<{\n /** 自行摆放部件;不写时铺开缺省结构:图例、视口(绘图区、环形中心与空态)、提示框。 */\n default?: (props: PieChartRootSlotProps) => VNode[]\n /** 缺省结构里的标题内容。 */\n caption?: () => VNode[]\n /** 缺省结构里的环形中心内容。 */\n center?: (props: PieChartCenterSlotProps) => VNode[]\n /** 缺省结构里的提示框内容。 */\n tooltip?: (props: PieChartTooltipSlotProps) => VNode[]\n /** 缺省结构里的空态内容。 */\n empty?: () => VNode[]\n }>,\n setup(props, { slots, emit }) {\n const ctx = usePieChart(withXhConfig('pie-chart', props) as PieChartProps, {\n onHiddenSeriesChange: (details) => {\n emit('hidden-series-change', details)\n emit('update:hiddenSeries', details.hiddenSeries)\n },\n onActiveKeyChange: (details) => {\n emit('active-key-change', details)\n emit('update:activeKey', details.activeKey)\n },\n onDatumActive: details => emit('datum-active', details),\n onDatumPress: details => emit('datum-press', details),\n })\n providePieChart(ctx)\n return () => {\n const api = ctx.api.value\n const content = slots.default\n ? slots.default({\n legendItems: api.legendItems,\n active: api.active,\n tooltip: api.tooltip,\n center: api.center,\n empty: api.empty,\n table: api.table,\n hiddenSeries: api.hiddenSeries,\n activeKey: api.activeKey,\n toggleSeries: api.toggleSeries,\n setFocusedDatum: api.setFocusedDatum,\n })\n : [\n ...(slots.caption ? [h(XhPieChartCaption, null, () => slots.caption?.())] : []),\n h(XhPieChartLegend),\n // 环形中心与空态放进视口:叠在绘图区上,标题与图例不被盖住\n h(XhPieChartViewport, null, () => [\n h(XhPieChartPlot),\n h(XhPieChartCenter, null, slots.center ? { default: slots.center } : undefined),\n h(XhPieChartEmpty, null, slots.empty ? () => slots.empty?.() : undefined),\n ]),\n h(XhPieChartTooltip, null, slots.tooltip ? { default: slots.tooltip } : undefined),\n ]\n return h('figure', {\n ...api.getRootProps() as Record<string, unknown>,\n ref: (el: unknown) => { ctx.rootRef.value = el as HTMLElement },\n }, [...content, ...renderA11y(api)])\n }\n },\n})\n"],"mappings":"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"}
@@ -107,7 +107,8 @@ container: { type: Object } },
107
107
  });
108
108
  return () => h(XhPortal, {
109
109
  to: props.container ?? ctx.portalTarget.value,
110
- source: ctx.triggerRef
110
+ source: ctx.triggerRef,
111
+ present: ctx.visible.value
111
112
  }, () => [h("div", {
112
113
  ...mergeProps(ctx.api.value.getPositionerProps(), attrs),
113
114
  ref: (el) => {
@@ -1 +1 @@
1
- {"version":3,"file":"popconfirm.js","names":[],"sources":["../../../src/components/popconfirm/popconfirm.ts"],"sourcesContent":["/*\n * Copyright (c) 2021-Present XiHanFun and contributors.\n * Licensed under the MIT License. See LICENSE in the project root for license information.\n */\n\n// 提供 popconfirm 相关实现。\n\nimport type { Direction, Placement, Size } from '@xihan-ui/core'\nimport type { PopconfirmApi, PopconfirmConfirmErrorDetails, PopconfirmNotifiers, PopconfirmOverlayProps, PopconfirmProps } from '@xihan-ui/headless'\nimport type { PropType, SlotsType, VNode } from 'vue'\nimport type { PayloadOf } from '../../runtime/payload'\nimport { defineComponent, h, mergeProps } from 'vue'\nimport { mergeIntoChild } from '../../runtime/as-child'\nimport { mergePartProps } from '../../runtime/merge-props'\nimport { XhPortal } from '../../runtime/portal'\nimport { useScrollbars } from '../../runtime/use-scrollbars'\nimport { providePopconfirm, usePopconfirmContext } from './context'\nimport { usePopconfirm } from './use-popconfirm'\n\n/** 默认插槽的载荷:开合、确认事务状态与三个动作。 */\nexport type PopconfirmRootSlotProps = Pick<\n PopconfirmApi,\n 'open' | 'pending' | 'actionError' | 'setOpen' | 'confirm' | 'cancel'\n>\n\nexport const XhPopconfirmRoot = defineComponent({\n name: 'XhPopconfirmRoot',\n props: {\n open: { type: Boolean, default: undefined },\n defaultOpen: Boolean,\n placement: { type: String as PropType<Placement> },\n offset: { type: Number },\n /** 文字方向;浮层迁移到落点后无法继承作者子树上的方向,需要 RTL 时显式提供。 */\n dir: { type: String as PropType<Direction> },\n closeOnEscape: { type: Boolean, default: true },\n closeOnInteractOutside: { type: Boolean, default: true },\n /** 不可打开:触发器转原生 disabled,展开途中转为禁用即收起。 */\n disabled: { type: Boolean, default: undefined },\n size: { type: String as PropType<Size> },\n /**\n * 确认回调使用函数 prop 而非 emit:emit 无法获取监听函数的返回值,而异步门正需要它:\n * 返回 thenable 即挂起(浮层等待兑现后再收起、确认按钮显示加载),拒绝则保持打开并触发 confirm-error。\n * 模板中照常写 @confirm,Vue 会把它落到该 prop 上。\n */\n onConfirm: { type: Function as PropType<PopconfirmNotifiers['onConfirm']> },\n },\n // open-change 携带 { open },update:open 携带裸布尔;cancel 不带载荷\n emits: {\n 'open-change': (_details: PayloadOf<PopconfirmProps, 'onOpenChange'>) => true,\n 'update:open': (_open: PayloadOf<PopconfirmProps, 'onOpenChange'>['open']) => true,\n 'confirm-error': (_details: PopconfirmConfirmErrorDetails) => true,\n 'cancel': () => true,\n },\n slots: Object as SlotsType<{\n default?: (props: PopconfirmRootSlotProps) => VNode[]\n }>,\n setup(props, { slots, emit }) {\n const notify: PopconfirmNotifiers = {\n onOpenChange: (details) => {\n emit('open-change', details)\n emit('update:open', details.open)\n },\n onConfirm: () => props.onConfirm?.(),\n onConfirmError: details => emit('confirm-error', details),\n onCancel: () => { emit('cancel') },\n }\n const ctx = usePopconfirm(props as PopconfirmOverlayProps, notify)\n providePopconfirm(ctx)\n return () => h('div', ctx.api.value.getRootProps() as Record<string, unknown>, slots.default?.({\n open: ctx.api.value.open,\n pending: ctx.api.value.pending,\n actionError: ctx.api.value.actionError,\n setOpen: ctx.api.value.setOpen,\n confirm: ctx.api.value.confirm,\n cancel: ctx.api.value.cancel,\n }))\n },\n})\n\nexport const XhPopconfirmTrigger = defineComponent({\n name: 'XhPopconfirmTrigger',\n // 直通属性自己合:Vue 默认把作者的处理器排在部件的后面,这里改成作者先跑\n inheritAttrs: false,\n props: {\n /** 借用作者的子节点作为触发器,不再渲染自己的包裹元素;子节点须恰好一个。 */\n asChild: Boolean,\n },\n setup(props, { slots, attrs }) {\n const ctx = usePopconfirmContext()\n return () => {\n const part = mergePartProps({\n ...ctx.api.value.getTriggerProps() as Record<string, unknown>,\n ref: (el: unknown) => { ctx.triggerRef.value = el as HTMLElement },\n }, attrs)\n const children = slots.default?.()\n // asChild:把触发器属性合到作者的节点上,不再自己渲染包裹元素\n if (props.asChild) {\n const merged = mergeIntoChild(children, part, 'popconfirm')\n if (merged)\n return merged\n }\n return h('button', part, children)\n }\n },\n})\n\nexport const XhPopconfirmPositioner = defineComponent({\n name: 'XhPopconfirmPositioner',\n props: {\n /** 本实例的 Portal 容器;优先于应用级配置。 */\n container: { type: Object as PropType<Element> },\n },\n // 根是 Teleport,Vue 不会把直通属性合上去,作者写的 class 与 style 得自己接住落到 positioner 上\n inheritAttrs: false,\n setup(props, { slots, attrs }) {\n const ctx = usePopconfirmContext()\n // 面板内容的自绘条:与 content 同级、绝对定位不占布局,壳是这层已经 fixed 的 positioner;浮层里走 4px 档\n const bars = useScrollbars({ scrollable: () => ctx.contentRef.value, props: { size: 'sm' } })\n // 定位层搬到 portal 落点,逃开祖先的层叠上下文\n return () => h(XhPortal, { to: props.container ?? ctx.portalTarget.value, source: ctx.triggerRef }, () => [\n h('div', {\n ...mergeProps(ctx.api.value.getPositionerProps() as Record<string, unknown>, attrs),\n ref: (el: unknown) => { ctx.positionerRef.value = el as HTMLElement },\n }, [...(slots.default?.() ?? []), ...bars.render()]),\n ])\n },\n})\n\nexport const XhPopconfirmContent = defineComponent({\n name: 'XhPopconfirmContent',\n setup(_, { slots }) {\n const ctx = usePopconfirmContext()\n return () => h('div', {\n ...ctx.api.value.getContentProps() as Record<string, unknown>,\n // 收起跟着退场闸门走:皮肤刻意没给 content 补 [hidden]{display:none}(补了退场\n // 就一帧都播不出来),所以真正的收起落成内联 display——节点始终留在原地\n style: ctx.visible.value ? undefined : { display: 'none' },\n ref: (el: unknown) => { ctx.contentRef.value = el as HTMLElement },\n }, slots.default?.())\n },\n})\n\nexport const XhPopconfirmTitle = defineComponent({\n name: 'XhPopconfirmTitle',\n setup(_, { slots }) {\n const ctx = usePopconfirmContext()\n return () => h('h2', ctx.api.value.getTitleProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhPopconfirmDescription = defineComponent({\n name: 'XhPopconfirmDescription',\n setup(_, { slots }) {\n const ctx = usePopconfirmContext()\n return () => h('p', ctx.api.value.getDescriptionProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhPopconfirmConfirmTrigger = defineComponent({\n name: 'XhPopconfirmConfirmTrigger',\n setup(_, { slots }) {\n const ctx = usePopconfirmContext()\n return () => h('button', ctx.api.value.getConfirmTriggerProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhPopconfirmCancelTrigger = defineComponent({\n name: 'XhPopconfirmCancelTrigger',\n setup(_, { slots }) {\n const ctx = usePopconfirmContext()\n return () => h('button', ctx.api.value.getCancelTriggerProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhPopconfirmArrow = defineComponent({\n name: 'XhPopconfirmArrow',\n setup() {\n const ctx = usePopconfirmContext()\n return () => h('div', ctx.api.value.getArrowProps() as Record<string, unknown>)\n },\n})\n"],"mappings":"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"}
1
+ {"version":3,"file":"popconfirm.js","names":[],"sources":["../../../src/components/popconfirm/popconfirm.ts"],"sourcesContent":["/*\n * Copyright (c) 2021-Present XiHanFun and contributors.\n * Licensed under the MIT License. See LICENSE in the project root for license information.\n */\n\n// 提供 popconfirm 相关实现。\n\nimport type { Direction, Placement, Size } from '@xihan-ui/core'\nimport type { PopconfirmApi, PopconfirmConfirmErrorDetails, PopconfirmNotifiers, PopconfirmOverlayProps, PopconfirmProps } from '@xihan-ui/headless'\nimport type { PropType, SlotsType, VNode } from 'vue'\nimport type { PayloadOf } from '../../runtime/payload'\nimport { defineComponent, h, mergeProps } from 'vue'\nimport { mergeIntoChild } from '../../runtime/as-child'\nimport { mergePartProps } from '../../runtime/merge-props'\nimport { XhPortal } from '../../runtime/portal'\nimport { useScrollbars } from '../../runtime/use-scrollbars'\nimport { providePopconfirm, usePopconfirmContext } from './context'\nimport { usePopconfirm } from './use-popconfirm'\n\n/** 默认插槽的载荷:开合、确认事务状态与三个动作。 */\nexport type PopconfirmRootSlotProps = Pick<\n PopconfirmApi,\n 'open' | 'pending' | 'actionError' | 'setOpen' | 'confirm' | 'cancel'\n>\n\nexport const XhPopconfirmRoot = defineComponent({\n name: 'XhPopconfirmRoot',\n props: {\n open: { type: Boolean, default: undefined },\n defaultOpen: Boolean,\n placement: { type: String as PropType<Placement> },\n offset: { type: Number },\n /** 文字方向;浮层迁移到落点后无法继承作者子树上的方向,需要 RTL 时显式提供。 */\n dir: { type: String as PropType<Direction> },\n closeOnEscape: { type: Boolean, default: true },\n closeOnInteractOutside: { type: Boolean, default: true },\n /** 不可打开:触发器转原生 disabled,展开途中转为禁用即收起。 */\n disabled: { type: Boolean, default: undefined },\n size: { type: String as PropType<Size> },\n /**\n * 确认回调使用函数 prop 而非 emit:emit 无法获取监听函数的返回值,而异步门正需要它:\n * 返回 thenable 即挂起(浮层等待兑现后再收起、确认按钮显示加载),拒绝则保持打开并触发 confirm-error。\n * 模板中照常写 @confirm,Vue 会把它落到该 prop 上。\n */\n onConfirm: { type: Function as PropType<PopconfirmNotifiers['onConfirm']> },\n },\n // open-change 携带 { open },update:open 携带裸布尔;cancel 不带载荷\n emits: {\n 'open-change': (_details: PayloadOf<PopconfirmProps, 'onOpenChange'>) => true,\n 'update:open': (_open: PayloadOf<PopconfirmProps, 'onOpenChange'>['open']) => true,\n 'confirm-error': (_details: PopconfirmConfirmErrorDetails) => true,\n 'cancel': () => true,\n },\n slots: Object as SlotsType<{\n default?: (props: PopconfirmRootSlotProps) => VNode[]\n }>,\n setup(props, { slots, emit }) {\n const notify: PopconfirmNotifiers = {\n onOpenChange: (details) => {\n emit('open-change', details)\n emit('update:open', details.open)\n },\n onConfirm: () => props.onConfirm?.(),\n onConfirmError: details => emit('confirm-error', details),\n onCancel: () => { emit('cancel') },\n }\n const ctx = usePopconfirm(props as PopconfirmOverlayProps, notify)\n providePopconfirm(ctx)\n return () => h('div', ctx.api.value.getRootProps() as Record<string, unknown>, slots.default?.({\n open: ctx.api.value.open,\n pending: ctx.api.value.pending,\n actionError: ctx.api.value.actionError,\n setOpen: ctx.api.value.setOpen,\n confirm: ctx.api.value.confirm,\n cancel: ctx.api.value.cancel,\n }))\n },\n})\n\nexport const XhPopconfirmTrigger = defineComponent({\n name: 'XhPopconfirmTrigger',\n // 直通属性自己合:Vue 默认把作者的处理器排在部件的后面,这里改成作者先跑\n inheritAttrs: false,\n props: {\n /** 借用作者的子节点作为触发器,不再渲染自己的包裹元素;子节点须恰好一个。 */\n asChild: Boolean,\n },\n setup(props, { slots, attrs }) {\n const ctx = usePopconfirmContext()\n return () => {\n const part = mergePartProps({\n ...ctx.api.value.getTriggerProps() as Record<string, unknown>,\n ref: (el: unknown) => { ctx.triggerRef.value = el as HTMLElement },\n }, attrs)\n const children = slots.default?.()\n // asChild:把触发器属性合到作者的节点上,不再自己渲染包裹元素\n if (props.asChild) {\n const merged = mergeIntoChild(children, part, 'popconfirm')\n if (merged)\n return merged\n }\n return h('button', part, children)\n }\n },\n})\n\nexport const XhPopconfirmPositioner = defineComponent({\n name: 'XhPopconfirmPositioner',\n props: {\n /** 本实例的 Portal 容器;优先于应用级配置。 */\n container: { type: Object as PropType<Element> },\n },\n // 根是 Teleport,Vue 不会把直通属性合上去,作者写的 class 与 style 得自己接住落到 positioner 上\n inheritAttrs: false,\n setup(props, { slots, attrs }) {\n const ctx = usePopconfirmContext()\n // 面板内容的自绘条:与 content 同级、绝对定位不占布局,壳是这层已经 fixed 的 positioner;浮层里走 4px 档\n const bars = useScrollbars({ scrollable: () => ctx.contentRef.value, props: { size: 'sm' } })\n // 定位层搬到 portal 落点,逃开祖先的层叠上下文\n return () => h(XhPortal, { to: props.container ?? ctx.portalTarget.value, source: ctx.triggerRef, present: ctx.visible.value }, () => [\n h('div', {\n ...mergeProps(ctx.api.value.getPositionerProps() as Record<string, unknown>, attrs),\n ref: (el: unknown) => { ctx.positionerRef.value = el as HTMLElement },\n }, [...(slots.default?.() ?? []), ...bars.render()]),\n ])\n },\n})\n\nexport const XhPopconfirmContent = defineComponent({\n name: 'XhPopconfirmContent',\n setup(_, { slots }) {\n const ctx = usePopconfirmContext()\n return () => h('div', {\n ...ctx.api.value.getContentProps() as Record<string, unknown>,\n // 收起跟着退场闸门走:皮肤刻意没给 content 补 [hidden]{display:none}(补了退场\n // 就一帧都播不出来),所以真正的收起落成内联 display——节点始终留在原地\n style: ctx.visible.value ? undefined : { display: 'none' },\n ref: (el: unknown) => { ctx.contentRef.value = el as HTMLElement },\n }, slots.default?.())\n },\n})\n\nexport const XhPopconfirmTitle = defineComponent({\n name: 'XhPopconfirmTitle',\n setup(_, { slots }) {\n const ctx = usePopconfirmContext()\n return () => h('h2', ctx.api.value.getTitleProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhPopconfirmDescription = defineComponent({\n name: 'XhPopconfirmDescription',\n setup(_, { slots }) {\n const ctx = usePopconfirmContext()\n return () => h('p', ctx.api.value.getDescriptionProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhPopconfirmConfirmTrigger = defineComponent({\n name: 'XhPopconfirmConfirmTrigger',\n setup(_, { slots }) {\n const ctx = usePopconfirmContext()\n return () => h('button', ctx.api.value.getConfirmTriggerProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhPopconfirmCancelTrigger = defineComponent({\n name: 'XhPopconfirmCancelTrigger',\n setup(_, { slots }) {\n const ctx = usePopconfirmContext()\n return () => h('button', ctx.api.value.getCancelTriggerProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhPopconfirmArrow = defineComponent({\n name: 'XhPopconfirmArrow',\n setup() {\n const ctx = usePopconfirmContext()\n return () => h('div', ctx.api.value.getArrowProps() as Record<string, unknown>)\n },\n})\n"],"mappings":"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"}
@@ -96,9 +96,9 @@ declare const XhPopoverRoot: import("vue").DefineComponent<import("vue").Extract
96
96
  disabled: boolean;
97
97
  open: boolean;
98
98
  defaultOpen: boolean;
99
+ modal: boolean;
99
100
  closeOnEscape: boolean;
100
101
  closeOnInteractOutside: boolean;
101
- modal: boolean;
102
102
  }, SlotsType<{
103
103
  default?: (props: PopoverRootSlotProps) => VNode[];
104
104
  }>, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
@@ -95,7 +95,8 @@ container: { type: Object } },
95
95
  });
96
96
  return () => h(XhPortal, {
97
97
  to: props.container ?? ctx.portalTarget.value,
98
- source: ctx.triggerRef
98
+ source: ctx.triggerRef,
99
+ present: ctx.visible.value
99
100
  }, () => [h("div", {
100
101
  ...mergeProps(ctx.api.value.getPositionerProps(), attrs),
101
102
  ref: (el) => {
@@ -1 +1 @@
1
- {"version":3,"file":"popover.js","names":[],"sources":["../../../src/components/popover/popover.ts"],"sourcesContent":["/*\n * Copyright (c) 2021-Present XiHanFun and contributors.\n * Licensed under the MIT License. See LICENSE in the project root for license information.\n */\n\n// 提供 popover 相关实现。\n\nimport type { Direction, Placement, Size } from '@xihan-ui/core'\nimport type { PopoverApi, PopoverSchema } from '@xihan-ui/headless'\nimport type { PropType, SlotsType, VNode } from 'vue'\nimport type { PayloadOf } from '../../runtime/payload'\nimport { defineComponent, h, mergeProps } from 'vue'\nimport { withXhConfig } from '../../config/config'\nimport { mergeIntoChild } from '../../runtime/as-child'\nimport { mergePartProps } from '../../runtime/merge-props'\nimport { XhPortal } from '../../runtime/portal'\nimport { useScrollbars } from '../../runtime/use-scrollbars'\nimport { providePopover, usePopoverContext } from './context'\nimport { usePopover } from './use-popover'\n\ntype PopoverProps = PopoverSchema['props']\n\n/** 默认插槽的载荷:浮层的展开态与开合命令。 */\nexport type PopoverRootSlotProps = Pick<PopoverApi, 'open' | 'setOpen'>\n\nexport const XhPopoverRoot = defineComponent({\n name: 'XhPopoverRoot',\n props: {\n open: { type: Boolean, default: undefined },\n defaultOpen: Boolean,\n placement: { type: String as PropType<Placement> },\n offset: { type: Number },\n /** 文字方向;浮层迁移到落点后无法继承作者子树上的方向,需要 RTL 时显式提供。 */\n dir: { type: String as PropType<Direction> },\n modal: { type: Boolean, default: false },\n closeOnEscape: { type: Boolean, default: true },\n closeOnInteractOutside: { type: Boolean, default: true },\n /** 浮层不可打开:触发器转原生 disabled。 */\n disabled: { type: Boolean, default: undefined },\n translations: { type: Object as PropType<PopoverProps['translations']> },\n size: { type: String as PropType<Size> },\n },\n // open-change 携带 { open },update:open 携带裸布尔\n emits: {\n 'open-change': (_details: PayloadOf<PopoverProps, 'onOpenChange'>) => true,\n 'update:open': (_open: PayloadOf<PopoverProps, 'onOpenChange'>['open']) => true,\n },\n slots: Object as SlotsType<{\n default?: (props: PopoverRootSlotProps) => VNode[]\n }>,\n setup(props, { slots, emit }) {\n const notify: PopoverProps['onOpenChange'] = (details) => {\n emit('open-change', details)\n emit('update:open', details.open)\n }\n const ctx = usePopover(withXhConfig('popover', props) as PopoverProps, notify)\n providePopover(ctx)\n return () => slots.default?.({ open: ctx.api.value.open, setOpen: ctx.api.value.setOpen })\n },\n})\n\nexport const XhPopoverTrigger = defineComponent({\n name: 'XhPopoverTrigger',\n // 直通属性自己合:Vue 默认把作者的处理器排在部件的后面,这里改成作者先跑\n inheritAttrs: false,\n props: {\n /** 借用作者的子节点作为触发器,不再渲染自己的包裹元素;子节点须恰好一个。 */\n asChild: Boolean,\n },\n setup(props, { slots, attrs }) {\n const ctx = usePopoverContext()\n return () => {\n const part = mergePartProps({\n ...ctx.api.value.getTriggerProps() as Record<string, unknown>,\n ref: (el: unknown) => { ctx.triggerRef.value = el as HTMLElement },\n }, attrs)\n const children = slots.default?.()\n // asChild:把触发器属性合到作者的节点上,不再自己渲染包裹元素\n if (props.asChild) {\n const merged = mergeIntoChild(children, part, 'popover')\n if (merged)\n return merged\n }\n return h('button', part, children)\n }\n },\n})\n\nexport const XhPopoverPositioner = defineComponent({\n name: 'XhPopoverPositioner',\n props: {\n /** 本实例的 Portal 容器;优先于应用级配置。 */\n container: { type: Object as PropType<Element> },\n },\n // 根是 Teleport,Vue 不会把直通属性合上去,作者写的 class 与 style 得自己接住落到 positioner 上\n inheritAttrs: false,\n setup(props, { slots, attrs }) {\n const ctx = usePopoverContext()\n // 面板内容的自绘条:与 content 同级、绝对定位不占布局,壳是这层已经 fixed 的 positioner;浮层里走 4px 档\n const bars = useScrollbars({ scrollable: () => ctx.contentRef.value, props: { size: 'sm' } })\n // 定位层搬到 portal 落点,逃开祖先的层叠上下文\n return () => h(XhPortal, { to: props.container ?? ctx.portalTarget.value, source: ctx.triggerRef }, () => [\n h('div', {\n ...mergeProps(ctx.api.value.getPositionerProps() as Record<string, unknown>, attrs),\n ref: (el: unknown) => { ctx.positionerRef.value = el as HTMLElement },\n }, [...(slots.default?.() ?? []), ...bars.render()]),\n ])\n },\n})\n\nexport const XhPopoverContent = defineComponent({\n name: 'XhPopoverContent',\n setup(_, { slots }) {\n const ctx = usePopoverContext()\n return () => h('div', {\n ...ctx.api.value.getContentProps() as Record<string, unknown>,\n // 收起跟着退场闸门走:皮肤刻意没给 content 补 [hidden]{display:none}(补了退场\n // 就一帧都播不出来),所以真正的收起落成内联 display——节点始终留在原地\n style: ctx.visible.value ? undefined : { display: 'none' },\n ref: (el: unknown) => { ctx.contentRef.value = el as HTMLElement },\n }, slots.default?.())\n },\n})\n\nexport const XhPopoverTitle = defineComponent({\n name: 'XhPopoverTitle',\n setup(_, { slots }) {\n const ctx = usePopoverContext()\n return () => h('h2', ctx.api.value.getTitleProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhPopoverDescription = defineComponent({\n name: 'XhPopoverDescription',\n setup(_, { slots }) {\n const ctx = usePopoverContext()\n return () => h('p', ctx.api.value.getDescriptionProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhPopoverCloseTrigger = defineComponent({\n name: 'XhPopoverCloseTrigger',\n setup(_, { slots }) {\n const ctx = usePopoverContext()\n return () => h('button', ctx.api.value.getCloseTriggerProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhPopoverArrow = defineComponent({\n name: 'XhPopoverArrow',\n setup() {\n const ctx = usePopoverContext()\n return () => h('div', ctx.api.value.getArrowProps() as Record<string, unknown>)\n },\n})\n"],"mappings":";;;;;;;;;AAyBA,MAAa,gBAAgB,gBAAgB;CAC3C,MAAM;CACN,OAAO;EACL,MAAM;GAAE,MAAM;GAAS,SAAS,KAAA;EAAU;EAC1C,aAAa;EACb,WAAW,EAAE,MAAM,OAA8B;EACjD,QAAQ,EAAE,MAAM,OAAO;;EAEvB,KAAK,EAAE,MAAM,OAA8B;EAC3C,OAAO;GAAE,MAAM;GAAS,SAAS;EAAM;EACvC,eAAe;GAAE,MAAM;GAAS,SAAS;EAAK;EAC9C,wBAAwB;GAAE,MAAM;GAAS,SAAS;EAAK;;EAEvD,UAAU;GAAE,MAAM;GAAS,SAAS,KAAA;EAAU;EAC9C,cAAc,EAAE,MAAM,OAAiD;EACvE,MAAM,EAAE,MAAM,OAAyB;CACzC;CAEA,OAAO;EACL,gBAAgB,aAAsD;EACtE,gBAAgB,UAA2D;CAC7E;CACA,OAAO;CAGP,MAAM,OAAO,EAAE,OAAO,QAAQ;EAC5B,MAAM,UAAwC,YAAY;GACxD,KAAK,eAAe,OAAO;GAC3B,KAAK,eAAe,QAAQ,IAAI;EAClC;EACA,MAAM,MAAM,WAAW,aAAa,WAAW,KAAK,GAAmB,MAAM;EAC7E,eAAe,GAAG;EAClB,aAAa,MAAM,UAAU;GAAE,MAAM,IAAI,IAAI,MAAM;GAAM,SAAS,IAAI,IAAI,MAAM;EAAQ,CAAC;CAC3F;AACF,CAAC;AAED,MAAa,mBAAmB,gBAAgB;CAC9C,MAAM;CAEN,cAAc;CACd,OAAO;;AAEL,SAAS,QACX;CACA,MAAM,OAAO,EAAE,OAAO,SAAS;EAC7B,MAAM,MAAM,kBAAkB;EAC9B,aAAa;GACX,MAAM,OAAO,eAAe;IAC1B,GAAG,IAAI,IAAI,MAAM,gBAAgB;IACjC,MAAM,OAAgB;KAAE,IAAI,WAAW,QAAQ;IAAkB;GACnE,GAAG,KAAK;GACR,MAAM,WAAW,MAAM,UAAU;GAEjC,IAAI,MAAM,SAAS;IACjB,MAAM,SAAS,eAAe,UAAU,MAAM,SAAS;IACvD,IAAI,QACF,OAAO;GACX;GACA,OAAO,EAAE,UAAU,MAAM,QAAQ;EACnC;CACF;AACF,CAAC;AAED,MAAa,sBAAsB,gBAAgB;CACjD,MAAM;CACN,OAAO;;AAEL,WAAW,EAAE,MAAM,OAA4B,EACjD;CAEA,cAAc;CACd,MAAM,OAAO,EAAE,OAAO,SAAS;EAC7B,MAAM,MAAM,kBAAkB;EAE9B,MAAM,OAAO,cAAc;GAAE,kBAAkB,IAAI,WAAW;GAAO,OAAO,EAAE,MAAM,KAAK;EAAE,CAAC;EAE5F,aAAa,EAAE,UAAU;GAAE,IAAI,MAAM,aAAa,IAAI,aAAa;GAAO,QAAQ,IAAI;EAAW,SAAS,CACxG,EAAE,OAAO;GACP,GAAG,WAAW,IAAI,IAAI,MAAM,mBAAmB,GAA8B,KAAK;GAClF,MAAM,OAAgB;IAAE,IAAI,cAAc,QAAQ;GAAkB;EACtE,GAAG,CAAC,GAAI,MAAM,UAAU,KAAK,CAAC,GAAI,GAAG,KAAK,OAAO,CAAC,CAAC,CACrD,CAAC;CACH;AACF,CAAC;AAED,MAAa,mBAAmB,gBAAgB;CAC9C,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,kBAAkB;EAC9B,aAAa,EAAE,OAAO;GACpB,GAAG,IAAI,IAAI,MAAM,gBAAgB;GAGjC,OAAO,IAAI,QAAQ,QAAQ,KAAA,IAAY,EAAE,SAAS,OAAO;GACzD,MAAM,OAAgB;IAAE,IAAI,WAAW,QAAQ;GAAkB;EACnE,GAAG,MAAM,UAAU,CAAC;CACtB;AACF,CAAC;AAED,MAAa,iBAAiB,gBAAgB;CAC5C,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,kBAAkB;EAC9B,aAAa,EAAE,MAAM,IAAI,IAAI,MAAM,cAAc,GAA8B,MAAM,UAAU,CAAC;CAClG;AACF,CAAC;AAED,MAAa,uBAAuB,gBAAgB;CAClD,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,kBAAkB;EAC9B,aAAa,EAAE,KAAK,IAAI,IAAI,MAAM,oBAAoB,GAA8B,MAAM,UAAU,CAAC;CACvG;AACF,CAAC;AAED,MAAa,wBAAwB,gBAAgB;CACnD,MAAM;CACN,MAAM,GAAG,EAAE,SAAS;EAClB,MAAM,MAAM,kBAAkB;EAC9B,aAAa,EAAE,UAAU,IAAI,IAAI,MAAM,qBAAqB,GAA8B,MAAM,UAAU,CAAC;CAC7G;AACF,CAAC;AAED,MAAa,iBAAiB,gBAAgB;CAC5C,MAAM;CACN,QAAQ;EACN,MAAM,MAAM,kBAAkB;EAC9B,aAAa,EAAE,OAAO,IAAI,IAAI,MAAM,cAAc,CAA4B;CAChF;AACF,CAAC"}
1
+ {"version":3,"file":"popover.js","names":[],"sources":["../../../src/components/popover/popover.ts"],"sourcesContent":["/*\n * Copyright (c) 2021-Present XiHanFun and contributors.\n * Licensed under the MIT License. See LICENSE in the project root for license information.\n */\n\n// 提供 popover 相关实现。\n\nimport type { Direction, Placement, Size } from '@xihan-ui/core'\nimport type { PopoverApi, PopoverSchema } from '@xihan-ui/headless'\nimport type { PropType, SlotsType, VNode } from 'vue'\nimport type { PayloadOf } from '../../runtime/payload'\nimport { defineComponent, h, mergeProps } from 'vue'\nimport { withXhConfig } from '../../config/config'\nimport { mergeIntoChild } from '../../runtime/as-child'\nimport { mergePartProps } from '../../runtime/merge-props'\nimport { XhPortal } from '../../runtime/portal'\nimport { useScrollbars } from '../../runtime/use-scrollbars'\nimport { providePopover, usePopoverContext } from './context'\nimport { usePopover } from './use-popover'\n\ntype PopoverProps = PopoverSchema['props']\n\n/** 默认插槽的载荷:浮层的展开态与开合命令。 */\nexport type PopoverRootSlotProps = Pick<PopoverApi, 'open' | 'setOpen'>\n\nexport const XhPopoverRoot = defineComponent({\n name: 'XhPopoverRoot',\n props: {\n open: { type: Boolean, default: undefined },\n defaultOpen: Boolean,\n placement: { type: String as PropType<Placement> },\n offset: { type: Number },\n /** 文字方向;浮层迁移到落点后无法继承作者子树上的方向,需要 RTL 时显式提供。 */\n dir: { type: String as PropType<Direction> },\n modal: { type: Boolean, default: false },\n closeOnEscape: { type: Boolean, default: true },\n closeOnInteractOutside: { type: Boolean, default: true },\n /** 浮层不可打开:触发器转原生 disabled。 */\n disabled: { type: Boolean, default: undefined },\n translations: { type: Object as PropType<PopoverProps['translations']> },\n size: { type: String as PropType<Size> },\n },\n // open-change 携带 { open },update:open 携带裸布尔\n emits: {\n 'open-change': (_details: PayloadOf<PopoverProps, 'onOpenChange'>) => true,\n 'update:open': (_open: PayloadOf<PopoverProps, 'onOpenChange'>['open']) => true,\n },\n slots: Object as SlotsType<{\n default?: (props: PopoverRootSlotProps) => VNode[]\n }>,\n setup(props, { slots, emit }) {\n const notify: PopoverProps['onOpenChange'] = (details) => {\n emit('open-change', details)\n emit('update:open', details.open)\n }\n const ctx = usePopover(withXhConfig('popover', props) as PopoverProps, notify)\n providePopover(ctx)\n return () => slots.default?.({ open: ctx.api.value.open, setOpen: ctx.api.value.setOpen })\n },\n})\n\nexport const XhPopoverTrigger = defineComponent({\n name: 'XhPopoverTrigger',\n // 直通属性自己合:Vue 默认把作者的处理器排在部件的后面,这里改成作者先跑\n inheritAttrs: false,\n props: {\n /** 借用作者的子节点作为触发器,不再渲染自己的包裹元素;子节点须恰好一个。 */\n asChild: Boolean,\n },\n setup(props, { slots, attrs }) {\n const ctx = usePopoverContext()\n return () => {\n const part = mergePartProps({\n ...ctx.api.value.getTriggerProps() as Record<string, unknown>,\n ref: (el: unknown) => { ctx.triggerRef.value = el as HTMLElement },\n }, attrs)\n const children = slots.default?.()\n // asChild:把触发器属性合到作者的节点上,不再自己渲染包裹元素\n if (props.asChild) {\n const merged = mergeIntoChild(children, part, 'popover')\n if (merged)\n return merged\n }\n return h('button', part, children)\n }\n },\n})\n\nexport const XhPopoverPositioner = defineComponent({\n name: 'XhPopoverPositioner',\n props: {\n /** 本实例的 Portal 容器;优先于应用级配置。 */\n container: { type: Object as PropType<Element> },\n },\n // 根是 Teleport,Vue 不会把直通属性合上去,作者写的 class 与 style 得自己接住落到 positioner 上\n inheritAttrs: false,\n setup(props, { slots, attrs }) {\n const ctx = usePopoverContext()\n // 面板内容的自绘条:与 content 同级、绝对定位不占布局,壳是这层已经 fixed 的 positioner;浮层里走 4px 档\n const bars = useScrollbars({ scrollable: () => ctx.contentRef.value, props: { size: 'sm' } })\n // 定位层搬到 portal 落点,逃开祖先的层叠上下文\n return () => h(XhPortal, { to: props.container ?? ctx.portalTarget.value, source: ctx.triggerRef, present: ctx.visible.value }, () => [\n h('div', {\n ...mergeProps(ctx.api.value.getPositionerProps() as Record<string, unknown>, attrs),\n ref: (el: unknown) => { ctx.positionerRef.value = el as HTMLElement },\n }, [...(slots.default?.() ?? []), ...bars.render()]),\n ])\n },\n})\n\nexport const XhPopoverContent = defineComponent({\n name: 'XhPopoverContent',\n setup(_, { slots }) {\n const ctx = usePopoverContext()\n return () => h('div', {\n ...ctx.api.value.getContentProps() as Record<string, unknown>,\n // 收起跟着退场闸门走:皮肤刻意没给 content 补 [hidden]{display:none}(补了退场\n // 就一帧都播不出来),所以真正的收起落成内联 display——节点始终留在原地\n style: ctx.visible.value ? undefined : { display: 'none' },\n ref: (el: unknown) => { ctx.contentRef.value = el as HTMLElement },\n }, slots.default?.())\n },\n})\n\nexport const XhPopoverTitle = defineComponent({\n name: 'XhPopoverTitle',\n setup(_, { slots }) {\n const ctx = usePopoverContext()\n return () => h('h2', ctx.api.value.getTitleProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhPopoverDescription = defineComponent({\n name: 'XhPopoverDescription',\n setup(_, { slots }) {\n const ctx = usePopoverContext()\n return () => h('p', ctx.api.value.getDescriptionProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhPopoverCloseTrigger = defineComponent({\n name: 'XhPopoverCloseTrigger',\n setup(_, { slots }) {\n const ctx = usePopoverContext()\n return () => h('button', ctx.api.value.getCloseTriggerProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\nexport const XhPopoverArrow = defineComponent({\n name: 'XhPopoverArrow',\n setup() {\n const ctx = usePopoverContext()\n return () => h('div', ctx.api.value.getArrowProps() as Record<string, unknown>)\n },\n})\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"radar-chart.d.ts","names":[],"sources":["../../../src/components/radar-chart/radar-chart.ts"],"mappings":";;;;KA6BK,kBAAkB;;KAGX,0BAA0B,KAAK;;UAG1B;EACf,QAAQ;EACR,SAAS;;;cAmDE,mCAAmB,0BAAA,oBAAA,4BAAA;;8BAM9B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;;cAGW,kCAAkB,0BAAA,oBAAA,4BAAA;;8BAa7B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;;cAGW,oCAAoB,0BAAA,oBAAA,4BAAA;;8BAS/B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;;cAGW,gCAAgB,0BAAA,oBAAA,4BAAA;;8BAU3B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;;cAGW,mCAAmB,0BAAA,oBAAA,4BAAA;;;EAGlB,WAAC,OAAO,+BAA+B;kCAWnD;;cAGW,iCAAiB,0BAAA,oBAAA,4BAAA;;8BAM5B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;;cAGW,gCAAgB,8BAAA;;IAIF,MAAA,kBAAkB;;;;;;IAEZ,MAAA,kBAAkB;;;IACtB,MAAA,SAAS;;;;;;;IAET,MAAA,SAAS;;;IACT,MAAA,SAAS;;;;;;;;;;;;IAKI,MAAA,SAAS,qBAAqB;;;IACrC,MAAA;;;IACO,MAAA;;;IACa,MAAA,SAAS;;;;;;;;;;;;;;IAI5B,MAAA,SAAS,QAAQ;;;;;EAId,yBAAA,UAAA,UAAU;EACZ,wBAAA,SAAA,UAAU;EACX,sBAAA,UAAA,UAAU;EACf,qBAAA,MAAA,UAAU;EACV,iBAAA,UAAA,UAAU;EACX,gBAAA,UAAA,UAAU;;;IA3Bb,MAAA,kBAAkB;;;;;;IAEZ,MAAA,kBAAkB;;;IACtB,MAAA,SAAS;;;;;;;IAET,MAAA,SAAS;;;IACT,MAAA,SAAS;;;;;;;;;;;;IAKI,MAAA,SAAS,qBAAqB;;;IACrC,MAAA;;;IACO,MAAA;;;IACa,MAAA,SAAS;;;;;;;;;;;;;;IAI5B,MAAA,SAAS,QAAQ;;;;;;;;;;;;;;;;EAavC,WAAC,OAAO,4BAA4B;;EAEpC,gBAAM;;EAEN,WAAC,OAAO,+BAA+B;;EAEzC,cAAM;kCA8ChB"}
1
+ {"version":3,"file":"radar-chart.d.ts","names":[],"sources":["../../../src/components/radar-chart/radar-chart.ts"],"mappings":";;;;KA6BK,kBAAkB;;KAGX,0BAA0B,KAAK;;UAG1B;EACf,QAAQ;EACR,SAAS;;;cAsDE,mCAAmB,0BAAA,oBAAA,4BAAA;;8BAM9B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;;cAGW,kCAAkB,0BAAA,oBAAA,4BAAA;;8BAa7B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;;cAGW,oCAAoB,0BAAA,oBAAA,4BAAA;;8BAS/B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;;cAGW,gCAAgB,0BAAA,oBAAA,4BAAA;;8BAU3B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;;cAGW,mCAAmB,0BAAA,oBAAA,4BAAA;;;EAGlB,WAAC,OAAO,+BAA+B;kCAWnD;;cAGW,iCAAiB,0BAAA,oBAAA,4BAAA;;8BAM5B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;;cAGW,gCAAgB,8BAAA;;IAIF,MAAA,kBAAkB;;;;;;IAEZ,MAAA,kBAAkB;;;IACtB,MAAA,SAAS;;;;;;;IAET,MAAA,SAAS;;;IACT,MAAA,SAAS;;;;;;;;;;;;IAKI,MAAA,SAAS,qBAAqB;;;IACrC,MAAA;;;IACO,MAAA;;;IACa,MAAA,SAAS;;;;;;;;;;;;;;IAI5B,MAAA,SAAS,QAAQ;;;;;EAId,yBAAA,UAAA,UAAU;EACZ,wBAAA,SAAA,UAAU;EACX,sBAAA,UAAA,UAAU;EACf,qBAAA,MAAA,UAAU;EACV,iBAAA,UAAA,UAAU;EACX,gBAAA,UAAA,UAAU;;;IA3Bb,MAAA,kBAAkB;;;;;;IAEZ,MAAA,kBAAkB;;;IACtB,MAAA,SAAS;;;;;;;IAET,MAAA,SAAS;;;IACT,MAAA,SAAS;;;;;;;;;;;;IAKI,MAAA,SAAS,qBAAqB;;;IACrC,MAAA;;;IACO,MAAA;;;IACa,MAAA,SAAS;;;;;;;;;;;;;;IAI5B,MAAA,SAAS,QAAQ;;;;;;;;;;;;;;;;EAavC,WAAC,OAAO,4BAA4B;;EAEpC,gBAAM;;EAEN,WAAC,OAAO,+BAA+B;;EAEzC,cAAM;kCA8ChB"}
@@ -36,7 +36,7 @@ function renderTooltipContent(api) {
36
36
  /** 摘要与数据表:由根自动生成、视觉隐藏,保证无障碍等价物始终存在。 */
37
37
  function renderA11y(api) {
38
38
  const { columns, rows } = api.table;
39
- return [h("p", api.getSummaryProps(), api.summary), h("table", api.getTableProps(), [
39
+ return [h("p", api.getSummaryProps(), api.summary), h("div", api.getTableRegionProps(), [h("table", api.getTableProps(), [
40
40
  h("caption", api.tableCaption),
41
41
  h("thead", [h("tr", columns.map((column) => h("th", {
42
42
  key: column.id,
@@ -46,7 +46,7 @@ function renderA11y(api) {
46
46
  key: c,
47
47
  scope: "row"
48
48
  }, cell.text) : h("td", { key: c }, cell.text)))))
49
- ])];
49
+ ])])];
50
50
  }
51
51
  /** 标题:图表的可及名来源。 */
52
52
  const XhRadarChartCaption = defineComponent({
@@ -1 +1 @@
1
- {"version":3,"file":"radar-chart.js","names":[],"sources":["../../../src/components/radar-chart/radar-chart.ts"],"sourcesContent":["/*\n * Copyright (c) 2021-Present XiHanFun and contributors.\n * Licensed under the MIT License. See LICENSE in the project root for license information.\n */\n\n// 提供 radar chart 相关实现。\n\nimport type {\n ChartDatumDetails,\n ChartKey,\n ChartMark,\n ChartRow,\n NumberFormatSpec,\n RadarChartApi,\n RadarChartSchema,\n RadarChartTranslations,\n RadarCurve,\n RadarIndicator,\n RadarScale,\n RadarShape,\n RadarTooltipModel,\n} from '@xihan-ui/headless'\nimport type { PropType, SlotsType, VNode } from 'vue'\nimport type { PayloadOf } from '../../runtime/payload'\nimport { defineComponent, h } from 'vue'\nimport { withXhConfig } from '../../config/config'\nimport { provideRadarChart, useRadarChartContext } from './context'\nimport { useRadarChart } from './use-radar-chart'\n\ntype RadarChartProps = RadarChartSchema['props']\n\n/** 默认插槽的载荷:自行摆放部件时用得上的状态与动作。 */\nexport type RadarChartRootSlotProps = Pick<RadarChartApi, 'legendItems' | 'active' | 'tooltip' | 'empty' | 'hiddenSeries' | 'activeKey' | 'toggleSeries' | 'setFocusedDatum' | 'table'>\n\n/** 提示框插槽的载荷:激活的顶点与缺省的内容模型。 */\nexport interface RadarChartTooltipSlotProps {\n active: ChartDatumDetails | null\n tooltip: RadarTooltipModel | null\n}\n\n/** 纹理定义:绘图区的第一个子节点,每种纹理一个 pattern、里面一条线。 */\nfunction renderDefs(api: RadarChartApi): VNode {\n return h('defs', api.getDefsProps() as Record<string, unknown>, api.patterns.map(pattern =>\n h('pattern', { ...api.getPatternProps(pattern) as Record<string, unknown>, key: pattern.id }, [\n h('path', api.getPatternLineProps(pattern) as Record<string, unknown>),\n ])))\n}\n\n/** 一个场景标记画成 SVG 元素;文字标记带文字。 */\nfunction renderMark(api: RadarChartApi, mark: ChartMark): VNode {\n const props = { ...api.getMarkProps(mark) as Record<string, unknown>, key: mark.key }\n if (mark.kind === 'group')\n return h('g', props, mark.children.map(child => renderMark(api, child)))\n if (mark.kind === 'text')\n return h('text', props, mark.text)\n return h('path', props)\n}\n\n/** 缺省的提示框内容:头部是指标名,每个可见实体一行(色标、数值、实体名)。 */\nfunction renderTooltipContent(api: RadarChartApi): VNode[] {\n const tooltip = api.tooltip\n if (!tooltip)\n return []\n return [\n h('div', api.getTooltipHeaderProps() as Record<string, unknown>, tooltip.header),\n ...tooltip.rows.map(row => h('div', { ...api.getTooltipRowProps(row) as Record<string, unknown>, key: row.seriesId }, [\n h('span', api.getTooltipSwatchProps(row) as Record<string, unknown>),\n h('span', api.getTooltipValueProps(row) as Record<string, unknown>, row.value),\n h('span', api.getTooltipNameProps(row) as Record<string, unknown>, row.name),\n ])),\n ]\n}\n\n/** 摘要与数据表:由根自动生成、视觉隐藏,保证无障碍等价物始终存在。 */\nfunction renderA11y(api: RadarChartApi): VNode[] {\n const { columns, rows } = api.table\n return [\n h('p', api.getSummaryProps() as Record<string, unknown>, api.summary),\n h('table', api.getTableProps() as Record<string, unknown>, [\n h('caption', api.tableCaption),\n h('thead', [h('tr', columns.map(column => h('th', { key: column.id, scope: 'col' }, column.label)))]),\n h('tbody', rows.map((row, i) => h('tr', { key: i }, row.cells.map((cell, c) =>\n c === 0 ? h('th', { key: c, scope: 'row' }, cell.text) : h('td', { key: c }, cell.text))))),\n ]),\n ]\n}\n\n/** 标题:图表的可及名来源。 */\nexport const XhRadarChartCaption = defineComponent({\n name: 'XhRadarChartCaption',\n setup(_, { slots }) {\n const ctx = useRadarChartContext()\n return () => h('figcaption', ctx.api.value.getCaptionProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\n/** 图例:项由组件按实体生成;只有一个实体时整条收起。 */\nexport const XhRadarChartLegend = defineComponent({\n name: 'XhRadarChartLegend',\n setup() {\n const ctx = useRadarChartContext()\n return () => {\n const api = ctx.api.value\n return h('div', api.getLegendProps() as Record<string, unknown>, api.legendItems.map(item =>\n h('button', { ...api.getLegendItemProps(item) as Record<string, unknown>, key: item.id }, [\n h('span', api.getLegendSwatchProps(item) as Record<string, unknown>),\n h('span', api.getLegendLabelProps(item) as Record<string, unknown>, item.name),\n ])))\n }\n },\n})\n\n/** 视口:尺寸观测的宿主,块尺寸由组件槽决定。 */\nexport const XhRadarChartViewport = defineComponent({\n name: 'XhRadarChartViewport',\n setup(_, { slots }) {\n const ctx = useRadarChartContext()\n return () => h('div', {\n ...ctx.api.value.getViewportProps() as Record<string, unknown>,\n ref: (el: unknown) => { ctx.viewportRef.value = el as HTMLElement },\n }, slots.default?.())\n },\n})\n\n/** 绘图区:网格与指标名在下,准线其次,各实体的面积、轮廓与顶点再上,焦点环最上。 */\nexport const XhRadarChartPlot = defineComponent({\n name: 'XhRadarChartPlot',\n setup() {\n const ctx = useRadarChartContext()\n return () => {\n const api = ctx.api.value\n const marks = [...api.scene.layers.back, ...api.overlay.under, ...api.scene.layers.data, ...api.overlay.over]\n return h('svg', api.getPlotProps() as Record<string, unknown>, [renderDefs(api), ...marks.map(mark => renderMark(api, mark))])\n }\n },\n})\n\n/** 提示框:缺省内容按激活的指标生成,作用域插槽可替换。 */\nexport const XhRadarChartTooltip = defineComponent({\n name: 'XhRadarChartTooltip',\n slots: Object as SlotsType<{\n default?: (props: RadarChartTooltipSlotProps) => VNode[]\n }>,\n setup(_, { slots }) {\n const ctx = useRadarChartContext()\n return () => {\n const api = ctx.api.value\n return h('div', api.getTooltipProps() as Record<string, unknown>, slots.default\n ? slots.default({ active: api.active, tooltip: api.tooltip })\n : renderTooltipContent(api))\n }\n },\n})\n\n/** 空态:没有可画的数据时显示,缺省文字取文案。 */\nexport const XhRadarChartEmpty = defineComponent({\n name: 'XhRadarChartEmpty',\n setup(_, { slots }) {\n const ctx = useRadarChartContext()\n return () => h('div', ctx.api.value.getEmptyProps() as Record<string, unknown>, slots.default?.() ?? ctx.api.value.emptyText)\n },\n})\n\n/** 根:铺开缺省结构或交给默认插槽,并在末尾追加摘要与数据表。 */\nexport const XhRadarChartRoot = defineComponent({\n name: 'XhRadarChartRoot',\n // 缺省值由机器与 connect 决定;普通类型省略 default,Boolean 显式保留 undefined\n props: {\n data: { type: Array as PropType<readonly ChartRow[]> },\n nameField: { type: String },\n indicators: { type: Array as PropType<readonly RadarIndicator[]> },\n shape: { type: String as PropType<RadarShape> },\n area: { type: Boolean, default: undefined },\n scale: { type: String as PropType<RadarScale> },\n curve: { type: String as PropType<RadarCurve> },\n /** 网格分几圈,2–10,缺省 4。 */\n rings: { type: Number },\n /** 在 12 点方向那根轴上写出每一圈的数值;只在各指标量程相同时写。 */\n ringLabels: { type: Boolean, default: undefined },\n format: { type: [Object, Function] as PropType<NumberFormatSpec | ((value: number) => string)> },\n hiddenSeries: { type: Array as PropType<string[]> },\n defaultHiddenSeries: { type: Array as PropType<string[]> },\n activeKey: { type: [String, Number, Date, null] as PropType<ChartKey | null> },\n pending: { type: Boolean, default: undefined },\n animated: { type: Boolean, default: undefined },\n locale: { type: String },\n translations: { type: Object as PropType<Partial<RadarChartTranslations>> },\n },\n // hidden-series-change / active-key-change 携带 details;update:* 携带裸值,支持 v-model\n emits: {\n 'hidden-series-change': (_details: PayloadOf<RadarChartProps, 'onHiddenSeriesChange'>) => true,\n 'update:hiddenSeries': (_hidden: PayloadOf<RadarChartProps, 'onHiddenSeriesChange'>['hiddenSeries']) => true,\n 'active-key-change': (_details: PayloadOf<RadarChartProps, 'onActiveKeyChange'>) => true,\n 'update:activeKey': (_key: PayloadOf<RadarChartProps, 'onActiveKeyChange'>['activeKey']) => true,\n 'datum-active': (_details: PayloadOf<RadarChartProps, 'onDatumActive'>) => true,\n 'datum-press': (_details: PayloadOf<RadarChartProps, 'onDatumPress'>) => true,\n },\n slots: Object as SlotsType<{\n /** 自行摆放部件;不写时铺开缺省结构:图例、视口(绘图区与空态)、提示框。 */\n default?: (props: RadarChartRootSlotProps) => VNode[]\n /** 缺省结构里的标题内容。 */\n caption?: () => VNode[]\n /** 缺省结构里的提示框内容。 */\n tooltip?: (props: RadarChartTooltipSlotProps) => VNode[]\n /** 缺省结构里的空态内容。 */\n empty?: () => VNode[]\n }>,\n setup(props, { slots, emit }) {\n const ctx = useRadarChart(withXhConfig('radar-chart', props) as RadarChartProps, {\n onHiddenSeriesChange: (details) => {\n emit('hidden-series-change', details)\n emit('update:hiddenSeries', details.hiddenSeries)\n },\n onActiveKeyChange: (details) => {\n emit('active-key-change', details)\n emit('update:activeKey', details.activeKey)\n },\n onDatumActive: details => emit('datum-active', details),\n onDatumPress: details => emit('datum-press', details),\n })\n provideRadarChart(ctx)\n return () => {\n const api = ctx.api.value\n const content = slots.default\n ? slots.default({\n legendItems: api.legendItems,\n active: api.active,\n tooltip: api.tooltip,\n empty: api.empty,\n table: api.table,\n hiddenSeries: api.hiddenSeries,\n activeKey: api.activeKey,\n toggleSeries: api.toggleSeries,\n setFocusedDatum: api.setFocusedDatum,\n })\n : [\n ...(slots.caption ? [h(XhRadarChartCaption, null, () => slots.caption?.())] : []),\n h(XhRadarChartLegend),\n // 空态放进视口:叠在绘图区上,标题与图例不被盖住\n h(XhRadarChartViewport, null, () => [\n h(XhRadarChartPlot),\n h(XhRadarChartEmpty, null, slots.empty ? () => slots.empty?.() : undefined),\n ]),\n h(XhRadarChartTooltip, null, slots.tooltip ? { default: slots.tooltip } : undefined),\n ]\n return h('figure', {\n ...api.getRootProps() as Record<string, unknown>,\n ref: (el: unknown) => { ctx.rootRef.value = el as HTMLElement },\n }, [...content, ...renderA11y(api)])\n }\n },\n})\n"],"mappings":"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"}
1
+ {"version":3,"file":"radar-chart.js","names":[],"sources":["../../../src/components/radar-chart/radar-chart.ts"],"sourcesContent":["/*\n * Copyright (c) 2021-Present XiHanFun and contributors.\n * Licensed under the MIT License. See LICENSE in the project root for license information.\n */\n\n// 提供 radar chart 相关实现。\n\nimport type {\n ChartDatumDetails,\n ChartKey,\n ChartMark,\n ChartRow,\n NumberFormatSpec,\n RadarChartApi,\n RadarChartSchema,\n RadarChartTranslations,\n RadarCurve,\n RadarIndicator,\n RadarScale,\n RadarShape,\n RadarTooltipModel,\n} from '@xihan-ui/headless'\nimport type { PropType, SlotsType, VNode } from 'vue'\nimport type { PayloadOf } from '../../runtime/payload'\nimport { defineComponent, h } from 'vue'\nimport { withXhConfig } from '../../config/config'\nimport { provideRadarChart, useRadarChartContext } from './context'\nimport { useRadarChart } from './use-radar-chart'\n\ntype RadarChartProps = RadarChartSchema['props']\n\n/** 默认插槽的载荷:自行摆放部件时用得上的状态与动作。 */\nexport type RadarChartRootSlotProps = Pick<RadarChartApi, 'legendItems' | 'active' | 'tooltip' | 'empty' | 'hiddenSeries' | 'activeKey' | 'toggleSeries' | 'setFocusedDatum' | 'table'>\n\n/** 提示框插槽的载荷:激活的顶点与缺省的内容模型。 */\nexport interface RadarChartTooltipSlotProps {\n active: ChartDatumDetails | null\n tooltip: RadarTooltipModel | null\n}\n\n/** 纹理定义:绘图区的第一个子节点,每种纹理一个 pattern、里面一条线。 */\nfunction renderDefs(api: RadarChartApi): VNode {\n return h('defs', api.getDefsProps() as Record<string, unknown>, api.patterns.map(pattern =>\n h('pattern', { ...api.getPatternProps(pattern) as Record<string, unknown>, key: pattern.id }, [\n h('path', api.getPatternLineProps(pattern) as Record<string, unknown>),\n ])))\n}\n\n/** 一个场景标记画成 SVG 元素;文字标记带文字。 */\nfunction renderMark(api: RadarChartApi, mark: ChartMark): VNode {\n const props = { ...api.getMarkProps(mark) as Record<string, unknown>, key: mark.key }\n if (mark.kind === 'group')\n return h('g', props, mark.children.map(child => renderMark(api, child)))\n if (mark.kind === 'text')\n return h('text', props, mark.text)\n return h('path', props)\n}\n\n/** 缺省的提示框内容:头部是指标名,每个可见实体一行(色标、数值、实体名)。 */\nfunction renderTooltipContent(api: RadarChartApi): VNode[] {\n const tooltip = api.tooltip\n if (!tooltip)\n return []\n return [\n h('div', api.getTooltipHeaderProps() as Record<string, unknown>, tooltip.header),\n ...tooltip.rows.map(row => h('div', { ...api.getTooltipRowProps(row) as Record<string, unknown>, key: row.seriesId }, [\n h('span', api.getTooltipSwatchProps(row) as Record<string, unknown>),\n h('span', api.getTooltipValueProps(row) as Record<string, unknown>, row.value),\n h('span', api.getTooltipNameProps(row) as Record<string, unknown>, row.name),\n ])),\n ]\n}\n\n/** 摘要与数据表:由根自动生成、视觉隐藏,保证无障碍等价物始终存在。 */\nfunction renderA11y(api: RadarChartApi): VNode[] {\n const { columns, rows } = api.table\n return [\n h('p', api.getSummaryProps() as Record<string, unknown>, api.summary),\n // 视觉隐藏落在包着表格的区域上,表格在里面照常排版:隐藏写在表格上收不住它的高度\n h('div', api.getTableRegionProps() as Record<string, unknown>, [\n h('table', api.getTableProps() as Record<string, unknown>, [\n h('caption', api.tableCaption),\n h('thead', [h('tr', columns.map(column => h('th', { key: column.id, scope: 'col' }, column.label)))]),\n h('tbody', rows.map((row, i) => h('tr', { key: i }, row.cells.map((cell, c) =>\n c === 0 ? h('th', { key: c, scope: 'row' }, cell.text) : h('td', { key: c }, cell.text))))),\n ]),\n ]),\n ]\n}\n\n/** 标题:图表的可及名来源。 */\nexport const XhRadarChartCaption = defineComponent({\n name: 'XhRadarChartCaption',\n setup(_, { slots }) {\n const ctx = useRadarChartContext()\n return () => h('figcaption', ctx.api.value.getCaptionProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\n/** 图例:项由组件按实体生成;只有一个实体时整条收起。 */\nexport const XhRadarChartLegend = defineComponent({\n name: 'XhRadarChartLegend',\n setup() {\n const ctx = useRadarChartContext()\n return () => {\n const api = ctx.api.value\n return h('div', api.getLegendProps() as Record<string, unknown>, api.legendItems.map(item =>\n h('button', { ...api.getLegendItemProps(item) as Record<string, unknown>, key: item.id }, [\n h('span', api.getLegendSwatchProps(item) as Record<string, unknown>),\n h('span', api.getLegendLabelProps(item) as Record<string, unknown>, item.name),\n ])))\n }\n },\n})\n\n/** 视口:尺寸观测的宿主,块尺寸由组件槽决定。 */\nexport const XhRadarChartViewport = defineComponent({\n name: 'XhRadarChartViewport',\n setup(_, { slots }) {\n const ctx = useRadarChartContext()\n return () => h('div', {\n ...ctx.api.value.getViewportProps() as Record<string, unknown>,\n ref: (el: unknown) => { ctx.viewportRef.value = el as HTMLElement },\n }, slots.default?.())\n },\n})\n\n/** 绘图区:网格与指标名在下,准线其次,各实体的面积、轮廓与顶点再上,焦点环最上。 */\nexport const XhRadarChartPlot = defineComponent({\n name: 'XhRadarChartPlot',\n setup() {\n const ctx = useRadarChartContext()\n return () => {\n const api = ctx.api.value\n const marks = [...api.scene.layers.back, ...api.overlay.under, ...api.scene.layers.data, ...api.overlay.over]\n return h('svg', api.getPlotProps() as Record<string, unknown>, [renderDefs(api), ...marks.map(mark => renderMark(api, mark))])\n }\n },\n})\n\n/** 提示框:缺省内容按激活的指标生成,作用域插槽可替换。 */\nexport const XhRadarChartTooltip = defineComponent({\n name: 'XhRadarChartTooltip',\n slots: Object as SlotsType<{\n default?: (props: RadarChartTooltipSlotProps) => VNode[]\n }>,\n setup(_, { slots }) {\n const ctx = useRadarChartContext()\n return () => {\n const api = ctx.api.value\n return h('div', api.getTooltipProps() as Record<string, unknown>, slots.default\n ? slots.default({ active: api.active, tooltip: api.tooltip })\n : renderTooltipContent(api))\n }\n },\n})\n\n/** 空态:没有可画的数据时显示,缺省文字取文案。 */\nexport const XhRadarChartEmpty = defineComponent({\n name: 'XhRadarChartEmpty',\n setup(_, { slots }) {\n const ctx = useRadarChartContext()\n return () => h('div', ctx.api.value.getEmptyProps() as Record<string, unknown>, slots.default?.() ?? ctx.api.value.emptyText)\n },\n})\n\n/** 根:铺开缺省结构或交给默认插槽,并在末尾追加摘要与数据表。 */\nexport const XhRadarChartRoot = defineComponent({\n name: 'XhRadarChartRoot',\n // 缺省值由机器与 connect 决定;普通类型省略 default,Boolean 显式保留 undefined\n props: {\n data: { type: Array as PropType<readonly ChartRow[]> },\n nameField: { type: String },\n indicators: { type: Array as PropType<readonly RadarIndicator[]> },\n shape: { type: String as PropType<RadarShape> },\n area: { type: Boolean, default: undefined },\n scale: { type: String as PropType<RadarScale> },\n curve: { type: String as PropType<RadarCurve> },\n /** 网格分几圈,2–10,缺省 4。 */\n rings: { type: Number },\n /** 在 12 点方向那根轴上写出每一圈的数值;只在各指标量程相同时写。 */\n ringLabels: { type: Boolean, default: undefined },\n format: { type: [Object, Function] as PropType<NumberFormatSpec | ((value: number) => string)> },\n hiddenSeries: { type: Array as PropType<string[]> },\n defaultHiddenSeries: { type: Array as PropType<string[]> },\n activeKey: { type: [String, Number, Date, null] as PropType<ChartKey | null> },\n pending: { type: Boolean, default: undefined },\n animated: { type: Boolean, default: undefined },\n locale: { type: String },\n translations: { type: Object as PropType<Partial<RadarChartTranslations>> },\n },\n // hidden-series-change / active-key-change 携带 details;update:* 携带裸值,支持 v-model\n emits: {\n 'hidden-series-change': (_details: PayloadOf<RadarChartProps, 'onHiddenSeriesChange'>) => true,\n 'update:hiddenSeries': (_hidden: PayloadOf<RadarChartProps, 'onHiddenSeriesChange'>['hiddenSeries']) => true,\n 'active-key-change': (_details: PayloadOf<RadarChartProps, 'onActiveKeyChange'>) => true,\n 'update:activeKey': (_key: PayloadOf<RadarChartProps, 'onActiveKeyChange'>['activeKey']) => true,\n 'datum-active': (_details: PayloadOf<RadarChartProps, 'onDatumActive'>) => true,\n 'datum-press': (_details: PayloadOf<RadarChartProps, 'onDatumPress'>) => true,\n },\n slots: Object as SlotsType<{\n /** 自行摆放部件;不写时铺开缺省结构:图例、视口(绘图区与空态)、提示框。 */\n default?: (props: RadarChartRootSlotProps) => VNode[]\n /** 缺省结构里的标题内容。 */\n caption?: () => VNode[]\n /** 缺省结构里的提示框内容。 */\n tooltip?: (props: RadarChartTooltipSlotProps) => VNode[]\n /** 缺省结构里的空态内容。 */\n empty?: () => VNode[]\n }>,\n setup(props, { slots, emit }) {\n const ctx = useRadarChart(withXhConfig('radar-chart', props) as RadarChartProps, {\n onHiddenSeriesChange: (details) => {\n emit('hidden-series-change', details)\n emit('update:hiddenSeries', details.hiddenSeries)\n },\n onActiveKeyChange: (details) => {\n emit('active-key-change', details)\n emit('update:activeKey', details.activeKey)\n },\n onDatumActive: details => emit('datum-active', details),\n onDatumPress: details => emit('datum-press', details),\n })\n provideRadarChart(ctx)\n return () => {\n const api = ctx.api.value\n const content = slots.default\n ? slots.default({\n legendItems: api.legendItems,\n active: api.active,\n tooltip: api.tooltip,\n empty: api.empty,\n table: api.table,\n hiddenSeries: api.hiddenSeries,\n activeKey: api.activeKey,\n toggleSeries: api.toggleSeries,\n setFocusedDatum: api.setFocusedDatum,\n })\n : [\n ...(slots.caption ? [h(XhRadarChartCaption, null, () => slots.caption?.())] : []),\n h(XhRadarChartLegend),\n // 空态放进视口:叠在绘图区上,标题与图例不被盖住\n h(XhRadarChartViewport, null, () => [\n h(XhRadarChartPlot),\n h(XhRadarChartEmpty, null, slots.empty ? () => slots.empty?.() : undefined),\n ]),\n h(XhRadarChartTooltip, null, slots.tooltip ? { default: slots.tooltip } : undefined),\n ]\n return h('figure', {\n ...api.getRootProps() as Record<string, unknown>,\n ref: (el: unknown) => { ctx.rootRef.value = el as HTMLElement },\n }, [...content, ...renderA11y(api)])\n }\n },\n})\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"sankey-chart.d.ts","names":[],"sources":["../../../src/components/sankey-chart/sankey-chart.ts"],"mappings":";;;;KA8BK,mBAAmB;;KAGZ,2BAA2B,KAAK;;UAG3B;EACf,QAAQ;EACR,SAAS;;;cAoDE,oCAAoB,0BAAA,oBAAA,4BAAA;;8BAM/B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;;cAGW,mCAAmB,0BAAA,oBAAA,4BAAA;;8BAa9B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;;cAGW,qCAAqB,0BAAA,oBAAA,4BAAA;;8BAShC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;;cAGW,iCAAiB,0BAAA,oBAAA,4BAAA;;8BAU5B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;;cAGW,oCAAoB,0BAAA,oBAAA,4BAAA;;;EAGnB,WAAC,OAAO,gCAAgC;kCAWpD;;cAGW,kCAAkB,0BAAA,oBAAA,4BAAA;;8BAM7B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;;cAGW,iCAAiB,8BAAA;;IAIF,MAAA,kBAAkB;;;IAClB,MAAA,kBAAkB;;;IACX,MAAA,SAAS;;;IACX,MAAA,SAAS;;;IACT,MAAA,SAAS;;;IACV,MAAA,SAAS;;;IACC,MAAA,SAAS,qBAAqB;;;IACrC,MAAA;;;IACO,MAAA;;;IACa,MAAA,SAAS;;;;;;;;;;;;;;IAI5B,MAAA,SAAS,QAAQ;;;;;EAId,yBAAA,UAAA,UAAU;EACZ,wBAAA,SAAA,UAAU;EACX,sBAAA,UAAA,UAAU;EACf,qBAAA,MAAA,UAAU;EACV,iBAAA,UAAA,UAAU;EACX,gBAAA,UAAA,UAAU;;;IAtBZ,MAAA,kBAAkB;;;IAClB,MAAA,kBAAkB;;;IACX,MAAA,SAAS;;;IACX,MAAA,SAAS;;;IACT,MAAA,SAAS;;;IACV,MAAA,SAAS;;;IACC,MAAA,SAAS,qBAAqB;;;IACrC,MAAA;;;IACO,MAAA;;;IACa,MAAA,SAAS;;;;;;;;;;;;;;IAI5B,MAAA,SAAS,QAAQ;;;;;;;;;;;;;;EAavC,WAAC,OAAO,6BAA6B;;EAErC,gBAAM;;EAEN,WAAC,OAAO,gCAAgC;;EAE1C,cAAM;kCA8ChB"}
1
+ {"version":3,"file":"sankey-chart.d.ts","names":[],"sources":["../../../src/components/sankey-chart/sankey-chart.ts"],"mappings":";;;;KA8BK,mBAAmB;;KAGZ,2BAA2B,KAAK;;UAG3B;EACf,QAAQ;EACR,SAAS;;;cAuDE,oCAAoB,0BAAA,oBAAA,4BAAA;;8BAM/B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;;cAGW,mCAAmB,0BAAA,oBAAA,4BAAA;;8BAa9B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;;cAGW,qCAAqB,0BAAA,oBAAA,4BAAA;;8BAShC,qCAAA,iDAAA,aAAA,eAAA,oDAAA;;cAGW,iCAAiB,0BAAA,oBAAA,4BAAA;;8BAU5B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;;cAGW,oCAAoB,0BAAA,oBAAA,4BAAA;;;EAGnB,WAAC,OAAO,gCAAgC;kCAWpD;;cAGW,kCAAkB,0BAAA,oBAAA,4BAAA;;8BAM7B,qCAAA,iDAAA,aAAA,eAAA,oDAAA;;cAGW,iCAAiB,8BAAA;;IAIF,MAAA,kBAAkB;;;IAClB,MAAA,kBAAkB;;;IACX,MAAA,SAAS;;;IACX,MAAA,SAAS;;;IACT,MAAA,SAAS;;;IACV,MAAA,SAAS;;;IACC,MAAA,SAAS,qBAAqB;;;IACrC,MAAA;;;IACO,MAAA;;;IACa,MAAA,SAAS;;;;;;;;;;;;;;IAI5B,MAAA,SAAS,QAAQ;;;;;EAId,yBAAA,UAAA,UAAU;EACZ,wBAAA,SAAA,UAAU;EACX,sBAAA,UAAA,UAAU;EACf,qBAAA,MAAA,UAAU;EACV,iBAAA,UAAA,UAAU;EACX,gBAAA,UAAA,UAAU;;;IAtBZ,MAAA,kBAAkB;;;IAClB,MAAA,kBAAkB;;;IACX,MAAA,SAAS;;;IACX,MAAA,SAAS;;;IACT,MAAA,SAAS;;;IACV,MAAA,SAAS;;;IACC,MAAA,SAAS,qBAAqB;;;IACrC,MAAA;;;IACO,MAAA;;;IACa,MAAA,SAAS;;;;;;;;;;;;;;IAI5B,MAAA,SAAS,QAAQ;;;;;;;;;;;;;;EAavC,WAAC,OAAO,6BAA6B;;EAErC,gBAAM;;EAEN,WAAC,OAAO,gCAAgC;;EAE1C,cAAM;kCA8ChB"}
@@ -36,7 +36,7 @@ function renderTooltipContent(api) {
36
36
  /** 摘要与数据表:由根自动生成、视觉隐藏,保证无障碍等价物始终存在。 */
37
37
  function renderA11y(api) {
38
38
  const { columns, rows } = api.table;
39
- return [h("p", api.getSummaryProps(), api.summary), h("table", api.getTableProps(), [
39
+ return [h("p", api.getSummaryProps(), api.summary), h("div", api.getTableRegionProps(), [h("table", api.getTableProps(), [
40
40
  h("caption", api.tableCaption),
41
41
  h("thead", [h("tr", columns.map((column) => h("th", {
42
42
  key: column.id,
@@ -46,7 +46,7 @@ function renderA11y(api) {
46
46
  key: c,
47
47
  scope: "row"
48
48
  }, cell.text) : h("td", { key: c }, cell.text)))))
49
- ])];
49
+ ])])];
50
50
  }
51
51
  /** 标题:图表的可及名来源。 */
52
52
  const XhSankeyChartCaption = defineComponent({
@@ -1 +1 @@
1
- {"version":3,"file":"sankey-chart.js","names":[],"sources":["../../../src/components/sankey-chart/sankey-chart.ts"],"sourcesContent":["/*\n * Copyright (c) 2021-Present XiHanFun and contributors.\n * Licensed under the MIT License. See LICENSE in the project root for license information.\n */\n\n// 提供 sankey chart 相关实现。\n\nimport type {\n ChartDatumDetails,\n ChartKey,\n ChartMark,\n NumberFormatSpec,\n SankeyChartApi,\n SankeyChartSchema,\n SankeyChartTranslations,\n SankeyLinkColor,\n SankeyLinkDatum,\n SankeyNodeAlign,\n SankeyNodeDatum,\n SankeyNodeSort,\n SankeyOrientation,\n SankeyTooltipModel,\n} from '@xihan-ui/headless'\nimport type { PropType, SlotsType, VNode } from 'vue'\nimport type { PayloadOf } from '../../runtime/payload'\nimport { defineComponent, h } from 'vue'\nimport { withXhConfig } from '../../config/config'\nimport { provideSankeyChart, useSankeyChartContext } from './context'\nimport { useSankeyChart } from './use-sankey-chart'\n\ntype SankeyChartProps = SankeyChartSchema['props']\n\n/** 默认插槽的载荷:自行摆放部件时用得上的状态与动作。 */\nexport type SankeyChartRootSlotProps = Pick<SankeyChartApi, 'legendItems' | 'active' | 'tooltip' | 'empty' | 'hiddenSeries' | 'activeKey' | 'toggleSeries' | 'setFocusedDatum' | 'table'>\n\n/** 提示框插槽的载荷:激活的节点或流带与缺省的内容模型。 */\nexport interface SankeyChartTooltipSlotProps {\n active: ChartDatumDetails | null\n tooltip: SankeyTooltipModel | null\n}\n\n/** 渐变定义:绘图区的第一个子节点,linkColor=\"gradient\" 时每条流带一个渐变、两端各一个色标。 */\nfunction renderDefs(api: SankeyChartApi): VNode {\n return h('defs', api.getDefsProps() as Record<string, unknown>, api.gradients.map(gradient =>\n h('linearGradient', { ...api.getGradientProps(gradient) as Record<string, unknown>, key: gradient.id }, [\n h('stop', api.getGradientStopProps(gradient, 'from') as Record<string, unknown>),\n h('stop', api.getGradientStopProps(gradient, 'to') as Record<string, unknown>),\n ])))\n}\n\n/** 一个场景标记画成 SVG 元素;文字标记带文字。 */\nfunction renderMark(api: SankeyChartApi, mark: ChartMark): VNode {\n const props = { ...api.getMarkProps(mark) as Record<string, unknown>, key: mark.key }\n if (mark.kind === 'group')\n return h('g', props, mark.children.map(child => renderMark(api, child)))\n if (mark.kind === 'text')\n return h('text', props, mark.text)\n return h('path', props)\n}\n\n/** 缺省的提示框内容:节点写合计与流入流出的明细,流带写流量与占比。 */\nfunction renderTooltipContent(api: SankeyChartApi): VNode[] {\n const tooltip = api.tooltip\n if (!tooltip)\n return []\n return [\n h('div', api.getTooltipHeaderProps() as Record<string, unknown>, tooltip.header),\n ...tooltip.rows.map(row => h('div', { ...api.getTooltipRowProps(row) as Record<string, unknown>, key: row.key }, [\n h('span', api.getTooltipSwatchProps(row) as Record<string, unknown>),\n h('span', api.getTooltipValueProps(row) as Record<string, unknown>, row.value),\n h('span', api.getTooltipNameProps(row) as Record<string, unknown>, row.name),\n ])),\n ]\n}\n\n/** 摘要与数据表:由根自动生成、视觉隐藏,保证无障碍等价物始终存在。 */\nfunction renderA11y(api: SankeyChartApi): VNode[] {\n const { columns, rows } = api.table\n return [\n h('p', api.getSummaryProps() as Record<string, unknown>, api.summary),\n h('table', api.getTableProps() as Record<string, unknown>, [\n h('caption', api.tableCaption),\n h('thead', [h('tr', columns.map(column => h('th', { key: column.id, scope: 'col' }, column.label)))]),\n h('tbody', rows.map((row, i) => h('tr', { key: i }, row.cells.map((cell, c) =>\n c === 0 ? h('th', { key: c, scope: 'row' }, cell.text) : h('td', { key: c }, cell.text))))),\n ]),\n ]\n}\n\n/** 标题:图表的可及名来源。 */\nexport const XhSankeyChartCaption = defineComponent({\n name: 'XhSankeyChartCaption',\n setup(_, { slots }) {\n const ctx = useSankeyChartContext()\n return () => h('figcaption', ctx.api.value.getCaptionProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\n/** 图例:项由组件按分组生成;不到两组时整条收起。 */\nexport const XhSankeyChartLegend = defineComponent({\n name: 'XhSankeyChartLegend',\n setup() {\n const ctx = useSankeyChartContext()\n return () => {\n const api = ctx.api.value\n return h('div', api.getLegendProps() as Record<string, unknown>, api.legendItems.map(item =>\n h('button', { ...api.getLegendItemProps(item) as Record<string, unknown>, key: item.id }, [\n h('span', api.getLegendSwatchProps(item) as Record<string, unknown>),\n h('span', api.getLegendLabelProps(item) as Record<string, unknown>, item.name),\n ])))\n }\n },\n})\n\n/** 视口:尺寸观测的宿主,块尺寸由组件槽决定。 */\nexport const XhSankeyChartViewport = defineComponent({\n name: 'XhSankeyChartViewport',\n setup(_, { slots }) {\n const ctx = useSankeyChartContext()\n return () => h('div', {\n ...ctx.api.value.getViewportProps() as Record<string, unknown>,\n ref: (el: unknown) => { ctx.viewportRef.value = el as HTMLElement },\n }, slots.default?.())\n },\n})\n\n/** 绘图区:渐变定义在最前,流带在下,节点其上,节点名再上,焦点环最上。 */\nexport const XhSankeyChartPlot = defineComponent({\n name: 'XhSankeyChartPlot',\n setup() {\n const ctx = useSankeyChartContext()\n return () => {\n const api = ctx.api.value\n const marks = [...api.scene.layers.data, ...api.scene.layers.front, ...api.overlay.over]\n return h('svg', api.getPlotProps() as Record<string, unknown>, [renderDefs(api), ...marks.map(mark => renderMark(api, mark))])\n }\n },\n})\n\n/** 提示框:缺省内容按激活的节点或流带生成,作用域插槽可替换。 */\nexport const XhSankeyChartTooltip = defineComponent({\n name: 'XhSankeyChartTooltip',\n slots: Object as SlotsType<{\n default?: (props: SankeyChartTooltipSlotProps) => VNode[]\n }>,\n setup(_, { slots }) {\n const ctx = useSankeyChartContext()\n return () => {\n const api = ctx.api.value\n return h('div', api.getTooltipProps() as Record<string, unknown>, slots.default\n ? slots.default({ active: api.active, tooltip: api.tooltip })\n : renderTooltipContent(api))\n }\n },\n})\n\n/** 空态:没有可画的数据时显示,缺省文字取文案。 */\nexport const XhSankeyChartEmpty = defineComponent({\n name: 'XhSankeyChartEmpty',\n setup(_, { slots }) {\n const ctx = useSankeyChartContext()\n return () => h('div', ctx.api.value.getEmptyProps() as Record<string, unknown>, slots.default?.() ?? ctx.api.value.emptyText)\n },\n})\n\n/** 根:铺开缺省结构或交给默认插槽,并在末尾追加摘要与数据表。 */\nexport const XhSankeyChartRoot = defineComponent({\n name: 'XhSankeyChartRoot',\n // 缺省值由机器与 connect 决定;普通类型省略 default,Boolean 显式保留 undefined\n props: {\n nodes: { type: Array as PropType<readonly SankeyNodeDatum[]> },\n links: { type: Array as PropType<readonly SankeyLinkDatum[]> },\n orientation: { type: String as PropType<SankeyOrientation> },\n nodeAlign: { type: String as PropType<SankeyNodeAlign> },\n linkColor: { type: String as PropType<SankeyLinkColor> },\n nodeSort: { type: String as PropType<SankeyNodeSort> },\n format: { type: [Object, Function] as PropType<NumberFormatSpec | ((value: number) => string)> },\n hiddenSeries: { type: Array as PropType<string[]> },\n defaultHiddenSeries: { type: Array as PropType<string[]> },\n activeKey: { type: [String, Number, Date, null] as PropType<ChartKey | null> },\n pending: { type: Boolean, default: undefined },\n animated: { type: Boolean, default: undefined },\n locale: { type: String },\n translations: { type: Object as PropType<Partial<SankeyChartTranslations>> },\n },\n // hidden-series-change / active-key-change 携带 details;update:* 携带裸值,支持 v-model\n emits: {\n 'hidden-series-change': (_details: PayloadOf<SankeyChartProps, 'onHiddenSeriesChange'>) => true,\n 'update:hiddenSeries': (_hidden: PayloadOf<SankeyChartProps, 'onHiddenSeriesChange'>['hiddenSeries']) => true,\n 'active-key-change': (_details: PayloadOf<SankeyChartProps, 'onActiveKeyChange'>) => true,\n 'update:activeKey': (_key: PayloadOf<SankeyChartProps, 'onActiveKeyChange'>['activeKey']) => true,\n 'datum-active': (_details: PayloadOf<SankeyChartProps, 'onDatumActive'>) => true,\n 'datum-press': (_details: PayloadOf<SankeyChartProps, 'onDatumPress'>) => true,\n },\n slots: Object as SlotsType<{\n /** 自行摆放部件;不写时铺开缺省结构:图例、视口(绘图区与空态)、提示框。 */\n default?: (props: SankeyChartRootSlotProps) => VNode[]\n /** 缺省结构里的标题内容。 */\n caption?: () => VNode[]\n /** 缺省结构里的提示框内容。 */\n tooltip?: (props: SankeyChartTooltipSlotProps) => VNode[]\n /** 缺省结构里的空态内容。 */\n empty?: () => VNode[]\n }>,\n setup(props, { slots, emit }) {\n const ctx = useSankeyChart(withXhConfig('sankey-chart', props) as SankeyChartProps, {\n onHiddenSeriesChange: (details) => {\n emit('hidden-series-change', details)\n emit('update:hiddenSeries', details.hiddenSeries)\n },\n onActiveKeyChange: (details) => {\n emit('active-key-change', details)\n emit('update:activeKey', details.activeKey)\n },\n onDatumActive: details => emit('datum-active', details),\n onDatumPress: details => emit('datum-press', details),\n })\n provideSankeyChart(ctx)\n return () => {\n const api = ctx.api.value\n const content = slots.default\n ? slots.default({\n legendItems: api.legendItems,\n active: api.active,\n tooltip: api.tooltip,\n empty: api.empty,\n table: api.table,\n hiddenSeries: api.hiddenSeries,\n activeKey: api.activeKey,\n toggleSeries: api.toggleSeries,\n setFocusedDatum: api.setFocusedDatum,\n })\n : [\n ...(slots.caption ? [h(XhSankeyChartCaption, null, () => slots.caption?.())] : []),\n h(XhSankeyChartLegend),\n // 空态放进视口:叠在绘图区上,标题与图例不被盖住\n h(XhSankeyChartViewport, null, () => [\n h(XhSankeyChartPlot),\n h(XhSankeyChartEmpty, null, slots.empty ? () => slots.empty?.() : undefined),\n ]),\n h(XhSankeyChartTooltip, null, slots.tooltip ? { default: slots.tooltip } : undefined),\n ]\n return h('figure', {\n ...api.getRootProps() as Record<string, unknown>,\n ref: (el: unknown) => { ctx.rootRef.value = el as HTMLElement },\n }, [...content, ...renderA11y(api)])\n }\n },\n})\n"],"mappings":"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"}
1
+ {"version":3,"file":"sankey-chart.js","names":[],"sources":["../../../src/components/sankey-chart/sankey-chart.ts"],"sourcesContent":["/*\n * Copyright (c) 2021-Present XiHanFun and contributors.\n * Licensed under the MIT License. See LICENSE in the project root for license information.\n */\n\n// 提供 sankey chart 相关实现。\n\nimport type {\n ChartDatumDetails,\n ChartKey,\n ChartMark,\n NumberFormatSpec,\n SankeyChartApi,\n SankeyChartSchema,\n SankeyChartTranslations,\n SankeyLinkColor,\n SankeyLinkDatum,\n SankeyNodeAlign,\n SankeyNodeDatum,\n SankeyNodeSort,\n SankeyOrientation,\n SankeyTooltipModel,\n} from '@xihan-ui/headless'\nimport type { PropType, SlotsType, VNode } from 'vue'\nimport type { PayloadOf } from '../../runtime/payload'\nimport { defineComponent, h } from 'vue'\nimport { withXhConfig } from '../../config/config'\nimport { provideSankeyChart, useSankeyChartContext } from './context'\nimport { useSankeyChart } from './use-sankey-chart'\n\ntype SankeyChartProps = SankeyChartSchema['props']\n\n/** 默认插槽的载荷:自行摆放部件时用得上的状态与动作。 */\nexport type SankeyChartRootSlotProps = Pick<SankeyChartApi, 'legendItems' | 'active' | 'tooltip' | 'empty' | 'hiddenSeries' | 'activeKey' | 'toggleSeries' | 'setFocusedDatum' | 'table'>\n\n/** 提示框插槽的载荷:激活的节点或流带与缺省的内容模型。 */\nexport interface SankeyChartTooltipSlotProps {\n active: ChartDatumDetails | null\n tooltip: SankeyTooltipModel | null\n}\n\n/** 渐变定义:绘图区的第一个子节点,linkColor=\"gradient\" 时每条流带一个渐变、两端各一个色标。 */\nfunction renderDefs(api: SankeyChartApi): VNode {\n return h('defs', api.getDefsProps() as Record<string, unknown>, api.gradients.map(gradient =>\n h('linearGradient', { ...api.getGradientProps(gradient) as Record<string, unknown>, key: gradient.id }, [\n h('stop', api.getGradientStopProps(gradient, 'from') as Record<string, unknown>),\n h('stop', api.getGradientStopProps(gradient, 'to') as Record<string, unknown>),\n ])))\n}\n\n/** 一个场景标记画成 SVG 元素;文字标记带文字。 */\nfunction renderMark(api: SankeyChartApi, mark: ChartMark): VNode {\n const props = { ...api.getMarkProps(mark) as Record<string, unknown>, key: mark.key }\n if (mark.kind === 'group')\n return h('g', props, mark.children.map(child => renderMark(api, child)))\n if (mark.kind === 'text')\n return h('text', props, mark.text)\n return h('path', props)\n}\n\n/** 缺省的提示框内容:节点写合计与流入流出的明细,流带写流量与占比。 */\nfunction renderTooltipContent(api: SankeyChartApi): VNode[] {\n const tooltip = api.tooltip\n if (!tooltip)\n return []\n return [\n h('div', api.getTooltipHeaderProps() as Record<string, unknown>, tooltip.header),\n ...tooltip.rows.map(row => h('div', { ...api.getTooltipRowProps(row) as Record<string, unknown>, key: row.key }, [\n h('span', api.getTooltipSwatchProps(row) as Record<string, unknown>),\n h('span', api.getTooltipValueProps(row) as Record<string, unknown>, row.value),\n h('span', api.getTooltipNameProps(row) as Record<string, unknown>, row.name),\n ])),\n ]\n}\n\n/** 摘要与数据表:由根自动生成、视觉隐藏,保证无障碍等价物始终存在。 */\nfunction renderA11y(api: SankeyChartApi): VNode[] {\n const { columns, rows } = api.table\n return [\n h('p', api.getSummaryProps() as Record<string, unknown>, api.summary),\n // 视觉隐藏落在包着表格的区域上,表格在里面照常排版:隐藏写在表格上收不住它的高度\n h('div', api.getTableRegionProps() as Record<string, unknown>, [\n h('table', api.getTableProps() as Record<string, unknown>, [\n h('caption', api.tableCaption),\n h('thead', [h('tr', columns.map(column => h('th', { key: column.id, scope: 'col' }, column.label)))]),\n h('tbody', rows.map((row, i) => h('tr', { key: i }, row.cells.map((cell, c) =>\n c === 0 ? h('th', { key: c, scope: 'row' }, cell.text) : h('td', { key: c }, cell.text))))),\n ]),\n ]),\n ]\n}\n\n/** 标题:图表的可及名来源。 */\nexport const XhSankeyChartCaption = defineComponent({\n name: 'XhSankeyChartCaption',\n setup(_, { slots }) {\n const ctx = useSankeyChartContext()\n return () => h('figcaption', ctx.api.value.getCaptionProps() as Record<string, unknown>, slots.default?.())\n },\n})\n\n/** 图例:项由组件按分组生成;不到两组时整条收起。 */\nexport const XhSankeyChartLegend = defineComponent({\n name: 'XhSankeyChartLegend',\n setup() {\n const ctx = useSankeyChartContext()\n return () => {\n const api = ctx.api.value\n return h('div', api.getLegendProps() as Record<string, unknown>, api.legendItems.map(item =>\n h('button', { ...api.getLegendItemProps(item) as Record<string, unknown>, key: item.id }, [\n h('span', api.getLegendSwatchProps(item) as Record<string, unknown>),\n h('span', api.getLegendLabelProps(item) as Record<string, unknown>, item.name),\n ])))\n }\n },\n})\n\n/** 视口:尺寸观测的宿主,块尺寸由组件槽决定。 */\nexport const XhSankeyChartViewport = defineComponent({\n name: 'XhSankeyChartViewport',\n setup(_, { slots }) {\n const ctx = useSankeyChartContext()\n return () => h('div', {\n ...ctx.api.value.getViewportProps() as Record<string, unknown>,\n ref: (el: unknown) => { ctx.viewportRef.value = el as HTMLElement },\n }, slots.default?.())\n },\n})\n\n/** 绘图区:渐变定义在最前,流带在下,节点其上,节点名再上,焦点环最上。 */\nexport const XhSankeyChartPlot = defineComponent({\n name: 'XhSankeyChartPlot',\n setup() {\n const ctx = useSankeyChartContext()\n return () => {\n const api = ctx.api.value\n const marks = [...api.scene.layers.data, ...api.scene.layers.front, ...api.overlay.over]\n return h('svg', api.getPlotProps() as Record<string, unknown>, [renderDefs(api), ...marks.map(mark => renderMark(api, mark))])\n }\n },\n})\n\n/** 提示框:缺省内容按激活的节点或流带生成,作用域插槽可替换。 */\nexport const XhSankeyChartTooltip = defineComponent({\n name: 'XhSankeyChartTooltip',\n slots: Object as SlotsType<{\n default?: (props: SankeyChartTooltipSlotProps) => VNode[]\n }>,\n setup(_, { slots }) {\n const ctx = useSankeyChartContext()\n return () => {\n const api = ctx.api.value\n return h('div', api.getTooltipProps() as Record<string, unknown>, slots.default\n ? slots.default({ active: api.active, tooltip: api.tooltip })\n : renderTooltipContent(api))\n }\n },\n})\n\n/** 空态:没有可画的数据时显示,缺省文字取文案。 */\nexport const XhSankeyChartEmpty = defineComponent({\n name: 'XhSankeyChartEmpty',\n setup(_, { slots }) {\n const ctx = useSankeyChartContext()\n return () => h('div', ctx.api.value.getEmptyProps() as Record<string, unknown>, slots.default?.() ?? ctx.api.value.emptyText)\n },\n})\n\n/** 根:铺开缺省结构或交给默认插槽,并在末尾追加摘要与数据表。 */\nexport const XhSankeyChartRoot = defineComponent({\n name: 'XhSankeyChartRoot',\n // 缺省值由机器与 connect 决定;普通类型省略 default,Boolean 显式保留 undefined\n props: {\n nodes: { type: Array as PropType<readonly SankeyNodeDatum[]> },\n links: { type: Array as PropType<readonly SankeyLinkDatum[]> },\n orientation: { type: String as PropType<SankeyOrientation> },\n nodeAlign: { type: String as PropType<SankeyNodeAlign> },\n linkColor: { type: String as PropType<SankeyLinkColor> },\n nodeSort: { type: String as PropType<SankeyNodeSort> },\n format: { type: [Object, Function] as PropType<NumberFormatSpec | ((value: number) => string)> },\n hiddenSeries: { type: Array as PropType<string[]> },\n defaultHiddenSeries: { type: Array as PropType<string[]> },\n activeKey: { type: [String, Number, Date, null] as PropType<ChartKey | null> },\n pending: { type: Boolean, default: undefined },\n animated: { type: Boolean, default: undefined },\n locale: { type: String },\n translations: { type: Object as PropType<Partial<SankeyChartTranslations>> },\n },\n // hidden-series-change / active-key-change 携带 details;update:* 携带裸值,支持 v-model\n emits: {\n 'hidden-series-change': (_details: PayloadOf<SankeyChartProps, 'onHiddenSeriesChange'>) => true,\n 'update:hiddenSeries': (_hidden: PayloadOf<SankeyChartProps, 'onHiddenSeriesChange'>['hiddenSeries']) => true,\n 'active-key-change': (_details: PayloadOf<SankeyChartProps, 'onActiveKeyChange'>) => true,\n 'update:activeKey': (_key: PayloadOf<SankeyChartProps, 'onActiveKeyChange'>['activeKey']) => true,\n 'datum-active': (_details: PayloadOf<SankeyChartProps, 'onDatumActive'>) => true,\n 'datum-press': (_details: PayloadOf<SankeyChartProps, 'onDatumPress'>) => true,\n },\n slots: Object as SlotsType<{\n /** 自行摆放部件;不写时铺开缺省结构:图例、视口(绘图区与空态)、提示框。 */\n default?: (props: SankeyChartRootSlotProps) => VNode[]\n /** 缺省结构里的标题内容。 */\n caption?: () => VNode[]\n /** 缺省结构里的提示框内容。 */\n tooltip?: (props: SankeyChartTooltipSlotProps) => VNode[]\n /** 缺省结构里的空态内容。 */\n empty?: () => VNode[]\n }>,\n setup(props, { slots, emit }) {\n const ctx = useSankeyChart(withXhConfig('sankey-chart', props) as SankeyChartProps, {\n onHiddenSeriesChange: (details) => {\n emit('hidden-series-change', details)\n emit('update:hiddenSeries', details.hiddenSeries)\n },\n onActiveKeyChange: (details) => {\n emit('active-key-change', details)\n emit('update:activeKey', details.activeKey)\n },\n onDatumActive: details => emit('datum-active', details),\n onDatumPress: details => emit('datum-press', details),\n })\n provideSankeyChart(ctx)\n return () => {\n const api = ctx.api.value\n const content = slots.default\n ? slots.default({\n legendItems: api.legendItems,\n active: api.active,\n tooltip: api.tooltip,\n empty: api.empty,\n table: api.table,\n hiddenSeries: api.hiddenSeries,\n activeKey: api.activeKey,\n toggleSeries: api.toggleSeries,\n setFocusedDatum: api.setFocusedDatum,\n })\n : [\n ...(slots.caption ? [h(XhSankeyChartCaption, null, () => slots.caption?.())] : []),\n h(XhSankeyChartLegend),\n // 空态放进视口:叠在绘图区上,标题与图例不被盖住\n h(XhSankeyChartViewport, null, () => [\n h(XhSankeyChartPlot),\n h(XhSankeyChartEmpty, null, slots.empty ? () => slots.empty?.() : undefined),\n ]),\n h(XhSankeyChartTooltip, null, slots.tooltip ? { default: slots.tooltip } : undefined),\n ]\n return h('figure', {\n ...api.getRootProps() as Record<string, unknown>,\n ref: (el: unknown) => { ctx.rootRef.value = el as HTMLElement },\n }, [...content, ...renderA11y(api)])\n }\n },\n})\n"],"mappings":"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"}