@greypan/web-ui 2.1.8 → 3.0.1

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 (148) hide show
  1. package/README.CN.md +47 -7
  2. package/README.md +54 -13
  3. package/dist/assets/menu-portal.js +1 -1
  4. package/dist/assets/menu-portal.js.map +1 -1
  5. package/dist/components/autocomplete/index.d.ts +121 -0
  6. package/dist/components/autocomplete/index.js +414 -0
  7. package/dist/components/autocomplete/index.js.map +1 -0
  8. package/dist/components/autocomplete/style.js +6 -0
  9. package/dist/components/autocomplete/style.js.map +1 -0
  10. package/dist/components/avatar/index.d.ts +0 -1
  11. package/dist/components/avatar/index.js +9 -9
  12. package/dist/components/avatar/index.js.map +1 -1
  13. package/dist/components/back-top/index.d.ts +0 -1
  14. package/dist/components/back-top/index.js.map +1 -1
  15. package/dist/components/badge/index.d.ts +0 -1
  16. package/dist/components/badge/index.js +5 -5
  17. package/dist/components/badge/index.js.map +1 -1
  18. package/dist/components/button/index.d.ts +0 -1
  19. package/dist/components/button/index.js +8 -8
  20. package/dist/components/button/index.js.map +1 -1
  21. package/dist/components/button/style.js +1 -1
  22. package/dist/components/button/style.js.map +1 -1
  23. package/dist/components/button-group/index.d.ts +0 -1
  24. package/dist/components/button-group/index.js.map +1 -1
  25. package/dist/components/checkbox/index.js +7 -5
  26. package/dist/components/checkbox/index.js.map +1 -1
  27. package/dist/components/checkbox-group/index.js +2 -2
  28. package/dist/components/checkbox-group/index.js.map +1 -1
  29. package/dist/components/context-menu/index.js +25 -25
  30. package/dist/components/context-menu/index.js.map +1 -1
  31. package/dist/components/dialog/index.d.ts +1 -0
  32. package/dist/components/dialog/index.js +9 -5
  33. package/dist/components/dialog/index.js.map +1 -1
  34. package/dist/components/drawer/index.js +7 -7
  35. package/dist/components/drawer/index.js.map +1 -1
  36. package/dist/components/dropdown/index.js +31 -30
  37. package/dist/components/dropdown/index.js.map +1 -1
  38. package/dist/components/dropdown-divider/index.d.ts +0 -1
  39. package/dist/components/dropdown-divider/index.js.map +1 -1
  40. package/dist/components/dropdown-header/index.d.ts +0 -1
  41. package/dist/components/dropdown-header/index.js.map +1 -1
  42. package/dist/components/dropdown-item/index.d.ts +0 -1
  43. package/dist/components/dropdown-item/index.js.map +1 -1
  44. package/dist/components/dropdown-item/style.js +1 -1
  45. package/dist/components/dropdown-item/style.js.map +1 -1
  46. package/dist/components/empty/index.d.ts +0 -1
  47. package/dist/components/empty/index.js +6 -6
  48. package/dist/components/empty/index.js.map +1 -1
  49. package/dist/components/icon/index.d.ts +0 -1
  50. package/dist/components/icon/index.js.map +1 -1
  51. package/dist/components/index.d.ts +5 -0
  52. package/dist/components/index.js +36 -35
  53. package/dist/components/input/index.d.ts +2 -0
  54. package/dist/components/input/index.js +24 -13
  55. package/dist/components/input/index.js.map +1 -1
  56. package/dist/components/input/style.js +1 -1
  57. package/dist/components/input/style.js.map +1 -1
  58. package/dist/components/input-number/index.d.ts +2 -0
  59. package/dist/components/input-number/index.js +25 -12
  60. package/dist/components/input-number/index.js.map +1 -1
  61. package/dist/components/input-number/style.js +1 -1
  62. package/dist/components/input-number/style.js.map +1 -1
  63. package/dist/components/layout/index.d.ts +0 -1
  64. package/dist/components/layout/index.js +4 -4
  65. package/dist/components/layout/index.js.map +1 -1
  66. package/dist/components/option/index.d.ts +0 -11
  67. package/dist/components/option/index.js.map +1 -1
  68. package/dist/components/option/style.js +1 -1
  69. package/dist/components/option/style.js.map +1 -1
  70. package/dist/components/popover/index.js +12 -12
  71. package/dist/components/popover/index.js.map +1 -1
  72. package/dist/components/radio/index.js +8 -5
  73. package/dist/components/radio/index.js.map +1 -1
  74. package/dist/components/radio-group/index.js +2 -2
  75. package/dist/components/radio-group/index.js.map +1 -1
  76. package/dist/components/segmented/index.js +2 -2
  77. package/dist/components/segmented/index.js.map +1 -1
  78. package/dist/components/segmented-trigger/index.d.ts +1 -0
  79. package/dist/components/segmented-trigger/index.js +11 -2
  80. package/dist/components/segmented-trigger/index.js.map +1 -1
  81. package/dist/components/select/index.d.ts +0 -1
  82. package/dist/components/select/index.js +19 -30
  83. package/dist/components/select/index.js.map +1 -1
  84. package/dist/components/select/style.js +1 -1
  85. package/dist/components/select/style.js.map +1 -1
  86. package/dist/components/spinner/index.d.ts +0 -1
  87. package/dist/components/spinner/index.js.map +1 -1
  88. package/dist/components/svg-draw-lines/index.d.ts +0 -1
  89. package/dist/components/svg-draw-lines/index.js.map +1 -1
  90. package/dist/components/switch/index.js +6 -6
  91. package/dist/components/textarea/index.js +18 -15
  92. package/dist/components/textarea/index.js.map +1 -1
  93. package/dist/components/textarea/style.js +1 -1
  94. package/dist/components/textarea/style.js.map +1 -1
  95. package/dist/components/theme/index.d.ts +0 -1
  96. package/dist/components/theme/index.js.map +1 -1
  97. package/dist/components/toast/toast.js +13 -13
  98. package/dist/components/tooltip/index.js +13 -13
  99. package/dist/components/tooltip/index.js.map +1 -1
  100. package/dist/icons/generated/lucide-external-link.d.ts +6 -0
  101. package/dist/icons/generated/lucide-external-link.js +10 -0
  102. package/dist/icons/generated/lucide-external-link.js.map +1 -0
  103. package/dist/icons/generated/lucide-file-text.d.ts +6 -0
  104. package/dist/icons/generated/lucide-file-text.js +10 -0
  105. package/dist/icons/generated/lucide-file-text.js.map +1 -0
  106. package/dist/icons/generated/lucide-film.d.ts +6 -0
  107. package/dist/icons/generated/lucide-film.js +10 -0
  108. package/dist/icons/generated/lucide-film.js.map +1 -0
  109. package/dist/icons/generated/lucide-folder-open.d.ts +6 -0
  110. package/dist/icons/generated/lucide-folder-open.js +10 -0
  111. package/dist/icons/generated/lucide-folder-open.js.map +1 -0
  112. package/dist/icons/generated/lucide-layout-grid.d.ts +6 -0
  113. package/dist/icons/generated/lucide-layout-grid.js +10 -0
  114. package/dist/icons/generated/lucide-layout-grid.js.map +1 -0
  115. package/dist/icons/generated/lucide-music.d.ts +6 -0
  116. package/dist/icons/generated/lucide-music.js +10 -0
  117. package/dist/icons/generated/lucide-music.js.map +1 -0
  118. package/dist/icons/generated/lucide-package.d.ts +6 -0
  119. package/dist/icons/generated/lucide-package.js +10 -0
  120. package/dist/icons/generated/lucide-package.js.map +1 -0
  121. package/dist/icons/generated/lucide-pencil.d.ts +6 -0
  122. package/dist/icons/generated/lucide-pencil.js +10 -0
  123. package/dist/icons/generated/lucide-pencil.js.map +1 -0
  124. package/dist/icons/generated/lucide-refresh-cw.d.ts +6 -0
  125. package/dist/icons/generated/lucide-refresh-cw.js +10 -0
  126. package/dist/icons/generated/lucide-refresh-cw.js.map +1 -0
  127. package/dist/icons/generated/lucide-tags.d.ts +6 -0
  128. package/dist/icons/generated/lucide-tags.js +10 -0
  129. package/dist/icons/generated/lucide-tags.js.map +1 -0
  130. package/dist/icons/generated/lucide-wrench.d.ts +6 -0
  131. package/dist/icons/generated/lucide-wrench.js +10 -0
  132. package/dist/icons/generated/lucide-wrench.js.map +1 -0
  133. package/dist/icons/index.d.ts +11 -0
  134. package/dist/icons/index.js +12 -1
  135. package/dist/shared/menu-portal/menu-portal.js +10 -11
  136. package/dist/shared/menu-portal/menu-portal.js.map +1 -1
  137. package/dist/shared/overlay/anchored-panel.js +12 -12
  138. package/dist/shared/overlay/overlay.js +55 -33
  139. package/dist/shared/overlay/overlay.js.map +1 -1
  140. package/dist/shared/overlay/portal.js +25 -13
  141. package/dist/shared/overlay/portal.js.map +1 -1
  142. package/dist/shared/scroll-lock/scroll-lock.js +13 -12
  143. package/dist/shared/scroll-lock/scroll-lock.js.map +1 -1
  144. package/dist/shared/theme/overlay-root.js +3 -3
  145. package/dist/types/react.d.ts +15 -41
  146. package/dist/types/utils.d.ts +38 -4
  147. package/dist/types/vue.d.ts +17 -49
  148. package/package.json +6 -6
@@ -10,10 +10,44 @@ export type ExtractProps<T> = {
10
10
  };
11
11
  export type OmitLitBase<T> = Omit<T, keyof HTMLElement | keyof LitElement>;
12
12
  /**
13
- * 将 EventMap 转换为 React 19 Custom Element 的精确事件键。
14
- * 例如 { 'open-change': CustomEvent<...> } → { 'onopen-change'?: (e: CustomEvent<...>) => void }
13
+ * 从组件 `$events` 接口提取公共事件映射。
14
+ * 无 `$events` 的组件(无公共事件)得到空映射。
15
15
  */
16
- export type ExactEventListeners<T> = {
17
- [K in keyof T & string as `on${K}`]?: (e: T[K]) => void;
16
+ export type ComponentEvents<T> = T extends {
17
+ readonly $events: infer E;
18
+ } ? E : Record<never, never>;
19
+ /**
20
+ * 事件宿主化:在事件本体上注入组件实例 target/currentTarget 类型。
21
+ * 浏览器组合事件在宿主上重定向后,`event.target` 恒等于宿主元素,因此该收窄零例外。
22
+ * target/currentTarget 标为 readonly,与 DOM `Event` 契约一致。
23
+ */
24
+ export type WithHost<T extends EventTarget, E> = E extends Event ? E & {
25
+ readonly target: T;
26
+ readonly currentTarget: T;
27
+ } : E;
28
+ /**
29
+ * 组件宿主化事件映射:`$events` 的每个条目都收窄 target/currentTarget 到组件实例。
30
+ * React 自定义事件与 Vue emits 均从该映射生成 handler 类型。
31
+ */
32
+ export type HostEventMap<T extends HTMLElement> = {
33
+ [K in keyof ComponentEvents<T>]: WithHost<T, ComponentEvents<T>[K]>;
34
+ };
35
+ /**
36
+ * 组件 `$events` 中的 string 事件名。
37
+ * 无公共事件或仅有非 string 键的组件得到 `never`。
38
+ */
39
+ export type WebUiEventName<T extends HTMLElement> = keyof ComponentEvents<T> & string;
40
+ /**
41
+ * 具名 handler 的显式事件类型,用于 Vue 命名 handler 等无法从上下文推导 `$event` 的位置。
42
+ * 用法:`function onChange(e: WebUiEvent<WebUiSelect, 'change'>)`
43
+ */
44
+ export type WebUiEvent<T extends HTMLElement, K extends WebUiEventName<T>> = HostEventMap<T>[K];
45
+ /**
46
+ * React 自定义事件(kebab-case 事件名)→ `on<event>` 绑定。
47
+ * 标准 DOM 事件(input/change/focus/blur)由 React 的 camelCase handler 提供,
48
+ * 不在适配层生成 lowercase 别名。
49
+ */
50
+ export type ReactCustomEventListeners<T extends HTMLElement> = {
51
+ [K in keyof HostEventMap<T> & string as K extends `${string}-${string}` ? `on${K}` : never]?: (e: HostEventMap<T>[K]) => void;
18
52
  };
19
53
  export {};
@@ -1,60 +1,28 @@
1
- import { ComponentOptionsMixin, DefineComponent, HTMLAttributes } from 'vue';
2
- import { WebUiAvatar, WebUiBackTop, WebUiBadge, WebUiButton, WebUiButtonGroup, WebUiCheckbox, WebUiCheckboxGroup, WebUiContextMenu, WebUiDialog, WebUiDrawer, WebUiEmpty, WebUiDropdownDivider, WebUiDropdownHeader, WebUiDropdownItem, WebUiDropdown, WebUiIcon, WebUiInput, WebUiInputNumber, WebUiLayout, WebUiOption, WebUiPopover, WebUiRadio, WebUiRadioGroup, WebUiSegmented, WebUiSegmentedTrigger, WebUiSelect, WebUiSlider, WebUiSpinner, WebUiTextarea, WebUiTheme, WebUiToast, WebUiSwitch, WebUiTooltip, WebUiSvgDrawLines } from '../components';
3
- import { ExtractProps, OmitLitBase } from './utils';
4
- type ExtractVueEmits<T> = T extends {
1
+ import { ComponentOptionsMixin, DefineComponent, EmitsToProps, HTMLAttributes, PublicProps } from 'vue';
2
+ import { WebUiElementMap } from '../components';
3
+ import { ComponentEvents, ExtractProps, OmitLitBase, WithHost } from './utils';
4
+ type VueEmits<T extends HTMLElement> = T extends {
5
5
  readonly $events: infer E;
6
6
  } ? {
7
- [K in keyof E]: (e: E[K]) => void;
8
- } : Record<string, never>;
7
+ [K in keyof E]: (e: WithHost<T, E[K]>) => void;
8
+ } : Record<never, never>;
9
+ type VueNativeAttrs<T extends HTMLElement> = Omit<HTMLAttributes, `on${Capitalize<keyof ComponentEvents<T> & string>}`>;
10
+ type VueProps<T extends HTMLElement> = ExtractProps<OmitLitBase<T>> & VueNativeAttrs<T>;
11
+ type VueResolvedProps<T extends HTMLElement> = Readonly<VueProps<T>> & (VueEmits<T> extends Record<string, never> ? unknown : EmitsToProps<VueEmits<T>>);
9
12
  /**
10
13
  * Lit Web Component 的 Vue 包装类型。
11
14
  *
12
- * - Props: 从 LitElement 推导的组件属性 + Vue HTMLAttributes(含原生 DOM 事件)
13
- * - Emits: 从 $events 接口提取的自定义事件,Volar 可识别 @event 绑定
15
+ * - Props: 组件属性 + 局部 HTMLAttributes(含原生 DOM 事件),不污染其他 Vue 组件
16
+ * - Emits: 从 $events 提取的宿主化事件,Volar 可识别 @event 绑定
17
+ * - TypeEl: 模板 ref/$el 类型为具体 Custom Element 实例
18
+ * - 不再全局扩展 ComponentCustomProps
14
19
  */
15
- export type LitVueWrapper<T> = T extends {
16
- readonly $events: infer E;
17
- } ? DefineComponent<ExtractProps<OmitLitBase<T>>, Record<string, never>, Record<string, never>, Record<string, never>, Record<string, never>, ComponentOptionsMixin, ComponentOptionsMixin, ExtractVueEmits<T>> : DefineComponent<ExtractProps<OmitLitBase<T>>>;
18
- export interface WebUiComponents {
19
- 'web-ui-avatar': LitVueWrapper<WebUiAvatar>;
20
- 'web-ui-back-top': LitVueWrapper<WebUiBackTop>;
21
- 'web-ui-badge': LitVueWrapper<WebUiBadge>;
22
- 'web-ui-button': LitVueWrapper<WebUiButton>;
23
- 'web-ui-button-group': LitVueWrapper<WebUiButtonGroup>;
24
- 'web-ui-checkbox': LitVueWrapper<WebUiCheckbox>;
25
- 'web-ui-checkbox-group': LitVueWrapper<WebUiCheckboxGroup>;
26
- 'web-ui-context-menu': LitVueWrapper<WebUiContextMenu>;
27
- 'web-ui-dialog': LitVueWrapper<WebUiDialog>;
28
- 'web-ui-drawer': LitVueWrapper<WebUiDrawer>;
29
- 'web-ui-empty': LitVueWrapper<WebUiEmpty>;
30
- 'web-ui-dropdown-divider': LitVueWrapper<WebUiDropdownDivider>;
31
- 'web-ui-dropdown-header': LitVueWrapper<WebUiDropdownHeader>;
32
- 'web-ui-dropdown-item': LitVueWrapper<WebUiDropdownItem>;
33
- 'web-ui-dropdown': LitVueWrapper<WebUiDropdown>;
34
- 'web-ui-icon': LitVueWrapper<WebUiIcon>;
35
- 'web-ui-input': LitVueWrapper<WebUiInput>;
36
- 'web-ui-input-number': LitVueWrapper<WebUiInputNumber>;
37
- 'web-ui-select': LitVueWrapper<WebUiSelect>;
38
- 'web-ui-slider': LitVueWrapper<WebUiSlider>;
39
- 'web-ui-spinner': LitVueWrapper<WebUiSpinner>;
40
- 'web-ui-svg-draw-lines': LitVueWrapper<WebUiSvgDrawLines>;
41
- 'web-ui-option': LitVueWrapper<WebUiOption>;
42
- 'web-ui-popover': LitVueWrapper<WebUiPopover>;
43
- 'web-ui-radio': LitVueWrapper<WebUiRadio>;
44
- 'web-ui-radio-group': LitVueWrapper<WebUiRadioGroup>;
45
- 'web-ui-segmented': LitVueWrapper<WebUiSegmented>;
46
- 'web-ui-segmented-trigger': LitVueWrapper<WebUiSegmentedTrigger>;
47
- 'web-ui-layout': LitVueWrapper<WebUiLayout>;
48
- 'web-ui-switch': LitVueWrapper<WebUiSwitch>;
49
- 'web-ui-textarea': LitVueWrapper<WebUiTextarea>;
50
- 'web-ui-theme': LitVueWrapper<WebUiTheme>;
51
- 'web-ui-toast': LitVueWrapper<WebUiToast>;
52
- 'web-ui-tooltip': LitVueWrapper<WebUiTooltip>;
53
- }
20
+ export type LitVueWrapper<T extends HTMLElement> = DefineComponent<VueProps<T>, Record<string, never>, Record<string, never>, Record<string, never>, Record<string, never>, ComponentOptionsMixin, ComponentOptionsMixin, VueEmits<T>, string, PublicProps, VueResolvedProps<T>, Record<never, never>, Record<never, never>, Record<never, never>, Record<never, never>, string, Record<never, never>, true, Record<never, never>, T>;
21
+ export type WebUiComponents = {
22
+ [K in keyof WebUiElementMap]: LitVueWrapper<WebUiElementMap[K]>;
23
+ };
54
24
  declare module 'vue' {
55
25
  interface GlobalComponents extends WebUiComponents {
56
26
  }
57
- interface ComponentCustomProps extends HTMLAttributes {
58
- }
59
27
  }
60
28
  export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@greypan/web-ui",
3
- "version": "2.1.8",
3
+ "version": "3.0.1",
4
4
  "description": "Lit-based web components for React, Vue, and vanilla JS",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -41,8 +41,8 @@
41
41
  },
42
42
  "dependencies": {
43
43
  "@floating-ui/dom": "^1.8.0",
44
- "@greypan/browser-kit": "1.7.7",
45
- "@greypan/js-kit": "1.6.6"
44
+ "@greypan/browser-kit": "1.7.8",
45
+ "@greypan/js-kit": "1.6.7"
46
46
  },
47
47
  "devDependencies": {
48
48
  "@iconify-json/jam": "^1.2.3",
@@ -56,12 +56,12 @@
56
56
  "lit": "^3.3.3",
57
57
  "vite-plugin-dts": "^5.0.3",
58
58
  "vue": "^3.5.39",
59
- "@greypan/tsconfig": "1.0.4"
59
+ "@greypan/tsconfig": "1.0.5"
60
60
  },
61
61
  "peerDependencies": {
62
- "@types/react": ">=16",
62
+ "@types/react": ">=19",
63
63
  "lit": "^3.3.3",
64
- "vue": ">=3"
64
+ "vue": ">=3.5"
65
65
  },
66
66
  "peerDependenciesMeta": {
67
67
  "@types/react": {