@yh-ui/components 0.1.10 → 0.1.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ai-action-group/__tests__/ai-action-group.ssr.test.cjs +55 -0
- package/dist/ai-action-group/__tests__/ai-action-group.ssr.test.d.ts +1 -0
- package/dist/ai-action-group/__tests__/ai-action-group.ssr.test.mjs +39 -0
- package/dist/ai-action-group/__tests__/ai-action-group.test.cjs +149 -0
- package/dist/ai-action-group/__tests__/ai-action-group.test.d.ts +1 -0
- package/dist/ai-action-group/__tests__/ai-action-group.test.mjs +104 -0
- package/dist/ai-action-group/index.cjs +26 -0
- package/dist/ai-action-group/index.d.ts +3 -0
- package/dist/ai-action-group/index.mjs +5 -0
- package/dist/ai-action-group/src/ai-action-group.cjs +50 -0
- package/dist/ai-action-group/src/ai-action-group.css +517 -0
- package/dist/ai-action-group/src/ai-action-group.d.ts +55 -0
- package/dist/ai-action-group/src/ai-action-group.d.vue.ts +40 -0
- package/dist/ai-action-group/src/ai-action-group.mjs +44 -0
- package/dist/ai-action-group/src/ai-action-group.vue +602 -0
- package/dist/ai-action-group/src/ai-action-group.vue.d.ts +40 -0
- package/dist/ai-agent-card/__tests__/ai-agent-card.ssr.test.cjs +61 -0
- package/dist/ai-agent-card/__tests__/ai-agent-card.ssr.test.d.ts +1 -0
- package/dist/ai-agent-card/__tests__/ai-agent-card.ssr.test.mjs +65 -0
- package/dist/ai-agent-card/__tests__/ai-agent-card.test.cjs +70 -0
- package/dist/ai-agent-card/__tests__/ai-agent-card.test.d.ts +1 -0
- package/dist/ai-agent-card/__tests__/ai-agent-card.test.mjs +64 -0
- package/dist/ai-agent-card/index.cjs +26 -0
- package/dist/ai-agent-card/index.d.ts +3 -0
- package/dist/ai-agent-card/index.mjs +5 -0
- package/dist/ai-agent-card/src/ai-agent-card.cjs +74 -0
- package/dist/ai-agent-card/src/ai-agent-card.css +859 -0
- package/dist/ai-agent-card/src/ai-agent-card.d.ts +122 -0
- package/dist/ai-agent-card/src/ai-agent-card.d.vue.ts +62 -0
- package/dist/ai-agent-card/src/ai-agent-card.mjs +68 -0
- package/dist/ai-agent-card/src/ai-agent-card.vue +1029 -0
- package/dist/ai-agent-card/src/ai-agent-card.vue.d.ts +62 -0
- package/dist/ai-artifacts/__tests__/ai-artifacts.ssr.test.cjs +73 -0
- package/dist/ai-artifacts/__tests__/ai-artifacts.ssr.test.d.ts +1 -0
- package/dist/ai-artifacts/__tests__/ai-artifacts.ssr.test.mjs +68 -0
- package/dist/ai-artifacts/__tests__/ai-artifacts.test.cjs +128 -0
- package/dist/ai-artifacts/__tests__/ai-artifacts.test.d.ts +1 -0
- package/dist/ai-artifacts/__tests__/ai-artifacts.test.mjs +109 -0
- package/dist/ai-artifacts/index.cjs +26 -0
- package/dist/ai-artifacts/index.d.ts +3 -0
- package/dist/ai-artifacts/index.mjs +5 -0
- package/dist/ai-artifacts/src/ai-artifacts.cjs +55 -0
- package/dist/ai-artifacts/src/ai-artifacts.css +633 -0
- package/dist/ai-artifacts/src/ai-artifacts.d.ts +93 -0
- package/dist/ai-artifacts/src/ai-artifacts.d.vue.ts +33 -0
- package/dist/ai-artifacts/src/ai-artifacts.mjs +49 -0
- package/dist/ai-artifacts/src/ai-artifacts.vue +803 -0
- package/dist/ai-artifacts/src/ai-artifacts.vue.d.ts +33 -0
- package/dist/ai-bubble/__tests__/ai-bubble.ssr.test.cjs +87 -0
- package/dist/ai-bubble/__tests__/ai-bubble.ssr.test.d.ts +1 -0
- package/dist/ai-bubble/__tests__/ai-bubble.ssr.test.mjs +58 -0
- package/dist/ai-bubble/__tests__/ai-bubble.test.cjs +227 -0
- package/dist/ai-bubble/__tests__/ai-bubble.test.d.ts +1 -0
- package/dist/ai-bubble/__tests__/ai-bubble.test.mjs +123 -0
- package/dist/ai-bubble/index.cjs +26 -0
- package/dist/ai-bubble/index.d.ts +3 -0
- package/dist/ai-bubble/index.mjs +5 -0
- package/dist/ai-bubble/src/ai-bubble.cjs +86 -0
- package/dist/ai-bubble/src/ai-bubble.css +932 -0
- package/dist/ai-bubble/src/ai-bubble.d.ts +126 -0
- package/dist/ai-bubble/src/ai-bubble.d.vue.ts +110 -0
- package/dist/ai-bubble/src/ai-bubble.mjs +80 -0
- package/dist/ai-bubble/src/ai-bubble.vue +1300 -0
- package/dist/ai-bubble/src/ai-bubble.vue.d.ts +110 -0
- package/dist/ai-chat/__tests__/ai-chat.ssr.test.cjs +82 -0
- package/dist/ai-chat/__tests__/ai-chat.ssr.test.d.ts +1 -0
- package/dist/ai-chat/__tests__/ai-chat.ssr.test.mjs +69 -0
- package/dist/ai-chat/__tests__/ai-chat.test.cjs +169 -0
- package/dist/ai-chat/__tests__/ai-chat.test.d.ts +1 -0
- package/dist/ai-chat/__tests__/ai-chat.test.mjs +121 -0
- package/dist/ai-chat/index.cjs +26 -0
- package/dist/ai-chat/index.d.ts +3 -0
- package/dist/ai-chat/index.mjs +5 -0
- package/dist/ai-chat/src/ai-chat.cjs +41 -0
- package/dist/ai-chat/src/ai-chat.css +503 -0
- package/dist/ai-chat/src/ai-chat.d.ts +57 -0
- package/dist/ai-chat/src/ai-chat.d.vue.ts +43 -0
- package/dist/ai-chat/src/ai-chat.mjs +35 -0
- package/dist/ai-chat/src/ai-chat.vue +606 -0
- package/dist/ai-chat/src/ai-chat.vue.d.ts +43 -0
- package/dist/ai-code-block/__tests__/ai-code-block.ssr.test.cjs +66 -0
- package/dist/ai-code-block/__tests__/ai-code-block.ssr.test.d.ts +1 -0
- package/dist/ai-code-block/__tests__/ai-code-block.ssr.test.mjs +48 -0
- package/dist/ai-code-block/__tests__/ai-code-block.test.cjs +174 -0
- package/dist/ai-code-block/__tests__/ai-code-block.test.d.ts +1 -0
- package/dist/ai-code-block/__tests__/ai-code-block.test.mjs +108 -0
- package/dist/ai-code-block/index.cjs +26 -0
- package/dist/ai-code-block/index.d.ts +3 -0
- package/dist/ai-code-block/index.mjs +5 -0
- package/dist/ai-code-block/src/ai-code-block.cjs +79 -0
- package/dist/ai-code-block/src/ai-code-block.css +589 -0
- package/dist/ai-code-block/src/ai-code-block.d.ts +76 -0
- package/dist/ai-code-block/src/ai-code-block.d.vue.ts +63 -0
- package/dist/ai-code-block/src/ai-code-block.mjs +73 -0
- package/dist/ai-code-block/src/ai-code-block.vue +706 -0
- package/dist/ai-code-block/src/ai-code-block.vue.d.ts +63 -0
- package/dist/ai-conversations/__tests__/ai-conversations.ssr.test.cjs +50 -0
- package/dist/ai-conversations/__tests__/ai-conversations.ssr.test.d.ts +1 -0
- package/dist/ai-conversations/__tests__/ai-conversations.ssr.test.mjs +42 -0
- package/dist/ai-conversations/__tests__/ai-conversations.test.cjs +67 -0
- package/dist/ai-conversations/__tests__/ai-conversations.test.d.ts +1 -0
- package/dist/ai-conversations/__tests__/ai-conversations.test.mjs +51 -0
- package/dist/ai-conversations/index.cjs +26 -0
- package/dist/ai-conversations/index.d.ts +3 -0
- package/dist/ai-conversations/index.mjs +5 -0
- package/dist/ai-conversations/src/ai-conversations.cjs +69 -0
- package/dist/ai-conversations/src/ai-conversations.css +679 -0
- package/dist/ai-conversations/src/ai-conversations.d.ts +67 -0
- package/dist/ai-conversations/src/ai-conversations.d.vue.ts +52 -0
- package/dist/ai-conversations/src/ai-conversations.mjs +63 -0
- package/dist/ai-conversations/src/ai-conversations.vue +949 -0
- package/dist/ai-conversations/src/ai-conversations.vue.d.ts +52 -0
- package/dist/ai-editor-sender/__tests__/ai-editor-sender.ssr.test.cjs +62 -0
- package/dist/ai-editor-sender/__tests__/ai-editor-sender.ssr.test.d.ts +1 -0
- package/dist/ai-editor-sender/__tests__/ai-editor-sender.ssr.test.mjs +50 -0
- package/dist/ai-editor-sender/__tests__/ai-editor-sender.test.cjs +315 -0
- package/dist/ai-editor-sender/__tests__/ai-editor-sender.test.d.ts +1 -0
- package/dist/ai-editor-sender/__tests__/ai-editor-sender.test.mjs +226 -0
- package/dist/ai-editor-sender/index.cjs +26 -0
- package/dist/ai-editor-sender/index.d.ts +3 -0
- package/dist/ai-editor-sender/index.mjs +5 -0
- package/dist/ai-editor-sender/src/ai-editor-sender.cjs +66 -0
- package/dist/ai-editor-sender/src/ai-editor-sender.css +566 -0
- package/dist/ai-editor-sender/src/ai-editor-sender.d.ts +70 -0
- package/dist/ai-editor-sender/src/ai-editor-sender.d.vue.ts +70 -0
- package/dist/ai-editor-sender/src/ai-editor-sender.mjs +60 -0
- package/dist/ai-editor-sender/src/ai-editor-sender.vue +713 -0
- package/dist/ai-editor-sender/src/ai-editor-sender.vue.d.ts +70 -0
- package/dist/ai-prompts/__tests__/ai-prompts.ssr.test.cjs +49 -0
- package/dist/ai-prompts/__tests__/ai-prompts.ssr.test.d.ts +1 -0
- package/dist/ai-prompts/__tests__/ai-prompts.ssr.test.mjs +41 -0
- package/dist/ai-prompts/__tests__/ai-prompts.test.cjs +54 -0
- package/dist/ai-prompts/__tests__/ai-prompts.test.d.ts +1 -0
- package/dist/ai-prompts/__tests__/ai-prompts.test.mjs +38 -0
- package/dist/ai-prompts/index.cjs +26 -0
- package/dist/ai-prompts/index.d.ts +3 -0
- package/dist/ai-prompts/index.mjs +5 -0
- package/dist/ai-prompts/src/ai-prompts.cjs +42 -0
- package/dist/ai-prompts/src/ai-prompts.css +572 -0
- package/dist/ai-prompts/src/ai-prompts.d.ts +45 -0
- package/dist/ai-prompts/src/ai-prompts.d.vue.ts +44 -0
- package/dist/ai-prompts/src/ai-prompts.mjs +36 -0
- package/dist/ai-prompts/src/ai-prompts.vue +646 -0
- package/dist/ai-prompts/src/ai-prompts.vue.d.ts +44 -0
- package/dist/ai-provider/__tests__/ai-provider.ssr.test.cjs +33 -0
- package/dist/ai-provider/__tests__/ai-provider.ssr.test.d.ts +1 -0
- package/dist/ai-provider/__tests__/ai-provider.ssr.test.mjs +34 -0
- package/dist/ai-provider/__tests__/ai-provider.test.cjs +38 -0
- package/dist/ai-provider/__tests__/ai-provider.test.d.ts +1 -0
- package/dist/ai-provider/__tests__/ai-provider.test.mjs +33 -0
- package/dist/ai-provider/index.cjs +38 -0
- package/dist/ai-provider/index.d.ts +4 -0
- package/dist/ai-provider/index.mjs +6 -0
- package/dist/ai-provider/src/ai-provider.cjs +7 -0
- package/dist/ai-provider/src/ai-provider.d.ts +88 -0
- package/dist/ai-provider/src/ai-provider.d.vue.ts +48 -0
- package/dist/ai-provider/src/ai-provider.mjs +1 -0
- package/dist/ai-provider/src/ai-provider.vue +24 -0
- package/dist/ai-provider/src/ai-provider.vue.d.ts +48 -0
- package/dist/ai-provider/src/use-ai-provider.cjs +11 -0
- package/dist/ai-provider/src/use-ai-provider.d.ts +10 -0
- package/dist/ai-provider/src/use-ai-provider.mjs +5 -0
- package/dist/ai-sender/__tests__/ai-sender.ssr.test.cjs +46 -0
- package/dist/ai-sender/__tests__/ai-sender.ssr.test.d.ts +1 -0
- package/dist/ai-sender/__tests__/ai-sender.ssr.test.mjs +37 -0
- package/dist/ai-sender/__tests__/ai-sender.test.cjs +388 -0
- package/dist/ai-sender/__tests__/ai-sender.test.d.ts +1 -0
- package/dist/ai-sender/__tests__/ai-sender.test.mjs +248 -0
- package/dist/ai-sender/index.cjs +26 -0
- package/dist/ai-sender/index.d.ts +3 -0
- package/dist/ai-sender/index.mjs +5 -0
- package/dist/ai-sender/src/ai-sender.cjs +91 -0
- package/dist/ai-sender/src/ai-sender.css +754 -0
- package/dist/ai-sender/src/ai-sender.d.ts +140 -0
- package/dist/ai-sender/src/ai-sender.d.vue.ts +69 -0
- package/dist/ai-sender/src/ai-sender.mjs +85 -0
- package/dist/ai-sender/src/ai-sender.vue +1032 -0
- package/dist/ai-sender/src/ai-sender.vue.d.ts +69 -0
- package/dist/ai-sources/__tests__/ai-sources.ssr.test.cjs +72 -0
- package/dist/ai-sources/__tests__/ai-sources.ssr.test.d.ts +1 -0
- package/dist/ai-sources/__tests__/ai-sources.ssr.test.mjs +82 -0
- package/dist/ai-sources/__tests__/ai-sources.test.cjs +93 -0
- package/dist/ai-sources/__tests__/ai-sources.test.d.ts +1 -0
- package/dist/ai-sources/__tests__/ai-sources.test.mjs +89 -0
- package/dist/ai-sources/index.cjs +26 -0
- package/dist/ai-sources/index.d.ts +3 -0
- package/dist/ai-sources/index.mjs +5 -0
- package/dist/ai-sources/src/ai-sources.cjs +59 -0
- package/dist/ai-sources/src/ai-sources.css +830 -0
- package/dist/ai-sources/src/ai-sources.d.ts +79 -0
- package/dist/ai-sources/src/ai-sources.d.vue.ts +45 -0
- package/dist/ai-sources/src/ai-sources.mjs +53 -0
- package/dist/ai-sources/src/ai-sources.vue +1109 -0
- package/dist/ai-sources/src/ai-sources.vue.d.ts +45 -0
- package/dist/ai-thinking/__tests__/ai-thinking.ssr.test.cjs +56 -0
- package/dist/ai-thinking/__tests__/ai-thinking.ssr.test.d.ts +1 -0
- package/dist/ai-thinking/__tests__/ai-thinking.ssr.test.mjs +42 -0
- package/dist/ai-thinking/__tests__/ai-thinking.test.cjs +151 -0
- package/dist/ai-thinking/__tests__/ai-thinking.test.d.ts +1 -0
- package/dist/ai-thinking/__tests__/ai-thinking.test.mjs +96 -0
- package/dist/ai-thinking/index.cjs +26 -0
- package/dist/ai-thinking/index.d.ts +3 -0
- package/dist/ai-thinking/index.mjs +5 -0
- package/dist/ai-thinking/src/ai-thinking.cjs +44 -0
- package/dist/ai-thinking/src/ai-thinking.css +543 -0
- package/dist/ai-thinking/src/ai-thinking.d.ts +42 -0
- package/dist/ai-thinking/src/ai-thinking.d.vue.ts +33 -0
- package/dist/ai-thinking/src/ai-thinking.mjs +38 -0
- package/dist/ai-thinking/src/ai-thinking.vue +631 -0
- package/dist/ai-thinking/src/ai-thinking.vue.d.ts +33 -0
- package/dist/ai-thought-chain/__tests__/ai-thought-chain.ssr.test.cjs +83 -0
- package/dist/ai-thought-chain/__tests__/ai-thought-chain.ssr.test.d.ts +1 -0
- package/dist/ai-thought-chain/__tests__/ai-thought-chain.ssr.test.mjs +52 -0
- package/dist/ai-thought-chain/__tests__/ai-thought-chain.test.cjs +204 -0
- package/dist/ai-thought-chain/__tests__/ai-thought-chain.test.d.ts +1 -0
- package/dist/ai-thought-chain/__tests__/ai-thought-chain.test.mjs +134 -0
- package/dist/ai-thought-chain/index.cjs +26 -0
- package/dist/ai-thought-chain/index.d.ts +3 -0
- package/dist/ai-thought-chain/index.mjs +5 -0
- package/dist/ai-thought-chain/src/ai-thought-chain.cjs +68 -0
- package/dist/ai-thought-chain/src/ai-thought-chain.css +668 -0
- package/dist/ai-thought-chain/src/ai-thought-chain.d.ts +82 -0
- package/dist/ai-thought-chain/src/ai-thought-chain.d.vue.ts +83 -0
- package/dist/ai-thought-chain/src/ai-thought-chain.mjs +62 -0
- package/dist/ai-thought-chain/src/ai-thought-chain.vue +813 -0
- package/dist/ai-thought-chain/src/ai-thought-chain.vue.d.ts +83 -0
- package/dist/ai-voice-trigger/__tests__/ai-voice-trigger.ssr.test.cjs +32 -0
- package/dist/ai-voice-trigger/__tests__/ai-voice-trigger.ssr.test.d.ts +1 -0
- package/dist/ai-voice-trigger/__tests__/ai-voice-trigger.ssr.test.mjs +25 -0
- package/dist/ai-voice-trigger/__tests__/ai-voice-trigger.test.cjs +113 -0
- package/dist/ai-voice-trigger/__tests__/ai-voice-trigger.test.d.ts +1 -0
- package/dist/ai-voice-trigger/__tests__/ai-voice-trigger.test.mjs +93 -0
- package/dist/ai-voice-trigger/index.cjs +26 -0
- package/dist/ai-voice-trigger/index.d.ts +3 -0
- package/dist/ai-voice-trigger/index.mjs +5 -0
- package/dist/ai-voice-trigger/src/ai-voice-trigger.cjs +35 -0
- package/dist/ai-voice-trigger/src/ai-voice-trigger.css +603 -0
- package/dist/ai-voice-trigger/src/ai-voice-trigger.d.ts +37 -0
- package/dist/ai-voice-trigger/src/ai-voice-trigger.d.vue.ts +29 -0
- package/dist/ai-voice-trigger/src/ai-voice-trigger.mjs +29 -0
- package/dist/ai-voice-trigger/src/ai-voice-trigger.vue +708 -0
- package/dist/ai-voice-trigger/src/ai-voice-trigger.vue.d.ts +29 -0
- package/dist/ai-welcome/__tests__/ai-welcome.ssr.test.cjs +57 -0
- package/dist/ai-welcome/__tests__/ai-welcome.ssr.test.d.ts +1 -0
- package/dist/ai-welcome/__tests__/ai-welcome.ssr.test.mjs +39 -0
- package/dist/ai-welcome/__tests__/ai-welcome.test.cjs +169 -0
- package/dist/ai-welcome/__tests__/ai-welcome.test.d.ts +1 -0
- package/dist/ai-welcome/__tests__/ai-welcome.test.mjs +113 -0
- package/dist/ai-welcome/index.cjs +26 -0
- package/dist/ai-welcome/index.d.ts +3 -0
- package/dist/ai-welcome/index.mjs +5 -0
- package/dist/ai-welcome/src/ai-welcome.cjs +56 -0
- package/dist/ai-welcome/src/ai-welcome.css +591 -0
- package/dist/ai-welcome/src/ai-welcome.d.ts +59 -0
- package/dist/ai-welcome/src/ai-welcome.d.vue.ts +51 -0
- package/dist/ai-welcome/src/ai-welcome.mjs +50 -0
- package/dist/ai-welcome/src/ai-welcome.vue +655 -0
- package/dist/ai-welcome/src/ai-welcome.vue.d.ts +51 -0
- package/dist/alert/src/alert.d.vue.ts +5 -5
- package/dist/alert/src/alert.vue.d.ts +5 -5
- package/dist/autocomplete/src/autocomplete.d.vue.ts +2 -2
- package/dist/autocomplete/src/autocomplete.vue.d.ts +2 -2
- package/dist/avatar/index.d.ts +39 -1
- package/dist/back-top/src/back-top.d.vue.ts +1 -1
- package/dist/back-top/src/back-top.vue.d.ts +1 -1
- package/dist/button/index.d.ts +3 -3
- package/dist/button/src/button.css +3 -3
- package/dist/button/src/button.d.vue.ts +1 -1
- package/dist/button/src/button.vue +3 -3
- package/dist/button/src/button.vue.d.ts +1 -1
- package/dist/calendar/src/calendar.d.vue.ts +2 -2
- package/dist/calendar/src/calendar.vue.d.ts +2 -2
- package/dist/cascader/src/cascader-panel.d.vue.ts +2 -2
- package/dist/cascader/src/cascader-panel.vue.d.ts +2 -2
- package/dist/checkbox/index.d.ts +3 -3
- package/dist/checkbox/src/checkbox-group.d.vue.ts +1 -1
- package/dist/checkbox/src/checkbox-group.vue +13 -1
- package/dist/checkbox/src/checkbox-group.vue.d.ts +1 -1
- package/dist/checkbox/src/checkbox.d.ts +12 -0
- package/dist/col/src/col.d.vue.ts +4 -4
- package/dist/col/src/col.vue.d.ts +4 -4
- package/dist/color-picker/src/color-picker.d.vue.ts +1 -1
- package/dist/color-picker/src/color-picker.vue.d.ts +1 -1
- package/dist/component.d.ts +63 -0
- package/dist/date-picker/src/date-picker.d.vue.ts +4 -4
- package/dist/date-picker/src/date-picker.vue.d.ts +4 -4
- package/dist/descriptions/src/description-item.d.vue.ts +1 -1
- package/dist/descriptions/src/description-item.vue.d.ts +1 -1
- package/dist/dialog/src/dialog.d.vue.ts +6 -6
- package/dist/dialog/src/dialog.vue.d.ts +6 -6
- package/dist/drawer/src/drawer.d.vue.ts +3 -3
- package/dist/drawer/src/drawer.vue.d.ts +3 -3
- package/dist/dropdown/src/dropdown-item.d.vue.ts +1 -1
- package/dist/dropdown/src/dropdown-item.vue.d.ts +1 -1
- package/dist/dropdown/src/dropdown.d.vue.ts +8 -8
- package/dist/dropdown/src/dropdown.vue.d.ts +8 -8
- package/dist/form/__tests__/form-schema.test.cjs +477 -24
- package/dist/form/__tests__/form-schema.test.mjs +277 -57
- package/dist/form/index.cjs +12 -0
- package/dist/form/index.d.ts +1 -2
- package/dist/form/index.mjs +1 -0
- package/dist/form/src/form-item.d.vue.ts +2 -1
- package/dist/form/src/form-item.vue +3 -1
- package/dist/form/src/form-item.vue.d.ts +2 -1
- package/dist/form/src/form-schema.cjs +2 -1
- package/dist/form/src/form-schema.d.ts +124 -19
- package/dist/form/src/form-schema.d.vue.ts +69 -19
- package/dist/form/src/form-schema.mjs +2 -1
- package/dist/form/src/form-schema.vue +522 -160
- package/dist/form/src/form-schema.vue.d.ts +69 -19
- package/dist/form/src/form.cjs +7 -0
- package/dist/form/src/form.d.ts +20 -0
- package/dist/form/src/form.d.vue.ts +10 -1
- package/dist/form/src/form.mjs +7 -0
- package/dist/form/src/form.vue +22 -10
- package/dist/form/src/form.vue.d.ts +10 -1
- package/dist/grid/src/grid.d.vue.ts +1 -1
- package/dist/grid/src/grid.vue.d.ts +1 -1
- package/dist/icon/src/icons/index.cjs +122 -2
- package/dist/icon/src/icons/index.d.ts +24 -0
- package/dist/icon/src/icons/index.mjs +145 -1
- package/dist/image/index.d.ts +356 -2
- package/dist/image/src/image-viewer.d.vue.ts +3 -3
- package/dist/image/src/image-viewer.vue.d.ts +3 -3
- package/dist/image/src/image.d.vue.ts +4 -4
- package/dist/image/src/image.vue.d.ts +4 -4
- package/dist/index.cjs +193 -1
- package/dist/index.d.ts +16 -0
- package/dist/index.mjs +49 -1
- package/dist/input/index.d.ts +18 -18
- package/dist/input/src/input.d.vue.ts +6 -6
- package/dist/input/src/input.vue.d.ts +6 -6
- package/dist/input-tag/src/input-tag.d.vue.ts +2 -2
- package/dist/input-tag/src/input-tag.vue.d.ts +2 -2
- package/dist/mention/src/mention.d.vue.ts +8 -8
- package/dist/mention/src/mention.vue.d.ts +8 -8
- package/dist/menu/src/menu.d.vue.ts +4 -4
- package/dist/menu/src/menu.vue.d.ts +4 -4
- package/dist/message/src/message.d.vue.ts +1 -1
- package/dist/message/src/message.vue.d.ts +1 -1
- package/dist/popconfirm/src/popconfirm.d.vue.ts +5 -5
- package/dist/popconfirm/src/popconfirm.vue.d.ts +5 -5
- package/dist/popover/src/popover.d.vue.ts +4 -4
- package/dist/popover/src/popover.vue.d.ts +4 -4
- package/dist/progress/src/progress.d.vue.ts +1 -1
- package/dist/progress/src/progress.vue.d.ts +1 -1
- package/dist/radio/src/radio-group.d.vue.ts +1 -1
- package/dist/radio/src/radio-group.vue +25 -4
- package/dist/radio/src/radio-group.vue.d.ts +1 -1
- package/dist/radio/src/radio.d.ts +12 -0
- package/dist/rate/src/rate.d.vue.ts +1 -1
- package/dist/rate/src/rate.vue.d.ts +1 -1
- package/dist/select/src/select.d.vue.ts +1 -1
- package/dist/select/src/select.vue.d.ts +1 -1
- package/dist/skeleton/src/skeleton.d.vue.ts +1 -1
- package/dist/skeleton/src/skeleton.vue.d.ts +1 -1
- package/dist/slider/src/slider.d.vue.ts +1 -1
- package/dist/slider/src/slider.vue.d.ts +1 -1
- package/dist/steps/src/step.d.vue.ts +1 -1
- package/dist/steps/src/step.vue.d.ts +1 -1
- package/dist/switch/src/switch.d.vue.ts +2 -2
- package/dist/switch/src/switch.vue.d.ts +2 -2
- package/dist/table/__tests__/table.perf.test.cjs +2 -2
- package/dist/table/__tests__/table.perf.test.mjs +2 -2
- package/dist/table/__tests__/table.test.cjs +18 -0
- package/dist/table/__tests__/table.test.mjs +18 -0
- package/dist/table/__tests__/use-table-import.test.cjs +6 -0
- package/dist/table/__tests__/use-table-import.test.mjs +8 -1
- package/dist/table/src/table-column.d.vue.ts +1 -1
- package/dist/table/src/table-column.vue.d.ts +1 -1
- package/dist/table/src/table.d.vue.ts +1 -1
- package/dist/table/src/table.vue.d.ts +1 -1
- package/dist/tabs/src/tab-pane.d.vue.ts +1 -1
- package/dist/tabs/src/tab-pane.vue.d.ts +1 -1
- package/dist/tabs/src/tabs.d.vue.ts +2 -2
- package/dist/tabs/src/tabs.vue.d.ts +2 -2
- package/dist/tooltip/index.d.ts +7 -7
- package/dist/tooltip/src/tooltip.d.vue.ts +7 -7
- package/dist/tooltip/src/tooltip.vue.d.ts +7 -7
- package/dist/tree/src/tree.d.vue.ts +1 -1
- package/dist/tree/src/tree.vue.d.ts +1 -1
- package/dist/tree-select/src/tree-select.d.vue.ts +3 -3
- package/dist/tree-select/src/tree-select.vue.d.ts +3 -3
- package/dist/upload/src/upload.d.vue.ts +1 -1
- package/dist/upload/src/upload.vue.d.ts +1 -1
- package/package.json +8 -5
|
@@ -0,0 +1,388 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _vitest = require("vitest");
|
|
4
|
+
var _testUtils = require("@vue/test-utils");
|
|
5
|
+
var _vue = require("vue");
|
|
6
|
+
var _aiSender = _interopRequireDefault(require("../src/ai-sender.vue"));
|
|
7
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
8
|
+
(0, _vitest.describe)("YhAiSender", () => {
|
|
9
|
+
(0, _vitest.it)("should render with base class", () => {
|
|
10
|
+
const wrapper = (0, _testUtils.mount)(_aiSender.default);
|
|
11
|
+
(0, _vitest.expect)(wrapper.find(".yh-ai-sender").exists()).toBe(true);
|
|
12
|
+
});
|
|
13
|
+
(0, _vitest.it)("should render textarea", () => {
|
|
14
|
+
const wrapper = (0, _testUtils.mount)(_aiSender.default);
|
|
15
|
+
(0, _vitest.expect)(wrapper.find("textarea").exists()).toBe(true);
|
|
16
|
+
});
|
|
17
|
+
(0, _vitest.it)("should render send button", () => {
|
|
18
|
+
const wrapper = (0, _testUtils.mount)(_aiSender.default);
|
|
19
|
+
(0, _vitest.expect)(wrapper.find(".yh-ai-sender__send-btn").exists()).toBe(true);
|
|
20
|
+
});
|
|
21
|
+
(0, _vitest.it)("should display modelValue in textarea", () => {
|
|
22
|
+
const wrapper = (0, _testUtils.mount)(_aiSender.default, {
|
|
23
|
+
props: {
|
|
24
|
+
modelValue: "hello"
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
(0, _vitest.expect)(wrapper.find("textarea").element.value).toBe("hello");
|
|
28
|
+
});
|
|
29
|
+
(0, _vitest.it)("should emit update:modelValue on input", async () => {
|
|
30
|
+
const wrapper = (0, _testUtils.mount)(_aiSender.default, {
|
|
31
|
+
props: {
|
|
32
|
+
modelValue: ""
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
await wrapper.find("textarea").setValue("new text");
|
|
36
|
+
const emitted = wrapper.emitted("update:modelValue");
|
|
37
|
+
(0, _vitest.expect)(emitted).toBeTruthy();
|
|
38
|
+
(0, _vitest.expect)(emitted[emitted.length - 1][0]).toBe("new text");
|
|
39
|
+
});
|
|
40
|
+
(0, _vitest.it)("should emit change on input", async () => {
|
|
41
|
+
const wrapper = (0, _testUtils.mount)(_aiSender.default, {
|
|
42
|
+
props: {
|
|
43
|
+
modelValue: ""
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
await wrapper.find("textarea").setValue("changed");
|
|
47
|
+
(0, _vitest.expect)(wrapper.emitted("change")).toBeTruthy();
|
|
48
|
+
});
|
|
49
|
+
(0, _vitest.it)("should apply is-disabled class when disabled=true", () => {
|
|
50
|
+
const wrapper = (0, _testUtils.mount)(_aiSender.default, {
|
|
51
|
+
props: {
|
|
52
|
+
disabled: true
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
(0, _vitest.expect)(wrapper.classes()).toContain("is-disabled");
|
|
56
|
+
});
|
|
57
|
+
(0, _vitest.it)("should disable textarea when disabled=true", () => {
|
|
58
|
+
const wrapper = (0, _testUtils.mount)(_aiSender.default, {
|
|
59
|
+
props: {
|
|
60
|
+
disabled: true
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
(0, _vitest.expect)(wrapper.find("textarea").element.disabled).toBe(true);
|
|
64
|
+
});
|
|
65
|
+
(0, _vitest.it)("should apply is-loading class when loading=true", () => {
|
|
66
|
+
const wrapper = (0, _testUtils.mount)(_aiSender.default, {
|
|
67
|
+
props: {
|
|
68
|
+
loading: true
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
(0, _vitest.expect)(wrapper.classes()).toContain("is-loading");
|
|
72
|
+
});
|
|
73
|
+
(0, _vitest.it)("should disable textarea when loading=true", () => {
|
|
74
|
+
const wrapper = (0, _testUtils.mount)(_aiSender.default, {
|
|
75
|
+
props: {
|
|
76
|
+
loading: true
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
(0, _vitest.expect)(wrapper.find("textarea").element.disabled).toBe(true);
|
|
80
|
+
});
|
|
81
|
+
(0, _vitest.it)("should emit send when button clicked with text", async () => {
|
|
82
|
+
const wrapper = (0, _testUtils.mount)(_aiSender.default, {
|
|
83
|
+
props: {
|
|
84
|
+
modelValue: "Hello"
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
await wrapper.find(".yh-ai-sender__send-btn").trigger("click");
|
|
88
|
+
(0, _vitest.expect)(wrapper.emitted("send")).toBeTruthy();
|
|
89
|
+
(0, _vitest.expect)(wrapper.emitted("send")[0][0]).toBe("Hello");
|
|
90
|
+
});
|
|
91
|
+
(0, _vitest.it)("should NOT emit send when textarea is empty", async () => {
|
|
92
|
+
const wrapper = (0, _testUtils.mount)(_aiSender.default, {
|
|
93
|
+
props: {
|
|
94
|
+
modelValue: ""
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
await wrapper.find(".yh-ai-sender__send-btn").trigger("click");
|
|
98
|
+
(0, _vitest.expect)(wrapper.emitted("send")).toBeFalsy();
|
|
99
|
+
});
|
|
100
|
+
(0, _vitest.it)("should NOT emit send when disabled", async () => {
|
|
101
|
+
const wrapper = (0, _testUtils.mount)(_aiSender.default, {
|
|
102
|
+
props: {
|
|
103
|
+
modelValue: "text",
|
|
104
|
+
disabled: true
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
await wrapper.find(".yh-ai-sender__send-btn").trigger("click");
|
|
108
|
+
(0, _vitest.expect)(wrapper.emitted("send")).toBeFalsy();
|
|
109
|
+
});
|
|
110
|
+
(0, _vitest.it)("should NOT emit send when loading", async () => {
|
|
111
|
+
const wrapper = (0, _testUtils.mount)(_aiSender.default, {
|
|
112
|
+
props: {
|
|
113
|
+
modelValue: "text",
|
|
114
|
+
loading: true
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
await wrapper.find(".yh-ai-sender__send-btn").trigger("click");
|
|
118
|
+
(0, _vitest.expect)(wrapper.emitted("send")).toBeFalsy();
|
|
119
|
+
});
|
|
120
|
+
(0, _vitest.it)("should emit send on Enter (without Shift)", async () => {
|
|
121
|
+
const wrapper = (0, _testUtils.mount)(_aiSender.default, {
|
|
122
|
+
props: {
|
|
123
|
+
modelValue: "Hello"
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
await wrapper.find("textarea").trigger("keydown", {
|
|
127
|
+
key: "Enter",
|
|
128
|
+
shiftKey: false
|
|
129
|
+
});
|
|
130
|
+
(0, _vitest.expect)(wrapper.emitted("send")).toBeTruthy();
|
|
131
|
+
});
|
|
132
|
+
(0, _vitest.it)("should NOT emit send on Shift+Enter", async () => {
|
|
133
|
+
const wrapper = (0, _testUtils.mount)(_aiSender.default, {
|
|
134
|
+
props: {
|
|
135
|
+
modelValue: "Hello"
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
await wrapper.find("textarea").trigger("keydown", {
|
|
139
|
+
key: "Enter",
|
|
140
|
+
shiftKey: true
|
|
141
|
+
});
|
|
142
|
+
(0, _vitest.expect)(wrapper.emitted("send")).toBeFalsy();
|
|
143
|
+
});
|
|
144
|
+
(0, _vitest.it)("should clear value after send", async () => {
|
|
145
|
+
const wrapper = (0, _testUtils.mount)(_aiSender.default, {
|
|
146
|
+
props: {
|
|
147
|
+
modelValue: "Hello"
|
|
148
|
+
}
|
|
149
|
+
});
|
|
150
|
+
await wrapper.find(".yh-ai-sender__send-btn").trigger("click");
|
|
151
|
+
await (0, _vue.nextTick)();
|
|
152
|
+
const emitted = wrapper.emitted("update:modelValue");
|
|
153
|
+
(0, _vitest.expect)(emitted[emitted.length - 1][0]).toBe("");
|
|
154
|
+
});
|
|
155
|
+
(0, _vitest.it)("should show clear button when clearable=true and has text", () => {
|
|
156
|
+
const wrapper = (0, _testUtils.mount)(_aiSender.default, {
|
|
157
|
+
props: {
|
|
158
|
+
modelValue: "text",
|
|
159
|
+
clearable: true
|
|
160
|
+
}
|
|
161
|
+
});
|
|
162
|
+
(0, _vitest.expect)(wrapper.find(".yh-ai-sender__clear-btn").exists()).toBe(true);
|
|
163
|
+
});
|
|
164
|
+
(0, _vitest.it)("should NOT show clear button when clearable=true but empty", () => {
|
|
165
|
+
const wrapper = (0, _testUtils.mount)(_aiSender.default, {
|
|
166
|
+
props: {
|
|
167
|
+
modelValue: "",
|
|
168
|
+
clearable: true
|
|
169
|
+
}
|
|
170
|
+
});
|
|
171
|
+
(0, _vitest.expect)(wrapper.find(".yh-ai-sender__clear-btn").exists()).toBe(false);
|
|
172
|
+
});
|
|
173
|
+
(0, _vitest.it)("should emit clear when clear button clicked", async () => {
|
|
174
|
+
const wrapper = (0, _testUtils.mount)(_aiSender.default, {
|
|
175
|
+
props: {
|
|
176
|
+
modelValue: "text",
|
|
177
|
+
clearable: true
|
|
178
|
+
}
|
|
179
|
+
});
|
|
180
|
+
await wrapper.find(".yh-ai-sender__clear-btn").trigger("click");
|
|
181
|
+
(0, _vitest.expect)(wrapper.emitted("clear")).toBeTruthy();
|
|
182
|
+
});
|
|
183
|
+
(0, _vitest.it)("should show word limit when showWordLimit=true and maxLength set", () => {
|
|
184
|
+
const wrapper = (0, _testUtils.mount)(_aiSender.default, {
|
|
185
|
+
props: {
|
|
186
|
+
modelValue: "hi",
|
|
187
|
+
showWordLimit: true,
|
|
188
|
+
maxLength: 100
|
|
189
|
+
}
|
|
190
|
+
});
|
|
191
|
+
(0, _vitest.expect)(wrapper.find(".yh-ai-sender__word-limit").exists()).toBe(true);
|
|
192
|
+
(0, _vitest.expect)(wrapper.find(".yh-ai-sender__word-limit").text()).toContain("100");
|
|
193
|
+
});
|
|
194
|
+
(0, _vitest.it)("should apply is-focused on textarea focus", async () => {
|
|
195
|
+
const wrapper = (0, _testUtils.mount)(_aiSender.default);
|
|
196
|
+
await wrapper.find("textarea").trigger("focus");
|
|
197
|
+
(0, _vitest.expect)(wrapper.classes()).toContain("is-focused");
|
|
198
|
+
});
|
|
199
|
+
(0, _vitest.it)("should remove is-focused on textarea blur", async () => {
|
|
200
|
+
const wrapper = (0, _testUtils.mount)(_aiSender.default);
|
|
201
|
+
await wrapper.find("textarea").trigger("focus");
|
|
202
|
+
await wrapper.find("textarea").trigger("blur");
|
|
203
|
+
(0, _vitest.expect)(wrapper.classes()).not.toContain("is-focused");
|
|
204
|
+
});
|
|
205
|
+
(0, _vitest.it)("should render prefix slot", () => {
|
|
206
|
+
const wrapper = (0, _testUtils.mount)(_aiSender.default, {
|
|
207
|
+
slots: {
|
|
208
|
+
prefix: '<div class="custom-prefix">P</div>'
|
|
209
|
+
}
|
|
210
|
+
});
|
|
211
|
+
(0, _vitest.expect)(wrapper.find(".custom-prefix").exists()).toBe(true);
|
|
212
|
+
});
|
|
213
|
+
(0, _vitest.it)("should render actions slot", () => {
|
|
214
|
+
const wrapper = (0, _testUtils.mount)(_aiSender.default, {
|
|
215
|
+
slots: {
|
|
216
|
+
actions: '<button class="custom-action">Extra</button>'
|
|
217
|
+
}
|
|
218
|
+
});
|
|
219
|
+
(0, _vitest.expect)(wrapper.find(".custom-action").exists()).toBe(true);
|
|
220
|
+
});
|
|
221
|
+
(0, _vitest.it)("should render submit slot overriding default send button", () => {
|
|
222
|
+
const wrapper = (0, _testUtils.mount)(_aiSender.default, {
|
|
223
|
+
slots: {
|
|
224
|
+
submit: '<button class="custom-submit">Go</button>'
|
|
225
|
+
}
|
|
226
|
+
});
|
|
227
|
+
(0, _vitest.expect)(wrapper.find(".custom-submit").exists()).toBe(true);
|
|
228
|
+
});
|
|
229
|
+
(0, _vitest.it)("should update when modelValue prop changes", async () => {
|
|
230
|
+
const wrapper = (0, _testUtils.mount)(_aiSender.default, {
|
|
231
|
+
props: {
|
|
232
|
+
modelValue: "old"
|
|
233
|
+
}
|
|
234
|
+
});
|
|
235
|
+
await wrapper.setProps({
|
|
236
|
+
modelValue: "new text"
|
|
237
|
+
});
|
|
238
|
+
await (0, _vue.nextTick)();
|
|
239
|
+
(0, _vitest.expect)(wrapper.find("textarea").element.value).toBe("new text");
|
|
240
|
+
});
|
|
241
|
+
(0, _vitest.describe)("Slash Commands", () => {
|
|
242
|
+
const commands = [{
|
|
243
|
+
key: "help",
|
|
244
|
+
label: "Help"
|
|
245
|
+
}, {
|
|
246
|
+
key: "settings",
|
|
247
|
+
label: "Settings",
|
|
248
|
+
prompt: "Show Settings "
|
|
249
|
+
}];
|
|
250
|
+
(0, _vitest.it)("should show slash commands panel when triggering /", async () => {
|
|
251
|
+
const wrapper = (0, _testUtils.mount)(_aiSender.default, {
|
|
252
|
+
props: {
|
|
253
|
+
commands
|
|
254
|
+
}
|
|
255
|
+
});
|
|
256
|
+
const textarea = wrapper.find("textarea");
|
|
257
|
+
await textarea.setValue("/h");
|
|
258
|
+
textarea.element.selectionStart = 2;
|
|
259
|
+
await textarea.trigger("input");
|
|
260
|
+
(0, _vitest.expect)(wrapper.find(".yh-ai-sender__command-panel").exists()).toBe(true);
|
|
261
|
+
(0, _vitest.expect)(wrapper.findAll(".yh-ai-sender__command-item").length).toBe(1);
|
|
262
|
+
});
|
|
263
|
+
(0, _vitest.it)("should navigate and select command with keyboard", async () => {
|
|
264
|
+
const wrapper = (0, _testUtils.mount)(_aiSender.default, {
|
|
265
|
+
props: {
|
|
266
|
+
commands
|
|
267
|
+
}
|
|
268
|
+
});
|
|
269
|
+
const textarea = wrapper.find("textarea");
|
|
270
|
+
await textarea.setValue("/");
|
|
271
|
+
textarea.element.selectionStart = 1;
|
|
272
|
+
await textarea.trigger("input");
|
|
273
|
+
(0, _vitest.expect)(wrapper.find(".yh-ai-sender__command-panel").exists()).toBe(true);
|
|
274
|
+
await textarea.trigger("keydown", {
|
|
275
|
+
key: "ArrowDown"
|
|
276
|
+
});
|
|
277
|
+
await textarea.trigger("keydown", {
|
|
278
|
+
key: "ArrowUp"
|
|
279
|
+
});
|
|
280
|
+
await textarea.trigger("keydown", {
|
|
281
|
+
key: "Enter"
|
|
282
|
+
});
|
|
283
|
+
(0, _vitest.expect)(wrapper.emitted("command")[0][0]).toEqual(commands[0]);
|
|
284
|
+
(0, _vitest.expect)(textarea.element.value).toBe("/help ");
|
|
285
|
+
});
|
|
286
|
+
(0, _vitest.it)("should select command via mouse click", async () => {
|
|
287
|
+
const wrapper = (0, _testUtils.mount)(_aiSender.default, {
|
|
288
|
+
props: {
|
|
289
|
+
commands
|
|
290
|
+
}
|
|
291
|
+
});
|
|
292
|
+
const textarea = wrapper.find("textarea");
|
|
293
|
+
await textarea.setValue("/");
|
|
294
|
+
textarea.element.selectionStart = 1;
|
|
295
|
+
await textarea.trigger("input");
|
|
296
|
+
await wrapper.find(".yh-ai-sender__command-item").trigger("click");
|
|
297
|
+
(0, _vitest.expect)(wrapper.emitted("command")).toBeTruthy();
|
|
298
|
+
});
|
|
299
|
+
(0, _vitest.it)("should hide commands on Escape", async () => {
|
|
300
|
+
const wrapper = (0, _testUtils.mount)(_aiSender.default, {
|
|
301
|
+
props: {
|
|
302
|
+
commands
|
|
303
|
+
}
|
|
304
|
+
});
|
|
305
|
+
const textarea = wrapper.find("textarea");
|
|
306
|
+
await textarea.setValue("/");
|
|
307
|
+
textarea.element.selectionStart = 1;
|
|
308
|
+
await textarea.trigger("input");
|
|
309
|
+
await textarea.trigger("keydown", {
|
|
310
|
+
key: "Escape"
|
|
311
|
+
});
|
|
312
|
+
(0, _vitest.expect)(wrapper.find(".yh-ai-sender__command-panel").exists()).toBe(false);
|
|
313
|
+
});
|
|
314
|
+
(0, _vitest.it)("should hide commands on blur after delay", async () => {
|
|
315
|
+
_vitest.vi.useFakeTimers();
|
|
316
|
+
const wrapper = (0, _testUtils.mount)(_aiSender.default, {
|
|
317
|
+
props: {
|
|
318
|
+
commands
|
|
319
|
+
}
|
|
320
|
+
});
|
|
321
|
+
const textarea = wrapper.find("textarea");
|
|
322
|
+
await textarea.setValue("/");
|
|
323
|
+
textarea.element.selectionStart = 1;
|
|
324
|
+
await textarea.trigger("input");
|
|
325
|
+
await textarea.trigger("blur");
|
|
326
|
+
_vitest.vi.advanceTimersByTime(250);
|
|
327
|
+
await (0, _vue.nextTick)();
|
|
328
|
+
(0, _vitest.expect)(wrapper.find(".yh-ai-sender__command-panel").exists()).toBe(false);
|
|
329
|
+
_vitest.vi.useRealTimers();
|
|
330
|
+
});
|
|
331
|
+
});
|
|
332
|
+
(0, _vitest.describe)("Attachments", () => {
|
|
333
|
+
(0, _vitest.it)("should render attachments and emit remove event", async () => {
|
|
334
|
+
const attachments = [{
|
|
335
|
+
id: "1",
|
|
336
|
+
name: "img.png",
|
|
337
|
+
type: "image/png",
|
|
338
|
+
url: "img.png"
|
|
339
|
+
}, {
|
|
340
|
+
id: "2",
|
|
341
|
+
name: "doc.pdf",
|
|
342
|
+
type: "application/pdf",
|
|
343
|
+
url: "doc.pdf",
|
|
344
|
+
status: "uploading",
|
|
345
|
+
progress: 50
|
|
346
|
+
}];
|
|
347
|
+
const wrapper = (0, _testUtils.mount)(_aiSender.default, {
|
|
348
|
+
props: {
|
|
349
|
+
attachments
|
|
350
|
+
}
|
|
351
|
+
});
|
|
352
|
+
const items = wrapper.findAll(".yh-ai-sender__attachment-item");
|
|
353
|
+
(0, _vitest.expect)(items.length).toBe(2);
|
|
354
|
+
(0, _vitest.expect)(wrapper.find(".yh-ai-sender__progress-bar").exists()).toBe(true);
|
|
355
|
+
await wrapper.find(".yh-ai-sender__attachment-remove").trigger("click");
|
|
356
|
+
(0, _vitest.expect)(wrapper.emitted("remove-attachment")[0][0]).toEqual(attachments[0]);
|
|
357
|
+
});
|
|
358
|
+
});
|
|
359
|
+
(0, _vitest.describe)("aiSenderEmits", () => {
|
|
360
|
+
(0, _vitest.it)("should validate send event", async () => {
|
|
361
|
+
const {
|
|
362
|
+
aiSenderEmits
|
|
363
|
+
} = await Promise.resolve().then(() => require("../src/ai-sender.cjs"));
|
|
364
|
+
(0, _vitest.expect)(aiSenderEmits.send("hello")).toBe(true);
|
|
365
|
+
(0, _vitest.expect)(aiSenderEmits.send("")).toBe(true);
|
|
366
|
+
});
|
|
367
|
+
(0, _vitest.it)("should pass-through other event validators", async () => {
|
|
368
|
+
const {
|
|
369
|
+
aiSenderEmits
|
|
370
|
+
} = await Promise.resolve().then(() => require("../src/ai-sender.cjs"));
|
|
371
|
+
(0, _vitest.expect)(aiSenderEmits["update:modelValue"]("text")).toBe(true);
|
|
372
|
+
(0, _vitest.expect)(aiSenderEmits.change("text")).toBe(true);
|
|
373
|
+
(0, _vitest.expect)(aiSenderEmits.command({
|
|
374
|
+
key: "a",
|
|
375
|
+
label: "b"
|
|
376
|
+
})).toBe(true);
|
|
377
|
+
(0, _vitest.expect)(aiSenderEmits.blur(new FocusEvent("blur"))).toBe(true);
|
|
378
|
+
(0, _vitest.expect)(aiSenderEmits.focus(new FocusEvent("focus"))).toBe(true);
|
|
379
|
+
(0, _vitest.expect)(aiSenderEmits.clear()).toBe(true);
|
|
380
|
+
(0, _vitest.expect)(aiSenderEmits["remove-attachment"]({
|
|
381
|
+
id: "1",
|
|
382
|
+
name: "f",
|
|
383
|
+
type: "doc",
|
|
384
|
+
url: "doc"
|
|
385
|
+
})).toBe(true);
|
|
386
|
+
});
|
|
387
|
+
});
|
|
388
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
import { describe, it, expect, vi } from "vitest";
|
|
2
|
+
import { mount } from "@vue/test-utils";
|
|
3
|
+
import { nextTick } from "vue";
|
|
4
|
+
import AiSender from "../src/ai-sender.vue";
|
|
5
|
+
describe("YhAiSender", () => {
|
|
6
|
+
it("should render with base class", () => {
|
|
7
|
+
const wrapper = mount(AiSender);
|
|
8
|
+
expect(wrapper.find(".yh-ai-sender").exists()).toBe(true);
|
|
9
|
+
});
|
|
10
|
+
it("should render textarea", () => {
|
|
11
|
+
const wrapper = mount(AiSender);
|
|
12
|
+
expect(wrapper.find("textarea").exists()).toBe(true);
|
|
13
|
+
});
|
|
14
|
+
it("should render send button", () => {
|
|
15
|
+
const wrapper = mount(AiSender);
|
|
16
|
+
expect(wrapper.find(".yh-ai-sender__send-btn").exists()).toBe(true);
|
|
17
|
+
});
|
|
18
|
+
it("should display modelValue in textarea", () => {
|
|
19
|
+
const wrapper = mount(AiSender, { props: { modelValue: "hello" } });
|
|
20
|
+
expect(wrapper.find("textarea").element.value).toBe("hello");
|
|
21
|
+
});
|
|
22
|
+
it("should emit update:modelValue on input", async () => {
|
|
23
|
+
const wrapper = mount(AiSender, { props: { modelValue: "" } });
|
|
24
|
+
await wrapper.find("textarea").setValue("new text");
|
|
25
|
+
const emitted = wrapper.emitted("update:modelValue");
|
|
26
|
+
expect(emitted).toBeTruthy();
|
|
27
|
+
expect(emitted[emitted.length - 1][0]).toBe("new text");
|
|
28
|
+
});
|
|
29
|
+
it("should emit change on input", async () => {
|
|
30
|
+
const wrapper = mount(AiSender, { props: { modelValue: "" } });
|
|
31
|
+
await wrapper.find("textarea").setValue("changed");
|
|
32
|
+
expect(wrapper.emitted("change")).toBeTruthy();
|
|
33
|
+
});
|
|
34
|
+
it("should apply is-disabled class when disabled=true", () => {
|
|
35
|
+
const wrapper = mount(AiSender, { props: { disabled: true } });
|
|
36
|
+
expect(wrapper.classes()).toContain("is-disabled");
|
|
37
|
+
});
|
|
38
|
+
it("should disable textarea when disabled=true", () => {
|
|
39
|
+
const wrapper = mount(AiSender, { props: { disabled: true } });
|
|
40
|
+
expect(wrapper.find("textarea").element.disabled).toBe(true);
|
|
41
|
+
});
|
|
42
|
+
it("should apply is-loading class when loading=true", () => {
|
|
43
|
+
const wrapper = mount(AiSender, { props: { loading: true } });
|
|
44
|
+
expect(wrapper.classes()).toContain("is-loading");
|
|
45
|
+
});
|
|
46
|
+
it("should disable textarea when loading=true", () => {
|
|
47
|
+
const wrapper = mount(AiSender, { props: { loading: true } });
|
|
48
|
+
expect(wrapper.find("textarea").element.disabled).toBe(true);
|
|
49
|
+
});
|
|
50
|
+
it("should emit send when button clicked with text", async () => {
|
|
51
|
+
const wrapper = mount(AiSender, { props: { modelValue: "Hello" } });
|
|
52
|
+
await wrapper.find(".yh-ai-sender__send-btn").trigger("click");
|
|
53
|
+
expect(wrapper.emitted("send")).toBeTruthy();
|
|
54
|
+
expect(wrapper.emitted("send")[0][0]).toBe("Hello");
|
|
55
|
+
});
|
|
56
|
+
it("should NOT emit send when textarea is empty", async () => {
|
|
57
|
+
const wrapper = mount(AiSender, { props: { modelValue: "" } });
|
|
58
|
+
await wrapper.find(".yh-ai-sender__send-btn").trigger("click");
|
|
59
|
+
expect(wrapper.emitted("send")).toBeFalsy();
|
|
60
|
+
});
|
|
61
|
+
it("should NOT emit send when disabled", async () => {
|
|
62
|
+
const wrapper = mount(AiSender, { props: { modelValue: "text", disabled: true } });
|
|
63
|
+
await wrapper.find(".yh-ai-sender__send-btn").trigger("click");
|
|
64
|
+
expect(wrapper.emitted("send")).toBeFalsy();
|
|
65
|
+
});
|
|
66
|
+
it("should NOT emit send when loading", async () => {
|
|
67
|
+
const wrapper = mount(AiSender, { props: { modelValue: "text", loading: true } });
|
|
68
|
+
await wrapper.find(".yh-ai-sender__send-btn").trigger("click");
|
|
69
|
+
expect(wrapper.emitted("send")).toBeFalsy();
|
|
70
|
+
});
|
|
71
|
+
it("should emit send on Enter (without Shift)", async () => {
|
|
72
|
+
const wrapper = mount(AiSender, { props: { modelValue: "Hello" } });
|
|
73
|
+
await wrapper.find("textarea").trigger("keydown", { key: "Enter", shiftKey: false });
|
|
74
|
+
expect(wrapper.emitted("send")).toBeTruthy();
|
|
75
|
+
});
|
|
76
|
+
it("should NOT emit send on Shift+Enter", async () => {
|
|
77
|
+
const wrapper = mount(AiSender, { props: { modelValue: "Hello" } });
|
|
78
|
+
await wrapper.find("textarea").trigger("keydown", { key: "Enter", shiftKey: true });
|
|
79
|
+
expect(wrapper.emitted("send")).toBeFalsy();
|
|
80
|
+
});
|
|
81
|
+
it("should clear value after send", async () => {
|
|
82
|
+
const wrapper = mount(AiSender, { props: { modelValue: "Hello" } });
|
|
83
|
+
await wrapper.find(".yh-ai-sender__send-btn").trigger("click");
|
|
84
|
+
await nextTick();
|
|
85
|
+
const emitted = wrapper.emitted("update:modelValue");
|
|
86
|
+
expect(emitted[emitted.length - 1][0]).toBe("");
|
|
87
|
+
});
|
|
88
|
+
it("should show clear button when clearable=true and has text", () => {
|
|
89
|
+
const wrapper = mount(AiSender, {
|
|
90
|
+
props: { modelValue: "text", clearable: true }
|
|
91
|
+
});
|
|
92
|
+
expect(wrapper.find(".yh-ai-sender__clear-btn").exists()).toBe(true);
|
|
93
|
+
});
|
|
94
|
+
it("should NOT show clear button when clearable=true but empty", () => {
|
|
95
|
+
const wrapper = mount(AiSender, {
|
|
96
|
+
props: { modelValue: "", clearable: true }
|
|
97
|
+
});
|
|
98
|
+
expect(wrapper.find(".yh-ai-sender__clear-btn").exists()).toBe(false);
|
|
99
|
+
});
|
|
100
|
+
it("should emit clear when clear button clicked", async () => {
|
|
101
|
+
const wrapper = mount(AiSender, {
|
|
102
|
+
props: { modelValue: "text", clearable: true }
|
|
103
|
+
});
|
|
104
|
+
await wrapper.find(".yh-ai-sender__clear-btn").trigger("click");
|
|
105
|
+
expect(wrapper.emitted("clear")).toBeTruthy();
|
|
106
|
+
});
|
|
107
|
+
it("should show word limit when showWordLimit=true and maxLength set", () => {
|
|
108
|
+
const wrapper = mount(AiSender, {
|
|
109
|
+
props: { modelValue: "hi", showWordLimit: true, maxLength: 100 }
|
|
110
|
+
});
|
|
111
|
+
expect(wrapper.find(".yh-ai-sender__word-limit").exists()).toBe(true);
|
|
112
|
+
expect(wrapper.find(".yh-ai-sender__word-limit").text()).toContain("100");
|
|
113
|
+
});
|
|
114
|
+
it("should apply is-focused on textarea focus", async () => {
|
|
115
|
+
const wrapper = mount(AiSender);
|
|
116
|
+
await wrapper.find("textarea").trigger("focus");
|
|
117
|
+
expect(wrapper.classes()).toContain("is-focused");
|
|
118
|
+
});
|
|
119
|
+
it("should remove is-focused on textarea blur", async () => {
|
|
120
|
+
const wrapper = mount(AiSender);
|
|
121
|
+
await wrapper.find("textarea").trigger("focus");
|
|
122
|
+
await wrapper.find("textarea").trigger("blur");
|
|
123
|
+
expect(wrapper.classes()).not.toContain("is-focused");
|
|
124
|
+
});
|
|
125
|
+
it("should render prefix slot", () => {
|
|
126
|
+
const wrapper = mount(AiSender, {
|
|
127
|
+
slots: { prefix: '<div class="custom-prefix">P</div>' }
|
|
128
|
+
});
|
|
129
|
+
expect(wrapper.find(".custom-prefix").exists()).toBe(true);
|
|
130
|
+
});
|
|
131
|
+
it("should render actions slot", () => {
|
|
132
|
+
const wrapper = mount(AiSender, {
|
|
133
|
+
slots: { actions: '<button class="custom-action">Extra</button>' }
|
|
134
|
+
});
|
|
135
|
+
expect(wrapper.find(".custom-action").exists()).toBe(true);
|
|
136
|
+
});
|
|
137
|
+
it("should render submit slot overriding default send button", () => {
|
|
138
|
+
const wrapper = mount(AiSender, {
|
|
139
|
+
slots: { submit: '<button class="custom-submit">Go</button>' }
|
|
140
|
+
});
|
|
141
|
+
expect(wrapper.find(".custom-submit").exists()).toBe(true);
|
|
142
|
+
});
|
|
143
|
+
it("should update when modelValue prop changes", async () => {
|
|
144
|
+
const wrapper = mount(AiSender, { props: { modelValue: "old" } });
|
|
145
|
+
await wrapper.setProps({ modelValue: "new text" });
|
|
146
|
+
await nextTick();
|
|
147
|
+
expect(wrapper.find("textarea").element.value).toBe("new text");
|
|
148
|
+
});
|
|
149
|
+
describe("Slash Commands", () => {
|
|
150
|
+
const commands = [
|
|
151
|
+
{ key: "help", label: "Help" },
|
|
152
|
+
{ key: "settings", label: "Settings", prompt: "Show Settings " }
|
|
153
|
+
];
|
|
154
|
+
it("should show slash commands panel when triggering /", async () => {
|
|
155
|
+
const wrapper = mount(AiSender, { props: { commands } });
|
|
156
|
+
const textarea = wrapper.find("textarea");
|
|
157
|
+
await textarea.setValue("/h");
|
|
158
|
+
textarea.element.selectionStart = 2;
|
|
159
|
+
await textarea.trigger("input");
|
|
160
|
+
expect(wrapper.find(".yh-ai-sender__command-panel").exists()).toBe(true);
|
|
161
|
+
expect(wrapper.findAll(".yh-ai-sender__command-item").length).toBe(1);
|
|
162
|
+
});
|
|
163
|
+
it("should navigate and select command with keyboard", async () => {
|
|
164
|
+
const wrapper = mount(AiSender, { props: { commands } });
|
|
165
|
+
const textarea = wrapper.find("textarea");
|
|
166
|
+
await textarea.setValue("/");
|
|
167
|
+
textarea.element.selectionStart = 1;
|
|
168
|
+
await textarea.trigger("input");
|
|
169
|
+
expect(wrapper.find(".yh-ai-sender__command-panel").exists()).toBe(true);
|
|
170
|
+
await textarea.trigger("keydown", { key: "ArrowDown" });
|
|
171
|
+
await textarea.trigger("keydown", { key: "ArrowUp" });
|
|
172
|
+
await textarea.trigger("keydown", { key: "Enter" });
|
|
173
|
+
expect(wrapper.emitted("command")[0][0]).toEqual(commands[0]);
|
|
174
|
+
expect(textarea.element.value).toBe("/help ");
|
|
175
|
+
});
|
|
176
|
+
it("should select command via mouse click", async () => {
|
|
177
|
+
const wrapper = mount(AiSender, { props: { commands } });
|
|
178
|
+
const textarea = wrapper.find("textarea");
|
|
179
|
+
await textarea.setValue("/");
|
|
180
|
+
textarea.element.selectionStart = 1;
|
|
181
|
+
await textarea.trigger("input");
|
|
182
|
+
await wrapper.find(".yh-ai-sender__command-item").trigger("click");
|
|
183
|
+
expect(wrapper.emitted("command")).toBeTruthy();
|
|
184
|
+
});
|
|
185
|
+
it("should hide commands on Escape", async () => {
|
|
186
|
+
const wrapper = mount(AiSender, { props: { commands } });
|
|
187
|
+
const textarea = wrapper.find("textarea");
|
|
188
|
+
await textarea.setValue("/");
|
|
189
|
+
textarea.element.selectionStart = 1;
|
|
190
|
+
await textarea.trigger("input");
|
|
191
|
+
await textarea.trigger("keydown", { key: "Escape" });
|
|
192
|
+
expect(wrapper.find(".yh-ai-sender__command-panel").exists()).toBe(false);
|
|
193
|
+
});
|
|
194
|
+
it("should hide commands on blur after delay", async () => {
|
|
195
|
+
vi.useFakeTimers();
|
|
196
|
+
const wrapper = mount(AiSender, { props: { commands } });
|
|
197
|
+
const textarea = wrapper.find("textarea");
|
|
198
|
+
await textarea.setValue("/");
|
|
199
|
+
textarea.element.selectionStart = 1;
|
|
200
|
+
await textarea.trigger("input");
|
|
201
|
+
await textarea.trigger("blur");
|
|
202
|
+
vi.advanceTimersByTime(250);
|
|
203
|
+
await nextTick();
|
|
204
|
+
expect(wrapper.find(".yh-ai-sender__command-panel").exists()).toBe(false);
|
|
205
|
+
vi.useRealTimers();
|
|
206
|
+
});
|
|
207
|
+
});
|
|
208
|
+
describe("Attachments", () => {
|
|
209
|
+
it("should render attachments and emit remove event", async () => {
|
|
210
|
+
const attachments = [
|
|
211
|
+
{ id: "1", name: "img.png", type: "image/png", url: "img.png" },
|
|
212
|
+
{
|
|
213
|
+
id: "2",
|
|
214
|
+
name: "doc.pdf",
|
|
215
|
+
type: "application/pdf",
|
|
216
|
+
url: "doc.pdf",
|
|
217
|
+
status: "uploading",
|
|
218
|
+
progress: 50
|
|
219
|
+
}
|
|
220
|
+
];
|
|
221
|
+
const wrapper = mount(AiSender, { props: { attachments } });
|
|
222
|
+
const items = wrapper.findAll(".yh-ai-sender__attachment-item");
|
|
223
|
+
expect(items.length).toBe(2);
|
|
224
|
+
expect(wrapper.find(".yh-ai-sender__progress-bar").exists()).toBe(true);
|
|
225
|
+
await wrapper.find(".yh-ai-sender__attachment-remove").trigger("click");
|
|
226
|
+
expect(wrapper.emitted("remove-attachment")[0][0]).toEqual(attachments[0]);
|
|
227
|
+
});
|
|
228
|
+
});
|
|
229
|
+
describe("aiSenderEmits", () => {
|
|
230
|
+
it("should validate send event", async () => {
|
|
231
|
+
const { aiSenderEmits } = await import("../src/ai-sender.mjs");
|
|
232
|
+
expect(aiSenderEmits.send("hello")).toBe(true);
|
|
233
|
+
expect(aiSenderEmits.send("")).toBe(true);
|
|
234
|
+
});
|
|
235
|
+
it("should pass-through other event validators", async () => {
|
|
236
|
+
const { aiSenderEmits } = await import("../src/ai-sender.mjs");
|
|
237
|
+
expect(aiSenderEmits["update:modelValue"]("text")).toBe(true);
|
|
238
|
+
expect(aiSenderEmits.change("text")).toBe(true);
|
|
239
|
+
expect(aiSenderEmits.command({ key: "a", label: "b" })).toBe(true);
|
|
240
|
+
expect(aiSenderEmits.blur(new FocusEvent("blur"))).toBe(true);
|
|
241
|
+
expect(aiSenderEmits.focus(new FocusEvent("focus"))).toBe(true);
|
|
242
|
+
expect(aiSenderEmits.clear()).toBe(true);
|
|
243
|
+
expect(
|
|
244
|
+
aiSenderEmits["remove-attachment"]({ id: "1", name: "f", type: "doc", url: "doc" })
|
|
245
|
+
).toBe(true);
|
|
246
|
+
});
|
|
247
|
+
});
|
|
248
|
+
});
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
var _exportNames = {
|
|
7
|
+
YhAiSender: true
|
|
8
|
+
};
|
|
9
|
+
module.exports = exports.YhAiSender = void 0;
|
|
10
|
+
var _utils = require("@yh-ui/utils");
|
|
11
|
+
var _aiSender = _interopRequireDefault(require("./src/ai-sender.vue"));
|
|
12
|
+
var _aiSender2 = require("./src/ai-sender.cjs");
|
|
13
|
+
Object.keys(_aiSender2).forEach(function (key) {
|
|
14
|
+
if (key === "default" || key === "__esModule") return;
|
|
15
|
+
if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
|
|
16
|
+
if (key in exports && exports[key] === _aiSender2[key]) return;
|
|
17
|
+
Object.defineProperty(exports, key, {
|
|
18
|
+
enumerable: true,
|
|
19
|
+
get: function () {
|
|
20
|
+
return _aiSender2[key];
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
});
|
|
24
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
25
|
+
const YhAiSender = exports.YhAiSender = (0, _utils.withInstall)(_aiSender.default);
|
|
26
|
+
module.exports = YhAiSender;
|