@kitn.ai/ui 0.26.0 → 0.27.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +16 -5
- package/bin/mcp.js +16 -3
- package/bin/route.js +23 -0
- package/bin/route.test.js +58 -0
- package/dist/{elements/chunks/Icon--Y8vsFal.js → Icon-BnFKqqtY.js} +1 -1
- package/dist/action-icons-CBskfBMz.js +1 -0
- package/dist/arrow-down-Br0qtpsz.js +1 -0
- package/dist/arrow-left-Dj7xgE12.js +1 -0
- package/dist/artifact-CvXEm1lS.js +1 -0
- package/dist/assets/dev-5XzXYR21.js +91 -0
- package/dist/attachments-C43ZegEq.js +1 -0
- package/dist/{elements/chunks/audio-visualizer-D7lB6mvR.js → audio-visualizer-B-79y1Tj.js} +1 -1
- package/dist/badge-BpUbq8c0.js +1 -0
- package/dist/bash-InADTalH.js +1 -6
- package/dist/bell-sn17Ip9v.js +1 -0
- package/dist/{elements/chunks/button-flUbeufF.js → button-BH6rN0U-.js} +1 -1
- package/dist/card-renderer-Cb1gQmth.js +1 -0
- package/dist/card-routing-DifQgS7n.js +1 -0
- package/dist/check-DPeeMUYx.js +1 -0
- package/dist/checkbox-Dc9Yov_B.js +1 -0
- package/dist/checkbox-group-B1kDLLYk.js +1 -0
- package/dist/chevron-down-CHSWk7ZT.js +1 -0
- package/dist/chevron-right-B7l_fMgx.js +1 -0
- package/dist/choice-card-BT3c1S8g.js +1 -0
- package/dist/circle-Bb0yOpqM.js +1 -0
- package/dist/circle-check-BGZpCiz7.js +1 -0
- package/dist/circle-x-wobWkoSx.js +1 -0
- package/dist/{elements/chunks/cn-CU7UAWzk.js → cn-DN5AWfiS.js} +1 -1
- package/dist/{elements/chunks/code-block-BdLiTitd.js → code-block-CUQ5mtv0.js} +1 -1
- package/dist/{elements/chunks/collapsible-BzbXpPzr.js → collapsible-CPJbf6FM.js} +1 -1
- package/dist/components/attachment-types.d.ts +7 -0
- package/dist/components/audio-visualizer/fit-scale.d.ts +1 -1
- package/dist/components/card-renderer.d.ts +13 -0
- package/dist/components/card.d.ts +4 -0
- package/dist/components/chat-thread.d.ts +46 -1
- package/dist/components/conversation-item.d.ts +19 -7
- package/dist/components/conversation-list.d.ts +17 -5
- package/dist/components/form-widgets.d.ts +67 -2
- package/dist/components/form.d.ts +48 -1
- package/dist/components/message.d.ts +25 -3
- package/dist/components/reasoning.d.ts +6 -0
- package/dist/components/scroll-button.d.ts +11 -0
- package/dist/components/thread.d.ts +5 -0
- package/dist/components/tool-types.d.ts +9 -0
- package/dist/composer-CjngLzal.js +106 -0
- package/dist/confirm-card-DCx_A4bU.js +1 -0
- package/dist/construct-cli.es.js +1169 -0
- package/dist/{elements/chunks/context-VLIL3sJ-.js → context-BY8V-Nlp.js} +1 -1
- package/dist/controllable-D43BKmtX.js +1 -0
- package/dist/conversation-list-D4lLU_yS.js +1 -0
- package/dist/copy-B6DO4PqB.js +1 -0
- package/dist/core-AYMC6_lb.js +12 -5874
- package/dist/{create-tween-CQED4T0g.js → create-tween-BPzaefTp.js} +1 -1
- package/dist/{create-tween-BFT6c-Y8.js → create-tween-CnMHviKB.js} +1 -1
- package/dist/{create-tween-CJNlzoaO.js → create-tween-D1aiGZZh.js} +1 -1
- package/dist/{elements/chunks/create-tween-c4Z8TDYz.js → create-tween-DUSQUKpr.js} +2 -2
- package/dist/css-M7EaDHN_.js +1 -6
- package/dist/custom-elements.json +1400 -218
- package/dist/default-input-CucQEOqH.js +1 -0
- package/dist/define-CGGX-7Vg.js +1 -0
- package/dist/define.d.ts +4 -0
- package/dist/define.js +510 -0
- package/dist/define.server.d.ts +5 -0
- package/dist/define.server.js +506 -0
- package/dist/{elements/chunks/disclosure-CcNbyLy0.js → disclosure-CbLtajUQ.js} +1 -1
- package/dist/{elements/chunks/dropdown-BgWTthUx.js → dropdown-BwhViJFd.js} +1 -1
- package/dist/elements/agent-card.js +1 -1
- package/dist/elements/artifact.js +1 -1
- package/dist/elements/attachments.js +1 -1
- package/dist/elements/audio-visualizer.js +1 -1
- package/dist/elements/autoloader.js +1 -1
- package/dist/elements/avatar.js +1 -1
- package/dist/elements/badge.js +1 -1
- package/dist/elements/button.js +1 -1
- package/dist/elements/card.js +1 -1
- package/dist/elements/cards.js +1 -1
- package/dist/elements/chain-of-thought.js +1 -1
- package/dist/elements/chat-scope-picker.js +1 -1
- package/dist/elements/chat-workspace.js +1 -1
- package/dist/elements/chat.js +1 -1
- package/dist/elements/checkbox-group.d.ts +1 -0
- package/dist/elements/checkbox-group.js +1 -0
- package/dist/elements/checkbox.d.ts +1 -0
- package/dist/elements/checkbox.js +1 -0
- package/dist/elements/checkpoint.js +1 -1
- package/dist/elements/choice.js +1 -1
- package/dist/elements/coachmark.js +1 -1
- package/dist/elements/code-block.js +1 -1
- package/dist/elements/command.js +1 -1
- package/dist/elements/compare.js +1 -1
- package/dist/elements/composer.js +1 -1
- package/dist/elements/confirm-card.js +1 -1
- package/dist/elements/context-meter.js +1 -1
- package/dist/elements/conversation-item.js +1 -1
- package/dist/elements/conversation-list.js +1 -1
- package/dist/elements/define-entry.d.ts +12 -0
- package/dist/elements/dialog.js +1 -1
- package/dist/elements/dock.js +101 -7
- package/dist/elements/dropdown.js +1 -1
- package/dist/elements/editable-label.js +1 -1
- package/dist/elements/element-data-types.d.ts +37 -0
- package/dist/elements/embed.js +1 -1
- package/dist/elements/empty.js +1 -1
- package/dist/elements/feedback-bar.js +1 -1
- package/dist/elements/file-tree.js +1 -1
- package/dist/elements/file-upload.js +1 -1
- package/dist/elements/form.js +1 -1
- package/dist/elements/hover-card.js +1 -1
- package/dist/elements/icon.js +1 -1
- package/dist/elements/image.js +1 -1
- package/dist/elements/input.js +1 -1
- package/dist/elements/kbd.js +1 -1
- package/dist/elements/link-preview.js +1 -1
- package/dist/elements/loader.js +1 -1
- package/dist/elements/markdown.js +1 -1
- package/dist/elements/menu.js +1 -1
- package/dist/elements/message-skills.js +1 -1
- package/dist/elements/message.js +1 -1
- package/dist/elements/model-switcher.js +1 -1
- package/dist/elements/nav.js +1 -1
- package/dist/elements/notice.js +1 -1
- package/dist/elements/pane-grid.d.ts +1 -0
- package/dist/elements/pane-grid.js +1 -0
- package/dist/elements/pane-group.js +1 -1
- package/dist/elements/pane.js +1 -1
- package/dist/elements/popover.js +1 -1
- package/dist/elements/progress-bar.js +1 -1
- package/dist/elements/prompt-dock.js +1 -1
- package/dist/elements/prompt-input.js +1 -1
- package/dist/elements/prompt-suggestions.js +1 -1
- package/dist/elements/radio-group.d.ts +1 -0
- package/dist/elements/radio-group.js +1 -0
- package/dist/elements/reasoning.js +1 -1
- package/dist/elements/remote.js +1 -1
- package/dist/elements/resizable.js +1 -1
- package/dist/elements/response-stream.js +2 -2
- package/dist/elements/screen.js +1 -1
- package/dist/elements/scroll-area.js +1 -1
- package/dist/elements/scroll-button.js +1 -1
- package/dist/elements/search.js +1 -1
- package/dist/elements/segmented.js +1 -1
- package/dist/elements/select.d.ts +1 -0
- package/dist/elements/select.js +1 -0
- package/dist/elements/separator.js +1 -1
- package/dist/elements/setting-item.js +1 -1
- package/dist/elements/settings-group.js +1 -1
- package/dist/elements/skeleton.js +1 -1
- package/dist/elements/slider.d.ts +1 -0
- package/dist/elements/slider.js +1 -0
- package/dist/elements/slots.d.ts +1 -1
- package/dist/elements/source.js +1 -1
- package/dist/elements/status.js +1 -1
- package/dist/elements/switch.js +1 -1
- package/dist/elements/tabs.js +1 -1
- package/dist/elements/tasks.js +1 -1
- package/dist/elements/text-shimmer.js +1 -1
- package/dist/elements/thinking-bar.js +1 -1
- package/dist/elements/thread.js +1 -1
- package/dist/elements/toast.js +1 -1
- package/dist/elements/tool.js +1 -1
- package/dist/elements/tooltip.js +1 -1
- package/dist/elements/voice-input.js +1 -1
- package/dist/elements/voice-output.js +1 -1
- package/dist/elements.d.ts +362 -24
- package/dist/{elements/chunks/ellipsis-7gU33mL2.js → ellipsis-DFr4Vqr3.js} +1 -1
- package/dist/embed-5s_vU4J0.js +1 -0
- package/dist/engine-javascript-vq0WuIJl.js +14 -2516
- package/dist/{elements/chunks/external-link-CSOEsNlx.js → external-link-u9d85ORQ.js} +1 -1
- package/dist/file-text-CX7_x42o.js +1 -0
- package/dist/{elements/chunks/file-tree-zvB2i7P9.js → file-tree-D3kBjXI5.js} +1 -1
- package/dist/folder-V-YdIL8f.js +1 -0
- package/dist/form-BRNUMCN2.js +1 -0
- package/dist/github-dark-dimmed-DUshB20C.js +1 -4
- package/dist/github-light-JYsPkUQd.js +1 -4
- package/dist/hover-card-DaeiYrTA.js +1 -0
- package/dist/html-CPZ3oZQ7.js +1 -10
- package/dist/icon-BpixdZNq.js +1 -0
- package/dist/{elements/chunks/index-BCRhi84a.js → index-xu_pdcPi.js} +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +7330 -5852
- package/dist/index.server.js +5823 -4759
- package/dist/info-8mFsIjS3.js +1 -0
- package/dist/input-d1Yuu-hz.js +1 -0
- package/dist/javascript-C25yR2R2.js +1 -6
- package/dist/json-DxJze_jm.js +1 -6
- package/dist/kai.es.js +1 -1
- package/dist/kbd-961zMPFB.js +1 -0
- package/dist/link-DlZZBGaR.js +1 -0
- package/dist/{elements/chunks/link-preview-OQ9IEq0f.js → link-preview-DIIbV2Sd.js} +1 -1
- package/dist/loader-YQszHFaW.js +1 -0
- package/dist/{elements/chunks/markdown-DgBFaGAz.js → markdown-CVk1MPsj.js} +1 -1
- package/dist/mcp.es.js +1285 -79
- package/dist/message-CwKVEdZg.js +1 -0
- package/dist/message-DS8lzHc1.js +1 -0
- package/dist/message-circle-Xf8Q-vZp.js +1 -0
- package/dist/message-square-Cxnwgkns.js +1 -0
- package/dist/{elements/chunks/minimize-2-DPIUKTrT.js → minimize-2-UEZmP2QT.js} +1 -1
- package/dist/{elements/chunks/model-switcher-DsT8tFB0.js → model-switcher-Kk1jEQ5t.js} +1 -1
- package/dist/{elements/chunks/overlay-DuiwdXjm.js → overlay-C1od6LOz.js} +1 -1
- package/dist/panel-right-ryET0yyn.js +1 -0
- package/dist/paperclip-BDNoZFJP.js +1 -0
- package/dist/play-OFIvYXUQ.js +1 -0
- package/dist/primitives/card-data-types.d.ts +49 -0
- package/dist/primitives/card-routing.d.ts +1 -33
- package/dist/primitives/card-validate.d.ts +2 -2
- package/dist/primitives/chat-config.d.ts +29 -2
- package/dist/primitives/field-mask.d.ts +96 -0
- package/dist/primitives/field-semantics.d.ts +36 -0
- package/dist/primitives/input-mask.d.ts +46 -0
- package/dist/primitives/url-scheme-policy.d.ts +34 -0
- package/dist/primitives/use-resize-observer.d.ts +2 -2
- package/dist/progress-bar-BvYX0aoy.js +1 -0
- package/dist/prompt-suggestion-BRFu2lcu.js +1 -0
- package/dist/radio-DcL23cNJ.js +1 -0
- package/dist/react/index.d.ts +193 -19
- package/dist/react.js +216 -180
- package/dist/reasoning-Cackq4Rh.js +1 -0
- package/dist/register-impl-C7rENvPK.js +424 -0
- package/dist/{elements/chunks/resizable-D181b4fM.js → resizable-Cp9HUYih.js} +1 -1
- package/dist/rotate-ccw-0DLRDHH5.js +1 -0
- package/dist/rotate-cw-DOB9IGcU.js +1 -0
- package/dist/schemas/form.schema.json +21 -1
- package/dist/schemas/tool-defs.d.ts +11 -1
- package/dist/schemas.js +81 -81
- package/dist/scroll-area-emVmWP4K.js +1 -0
- package/dist/scroll-button-CeP_gv1x.js +1 -0
- package/dist/select-CWmu00tS.js +1 -0
- package/dist/{elements/chunks/separator-CeJHQqLW.js → separator-CE6vly6z.js} +1 -1
- package/dist/{elements/chunks/settings-CqaHgJF9.js → settings-CE-78SvZ.js} +1 -1
- package/dist/{elements/chunks/settings-group-CjqjLCOn.js → settings-group-ZFWNxFQR.js} +1 -1
- package/dist/{elements/chunks/skeleton-D8akBnKS.js → skeleton-BebdP4mf.js} +1 -1
- package/dist/slider-BAKRYUlz.js +1 -0
- package/dist/{solid-BtdqNZI7.js → solid-BE5ui6sy.js} +8727 -7212
- package/dist/{solid-CnavwBye.js → solid-DFhsce3O.js} +7015 -5886
- package/dist/solid.d.ts +10 -0
- package/dist/solid.js +240 -234
- package/dist/solid.server.js +240 -234
- package/dist/source-B0FlguSx.js +1 -0
- package/dist/star-CBMZvLuN.js +1 -0
- package/dist/state/index.d.ts +1 -1
- package/dist/state/mock.d.ts +32 -2
- package/dist/state.js +133 -108
- package/dist/{elements/chunks/store-Cjq0qwYN.js → store-7eoadydQ.js} +1 -1
- package/dist/svelte--5p79yCD.js +1 -15
- package/dist/switch-CViARZCy.js +1 -0
- package/dist/tasks-card-MjCcOhR_.js +1 -0
- package/dist/text-shimmer-DKlwRF2G.js +1 -0
- package/dist/textarea-3ay2Me2-.js +1 -0
- package/dist/theme.tokens.css +82 -13
- package/dist/{elements/chunks/thumbs-up-DX2Ijk3H.js → thumbs-up-DQcu2HMO.js} +1 -1
- package/dist/toast-store-C6yKOhbk.js +1 -0
- package/dist/{elements/chunks/tool-DKQ2D1DP.js → tool-BCYNlfKy.js} +1 -1
- package/dist/{elements/chunks/tooltip-B0G99y8w.js → tooltip-05zI4hjs.js} +1 -1
- package/dist/trash-2-BR1RxGky.js +1 -0
- package/dist/{elements/chunks/triangle-alert-F9cyUEyy.js → triangle-alert-DHohDOCy.js} +1 -1
- package/dist/tsx-B8rCNbgL.js +1 -6
- package/dist/typescript-RycA9KXf.js +1 -6
- package/dist/ui/checkbox-group.d.ts +83 -0
- package/dist/ui/checkbox.d.ts +40 -0
- package/dist/ui/dock.d.ts +22 -0
- package/dist/ui/icon.d.ts +3 -0
- package/dist/ui/input.d.ts +48 -2
- package/dist/ui/radio.d.ts +85 -0
- package/dist/ui/select.d.ts +71 -0
- package/dist/ui/slider.d.ts +65 -0
- package/dist/ui/switch.d.ts +9 -2
- package/dist/upload-BbGW6A_u.js +1 -0
- package/dist/url-scheme-policy-DHpoTJwB.js +1 -0
- package/dist/use-card-resolution-CJW4grFa.js +1 -0
- package/dist/{variant-aurora-B8II3-I1.js → variant-aurora-BUOVgPOB.js} +2 -2
- package/dist/{variant-aurora-CMNWOSJR.js → variant-aurora-CUsUJvFI.js} +2 -2
- package/dist/{variant-aurora-CcuDMWwQ.js → variant-aurora-CW2i4bfr.js} +1 -1
- package/dist/{elements/chunks/variant-aurora-qt6Zct8M.js → variant-aurora-xiMPty8f.js} +1 -1
- package/dist/{variant-custom-L16JLLZy.js → variant-custom-BQtOnmeO.js} +1 -1
- package/dist/{variant-custom-C714mqKl.js → variant-custom-CAm9L-E5.js} +2 -2
- package/dist/{variant-custom-BdvYC7af.js → variant-custom-CAnzzppW.js} +2 -2
- package/dist/{elements/chunks/variant-custom-tJp22_BQ.js → variant-custom-D91HjAKz.js} +1 -1
- package/dist/{variant-wave-ecwykeyL.js → variant-wave-Ca1Ls4_y.js} +2 -2
- package/dist/{variant-wave-D7ruiA1W.js → variant-wave-CxX39DKd.js} +2 -2
- package/dist/{elements/chunks/variant-wave-CaQ5ti39.js → variant-wave-DYyzIIZv.js} +1 -1
- package/dist/{variant-wave-2S4La2Ka.js → variant-wave-uY5crU_K.js} +1 -1
- package/dist/vue-BmIZj4XD.js +1 -33
- package/dist/x-C5m1JFgi.js +1 -0
- package/frameworks/react/index.tsx +198 -20
- package/llms-full.txt +1178 -21
- package/llms.txt +6 -3
- package/package.json +17 -4
- package/src/agent-tooling/catalog/invariants.ts +1 -1
- package/src/agent-tooling/catalog/surfaces.ts +72 -0
- package/src/agent-tooling/construct/cli-entry.ts +8 -0
- package/src/agent-tooling/construct/cli.ts +131 -0
- package/src/agent-tooling/construct/codegen.ts +1353 -0
- package/src/agent-tooling/construct/construct.v1.schema.json +250 -0
- package/src/agent-tooling/construct/dev.ts +148 -0
- package/src/agent-tooling/construct/fixtures/demo-widget.construct.json +7 -0
- package/src/agent-tooling/construct/fixtures/ops-console.construct.json +44 -0
- package/src/agent-tooling/construct/fixtures/owner-widget.construct.json +23 -0
- package/src/agent-tooling/construct/schema.ts +371 -0
- package/src/agent-tooling/mcp/server.ts +2 -1
- package/src/agent-tooling/mcp/tools/construct.ts +130 -0
- package/src/agent-tooling/mcp/tools/debug.ts +126 -4
- package/src/agent-tooling/mcp/tools/reference.ts +104 -3
- package/src/agent-tooling/recipes/composed-thread.ts +714 -0
- package/src/agent-tooling/recipes/index.ts +22 -0
- package/src/agent-tooling/recipes/types.ts +32 -0
- package/src/agent-tooling/registry.ts +5 -0
- package/src/components/attachment-types.ts +7 -0
- package/src/components/audio-visualizer/fit-scale.ts +1 -1
- package/src/components/card-renderer.tsx +39 -8
- package/src/components/card.tsx +10 -2
- package/src/components/chat-scope-picker.tsx +2 -2
- package/src/components/chat-thread.tsx +72 -9
- package/src/components/choice-card.tsx +102 -37
- package/src/components/coachmark.tsx +1 -1
- package/src/components/code-block.tsx +2 -2
- package/src/components/composer.tsx +89 -15
- package/src/components/confirm-card.tsx +20 -4
- package/src/components/conversation-item.tsx +33 -9
- package/src/components/conversation-list.tsx +25 -10
- package/src/components/empty.tsx +14 -3
- package/src/components/file-tree.tsx +5 -1
- package/src/components/form-widgets.tsx +257 -195
- package/src/components/form.tsx +297 -9
- package/src/components/loader.tsx +12 -5
- package/src/components/message-skills.tsx +1 -1
- package/src/components/message.tsx +71 -11
- package/src/components/prompt-input.tsx +7 -1
- package/src/components/prompt-suggestion.tsx +4 -1
- package/src/components/reasoning.tsx +30 -3
- package/src/components/response-compare.tsx +2 -2
- package/src/components/scroll-button.tsx +56 -4
- package/src/components/source.tsx +6 -1
- package/src/components/tasks-card.tsx +58 -16
- package/src/components/thread.tsx +10 -1
- package/src/components/toast.tsx +1 -1
- package/src/components/tool-types.ts +9 -0
- package/src/elements/attachments.tsx +3 -1
- package/src/elements/chat-workspace.tsx +1 -1
- package/src/elements/chat.tsx +22 -4
- package/src/elements/checkbox-group.tsx +164 -0
- package/src/elements/checkbox.tsx +134 -0
- package/src/elements/compiled.css +1 -1
- package/src/elements/composer.tsx +12 -1
- package/src/elements/conversation-item.tsx +62 -22
- package/src/elements/conversation-list.tsx +2 -2
- package/src/elements/define-entry.ts +12 -0
- package/src/elements/dock.tsx +11 -0
- package/src/elements/element-data-types.ts +40 -0
- package/src/elements/element-manifest.json +24 -0
- package/src/elements/element-meta.json +736 -46
- package/src/elements/element-nonscalar.json +15 -0
- package/src/elements/element-types.d.ts +362 -24
- package/src/elements/feedback-bar.tsx +5 -0
- package/src/elements/icon-names.json +29 -0
- package/src/elements/input.tsx +312 -23
- package/src/elements/message.tsx +2 -0
- package/src/elements/pane-grid.tsx +111 -0
- package/src/elements/prompt-input.tsx +8 -2
- package/src/elements/radio-group.tsx +129 -0
- package/src/elements/register-impl.ts +6 -0
- package/src/elements/scroll-button.tsx +54 -6
- package/src/elements/select.tsx +165 -0
- package/src/elements/slider.tsx +171 -0
- package/src/elements/slots.ts +1 -1
- package/src/elements/styles.css +89 -3
- package/src/elements/thread.tsx +2 -0
- package/src/elements/toast.tsx +14 -1
- package/src/index.ts +2 -1
- package/src/primitives/card-data-types.ts +49 -0
- package/src/primitives/card-host.tsx +4 -2
- package/src/primitives/card-routing.ts +7 -56
- package/src/primitives/card-schemas/form.schema.json +21 -1
- package/src/primitives/card-validate.ts +10 -2
- package/src/primitives/chat-config.tsx +33 -6
- package/src/primitives/field-mask.ts +256 -0
- package/src/primitives/field-semantics.ts +115 -0
- package/src/primitives/input-mask.ts +853 -0
- package/src/primitives/toast-store.ts +66 -4
- package/src/primitives/url-scheme-policy.ts +70 -0
- package/src/primitives/use-resize-observer.ts +2 -2
- package/src/schemas/tool-defs.ts +12 -2
- package/src/solid.ts +10 -0
- package/src/state/index.ts +1 -1
- package/src/state/mock.ts +92 -6
- package/src/ui/agent-card.tsx +2 -2
- package/src/ui/avatar.tsx +1 -1
- package/src/ui/checkbox-group.tsx +153 -0
- package/src/ui/checkbox.tsx +63 -0
- package/src/ui/dock.tsx +145 -6
- package/src/ui/icon.tsx +53 -0
- package/src/ui/input.tsx +249 -9
- package/src/ui/kbd.tsx +1 -1
- package/src/ui/nav.tsx +1 -1
- package/src/ui/pane-group.tsx +2 -2
- package/src/ui/radio.tsx +150 -0
- package/src/ui/select.tsx +168 -0
- package/src/ui/slider.tsx +178 -0
- package/src/ui/switch.tsx +49 -18
- package/src/utils/cn.ts +11 -5
- package/theme.css +84 -13
- package/dist/elements/chunks/action-icons-D9u3OzYW.js +0 -1
- package/dist/elements/chunks/arrow-left-CVh1TeN7.js +0 -1
- package/dist/elements/chunks/artifact-BkYcfIlZ.js +0 -1
- package/dist/elements/chunks/attachments-DwfNlubq.js +0 -1
- package/dist/elements/chunks/badge-Q0-Cmwzz.js +0 -1
- package/dist/elements/chunks/bash-InADTalH.js +0 -1
- package/dist/elements/chunks/card-renderer-3Dyl-FpN.js +0 -1
- package/dist/elements/chunks/card-routing-BK09BdmL.js +0 -1
- package/dist/elements/chunks/check-B5kBPKeo.js +0 -1
- package/dist/elements/chunks/chevron-down-DZ1GS39h.js +0 -1
- package/dist/elements/chunks/chevron-right-CvP7OUd2.js +0 -1
- package/dist/elements/chunks/choice-card-D4QUIOWZ.js +0 -1
- package/dist/elements/chunks/circle-CDf9g6MQ.js +0 -1
- package/dist/elements/chunks/circle-check-CA47Nqbz.js +0 -1
- package/dist/elements/chunks/circle-x-CJ_HVbC8.js +0 -1
- package/dist/elements/chunks/composer-Byve-n8K.js +0 -69
- package/dist/elements/chunks/confirm-card-B0flE3MN.js +0 -1
- package/dist/elements/chunks/controllable-DTwTIlwp.js +0 -1
- package/dist/elements/chunks/conversation-item-BDztezOG.js +0 -1
- package/dist/elements/chunks/copy-Nf-kqxXH.js +0 -1
- package/dist/elements/chunks/core-AYMC6_lb.js +0 -12
- package/dist/elements/chunks/css-M7EaDHN_.js +0 -1
- package/dist/elements/chunks/default-input-C2iLFq0b.js +0 -1
- package/dist/elements/chunks/define-wjHR1MkU.js +0 -1
- package/dist/elements/chunks/download-C4V7tBdb.js +0 -1
- package/dist/elements/chunks/embed-D3KewsIJ.js +0 -1
- package/dist/elements/chunks/engine-javascript-vq0WuIJl.js +0 -141
- package/dist/elements/chunks/file-text-D1G8khle.js +0 -1
- package/dist/elements/chunks/folder-WW2LGLid.js +0 -1
- package/dist/elements/chunks/form-CQirdC4W.js +0 -1
- package/dist/elements/chunks/github-dark-dimmed-DUshB20C.js +0 -1
- package/dist/elements/chunks/github-light-JYsPkUQd.js +0 -1
- package/dist/elements/chunks/hover-card-CJJkfHTK.js +0 -1
- package/dist/elements/chunks/html-CPZ3oZQ7.js +0 -1
- package/dist/elements/chunks/icon-Cfgmf4fa.js +0 -1
- package/dist/elements/chunks/info-DX3YMOt6.js +0 -1
- package/dist/elements/chunks/input-BtW9U6Sq.js +0 -1
- package/dist/elements/chunks/javascript-C25yR2R2.js +0 -1
- package/dist/elements/chunks/json-DxJze_jm.js +0 -1
- package/dist/elements/chunks/kbd-LGXwuT_V.js +0 -1
- package/dist/elements/chunks/link-2My69BqT.js +0 -1
- package/dist/elements/chunks/loader-iOxc_Tu-.js +0 -1
- package/dist/elements/chunks/message-VMZohrXx.js +0 -1
- package/dist/elements/chunks/message-circle-CpXMM-_n.js +0 -1
- package/dist/elements/chunks/message-square-DxcWtETQ.js +0 -1
- package/dist/elements/chunks/message-tZmV2A3p.js +0 -1
- package/dist/elements/chunks/paperclip-CRZVp4z_.js +0 -1
- package/dist/elements/chunks/progress-bar-DNy66e_E.js +0 -1
- package/dist/elements/chunks/prompt-suggestion-Bn64Nl7L.js +0 -1
- package/dist/elements/chunks/reasoning-Emn9N4-T.js +0 -1
- package/dist/elements/chunks/rotate-cw-CPWe37D9.js +0 -1
- package/dist/elements/chunks/scroll-area-ClZkZxIk.js +0 -1
- package/dist/elements/chunks/scroll-button-DPE-t3x_.js +0 -1
- package/dist/elements/chunks/share-CyfnNEqp.js +0 -1
- package/dist/elements/chunks/source-UWCvmVak.js +0 -1
- package/dist/elements/chunks/star-DoHFAikQ.js +0 -1
- package/dist/elements/chunks/svelte--5p79yCD.js +0 -1
- package/dist/elements/chunks/tasks-card-CmZ5xh6v.js +0 -1
- package/dist/elements/chunks/text-shimmer-DYn09zrz.js +0 -1
- package/dist/elements/chunks/textarea-skiGHURM.js +0 -1
- package/dist/elements/chunks/toast-store-CFnQpThX.js +0 -1
- package/dist/elements/chunks/tsx-B8rCNbgL.js +0 -1
- package/dist/elements/chunks/typescript-RycA9KXf.js +0 -1
- package/dist/elements/chunks/use-card-resolution-DoA2f_EU.js +0 -1
- package/dist/elements/chunks/vue-BmIZj4XD.js +0 -1
- package/dist/elements/chunks/x-B6UnOiLw.js +0 -1
- package/dist/llms/llms-full.txt +0 -2949
- package/dist/llms/llms.txt +0 -156
- package/dist/register-impl-DpE7icIb.js +0 -293
- package/dist/ui/stat.d.ts +0 -16
- package/src/ui/stat.tsx +0 -41
- /package/dist/{elements/chunks/card-tags-D8lZ-C_U.js → card-tags-D8lZ-C_U.js} +0 -0
- /package/dist/{elements/chunks/link-preview-DNILK391.js → link-preview-DNILK391.js} +0 -0
- /package/dist/{elements/chunks/slots-DaNjX0rc.js → slots-DaNjX0rc.js} +0 -0
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import { createEffect, createSignal, untrack } from 'solid-js';
|
|
2
|
+
import { defineWebComponent } from './define';
|
|
3
|
+
import { CheckboxGroup } from '../ui/checkbox-group';
|
|
4
|
+
// Public shape of the `options` prop; lives in ./element-data-types so the ROOT
|
|
5
|
+
// entry can re-export it (see that file's header).
|
|
6
|
+
import type { KaiCheckboxOption } from './element-data-types';
|
|
7
|
+
|
|
8
|
+
interface Props extends Record<string, unknown> {
|
|
9
|
+
/** The choices, top to bottom. Set as a JS PROPERTY (array), never an attribute.
|
|
10
|
+
* Rendered in full: the kit never truncates, re-orders or de-duplicates them. */
|
|
11
|
+
options: KaiCheckboxOption[];
|
|
12
|
+
/** The FIRST selected value. Settable and reflected to the `value` attribute, so
|
|
13
|
+
* `:host([value])` and `el.value` see live state, and a seed can be written in
|
|
14
|
+
* markup. Writing it makes that the whole selection; to read or drive the rest,
|
|
15
|
+
* use `el.values`. */
|
|
16
|
+
value?: string;
|
|
17
|
+
/**
|
|
18
|
+
* The shared form-control name every box carries, so `FormData.getAll(name)` reads
|
|
19
|
+
* the whole selection back under one key.
|
|
20
|
+
*
|
|
21
|
+
* NO DEFAULT, unlike `<kai-radio-group>`. A radio set needs a shared `name` for the
|
|
22
|
+
* browser to make it exclusive and arrow-navigable, so one is generated when none is
|
|
23
|
+
* given; checkboxes are independent controls and behave correctly with no name at
|
|
24
|
+
* all. Generating one here would submit the selection under a random key, which is
|
|
25
|
+
* worse than submitting nothing.
|
|
26
|
+
*
|
|
27
|
+
* The element is NOT form-associated (no `ElementInternals`, no `setFormValue()`),
|
|
28
|
+
* the same known gap `<kai-input>` records: the boxes live in a shadow root, so a
|
|
29
|
+
* surrounding `<form>` collects nothing from them whether or not `name` is set. Read
|
|
30
|
+
* `el.values`. The name still lands on every inner input, so it is right the day form
|
|
31
|
+
* association arrives.
|
|
32
|
+
*/
|
|
33
|
+
name?: string;
|
|
34
|
+
/** Disable every row. Individual rows carry their own `disabled`. */
|
|
35
|
+
disabled?: boolean;
|
|
36
|
+
/** Accessible name for the group. */
|
|
37
|
+
label?: string;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/** Events fired by `<kai-checkbox-group>`. */
|
|
41
|
+
interface Events {
|
|
42
|
+
/** A row was ticked or unticked. `values` is the whole selection after the change,
|
|
43
|
+
* which is what a multi-select control needs; `value` is the first of them (empty
|
|
44
|
+
* when nothing is selected). Both are always present, so neither shape silently
|
|
45
|
+
* loses the other. This is `<kai-select>`'s detail, deliberately. */
|
|
46
|
+
'kai-change': { value: string; values: string[] };
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* `<kai-checkbox-group>` — the kit's "pick any number" control, and
|
|
51
|
+
* `<kai-radio-group>`'s sibling: the same options shape and the same divided row
|
|
52
|
+
* chrome over real `<input type="checkbox">`es, multi-value instead of exclusive. A
|
|
53
|
+
* box per tab stop, Space to toggle and correct announcement are the browser's, not a
|
|
54
|
+
* reimplementation.
|
|
55
|
+
*
|
|
56
|
+
* Feed it `options` (a JS-property array of `{ value, label, description?, disabled? }`),
|
|
57
|
+
* drive and read the selection with the `values` property, and listen for `kai-change`.
|
|
58
|
+
* `value` is the first selected option and is reflected to the `value` attribute.
|
|
59
|
+
*
|
|
60
|
+
* Re-rendering follows the kit's reactivity contract: hand it a NEW array reference,
|
|
61
|
+
* and a new object for any option whose content changed — the rows are a
|
|
62
|
+
* reference-keyed list, so mutating an option in place changes nothing on screen.
|
|
63
|
+
*
|
|
64
|
+
* No validation and no limits: "at least one", "at most three" and anything else that
|
|
65
|
+
* lands in a policy document is the application's rule, not the kit's.
|
|
66
|
+
*
|
|
67
|
+
* ```html
|
|
68
|
+
* <kai-checkbox-group label="Environments" name="env"></kai-checkbox-group>
|
|
69
|
+
* <script type="module">
|
|
70
|
+
* import '@kitn.ai/ui/elements';
|
|
71
|
+
* const group = document.querySelector('kai-checkbox-group');
|
|
72
|
+
* // ARRAY prop — a JS property, never an attribute.
|
|
73
|
+
* group.options = [
|
|
74
|
+
* { value: 'prod', label: 'Production', description: 'Pages the on-call' },
|
|
75
|
+
* { value: 'staging', label: 'Staging' },
|
|
76
|
+
* { value: 'dev', label: 'Development' },
|
|
77
|
+
* ];
|
|
78
|
+
* group.addEventListener('kai-change', (e) => console.log(e.detail.values));
|
|
79
|
+
* group.values = ['prod', 'dev']; // drive it (no kai-change — the host already knows)
|
|
80
|
+
* </script>
|
|
81
|
+
* ```
|
|
82
|
+
*/
|
|
83
|
+
defineWebComponent<Props, Events>('kai-checkbox-group', {
|
|
84
|
+
options: [],
|
|
85
|
+
value: undefined,
|
|
86
|
+
name: undefined,
|
|
87
|
+
disabled: undefined,
|
|
88
|
+
label: undefined,
|
|
89
|
+
}, (props, ctx) => {
|
|
90
|
+
const { element, dispatch, flag, expose } = ctx;
|
|
91
|
+
|
|
92
|
+
// Lift the selection into the facade and drive CheckboxGroup CONTROLLED so the host
|
|
93
|
+
// can read it (`el.values` / `:host([value])`) and set it after mount. Seed from the
|
|
94
|
+
// `value` property/attribute present on mount; nothing is auto-selected, because
|
|
95
|
+
// `options` normally arrives as a property AFTER upgrade (kai-select's structure).
|
|
96
|
+
const seed = (props.value as string | undefined) ?? element.getAttribute('value') ?? '';
|
|
97
|
+
const [values, setValues] = createSignal<string[]>(seed ? [seed] : []);
|
|
98
|
+
const first = () => values()[0] ?? '';
|
|
99
|
+
|
|
100
|
+
// Coerce anything arriving through the `value` setter (a JS assignment, or the
|
|
101
|
+
// attributeChangedCallback write-back the reflect effect below triggers) to a string,
|
|
102
|
+
// falling back to the live attribute when nullish so the write-back equals the signal
|
|
103
|
+
// and the guard absorbs it — no attr⇄prop feedback loop.
|
|
104
|
+
const coerce = (v: unknown): string =>
|
|
105
|
+
v == null ? (element.getAttribute('value') ?? '') : String(v);
|
|
106
|
+
|
|
107
|
+
// Apply a new selection and fire kai-change once (the user-toggle path).
|
|
108
|
+
const apply = (next: string[]) => {
|
|
109
|
+
const prev = untrack(values);
|
|
110
|
+
if (prev.length === next.length && prev.every((v, i) => v === next[i])) return;
|
|
111
|
+
setValues(next);
|
|
112
|
+
dispatch('kai-change', { value: next[0] ?? '', values: next });
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
Object.defineProperty(element, 'value', {
|
|
116
|
+
get: () => first(),
|
|
117
|
+
set: (v: unknown) => {
|
|
118
|
+
const next = coerce(v);
|
|
119
|
+
if (untrack(first) !== next) setValues(next ? [next] : []);
|
|
120
|
+
},
|
|
121
|
+
configurable: true,
|
|
122
|
+
enumerable: true,
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
// The multi-selection read/write side, spelled exactly as `<kai-select multiple>`
|
|
126
|
+
// spells it. `value` alone cannot represent a checkbox group's selection, and
|
|
127
|
+
// returning only the first ticked box would be a silent drop.
|
|
128
|
+
Object.defineProperty(element, 'values', {
|
|
129
|
+
get: () => values(),
|
|
130
|
+
set: (v: unknown) => setValues(Array.isArray(v) ? v.map(String) : []),
|
|
131
|
+
configurable: true,
|
|
132
|
+
enumerable: true,
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
// Reflect the first value → the `[value]` host attribute (for `:host([value])`).
|
|
136
|
+
createEffect(() => {
|
|
137
|
+
const v = first();
|
|
138
|
+
if (v) {
|
|
139
|
+
if (element.getAttribute('value') !== v) element.setAttribute('value', v);
|
|
140
|
+
} else if (element.hasAttribute('value')) {
|
|
141
|
+
element.removeAttribute('value');
|
|
142
|
+
}
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
expose({
|
|
146
|
+
/** Focus the group's first box. Not "the first ticked one", which is
|
|
147
|
+
* `<kai-radio-group>`'s rule: a radio group is ONE tab stop that lands on the
|
|
148
|
+
* selection, while every checkbox here is its own tab stop, so the entry point is
|
|
149
|
+
* simply the top of the list. */
|
|
150
|
+
focus: (options?: FocusOptions) =>
|
|
151
|
+
element.shadowRoot?.querySelector<HTMLInputElement>('input[type="checkbox"]')?.focus(options),
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
return (
|
|
155
|
+
<CheckboxGroup
|
|
156
|
+
options={(props.options ?? []) as KaiCheckboxOption[]}
|
|
157
|
+
value={values()}
|
|
158
|
+
name={props.name as string | undefined}
|
|
159
|
+
disabled={flag('disabled')}
|
|
160
|
+
label={props.label as string | undefined}
|
|
161
|
+
onChange={(next) => apply(next)}
|
|
162
|
+
/>
|
|
163
|
+
);
|
|
164
|
+
});
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { createEffect, createSignal, untrack } from 'solid-js';
|
|
2
|
+
import { defineWebComponent } from './define';
|
|
3
|
+
import { Checkbox } from '../ui/checkbox';
|
|
4
|
+
|
|
5
|
+
interface Props extends Record<string, unknown> {
|
|
6
|
+
/** Controlled checked state. Settable and reflected to the `checked` attribute.
|
|
7
|
+
* `el.checked = true` (or `<kai-checkbox checked>`) drives it; ticking the box
|
|
8
|
+
* updates it and fires `kai-change`. Read `el.checked` for live state. */
|
|
9
|
+
checked?: boolean;
|
|
10
|
+
/** Initial checked state on mount (uncontrolled seed). Bare attribute
|
|
11
|
+
* (`<kai-checkbox default-checked>`) turns it on. */
|
|
12
|
+
defaultChecked?: boolean;
|
|
13
|
+
/** The mixed state, for a parent box whose children are partly ticked. Visual
|
|
14
|
+
* plus an accessibility hint: the box still reports `checked === false`. */
|
|
15
|
+
indeterminate?: boolean;
|
|
16
|
+
/** Disable interaction. */
|
|
17
|
+
disabled?: boolean;
|
|
18
|
+
/** Set the native `required` attribute, and nothing more. Whether an unticked box
|
|
19
|
+
* is an error is the application's rule, not the kit's. */
|
|
20
|
+
required?: boolean;
|
|
21
|
+
/** Accessible label. The visible text beside the box is the consumer's to render. */
|
|
22
|
+
label?: string;
|
|
23
|
+
/** Form-control name (paired with `value`). */
|
|
24
|
+
name?: string;
|
|
25
|
+
/** Submitted value when checked (paired with `name`). Defaults to `'on'`. */
|
|
26
|
+
value?: string;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/** Events fired by `<kai-checkbox>`. */
|
|
30
|
+
interface Events {
|
|
31
|
+
/** The box was ticked or unticked. */
|
|
32
|
+
'kai-change': { checked: boolean };
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* `<kai-checkbox>` — a checkbox over a real `<input type="checkbox">`. Drive/read
|
|
37
|
+
* its state with the `checked` property (settable + reflected to the `checked`
|
|
38
|
+
* attribute, so `:host([checked])` and `el.checked` see live state); seed the
|
|
39
|
+
* initial state with `default-checked` and read changes from `kai-change`.
|
|
40
|
+
*
|
|
41
|
+
* ```html
|
|
42
|
+
* <label>
|
|
43
|
+
* <kai-checkbox default-checked label="Stream responses"></kai-checkbox>
|
|
44
|
+
* Stream responses
|
|
45
|
+
* </label>
|
|
46
|
+
* <script type="module">
|
|
47
|
+
* import '@kitn.ai/ui/elements';
|
|
48
|
+
* const box = document.querySelector('kai-checkbox');
|
|
49
|
+
* box.addEventListener('kai-change', (e) => console.log(e.detail.checked));
|
|
50
|
+
* box.checked = false; // drive it (no kai-change — the host already knows)
|
|
51
|
+
* box.indeterminate = true;
|
|
52
|
+
* box.toggle(); // flip it (fires kai-change)
|
|
53
|
+
* </script>
|
|
54
|
+
* ```
|
|
55
|
+
*/
|
|
56
|
+
defineWebComponent<Props, Events>('kai-checkbox', {
|
|
57
|
+
checked: undefined,
|
|
58
|
+
defaultChecked: undefined,
|
|
59
|
+
indeterminate: undefined,
|
|
60
|
+
disabled: undefined,
|
|
61
|
+
required: undefined,
|
|
62
|
+
label: undefined,
|
|
63
|
+
name: undefined,
|
|
64
|
+
value: undefined,
|
|
65
|
+
}, (props, ctx) => {
|
|
66
|
+
const { element, dispatch, flag, expose } = ctx;
|
|
67
|
+
|
|
68
|
+
// Lift the on/off state into the facade and drive Checkbox CONTROLLED so the host
|
|
69
|
+
// can read it (`el.checked` / `:host([checked])`) and set it after mount. Seed from
|
|
70
|
+
// `defaultChecked` (or a bare `checked` attribute present on mount). This is
|
|
71
|
+
// kai-switch's structure, deliberately — same contract, same failure modes.
|
|
72
|
+
const [checked, setChecked] = createSignal(flag('defaultChecked') || flag('checked'));
|
|
73
|
+
|
|
74
|
+
// Coerce anything arriving through the `checked` setter (a JS assignment, or the
|
|
75
|
+
// write-back `attributeChangedCallback` fires when the attribute changes) to a
|
|
76
|
+
// boolean, falling back to attribute presence to match `flag`'s semantics. The
|
|
77
|
+
// `undefined` write-back `toggleAttribute` triggers thus resolves to the attribute
|
|
78
|
+
// just written, equals the signal, and is absorbed by the guard below — no attr⇄prop
|
|
79
|
+
// feedback loop.
|
|
80
|
+
const coerce = (v: unknown): boolean =>
|
|
81
|
+
v === true ? true
|
|
82
|
+
: v === false ? false
|
|
83
|
+
: element.hasAttribute('checked') && element.getAttribute('checked') !== 'false';
|
|
84
|
+
|
|
85
|
+
// Apply a new checked state and fire kai-change once (the user path). No-op while
|
|
86
|
+
// disabled.
|
|
87
|
+
const apply = (next: boolean) => {
|
|
88
|
+
if (flag('disabled')) return;
|
|
89
|
+
if (untrack(checked) === next) return;
|
|
90
|
+
setChecked(next);
|
|
91
|
+
dispatch('kai-change', { checked: next });
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
// Reads return LIVE state; host writes drive it WITHOUT firing kai-change — the
|
|
95
|
+
// host already knows what it set. The equality guard kills the reflect write-back.
|
|
96
|
+
Object.defineProperty(element, 'checked', {
|
|
97
|
+
get: () => checked(),
|
|
98
|
+
set: (v: unknown) => { const next = coerce(v); if (untrack(checked) !== next) setChecked(next); },
|
|
99
|
+
configurable: true,
|
|
100
|
+
enumerable: true,
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
// Reflect internal checked → the `[checked]` host attribute (for `:host([checked])`).
|
|
104
|
+
createEffect(() => {
|
|
105
|
+
const c = checked();
|
|
106
|
+
if (c !== element.hasAttribute('checked')) element.toggleAttribute('checked', c);
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
expose({
|
|
110
|
+
/** Flip the box and fire `kai-change` (no-op while disabled). */
|
|
111
|
+
toggle: () => apply(!untrack(checked)),
|
|
112
|
+
/** Focus the inner input (the host element can't reach it). */
|
|
113
|
+
focus: (options?: FocusOptions) =>
|
|
114
|
+
element.shadowRoot?.querySelector<HTMLInputElement>('input[type="checkbox"]')?.focus(options),
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
return (
|
|
118
|
+
<>
|
|
119
|
+
{/* Base sets `:host{display:block}`; a checkbox flows inline beside its text. */}
|
|
120
|
+
<style>{':host{display:inline-flex}'}</style>
|
|
121
|
+
<Checkbox
|
|
122
|
+
checked={checked()}
|
|
123
|
+
indeterminate={flag('indeterminate')}
|
|
124
|
+
disabled={flag('disabled')}
|
|
125
|
+
required={flag('required')}
|
|
126
|
+
aria-label={props.label as string | undefined}
|
|
127
|
+
aria-checked={flag('indeterminate') ? 'mixed' : undefined}
|
|
128
|
+
name={props.name as string | undefined}
|
|
129
|
+
value={(props.value as string | undefined) ?? 'on'}
|
|
130
|
+
onChange={(e) => apply(e.currentTarget.checked)}
|
|
131
|
+
/>
|
|
132
|
+
</>
|
|
133
|
+
);
|
|
134
|
+
});
|