From 5332229f20c0ec1ad7ec598f3b30808502b9cd70 Mon Sep 17 00:00:00 2001
From: Col0ring <47329987+Col0ring@users.noreply.github.com>
Date: Mon, 11 Nov 2024 15:47:59 +0800
Subject: [PATCH] feat: integrate ant design (#32)
---
.changeset/five-actors-compete.md | 17 +
.changeset/fuzzy-goats-retire.md | 17 +
.changeset/lemon-laws-cross.md | 17 +
.changeset/pre.json | 25 +
.changeset/tough-walls-grab.md | 17 +
.github/workflows/lint.yaml | 2 -
.husky/commit-msg | 5 +-
.husky/pre-commit | 5 +-
.lintstagedrc | 2 +-
CHANGELOG.md | 24 +
README-zh_CN.md | 87 +-
README.md | 95 +-
backend/modelscope_studio/__init__.py | 9 +-
.../modelscope_studio/components/__init__.py | 6 -
.../components/antd/__init__.py | 145 +
.../components/antd/affix/__init__.py | 79 +
.../components/antd/alert/__init__.py | 84 +
.../antd/alert/error_boundary/__init__.py | 68 +
.../components/antd/anchor/__init__.py | 112 +
.../components/antd/anchor/item/__init__.py | 77 +
.../components/antd/auto_complete/__init__.py | 135 +
.../antd/auto_complete/option/__init__.py | 62 +
.../components/antd/avatar/__init__.py | 109 +
.../components/antd/avatar/group/__init__.py | 64 +
.../components/antd/badge/__init__.py | 86 +
.../components/antd/badge/ribbon/__init__.py | 61 +
.../components/antd/breadcrumb/__init__.py | 68 +
.../antd/breadcrumb/item/__init__.py | 112 +
.../components/antd/button/__init__.py | 149 +
.../components/antd/button/group/__init__.py | 55 +
.../components/antd/calendar/__init__.py | 95 +
.../components/antd/card/__init__.py | 135 +
.../components/antd/card/grid/__init__.py | 70 +
.../components/antd/card/meta/__init__.py | 71 +
.../components/antd/carousel/__init__.py | 86 +
.../components/antd/cascader/__init__.py | 177 +
.../components/antd/cascader/constants.py | 2 +
.../antd/cascader/option/__init__.py | 66 +
.../antd/cascader/panel/__init__.py | 106 +
.../components/antd/checkbox/__init__.py | 78 +
.../antd/checkbox/group/__init__.py | 100 +
.../antd/checkbox/group/option/__init__.py | 64 +
.../components/antd/collapse/__init__.py | 90 +
.../components/antd/collapse/item/__init__.py | 78 +
.../components/antd/color_picker/__init__.py | 124 +
.../antd/color_picker/preset/__init__.py | 61 +
.../components/antd/components.py | 138 +
.../antd/config_provider/__init__.py | 88 +
.../components/antd/date_picker/__init__.py | 197 +
.../antd/date_picker/preset/__init__.py | 60 +
.../antd/date_picker/range_picker/__init__.py | 188 +
.../components/antd/descriptions/__init__.py | 81 +
.../antd/descriptions/item/__init__.py | 64 +
.../components/antd/divider/__init__.py | 86 +
.../components/antd/drawer/__init__.py | 114 +
.../components/antd/dropdown/__init__.py | 110 +
.../antd/dropdown/button/__init__.py | 126 +
.../components/antd/empty/__init__.py | 64 +
.../components/antd/flex/__init__.py | 91 +
.../components/antd/float_button/__init__.py | 105 +
.../antd/float_button/back_top/__init__.py | 111 +
.../antd/float_button/group/__init__.py | 123 +
.../components/antd/form/__init__.py | 123 +
.../components/antd/form/item/__init__.py | 124 +
.../antd/form/item/rule/__init__.py | 80 +
.../components/antd/grid/col/__init__.py | 109 +
.../components/antd/grid/row/__init__.py | 89 +
.../components/antd/icon/__init__.py | 83 +
.../antd/icon/iconfont_provider/__init__.py | 61 +
.../components/antd/image/__init__.py | 115 +
.../antd/image/preview_group/__init__.py | 71 +
.../components/antd/input/__init__.py | 123 +
.../components/antd/input/otp/__init__.py | 88 +
.../antd/input/password/__init__.py | 120 +
.../components/antd/input/search/__init__.py | 120 +
.../antd/input/textarea/__init__.py | 104 +
.../components/antd/input_number/__init__.py | 139 +
.../components/antd/layout/__init__.py | 86 +
.../antd/layout/content/__init__.py | 70 +
.../components/antd/layout/footer/__init__.py | 70 +
.../components/antd/layout/header/__init__.py | 70 +
.../components/antd/layout/sider/__init__.py | 116 +
.../components/antd/list/__init__.py | 96 +
.../components/antd/list/item/__init__.py | 68 +
.../antd/list/item/meta/__init__.py | 62 +
.../components/antd/mentions/__init__.py | 123 +
.../antd/mentions/option/__init__.py | 66 +
.../components/antd/menu/__init__.py | 111 +
.../components/antd/menu/item/__init__.py | 83 +
.../components/antd/message/__init__.py | 79 +
.../components/antd/modal/__init__.py | 127 +
.../components/antd/notification/__init__.py | 100 +
.../components/antd/pagination/__init__.py | 102 +
.../components/antd/popconfirm/__init__.py | 148 +
.../components/antd/popover/__init__.py | 116 +
.../components/antd/progress/__init__.py | 90 +
.../components/antd/qr_code/__init__.py | 87 +
.../components/antd/radio/__init__.py | 80 +
.../components/antd/radio/button/__init__.py | 76 +
.../components/antd/radio/group/__init__.py | 100 +
.../antd/radio/group/option/__init__.py | 68 +
.../components/antd/rate/__init__.py | 101 +
.../components/antd/result/__init__.py | 70 +
.../components/antd/segmented/__init__.py | 90 +
.../antd/segmented/option/__init__.py | 64 +
.../components/antd/select/__init__.py | 215 +
.../components/antd/select/option/__init__.py | 66 +
.../components/antd/skeleton/__init__.py | 75 +
.../antd/skeleton/avatar/__init__.py | 62 +
.../antd/skeleton/button/__init__.py | 64 +
.../antd/skeleton/image/__init__.py | 55 +
.../antd/skeleton/input/__init__.py | 59 +
.../components/antd/skeleton/node/__init__.py | 57 +
.../components/antd/slider/__init__.py | 125 +
.../components/antd/slider/mark/__init__.py | 66 +
.../components/antd/space/__init__.py | 97 +
.../components/antd/space/compact/__init__.py | 76 +
.../components/antd/spin/__init__.py | 74 +
.../components/antd/splitter/__init__.py | 83 +
.../antd/splitter/panel/__init__.py | 81 +
.../components/antd/statistic/__init__.py | 79 +
.../antd/statistic/countdown/__init__.py | 79 +
.../components/antd/steps/__init__.py | 88 +
.../components/antd/steps/item/__init__.py | 68 +
.../components/antd/switch/__init__.py | 90 +
.../components/antd/table/__init__.py | 144 +
.../components/antd/table/column/__init__.py | 132 +
.../antd/table/column_group/__init__.py | 58 +
.../components/antd/table/constants.py | 5 +
.../antd/table/expandable/__init__.py | 93 +
.../antd/table/row_selection/__init__.py | 109 +
.../table/row_selection/selection/__init__.py | 72 +
.../components/antd/tabs/__init__.py | 118 +
.../components/antd/tabs/item/__init__.py | 70 +
.../components/antd/tag/__init__.py | 77 +
.../antd/tag/checkable_tag/__init__.py | 72 +
.../components/antd/time_picker/__init__.py | 145 +
.../antd/time_picker/range_picker/__init__.py | 162 +
.../components/antd/timeline/__init__.py | 70 +
.../components/antd/timeline/item/__init__.py | 64 +
.../components/antd/tooltip/__init__.py | 114 +
.../components/antd/tour/__init__.py | 102 +
.../components/antd/tour/step/__init__.py | 99 +
.../components/antd/transfer/__init__.py | 139 +
.../components/antd/tree/__init__.py | 166 +
.../antd/tree/directory_tree/__init__.py | 165 +
.../antd/tree/tree_node/__init__.py | 72 +
.../components/antd/tree_select/__init__.py | 204 +
.../antd/tree_select/tree_node/__init__.py | 72 +
.../components/antd/typography/__init__.py | 11 +
.../antd/typography/link/__init__.py | 144 +
.../antd/typography/paragraph/__init__.py | 155 +
.../antd/typography/text/__init__.py | 154 +
.../antd/typography/title/__init__.py | 155 +
.../components/antd/upload/__init__.py | 205 +
.../antd/upload/dragger/__init__.py | 153 +
.../components/antd/watermark/__init__.py | 73 +
.../components/base/__init__.py | 8 +
.../components/base/application/__init__.py | 106 +
.../components/base/div/__init__.py | 93 +
.../components/base/each/__init__.py | 72 +
.../components/base/filter/__init__.py | 44 +
.../components/base/fragment/__init__.py | 48 +
.../components/base/slot/__init__.py | 51 +
.../components/base/span/__init__.py | 92 +
.../components/base/text/__init__.py | 62 +
.../{ => legacy}/Chatbot/__init__.py | 5 +-
.../Chatbot/llm_thinking_presets.py | 0
.../components/{ => legacy}/Flow/__init__.py | 4 +-
.../components/{ => legacy}/Flow/edge.py | 0
.../components/{ => legacy}/Flow/node.py | 0
.../{ => legacy}/Flow/node_schema.py | 0
.../{ => legacy}/Lifecycle/__init__.py | 7 +-
.../{ => legacy}/Markdown/__init__.py | 5 +-
.../{ => legacy}/MultimodalInput/__init__.py | 4 +-
.../{ => legacy}/WaterfallGallery/__init__.py | 4 +-
.../components/legacy/__init__.py | 6 +
.../utils/{ => dev}/__init__.py | 6 +-
.../modelscope_studio/utils/dev/component.py | 150 +
.../utils/{ => dev}/process_links.py | 0
.../utils/dev/resolve_frontend_dir.py | 15 +
backend/modelscope_studio/version.py | 2 +-
config/changelog/CHANGELOG.md | 24 +
config/changelog/package.json | 12 +-
config/lint-config/CHANGELOG.md | 24 +
config/lint-config/configs/eslint/basic.mjs | 3 +-
config/lint-config/configs/eslint/react.mjs | 2 +-
config/lint-config/configs/eslint/svelte.mjs | 3 +-
.../lint-config/configs/eslint/typescript.mjs | 16 +-
config/lint-config/eslint.mjs | 2 +-
config/lint-config/package.json | 30 +-
docs/Dockerfile | 15 -
docs/README-zh_CN.md | 49 +-
docs/README.md | 62 +-
docs/api/app.py | 2 +-
docs/app.py | 219 +-
docs/components/WaterfallGallery/app.py | 6 -
docs/components/antd/button/README-zh_CN.md | 7 +
docs/components/antd/button/README.md | 7 +
.../{Chatbot => antd/button}/app.py | 2 +-
docs/components/antd/button/demos/basic.py | 26 +
docs/components/antd/divider/README-zh_CN.md | 7 +
docs/components/antd/divider/README.md | 7 +
docs/components/{Flow => antd/divider}/app.py | 2 +-
docs/components/antd/divider/demos/basic.py | 29 +
.../antd/float_button/README-zh_CN.md | 7 +
docs/components/antd/float_button/README.md | 7 +
.../{Lifecycle => antd/float_button}/app.py | 2 +-
.../antd/float_button/demos/basic.py | 30 +
docs/components/antd/icon/README-zh_CN.md | 9 +
docs/components/antd/icon/README.md | 9 +
.../{MultimodalInput => antd/icon}/app.py | 2 +-
docs/components/antd/icon/demos/basic.py | 20 +
docs/components/antd/icon/demos/iconfont.py | 22 +
docs/components/antd/overview/README-zh_CN.md | 73 +
docs/components/antd/overview/README.md | 73 +
docs/components/antd/overview/app.py | 6 +
.../demos/integrate_other_components.py | 17 +
.../antd/overview/demos/limit_event.py | 18 +
.../antd/overview/demos/limit_function.py | 14 +
.../demos/limit_function_with_event.py | 21 +
.../antd/overview/demos/limit_react_node.py | 22 +
.../limit_react_node_function_by_function.py | 75 +
.../limit_react_node_function_by_slot.py | 15 +
.../antd/overview/demos/quick_start.py | 12 +
.../antd/typography/README-zh_CN.md | 7 +
docs/components/antd/typography/README.md | 7 +
docs/components/antd/typography/app.py | 6 +
.../components/antd/typography/demos/basic.py | 23 +
.../base/application/README-zh_CN.md | 20 +
docs/components/base/application/README.md | 20 +
docs/components/base/application/app.py | 6 +
.../base/application/demos/basic.py | 14 +
.../base/application/demos/custom_event.py | 20 +
.../application/demos/language_adaptation.py | 39 +
.../application/demos/theme_adaptation.py | 34 +
docs/components/base/div/README-zh_CN.md | 7 +
docs/components/base/div/README.md | 7 +
docs/components/base/div/app.py | 6 +
docs/components/base/div/demos/basic.py | 12 +
docs/components/base/each/README-zh_CN.md | 27 +
docs/components/base/each/README.md | 27 +
docs/components/base/each/app.py | 6 +
docs/components/base/each/demos/basic.py | 35 +
.../components/base/each/demos/use_as_item.py | 69 +
.../base/each/demos/use_context_value.py | 69 +
docs/components/base/filter/README-zh_CN.md | 21 +
docs/components/base/filter/README.md | 21 +
docs/components/base/filter/app.py | 6 +
docs/components/base/filter/demos/basic.py | 20 +
.../base/filter/demos/use_as_item.py | 27 +
.../base/filter/demos/use_params_mapping.py | 26 +
docs/components/base/fragment/README-zh_CN.md | 9 +
docs/components/base/fragment/README.md | 9 +
docs/components/base/fragment/app.py | 6 +
docs/components/base/fragment/demos/basic.py | 22 +
docs/components/base/slot/README-zh_CN.md | 16 +
docs/components/base/slot/README.md | 16 +
docs/components/base/slot/app.py | 6 +
docs/components/base/slot/demos/basic.py | 23 +
docs/components/base/span/README-zh_CN.md | 7 +
docs/components/base/span/README.md | 7 +
docs/components/base/span/app.py | 6 +
docs/components/base/span/demos/basic.py | 12 +
docs/components/base/text/README-zh_CN.md | 7 +
docs/components/base/text/README.md | 7 +
docs/components/base/text/app.py | 6 +
docs/components/base/text/demos/basic.py | 11 +
.../{ => legacy}/Chatbot/README-zh_CN.md | 2 +-
.../components/{ => legacy}/Chatbot/README.md | 2 +-
docs/components/legacy/Chatbot/app.py | 6 +
.../{ => legacy}/Chatbot/demos/accordion.py | 3 +-
.../{ => legacy}/Chatbot/demos/basic.py | 0
.../{ => legacy}/Chatbot/demos/chart.py | 0
.../Chatbot/demos/message_config.py | 0
.../{ => legacy}/Chatbot/demos/multi_bots.py | 0
.../{ => legacy}/Chatbot/demos/multimodal.py | 0
.../{ => legacy}/Chatbot/demos/select-box.py | 4 +-
docs/components/{ => legacy}/Docs.py | 6 +-
.../{ => legacy}/Flow/README-zh_CN.md | 0
docs/components/{ => legacy}/Flow/README.md | 0
docs/components/legacy/Flow/app.py | 6 +
.../{ => legacy}/Flow/define_schema-zh_CN.md | 0
.../{ => legacy}/Flow/define_schema.md | 0
.../{ => legacy}/Flow/demos/basic.py | 2 +-
.../Flow/demos/component_options.py | 3 +-
.../Flow/demos/custom_node_type.py | 6 +-
.../Flow/schema/agents_schema.json | 0
.../{ => legacy}/Flow/schema/agents_schema.py | 2 +-
.../{ => legacy}/Lifecycle/README-zh_CN.md | 0
.../{ => legacy}/Lifecycle/README.md | 0
docs/components/legacy/Lifecycle/app.py | 6 +
.../{ => legacy}/Lifecycle/demos/basic.py | 0
.../Lifecycle/demos/language_adaptation.py | 0
.../Lifecycle/demos/theme_adaptation.py | 0
.../{ => legacy}/Markdown/README-zh_CN.md | 0
.../{ => legacy}/Markdown/README.md | 0
docs/components/{ => legacy}/Markdown/app.py | 2 +-
.../Markdown/custom_tags/accordion-zh_CN.md | 0
.../Markdown/custom_tags/accordion.md | 0
.../Markdown/custom_tags/chart-zh_CN.md | 0
.../Markdown/custom_tags/chart.md | 0
.../Markdown/custom_tags/select-box-zh_CN.md | 0
.../Markdown/custom_tags/select-box.md | 0
.../{ => legacy}/Markdown/demos/accordion.py | 2 +-
.../{ => legacy}/Markdown/demos/basic.py | 0
.../{ => legacy}/Markdown/demos/chart.py | 0
.../{ => legacy}/Markdown/demos/custom-tag.py | 0
.../Markdown/demos/custom-tag2.py | 0
.../Markdown/demos/custom-tag3.py | 0
.../Markdown/demos/custom-tag4.py | 0
.../custom_tags/accordion/accordion-title.py | 0
.../demos/custom_tags/accordion/basic.py | 0
.../Markdown/demos/custom_tags/chart/basic.py | 0
.../demos/custom_tags/select-box/basic.py | 4 +-
.../custom_tags/select-box/card_shape.py | 4 +-
.../select-box/card_shape_width_auto.py | 0
.../custom_tags/select-box/python_events.py | 0
.../{ => legacy}/Markdown/demos/multimodal.py | 0
.../{ => legacy}/Markdown/demos/select-box.py | 4 +-
.../MultimodalInput/README-zh_CN.md | 0
.../{ => legacy}/MultimodalInput/README.md | 0
docs/components/legacy/MultimodalInput/app.py | 6 +
.../MultimodalInput/demos/basic.py | 0
.../MultimodalInput/demos/config_buttons.py | 0
.../MultimodalInput/demos/upload_sources.py | 0
.../MultimodalInput/demos/with_chatbot.py | 0
docs/components/legacy/README-zh_CN.md | 33 +
docs/components/legacy/README.md | 33 +
.../WaterfallGallery/README-zh_CN.md | 0
.../{ => legacy}/WaterfallGallery/README.md | 0
.../components/legacy/WaterfallGallery/app.py | 6 +
.../WaterfallGallery/demos/basic.py | 0
.../demos/like_click_feedback.py | 0
.../WaterfallGallery/demos/load_more.py | 0
.../demos/responsive_columns.py | 0
docs/components/legacy/app.py | 35 +
.../components/{ => legacy}/parse_markdown.py | 0
.../{ => legacy}/resources/audio.wav | Bin
.../{ => legacy}/resources/bot.jpeg | Bin
.../custom_components/custom_select.js | 0
.../components/{ => legacy}/resources/dog.mp4 | Bin
.../{ => legacy}/resources/image-bot.jpeg | Bin
.../{ => legacy}/resources/modelscope.svg | 0
.../{ => legacy}/resources/music-bot.jpeg | Bin
.../{ => legacy}/resources/screen.jpeg | Bin
.../{ => legacy}/resources/user.jpeg | Bin
docs/components/{ => legacy}/tab-link.js | 0
docs/demos/example.py | 12 +
docs/helper/Docs.py | 128 +
docs/helper/Site.py | 197 +
docs/helper/env.py | 3 +
docs/helper/parse_markdown.py | 81 +
docs/legacy_app.py | 6 +
docs/requirements.txt | 2 +-
docs/resources/gradio.png | Bin 0 -> 52484 bytes
docs/resources/modelscope.png | Bin 0 -> 9547 bytes
eslint.config.mjs | 2 +-
fixtures.d.ts | 8 -
frontend/CHANGELOG.md | 38 +-
frontend/Chatbot/gradio.config.js | 6 -
frontend/Chatbot/package.json | 27 -
frontend/Flow/gradio.config.js | 6 -
frontend/Flow/package.json | 30 -
frontend/Flow/schema.ts | 1 -
frontend/Lifecycle/CHANGELOG.md | 27 -
frontend/Lifecycle/package.json | 21 -
frontend/Markdown/gradio.config.js | 6 -
frontend/Markdown/package.json | 25 -
frontend/MultimodalInput/gradio.config.js | 6 -
frontend/MultimodalInput/package.json | 29 -
frontend/WaterfallGallery/CHANGELOG.md | 57 -
frontend/WaterfallGallery/gradio.config.js | 6 -
frontend/WaterfallGallery/package.json | 28 -
frontend/antd/CHANGELOG.md | 25 +
frontend/antd/affix/Index.svelte | 78 +
frontend/antd/affix/affix.tsx | 13 +
frontend/antd/affix/gradio.config.js | 3 +
frontend/antd/affix/package.json | 14 +
frontend/antd/alert/Index.svelte | 73 +
frontend/antd/alert/alert.tsx | 40 +
.../antd/alert/error-boundary/Index.svelte | 78 +
.../error-boundary/alert.error-boundary.tsx | 27 +
.../alert/error-boundary/gradio.config.js | 3 +
.../antd/alert/error-boundary/package.json | 14 +
frontend/antd/alert/gradio.config.js | 3 +
frontend/antd/alert/package.json | 14 +
frontend/antd/anchor/Index.svelte | 77 +
frontend/antd/anchor/anchor.tsx | 45 +
frontend/antd/anchor/context.ts | 6 +
frontend/antd/anchor/gradio.config.js | 3 +
frontend/antd/anchor/item/Index.svelte | 86 +
frontend/antd/anchor/item/gradio.config.js | 3 +
frontend/antd/anchor/item/package.json | 14 +
frontend/antd/anchor/package.json | 14 +
frontend/antd/auto-complete/Index.svelte | 89 +
frontend/antd/auto-complete/auto-complete.tsx | 127 +
frontend/antd/auto-complete/context.ts | 6 +
frontend/antd/auto-complete/gradio.config.js | 3 +
.../antd/auto-complete/option/Index.svelte | 94 +
.../auto-complete/option/gradio.config.js | 3 +
.../antd/auto-complete/option/package.json | 14 +
frontend/antd/auto-complete/package.json | 14 +
frontend/antd/avatar/Index.svelte | 87 +
frontend/antd/avatar/avatar.tsx | 23 +
frontend/antd/avatar/gradio.config.js | 3 +
frontend/antd/avatar/group/Index.svelte | 74 +
frontend/antd/avatar/group/avatar.group.tsx | 44 +
frontend/antd/avatar/group/gradio.config.js | 3 +
frontend/antd/avatar/group/package.json | 14 +
frontend/antd/avatar/package.json | 14 +
frontend/antd/badge/Index.svelte | 80 +
frontend/antd/badge/badge.tsx | 20 +
frontend/antd/badge/gradio.config.js | 3 +
frontend/antd/badge/package.json | 14 +
frontend/antd/badge/ribbon/Index.svelte | 77 +
frontend/antd/badge/ribbon/badge.ribbon.tsx | 21 +
frontend/antd/badge/ribbon/gradio.config.js | 3 +
frontend/antd/badge/ribbon/package.json | 14 +
frontend/antd/breadcrumb/Index.svelte | 83 +
frontend/antd/breadcrumb/breadcrumb.tsx | 51 +
frontend/antd/breadcrumb/context.ts | 6 +
frontend/antd/breadcrumb/gradio.config.js | 3 +
.../breadcrumb/item/BreadcrumbItem.svelte | 173 +
frontend/antd/breadcrumb/item/Index.svelte | 42 +
.../antd/breadcrumb/item/gradio.config.js | 3 +
frontend/antd/breadcrumb/item/package.json | 14 +
frontend/antd/breadcrumb/package.json | 14 +
frontend/antd/button/Index.svelte | 86 +
frontend/antd/button/button.tsx | 17 +
frontend/antd/button/gradio.config.js | 3 +
frontend/antd/button/group/Index.svelte | 74 +
frontend/antd/button/group/button.group.less | 20 +
frontend/antd/button/group/button.group.tsx | 26 +
frontend/antd/button/group/gradio.config.js | 3 +
frontend/antd/button/group/package.json | 14 +
frontend/antd/button/package.json | 14 +
frontend/antd/calendar/Index.svelte | 83 +
frontend/antd/calendar/calendar.tsx | 96 +
frontend/antd/calendar/gradio.config.js | 3 +
frontend/antd/calendar/package.json | 14 +
frontend/antd/card/Index.svelte | 68 +
frontend/antd/card/card.tsx | 41 +
frontend/antd/card/gradio.config.js | 3 +
frontend/antd/card/grid/Index.svelte | 68 +
frontend/antd/card/grid/card.grid.tsx | 6 +
frontend/antd/card/grid/gradio.config.js | 3 +
frontend/antd/card/grid/package.json | 14 +
frontend/antd/card/meta/Index.svelte | 70 +
frontend/antd/card/meta/card.meta.tsx | 27 +
frontend/antd/card/meta/gradio.config.js | 3 +
frontend/antd/card/meta/package.json | 14 +
frontend/antd/card/package.json | 14 +
frontend/antd/carousel/Index.svelte | 73 +
frontend/antd/carousel/carousel.tsx | 30 +
frontend/antd/carousel/gradio.config.js | 3 +
frontend/antd/carousel/package.json | 14 +
frontend/antd/cascader/Index.svelte | 89 +
frontend/antd/cascader/cascader.tsx | 190 +
frontend/antd/cascader/context.ts | 6 +
frontend/antd/cascader/gradio.config.js | 3 +
frontend/antd/cascader/option/Index.svelte | 90 +
.../antd/cascader/option/gradio.config.js | 3 +
frontend/antd/cascader/option/package.json | 14 +
frontend/antd/cascader/package.json | 14 +
frontend/antd/cascader/panel/Index.svelte | 85 +
.../antd/cascader/panel/cascader.panel.tsx | 72 +
frontend/antd/cascader/panel/gradio.config.js | 3 +
frontend/antd/cascader/panel/package.json | 14 +
frontend/antd/checkbox/Index.svelte | 79 +
frontend/antd/checkbox/checkbox.tsx | 21 +
frontend/antd/checkbox/context.ts | 6 +
frontend/antd/checkbox/gradio.config.js | 3 +
frontend/antd/checkbox/group/Index.svelte | 85 +
.../antd/checkbox/group/checkbox.group.tsx | 47 +
frontend/antd/checkbox/group/gradio.config.js | 3 +
.../antd/checkbox/group/option/Index.svelte | 95 +
.../checkbox/group/option/gradio.config.js | 3 +
.../antd/checkbox/group/option/package.json | 14 +
frontend/antd/checkbox/group/package.json | 14 +
frontend/antd/checkbox/package.json | 14 +
frontend/antd/collapse/Index.svelte | 83 +
frontend/antd/collapse/collapse.tsx | 58 +
frontend/antd/collapse/context.ts | 6 +
frontend/antd/collapse/gradio.config.js | 3 +
frontend/antd/collapse/item/Index.svelte | 93 +
frontend/antd/collapse/item/gradio.config.js | 3 +
frontend/antd/collapse/item/package.json | 14 +
frontend/antd/collapse/package.json | 14 +
frontend/antd/color-picker/Index.svelte | 91 +
frontend/antd/color-picker/color-picker.tsx | 84 +
frontend/antd/color-picker/context.ts | 6 +
frontend/antd/color-picker/gradio.config.js | 3 +
frontend/antd/color-picker/package.json | 14 +
.../antd/color-picker/preset/Index.svelte | 95 +
.../antd/color-picker/preset/gradio.config.js | 3 +
.../antd/color-picker/preset/package.json | 14 +
frontend/antd/config-provider/Index.svelte | 70 +
.../antd/config-provider/config-provider.tsx | 139 +
.../antd/config-provider/gradio.config.js | 3 +
frontend/antd/config-provider/locales.ts | 74 +
frontend/antd/config-provider/package.json | 14 +
frontend/antd/date-picker/Index.svelte | 88 +
frontend/antd/date-picker/context.ts | 6 +
frontend/antd/date-picker/date-picker.tsx | 225 +
frontend/antd/date-picker/gradio.config.js | 3 +
frontend/antd/date-picker/package.json | 14 +
frontend/antd/date-picker/preset/Index.svelte | 91 +
.../antd/date-picker/preset/gradio.config.js | 3 +
frontend/antd/date-picker/preset/package.json | 14 +
.../date-picker/range-picker/Index.svelte | 93 +
.../range-picker/date-picker.range-picker.tsx | 241 +
.../date-picker/range-picker/gradio.config.js | 3 +
.../date-picker/range-picker/package.json | 14 +
frontend/antd/descriptions/Index.svelte | 81 +
frontend/antd/descriptions/context.ts | 6 +
frontend/antd/descriptions/descriptions.tsx | 37 +
frontend/antd/descriptions/gradio.config.js | 3 +
frontend/antd/descriptions/item/Index.svelte | 93 +
.../antd/descriptions/item/gradio.config.js | 3 +
frontend/antd/descriptions/item/package.json | 14 +
frontend/antd/descriptions/package.json | 14 +
frontend/antd/divider/Index.svelte | 86 +
frontend/antd/divider/divider.tsx | 10 +
frontend/antd/divider/gradio.config.js | 3 +
frontend/antd/divider/package.json | 14 +
frontend/antd/drawer/Index.svelte | 79 +
frontend/antd/drawer/drawer.tsx | 53 +
frontend/antd/drawer/gradio.config.js | 3 +
frontend/antd/drawer/package.json | 14 +
frontend/antd/dropdown/Index.svelte | 82 +
frontend/antd/dropdown/button/Index.svelte | 92 +
.../antd/dropdown/button/dropdown.button.tsx | 85 +
.../antd/dropdown/button/gradio.config.js | 3 +
frontend/antd/dropdown/button/package.json | 14 +
frontend/antd/dropdown/dropdown.tsx | 82 +
frontend/antd/dropdown/gradio.config.js | 3 +
frontend/antd/dropdown/package.json | 14 +
frontend/antd/empty/Index.svelte | 73 +
frontend/antd/empty/empty.tsx | 28 +
frontend/antd/empty/gradio.config.js | 3 +
frontend/antd/empty/package.json | 14 +
frontend/antd/flex/Index.svelte | 73 +
frontend/antd/flex/flex.tsx | 8 +
frontend/antd/flex/gradio.config.js | 3 +
frontend/antd/flex/package.json | 14 +
frontend/antd/float-button/Index.svelte | 75 +
.../antd/float-button/back-top/Index.svelte | 81 +
.../back-top/float-button.back-top.tsx | 46 +
.../float-button/back-top/gradio.config.js | 3 +
.../antd/float-button/back-top/package.json | 14 +
frontend/antd/float-button/float-button.tsx | 45 +
frontend/antd/float-button/gradio.config.js | 3 +
frontend/antd/float-button/group/Index.svelte | 83 +
.../group/float-button.group.less | 30 +
.../float-button/group/float-button.group.tsx | 69 +
.../antd/float-button/group/gradio.config.js | 3 +
frontend/antd/float-button/group/package.json | 14 +
frontend/antd/float-button/package.json | 14 +
frontend/antd/form/Index.svelte | 90 +
frontend/antd/form/context.ts | 7 +
frontend/antd/form/form.tsx | 58 +
frontend/antd/form/gradio.config.js | 3 +
frontend/antd/form/item/Index.svelte | 80 +
frontend/antd/form/item/form.item.tsx | 130 +
frontend/antd/form/item/gradio.config.js | 3 +
frontend/antd/form/item/package.json | 14 +
frontend/antd/form/item/rule/Index.svelte | 94 +
frontend/antd/form/item/rule/global.css | 3 +
frontend/antd/form/item/rule/gradio.config.js | 3 +
frontend/antd/form/item/rule/package.json | 14 +
frontend/antd/form/package.json | 14 +
frontend/antd/grid/col/Index.svelte | 83 +
frontend/antd/grid/col/gradio.config.js | 3 +
frontend/antd/grid/col/package.json | 14 +
frontend/antd/grid/context.ts | 6 +
frontend/antd/grid/row/Index.svelte | 77 +
frontend/antd/grid/row/gradio.config.js | 3 +
frontend/antd/grid/row/package.json | 14 +
frontend/antd/grid/row/row.tsx | 30 +
frontend/antd/icon/Index.svelte | 77 +
frontend/antd/icon/gradio.config.js | 3 +
frontend/antd/icon/icon.tsx | 26 +
.../antd/icon/iconfont-provider/Index.svelte | 61 +
.../antd/icon/iconfont-provider/context.ts | 37 +
.../icon/iconfont-provider/create-iconfont.ts | 3 +
.../icon/iconfont-provider/gradio.config.js | 3 +
.../antd/icon/iconfont-provider/package.json | 14 +
frontend/antd/icon/package.json | 14 +
frontend/antd/image/Index.svelte | 92 +
frontend/antd/image/gradio.config.js | 3 +
frontend/antd/image/image.tsx | 90 +
frontend/antd/image/package.json | 14 +
.../antd/image/preview-group/Index.svelte | 82 +
.../antd/image/preview-group/gradio.config.js | 3 +
.../preview-group/image.preview-group.tsx | 54 +
.../antd/image/preview-group/package.json | 14 +
frontend/antd/input-number/Index.svelte | 79 +
frontend/antd/input-number/gradio.config.js | 3 +
frontend/antd/input-number/input-number.tsx | 91 +
frontend/antd/input-number/package.json | 14 +
frontend/antd/input/Index.svelte | 84 +
frontend/antd/input/gradio.config.js | 3 +
frontend/antd/input/input.tsx | 122 +
frontend/antd/input/otp/Index.svelte | 77 +
frontend/antd/input/otp/gradio.config.js | 3 +
frontend/antd/input/otp/input.otp.tsx | 31 +
frontend/antd/input/otp/package.json | 14 +
frontend/antd/input/package.json | 14 +
frontend/antd/input/password/Index.svelte | 89 +
frontend/antd/input/password/gradio.config.js | 3 +
.../antd/input/password/input.password.tsx | 133 +
frontend/antd/input/password/package.json | 14 +
frontend/antd/input/search/Index.svelte | 87 +
frontend/antd/input/search/gradio.config.js | 3 +
frontend/antd/input/search/input.search.tsx | 129 +
frontend/antd/input/search/package.json | 14 +
frontend/antd/input/textarea/Index.svelte | 89 +
frontend/antd/input/textarea/gradio.config.js | 3 +
.../antd/input/textarea/input.textarea.tsx | 95 +
frontend/antd/input/textarea/package.json | 14 +
frontend/antd/layout/Base.svelte | 74 +
frontend/antd/layout/Index.svelte | 10 +
frontend/antd/layout/content/Index.svelte | 10 +
frontend/antd/layout/content/gradio.config.js | 3 +
frontend/antd/layout/content/package.json | 14 +
frontend/antd/layout/footer/Index.svelte | 10 +
frontend/antd/layout/footer/gradio.config.js | 3 +
frontend/antd/layout/footer/package.json | 14 +
frontend/antd/layout/gradio.config.js | 3 +
frontend/antd/layout/header/Index.svelte | 10 +
frontend/antd/layout/header/gradio.config.js | 3 +
frontend/antd/layout/header/package.json | 14 +
frontend/antd/layout/layout.base.tsx | 39 +
frontend/antd/layout/package.json | 14 +
frontend/antd/layout/sider/Index.svelte | 74 +
frontend/antd/layout/sider/gradio.config.js | 3 +
frontend/antd/layout/sider/layout.sider.tsx | 25 +
frontend/antd/layout/sider/package.json | 14 +
frontend/antd/list/Index.svelte | 78 +
frontend/antd/list/gradio.config.js | 3 +
frontend/antd/list/item/Index.svelte | 68 +
frontend/antd/list/item/gradio.config.js | 3 +
frontend/antd/list/item/list.item.tsx | 28 +
frontend/antd/list/item/meta/Index.svelte | 68 +
frontend/antd/list/item/meta/gradio.config.js | 3 +
.../antd/list/item/meta/list.item.meta.tsx | 28 +
frontend/antd/list/item/meta/package.json | 14 +
frontend/antd/list/item/package.json | 14 +
frontend/antd/list/list.tsx | 33 +
frontend/antd/list/package.json | 14 +
frontend/antd/mentions/Index.svelte | 83 +
frontend/antd/mentions/context.ts | 6 +
frontend/antd/mentions/gradio.config.js | 3 +
frontend/antd/mentions/mentions.tsx | 73 +
frontend/antd/mentions/option/Index.svelte | 99 +
.../antd/mentions/option/gradio.config.js | 3 +
frontend/antd/mentions/option/package.json | 14 +
frontend/antd/mentions/package.json | 14 +
frontend/antd/menu/Index.svelte | 82 +
frontend/antd/menu/context.ts | 6 +
frontend/antd/menu/gradio.config.js | 3 +
frontend/antd/menu/item/Index.svelte | 98 +
frontend/antd/menu/item/gradio.config.js | 3 +
frontend/antd/menu/item/package.json | 14 +
frontend/antd/menu/menu.less | 44 +
frontend/antd/menu/menu.tsx | 76 +
frontend/antd/menu/package.json | 14 +
frontend/antd/message/Index.svelte | 80 +
frontend/antd/message/gradio.config.js | 3 +
frontend/antd/message/message.tsx | 66 +
frontend/antd/message/package.json | 14 +
frontend/antd/modal/Index.svelte | 79 +
frontend/antd/modal/gradio.config.js | 3 +
frontend/antd/modal/modal.tsx | 104 +
frontend/antd/modal/package.json | 14 +
frontend/antd/notification/Index.svelte | 80 +
frontend/antd/notification/gradio.config.js | 3 +
frontend/antd/notification/notification.tsx | 80 +
frontend/antd/notification/package.json | 14 +
frontend/antd/package.json | 5 +
frontend/antd/pagination/Index.svelte | 84 +
frontend/antd/pagination/gradio.config.js | 3 +
frontend/antd/pagination/package.json | 14 +
frontend/antd/pagination/pagination.tsx | 60 +
frontend/antd/popconfirm/Index.svelte | 76 +
frontend/antd/popconfirm/gradio.config.js | 3 +
frontend/antd/popconfirm/package.json | 14 +
frontend/antd/popconfirm/popconfirm.tsx | 64 +
frontend/antd/popover/Index.svelte | 75 +
frontend/antd/popover/gradio.config.js | 3 +
frontend/antd/popover/package.json | 14 +
frontend/antd/popover/popover.tsx | 30 +
frontend/antd/progress/Index.svelte | 73 +
frontend/antd/progress/gradio.config.js | 3 +
frontend/antd/progress/package.json | 14 +
frontend/antd/progress/progress.tsx | 12 +
frontend/antd/qr-code/Index.svelte | 78 +
frontend/antd/qr-code/gradio.config.js | 3 +
frontend/antd/qr-code/package.json | 14 +
frontend/antd/qr-code/qr-code.tsx | 26 +
frontend/antd/radio/Index.svelte | 80 +
frontend/antd/radio/button/Index.svelte | 80 +
frontend/antd/radio/button/gradio.config.js | 3 +
frontend/antd/radio/button/package.json | 14 +
frontend/antd/radio/button/radio.button.tsx | 29 +
frontend/antd/radio/context.ts | 6 +
frontend/antd/radio/gradio.config.js | 3 +
frontend/antd/radio/group/Index.svelte | 88 +
frontend/antd/radio/group/gradio.config.js | 3 +
frontend/antd/radio/group/option/Index.svelte | 103 +
.../antd/radio/group/option/gradio.config.js | 3 +
frontend/antd/radio/group/option/package.json | 14 +
frontend/antd/radio/group/package.json | 14 +
frontend/antd/radio/group/radio.group.less | 20 +
frontend/antd/radio/group/radio.group.tsx | 53 +
frontend/antd/radio/package.json | 14 +
frontend/antd/radio/radio.tsx | 21 +
frontend/antd/rate/Index.svelte | 85 +
frontend/antd/rate/gradio.config.js | 3 +
frontend/antd/rate/package.json | 14 +
frontend/antd/rate/rate.tsx | 45 +
frontend/antd/result/Index.svelte | 73 +
frontend/antd/result/gradio.config.js | 3 +
frontend/antd/result/package.json | 14 +
frontend/antd/result/result.tsx | 23 +
frontend/antd/segmented/Index.svelte | 83 +
frontend/antd/segmented/context.ts | 6 +
frontend/antd/segmented/gradio.config.js | 3 +
frontend/antd/segmented/option/Index.svelte | 84 +
.../antd/segmented/option/gradio.config.js | 3 +
frontend/antd/segmented/option/package.json | 14 +
frontend/antd/segmented/package.json | 14 +
frontend/antd/segmented/segmented.tsx | 35 +
frontend/antd/select/Index.svelte | 89 +
frontend/antd/select/context.ts | 6 +
frontend/antd/select/gradio.config.js | 3 +
frontend/antd/select/option/Index.svelte | 103 +
frontend/antd/select/option/gradio.config.js | 3 +
frontend/antd/select/option/package.json | 14 +
frontend/antd/select/package.json | 14 +
frontend/antd/select/select.tsx | 168 +
frontend/antd/skeleton/Index.svelte | 73 +
frontend/antd/skeleton/avatar/Index.svelte | 75 +
.../antd/skeleton/avatar/gradio.config.js | 3 +
frontend/antd/skeleton/avatar/package.json | 14 +
.../antd/skeleton/avatar/skeleton.avatar.tsx | 8 +
frontend/antd/skeleton/button/Index.svelte | 75 +
.../antd/skeleton/button/gradio.config.js | 3 +
frontend/antd/skeleton/button/package.json | 14 +
.../antd/skeleton/button/skeleton.button.tsx | 8 +
frontend/antd/skeleton/gradio.config.js | 3 +
frontend/antd/skeleton/image/Index.svelte | 75 +
frontend/antd/skeleton/image/gradio.config.js | 3 +
frontend/antd/skeleton/image/package.json | 14 +
.../antd/skeleton/image/skeleton.image.tsx | 8 +
frontend/antd/skeleton/input/Index.svelte | 75 +
frontend/antd/skeleton/input/gradio.config.js | 3 +
frontend/antd/skeleton/input/package.json | 14 +
.../antd/skeleton/input/skeleton.input.tsx | 8 +
frontend/antd/skeleton/node/Index.svelte | 73 +
frontend/antd/skeleton/node/gradio.config.js | 3 +
frontend/antd/skeleton/node/package.json | 14 +
frontend/antd/skeleton/node/skeleton.node.tsx | 8 +
frontend/antd/skeleton/package.json | 14 +
frontend/antd/skeleton/skeleton.tsx | 6 +
frontend/antd/slider/Index.svelte | 89 +
frontend/antd/slider/context.ts | 6 +
frontend/antd/slider/gradio.config.js | 3 +
frontend/antd/slider/mark/Index.svelte | 94 +
frontend/antd/slider/mark/gradio.config.js | 3 +
frontend/antd/slider/mark/package.json | 14 +
frontend/antd/slider/package.json | 14 +
frontend/antd/slider/slider.tsx | 96 +
frontend/antd/space/Index.svelte | 72 +
frontend/antd/space/compact/Index.svelte | 73 +
frontend/antd/space/compact/gradio.config.js | 3 +
frontend/antd/space/compact/package.json | 14 +
frontend/antd/space/compact/space.compact.tsx | 23 +
frontend/antd/space/gradio.config.js | 3 +
frontend/antd/space/package.json | 14 +
frontend/antd/space/space.tsx | 28 +
frontend/antd/spin/Index.svelte | 73 +
frontend/antd/spin/gradio.config.js | 3 +
frontend/antd/spin/package.json | 14 +
frontend/antd/spin/spin.tsx | 23 +
frontend/antd/splitter/Index.svelte | 76 +
frontend/antd/splitter/context.ts | 6 +
frontend/antd/splitter/gradio.config.js | 3 +
frontend/antd/splitter/package.json | 14 +
frontend/antd/splitter/panel/Index.svelte | 86 +
frontend/antd/splitter/panel/gradio.config.js | 3 +
frontend/antd/splitter/panel/package.json | 14 +
frontend/antd/splitter/splitter.tsx | 32 +
frontend/antd/statistic/Index.svelte | 78 +
.../antd/statistic/countdown/Index.svelte | 76 +
.../antd/statistic/countdown/gradio.config.js | 3 +
.../antd/statistic/countdown/package.json | 14 +
.../countdown/statistic.countdown.tsx | 26 +
frontend/antd/statistic/gradio.config.js | 3 +
frontend/antd/statistic/package.json | 14 +
frontend/antd/statistic/statistic.tsx | 35 +
frontend/antd/steps/Index.svelte | 83 +
frontend/antd/steps/context.ts | 6 +
frontend/antd/steps/gradio.config.js | 3 +
frontend/antd/steps/item/Index.svelte | 76 +
frontend/antd/steps/item/gradio.config.js | 3 +
frontend/antd/steps/item/package.json | 14 +
frontend/antd/steps/package.json | 14 +
frontend/antd/steps/steps.tsx | 55 +
frontend/antd/switch/Index.svelte | 78 +
frontend/antd/switch/gradio.config.js | 3 +
frontend/antd/switch/package.json | 14 +
frontend/antd/switch/switch.tsx | 41 +
frontend/antd/table/Index.svelte | 92 +
frontend/antd/table/column-group/Index.svelte | 86 +
.../antd/table/column-group/gradio.config.js | 3 +
frontend/antd/table/column-group/package.json | 14 +
frontend/antd/table/column/Index.svelte | 183 +
frontend/antd/table/column/gradio.config.js | 3 +
frontend/antd/table/column/package.json | 14 +
frontend/antd/table/context.ts | 27 +
.../antd/table/expandable/Expandable.svelte | 119 +
frontend/antd/table/expandable/Index.svelte | 42 +
.../antd/table/expandable/gradio.config.js | 3 +
frontend/antd/table/expandable/package.json | 14 +
frontend/antd/table/gradio.config.js | 3 +
frontend/antd/table/package.json | 14 +
.../antd/table/row-selection/Index.svelte | 40 +
.../table/row-selection/RowSelection.svelte | 119 +
.../antd/table/row-selection/gradio.config.js | 3 +
.../antd/table/row-selection/package.json | 14 +
.../row-selection/selection/Index.svelte | 96 +
.../row-selection/selection/gradio.config.js | 3 +
.../row-selection/selection/package.json | 14 +
frontend/antd/table/table.tsx | 221 +
frontend/antd/tabs/Index.svelte | 82 +
frontend/antd/tabs/context.ts | 6 +
frontend/antd/tabs/gradio.config.js | 3 +
frontend/antd/tabs/item/Index.svelte | 85 +
frontend/antd/tabs/item/gradio.config.js | 3 +
frontend/antd/tabs/item/package.json | 14 +
frontend/antd/tabs/package.json | 14 +
frontend/antd/tabs/tabs.tsx | 119 +
frontend/antd/tag/Index.svelte | 83 +
frontend/antd/tag/checkable-tag/Index.svelte | 92 +
.../antd/tag/checkable-tag/gradio.config.js | 3 +
frontend/antd/tag/checkable-tag/package.json | 14 +
.../tag/checkable-tag/tag.checkable-tag.tsx | 21 +
frontend/antd/tag/gradio.config.js | 3 +
frontend/antd/tag/package.json | 14 +
frontend/antd/tag/tag.tsx | 24 +
frontend/antd/time-picker/Index.svelte | 84 +
frontend/antd/time-picker/gradio.config.js | 3 +
frontend/antd/time-picker/package.json | 14 +
.../time-picker/range-picker/Index.svelte | 88 +
.../time-picker/range-picker/gradio.config.js | 3 +
.../time-picker/range-picker/package.json | 14 +
.../range-picker/time-picker.range-picker.tsx | 213 +
frontend/antd/time-picker/time-picker.tsx | 201 +
frontend/antd/timeline/Index.svelte | 76 +
frontend/antd/timeline/context.ts | 6 +
frontend/antd/timeline/gradio.config.js | 3 +
frontend/antd/timeline/item/Index.svelte | 85 +
frontend/antd/timeline/item/gradio.config.js | 3 +
frontend/antd/timeline/item/package.json | 14 +
frontend/antd/timeline/package.json | 14 +
frontend/antd/timeline/timeline.tsx | 43 +
frontend/antd/tooltip/Index.svelte | 75 +
frontend/antd/tooltip/gradio.config.js | 3 +
frontend/antd/tooltip/package.json | 14 +
frontend/antd/tooltip/tooltip.tsx | 26 +
frontend/antd/tour/Index.svelte | 83 +
frontend/antd/tour/context.ts | 6 +
frontend/antd/tour/gradio.config.js | 3 +
frontend/antd/tour/package.json | 14 +
frontend/antd/tour/step/Index.svelte | 85 +
frontend/antd/tour/step/gradio.config.js | 3 +
frontend/antd/tour/step/package.json | 14 +
frontend/antd/tour/tour.tsx | 76 +
frontend/antd/transfer/Index.svelte | 89 +
frontend/antd/transfer/gradio.config.js | 3 +
frontend/antd/transfer/package.json | 14 +
frontend/antd/transfer/transfer.tsx | 105 +
frontend/antd/tree-select/Index.svelte | 88 +
frontend/antd/tree-select/context.ts | 6 +
frontend/antd/tree-select/gradio.config.js | 3 +
frontend/antd/tree-select/package.json | 14 +
.../antd/tree-select/tree-node/Index.svelte | 90 +
.../tree-select/tree-node/gradio.config.js | 3 +
.../antd/tree-select/tree-node/package.json | 14 +
frontend/antd/tree-select/tree-select.tsx | 133 +
frontend/antd/tree/Index.svelte | 82 +
frontend/antd/tree/context.ts | 6 +
.../antd/tree/directory-tree/Index.svelte | 84 +
.../antd/tree/directory-tree/gradio.config.js | 3 +
.../antd/tree/directory-tree/package.json | 14 +
frontend/antd/tree/gradio.config.js | 3 +
frontend/antd/tree/package.json | 14 +
frontend/antd/tree/tree-node/Index.svelte | 95 +
frontend/antd/tree/tree-node/gradio.config.js | 3 +
frontend/antd/tree/tree-node/package.json | 14 +
frontend/antd/tree/tree.tsx | 128 +
frontend/antd/typography/Base.svelte | 96 +
frontend/antd/typography/link/Index.svelte | 12 +
.../antd/typography/link/gradio.config.js | 3 +
frontend/antd/typography/link/package.json | 14 +
.../antd/typography/paragraph/Index.svelte | 12 +
.../typography/paragraph/gradio.config.js | 3 +
.../antd/typography/paragraph/package.json | 14 +
frontend/antd/typography/text/Index.svelte | 12 +
.../antd/typography/text/gradio.config.js | 3 +
frontend/antd/typography/text/package.json | 14 +
frontend/antd/typography/title/Index.svelte | 12 +
.../antd/typography/title/gradio.config.js | 3 +
frontend/antd/typography/title/package.json | 14 +
frontend/antd/typography/typography.base.tsx | 173 +
frontend/antd/upload/Index.svelte | 96 +
frontend/antd/upload/dragger/Index.svelte | 94 +
frontend/antd/upload/dragger/gradio.config.js | 3 +
frontend/antd/upload/dragger/package.json | 14 +
.../antd/upload/dragger/upload.dragger.tsx | 185 +
frontend/antd/upload/gradio.config.js | 3 +
frontend/antd/upload/package.json | 14 +
frontend/antd/upload/upload.tsx | 185 +
frontend/antd/watermark/Index.svelte | 76 +
frontend/antd/watermark/gradio.config.js | 3 +
frontend/antd/watermark/package.json | 14 +
frontend/antd/watermark/watermark.tsx | 5 +
frontend/base/CHANGELOG.md | 25 +
frontend/base/application/Application.svelte | 117 +
frontend/base/application/Index.svelte | 17 +
frontend/base/application/gradio.config.js | 3 +
frontend/base/application/package.json | 14 +
frontend/base/div/Index.svelte | 111 +
frontend/base/div/gradio.config.js | 3 +
frontend/base/div/package.json | 14 +
frontend/base/each/Each.svelte | 26 +
frontend/base/each/Index.svelte | 50 +
frontend/base/each/gradio.config.js | 3 +
frontend/base/each/package.json | 14 +
frontend/base/filter/Index.svelte | 60 +
frontend/base/filter/gradio.config.js | 3 +
frontend/base/filter/package.json | 14 +
frontend/base/fragment/Index.svelte | 40 +
frontend/base/fragment/ShowFragment.svelte | 15 +
frontend/base/fragment/fragment.tsx | 10 +
frontend/base/fragment/gradio.config.js | 3 +
frontend/base/fragment/package.json | 15 +
frontend/base/package.json | 5 +
frontend/base/slot/Index.svelte | 77 +
frontend/base/slot/gradio.config.js | 3 +
frontend/base/slot/package.json | 14 +
frontend/base/span/Index.svelte | 111 +
frontend/base/span/gradio.config.js | 3 +
frontend/base/span/package.json | 14 +
frontend/base/text/Index.svelte | 36 +
frontend/base/text/global.css | 3 +
frontend/base/text/gradio.config.js | 3 +
frontend/base/text/package.json | 14 +
frontend/compiled/package.json | 67 -
frontend/compiled/tsconfig.build.json | 26 -
frontend/compiled/tsconfig.json | 25 -
frontend/compiled/tsconfig.node.json | 11 -
frontend/compiled/vite.config.ts | 72 -
frontend/defineConfig.js | 18 +
frontend/fixtures.d.ts | 15 +
.../Chatbot/Awaited.svelte} | 6 +-
.../{Markdown => legacy/Chatbot}/CHANGELOG.md | 28 +-
frontend/legacy/Chatbot/Index.svelte | 15 +
frontend/legacy/Chatbot/gradio.config.js | 3 +
frontend/legacy/Chatbot/package.json | 24 +
.../Chatbot/shared/ChatBot.svelte | 4 +-
.../{ => legacy}/Chatbot/shared/Copy.svelte | 2 +-
.../Chatbot/shared/FlushingMarkdown.svelte | 2 +-
.../Chatbot/shared/LikeDislike.svelte | 0
.../Chatbot/shared/Pending.svelte | 0
.../Chatbot/shared/llm-thinking-presets.ts | 0
frontend/{ => legacy}/Chatbot/shared/utils.ts | 0
.../Flow/Awaited.svelte} | 4 +-
frontend/{ => legacy}/Flow/CHANGELOG.md | 26 +-
frontend/legacy/Flow/Index.svelte | 15 +
frontend/legacy/Flow/gradio.config.js | 3 +
frontend/legacy/Flow/package.json | 27 +
frontend/{ => legacy}/Flow/schema.json | 0
frontend/legacy/Flow/schema.ts | 1 +
frontend/{ => legacy}/Flow/shared/Flow.svelte | 4 +-
frontend/{ => legacy}/Flow/shared/utils.ts | 2 +-
frontend/legacy/Lifecycle/CHANGELOG.md | 43 +
frontend/legacy/Lifecycle/gradio.config.js | 3 +
frontend/{ => legacy}/Lifecycle/index.svelte | 0
frontend/legacy/Lifecycle/package.json | 22 +
.../{ => legacy}/Lifecycle/shared/utils.ts | 0
.../Markdown/Awaited.svelte} | 8 +-
.../{Chatbot => legacy/Markdown}/CHANGELOG.md | 28 +-
frontend/{ => legacy}/Markdown/Example.svelte | 5 +-
frontend/legacy/Markdown/Index.svelte | 15 +
frontend/legacy/Markdown/gradio.config.js | 3 +
frontend/legacy/Markdown/package.json | 28 +
.../Markdown/shared/Markdown.svelte | 2 +-
.../MultimodalInput/Awaited.svelte} | 4 +-
.../{ => legacy}/MultimodalInput/CHANGELOG.md | 28 +-
.../MultimodalInput/Example.svelte | 0
frontend/legacy/MultimodalInput/Index.svelte | 17 +
.../legacy/MultimodalInput/gradio.config.js | 3 +
frontend/legacy/MultimodalInput/package.json | 28 +
.../shared/AudioRecorder.svelte | 0
.../MultimodalInput/shared/FilePreview.svelte | 2 +-
.../MultimodalInput/shared/Input.svelte | 0
.../MultimodalInput/shared/Loader.svelte | 0
.../MultimodalInput/shared/RemoveIcon.svelte | 0
.../shared/SubmitButton.svelte | 0
.../shared/UploadButton.svelte | 0
.../MultimodalInput/shared/UploadIcon.svelte | 0
.../MultimodalInput/shared/Webcam.svelte | 0
.../MultimodalInput/shared/context.ts | 0
.../MultimodalInput/shared/global.d.ts | 0
.../MultimodalInput/shared/utils.ts | 0
frontend/legacy/WaterfallGallery/CHANGELOG.md | 59 +
.../WaterfallGallery/Index.svelte | 0
.../legacy/WaterfallGallery/gradio.config.js | 3 +
frontend/legacy/WaterfallGallery/package.json | 20 +
.../WaterfallGallery/shared/Dislike.svelte | 0
.../WaterfallGallery/shared/Gallery.svelte | 2 +-
.../WaterfallGallery/shared/Image.svelte | 0
.../shared/Waterfall/createWaterfall.ts | 0
.../shared/Waterfall/index.ts | 0
.../shared/Waterfall/layout.ts | 0
.../WaterfallGallery/shared/utils.ts | 0
frontend/{ => legacy}/compiled/CHANGELOG.md | 26 +-
.../compiled/components/FileView/index.svelte | 0
.../FileView/shared/FileView.svelte | 2 +-
.../compiled/components/Flow/index.svelte | 2 +-
.../compiled/components/Markdown/index.svelte | 2 +-
.../compiled/components/ReactComponent.svelte | 2 +-
frontend/{ => legacy}/compiled/global.d.ts | 0
frontend/{ => legacy}/compiled/index.ts | 2 +-
frontend/legacy/compiled/package.json | 43 +
.../compiled/src/ComponentConfigProvider.tsx | 0
.../compiled/src/FileView/Pdf.tsx | 0
.../compiled/src/FileView/hooks/usePreview.ts | 0
.../compiled/src/FileView/index.less | 0
.../compiled/src/FileView/index.tsx | 0
.../compiled/src/Flow/FlowContext.ts | 0
.../src/Flow/components/CustomComponent.tsx | 0
.../src/Flow/components/FileUpload.tsx | 0
.../Flow/components/FormListItemWrapper.tsx | 0
.../Flow/flow-components/ConnectionHandle.tsx | 0
.../Flow/flow-components/ConnectionLine.tsx | 0
.../src/Flow/flow-components/Controls.tsx | 0
.../src/Flow/flow-components/Edge.tsx | 0
.../src/Flow/flow-components/Node.tsx | 0
.../src/Flow/flow-components/Sidebar.tsx | 0
.../{ => legacy}/compiled/src/Flow/i18n.ts | 0
.../{ => legacy}/compiled/src/Flow/index.less | 0
.../{ => legacy}/compiled/src/Flow/index.tsx | 0
.../{ => legacy}/compiled/src/Flow/type.ts | 0
.../{ => legacy}/compiled/src/Flow/utils.ts | 2 +-
.../src/Markdown/components/Anchor.tsx | 0
.../src/Markdown/components/Audio.tsx | 0
.../compiled/src/Markdown/components/Code.tsx | 0
.../Markdown/components/CustomComponent.tsx | 0
.../src/Markdown/components/Heading.tsx | 0
.../src/Markdown/components/Image.tsx | 0
.../src/Markdown/components/Video.tsx | 0
.../Markdown/components/custom/Accordion.tsx | 0
.../src/Markdown/components/custom/Chart.tsx | 0
.../src/Markdown/components/custom/File.tsx | 0
.../components/custom/FlushingEnd.tsx | 0
.../Markdown/components/custom/SelectBox.tsx | 0
.../compiled/src/Markdown/context.ts | 0
.../src/Markdown/hooks/useCustomProps.ts | 0
.../compiled/src/Markdown/index.less | 0
.../compiled/src/Markdown/index.tsx | 0
.../compiled/src/Markdown/math.ts | 0
.../compiled/src/Markdown/react-markdown.d.ts | 0
.../rehype-Inline-code-property.ts | 0
.../rehype-plugins/rehype-sanitize/index.d.ts | 0
.../rehype-plugins/rehype-sanitize/index.js | 0
.../rehype-plugins/rehype-sanitize/schema.js | 0
.../remark-plugins/remark-directive-rehype.ts | 0
.../compiled/src/Markdown/type.ts | 0
.../compiled/src/defineComponent.tsx | 0
frontend/{ => legacy}/compiled/src/index.ts | 0
frontend/{ => legacy}/compiled/src/mount.tsx | 0
.../{ => legacy}/compiled/src/polyfills.ts | 0
.../src/shared/hooks/useCustomComponent.ts | 0
.../src/shared/hooks/useMemoizedEqualValue.ts | 0
.../compiled/src/shared/hooks/useRefValue.ts | 0
.../{ => legacy}/compiled/src/shared/index.ts | 0
.../{ => legacy}/compiled/src/shared/type.ts | 0
frontend/{ => legacy}/compiled/src/utils.ts | 2 +-
frontend/package.json | 48 +-
frontend/plugin.js | 164 +
frontend/shared/CHANGELOG.md | 39 -
frontend/shared/package.json | 13 -
frontend/svelte-preprocess-react/component.ts | 170 +
frontend/svelte-preprocess-react/context.ts | 16 +
.../events-polyfills.ts | 113 +
frontend/svelte-preprocess-react/index.ts | 8 +
frontend/svelte-preprocess-react/inject.ts | 95 +
.../internal/Bridge.ts | 95 +
.../svelte-preprocess-react/internal/Child.ts | 28 +
.../internal/ReactWrapper.svelte | 59 +
.../svelte-preprocess-react/internal/types.ts | 67 +
frontend/svelte-preprocess-react/polyfills.ts | 4 +
.../svelte-preprocess-react/react-slot.tsx | 183 +
frontend/svelte-preprocess-react/slot.ts | 238 +
frontend/svelte-preprocess-react/sveltify.ts | 88 +
frontend/svelte-preprocess-react/useStore.ts | 37 +
frontend/tsconfig.json | 7 +
frontend/utils/createFunction.ts | 11 +
frontend/utils/createItemsContext.tsx | 86 +
frontend/utils/hooks/useFunction.ts | 9 +
frontend/utils/hooks/useSlotsChildren.ts | 23 +
frontend/utils/hooks/useTargets.ts | 43 +
frontend/utils/hooks/useValueChange.ts | 28 +
frontend/utils/omitUndefinedProps.ts | 10 +
frontend/utils/renderItems.tsx | 79 +
frontend/utils/renderParamsSlot.tsx | 21 +
frontend/utils/renderSlot.tsx | 10 +
frontend/utils/styleObject2String.ts | 66 +
.../{shared/src/index.ts => utils/upload.ts} | 0
package.json | 46 +-
pnpm-lock.yaml | 6373 ++++++++---------
pnpm-workspace.yaml | 4 +-
pyproject.toml | 173 +-
tsconfig.json | 21 +-
1128 files changed, 44072 insertions(+), 4480 deletions(-)
create mode 100644 .changeset/five-actors-compete.md
create mode 100644 .changeset/fuzzy-goats-retire.md
create mode 100644 .changeset/lemon-laws-cross.md
create mode 100644 .changeset/pre.json
create mode 100644 .changeset/tough-walls-grab.md
delete mode 100644 backend/modelscope_studio/components/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/affix/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/alert/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/alert/error_boundary/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/anchor/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/anchor/item/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/auto_complete/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/auto_complete/option/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/avatar/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/avatar/group/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/badge/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/badge/ribbon/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/breadcrumb/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/breadcrumb/item/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/button/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/button/group/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/calendar/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/card/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/card/grid/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/card/meta/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/carousel/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/cascader/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/cascader/constants.py
create mode 100644 backend/modelscope_studio/components/antd/cascader/option/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/cascader/panel/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/checkbox/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/checkbox/group/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/checkbox/group/option/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/collapse/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/collapse/item/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/color_picker/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/color_picker/preset/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/components.py
create mode 100644 backend/modelscope_studio/components/antd/config_provider/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/date_picker/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/date_picker/preset/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/date_picker/range_picker/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/descriptions/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/descriptions/item/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/divider/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/drawer/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/dropdown/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/dropdown/button/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/empty/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/flex/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/float_button/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/float_button/back_top/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/float_button/group/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/form/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/form/item/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/form/item/rule/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/grid/col/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/grid/row/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/icon/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/icon/iconfont_provider/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/image/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/image/preview_group/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/input/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/input/otp/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/input/password/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/input/search/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/input/textarea/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/input_number/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/layout/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/layout/content/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/layout/footer/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/layout/header/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/layout/sider/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/list/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/list/item/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/list/item/meta/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/mentions/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/mentions/option/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/menu/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/menu/item/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/message/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/modal/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/notification/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/pagination/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/popconfirm/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/popover/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/progress/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/qr_code/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/radio/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/radio/button/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/radio/group/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/radio/group/option/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/rate/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/result/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/segmented/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/segmented/option/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/select/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/select/option/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/skeleton/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/skeleton/avatar/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/skeleton/button/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/skeleton/image/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/skeleton/input/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/skeleton/node/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/slider/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/slider/mark/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/space/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/space/compact/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/spin/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/splitter/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/splitter/panel/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/statistic/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/statistic/countdown/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/steps/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/steps/item/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/switch/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/table/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/table/column/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/table/column_group/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/table/constants.py
create mode 100644 backend/modelscope_studio/components/antd/table/expandable/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/table/row_selection/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/table/row_selection/selection/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/tabs/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/tabs/item/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/tag/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/tag/checkable_tag/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/time_picker/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/time_picker/range_picker/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/timeline/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/timeline/item/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/tooltip/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/tour/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/tour/step/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/transfer/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/tree/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/tree/directory_tree/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/tree/tree_node/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/tree_select/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/tree_select/tree_node/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/typography/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/typography/link/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/typography/paragraph/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/typography/text/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/typography/title/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/upload/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/upload/dragger/__init__.py
create mode 100644 backend/modelscope_studio/components/antd/watermark/__init__.py
create mode 100644 backend/modelscope_studio/components/base/__init__.py
create mode 100644 backend/modelscope_studio/components/base/application/__init__.py
create mode 100644 backend/modelscope_studio/components/base/div/__init__.py
create mode 100644 backend/modelscope_studio/components/base/each/__init__.py
create mode 100644 backend/modelscope_studio/components/base/filter/__init__.py
create mode 100644 backend/modelscope_studio/components/base/fragment/__init__.py
create mode 100644 backend/modelscope_studio/components/base/slot/__init__.py
create mode 100644 backend/modelscope_studio/components/base/span/__init__.py
create mode 100644 backend/modelscope_studio/components/base/text/__init__.py
rename backend/modelscope_studio/components/{ => legacy}/Chatbot/__init__.py (99%)
rename backend/modelscope_studio/components/{ => legacy}/Chatbot/llm_thinking_presets.py (100%)
rename backend/modelscope_studio/components/{ => legacy}/Flow/__init__.py (97%)
rename backend/modelscope_studio/components/{ => legacy}/Flow/edge.py (100%)
rename backend/modelscope_studio/components/{ => legacy}/Flow/node.py (100%)
rename backend/modelscope_studio/components/{ => legacy}/Flow/node_schema.py (100%)
rename backend/modelscope_studio/components/{ => legacy}/Lifecycle/__init__.py (93%)
rename backend/modelscope_studio/components/{ => legacy}/Markdown/__init__.py (97%)
rename backend/modelscope_studio/components/{ => legacy}/MultimodalInput/__init__.py (98%)
rename backend/modelscope_studio/components/{ => legacy}/WaterfallGallery/__init__.py (99%)
create mode 100644 backend/modelscope_studio/components/legacy/__init__.py
rename backend/modelscope_studio/utils/{ => dev}/__init__.py (69%)
create mode 100644 backend/modelscope_studio/utils/dev/component.py
rename backend/modelscope_studio/utils/{ => dev}/process_links.py (100%)
create mode 100644 backend/modelscope_studio/utils/dev/resolve_frontend_dir.py
delete mode 100644 docs/Dockerfile
delete mode 100644 docs/components/WaterfallGallery/app.py
create mode 100644 docs/components/antd/button/README-zh_CN.md
create mode 100644 docs/components/antd/button/README.md
rename docs/components/{Chatbot => antd/button}/app.py (72%)
create mode 100644 docs/components/antd/button/demos/basic.py
create mode 100644 docs/components/antd/divider/README-zh_CN.md
create mode 100644 docs/components/antd/divider/README.md
rename docs/components/{Flow => antd/divider}/app.py (72%)
create mode 100644 docs/components/antd/divider/demos/basic.py
create mode 100644 docs/components/antd/float_button/README-zh_CN.md
create mode 100644 docs/components/antd/float_button/README.md
rename docs/components/{Lifecycle => antd/float_button}/app.py (72%)
create mode 100644 docs/components/antd/float_button/demos/basic.py
create mode 100644 docs/components/antd/icon/README-zh_CN.md
create mode 100644 docs/components/antd/icon/README.md
rename docs/components/{MultimodalInput => antd/icon}/app.py (72%)
create mode 100644 docs/components/antd/icon/demos/basic.py
create mode 100644 docs/components/antd/icon/demos/iconfont.py
create mode 100644 docs/components/antd/overview/README-zh_CN.md
create mode 100644 docs/components/antd/overview/README.md
create mode 100644 docs/components/antd/overview/app.py
create mode 100644 docs/components/antd/overview/demos/integrate_other_components.py
create mode 100644 docs/components/antd/overview/demos/limit_event.py
create mode 100644 docs/components/antd/overview/demos/limit_function.py
create mode 100644 docs/components/antd/overview/demos/limit_function_with_event.py
create mode 100644 docs/components/antd/overview/demos/limit_react_node.py
create mode 100644 docs/components/antd/overview/demos/limit_react_node_function_by_function.py
create mode 100644 docs/components/antd/overview/demos/limit_react_node_function_by_slot.py
create mode 100644 docs/components/antd/overview/demos/quick_start.py
create mode 100644 docs/components/antd/typography/README-zh_CN.md
create mode 100644 docs/components/antd/typography/README.md
create mode 100644 docs/components/antd/typography/app.py
create mode 100644 docs/components/antd/typography/demos/basic.py
create mode 100644 docs/components/base/application/README-zh_CN.md
create mode 100644 docs/components/base/application/README.md
create mode 100644 docs/components/base/application/app.py
create mode 100644 docs/components/base/application/demos/basic.py
create mode 100644 docs/components/base/application/demos/custom_event.py
create mode 100644 docs/components/base/application/demos/language_adaptation.py
create mode 100644 docs/components/base/application/demos/theme_adaptation.py
create mode 100644 docs/components/base/div/README-zh_CN.md
create mode 100644 docs/components/base/div/README.md
create mode 100644 docs/components/base/div/app.py
create mode 100644 docs/components/base/div/demos/basic.py
create mode 100644 docs/components/base/each/README-zh_CN.md
create mode 100644 docs/components/base/each/README.md
create mode 100644 docs/components/base/each/app.py
create mode 100644 docs/components/base/each/demos/basic.py
create mode 100644 docs/components/base/each/demos/use_as_item.py
create mode 100644 docs/components/base/each/demos/use_context_value.py
create mode 100644 docs/components/base/filter/README-zh_CN.md
create mode 100644 docs/components/base/filter/README.md
create mode 100644 docs/components/base/filter/app.py
create mode 100644 docs/components/base/filter/demos/basic.py
create mode 100644 docs/components/base/filter/demos/use_as_item.py
create mode 100644 docs/components/base/filter/demos/use_params_mapping.py
create mode 100644 docs/components/base/fragment/README-zh_CN.md
create mode 100644 docs/components/base/fragment/README.md
create mode 100644 docs/components/base/fragment/app.py
create mode 100644 docs/components/base/fragment/demos/basic.py
create mode 100644 docs/components/base/slot/README-zh_CN.md
create mode 100644 docs/components/base/slot/README.md
create mode 100644 docs/components/base/slot/app.py
create mode 100644 docs/components/base/slot/demos/basic.py
create mode 100644 docs/components/base/span/README-zh_CN.md
create mode 100644 docs/components/base/span/README.md
create mode 100644 docs/components/base/span/app.py
create mode 100644 docs/components/base/span/demos/basic.py
create mode 100644 docs/components/base/text/README-zh_CN.md
create mode 100644 docs/components/base/text/README.md
create mode 100644 docs/components/base/text/app.py
create mode 100644 docs/components/base/text/demos/basic.py
rename docs/components/{ => legacy}/Chatbot/README-zh_CN.md (99%)
rename docs/components/{ => legacy}/Chatbot/README.md (99%)
create mode 100644 docs/components/legacy/Chatbot/app.py
rename docs/components/{ => legacy}/Chatbot/demos/accordion.py (93%)
rename docs/components/{ => legacy}/Chatbot/demos/basic.py (100%)
rename docs/components/{ => legacy}/Chatbot/demos/chart.py (100%)
rename docs/components/{ => legacy}/Chatbot/demos/message_config.py (100%)
rename docs/components/{ => legacy}/Chatbot/demos/multi_bots.py (100%)
rename docs/components/{ => legacy}/Chatbot/demos/multimodal.py (100%)
rename docs/components/{ => legacy}/Chatbot/demos/select-box.py (88%)
rename docs/components/{ => legacy}/Docs.py (97%)
rename docs/components/{ => legacy}/Flow/README-zh_CN.md (100%)
rename docs/components/{ => legacy}/Flow/README.md (100%)
create mode 100644 docs/components/legacy/Flow/app.py
rename docs/components/{ => legacy}/Flow/define_schema-zh_CN.md (100%)
rename docs/components/{ => legacy}/Flow/define_schema.md (100%)
rename docs/components/{ => legacy}/Flow/demos/basic.py (92%)
rename docs/components/{ => legacy}/Flow/demos/component_options.py (96%)
rename docs/components/{ => legacy}/Flow/demos/custom_node_type.py (87%)
rename docs/components/{ => legacy}/Flow/schema/agents_schema.json (100%)
rename docs/components/{ => legacy}/Flow/schema/agents_schema.py (97%)
rename docs/components/{ => legacy}/Lifecycle/README-zh_CN.md (100%)
rename docs/components/{ => legacy}/Lifecycle/README.md (100%)
create mode 100644 docs/components/legacy/Lifecycle/app.py
rename docs/components/{ => legacy}/Lifecycle/demos/basic.py (100%)
rename docs/components/{ => legacy}/Lifecycle/demos/language_adaptation.py (100%)
rename docs/components/{ => legacy}/Lifecycle/demos/theme_adaptation.py (100%)
rename docs/components/{ => legacy}/Markdown/README-zh_CN.md (100%)
rename docs/components/{ => legacy}/Markdown/README.md (100%)
rename docs/components/{ => legacy}/Markdown/app.py (90%)
rename docs/components/{ => legacy}/Markdown/custom_tags/accordion-zh_CN.md (100%)
rename docs/components/{ => legacy}/Markdown/custom_tags/accordion.md (100%)
rename docs/components/{ => legacy}/Markdown/custom_tags/chart-zh_CN.md (100%)
rename docs/components/{ => legacy}/Markdown/custom_tags/chart.md (100%)
rename docs/components/{ => legacy}/Markdown/custom_tags/select-box-zh_CN.md (100%)
rename docs/components/{ => legacy}/Markdown/custom_tags/select-box.md (100%)
rename docs/components/{ => legacy}/Markdown/demos/accordion.py (89%)
rename docs/components/{ => legacy}/Markdown/demos/basic.py (100%)
rename docs/components/{ => legacy}/Markdown/demos/chart.py (100%)
rename docs/components/{ => legacy}/Markdown/demos/custom-tag.py (100%)
rename docs/components/{ => legacy}/Markdown/demos/custom-tag2.py (100%)
rename docs/components/{ => legacy}/Markdown/demos/custom-tag3.py (100%)
rename docs/components/{ => legacy}/Markdown/demos/custom-tag4.py (100%)
rename docs/components/{ => legacy}/Markdown/demos/custom_tags/accordion/accordion-title.py (100%)
rename docs/components/{ => legacy}/Markdown/demos/custom_tags/accordion/basic.py (100%)
rename docs/components/{ => legacy}/Markdown/demos/custom_tags/chart/basic.py (100%)
rename docs/components/{ => legacy}/Markdown/demos/custom_tags/select-box/basic.py (75%)
rename docs/components/{ => legacy}/Markdown/demos/custom_tags/select-box/card_shape.py (95%)
rename docs/components/{ => legacy}/Markdown/demos/custom_tags/select-box/card_shape_width_auto.py (100%)
rename docs/components/{ => legacy}/Markdown/demos/custom_tags/select-box/python_events.py (100%)
rename docs/components/{ => legacy}/Markdown/demos/multimodal.py (100%)
rename docs/components/{ => legacy}/Markdown/demos/select-box.py (85%)
rename docs/components/{ => legacy}/MultimodalInput/README-zh_CN.md (100%)
rename docs/components/{ => legacy}/MultimodalInput/README.md (100%)
create mode 100644 docs/components/legacy/MultimodalInput/app.py
rename docs/components/{ => legacy}/MultimodalInput/demos/basic.py (100%)
rename docs/components/{ => legacy}/MultimodalInput/demos/config_buttons.py (100%)
rename docs/components/{ => legacy}/MultimodalInput/demos/upload_sources.py (100%)
rename docs/components/{ => legacy}/MultimodalInput/demos/with_chatbot.py (100%)
create mode 100644 docs/components/legacy/README-zh_CN.md
create mode 100644 docs/components/legacy/README.md
rename docs/components/{ => legacy}/WaterfallGallery/README-zh_CN.md (100%)
rename docs/components/{ => legacy}/WaterfallGallery/README.md (100%)
create mode 100644 docs/components/legacy/WaterfallGallery/app.py
rename docs/components/{ => legacy}/WaterfallGallery/demos/basic.py (100%)
rename docs/components/{ => legacy}/WaterfallGallery/demos/like_click_feedback.py (100%)
rename docs/components/{ => legacy}/WaterfallGallery/demos/load_more.py (100%)
rename docs/components/{ => legacy}/WaterfallGallery/demos/responsive_columns.py (100%)
create mode 100644 docs/components/legacy/app.py
rename docs/components/{ => legacy}/parse_markdown.py (100%)
rename docs/components/{ => legacy}/resources/audio.wav (100%)
rename docs/components/{ => legacy}/resources/bot.jpeg (100%)
rename docs/components/{ => legacy}/resources/custom_components/custom_select.js (100%)
rename docs/components/{ => legacy}/resources/dog.mp4 (100%)
rename docs/components/{ => legacy}/resources/image-bot.jpeg (100%)
rename docs/components/{ => legacy}/resources/modelscope.svg (100%)
rename docs/components/{ => legacy}/resources/music-bot.jpeg (100%)
rename docs/components/{ => legacy}/resources/screen.jpeg (100%)
rename docs/components/{ => legacy}/resources/user.jpeg (100%)
rename docs/components/{ => legacy}/tab-link.js (100%)
create mode 100644 docs/demos/example.py
create mode 100644 docs/helper/Docs.py
create mode 100644 docs/helper/Site.py
create mode 100644 docs/helper/env.py
create mode 100644 docs/helper/parse_markdown.py
create mode 100644 docs/legacy_app.py
create mode 100644 docs/resources/gradio.png
create mode 100644 docs/resources/modelscope.png
delete mode 100644 fixtures.d.ts
delete mode 100644 frontend/Chatbot/gradio.config.js
delete mode 100644 frontend/Chatbot/package.json
delete mode 100644 frontend/Flow/gradio.config.js
delete mode 100644 frontend/Flow/package.json
delete mode 100644 frontend/Flow/schema.ts
delete mode 100644 frontend/Lifecycle/CHANGELOG.md
delete mode 100644 frontend/Lifecycle/package.json
delete mode 100644 frontend/Markdown/gradio.config.js
delete mode 100644 frontend/Markdown/package.json
delete mode 100644 frontend/MultimodalInput/gradio.config.js
delete mode 100644 frontend/MultimodalInput/package.json
delete mode 100644 frontend/WaterfallGallery/CHANGELOG.md
delete mode 100644 frontend/WaterfallGallery/gradio.config.js
delete mode 100644 frontend/WaterfallGallery/package.json
create mode 100644 frontend/antd/CHANGELOG.md
create mode 100644 frontend/antd/affix/Index.svelte
create mode 100644 frontend/antd/affix/affix.tsx
create mode 100644 frontend/antd/affix/gradio.config.js
create mode 100644 frontend/antd/affix/package.json
create mode 100644 frontend/antd/alert/Index.svelte
create mode 100644 frontend/antd/alert/alert.tsx
create mode 100644 frontend/antd/alert/error-boundary/Index.svelte
create mode 100644 frontend/antd/alert/error-boundary/alert.error-boundary.tsx
create mode 100644 frontend/antd/alert/error-boundary/gradio.config.js
create mode 100644 frontend/antd/alert/error-boundary/package.json
create mode 100644 frontend/antd/alert/gradio.config.js
create mode 100644 frontend/antd/alert/package.json
create mode 100644 frontend/antd/anchor/Index.svelte
create mode 100644 frontend/antd/anchor/anchor.tsx
create mode 100644 frontend/antd/anchor/context.ts
create mode 100644 frontend/antd/anchor/gradio.config.js
create mode 100644 frontend/antd/anchor/item/Index.svelte
create mode 100644 frontend/antd/anchor/item/gradio.config.js
create mode 100644 frontend/antd/anchor/item/package.json
create mode 100644 frontend/antd/anchor/package.json
create mode 100644 frontend/antd/auto-complete/Index.svelte
create mode 100644 frontend/antd/auto-complete/auto-complete.tsx
create mode 100644 frontend/antd/auto-complete/context.ts
create mode 100644 frontend/antd/auto-complete/gradio.config.js
create mode 100644 frontend/antd/auto-complete/option/Index.svelte
create mode 100644 frontend/antd/auto-complete/option/gradio.config.js
create mode 100644 frontend/antd/auto-complete/option/package.json
create mode 100644 frontend/antd/auto-complete/package.json
create mode 100644 frontend/antd/avatar/Index.svelte
create mode 100644 frontend/antd/avatar/avatar.tsx
create mode 100644 frontend/antd/avatar/gradio.config.js
create mode 100644 frontend/antd/avatar/group/Index.svelte
create mode 100644 frontend/antd/avatar/group/avatar.group.tsx
create mode 100644 frontend/antd/avatar/group/gradio.config.js
create mode 100644 frontend/antd/avatar/group/package.json
create mode 100644 frontend/antd/avatar/package.json
create mode 100644 frontend/antd/badge/Index.svelte
create mode 100644 frontend/antd/badge/badge.tsx
create mode 100644 frontend/antd/badge/gradio.config.js
create mode 100644 frontend/antd/badge/package.json
create mode 100644 frontend/antd/badge/ribbon/Index.svelte
create mode 100644 frontend/antd/badge/ribbon/badge.ribbon.tsx
create mode 100644 frontend/antd/badge/ribbon/gradio.config.js
create mode 100644 frontend/antd/badge/ribbon/package.json
create mode 100644 frontend/antd/breadcrumb/Index.svelte
create mode 100644 frontend/antd/breadcrumb/breadcrumb.tsx
create mode 100644 frontend/antd/breadcrumb/context.ts
create mode 100644 frontend/antd/breadcrumb/gradio.config.js
create mode 100644 frontend/antd/breadcrumb/item/BreadcrumbItem.svelte
create mode 100644 frontend/antd/breadcrumb/item/Index.svelte
create mode 100644 frontend/antd/breadcrumb/item/gradio.config.js
create mode 100644 frontend/antd/breadcrumb/item/package.json
create mode 100644 frontend/antd/breadcrumb/package.json
create mode 100644 frontend/antd/button/Index.svelte
create mode 100644 frontend/antd/button/button.tsx
create mode 100644 frontend/antd/button/gradio.config.js
create mode 100644 frontend/antd/button/group/Index.svelte
create mode 100644 frontend/antd/button/group/button.group.less
create mode 100644 frontend/antd/button/group/button.group.tsx
create mode 100644 frontend/antd/button/group/gradio.config.js
create mode 100644 frontend/antd/button/group/package.json
create mode 100644 frontend/antd/button/package.json
create mode 100644 frontend/antd/calendar/Index.svelte
create mode 100644 frontend/antd/calendar/calendar.tsx
create mode 100644 frontend/antd/calendar/gradio.config.js
create mode 100644 frontend/antd/calendar/package.json
create mode 100644 frontend/antd/card/Index.svelte
create mode 100644 frontend/antd/card/card.tsx
create mode 100644 frontend/antd/card/gradio.config.js
create mode 100644 frontend/antd/card/grid/Index.svelte
create mode 100644 frontend/antd/card/grid/card.grid.tsx
create mode 100644 frontend/antd/card/grid/gradio.config.js
create mode 100644 frontend/antd/card/grid/package.json
create mode 100644 frontend/antd/card/meta/Index.svelte
create mode 100644 frontend/antd/card/meta/card.meta.tsx
create mode 100644 frontend/antd/card/meta/gradio.config.js
create mode 100644 frontend/antd/card/meta/package.json
create mode 100644 frontend/antd/card/package.json
create mode 100644 frontend/antd/carousel/Index.svelte
create mode 100644 frontend/antd/carousel/carousel.tsx
create mode 100644 frontend/antd/carousel/gradio.config.js
create mode 100644 frontend/antd/carousel/package.json
create mode 100644 frontend/antd/cascader/Index.svelte
create mode 100644 frontend/antd/cascader/cascader.tsx
create mode 100644 frontend/antd/cascader/context.ts
create mode 100644 frontend/antd/cascader/gradio.config.js
create mode 100644 frontend/antd/cascader/option/Index.svelte
create mode 100644 frontend/antd/cascader/option/gradio.config.js
create mode 100644 frontend/antd/cascader/option/package.json
create mode 100644 frontend/antd/cascader/package.json
create mode 100644 frontend/antd/cascader/panel/Index.svelte
create mode 100644 frontend/antd/cascader/panel/cascader.panel.tsx
create mode 100644 frontend/antd/cascader/panel/gradio.config.js
create mode 100644 frontend/antd/cascader/panel/package.json
create mode 100644 frontend/antd/checkbox/Index.svelte
create mode 100644 frontend/antd/checkbox/checkbox.tsx
create mode 100644 frontend/antd/checkbox/context.ts
create mode 100644 frontend/antd/checkbox/gradio.config.js
create mode 100644 frontend/antd/checkbox/group/Index.svelte
create mode 100644 frontend/antd/checkbox/group/checkbox.group.tsx
create mode 100644 frontend/antd/checkbox/group/gradio.config.js
create mode 100644 frontend/antd/checkbox/group/option/Index.svelte
create mode 100644 frontend/antd/checkbox/group/option/gradio.config.js
create mode 100644 frontend/antd/checkbox/group/option/package.json
create mode 100644 frontend/antd/checkbox/group/package.json
create mode 100644 frontend/antd/checkbox/package.json
create mode 100644 frontend/antd/collapse/Index.svelte
create mode 100644 frontend/antd/collapse/collapse.tsx
create mode 100644 frontend/antd/collapse/context.ts
create mode 100644 frontend/antd/collapse/gradio.config.js
create mode 100644 frontend/antd/collapse/item/Index.svelte
create mode 100644 frontend/antd/collapse/item/gradio.config.js
create mode 100644 frontend/antd/collapse/item/package.json
create mode 100644 frontend/antd/collapse/package.json
create mode 100644 frontend/antd/color-picker/Index.svelte
create mode 100644 frontend/antd/color-picker/color-picker.tsx
create mode 100644 frontend/antd/color-picker/context.ts
create mode 100644 frontend/antd/color-picker/gradio.config.js
create mode 100644 frontend/antd/color-picker/package.json
create mode 100644 frontend/antd/color-picker/preset/Index.svelte
create mode 100644 frontend/antd/color-picker/preset/gradio.config.js
create mode 100644 frontend/antd/color-picker/preset/package.json
create mode 100644 frontend/antd/config-provider/Index.svelte
create mode 100644 frontend/antd/config-provider/config-provider.tsx
create mode 100644 frontend/antd/config-provider/gradio.config.js
create mode 100644 frontend/antd/config-provider/locales.ts
create mode 100644 frontend/antd/config-provider/package.json
create mode 100644 frontend/antd/date-picker/Index.svelte
create mode 100644 frontend/antd/date-picker/context.ts
create mode 100644 frontend/antd/date-picker/date-picker.tsx
create mode 100644 frontend/antd/date-picker/gradio.config.js
create mode 100644 frontend/antd/date-picker/package.json
create mode 100644 frontend/antd/date-picker/preset/Index.svelte
create mode 100644 frontend/antd/date-picker/preset/gradio.config.js
create mode 100644 frontend/antd/date-picker/preset/package.json
create mode 100644 frontend/antd/date-picker/range-picker/Index.svelte
create mode 100644 frontend/antd/date-picker/range-picker/date-picker.range-picker.tsx
create mode 100644 frontend/antd/date-picker/range-picker/gradio.config.js
create mode 100644 frontend/antd/date-picker/range-picker/package.json
create mode 100644 frontend/antd/descriptions/Index.svelte
create mode 100644 frontend/antd/descriptions/context.ts
create mode 100644 frontend/antd/descriptions/descriptions.tsx
create mode 100644 frontend/antd/descriptions/gradio.config.js
create mode 100644 frontend/antd/descriptions/item/Index.svelte
create mode 100644 frontend/antd/descriptions/item/gradio.config.js
create mode 100644 frontend/antd/descriptions/item/package.json
create mode 100644 frontend/antd/descriptions/package.json
create mode 100644 frontend/antd/divider/Index.svelte
create mode 100644 frontend/antd/divider/divider.tsx
create mode 100644 frontend/antd/divider/gradio.config.js
create mode 100644 frontend/antd/divider/package.json
create mode 100644 frontend/antd/drawer/Index.svelte
create mode 100644 frontend/antd/drawer/drawer.tsx
create mode 100644 frontend/antd/drawer/gradio.config.js
create mode 100644 frontend/antd/drawer/package.json
create mode 100644 frontend/antd/dropdown/Index.svelte
create mode 100644 frontend/antd/dropdown/button/Index.svelte
create mode 100644 frontend/antd/dropdown/button/dropdown.button.tsx
create mode 100644 frontend/antd/dropdown/button/gradio.config.js
create mode 100644 frontend/antd/dropdown/button/package.json
create mode 100644 frontend/antd/dropdown/dropdown.tsx
create mode 100644 frontend/antd/dropdown/gradio.config.js
create mode 100644 frontend/antd/dropdown/package.json
create mode 100644 frontend/antd/empty/Index.svelte
create mode 100644 frontend/antd/empty/empty.tsx
create mode 100644 frontend/antd/empty/gradio.config.js
create mode 100644 frontend/antd/empty/package.json
create mode 100644 frontend/antd/flex/Index.svelte
create mode 100644 frontend/antd/flex/flex.tsx
create mode 100644 frontend/antd/flex/gradio.config.js
create mode 100644 frontend/antd/flex/package.json
create mode 100644 frontend/antd/float-button/Index.svelte
create mode 100644 frontend/antd/float-button/back-top/Index.svelte
create mode 100644 frontend/antd/float-button/back-top/float-button.back-top.tsx
create mode 100644 frontend/antd/float-button/back-top/gradio.config.js
create mode 100644 frontend/antd/float-button/back-top/package.json
create mode 100644 frontend/antd/float-button/float-button.tsx
create mode 100644 frontend/antd/float-button/gradio.config.js
create mode 100644 frontend/antd/float-button/group/Index.svelte
create mode 100644 frontend/antd/float-button/group/float-button.group.less
create mode 100644 frontend/antd/float-button/group/float-button.group.tsx
create mode 100644 frontend/antd/float-button/group/gradio.config.js
create mode 100644 frontend/antd/float-button/group/package.json
create mode 100644 frontend/antd/float-button/package.json
create mode 100644 frontend/antd/form/Index.svelte
create mode 100644 frontend/antd/form/context.ts
create mode 100644 frontend/antd/form/form.tsx
create mode 100644 frontend/antd/form/gradio.config.js
create mode 100644 frontend/antd/form/item/Index.svelte
create mode 100644 frontend/antd/form/item/form.item.tsx
create mode 100644 frontend/antd/form/item/gradio.config.js
create mode 100644 frontend/antd/form/item/package.json
create mode 100644 frontend/antd/form/item/rule/Index.svelte
create mode 100644 frontend/antd/form/item/rule/global.css
create mode 100644 frontend/antd/form/item/rule/gradio.config.js
create mode 100644 frontend/antd/form/item/rule/package.json
create mode 100644 frontend/antd/form/package.json
create mode 100644 frontend/antd/grid/col/Index.svelte
create mode 100644 frontend/antd/grid/col/gradio.config.js
create mode 100644 frontend/antd/grid/col/package.json
create mode 100644 frontend/antd/grid/context.ts
create mode 100644 frontend/antd/grid/row/Index.svelte
create mode 100644 frontend/antd/grid/row/gradio.config.js
create mode 100644 frontend/antd/grid/row/package.json
create mode 100644 frontend/antd/grid/row/row.tsx
create mode 100644 frontend/antd/icon/Index.svelte
create mode 100644 frontend/antd/icon/gradio.config.js
create mode 100644 frontend/antd/icon/icon.tsx
create mode 100644 frontend/antd/icon/iconfont-provider/Index.svelte
create mode 100644 frontend/antd/icon/iconfont-provider/context.ts
create mode 100644 frontend/antd/icon/iconfont-provider/create-iconfont.ts
create mode 100644 frontend/antd/icon/iconfont-provider/gradio.config.js
create mode 100644 frontend/antd/icon/iconfont-provider/package.json
create mode 100644 frontend/antd/icon/package.json
create mode 100644 frontend/antd/image/Index.svelte
create mode 100644 frontend/antd/image/gradio.config.js
create mode 100644 frontend/antd/image/image.tsx
create mode 100644 frontend/antd/image/package.json
create mode 100644 frontend/antd/image/preview-group/Index.svelte
create mode 100644 frontend/antd/image/preview-group/gradio.config.js
create mode 100644 frontend/antd/image/preview-group/image.preview-group.tsx
create mode 100644 frontend/antd/image/preview-group/package.json
create mode 100644 frontend/antd/input-number/Index.svelte
create mode 100644 frontend/antd/input-number/gradio.config.js
create mode 100644 frontend/antd/input-number/input-number.tsx
create mode 100644 frontend/antd/input-number/package.json
create mode 100644 frontend/antd/input/Index.svelte
create mode 100644 frontend/antd/input/gradio.config.js
create mode 100644 frontend/antd/input/input.tsx
create mode 100644 frontend/antd/input/otp/Index.svelte
create mode 100644 frontend/antd/input/otp/gradio.config.js
create mode 100644 frontend/antd/input/otp/input.otp.tsx
create mode 100644 frontend/antd/input/otp/package.json
create mode 100644 frontend/antd/input/package.json
create mode 100644 frontend/antd/input/password/Index.svelte
create mode 100644 frontend/antd/input/password/gradio.config.js
create mode 100644 frontend/antd/input/password/input.password.tsx
create mode 100644 frontend/antd/input/password/package.json
create mode 100644 frontend/antd/input/search/Index.svelte
create mode 100644 frontend/antd/input/search/gradio.config.js
create mode 100644 frontend/antd/input/search/input.search.tsx
create mode 100644 frontend/antd/input/search/package.json
create mode 100644 frontend/antd/input/textarea/Index.svelte
create mode 100644 frontend/antd/input/textarea/gradio.config.js
create mode 100644 frontend/antd/input/textarea/input.textarea.tsx
create mode 100644 frontend/antd/input/textarea/package.json
create mode 100644 frontend/antd/layout/Base.svelte
create mode 100644 frontend/antd/layout/Index.svelte
create mode 100644 frontend/antd/layout/content/Index.svelte
create mode 100644 frontend/antd/layout/content/gradio.config.js
create mode 100644 frontend/antd/layout/content/package.json
create mode 100644 frontend/antd/layout/footer/Index.svelte
create mode 100644 frontend/antd/layout/footer/gradio.config.js
create mode 100644 frontend/antd/layout/footer/package.json
create mode 100644 frontend/antd/layout/gradio.config.js
create mode 100644 frontend/antd/layout/header/Index.svelte
create mode 100644 frontend/antd/layout/header/gradio.config.js
create mode 100644 frontend/antd/layout/header/package.json
create mode 100644 frontend/antd/layout/layout.base.tsx
create mode 100644 frontend/antd/layout/package.json
create mode 100644 frontend/antd/layout/sider/Index.svelte
create mode 100644 frontend/antd/layout/sider/gradio.config.js
create mode 100644 frontend/antd/layout/sider/layout.sider.tsx
create mode 100644 frontend/antd/layout/sider/package.json
create mode 100644 frontend/antd/list/Index.svelte
create mode 100644 frontend/antd/list/gradio.config.js
create mode 100644 frontend/antd/list/item/Index.svelte
create mode 100644 frontend/antd/list/item/gradio.config.js
create mode 100644 frontend/antd/list/item/list.item.tsx
create mode 100644 frontend/antd/list/item/meta/Index.svelte
create mode 100644 frontend/antd/list/item/meta/gradio.config.js
create mode 100644 frontend/antd/list/item/meta/list.item.meta.tsx
create mode 100644 frontend/antd/list/item/meta/package.json
create mode 100644 frontend/antd/list/item/package.json
create mode 100644 frontend/antd/list/list.tsx
create mode 100644 frontend/antd/list/package.json
create mode 100644 frontend/antd/mentions/Index.svelte
create mode 100644 frontend/antd/mentions/context.ts
create mode 100644 frontend/antd/mentions/gradio.config.js
create mode 100644 frontend/antd/mentions/mentions.tsx
create mode 100644 frontend/antd/mentions/option/Index.svelte
create mode 100644 frontend/antd/mentions/option/gradio.config.js
create mode 100644 frontend/antd/mentions/option/package.json
create mode 100644 frontend/antd/mentions/package.json
create mode 100644 frontend/antd/menu/Index.svelte
create mode 100644 frontend/antd/menu/context.ts
create mode 100644 frontend/antd/menu/gradio.config.js
create mode 100644 frontend/antd/menu/item/Index.svelte
create mode 100644 frontend/antd/menu/item/gradio.config.js
create mode 100644 frontend/antd/menu/item/package.json
create mode 100644 frontend/antd/menu/menu.less
create mode 100644 frontend/antd/menu/menu.tsx
create mode 100644 frontend/antd/menu/package.json
create mode 100644 frontend/antd/message/Index.svelte
create mode 100644 frontend/antd/message/gradio.config.js
create mode 100644 frontend/antd/message/message.tsx
create mode 100644 frontend/antd/message/package.json
create mode 100644 frontend/antd/modal/Index.svelte
create mode 100644 frontend/antd/modal/gradio.config.js
create mode 100644 frontend/antd/modal/modal.tsx
create mode 100644 frontend/antd/modal/package.json
create mode 100644 frontend/antd/notification/Index.svelte
create mode 100644 frontend/antd/notification/gradio.config.js
create mode 100644 frontend/antd/notification/notification.tsx
create mode 100644 frontend/antd/notification/package.json
create mode 100644 frontend/antd/package.json
create mode 100644 frontend/antd/pagination/Index.svelte
create mode 100644 frontend/antd/pagination/gradio.config.js
create mode 100644 frontend/antd/pagination/package.json
create mode 100644 frontend/antd/pagination/pagination.tsx
create mode 100644 frontend/antd/popconfirm/Index.svelte
create mode 100644 frontend/antd/popconfirm/gradio.config.js
create mode 100644 frontend/antd/popconfirm/package.json
create mode 100644 frontend/antd/popconfirm/popconfirm.tsx
create mode 100644 frontend/antd/popover/Index.svelte
create mode 100644 frontend/antd/popover/gradio.config.js
create mode 100644 frontend/antd/popover/package.json
create mode 100644 frontend/antd/popover/popover.tsx
create mode 100644 frontend/antd/progress/Index.svelte
create mode 100644 frontend/antd/progress/gradio.config.js
create mode 100644 frontend/antd/progress/package.json
create mode 100644 frontend/antd/progress/progress.tsx
create mode 100644 frontend/antd/qr-code/Index.svelte
create mode 100644 frontend/antd/qr-code/gradio.config.js
create mode 100644 frontend/antd/qr-code/package.json
create mode 100644 frontend/antd/qr-code/qr-code.tsx
create mode 100644 frontend/antd/radio/Index.svelte
create mode 100644 frontend/antd/radio/button/Index.svelte
create mode 100644 frontend/antd/radio/button/gradio.config.js
create mode 100644 frontend/antd/radio/button/package.json
create mode 100644 frontend/antd/radio/button/radio.button.tsx
create mode 100644 frontend/antd/radio/context.ts
create mode 100644 frontend/antd/radio/gradio.config.js
create mode 100644 frontend/antd/radio/group/Index.svelte
create mode 100644 frontend/antd/radio/group/gradio.config.js
create mode 100644 frontend/antd/radio/group/option/Index.svelte
create mode 100644 frontend/antd/radio/group/option/gradio.config.js
create mode 100644 frontend/antd/radio/group/option/package.json
create mode 100644 frontend/antd/radio/group/package.json
create mode 100644 frontend/antd/radio/group/radio.group.less
create mode 100644 frontend/antd/radio/group/radio.group.tsx
create mode 100644 frontend/antd/radio/package.json
create mode 100644 frontend/antd/radio/radio.tsx
create mode 100644 frontend/antd/rate/Index.svelte
create mode 100644 frontend/antd/rate/gradio.config.js
create mode 100644 frontend/antd/rate/package.json
create mode 100644 frontend/antd/rate/rate.tsx
create mode 100644 frontend/antd/result/Index.svelte
create mode 100644 frontend/antd/result/gradio.config.js
create mode 100644 frontend/antd/result/package.json
create mode 100644 frontend/antd/result/result.tsx
create mode 100644 frontend/antd/segmented/Index.svelte
create mode 100644 frontend/antd/segmented/context.ts
create mode 100644 frontend/antd/segmented/gradio.config.js
create mode 100644 frontend/antd/segmented/option/Index.svelte
create mode 100644 frontend/antd/segmented/option/gradio.config.js
create mode 100644 frontend/antd/segmented/option/package.json
create mode 100644 frontend/antd/segmented/package.json
create mode 100644 frontend/antd/segmented/segmented.tsx
create mode 100644 frontend/antd/select/Index.svelte
create mode 100644 frontend/antd/select/context.ts
create mode 100644 frontend/antd/select/gradio.config.js
create mode 100644 frontend/antd/select/option/Index.svelte
create mode 100644 frontend/antd/select/option/gradio.config.js
create mode 100644 frontend/antd/select/option/package.json
create mode 100644 frontend/antd/select/package.json
create mode 100644 frontend/antd/select/select.tsx
create mode 100644 frontend/antd/skeleton/Index.svelte
create mode 100644 frontend/antd/skeleton/avatar/Index.svelte
create mode 100644 frontend/antd/skeleton/avatar/gradio.config.js
create mode 100644 frontend/antd/skeleton/avatar/package.json
create mode 100644 frontend/antd/skeleton/avatar/skeleton.avatar.tsx
create mode 100644 frontend/antd/skeleton/button/Index.svelte
create mode 100644 frontend/antd/skeleton/button/gradio.config.js
create mode 100644 frontend/antd/skeleton/button/package.json
create mode 100644 frontend/antd/skeleton/button/skeleton.button.tsx
create mode 100644 frontend/antd/skeleton/gradio.config.js
create mode 100644 frontend/antd/skeleton/image/Index.svelte
create mode 100644 frontend/antd/skeleton/image/gradio.config.js
create mode 100644 frontend/antd/skeleton/image/package.json
create mode 100644 frontend/antd/skeleton/image/skeleton.image.tsx
create mode 100644 frontend/antd/skeleton/input/Index.svelte
create mode 100644 frontend/antd/skeleton/input/gradio.config.js
create mode 100644 frontend/antd/skeleton/input/package.json
create mode 100644 frontend/antd/skeleton/input/skeleton.input.tsx
create mode 100644 frontend/antd/skeleton/node/Index.svelte
create mode 100644 frontend/antd/skeleton/node/gradio.config.js
create mode 100644 frontend/antd/skeleton/node/package.json
create mode 100644 frontend/antd/skeleton/node/skeleton.node.tsx
create mode 100644 frontend/antd/skeleton/package.json
create mode 100644 frontend/antd/skeleton/skeleton.tsx
create mode 100644 frontend/antd/slider/Index.svelte
create mode 100644 frontend/antd/slider/context.ts
create mode 100644 frontend/antd/slider/gradio.config.js
create mode 100644 frontend/antd/slider/mark/Index.svelte
create mode 100644 frontend/antd/slider/mark/gradio.config.js
create mode 100644 frontend/antd/slider/mark/package.json
create mode 100644 frontend/antd/slider/package.json
create mode 100644 frontend/antd/slider/slider.tsx
create mode 100644 frontend/antd/space/Index.svelte
create mode 100644 frontend/antd/space/compact/Index.svelte
create mode 100644 frontend/antd/space/compact/gradio.config.js
create mode 100644 frontend/antd/space/compact/package.json
create mode 100644 frontend/antd/space/compact/space.compact.tsx
create mode 100644 frontend/antd/space/gradio.config.js
create mode 100644 frontend/antd/space/package.json
create mode 100644 frontend/antd/space/space.tsx
create mode 100644 frontend/antd/spin/Index.svelte
create mode 100644 frontend/antd/spin/gradio.config.js
create mode 100644 frontend/antd/spin/package.json
create mode 100644 frontend/antd/spin/spin.tsx
create mode 100644 frontend/antd/splitter/Index.svelte
create mode 100644 frontend/antd/splitter/context.ts
create mode 100644 frontend/antd/splitter/gradio.config.js
create mode 100644 frontend/antd/splitter/package.json
create mode 100644 frontend/antd/splitter/panel/Index.svelte
create mode 100644 frontend/antd/splitter/panel/gradio.config.js
create mode 100644 frontend/antd/splitter/panel/package.json
create mode 100644 frontend/antd/splitter/splitter.tsx
create mode 100644 frontend/antd/statistic/Index.svelte
create mode 100644 frontend/antd/statistic/countdown/Index.svelte
create mode 100644 frontend/antd/statistic/countdown/gradio.config.js
create mode 100644 frontend/antd/statistic/countdown/package.json
create mode 100644 frontend/antd/statistic/countdown/statistic.countdown.tsx
create mode 100644 frontend/antd/statistic/gradio.config.js
create mode 100644 frontend/antd/statistic/package.json
create mode 100644 frontend/antd/statistic/statistic.tsx
create mode 100644 frontend/antd/steps/Index.svelte
create mode 100644 frontend/antd/steps/context.ts
create mode 100644 frontend/antd/steps/gradio.config.js
create mode 100644 frontend/antd/steps/item/Index.svelte
create mode 100644 frontend/antd/steps/item/gradio.config.js
create mode 100644 frontend/antd/steps/item/package.json
create mode 100644 frontend/antd/steps/package.json
create mode 100644 frontend/antd/steps/steps.tsx
create mode 100644 frontend/antd/switch/Index.svelte
create mode 100644 frontend/antd/switch/gradio.config.js
create mode 100644 frontend/antd/switch/package.json
create mode 100644 frontend/antd/switch/switch.tsx
create mode 100644 frontend/antd/table/Index.svelte
create mode 100644 frontend/antd/table/column-group/Index.svelte
create mode 100644 frontend/antd/table/column-group/gradio.config.js
create mode 100644 frontend/antd/table/column-group/package.json
create mode 100644 frontend/antd/table/column/Index.svelte
create mode 100644 frontend/antd/table/column/gradio.config.js
create mode 100644 frontend/antd/table/column/package.json
create mode 100644 frontend/antd/table/context.ts
create mode 100644 frontend/antd/table/expandable/Expandable.svelte
create mode 100644 frontend/antd/table/expandable/Index.svelte
create mode 100644 frontend/antd/table/expandable/gradio.config.js
create mode 100644 frontend/antd/table/expandable/package.json
create mode 100644 frontend/antd/table/gradio.config.js
create mode 100644 frontend/antd/table/package.json
create mode 100644 frontend/antd/table/row-selection/Index.svelte
create mode 100644 frontend/antd/table/row-selection/RowSelection.svelte
create mode 100644 frontend/antd/table/row-selection/gradio.config.js
create mode 100644 frontend/antd/table/row-selection/package.json
create mode 100644 frontend/antd/table/row-selection/selection/Index.svelte
create mode 100644 frontend/antd/table/row-selection/selection/gradio.config.js
create mode 100644 frontend/antd/table/row-selection/selection/package.json
create mode 100644 frontend/antd/table/table.tsx
create mode 100644 frontend/antd/tabs/Index.svelte
create mode 100644 frontend/antd/tabs/context.ts
create mode 100644 frontend/antd/tabs/gradio.config.js
create mode 100644 frontend/antd/tabs/item/Index.svelte
create mode 100644 frontend/antd/tabs/item/gradio.config.js
create mode 100644 frontend/antd/tabs/item/package.json
create mode 100644 frontend/antd/tabs/package.json
create mode 100644 frontend/antd/tabs/tabs.tsx
create mode 100644 frontend/antd/tag/Index.svelte
create mode 100644 frontend/antd/tag/checkable-tag/Index.svelte
create mode 100644 frontend/antd/tag/checkable-tag/gradio.config.js
create mode 100644 frontend/antd/tag/checkable-tag/package.json
create mode 100644 frontend/antd/tag/checkable-tag/tag.checkable-tag.tsx
create mode 100644 frontend/antd/tag/gradio.config.js
create mode 100644 frontend/antd/tag/package.json
create mode 100644 frontend/antd/tag/tag.tsx
create mode 100644 frontend/antd/time-picker/Index.svelte
create mode 100644 frontend/antd/time-picker/gradio.config.js
create mode 100644 frontend/antd/time-picker/package.json
create mode 100644 frontend/antd/time-picker/range-picker/Index.svelte
create mode 100644 frontend/antd/time-picker/range-picker/gradio.config.js
create mode 100644 frontend/antd/time-picker/range-picker/package.json
create mode 100644 frontend/antd/time-picker/range-picker/time-picker.range-picker.tsx
create mode 100644 frontend/antd/time-picker/time-picker.tsx
create mode 100644 frontend/antd/timeline/Index.svelte
create mode 100644 frontend/antd/timeline/context.ts
create mode 100644 frontend/antd/timeline/gradio.config.js
create mode 100644 frontend/antd/timeline/item/Index.svelte
create mode 100644 frontend/antd/timeline/item/gradio.config.js
create mode 100644 frontend/antd/timeline/item/package.json
create mode 100644 frontend/antd/timeline/package.json
create mode 100644 frontend/antd/timeline/timeline.tsx
create mode 100644 frontend/antd/tooltip/Index.svelte
create mode 100644 frontend/antd/tooltip/gradio.config.js
create mode 100644 frontend/antd/tooltip/package.json
create mode 100644 frontend/antd/tooltip/tooltip.tsx
create mode 100644 frontend/antd/tour/Index.svelte
create mode 100644 frontend/antd/tour/context.ts
create mode 100644 frontend/antd/tour/gradio.config.js
create mode 100644 frontend/antd/tour/package.json
create mode 100644 frontend/antd/tour/step/Index.svelte
create mode 100644 frontend/antd/tour/step/gradio.config.js
create mode 100644 frontend/antd/tour/step/package.json
create mode 100644 frontend/antd/tour/tour.tsx
create mode 100644 frontend/antd/transfer/Index.svelte
create mode 100644 frontend/antd/transfer/gradio.config.js
create mode 100644 frontend/antd/transfer/package.json
create mode 100644 frontend/antd/transfer/transfer.tsx
create mode 100644 frontend/antd/tree-select/Index.svelte
create mode 100644 frontend/antd/tree-select/context.ts
create mode 100644 frontend/antd/tree-select/gradio.config.js
create mode 100644 frontend/antd/tree-select/package.json
create mode 100644 frontend/antd/tree-select/tree-node/Index.svelte
create mode 100644 frontend/antd/tree-select/tree-node/gradio.config.js
create mode 100644 frontend/antd/tree-select/tree-node/package.json
create mode 100644 frontend/antd/tree-select/tree-select.tsx
create mode 100644 frontend/antd/tree/Index.svelte
create mode 100644 frontend/antd/tree/context.ts
create mode 100644 frontend/antd/tree/directory-tree/Index.svelte
create mode 100644 frontend/antd/tree/directory-tree/gradio.config.js
create mode 100644 frontend/antd/tree/directory-tree/package.json
create mode 100644 frontend/antd/tree/gradio.config.js
create mode 100644 frontend/antd/tree/package.json
create mode 100644 frontend/antd/tree/tree-node/Index.svelte
create mode 100644 frontend/antd/tree/tree-node/gradio.config.js
create mode 100644 frontend/antd/tree/tree-node/package.json
create mode 100644 frontend/antd/tree/tree.tsx
create mode 100644 frontend/antd/typography/Base.svelte
create mode 100644 frontend/antd/typography/link/Index.svelte
create mode 100644 frontend/antd/typography/link/gradio.config.js
create mode 100644 frontend/antd/typography/link/package.json
create mode 100644 frontend/antd/typography/paragraph/Index.svelte
create mode 100644 frontend/antd/typography/paragraph/gradio.config.js
create mode 100644 frontend/antd/typography/paragraph/package.json
create mode 100644 frontend/antd/typography/text/Index.svelte
create mode 100644 frontend/antd/typography/text/gradio.config.js
create mode 100644 frontend/antd/typography/text/package.json
create mode 100644 frontend/antd/typography/title/Index.svelte
create mode 100644 frontend/antd/typography/title/gradio.config.js
create mode 100644 frontend/antd/typography/title/package.json
create mode 100644 frontend/antd/typography/typography.base.tsx
create mode 100644 frontend/antd/upload/Index.svelte
create mode 100644 frontend/antd/upload/dragger/Index.svelte
create mode 100644 frontend/antd/upload/dragger/gradio.config.js
create mode 100644 frontend/antd/upload/dragger/package.json
create mode 100644 frontend/antd/upload/dragger/upload.dragger.tsx
create mode 100644 frontend/antd/upload/gradio.config.js
create mode 100644 frontend/antd/upload/package.json
create mode 100644 frontend/antd/upload/upload.tsx
create mode 100644 frontend/antd/watermark/Index.svelte
create mode 100644 frontend/antd/watermark/gradio.config.js
create mode 100644 frontend/antd/watermark/package.json
create mode 100644 frontend/antd/watermark/watermark.tsx
create mode 100644 frontend/base/CHANGELOG.md
create mode 100644 frontend/base/application/Application.svelte
create mode 100644 frontend/base/application/Index.svelte
create mode 100644 frontend/base/application/gradio.config.js
create mode 100644 frontend/base/application/package.json
create mode 100644 frontend/base/div/Index.svelte
create mode 100644 frontend/base/div/gradio.config.js
create mode 100644 frontend/base/div/package.json
create mode 100644 frontend/base/each/Each.svelte
create mode 100644 frontend/base/each/Index.svelte
create mode 100644 frontend/base/each/gradio.config.js
create mode 100644 frontend/base/each/package.json
create mode 100644 frontend/base/filter/Index.svelte
create mode 100644 frontend/base/filter/gradio.config.js
create mode 100644 frontend/base/filter/package.json
create mode 100644 frontend/base/fragment/Index.svelte
create mode 100644 frontend/base/fragment/ShowFragment.svelte
create mode 100644 frontend/base/fragment/fragment.tsx
create mode 100644 frontend/base/fragment/gradio.config.js
create mode 100644 frontend/base/fragment/package.json
create mode 100644 frontend/base/package.json
create mode 100644 frontend/base/slot/Index.svelte
create mode 100644 frontend/base/slot/gradio.config.js
create mode 100644 frontend/base/slot/package.json
create mode 100644 frontend/base/span/Index.svelte
create mode 100644 frontend/base/span/gradio.config.js
create mode 100644 frontend/base/span/package.json
create mode 100644 frontend/base/text/Index.svelte
create mode 100644 frontend/base/text/global.css
create mode 100644 frontend/base/text/gradio.config.js
create mode 100644 frontend/base/text/package.json
delete mode 100644 frontend/compiled/package.json
delete mode 100644 frontend/compiled/tsconfig.build.json
delete mode 100644 frontend/compiled/tsconfig.json
delete mode 100644 frontend/compiled/tsconfig.node.json
delete mode 100644 frontend/compiled/vite.config.ts
create mode 100644 frontend/defineConfig.js
create mode 100644 frontend/fixtures.d.ts
rename frontend/{Chatbot/Index.svelte => legacy/Chatbot/Awaited.svelte} (98%)
rename frontend/{Markdown => legacy/Chatbot}/CHANGELOG.md (66%)
create mode 100644 frontend/legacy/Chatbot/Index.svelte
create mode 100644 frontend/legacy/Chatbot/gradio.config.js
create mode 100644 frontend/legacy/Chatbot/package.json
rename frontend/{ => legacy}/Chatbot/shared/ChatBot.svelte (99%)
rename frontend/{ => legacy}/Chatbot/shared/Copy.svelte (97%)
rename frontend/{ => legacy}/Chatbot/shared/FlushingMarkdown.svelte (98%)
rename frontend/{ => legacy}/Chatbot/shared/LikeDislike.svelte (100%)
rename frontend/{ => legacy}/Chatbot/shared/Pending.svelte (100%)
rename frontend/{ => legacy}/Chatbot/shared/llm-thinking-presets.ts (100%)
rename frontend/{ => legacy}/Chatbot/shared/utils.ts (100%)
rename frontend/{Flow/Index.svelte => legacy/Flow/Awaited.svelte} (96%)
rename frontend/{ => legacy}/Flow/CHANGELOG.md (68%)
create mode 100644 frontend/legacy/Flow/Index.svelte
create mode 100644 frontend/legacy/Flow/gradio.config.js
create mode 100644 frontend/legacy/Flow/package.json
rename frontend/{ => legacy}/Flow/schema.json (100%)
create mode 100644 frontend/legacy/Flow/schema.ts
rename frontend/{ => legacy}/Flow/shared/Flow.svelte (96%)
rename frontend/{ => legacy}/Flow/shared/utils.ts (63%)
create mode 100644 frontend/legacy/Lifecycle/CHANGELOG.md
create mode 100644 frontend/legacy/Lifecycle/gradio.config.js
rename frontend/{ => legacy}/Lifecycle/index.svelte (100%)
create mode 100644 frontend/legacy/Lifecycle/package.json
rename frontend/{ => legacy}/Lifecycle/shared/utils.ts (100%)
rename frontend/{Markdown/Index.svelte => legacy/Markdown/Awaited.svelte} (94%)
rename frontend/{Chatbot => legacy/Markdown}/CHANGELOG.md (66%)
rename frontend/{ => legacy}/Markdown/Example.svelte (89%)
create mode 100644 frontend/legacy/Markdown/Index.svelte
create mode 100644 frontend/legacy/Markdown/gradio.config.js
create mode 100644 frontend/legacy/Markdown/package.json
rename frontend/{ => legacy}/Markdown/shared/Markdown.svelte (97%)
rename frontend/{MultimodalInput/Index.svelte => legacy/MultimodalInput/Awaited.svelte} (98%)
rename frontend/{ => legacy}/MultimodalInput/CHANGELOG.md (67%)
rename frontend/{ => legacy}/MultimodalInput/Example.svelte (100%)
create mode 100644 frontend/legacy/MultimodalInput/Index.svelte
create mode 100644 frontend/legacy/MultimodalInput/gradio.config.js
create mode 100644 frontend/legacy/MultimodalInput/package.json
rename frontend/{ => legacy}/MultimodalInput/shared/AudioRecorder.svelte (100%)
rename frontend/{ => legacy}/MultimodalInput/shared/FilePreview.svelte (98%)
rename frontend/{ => legacy}/MultimodalInput/shared/Input.svelte (100%)
rename frontend/{ => legacy}/MultimodalInput/shared/Loader.svelte (100%)
rename frontend/{ => legacy}/MultimodalInput/shared/RemoveIcon.svelte (100%)
rename frontend/{ => legacy}/MultimodalInput/shared/SubmitButton.svelte (100%)
rename frontend/{ => legacy}/MultimodalInput/shared/UploadButton.svelte (100%)
rename frontend/{ => legacy}/MultimodalInput/shared/UploadIcon.svelte (100%)
rename frontend/{ => legacy}/MultimodalInput/shared/Webcam.svelte (100%)
rename frontend/{ => legacy}/MultimodalInput/shared/context.ts (100%)
rename frontend/{ => legacy}/MultimodalInput/shared/global.d.ts (100%)
rename frontend/{ => legacy}/MultimodalInput/shared/utils.ts (100%)
create mode 100644 frontend/legacy/WaterfallGallery/CHANGELOG.md
rename frontend/{ => legacy}/WaterfallGallery/Index.svelte (100%)
create mode 100644 frontend/legacy/WaterfallGallery/gradio.config.js
create mode 100644 frontend/legacy/WaterfallGallery/package.json
rename frontend/{ => legacy}/WaterfallGallery/shared/Dislike.svelte (100%)
rename frontend/{ => legacy}/WaterfallGallery/shared/Gallery.svelte (99%)
rename frontend/{ => legacy}/WaterfallGallery/shared/Image.svelte (100%)
rename frontend/{ => legacy}/WaterfallGallery/shared/Waterfall/createWaterfall.ts (100%)
rename frontend/{ => legacy}/WaterfallGallery/shared/Waterfall/index.ts (100%)
rename frontend/{ => legacy}/WaterfallGallery/shared/Waterfall/layout.ts (100%)
rename frontend/{ => legacy}/WaterfallGallery/shared/utils.ts (100%)
rename frontend/{ => legacy}/compiled/CHANGELOG.md (61%)
rename frontend/{ => legacy}/compiled/components/FileView/index.svelte (100%)
rename frontend/{ => legacy}/compiled/components/FileView/shared/FileView.svelte (83%)
rename frontend/{ => legacy}/compiled/components/Flow/index.svelte (86%)
rename frontend/{ => legacy}/compiled/components/Markdown/index.svelte (86%)
rename frontend/{ => legacy}/compiled/components/ReactComponent.svelte (95%)
rename frontend/{ => legacy}/compiled/global.d.ts (100%)
rename frontend/{ => legacy}/compiled/index.ts (87%)
create mode 100644 frontend/legacy/compiled/package.json
rename frontend/{ => legacy}/compiled/src/ComponentConfigProvider.tsx (100%)
rename frontend/{ => legacy}/compiled/src/FileView/Pdf.tsx (100%)
rename frontend/{ => legacy}/compiled/src/FileView/hooks/usePreview.ts (100%)
rename frontend/{ => legacy}/compiled/src/FileView/index.less (100%)
rename frontend/{ => legacy}/compiled/src/FileView/index.tsx (100%)
rename frontend/{ => legacy}/compiled/src/Flow/FlowContext.ts (100%)
rename frontend/{ => legacy}/compiled/src/Flow/components/CustomComponent.tsx (100%)
rename frontend/{ => legacy}/compiled/src/Flow/components/FileUpload.tsx (100%)
rename frontend/{ => legacy}/compiled/src/Flow/components/FormListItemWrapper.tsx (100%)
rename frontend/{ => legacy}/compiled/src/Flow/flow-components/ConnectionHandle.tsx (100%)
rename frontend/{ => legacy}/compiled/src/Flow/flow-components/ConnectionLine.tsx (100%)
rename frontend/{ => legacy}/compiled/src/Flow/flow-components/Controls.tsx (100%)
rename frontend/{ => legacy}/compiled/src/Flow/flow-components/Edge.tsx (100%)
rename frontend/{ => legacy}/compiled/src/Flow/flow-components/Node.tsx (100%)
rename frontend/{ => legacy}/compiled/src/Flow/flow-components/Sidebar.tsx (100%)
rename frontend/{ => legacy}/compiled/src/Flow/i18n.ts (100%)
rename frontend/{ => legacy}/compiled/src/Flow/index.less (100%)
rename frontend/{ => legacy}/compiled/src/Flow/index.tsx (100%)
rename frontend/{ => legacy}/compiled/src/Flow/type.ts (100%)
rename frontend/{ => legacy}/compiled/src/Flow/utils.ts (99%)
rename frontend/{ => legacy}/compiled/src/Markdown/components/Anchor.tsx (100%)
rename frontend/{ => legacy}/compiled/src/Markdown/components/Audio.tsx (100%)
rename frontend/{ => legacy}/compiled/src/Markdown/components/Code.tsx (100%)
rename frontend/{ => legacy}/compiled/src/Markdown/components/CustomComponent.tsx (100%)
rename frontend/{ => legacy}/compiled/src/Markdown/components/Heading.tsx (100%)
rename frontend/{ => legacy}/compiled/src/Markdown/components/Image.tsx (100%)
rename frontend/{ => legacy}/compiled/src/Markdown/components/Video.tsx (100%)
rename frontend/{ => legacy}/compiled/src/Markdown/components/custom/Accordion.tsx (100%)
rename frontend/{ => legacy}/compiled/src/Markdown/components/custom/Chart.tsx (100%)
rename frontend/{ => legacy}/compiled/src/Markdown/components/custom/File.tsx (100%)
rename frontend/{ => legacy}/compiled/src/Markdown/components/custom/FlushingEnd.tsx (100%)
rename frontend/{ => legacy}/compiled/src/Markdown/components/custom/SelectBox.tsx (100%)
rename frontend/{ => legacy}/compiled/src/Markdown/context.ts (100%)
rename frontend/{ => legacy}/compiled/src/Markdown/hooks/useCustomProps.ts (100%)
rename frontend/{ => legacy}/compiled/src/Markdown/index.less (100%)
rename frontend/{ => legacy}/compiled/src/Markdown/index.tsx (100%)
rename frontend/{ => legacy}/compiled/src/Markdown/math.ts (100%)
rename frontend/{ => legacy}/compiled/src/Markdown/react-markdown.d.ts (100%)
rename frontend/{ => legacy}/compiled/src/Markdown/rehype-plugins/rehype-Inline-code-property.ts (100%)
rename frontend/{ => legacy}/compiled/src/Markdown/rehype-plugins/rehype-sanitize/index.d.ts (100%)
rename frontend/{ => legacy}/compiled/src/Markdown/rehype-plugins/rehype-sanitize/index.js (100%)
rename frontend/{ => legacy}/compiled/src/Markdown/rehype-plugins/rehype-sanitize/schema.js (100%)
rename frontend/{ => legacy}/compiled/src/Markdown/remark-plugins/remark-directive-rehype.ts (100%)
rename frontend/{ => legacy}/compiled/src/Markdown/type.ts (100%)
rename frontend/{ => legacy}/compiled/src/defineComponent.tsx (100%)
rename frontend/{ => legacy}/compiled/src/index.ts (100%)
rename frontend/{ => legacy}/compiled/src/mount.tsx (100%)
rename frontend/{ => legacy}/compiled/src/polyfills.ts (100%)
rename frontend/{ => legacy}/compiled/src/shared/hooks/useCustomComponent.ts (100%)
rename frontend/{ => legacy}/compiled/src/shared/hooks/useMemoizedEqualValue.ts (100%)
rename frontend/{ => legacy}/compiled/src/shared/hooks/useRefValue.ts (100%)
rename frontend/{ => legacy}/compiled/src/shared/index.ts (100%)
rename frontend/{ => legacy}/compiled/src/shared/type.ts (100%)
rename frontend/{ => legacy}/compiled/src/utils.ts (98%)
create mode 100644 frontend/plugin.js
delete mode 100644 frontend/shared/CHANGELOG.md
delete mode 100644 frontend/shared/package.json
create mode 100644 frontend/svelte-preprocess-react/component.ts
create mode 100644 frontend/svelte-preprocess-react/context.ts
create mode 100644 frontend/svelte-preprocess-react/events-polyfills.ts
create mode 100644 frontend/svelte-preprocess-react/index.ts
create mode 100644 frontend/svelte-preprocess-react/inject.ts
create mode 100644 frontend/svelte-preprocess-react/internal/Bridge.ts
create mode 100644 frontend/svelte-preprocess-react/internal/Child.ts
create mode 100644 frontend/svelte-preprocess-react/internal/ReactWrapper.svelte
create mode 100644 frontend/svelte-preprocess-react/internal/types.ts
create mode 100644 frontend/svelte-preprocess-react/polyfills.ts
create mode 100644 frontend/svelte-preprocess-react/react-slot.tsx
create mode 100644 frontend/svelte-preprocess-react/slot.ts
create mode 100644 frontend/svelte-preprocess-react/sveltify.ts
create mode 100644 frontend/svelte-preprocess-react/useStore.ts
create mode 100644 frontend/tsconfig.json
create mode 100644 frontend/utils/createFunction.ts
create mode 100644 frontend/utils/createItemsContext.tsx
create mode 100644 frontend/utils/hooks/useFunction.ts
create mode 100644 frontend/utils/hooks/useSlotsChildren.ts
create mode 100644 frontend/utils/hooks/useTargets.ts
create mode 100644 frontend/utils/hooks/useValueChange.ts
create mode 100644 frontend/utils/omitUndefinedProps.ts
create mode 100644 frontend/utils/renderItems.tsx
create mode 100644 frontend/utils/renderParamsSlot.tsx
create mode 100644 frontend/utils/renderSlot.tsx
create mode 100644 frontend/utils/styleObject2String.ts
rename frontend/{shared/src/index.ts => utils/upload.ts} (100%)
diff --git a/.changeset/five-actors-compete.md b/.changeset/five-actors-compete.md
new file mode 100644
index 00000000..b3735316
--- /dev/null
+++ b/.changeset/five-actors-compete.md
@@ -0,0 +1,17 @@
+---
+'@modelscope-studio/legacy-waterfall-gallery': patch
+'@modelscope-studio/legacy-multimodal-input': patch
+'@modelscope-studio/legacy-lifecycle': patch
+'@modelscope-studio/legacy-markdown': patch
+'@modelscope-studio/legacy-compiled': patch
+'@modelscope-studio/legacy-chatbot': patch
+'@modelscope-studio/legacy-flow': patch
+'@modelscope-studio/lint-config': patch
+'@modelscope-studio/changelog': patch
+'@modelscope-studio/antd': patch
+'@modelscope-studio/base': patch
+'@modelscope-studio/frontend': patch
+'modelscope_studio': patch
+---
+
+feat: complete components params in Python
diff --git a/.changeset/fuzzy-goats-retire.md b/.changeset/fuzzy-goats-retire.md
new file mode 100644
index 00000000..db0d20b5
--- /dev/null
+++ b/.changeset/fuzzy-goats-retire.md
@@ -0,0 +1,17 @@
+---
+'@modelscope-studio/legacy-waterfall-gallery': patch
+'@modelscope-studio/legacy-multimodal-input': patch
+'@modelscope-studio/legacy-lifecycle': patch
+'@modelscope-studio/legacy-markdown': patch
+'@modelscope-studio/legacy-compiled': patch
+'@modelscope-studio/legacy-chatbot': patch
+'@modelscope-studio/legacy-flow': patch
+'@modelscope-studio/lint-config': patch
+'@modelscope-studio/changelog': patch
+'@modelscope-studio/antd': patch
+'@modelscope-studio/base': patch
+'@modelscope-studio/frontend': patch
+'modelscope_studio': patch
+---
+
+feat: add new features
diff --git a/.changeset/lemon-laws-cross.md b/.changeset/lemon-laws-cross.md
new file mode 100644
index 00000000..c0acb047
--- /dev/null
+++ b/.changeset/lemon-laws-cross.md
@@ -0,0 +1,17 @@
+---
+'@modelscope-studio/legacy-waterfall-gallery': patch
+'@modelscope-studio/legacy-multimodal-input': patch
+'@modelscope-studio/legacy-lifecycle': patch
+'@modelscope-studio/legacy-markdown': patch
+'@modelscope-studio/legacy-compiled': patch
+'@modelscope-studio/legacy-chatbot': patch
+'@modelscope-studio/legacy-flow': patch
+'@modelscope-studio/lint-config': patch
+'@modelscope-studio/changelog': patch
+'@modelscope-studio/antd': patch
+'@modelscope-studio/base': patch
+'@modelscope-studio/frontend': patch
+'modelscope_studio': patch
+---
+
+feat: migrate to gradio 5
diff --git a/.changeset/pre.json b/.changeset/pre.json
new file mode 100644
index 00000000..7e81b4cd
--- /dev/null
+++ b/.changeset/pre.json
@@ -0,0 +1,25 @@
+{
+ "mode": "pre",
+ "tag": "beta",
+ "initialVersions": {
+ "modelscope_studio": "0.4.2",
+ "@modelscope-studio/changelog": "0.4.2",
+ "@modelscope-studio/lint-config": "0.4.2",
+ "@modelscope-studio/frontend": "0.4.2",
+ "@modelscope-studio/antd": "0.0.0",
+ "@modelscope-studio/base": "0.0.0",
+ "@modelscope-studio/legacy-chatbot": "0.4.2",
+ "@modelscope-studio/legacy-flow": "0.4.2",
+ "@modelscope-studio/legacy-lifecycle": "0.4.2",
+ "@modelscope-studio/legacy-markdown": "0.4.2",
+ "@modelscope-studio/legacy-multimodal-input": "0.4.2",
+ "@modelscope-studio/legacy-waterfall-gallery": "0.4.2",
+ "@modelscope-studio/legacy-compiled": "0.4.2"
+ },
+ "changesets": [
+ "five-actors-compete",
+ "fuzzy-goats-retire",
+ "lemon-laws-cross",
+ "tough-walls-grab"
+ ]
+}
diff --git a/.changeset/tough-walls-grab.md b/.changeset/tough-walls-grab.md
new file mode 100644
index 00000000..24863ec9
--- /dev/null
+++ b/.changeset/tough-walls-grab.md
@@ -0,0 +1,17 @@
+---
+'@modelscope-studio/legacy-waterfall-gallery': major
+'@modelscope-studio/legacy-multimodal-input': major
+'@modelscope-studio/legacy-lifecycle': major
+'@modelscope-studio/legacy-markdown': major
+'@modelscope-studio/legacy-compiled': major
+'@modelscope-studio/legacy-chatbot': major
+'@modelscope-studio/legacy-flow': major
+'@modelscope-studio/lint-config': major
+'@modelscope-studio/changelog': major
+'@modelscope-studio/antd': major
+'@modelscope-studio/base': major
+'@modelscope-studio/frontend': major
+'modelscope_studio': major
+---
+
+feat: integrate ant design
diff --git a/.github/workflows/lint.yaml b/.github/workflows/lint.yaml
index 48301c97..558b283e 100644
--- a/.github/workflows/lint.yaml
+++ b/.github/workflows/lint.yaml
@@ -29,7 +29,5 @@ jobs:
run: npm i pnpm@latest -g
- name: Install Node Dependencies
run: pnpm install
- - name: Build Dependencies
- run: pnpm run build:compiled
- name: Run Lint
run: pnpm run lint
diff --git a/.husky/commit-msg b/.husky/commit-msg
index 9b58085f..0c61d206 100755
--- a/.husky/commit-msg
+++ b/.husky/commit-msg
@@ -1,4 +1 @@
-#!/bin/sh
-. "$(dirname "$0")/_/husky.sh"
-
-npx commitlint -e $HUSKY_GIT_PARAMS
+pnpm exec commitlint -e $HUSKY_GIT_PARAMS
diff --git a/.husky/pre-commit b/.husky/pre-commit
index 36af2198..5ee7abd8 100755
--- a/.husky/pre-commit
+++ b/.husky/pre-commit
@@ -1,4 +1 @@
-#!/bin/sh
-. "$(dirname "$0")/_/husky.sh"
-
-npx lint-staged
+pnpm exec lint-staged
diff --git a/.lintstagedrc b/.lintstagedrc
index cfaf6972..e1370fbc 100644
--- a/.lintstagedrc
+++ b/.lintstagedrc
@@ -1,6 +1,6 @@
{
"*.{less,css}": ["pnpm run lint:style", "pnpm run format"],
- "*.{js,jsx,ts,tsx}": ["pnpm run lint:js", "pnpm run format"],
+ "*.{js,jsx,ts,tsx,svelte}": ["pnpm run lint:js", "pnpm run format"],
"*.{md,yaml,yml,json,html}": ["pnpm run format"],
"*.py": ["pnpm run lint:py"]
}
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 5572ad99..1da8ac51 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,29 @@
# modelscope_studio
+## 1.0.0-beta.3
+
+### Features
+
+- [`9f3c59c`](https://github.com/modelscope/modelscope-studio/commit/9f3c59c9c5a0bf8af3980588cb07a467323b1d17) - add new features. Thanks [@Col0ring](https://github.com/Col0ring)!
+
+## 1.0.0-beta.2
+
+### Features
+
+- [`9e5da52`](https://github.com/modelscope/modelscope-studio/commit/9e5da52fc739c6862225192fecf95f6bfd7923ad) - complete components params in Python. Thanks [@Col0ring](https://github.com/Col0ring)!
+
+## 1.0.0-beta.1
+
+### Features
+
+- [`025f728`](https://github.com/modelscope/modelscope-studio/commit/025f72825bdafbc60b4a09e577a363e43189bd1d) - migrate to gradio 5. Thanks [@Col0ring](https://github.com/Col0ring)!
+
+## 1.0.0-beta.0
+
+### Features
+
+- [`4a46970`](https://github.com/modelscope/modelscope-studio/commit/4a46970007452af606abe02cdfa54a4959b2f3db) - integrate ant design. Thanks [@Col0ring](https://github.com/Col0ring)!
+
## 0.5.2
### Fixes
diff --git a/README-zh_CN.md b/README-zh_CN.md
index 50f7847c..2e09d7ff 100644
--- a/README-zh_CN.md
+++ b/README-zh_CN.md
@@ -1,4 +1,6 @@
-
ModelScope Studio
+> 当前文档版本为 `1.0 beta`,如果您正在使用以前的`modelscope_studio`版本,请跳转至 [legacy](https://github.com/modelscope/modelscope-studio/tree/legacy) 分支查看。
+
+# ModelScope Studio
@@ -9,66 +11,67 @@
-GitHub | 🤖 ModelScope Studio | 🤗 Hugging Face Space
+GitHub | 🤖 ModelScope Studio | 🤗 Hugging Face Space
中文  |  English   |  日本語
-`modelscope_studio` 是一套基于 gradio 4.x 的扩展组件库,致力于服务于 ModelScope 创空间中对于 gradio 应用的各类扩展需求,目前主要聚集在对话场景增强、多模态场景以及一些其他垂直场景支持。
+`modelscope_studio`是一个基于 Gradio 的三方组件库,在原有 Gradio 组件的基础上延伸了更多的组件和使用形式。
+
+目前支持的 UI 库:
+
+- [Ant Design](https://ant.design/)
+
+## 何时使用
+
+比起 Gradio 自身的组件,`modelscope_studio`更加注重页面布局和组件的灵活性,如果您想要构建更漂亮的用户界面,我们非常推荐您使用`modelscope_studio`。然而,当您的应用需要 Gradio 在 Python 端更多地处理内置数据时,`modelscope_studio`可能不是最好的选择,但仍然可以使用`modelscope_studio`的布局和展示组件来帮助您构建页面。
+
+## 依赖
+
+- Gradio >= 4.0
## 安装
```sh
-pip install modelscope_studio
+pip install modelscope_studio~=1.0.0b
```
## 快速开始
```python
-import time
import gradio as gr
-import modelscope_studio as mgr
-
-def submit(_input, _chatbot):
- print('text:', _input.text)
- print('files: ', _input.files)
- _chatbot.append([_input, None])
- yield _chatbot
- time.sleep(1)
- _chatbot[-1][1] = [{
- "flushing": False,
- "text": 'bot1: ' + _input.text + '!'
- }, {
- "text": 'bot2: ' + _input.text + '!'
- }]
- yield {
- chatbot: _chatbot,
- }
-with gr.Blocks() as demo:
- chatbot = mgr.Chatbot(height=400)
+import modelscope_studio.components.antd as antd
+import modelscope_studio.components.base as ms
- input = mgr.MultimodalInput()
- input.submit(fn=submit, inputs=[input, chatbot], outputs=[chatbot])
+with gr.Blocks() as demo:
+ with ms.Application():
+ with antd.ConfigProvider():
+ antd.DatePicker()
demo.queue().launch()
```
-
+## 文档与示例
-## 组件文档
+- ModelScope: [中文](https://modelscope.cn/studios/modelscope/modelscope-studio-beta)
+- Hugging Face: [English](<(https://huggingface.co/spaces/modelscope/modelscope-studio-beta)>)
-目前已支持的组件包括:
+## 迁移到 1.0
-- Chatbot: gradio Chatbot 扩展组件,支持输出多模态内容、支持多 bot 场景、支持对话内容内的自定义渲染组件及事件交互。
-- MultimodalInput: 多模态输入框,支持上传文件、录音、照相等功能。
-- Markdown: gradio Markdown 扩展组件,支持输出多模态内容(音频、视频、语音、文件、文本)。
-- Lifecycle: 生命周期组件,用于获取当前用户的环境信息。
-- WaterfallGallery: gradio Gallery 扩展组件,支持瀑布流的图像展示。
-- Flow: 基于 [reactflow](https://reactflow.dev/) 的 Flow 组件,支持通过 schema 定制节点渲染。
-- 更多组件...
+如果您在之前使用了`modelscope_studio`的组件,并且想要在新版本中继续使用。不需要对原有组件做任何修改,只需要在外层引入`ms.Application`即可。
-详细使用参见 [文档与示例](https://modelscope.cn/studios/modelscope/modelscope-studio/summary)
+```python
+import gradio as gr
+import modelscope_studio.components.base as ms
+import modelscope_studio.components.legacy as mgr
+
+with gr.Blocks() as demo:
+ with ms.Application():
+ mgr.Chatbot()
+
+demo.launch()
+```
## 开发
@@ -86,14 +89,8 @@ pnpm install
pnpm build
```
-运行 Demo!
-
-```sh
-gradio docs/app.py
-```
-
-或者像下面这样运行单个 Demo:
+运行 `gradio cc dev` 启动 demo:
```sh
-gradio docs/components/Chatbot/demos/basic.py
+gradio cc dev docs/app.py
```
diff --git a/README.md b/README.md
index 737cd15c..d53a59b8 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,6 @@
-ModelScope Studio
+> The current document version is `1.0 beta`. If you are using a previous version of `modelscope_studio`, please switch to the [legacy](https://github.com/modelscope/modelscope-studio/tree/legacy) branch for reference.
+
+# ModelScope Studio
@@ -9,66 +11,69 @@
-GitHub | 🤖 ModelScope Studio | 🤗 Hugging Face Space
+GitHub | 🤖 ModelScope Studio | 🤗 Hugging Face Space
- 中文   |  English  |  日本語
+ 中文   |  English  |  日本語
-`modelscope_studio` is a set of extension component libraries based on gradio 4.x, dedicated to serving the various extension needs of gradio applications within the ModelScope Studio. It mainly focuses on enhancing conversational scenarios, supporting multimodal contexts, and providing assistance for various other specialized scenarios.
+`modelscope_studio` is a third-party component library based on Gradio, extending more components and usage forms on top of the original Gradio components.
+
+Currently supported UI libraries:
+
+- [Ant Design](https://ant.design/)
+
+## When to Use
+
+Compared to Gradio's own components, `modelscope_studio` focuses more on page layout and component flexibility. If you want to build a more beautiful user interface, we highly recommend using `modelscope_studio`. However, when your application needs Gradio to handle more built-in data on the Python side, `modelscope_studio` may not be the best choice, but you can still use `modelscope_studio`'s layout and display components to help you build pages.
-## Install
+## Dependencies
+
+- Gradio >= 4.0
+
+## Installation
+
+> Currently, `modelscope_studio` version 1.0 is still under development. You can use the `beta` version in advance.
```sh
-pip install modelscope_studio
+pip install modelscope_studio~=1.0.0b
```
-## Quickstart
+## Quick Start
```python
-import time
import gradio as gr
-import modelscope_studio as mgr
-
-def submit(_input, _chatbot):
- print('text:', _input.text)
- print('files: ', _input.files)
- _chatbot.append([_input, None])
- yield _chatbot
- time.sleep(1)
- _chatbot[-1][1] = [{
- "flushing": False,
- "text": 'bot1: ' + _input.text + '!'
- }, {
- "text": 'bot2: ' + _input.text + '!'
- }]
- yield {
- chatbot: _chatbot,
- }
-with gr.Blocks() as demo:
- chatbot = mgr.Chatbot(height=400)
+import modelscope_studio.components.antd as antd
+import modelscope_studio.components.base as ms
- input = mgr.MultimodalInput()
- input.submit(fn=submit, inputs=[input, chatbot], outputs=[chatbot])
+with gr.Blocks() as demo:
+ with ms.Application():
+ with antd.ConfigProvider():
+ antd.DatePicker()
demo.queue().launch()
```
-
+## Documentation and Examples
-## Component Docs
+- ModelScope: [中文](https://modelscope.cn/studios/modelscope/modelscope-studio-beta)
+- Hugging Face: [English](<(https://huggingface.co/spaces/modelscope/modelscope-studio-beta)>)
-The currently supported components include:
+## Migration to 1.0
-- Chatbot: Gradio Chatbot extension component, supports multi-modal content output, multi-bot scenarios, and custom rendering components and event interactions within the conversation content.
-- MultimodalInput: A multi-modal input box, supporting functions such as file upload, recording, and photography.
-- Markdown: Gradio Markdown extension component, supports the output of multi-modal content (audio, video, voice, files, text).
-- Lifecycle: A Lifecycle component for getting the current user's environment information.
-- WaterfallGallery: Gradio Gallery extension component, supports waterfall-style image display.
-- Flow: A Flow component implemented based on [reactflow](https://reactflow.dev/), supports customization of node rendering through a schema.
-- More components...
+If you have previously used `modelscope_studio` components and want to continue using them in the new version, no modifications to the original components are needed. You just need to introduce `ms.Application` in the outer layer.
-For detailed usage, see [Documentation and Examples](https://modelscope.cn/studios/modelscope/modelscope-studio/summary)
+```python
+import gradio as gr
+import modelscope_studio.components.base as ms
+import modelscope_studio.components.legacy as mgr
+
+with gr.Blocks() as demo:
+ with ms.Application():
+ mgr.Chatbot()
+
+demo.launch()
+```
## Development
@@ -86,14 +91,8 @@ pnpm install
pnpm build
```
-Run demo!
-
-```sh
-gradio docs/app.py
-```
-
-or run a single demo like this:
+Run `gradio cc dev` to start demo:
```sh
-gradio docs/components/Chatbot/demos/basic.py
+gradio cc dev docs/app.py
```
diff --git a/backend/modelscope_studio/__init__.py b/backend/modelscope_studio/__init__.py
index a86d5328..72fa8f2c 100644
--- a/backend/modelscope_studio/__init__.py
+++ b/backend/modelscope_studio/__init__.py
@@ -1,8 +1,5 @@
-from .components import ModelScopeChatbot as Chatbot
-from .components import ModelScopeFlow as Flow
-from .components import ModelScopeLifecycle as Lifecycle
-from .components import ModelScopeMarkdown as Markdown
-from .components import ModelScopeMultimodalInput as MultimodalInput
-from .components import ModelScopeWaterfallGallery as WaterfallGallery
+from .components.antd.components import *
+from .components.base import *
+from .components.legacy import *
from .external import load
from .version import __version__
diff --git a/backend/modelscope_studio/components/__init__.py b/backend/modelscope_studio/components/__init__.py
deleted file mode 100644
index 190ba297..00000000
--- a/backend/modelscope_studio/components/__init__.py
+++ /dev/null
@@ -1,6 +0,0 @@
-from .Chatbot import ModelScopeChatbot
-from .Flow import ModelScopeFlow
-from .Lifecycle import ModelScopeLifecycle
-from .Markdown import ModelScopeMarkdown
-from .MultimodalInput import ModelScopeMultimodalInput
-from .WaterfallGallery import ModelScopeWaterfallGallery
diff --git a/backend/modelscope_studio/components/antd/__init__.py b/backend/modelscope_studio/components/antd/__init__.py
new file mode 100644
index 00000000..d1e17f65
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/__init__.py
@@ -0,0 +1,145 @@
+from .affix import AntdAffix as Affix
+from .alert import AntdAlert as Alert
+from .alert.error_boundary import AntdAlertErrorBoundary as AlertErrorBoundary
+from .anchor import AntdAnchor as Anchor
+from .anchor.item import AntdAnchorItem as AnchorItem
+from .auto_complete import AntdAutoComplete as AutoComplete
+from .auto_complete.option import AntdAutoCompleteOption as AutoCompleteOption
+from .avatar import AntdAvatar as Avatar
+from .avatar.group import AntdAvatarGroup as AvatarGroup
+from .badge import AntdBadge as Badge
+from .badge.ribbon import AntdBadgeRibbon as BadgeRibbon
+from .breadcrumb import AntdBreadcrumb as Breadcrumb
+from .breadcrumb.item import AntdBreadcrumbItem as BreadcrumbItem
+from .button import AntdButton as Button
+from .button.group import AntdButtonGroup as ButtonGroup
+from .calendar import AntdCalendar as Calendar
+from .card import AntdCard as Card
+from .card.grid import AntdCardGrid as CardGrid
+from .card.meta import AntdCardMeta as CardMeta
+from .carousel import AntdCarousel as Carousel
+from .cascader import AntdCascader as Cascader
+from .cascader.option import AntdCascaderOption as CascaderOption
+from .cascader.panel import AntdCascaderPanel as CascaderPanel
+from .checkbox import AntdCheckbox as Checkbox
+from .checkbox.group import AntdCheckboxGroup as CheckboxGroup
+from .checkbox.group.option import \
+ AntdCheckboxGroupOption as CheckboxGroupOption
+from .collapse import AntdCollapse as Collapse
+from .collapse.item import AntdCollapseItem as CollapseItem
+from .color_picker import AntdColorPicker as ColorPicker
+from .color_picker.preset import AntdColorPickerPreset as ColorPickerPreset
+from .config_provider import AntdConfigProvider as ConfigProvider
+from .date_picker import AntdDatePicker as DatePicker
+from .date_picker.preset import AntdDatePickerPreset as DatePickerPreset
+from .date_picker.range_picker import \
+ AntdDatePickerRangePicker as DatePickerRangePicker
+from .descriptions import AntdDescriptions as Descriptions
+from .descriptions.item import AntdDescriptionsItem as DescriptionsItem
+from .divider import AntdDivider as Divider
+from .drawer import AntdDrawer as Drawer
+from .dropdown import AntdDropdown as Dropdown
+from .dropdown.button import AntdDropdownButton as DropdownButton
+from .empty import AntdEmpty as Empty
+from .flex import AntdFlex as Flex
+from .float_button import AntdFloatButton as FloatButton
+from .float_button.back_top import AntdFloatButtonBackTop as FloatButtonBackTop
+from .float_button.group import AntdFloatButtonGroup as FloatButtonGroup
+from .form import AntdForm as Form
+from .form.item import AntdFormItem as FormItem
+from .form.item.rule import AntdFormItemRule as FormItemRule
+from .grid.col import AntdCol as Col
+from .grid.row import AntdRow as Row
+from .icon import AntdIcon as Icon
+from .icon.iconfont_provider import \
+ AntdIconIconfontProvider as IconIconfontProvider
+from .image import AntdImage as Image
+from .image.preview_group import AntdImagePreviewGroup as ImagePreviewGroup
+from .input import AntdInput as Input
+from .input.otp import AntdInputOTP as InputOTP
+from .input.password import AntdInputPassword as InputPassword
+from .input.search import AntdInputSearch as InputSearch
+from .input.textarea import AntdInputTextarea as InputTextarea
+from .input_number import AntdInputNumber as InputNumber
+from .layout import AntdLayout as Layout
+from .layout.content import AntdLayoutContent as LayoutContent
+from .layout.footer import AntdLayoutFooter as LayoutFooter
+from .layout.header import AntdLayoutHeader as LayoutHeader
+from .layout.sider import AntdLayoutSider as LayoutSider
+from .list import AntdList as List
+from .list.item import AntdListItem as ListItem
+from .list.item.meta import AntdListItemMeta as ListItemMeta
+from .mentions import AntdMentions as Mentions
+from .mentions.option import AntdMentionsOption as MentionsOption
+from .menu import AntdMenu as Menu
+from .menu.item import AntdMenuItem as MenuItem
+from .message import AntdMessage as Message
+from .modal import AntdModal as Modal
+from .notification import AntdNotification as Notification
+from .pagination import AntdPagination as Pagination
+from .popconfirm import AntdPopconfirm as Popconfirm
+from .popover import AntdPopover as Popover
+from .progress import AntdProgress as Progress
+from .qr_code import AntdQRCode as QRCode
+from .radio import AntdRadio as Radio
+from .radio.button import AntdRadioButton as RadioButton
+from .radio.group import AntdRadioGroup as RadioGroup
+from .radio.group.option import AntdRadioGroupOption as RadioGroupOption
+from .rate import AntdRate as Rate
+from .result import AntdResult as Result
+from .segmented import AntdSegmented as Segmented
+from .segmented.option import AntdSegmentedOption as SegmentedOptions
+from .select import AntdSelect as Select
+from .select.option import AntdSelectOption as SelectOption
+from .skeleton import AntdSkeleton as Skeleton
+from .skeleton.avatar import AntdSkeletonAvatar as SkeletonAvatar
+from .skeleton.button import AntdSkeletonButton as SkeletonButton
+from .skeleton.image import AntdSkeletonImage as SkeletonImage
+from .skeleton.input import AntdSkeletonInput as SkeletonInput
+from .skeleton.node import AntdSkeletonNode as SkeletonNode
+from .slider import AntdSlider as Slider
+from .slider.mark import AntdSliderMark as SliderMark
+from .space import AntdSpace as Space
+from .space.compact import AntdSpaceCompact as SpaceCompact
+from .spin import AntdSpin as Spin
+from .splitter import AntdSplitter as Splitter
+from .splitter.panel import AntdSplitterPanel as SplitterPanel
+from .statistic import AntdStatistic as Statistic
+from .statistic import AntdStatisticCountdown as StatisticCountdown
+from .steps import AntdSteps as Steps
+from .steps.item import AntdStepsItem as StepsItem
+from .switch import AntdSwitch as Switch
+from .table import AntdTable as Table
+from .table.column import AntdTableColumn as TableColumn
+from .table.column_group import AntdTableColumnGroup as TableColumnGroup
+from .table.expandable import AntdTableExpandable as TableExpandable
+from .table.row_selection import AntdTableRowSelection as TableRowSelection
+from .table.row_selection.selection import \
+ AntdTableRowSelectionSelection as TableRowSelectionSelection
+from .tabs import AntdTabs as Tabs
+from .tabs.item import AntdTabsItem as TabsItem
+from .tag import AntdTag as Tag
+from .tag.checkable_tag import AntdTagCheckableTag as TagCheckableTag
+from .time_picker import AntdTimePicker as TimePicker
+from .time_picker.range_picker import \
+ AntdTimePickerRangePicker as TimePickerRangePicker
+from .timeline import AntdTimeline as Timeline
+from .timeline.item import AntdTimelineItem as TimelineItem
+from .tooltip import AntdTooltip as Tooltip
+from .tour import AntdTour as Tour
+from .tour.step import AntdTourStep as TourStep
+from .transfer import AntdTransfer as Transfer
+from .tree import AntdTree as Tree
+from .tree.directory_tree import AntdTreeDirectoryTree as TreeDirectoryTree
+from .tree.tree_node import AntdTreeTreeNode as TreeTreeNode
+from .tree_select import AntdTreeSelect as TreeSelect
+from .tree_select.tree_node import AntdTreeSelectTreeNode as TreeSelectTreeNode
+from .typography import AntdTypography as Typography
+from .typography.link import AntdTypographyLink as TypographyLink
+from .typography.paragraph import \
+ AntdTypographyParagraph as TypographyParagraph
+from .typography.text import AntdTypographyText as TypographyText
+from .typography.title import AntdTypographyTitle as TypographyTitle
+from .upload import AntdUpload as Upload
+from .upload.dragger import AntdUploadDragger as UploadDragger
+from .watermark import AntdWatermark as Watermark
diff --git a/backend/modelscope_studio/components/antd/affix/__init__.py b/backend/modelscope_studio/components/antd/affix/__init__.py
new file mode 100644
index 00000000..714ac0c0
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/affix/__init__.py
@@ -0,0 +1,79 @@
+from __future__ import annotations
+
+from typing import Any
+
+from gradio.events import EventListener
+
+from ....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+
+
+class AntdAffix(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/affix
+
+ Stick an element to the viewport.
+
+ When to use:
+ On longer web pages, it's helpful to stick component into the viewport. This is common for menus and actions.
+
+ Please note that Affix should not cover other content on the page, especially when the size of the viewport is small.
+ """
+ EVENTS = [
+ EventListener("change",
+ callback=lambda block: block._internal.update(
+ bind_change_event=True),
+ doc="Callback for when Affix state is changed.")
+ ]
+
+ def __init__(
+ self,
+ props: dict | None = None,
+ *,
+ offset_bottom: int | float | None = None,
+ offset_top: int | float | None = 0,
+ get_target: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ """
+ Parameters:
+ offset_bottom: Offset from the bottom of the viewport (in pixels).
+ offset_top: Offset from the top of the viewport (in pixels).
+ get_target: Specifies the scrollable area DOM node.
+ """
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.offset_bottom = offset_bottom
+ self.offset_top = offset_top
+ self.get_target = get_target
+
+ FRONTEND_DIR = resolve_frontend_dir("affix")
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: None) -> None:
+ return payload
+
+ def postprocess(self, value: None) -> None:
+
+ return value
+
+ def example_payload(self) -> Any:
+ return None
+
+ def example_value(self) -> Any:
+ return None
diff --git a/backend/modelscope_studio/components/antd/alert/__init__.py b/backend/modelscope_studio/components/antd/alert/__init__.py
new file mode 100644
index 00000000..a57562f0
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/alert/__init__.py
@@ -0,0 +1,84 @@
+from __future__ import annotations
+
+from typing import Any, Literal
+
+from gradio.events import EventListener
+
+from ....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+from .error_boundary import AntdAlertErrorBoundary
+
+
+class AntdAlert(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/alert
+ """
+ ErrorBoundary = AntdAlertErrorBoundary
+ EVENTS = [
+ EventListener("close",
+ callback=lambda block: block._internal.update(
+ bind_close_event=True))
+ ]
+
+ # supported slots
+ SLOTS = ['action', 'closable.closeIcon', 'description', 'icon', 'message']
+
+ def __init__(
+ self,
+ props: dict | None = None,
+ *,
+ action: str | None = None,
+ after_close: str | None = None,
+ banner: bool | None = None,
+ closable: bool | dict | None = None,
+ description: str | None = None,
+ icon: str | None = None,
+ message: str | None = None,
+ show_icon: bool | None = None,
+ type: Literal['success', 'info', 'warning', 'error'] | None = None,
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.action = action
+ self.after_close = after_close
+ self.banner = banner
+ self.closable = closable
+ self.description = description
+ self.icon = icon
+ self.message = message
+ self.show_icon = show_icon
+ self.type = type
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("alert")
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: None) -> None:
+ return payload
+
+ def postprocess(self, value: None) -> None:
+
+ return value
+
+ def example_payload(self) -> Any:
+ return None
+
+ def example_value(self) -> Any:
+ return None
diff --git a/backend/modelscope_studio/components/antd/alert/error_boundary/__init__.py b/backend/modelscope_studio/components/antd/alert/error_boundary/__init__.py
new file mode 100644
index 00000000..a7a9f711
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/alert/error_boundary/__init__.py
@@ -0,0 +1,68 @@
+from __future__ import annotations
+
+from typing import Any
+
+from gradio.events import EventListener
+
+from .....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+
+
+class AntdAlertErrorBoundary(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/alert
+ """
+ EVENTS = [
+ EventListener("close",
+ callback=lambda block: block._internal.update(
+ bind_close_event=True))
+ ]
+
+ # supported slots
+ SLOTS = ['description', 'message']
+
+ def __init__(
+ self,
+ props: dict | None = None,
+ *,
+ description: str | None = None,
+ message: str | None = None,
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.description = description
+ self.message = message
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("alert", "error-boundary")
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: None) -> None:
+ return payload
+
+ def postprocess(self, value: None) -> None:
+
+ return value
+
+ def example_payload(self) -> Any:
+ return None
+
+ def example_value(self) -> Any:
+ return None
diff --git a/backend/modelscope_studio/components/antd/anchor/__init__.py b/backend/modelscope_studio/components/antd/anchor/__init__.py
new file mode 100644
index 00000000..72a7fcba
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/anchor/__init__.py
@@ -0,0 +1,112 @@
+from __future__ import annotations
+
+from typing import Any, Literal
+
+from gradio.events import EventListener
+
+from ....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+from .item import AntdAnchorItem
+
+
+class AntdAnchor(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/anchor
+ Hyperlinks to scroll on one page.
+
+ When to use:
+ For displaying anchor hyperlinks on page and jumping between them.
+ """
+ Item = AntdAnchorItem
+ EVENTS = [
+ EventListener("change",
+ callback=lambda block: block._internal.update(
+ bind_change_event=True),
+ doc="Listening for anchor link change"),
+ EventListener("click",
+ callback=lambda block: block._internal.update(
+ bind_click_event=True),
+ doc="Set the handler to handle click event."),
+ EventListener('affix_change',
+ callback=lambda block: block._internal.update(
+ bind_affix_change_event=True),
+ doc="Callback for when Affix state is changed")
+ ]
+
+ # supported slots
+ SLOTS = ['items']
+
+ def __init__(
+ self,
+ props: dict | None = None,
+ *,
+ affix: bool | dict = True,
+ bounds: int | float = 5,
+ get_container: str | None = None,
+ get_current_anchor: str | None = None,
+ offset_top: int | float = 0,
+ show_ink_in_fixed: bool = False,
+ target_offset: int | float | None = None,
+ items: list[dict] | None = None,
+ direction: Literal['vertical', 'horizontal'] = 'vertical',
+ replace: bool = False,
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ """
+ Parameters:
+ affix: Fixed mode of Anchor.
+ bounds: Bounding distance of anchor area.
+ get_container: Scrolling container.
+ get_current_anchor: Customize the anchor highlightL.
+ offset_top: Pixels to offset from top when calculating position of scroll.
+ show_ink_in_fixed: Whether show ink-square when affix=False.
+ target_offset: Anchor scroll offset, default as offsetTop.
+ items: Data configuration option content, support nesting through children.
+ direction: Set Anchor direction.
+ replace: Replace items' href in browser history instead of pushing it.
+ """
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.affix = affix
+ self.bounds = bounds
+ self.get_container = get_container
+ self.get_current_anchor = get_current_anchor
+ self.offset_top = offset_top
+ self.show_ink_in_fixed = show_ink_in_fixed
+ self.target_offset = target_offset
+ self.items = items
+ self.direction = direction
+ self.replace = replace
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("anchor")
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: None) -> None:
+ return payload
+
+ def postprocess(self, value: None) -> None:
+
+ return value
+
+ def example_payload(self) -> Any:
+ return None
+
+ def example_value(self) -> Any:
+ return None
diff --git a/backend/modelscope_studio/components/antd/anchor/item/__init__.py b/backend/modelscope_studio/components/antd/anchor/item/__init__.py
new file mode 100644
index 00000000..69b7f2e6
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/anchor/item/__init__.py
@@ -0,0 +1,77 @@
+from __future__ import annotations
+
+from typing import Any
+
+from .....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+
+
+class AntdAnchorItem(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/anchor
+ Hyperlinks to scroll on one page.
+
+ When to use:
+ For displaying anchor hyperlinks on page and jumping between them.
+ """
+ EVENTS = []
+ # supported slots
+ SLOTS = ["title"]
+
+ def __init__(
+ self,
+ title: str | None = None,
+ props: dict | None = None,
+ *,
+ key: str | None = None,
+ replace: bool = False,
+ href: str | None = None,
+ href_target: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ """
+ Parameters:
+ title: The content of hyperlink.
+ key: The unique identifier of the Anchor Link.
+ href: The target of hyperlink.
+ href_target: Specifies where to display the linked URL.
+ replace: Replace item href in browser history instead of pushing it.
+ """
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.title = title
+ self.key = key
+ self.replace = replace
+ self.href = href
+ self.href_target = href_target
+
+ FRONTEND_DIR = resolve_frontend_dir("anchor", "item")
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: None) -> None:
+ return payload
+
+ def postprocess(self, value: None) -> None:
+
+ return value
+
+ def example_payload(self) -> Any:
+ return None
+
+ def example_value(self) -> Any:
+ return None
diff --git a/backend/modelscope_studio/components/antd/auto_complete/__init__.py b/backend/modelscope_studio/components/antd/auto_complete/__init__.py
new file mode 100644
index 00000000..f682caef
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/auto_complete/__init__.py
@@ -0,0 +1,135 @@
+from __future__ import annotations
+
+from typing import Any, Literal
+
+from gradio.events import EventListener
+
+from ....utils.dev import ModelScopeDataLayoutComponent, resolve_frontend_dir
+from .option import AntdAutoCompleteOption
+
+
+# as inputs, outputs
+class AntdAutoComplete(ModelScopeDataLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/auto-complete/
+ """
+ Option = AntdAutoCompleteOption
+
+ EVENTS = [
+ EventListener("change",
+ callback=lambda block: block._internal.update(
+ bind_change_event=True)),
+ EventListener("blur",
+ callback=lambda block: block._internal.update(
+ bind_blur_event=True)),
+ EventListener("focus",
+ callback=lambda block: block._internal.update(
+ bind_focus_event=True)),
+ EventListener("search",
+ callback=lambda block: block._internal.update(
+ bind_search_event=True)),
+ EventListener("select",
+ callback=lambda block: block._internal.update(
+ bind_select_event=True)),
+ EventListener("clear",
+ callback=lambda block: block._internal.update(
+ bind_clear_event=True)),
+ EventListener("dropdown_visible_change",
+ callback=lambda block: block._internal.update(
+ bind_dropdownVisibleChange_event=True)),
+ ]
+
+ # supported slots
+ SLOTS = [
+ 'allowClear.clearIcon', 'dropdownRender', 'children', 'notFoundContent'
+ ]
+
+ def __init__(
+ self,
+ value: str | None = None,
+ props: dict | None = None,
+ *,
+ allow_clear: bool | dict = False,
+ auto_focus: bool = False,
+ backfill: bool = False,
+ default_active_first_option: bool = True,
+ default_open: bool | None = None,
+ default_value: str | None = None,
+ disabled: bool = False,
+ dropdown_render: str | None = None,
+ popup_class_name: str | None = None,
+ popup_match_select_width: bool | int | float = True,
+ filter_option: bool | str = True,
+ get_popup_container: str | None = None,
+ not_found_content: str | None = None,
+ open: bool | None = None,
+ options: list[dict] | None = None,
+ placeholder: str | None = None,
+ placement: Literal['bottomLeft', 'bottomRight', 'topLeft',
+ 'topRight'] | None = None,
+ size: Literal['small', 'middle', 'large'] | None = None,
+ status: Literal['error', 'warning'] | None = None,
+ variant: Literal['outlined', 'borderless', 'filled']
+ | None = 'outlined',
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(value=value,
+ visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.allow_clear = allow_clear
+ self.auto_focus = auto_focus
+ self.backfill = backfill
+ self.default_active_first_option = default_active_first_option
+ self.default_open = default_open
+ self.default_value = default_value
+ self.disabled = disabled
+ self.dropdown_render = dropdown_render
+ self.popup_class_name = popup_class_name
+ self.popup_match_select_width = popup_match_select_width
+ self.filter_option = filter_option
+ self.get_popup_container = get_popup_container
+ self.not_found_content = not_found_content
+ self.open = open
+ self.options = options
+ self.placeholder = placeholder
+ self.status = status
+ self.variant = variant
+ self.placement = placement
+ self.size = size
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("auto-complete")
+
+ @property
+ def skip_api(self):
+ return False
+
+ def api_info(self) -> dict[str, Any]:
+ return {"type": "string"}
+
+ def preprocess(self, payload: None | str) -> None | str:
+ return payload
+
+ def postprocess(self, value: None | str) -> None | str:
+
+ return value
+
+ def example_payload(self) -> None:
+ return None
+
+ def example_value(self) -> None:
+ return None
diff --git a/backend/modelscope_studio/components/antd/auto_complete/option/__init__.py b/backend/modelscope_studio/components/antd/auto_complete/option/__init__.py
new file mode 100644
index 00000000..71bb47c4
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/auto_complete/option/__init__.py
@@ -0,0 +1,62 @@
+from __future__ import annotations
+
+from typing import Any
+
+from .....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+
+
+class AntdAutoCompleteOption(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/auto-complete/
+ """
+
+ EVENTS = []
+
+ # supported slots
+ SLOTS = [
+ 'label',
+ ]
+
+ def __init__(
+ self,
+ value: str | None = None,
+ label: str | None = None,
+ props: dict | None = None,
+ *,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.value = value
+ self.label = label
+
+ FRONTEND_DIR = resolve_frontend_dir("auto-complete", "option")
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: None) -> None:
+ return payload
+
+ def postprocess(self, value: None) -> None:
+ return value
+
+ def example_payload(self) -> Any:
+ return None
+
+ def example_value(self) -> Any:
+ return None
diff --git a/backend/modelscope_studio/components/antd/avatar/__init__.py b/backend/modelscope_studio/components/antd/avatar/__init__.py
new file mode 100644
index 00000000..6eb6f8bf
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/avatar/__init__.py
@@ -0,0 +1,109 @@
+from __future__ import annotations
+
+from pathlib import Path
+from typing import Any, Literal, Union
+
+from gradio import processing_utils
+from gradio.data_classes import FileData, GradioRootModel
+from gradio.events import EventListener
+
+from ....utils.dev import ModelScopeDataLayoutComponent, resolve_frontend_dir
+from .group import AntdAvatarGroup
+
+
+class AntdAvatarData(GradioRootModel):
+ root: Union[FileData, str]
+
+
+class AntdAvatar(ModelScopeDataLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/avatar
+ """
+ Group = AntdAvatarGroup
+
+ EVENTS = [
+ EventListener("error",
+ callback=lambda block: block._internal.update(
+ bind_error_event=True))
+ ]
+
+ # supported slots
+ SLOTS = ['icon', "src"]
+
+ def __init__(
+ self,
+ value: str | None = None,
+ props: dict | None = None,
+ *,
+ alt: str | None = None,
+ gap: int = 4,
+ icon: str | None = None,
+ shape: Literal['circle', 'square'] = 'circle',
+ size: int | Literal['large', 'small', 'default'] | dict
+ | None = 'default',
+ src_set: str | None = None,
+ draggable: bool | Literal['true', 'false'] | None = None,
+ cross_origin: Literal['anonymous', 'use-credentials', '']
+ | None = None,
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(value=value,
+ visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.alt = alt
+ self.gap = gap
+ self.icon = icon
+ self.shape = shape
+ self.size = size
+ self.src_set = src_set
+ self.draggable = draggable
+ self.cross_origin = cross_origin
+ self.root_class_name = root_class_name
+ self.props = props
+
+ FRONTEND_DIR = resolve_frontend_dir("avatar")
+
+ data_model = AntdAvatarData
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(
+ self, payload: str | AntdAvatarData | None
+ ) -> str | AntdAvatarData | None:
+ if isinstance(payload, AntdAvatarData):
+ value = payload.root
+ if isinstance(value, FileData):
+ return value.path
+ return value
+ return payload
+
+ def postprocess(self, value: str | None) -> str | None:
+ if value is None:
+ return None
+ if value.startswith("http") or value.startswith("data"):
+ return AntdAvatarData(root=value)
+ file = processing_utils.move_resource_to_block_cache(value, self)
+ return AntdAvatarData(root=FileData(path=file,
+ orig_name=Path(file).name,
+ size=Path(file).stat().st_size))
+
+ def example_payload(self) -> Any:
+ return None
+
+ def example_value(self) -> Any:
+ return None
diff --git a/backend/modelscope_studio/components/antd/avatar/group/__init__.py b/backend/modelscope_studio/components/antd/avatar/group/__init__.py
new file mode 100644
index 00000000..5bca907c
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/avatar/group/__init__.py
@@ -0,0 +1,64 @@
+from __future__ import annotations
+
+from typing import Literal
+
+from .....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+
+
+class AntdAvatarGroup(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/avatar
+ """
+ EVENTS = []
+ # supported slots
+ SLOTS = ['max.popover.title', 'max.popover.content']
+
+ def __init__(
+ self,
+ props: dict | None = None,
+ *,
+ max: dict | None = None,
+ size: int | Literal['large', 'small', 'default']
+ | dict = 'default',
+ shape: Literal['circle', 'square'] = 'circle',
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.max = max
+ self.size = size
+ self.shape = shape
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("avatar", 'group')
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: None) -> None:
+ return payload
+
+ def postprocess(self, value: None) -> None:
+
+ return value
+
+ def example_payload(self) -> None:
+ return None
+
+ def example_value(self) -> None:
+ return None
diff --git a/backend/modelscope_studio/components/antd/badge/__init__.py b/backend/modelscope_studio/components/antd/badge/__init__.py
new file mode 100644
index 00000000..8630d9d2
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/badge/__init__.py
@@ -0,0 +1,86 @@
+from __future__ import annotations
+
+from typing import Any, Literal
+
+from ....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+from .ribbon import AntdBadgeRibbon
+
+
+class AntdBadge(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/badge
+ """
+ Ribbon = AntdBadgeRibbon
+
+ EVENTS = []
+
+ # supported slots
+ SLOTS = ['count', 'text']
+
+ def __init__(
+ self,
+ count: int | float | str | None = None,
+ props: dict | None = None,
+ *,
+ color: str | None = None,
+ class_names: dict | None = None,
+ dot: bool = False,
+ offset: tuple[int | float, int | float] | None = None,
+ overflow_count: int = 99,
+ show_zero: bool = False,
+ size: Literal['small', 'default'] | None = None,
+ status: Literal['success', 'processing', 'default', 'error',
+ 'warning'] | None = None,
+ text: str | None = None,
+ title: str | None = None,
+ styles: dict | None = None,
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.count = count
+ self.color = color
+ self.class_names = class_names
+ self.dot = dot
+ self.offset = offset
+ self.overflow_count = overflow_count
+ self.show_zero = show_zero
+ self.size = size
+ self.status = status
+ self.text = text
+ self.title = title
+ self.styles = styles
+ self.root_class_name = root_class_name
+ self.props = props
+
+ FRONTEND_DIR = resolve_frontend_dir("badge")
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: None) -> None:
+ return payload
+
+ def postprocess(self, value: None) -> None:
+
+ return value
+
+ def example_payload(self) -> Any:
+ return None
+
+ def example_value(self) -> Any:
+ return None
diff --git a/backend/modelscope_studio/components/antd/badge/ribbon/__init__.py b/backend/modelscope_studio/components/antd/badge/ribbon/__init__.py
new file mode 100644
index 00000000..b4c1b0a4
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/badge/ribbon/__init__.py
@@ -0,0 +1,61 @@
+from __future__ import annotations
+
+from typing import Literal
+
+from .....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+
+
+class AntdBadgeRibbon(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/badge
+ """
+ EVENTS = []
+
+ def __init__(
+ self,
+ text: str | None = None,
+ props: dict | None = None,
+ *,
+ color: str | None = None,
+ placement: Literal['start', 'end'] = 'end',
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.color = color
+ self.placement = placement
+ self.root_class_name = root_class_name
+ self.text = text
+
+ FRONTEND_DIR = resolve_frontend_dir("badge", 'ribbon')
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: None) -> None:
+ return payload
+
+ def postprocess(self, value: None) -> None:
+
+ return value
+
+ def example_payload(self) -> None:
+ return None
+
+ def example_value(self) -> None:
+ return None
diff --git a/backend/modelscope_studio/components/antd/breadcrumb/__init__.py b/backend/modelscope_studio/components/antd/breadcrumb/__init__.py
new file mode 100644
index 00000000..443570b1
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/breadcrumb/__init__.py
@@ -0,0 +1,68 @@
+from __future__ import annotations
+
+from typing import Any
+
+from ....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+from .item import AntdBreadcrumbItem
+
+
+class AntdBreadcrumb(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/breadcrumb
+ """
+ Item = AntdBreadcrumbItem
+
+ EVENTS = []
+
+ # supported slots
+ SLOTS = ['separator', 'itemRender', 'items']
+
+ def __init__(
+ self,
+ props: dict | None = None,
+ *,
+ item_render: str | None = None,
+ params: dict | None = None,
+ items: list[dict] | None = None,
+ separator: str | None = None,
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.item_render = item_render
+ self.params = params
+ self.items = items
+ self.separator = separator
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("breadcrumb")
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: None) -> None:
+ return payload
+
+ def postprocess(self, value: None) -> None:
+ return value
+
+ def example_payload(self) -> Any:
+ return None
+
+ def example_value(self) -> Any:
+ return None
diff --git a/backend/modelscope_studio/components/antd/breadcrumb/item/__init__.py b/backend/modelscope_studio/components/antd/breadcrumb/item/__init__.py
new file mode 100644
index 00000000..ac6cccc7
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/breadcrumb/item/__init__.py
@@ -0,0 +1,112 @@
+from __future__ import annotations
+
+from typing import Any, Literal
+
+from gradio.events import EventListener
+
+from .....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+
+
+class AntdBreadcrumbItem(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/breadcrumb
+ """
+
+ EVENTS = [
+ EventListener("click",
+ callback=lambda block: block._internal.update(
+ bind_click_event=True)),
+ EventListener("menu_click",
+ callback=lambda block: block._internal.update(
+ bind_menu_click_event=True)),
+ EventListener("menu_deselect",
+ callback=lambda block: block._internal.update(
+ bind_menu_deselect_event=True)),
+ EventListener("menu_open_change",
+ callback=lambda block: block._internal.update(
+ bind_menu_openChange_event=True)),
+ EventListener("menu_select",
+ callback=lambda block: block._internal.update(
+ bind_menu_select_event=True)),
+ EventListener("dropdown_open_change",
+ callback=lambda block: block._internal.update(
+ bind_dropdownProps_openChange_event=True)),
+ EventListener("dropdown_menu_click",
+ callback=lambda block: block._internal.update(
+ bind_dropdownProps_menu_click_event=True)),
+ EventListener("dropdown_menu_deselect",
+ callback=lambda block: block._internal.update(
+ bind_dropdownProps_menu_deselect_event=True)),
+ EventListener("dropdown_menu_open_change",
+ callback=lambda block: block._internal.update(
+ bind_dropdownProps_menu_openChange_event=True)),
+ EventListener("dropdown_menu_select",
+ callback=lambda block: block._internal.update(
+ bind_dropdownProps_menu_select_event=True)),
+ ]
+
+ # supported slots
+ SLOTS = [
+ 'title',
+ "menu.expandIcon",
+ 'menu.overflowedIndicator',
+ "menu.items",
+ "dropdownProps.dropdownRender",
+ "dropdownProps.menu.expandIcon",
+ 'dropdownProps.menu.overflowedIndicator',
+ "dropdownProps.menu.items",
+ ]
+
+ def __init__(
+ self,
+ title: str | None = None,
+ props: dict | None = None,
+ *,
+ dropdown_props: dict | None = None,
+ href: str | None = None,
+ path: str | None = None,
+ menu: dict | None = None,
+ type: Literal['separator'] | None = None,
+ separator: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.title = title
+ self.dropdown_props = dropdown_props
+ self.href = href
+ self.path = path
+ self.menu = menu
+ self.type = type
+ self.separator = separator
+
+ FRONTEND_DIR = resolve_frontend_dir("breadcrumb", "item")
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: None) -> None:
+ return payload
+
+ def postprocess(self, value: None) -> None:
+ return value
+
+ def example_payload(self) -> Any:
+ return None
+
+ def example_value(self) -> Any:
+ return None
diff --git a/backend/modelscope_studio/components/antd/button/__init__.py b/backend/modelscope_studio/components/antd/button/__init__.py
new file mode 100644
index 00000000..389e728f
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/button/__init__.py
@@ -0,0 +1,149 @@
+from __future__ import annotations
+
+from typing import Any, Literal
+
+from gradio.events import EventListener
+
+from ....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+from .group import AntdButtonGroup
+
+
+class AntdButton(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/button
+
+ To trigger an operation.
+
+ When to use:
+ A button means an operation (or a series of operations). Clicking a button will trigger its corresponding business logic.
+
+ In Ant Design we provide 5 types of button.
+
+ - Primary button: used for the main action, there can be at most one primary button in a section.
+ - Default button: used for a series of actions without priority.
+ - Dashed button: commonly used for adding more actions.
+ - Text button: used for the most secondary action.
+ - Link button: used for external links.
+
+ And 4 other properties additionally.
+
+ - danger: used for actions of risk, like deletion or authorization.
+ - ghost: used in situations with complex background, home pages usually.
+ - disabled: used when actions are not available.
+ - loading: adds a loading spinner in button, avoids multiple submits too.
+ """
+ Group = AntdButtonGroup
+
+ EVENTS = [
+ EventListener("click",
+ callback=lambda block: block._internal.update(
+ bind_click_event=True),
+ doc="Set the handler to handle click event.")
+ ]
+
+ # supported slots
+ SLOTS = ['icon']
+
+ def __init__(
+ self,
+ value: str | None = "Run",
+ props: dict | None = None,
+ *,
+ auto_insert_space: bool = True,
+ block: bool = False,
+ class_names: dict | None = None,
+ danger: bool = False,
+ disabled: bool = False,
+ ghost: bool = False,
+ href: str | None = None,
+ html_type: Literal["button", "submit", "reset"] | None = "button",
+ icon: str | None = None,
+ icon_position: Literal["start", "end"] | None = "start",
+ loading: bool = False,
+ shape: Literal["default", "circle", "round"] | None = "default",
+ size: Literal["large", "middle", "small"] | None = None,
+ styles: dict | None = None,
+ href_target: str | None = None,
+ type: Literal["primary", "dashed", "link", "text", "default"]
+ | None = "default",
+ variant: Literal["outlined", "dashed", "solid", "filled", "text",
+ "link"] | None = None,
+ color: Literal['default', 'primary', 'danger'] | None = None,
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ """
+ Parameters:
+ auto_insert_space: We add a space between two Chinese characters by default, which can be removed by setting auto_Insert_Space to false.
+ block: Option to fit button width to its parent width.
+ class_names: Semantic DOM class.
+ danger: Set the danger status of button.
+ disabled: Disabled state of button.
+ ghost: Make background transparent and invert text and border colors.
+ href: Redirect url of link button.
+ html_type: Set the original html type of button, see: MDN.
+ icon: Set the icon component of button.
+ icon_position: Set the icon position of button.
+ loading: Set the loading status of button.
+ shape: Can be set button shape.
+ size: Set the size of button.
+ styles: Semantic DOM style.
+ href_target: Same as target attribute of a, works when href is specified.
+ type: Set button type.
+ variant: Set button variant.
+ color: Set button color.
+ """
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.value = value
+ self.props = props
+ self.auto_insert_space = auto_insert_space
+ self.block = block
+ self.class_names = class_names
+ self.danger = danger
+ self.disabled = disabled
+ self.ghost = ghost
+ self.href = href
+ self.html_type = html_type
+ self.icon = icon
+ self.icon_position = icon_position
+ self.loading = loading
+ self.shape = shape
+ self.size = size
+ self.styles = styles
+ self.href_target = href_target
+ self.type = type
+ self.variant = variant
+ self.color = color
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("button")
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: str | None) -> str | None:
+ return payload
+
+ def postprocess(self, value: str | None) -> str | None:
+
+ return str(value)
+
+ def example_payload(self) -> Any:
+ return "Run"
+
+ def example_value(self) -> Any:
+ return "Run"
diff --git a/backend/modelscope_studio/components/antd/button/group/__init__.py b/backend/modelscope_studio/components/antd/button/group/__init__.py
new file mode 100644
index 00000000..f4fec3ec
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/button/group/__init__.py
@@ -0,0 +1,55 @@
+from __future__ import annotations
+
+from typing import Literal
+
+from .....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+
+
+class AntdButtonGroup(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/button
+ """
+ EVENTS = []
+
+ def __init__(
+ self,
+ props: dict | None = None,
+ *,
+ size: Literal['small', 'middle', 'large'] | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.size = size
+
+ FRONTEND_DIR = resolve_frontend_dir("button", 'group')
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: None) -> None:
+ return payload
+
+ def postprocess(self, value: None) -> None:
+
+ return value
+
+ def example_payload(self) -> None:
+ return None
+
+ def example_value(self) -> None:
+ return None
diff --git a/backend/modelscope_studio/components/antd/calendar/__init__.py b/backend/modelscope_studio/components/antd/calendar/__init__.py
new file mode 100644
index 00000000..2aef5a80
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/calendar/__init__.py
@@ -0,0 +1,95 @@
+from __future__ import annotations
+
+from typing import Any, Literal
+
+from gradio.events import EventListener
+
+from ....utils.dev import ModelScopeComponent, resolve_frontend_dir
+
+
+# as inputs, outputs
+class AntdCalendar(ModelScopeComponent):
+ """
+ Ant Design: https://ant.design/components/calendar
+ """
+
+ EVENTS = [
+ EventListener("change",
+ callback=lambda block: block._internal.update(
+ bind_change_event=True)),
+ EventListener("panel_change",
+ callback=lambda block: block._internal.update(
+ bind_panelChange_event=True)),
+ EventListener("select",
+ callback=lambda block: block._internal.update(
+ bind_select_event=True))
+ ]
+
+ # supported slots
+ SLOTS = ['cellRender', 'fullCellRender', 'headerRender']
+
+ def __init__(
+ self,
+ value: int | str | float | None = None,
+ props: dict | None = None,
+ *,
+ cell_render: str | None = None,
+ full_cell_render: str | None = None,
+ default_value: int | str | float | None = None,
+ disabled_date: str | None = None,
+ fullscreen: bool = True,
+ header_render: str | None = None,
+ locale: dict | None = None,
+ mode: Literal['month', 'year'] = 'month',
+ valid_range: tuple[int | str | float, int | str | float]
+ | None = None,
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(value=value,
+ visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.cell_render = cell_render
+ self.full_cell_render = full_cell_render
+ self.default_value = default_value
+ self.disabled_date = disabled_date
+ self.fullscreen = fullscreen
+ self.header_render = header_render
+ self.locale = locale
+ self.mode = mode
+ self.valid_range = valid_range
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("calendar")
+
+ def api_info(self) -> dict[str, Any]:
+ return {"anyOf": [{"type": "number"}, {"type": "string"}]}
+
+ @property
+ def skip_api(self):
+ return False
+
+ def preprocess(self, payload: int | float) -> int | float:
+ return payload
+
+ def postprocess(self, value: int | float) -> int | str:
+ return value
+
+ def example_payload(self) -> Any:
+ return None
+
+ def example_value(self) -> Any:
+ return None
diff --git a/backend/modelscope_studio/components/antd/card/__init__.py b/backend/modelscope_studio/components/antd/card/__init__.py
new file mode 100644
index 00000000..83e21220
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/card/__init__.py
@@ -0,0 +1,135 @@
+from __future__ import annotations
+
+from typing import Any, Literal
+
+from gradio.events import EventListener
+
+from ....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+from .grid import AntdCardGrid
+from .meta import AntdCardMeta
+
+
+class AntdCard(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/card
+
+ A container for displaying information.
+
+ When to use:
+ A card can be used to display content related to a single subject. The content can consist of multiple elements of varying types and sizes.
+ """
+ Grid = AntdCardGrid
+ Meta = AntdCardMeta
+ EVENTS = [
+ EventListener("click",
+ callback=lambda block: block._internal.update(
+ bind_click_event=True)),
+ EventListener("tab_change",
+ callback=lambda block: block._internal.update(
+ bind_tabChange_event=True))
+ ]
+
+ # supported slots
+ SLOTS = [
+ "actions",
+ 'cover',
+ 'extra',
+ 'tabBarExtraContent',
+ 'title',
+ ]
+
+ def __exit__(self, *args, **kwargs):
+ self._internal.update(contains_grid=any(
+ isinstance(child, AntdCardGrid) for child in self.children))
+ super().__exit__(*args, **kwargs)
+
+ def __init__(
+ self,
+ props: dict | None = None,
+ *,
+ actions: str | None = None,
+ active_tab_key: str | None = None,
+ bordered: bool = True,
+ cover: str | None = None,
+ default_active_tab_key: str | None = None,
+ extra: str | None = None,
+ hoverable: bool = False,
+ loading: bool = False,
+ size: Literal["default", "small"] | None = None,
+ tab_bar_extra_content: str | None = None,
+ tab_list: list[str] | str | None = None,
+ tab_props: str | None = None,
+ title: str | None = None,
+ type: str | None = None,
+ class_names: dict | None = None,
+ styles: dict | None = None,
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ """
+ Parameters:
+ actions: The action list, shows at the bottom of the Card.
+ active_tab_key: Current TabPane's key.
+ bordered: Toggles rendering of the border around the card.
+ cover: Card cover.
+ default_active_tab_key: Initial active TabPane's key, if activeTabKey is not set.
+ extra: Content to render in the top-right corner of the card.
+ hoverable: Lift up when hovering card.
+ loading: Shows a loading indicator while the contents of the card are being fetched.
+ size: Size of card.
+ tab_bar_extra_content: Extra content in tab bar.
+ title: Card title.
+ type: Card style type, can be set to inner or not set.
+ class_names: Config Card build-in module's className.
+ styles: Config Card build-in module's style.
+ """
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.actions = actions
+ self.active_tab_key = active_tab_key
+ self.bordered = bordered
+ self.cover = cover
+ self.default_active_tab_key = default_active_tab_key
+ self.extra = extra
+ self.hoverable = hoverable
+ self.loading = loading
+ self.size = size
+ self.tab_bar_extra_content = tab_bar_extra_content
+ self.tab_list = tab_list
+ self.tab_props = tab_props
+ self.title = title
+ self.type = type
+ self.class_names = class_names
+ self.styles = styles
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("card")
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: None) -> None:
+ return payload
+
+ def postprocess(self, value: None) -> None:
+ return value
+
+ def example_payload(self) -> Any:
+ return None
+
+ def example_value(self) -> Any:
+ return None
diff --git a/backend/modelscope_studio/components/antd/card/grid/__init__.py b/backend/modelscope_studio/components/antd/card/grid/__init__.py
new file mode 100644
index 00000000..bb966aca
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/card/grid/__init__.py
@@ -0,0 +1,70 @@
+from __future__ import annotations
+
+from typing import Any
+
+from gradio.events import EventListener
+
+from .....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+
+
+class AntdCardGrid(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/card
+
+ A container for displaying information.
+
+ When to use:
+ A card can be used to display content related to a single subject. The content can consist of multiple elements of varying types and sizes.
+ """
+ EVENTS = [
+ EventListener("click",
+ callback=lambda block: block._internal.update(
+ bind_click_event=True))
+ ]
+
+ def __init__(
+ self,
+ props: dict | None = None,
+ *,
+ hoverable: bool = True,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ """
+ Parameters:
+ hoverable: Lift up when hovering card grid.
+ """
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ elem_style=elem_style,
+ as_item=as_item,
+ **kwargs)
+ self.props = props
+ self.hoverable = hoverable
+
+ FRONTEND_DIR = resolve_frontend_dir("card", "grid")
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: None) -> None:
+ return payload
+
+ def postprocess(self, value: None) -> None:
+
+ return value
+
+ def example_payload(self) -> Any:
+ return None
+
+ def example_value(self) -> Any:
+ return None
diff --git a/backend/modelscope_studio/components/antd/card/meta/__init__.py b/backend/modelscope_studio/components/antd/card/meta/__init__.py
new file mode 100644
index 00000000..8593e657
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/card/meta/__init__.py
@@ -0,0 +1,71 @@
+from __future__ import annotations
+
+from typing import Any
+
+from .....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+
+
+class AntdCardMeta(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/card
+
+ A container for displaying information.
+
+ When to use:
+ A card can be used to display content related to a single subject. The content can consist of multiple elements of varying types and sizes.
+ """
+ EVENTS = []
+ SLOTS = ["title", "description", "avatar"]
+
+ def __init__(
+ self,
+ props: dict | None = None,
+ *,
+ avatar: str | None = None,
+ description: str | None = None,
+ title: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ """
+ Parameters:
+ avatar: Avatar or icon.
+ description: Description content.
+ title: Title content.
+ """
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.avatar = avatar
+ self.description = description
+ self.title = title
+
+ FRONTEND_DIR = resolve_frontend_dir("card", "meta")
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: None) -> None:
+ return payload
+
+ def postprocess(self, value: None) -> None:
+
+ return value
+
+ def example_payload(self) -> Any:
+ return None
+
+ def example_value(self) -> Any:
+ return None
diff --git a/backend/modelscope_studio/components/antd/carousel/__init__.py b/backend/modelscope_studio/components/antd/carousel/__init__.py
new file mode 100644
index 00000000..fe1c22bb
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/carousel/__init__.py
@@ -0,0 +1,86 @@
+from __future__ import annotations
+
+from typing import Any, Literal
+
+from ....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+
+
+class AntdCarousel(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/carousel
+ """
+
+ EVENTS = []
+
+ def __init__(
+ self,
+ props: dict | None = None,
+ *,
+ arrows: bool = False,
+ autoplay: bool = False,
+ autoplay_speed: int | float = 3000,
+ adaptive_height: bool = False,
+ dot_position: Literal['top', 'bottom', 'left', 'right'] = 'bottom',
+ dots: bool | dict = True,
+ draggable: bool = False,
+ fade: bool = False,
+ infinite: bool = True,
+ speed: int = 500,
+ easing: str = 'linear',
+ effect: Literal['scrollx', 'fade'] = 'scrollx',
+ after_change: str | None = None,
+ before_change: str | None = None,
+ wait_for_animate: bool = False,
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.arrows = arrows
+ self.autoplay = autoplay
+ self.autoplay_speed = autoplay_speed
+ self.adaptive_height = adaptive_height
+ self.dot_position = dot_position
+ self.dots = dots
+ self.draggable = draggable
+ self.fade = fade
+ self.infinite = infinite
+ self.speed = speed
+ self.easing = easing
+ self.effect = effect
+ self.after_change = after_change
+ self.before_change = before_change
+ self.wait_for_animate = wait_for_animate
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("carousel")
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: None) -> None:
+ return payload
+
+ def postprocess(self, value: None) -> None:
+
+ return value
+
+ def example_payload(self) -> Any:
+ return None
+
+ def example_value(self) -> Any:
+ return None
diff --git a/backend/modelscope_studio/components/antd/cascader/__init__.py b/backend/modelscope_studio/components/antd/cascader/__init__.py
new file mode 100644
index 00000000..45a12e3d
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/cascader/__init__.py
@@ -0,0 +1,177 @@
+from __future__ import annotations
+
+from typing import Any, Literal
+
+from gradio.events import EventListener
+
+from ....utils.dev import ModelScopeDataLayoutComponent, resolve_frontend_dir
+from .option import AntdCascaderOption
+from .panel import AntdCascaderPanel
+
+
+# as inputs, outputs
+class AntdCascader(ModelScopeDataLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/cascader
+ """
+ Option = AntdCascaderOption
+ Panel = AntdCascaderPanel
+
+ EVENTS = [
+ EventListener("change",
+ callback=lambda block: block._internal.update(
+ bind_change_event=True)),
+ EventListener("search",
+ callback=lambda block: block._internal.update(
+ bind_search_event=True)),
+ EventListener("dropdown_visible_change",
+ callback=lambda block: block._internal.update(
+ bind_dropdownVisibleChange_event=True)),
+ EventListener("load_data",
+ callback=lambda block: block._internal.update(
+ bind_loadData_event=True)),
+ ]
+
+ # supported slots
+ SLOTS = [
+ 'allowClear.clearIcon',
+ 'suffixIcon',
+ 'maxTagPlaceholder',
+ 'notFoundContent',
+ 'expandIcon',
+ 'removeIcon',
+ 'displayRender',
+ 'tagRender',
+ 'dropdownRender',
+ 'showSearch.render',
+ ]
+
+ def __init__(
+ self,
+ value: list[str] | list[int | float] | None = None,
+ props: dict | None = None,
+ *,
+ allow_clear: bool | dict = False,
+ auto_clear_search_value: bool = True,
+ auto_focus: bool = False,
+ change_on_select: bool = False,
+ default_value: str | None = None,
+ disabled: bool = False,
+ display_render: str | None = None,
+ tag_render: str | None = None,
+ popup_class_name: str | None = None,
+ dropdown_render: str | None = None,
+ expand_icon: str | None = None,
+ expand_trigger: Literal['click', 'hover'] = 'click',
+ filed_names: dict | None = None,
+ get_popup_container: str | None = None,
+ max_tag_count: int | Literal['responsive'] | None = None,
+ max_tag_placeholder: str | None = None,
+ max_tag_text_length: int | None = None,
+ not_found_content: str | None = None,
+ open: bool | None = None,
+ options: list[dict] | None = None,
+ placeholder: str | None = None,
+ placement: Literal['bottomLeft', 'bottomRight', 'topLeft',
+ 'topRight'] = 'bottomLeft',
+ show_search: bool | dict = False,
+ size: Literal['small', 'middle', 'large'] | None = None,
+ status: Literal['error', 'warning'] | None = None,
+ suffix_icon: str | None = None,
+ variant: Literal['outlined', 'borderless', 'filled']
+ | None = 'outlined',
+ multiple: bool | None = None,
+ show_checked_strategy: Literal['SHOW_PARENT', 'SHOW_CHILD']
+ | None = None,
+ remove_icon: str | None = None,
+ search_value: str | None = None,
+ dropdown_menu_column_style: dict | None = None,
+ option_render: str | None = None,
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(value=value,
+ visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.allow_clear = allow_clear
+ self.auto_clear_search_value = auto_clear_search_value
+ self.auto_focus = auto_focus
+ self.change_on_select = change_on_select
+ self.default_value = default_value
+ self.disabled = disabled
+ self.display_render = display_render
+ self.tag_render = tag_render
+ self.popup_class_name = popup_class_name
+ self.dropdown_render = dropdown_render
+ self.expand_icon = expand_icon
+ self.expand_trigger = expand_trigger
+ self.filed_names = filed_names
+ self.get_popup_container = get_popup_container
+ self.max_tag_count = max_tag_count
+ self.max_tag_placeholder = max_tag_placeholder
+ self.max_tag_text_length = max_tag_text_length
+ self.not_found_content = not_found_content
+ self.open = open
+ self.options = options
+ self.placeholder = placeholder
+ self.placement = placement
+ self.show_search = show_search
+ self.size = size
+ self.status = status
+ self.suffix_icon = suffix_icon
+ self.variant = variant
+ self.multiple = multiple
+ self.show_checked_strategy = show_checked_strategy
+ self.remove_icon = remove_icon
+ self.search_value = search_value
+ self.dropdown_menu_column_style = dropdown_menu_column_style
+ self.option_render = option_render
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("cascader")
+
+ @property
+ def skip_api(self):
+ return False
+
+ def api_info(self) -> dict[str, Any]:
+ return {
+ "anyOf": [{
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }, {
+ "type": "string"
+ }]
+ }
+
+ def preprocess(
+ self, payload: None | list[str] | list[int | float]
+ ) -> None | list[str] | list[int | float]:
+ return payload
+
+ def postprocess(
+ self, value: None | list[str] | list[int | float]
+ ) -> None | list[str] | list[int | float]:
+
+ return value
+
+ def example_payload(self) -> None:
+ return None
+
+ def example_value(self) -> None:
+ return None
diff --git a/backend/modelscope_studio/components/antd/cascader/constants.py b/backend/modelscope_studio/components/antd/cascader/constants.py
new file mode 100644
index 00000000..bfb00b1d
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/cascader/constants.py
@@ -0,0 +1,2 @@
+SHOW_CHILD = "SHOW_CHILD"
+SHOW_PARENT = "SHOW_PARENT"
diff --git a/backend/modelscope_studio/components/antd/cascader/option/__init__.py b/backend/modelscope_studio/components/antd/cascader/option/__init__.py
new file mode 100644
index 00000000..e4e5c9a9
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/cascader/option/__init__.py
@@ -0,0 +1,66 @@
+from __future__ import annotations
+
+from typing import Any
+
+from .....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+
+
+class AntdCascaderOption(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/cascader
+ """
+
+ EVENTS = []
+
+ # supported slots
+ SLOTS = [
+ 'label',
+ ]
+
+ def __init__(
+ self,
+ value: str | None = None,
+ label: str | None = None,
+ props: dict | None = None,
+ *,
+ disabled: bool | None = None,
+ is_leaf: bool | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.value = value
+ self.label = label
+ self.disabled = disabled
+ self.is_leaf = is_leaf
+
+ FRONTEND_DIR = resolve_frontend_dir("cascader", "option")
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: None) -> None:
+ return payload
+
+ def postprocess(self, value: None) -> None:
+ return value
+
+ def example_payload(self) -> Any:
+ return None
+
+ def example_value(self) -> Any:
+ return None
diff --git a/backend/modelscope_studio/components/antd/cascader/panel/__init__.py b/backend/modelscope_studio/components/antd/cascader/panel/__init__.py
new file mode 100644
index 00000000..21c48145
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/cascader/panel/__init__.py
@@ -0,0 +1,106 @@
+from __future__ import annotations
+
+from typing import Any, Literal
+
+from gradio.events import EventListener
+
+from .....utils.dev import ModelScopeDataLayoutComponent, resolve_frontend_dir
+
+
+# as inputs, outputs
+class AntdCascaderPanel(ModelScopeDataLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/cascader
+ """
+
+ EVENTS = [
+ EventListener("change",
+ callback=lambda block: block._internal.update(
+ bind_change_event=True)),
+ EventListener("load_data",
+ callback=lambda block: block._internal.update(
+ bind_loadData_event=True)),
+ ]
+
+ # supported slots
+ SLOTS = ['notFoundContent', 'expandIcon']
+
+ def __init__(
+ self,
+ value: list[str] | list[int | float] | None = None,
+ props: dict | None = None,
+ *,
+ change_on_select: bool = False,
+ default_value: str | None = None,
+ expand_icon: str | None = None,
+ expand_trigger: Literal['click', 'hover'] = 'click',
+ filed_names: dict | None = None,
+ not_found_content: str | None = None,
+ options: list[dict] | None = None,
+ multiple: bool | None = None,
+ show_checked_strategy: Literal['SHOW_PARENT', 'SHOW_CHILD']
+ | None = None,
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(value=value,
+ visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.change_on_select = change_on_select
+ self.default_value = default_value
+ self.expand_icon = expand_icon
+ self.expand_trigger = expand_trigger
+ self.filed_names = filed_names
+ self.not_found_content = not_found_content
+ self.options = options
+ self.multiple = multiple
+ self.show_checked_strategy = show_checked_strategy
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("cascader", "panel")
+
+ @property
+ def skip_api(self):
+ return False
+
+ def api_info(self) -> dict[str, Any]:
+ return {
+ "anyOf": [{
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }, {
+ "type": "string"
+ }]
+ }
+
+ def preprocess(
+ self, payload: None | list[str] | list[int | float]
+ ) -> None | list[str] | list[int | float]:
+ return payload
+
+ def postprocess(
+ self, value: None | list[str] | list[int | float]
+ ) -> None | list[str] | list[int | float]:
+
+ return value
+
+ def example_payload(self) -> None:
+ return None
+
+ def example_value(self) -> None:
+ return None
diff --git a/backend/modelscope_studio/components/antd/checkbox/__init__.py b/backend/modelscope_studio/components/antd/checkbox/__init__.py
new file mode 100644
index 00000000..dd3dec6b
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/checkbox/__init__.py
@@ -0,0 +1,78 @@
+from __future__ import annotations
+
+from typing import Any
+
+from gradio.events import EventListener
+
+from ....utils.dev import ModelScopeDataLayoutComponent, resolve_frontend_dir
+from .group import AntdCheckboxGroup
+
+
+# as inputs, outputs
+class AntdCheckbox(ModelScopeDataLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/checkbox
+ """
+ Group = AntdCheckboxGroup
+
+ EVENTS = [
+ EventListener("change",
+ callback=lambda block: block._internal.update(
+ bind_change_event=True)),
+ ]
+
+ def __init__(
+ self,
+ value: bool | None = False,
+ props: dict | None = None,
+ *,
+ auto_focus: bool = False,
+ default_checked: bool = False,
+ disabled: bool = False,
+ indeterminate: bool = False,
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(value=value,
+ visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.auto_focus = auto_focus
+ self.default_checked = default_checked
+ self.disabled = disabled
+ self.indeterminate = indeterminate
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("checkbox")
+
+ @property
+ def skip_api(self):
+ return False
+
+ def api_info(self) -> dict[str, Any]:
+ return {"type": "boolean"}
+
+ def preprocess(self, payload: None | bool) -> None | bool:
+ return payload
+
+ def postprocess(self, value: None | bool) -> None | bool:
+
+ return value
+
+ def example_payload(self) -> None:
+ return None
+
+ def example_value(self) -> None:
+ return None
diff --git a/backend/modelscope_studio/components/antd/checkbox/group/__init__.py b/backend/modelscope_studio/components/antd/checkbox/group/__init__.py
new file mode 100644
index 00000000..df3b784d
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/checkbox/group/__init__.py
@@ -0,0 +1,100 @@
+from __future__ import annotations
+
+from typing import Any
+
+from gradio.events import EventListener
+
+from .....utils.dev import ModelScopeDataLayoutComponent, resolve_frontend_dir
+from .option import AntdCheckboxGroupOption
+
+
+# as inputs, outputs
+class AntdCheckboxGroup(ModelScopeDataLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/checkbox
+ """
+ Option = AntdCheckboxGroupOption
+
+ EVENTS = [
+ EventListener("change",
+ callback=lambda block: block._internal.update(
+ bind_change_event=True)),
+ ]
+
+ # supported slots
+ SLOTS = [
+ 'options',
+ ]
+
+ def __init__(
+ self,
+ value: list[str | int | float | bool] | None = None,
+ props: dict | None = None,
+ *,
+ default_value: list[str | int | float | bool] | None = None,
+ disabled: bool = False,
+ options: list[str] | list[int | float] | list[dict] | None = None,
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(value=value,
+ visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.default_value = default_value
+ self.disabled = disabled
+ self.options = options
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("checkbox", "group")
+
+ @property
+ def skip_api(self):
+ return False
+
+ def api_info(self) -> dict[str, Any]:
+ return {
+ "type": "array",
+ "items": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ },
+ ],
+ }
+ }
+
+ def preprocess(
+ self, payload: None | list[str | int | float | bool] | None
+ ) -> None | list[str | int | float | bool] | None:
+ return payload
+
+ def postprocess(
+ self, value: None | list[str | int | float | bool] | None
+ ) -> None | list[str | int | float | bool] | None:
+
+ return value
+
+ def example_payload(self) -> None:
+ return None
+
+ def example_value(self) -> None:
+ return None
diff --git a/backend/modelscope_studio/components/antd/checkbox/group/option/__init__.py b/backend/modelscope_studio/components/antd/checkbox/group/option/__init__.py
new file mode 100644
index 00000000..d664acd9
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/checkbox/group/option/__init__.py
@@ -0,0 +1,64 @@
+from __future__ import annotations
+
+from typing import Any
+
+from ......utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+
+
+class AntdCheckboxGroupOption(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/checkbox
+ """
+
+ EVENTS = []
+
+ # supported slots
+ SLOTS = [
+ 'label',
+ ]
+
+ def __init__(
+ self,
+ value: str | None = None,
+ props: dict | None = None,
+ *,
+ label: str | None = None,
+ disabled: bool | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.value = value
+ self.label = label
+ self.disabled = disabled
+
+ FRONTEND_DIR = resolve_frontend_dir("checkbox", ['group', 'option'])
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: None) -> None:
+ return payload
+
+ def postprocess(self, value: None) -> None:
+ return value
+
+ def example_payload(self) -> Any:
+ return None
+
+ def example_value(self) -> Any:
+ return None
diff --git a/backend/modelscope_studio/components/antd/collapse/__init__.py b/backend/modelscope_studio/components/antd/collapse/__init__.py
new file mode 100644
index 00000000..57aa9a19
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/collapse/__init__.py
@@ -0,0 +1,90 @@
+from __future__ import annotations
+
+from typing import Any, Literal
+
+from gradio.events import EventListener
+
+from ....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+from .item import AntdCollapseItem
+
+
+class AntdCollapse(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/collapse
+ """
+ Item = AntdCollapseItem
+
+ EVENTS = [
+ EventListener("change",
+ callback=lambda block: block._internal.update(
+ bind_change_event=True)),
+ ]
+
+ # supported slots
+ SLOTS = ["expandIcon", "items"]
+
+ def __init__(
+ self,
+ props: dict | None = None,
+ *,
+ accordion: bool = False,
+ active_key: str | float | list[int | float] | list[str]
+ | None = None,
+ bordered: bool = True,
+ collapsible: Literal['header', 'icon', 'disabled'] | None = None,
+ default_active_key: str | float | list[int | float] | list[str]
+ | None = None,
+ destroy_inactive_panel: bool = False,
+ expand_icon: str | None = None,
+ expand_icon_position: Literal['start', 'end'] | None = None,
+ ghost: bool = False,
+ items: list[dict] | None = None,
+ size: Literal['large', 'middle', 'small'] | None = None,
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.accordion = accordion
+ self.active_key = active_key
+ self.bordered = bordered
+ self.collapsible = collapsible
+ self.default_active_key = default_active_key
+ self.destroy_inactive_panel = destroy_inactive_panel
+ self.expand_icon = expand_icon
+ self.expand_icon_position = expand_icon_position
+ self.ghost = ghost
+ self.items = items
+ self.size = size
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("collapse")
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: None) -> None:
+ return payload
+
+ def postprocess(self, value: None) -> None:
+ return value
+
+ def example_payload(self) -> Any:
+ return None
+
+ def example_value(self) -> Any:
+ return None
diff --git a/backend/modelscope_studio/components/antd/collapse/item/__init__.py b/backend/modelscope_studio/components/antd/collapse/item/__init__.py
new file mode 100644
index 00000000..e414e15c
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/collapse/item/__init__.py
@@ -0,0 +1,78 @@
+from __future__ import annotations
+
+from typing import Any, Literal
+
+from gradio.events import EventListener
+
+from .....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+
+
+class AntdCollapseItem(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/collapse
+ """
+
+ EVENTS = [
+ EventListener("item_click",
+ callback=lambda block: block._internal.update(
+ bind_itemClick_event=True)),
+ ]
+
+ # supported slots
+ SLOTS = ['extra', "label", "children"]
+
+ def __init__(
+ self,
+ label: str | None = None,
+ key: str | float | int | None = None,
+ props: dict | None = None,
+ *,
+ class_names: dict | None = None,
+ collapsible: Literal['header', 'icon', 'disabled'] | None = None,
+ extra: str | None = None,
+ force_render: bool = False,
+ show_arrow: bool = True,
+ styles: dict | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.label = label
+ self.props = props
+ self.key = key
+ self.class_names = class_names
+ self.collapsible = collapsible
+ self.extra = extra
+ self.force_render = force_render
+ self.show_arrow = show_arrow
+ self.styles = styles
+
+ FRONTEND_DIR = resolve_frontend_dir("collapse", "item")
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: None) -> None:
+ return payload
+
+ def postprocess(self, value: None) -> None:
+ return value
+
+ def example_payload(self) -> Any:
+ return None
+
+ def example_value(self) -> Any:
+ return None
diff --git a/backend/modelscope_studio/components/antd/color_picker/__init__.py b/backend/modelscope_studio/components/antd/color_picker/__init__.py
new file mode 100644
index 00000000..a23ad83d
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/color_picker/__init__.py
@@ -0,0 +1,124 @@
+from __future__ import annotations
+
+from typing import Any, Literal
+
+from gradio.events import EventListener
+
+from ....utils.dev import ModelScopeDataLayoutComponent, resolve_frontend_dir
+from .preset import AntdColorPickerPreset
+
+
+# as inputs, outputs
+class AntdColorPicker(ModelScopeDataLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/color-picker
+ """
+ Preset = AntdColorPickerPreset
+
+ EVENTS = [
+ EventListener("change",
+ callback=lambda block: block._internal.update(
+ bind_change_event=True)),
+ EventListener("change_complete",
+ callback=lambda block: block._internal.update(
+ bind_changeComplete_event=True)),
+ EventListener("clear",
+ callback=lambda block: block._internal.update(
+ bind_clear_event=True)),
+ EventListener("open_change",
+ callback=lambda block: block._internal.update(
+ bind_openChange_event=True)),
+ EventListener("format_change",
+ callback=lambda block: block._internal.update(
+ bind_formatChange_event=True)),
+ ]
+
+ # supported slots
+ SLOTS = ["presets", 'panelRender', 'showText']
+
+ def __init__(
+ self,
+ value: str | None = None,
+ props: dict | None = None,
+ *,
+ value_format: Literal['hex', 'rgb', 'hsb'] = 'hex',
+ allow_clear: bool = False,
+ arrow: bool | dict = True,
+ presets: list[dict] | None = None,
+ preset_items: list[dict] | None = None,
+ disabled: bool | None = None,
+ disabled_alpha: bool | None = None,
+ destroy_tooltip_on_hide: bool | None = None,
+ format: Literal['hex', 'rgb', 'hsb'] | None = 'hex',
+ mode: Literal['single', 'gradient']
+ | list[Literal['single', 'gradient']] | None = 'single',
+ open: bool | None = None,
+ default_value: str | None = None,
+ default_format: Literal['hex', 'rgb', 'hsb'] | None = None,
+ show_text: bool | str | None = None,
+ placement: Literal['bottomLeft', 'bottomRight', 'topLeft',
+ 'topRight'] | None = 'bottomLeft',
+ trigger: Literal['hover', 'click'] = 'click',
+ panel_render: str | None = None,
+ size: Literal['small', 'middle', 'large'] | None = None,
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(value=value,
+ visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.value_format = value_format
+ self.allow_clear = allow_clear
+ self.arrow = arrow
+ self.presets = presets
+ self.preset_items = preset_items
+ self.disabled = disabled
+ self.disabled_alpha = disabled_alpha
+ self.destroy_tooltip_on_hide = destroy_tooltip_on_hide
+ self.format = format
+ self.mode = mode
+ self.open = open
+ self.default_value = default_value
+ self.default_format = default_format
+ self.show_text = show_text
+ self.placement = placement
+ self.trigger = trigger
+ self.panel_render = panel_render
+ self.size = size
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("color-picker")
+
+ @property
+ def skip_api(self):
+ return False
+
+ def api_info(self) -> dict[str, Any]:
+ return {"type": "string"}
+
+ def preprocess(self, payload: str) -> str:
+
+ return payload
+
+ def postprocess(self, value: str) -> str:
+
+ return value
+
+ def example_payload(self) -> None:
+ return None
+
+ def example_value(self) -> None:
+ return None
diff --git a/backend/modelscope_studio/components/antd/color_picker/preset/__init__.py b/backend/modelscope_studio/components/antd/color_picker/preset/__init__.py
new file mode 100644
index 00000000..c8fa61b5
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/color_picker/preset/__init__.py
@@ -0,0 +1,61 @@
+from __future__ import annotations
+
+from .....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+
+
+class AntdColorPickerPreset(ModelScopeLayoutComponent):
+ """
+ """
+ EVENTS = []
+
+ # supported slots
+ SLOTS = [
+ 'label',
+ ]
+
+ def __init__(
+ self,
+ props: dict | None = None,
+ *,
+ label: str | None = None,
+ colors: list[str] = None,
+ default_open: bool = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.label = label
+ self.colors = colors
+ self.default_open = default_open
+
+ FRONTEND_DIR = resolve_frontend_dir("color-picker", 'preset')
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: None) -> None:
+ return payload
+
+ def postprocess(self, value: None) -> None:
+
+ return value
+
+ def example_payload(self) -> None:
+ return None
+
+ def example_value(self) -> None:
+ return None
diff --git a/backend/modelscope_studio/components/antd/components.py b/backend/modelscope_studio/components/antd/components.py
new file mode 100644
index 00000000..581dd774
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/components.py
@@ -0,0 +1,138 @@
+from .affix import AntdAffix
+from .alert import AntdAlert
+from .alert.error_boundary import AntdAlertErrorBoundary
+from .anchor import AntdAnchor
+from .anchor.item import AntdAnchorItem
+from .auto_complete import AntdAutoComplete
+from .auto_complete.option import AntdAutoCompleteOption
+from .avatar import AntdAvatar
+from .avatar.group import AntdAvatarGroup
+from .badge import AntdBadge
+from .badge.ribbon import AntdBadgeRibbon
+from .breadcrumb import AntdBreadcrumb
+from .breadcrumb.item import AntdBreadcrumbItem
+from .button import AntdButton
+from .button.group import AntdButtonGroup
+from .calendar import AntdCalendar
+from .card import AntdCard
+from .card.grid import AntdCardGrid
+from .card.meta import AntdCardMeta
+from .carousel import AntdCarousel
+from .cascader import AntdCascader
+from .cascader.option import AntdCascaderOption
+from .cascader.panel import AntdCascaderPanel
+from .checkbox import AntdCheckbox
+from .checkbox.group import AntdCheckboxGroup
+from .checkbox.group.option import AntdCheckboxGroupOption
+from .collapse import AntdCollapse
+from .collapse.item import AntdCollapseItem
+from .color_picker import AntdColorPicker
+from .color_picker.preset import AntdColorPickerPreset
+from .config_provider import AntdConfigProvider
+from .date_picker import AntdDatePicker
+from .date_picker.preset import AntdDatePickerPreset
+from .date_picker.range_picker import AntdDatePickerRangePicker
+from .descriptions import AntdDescriptions
+from .descriptions.item import AntdDescriptionsItem
+from .divider import AntdDivider
+from .drawer import AntdDrawer
+from .dropdown import AntdDropdown
+from .dropdown.button import AntdDropdownButton
+from .empty import AntdEmpty
+from .flex import AntdFlex
+from .float_button import AntdFloatButton
+from .float_button.back_top import AntdFloatButtonBackTop
+from .float_button.group import AntdFloatButtonGroup
+from .form import AntdForm
+from .form.item import AntdFormItem
+from .form.item.rule import AntdFormItemRule
+from .grid.col import AntdCol
+from .grid.row import AntdRow
+from .icon import AntdIcon
+from .icon.iconfont_provider import AntdIconIconfontProvider
+from .image import AntdImage
+from .image.preview_group import AntdImagePreviewGroup
+from .input import AntdInput
+from .input.otp import AntdInputOTP
+from .input.password import AntdInputPassword
+from .input.search import AntdInputSearch
+from .input.textarea import AntdInputTextarea
+from .input_number import AntdInputNumber
+from .layout import AntdLayout
+from .layout.content import AntdLayoutContent
+from .layout.footer import AntdLayoutFooter
+from .layout.header import AntdLayoutHeader
+from .layout.sider import AntdLayoutSider
+from .list import AntdList
+from .list.item import AntdListItem
+from .list.item.meta import AntdListItemMeta
+from .mentions import AntdMentions
+from .mentions.option import AntdMentionsOption
+from .menu import AntdMenu
+from .menu.item import AntdMenuItem
+from .message import AntdMessage
+from .modal import AntdModal
+from .notification import AntdNotification
+from .pagination import AntdPagination
+from .popconfirm import AntdPopconfirm
+from .popover import AntdPopover
+from .progress import AntdProgress
+from .qr_code import AntdQRCode
+from .radio import AntdRadio
+from .radio.button import AntdRadioButton
+from .radio.group import AntdRadioGroup
+from .radio.group.option import AntdRadioGroupOption
+from .rate import AntdRate
+from .result import AntdResult
+from .segmented import AntdSegmented
+from .segmented.option import AntdSegmentedOption
+from .select import AntdSelect
+from .select.option import AntdSelectOption
+from .skeleton import AntdSkeleton
+from .skeleton.avatar import AntdSkeletonAvatar
+from .skeleton.button import AntdSkeletonButton
+from .skeleton.image import AntdSkeletonImage
+from .skeleton.input import AntdSkeletonInput
+from .skeleton.node import AntdSkeletonNode
+from .slider import AntdSlider
+from .slider.mark import AntdSliderMark
+from .space import AntdSpace
+from .space.compact import AntdSpaceCompact
+from .spin import AntdSpin
+from .splitter import AntdSplitter
+from .splitter.panel import AntdSplitterPanel
+from .statistic import AntdStatistic, AntdStatisticCountdown
+from .steps import AntdSteps
+from .steps.item import AntdStepsItem
+from .switch import AntdSwitch
+from .table import AntdTable
+from .table.column import AntdTableColumn
+from .table.column_group import AntdTableColumnGroup
+from .table.expandable import AntdTableExpandable
+from .table.row_selection import AntdTableRowSelection
+from .table.row_selection.selection import AntdTableRowSelectionSelection
+from .tabs import AntdTabs
+from .tabs.item import AntdTabsItem
+from .tag import AntdTag
+from .tag.checkable_tag import AntdTagCheckableTag
+from .time_picker import AntdTimePicker
+from .time_picker.range_picker import AntdTimePickerRangePicker
+from .timeline import AntdTimeline
+from .timeline.item import AntdTimelineItem
+from .tooltip import AntdTooltip
+from .tour import AntdTour
+from .tour.step import AntdTourStep
+from .transfer import AntdTransfer
+from .tree import AntdTree
+from .tree.directory_tree import AntdTreeDirectoryTree
+from .tree.tree_node import AntdTreeTreeNode
+from .tree_select import AntdTreeSelect
+from .tree_select.tree_node import AntdTreeSelectTreeNode
+from .typography import AntdTypography
+from .typography.link import AntdTypographyLink
+from .typography.paragraph import AntdTypographyParagraph
+from .typography.text import AntdTypographyText
+from .typography.title import AntdTypographyTitle
+from .upload import AntdUpload
+from .upload.dragger import AntdUploadDragger
+from .watermark import AntdWatermark
diff --git a/backend/modelscope_studio/components/antd/config_provider/__init__.py b/backend/modelscope_studio/components/antd/config_provider/__init__.py
new file mode 100644
index 00000000..a378b514
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/config_provider/__init__.py
@@ -0,0 +1,88 @@
+from __future__ import annotations
+
+from typing import Any, Literal
+
+from ....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+
+
+class AntdConfigProvider(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/config-provider
+ """
+ EVENTS = []
+
+ # see https://ant.design/components/config-provider, pass slot like 'spin.indicator'.
+ SLOTS = ["renderEmpty"]
+
+ def __init__(self,
+ props: dict | None = None,
+ *,
+ component_disabled: bool | None = None,
+ component_size: Literal['small', 'middle', 'large']
+ | None = None,
+ csp: dict | None = None,
+ direction: Literal['ltr', 'rtl'] | None = None,
+ get_popup_container: str | None = None,
+ get_target_container: str | None = None,
+ icon_prefix_cls: str | None = None,
+ locale: str | None = None,
+ popup_match_select_width: bool | int | float | None = None,
+ popup_overflow: Literal['viewport', 'scroll'] | None = None,
+ prefix_cls: str | None = None,
+ render_empty: str | None = None,
+ theme: dict | None = None,
+ variant: Literal['outlined', 'filled', 'borderless']
+ | None = None,
+ virtual: bool | None = None,
+ warning: dict | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.component_disabled = component_disabled
+ self.component_size = component_size
+ self.csp = csp
+ self.direction = direction
+ self.get_popup_container = get_popup_container
+ self.get_target_container = get_target_container
+ self.icon_prefix_cls = icon_prefix_cls
+ self.locale = locale
+ self.popup_match_select_width = popup_match_select_width
+ self.popup_overflow = popup_overflow
+ self.prefix_cls = prefix_cls
+ self.render_empty = render_empty
+ self.theme = theme
+ self.variant = variant
+ self.virtual = virtual
+ self.warning = warning
+
+ FRONTEND_DIR = resolve_frontend_dir("config-provider")
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: None) -> None:
+ return payload
+
+ def postprocess(self, value: None) -> None:
+
+ return value
+
+ def example_payload(self) -> Any:
+ return None
+
+ def example_value(self) -> Any:
+ return None
diff --git a/backend/modelscope_studio/components/antd/date_picker/__init__.py b/backend/modelscope_studio/components/antd/date_picker/__init__.py
new file mode 100644
index 00000000..022d5f81
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/date_picker/__init__.py
@@ -0,0 +1,197 @@
+from __future__ import annotations
+
+from typing import Any, Literal
+
+from gradio.events import EventListener
+
+from ....utils.dev import ModelScopeDataLayoutComponent, resolve_frontend_dir
+from .preset import AntdDatePickerPreset
+from .range_picker import AntdDatePickerRangePicker
+
+
+# aas inputs, outputs
+class AntdDatePicker(ModelScopeDataLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/date-picker
+ """
+ Preset = AntdDatePickerPreset
+ RangePicker = AntdDatePickerRangePicker
+
+ EVENTS = [
+ EventListener("change",
+ callback=lambda block: block._internal.update(
+ bind_change_event=True)),
+ EventListener(
+ "ok",
+ callback=lambda block: block._internal.update(bind_ok_event=True)),
+ EventListener("panel_change",
+ callback=lambda block: block._internal.update(
+ bind_panelChange_event=True)),
+ EventListener("open_change",
+ callback=lambda block: block._internal.update(
+ bind_openChange_event=True)),
+ ]
+
+ # supported slots
+ SLOTS = [
+ 'allowClear.clearIcon',
+ 'prevIcon',
+ 'nextIcon',
+ 'suffixIcon',
+ 'superNextIcon',
+ 'superPrevIcon',
+ 'renderExtraFooter',
+ 'cellRender',
+ 'panelRender',
+ ]
+
+ def __init__(
+ self,
+ value: str | int | float | list[str | int | float] | None = None,
+ props: dict | None = None,
+ *,
+ allow_clear: bool | dict = True,
+ auto_focus: bool = False,
+ cell_render: str | None = None,
+ components: dict | None = None,
+ disabled: bool = False,
+ disabled_date: str | None = None,
+ format: str | list[str] | None = None,
+ order: bool = True,
+ preserve_invalid_on_blur: bool = False,
+ input_read_only: bool = False,
+ locale: dict | None = None,
+ mode: Literal['time', 'date', 'month', 'year', 'decade']
+ | None = None,
+ need_confirm: bool | None = None,
+ next_icon: str | None = None,
+ open: bool | None = None,
+ panel_render: str | None = None,
+ picker: Literal['date', 'week', 'month', 'quarter',
+ 'year'] = 'date',
+ placement: Literal['bottomLeft', 'bottomRight', 'topLeft',
+ 'topRight'] = 'bottomLeft',
+ placeholder: str | None = None,
+ popup_class_name: str | None = None,
+ popup_style: dict | None = None,
+ get_popup_container: str | None = None,
+ min_date: str | int | float | None = None,
+ max_date: str | int | float | None = None,
+ prev_icon: str | None = None,
+ size: Literal['large', 'middle', 'small'] | None = None,
+ presets: list[dict] | None = None,
+ status: Literal['error', 'warning'] | None = None,
+ suffix_icon: str | None = None,
+ super_next_icon: str | None = None,
+ super_prev_icon: str | None = None,
+ variant: Literal['outlined', 'borderless', 'filled'] = 'outlined',
+ default_picker_value: str | int | float | None = None,
+ default_value: str | int | float | None = None,
+ disabled_time: str | None = None,
+ multiple: bool = False,
+ picker_value: str | int | float | None = None,
+ render_extra_footer: str | None = None,
+ show_now: bool | None = None,
+ show_time: bool | dict | None = None,
+ show_week: bool | None = None,
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(value=value,
+ visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.order = order
+ self.preserve_invalid_on_blur = preserve_invalid_on_blur
+ self.components = components
+ self.locale = locale
+ self.allow_clear = allow_clear
+ self.auto_focus = auto_focus
+ self.cell_render = cell_render
+ self.disabled = disabled
+ self.disabled_date = disabled_date
+ self.format = format
+ self.input_read_only = input_read_only
+ self.mode = mode
+ self.need_confirm = need_confirm
+ self.next_icon = next_icon
+ self.open = open
+ self.panel_render = panel_render
+ self.picker = picker
+ self.placement = placement
+ self.placeholder = placeholder
+ self.popup_class_name = popup_class_name
+ self.popup_style = popup_style
+ self.get_popup_container = get_popup_container
+ self.min_date = min_date
+ self.max_date = max_date
+ self.prev_icon = prev_icon
+ self.size = size
+ self.presets = presets
+ self.status = status
+ self.suffix_icon = suffix_icon
+ self.super_next_icon = super_next_icon
+ self.super_prev_icon = super_prev_icon
+ self.variant = variant
+ self.default_picker_value = default_picker_value
+ self.default_value = default_value
+ self.disabled_time = disabled_time
+ self.multiple = multiple
+ self.picker_value = picker_value
+ self.render_extra_footer = render_extra_footer
+ self.show_now = show_now
+ self.show_time = show_time
+ self.show_week = show_week
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("date-picker")
+
+ @property
+ def skip_api(self):
+ return False
+
+ def api_info(self) -> dict[str, Any]:
+ return {
+ "anyOf": [{
+ "type": "number"
+ }, {
+ "type": "string"
+ }, {
+ "type": "array",
+ "items": {
+ "anyOf": [{
+ "type": "number"
+ }, {
+ "type": "string"
+ }]
+ }
+ }]
+ }
+
+ def preprocess(
+ self, payload: str | int | float | list[str | int | float]
+ ) -> str | int | float | list[str | int | float]:
+ return payload
+
+ def postprocess(
+ self, value: str | int | float | list[str | int | float]
+ ) -> str | int | float | list[str | int | float]:
+ return value
+
+ def example_payload(self) -> None:
+ return None
+
+ def example_value(self) -> None:
+ return None
diff --git a/backend/modelscope_studio/components/antd/date_picker/preset/__init__.py b/backend/modelscope_studio/components/antd/date_picker/preset/__init__.py
new file mode 100644
index 00000000..1f8b2493
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/date_picker/preset/__init__.py
@@ -0,0 +1,60 @@
+from __future__ import annotations
+
+from .....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+
+
+class AntdDatePickerPreset(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/date-picker
+ """
+ EVENTS = []
+
+ # supported slots
+ SLOTS = [
+ 'label',
+ ]
+
+ def __init__(
+ self,
+ props: dict | None = None,
+ *,
+ value: int | str | float | None = None,
+ label: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.label = label
+ self.value = value
+
+ FRONTEND_DIR = resolve_frontend_dir("date-picker", 'preset')
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: None) -> None:
+ return payload
+
+ def postprocess(self, value: None) -> None:
+
+ return value
+
+ def example_payload(self) -> None:
+ return None
+
+ def example_value(self) -> None:
+ return None
diff --git a/backend/modelscope_studio/components/antd/date_picker/range_picker/__init__.py b/backend/modelscope_studio/components/antd/date_picker/range_picker/__init__.py
new file mode 100644
index 00000000..41a59066
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/date_picker/range_picker/__init__.py
@@ -0,0 +1,188 @@
+from __future__ import annotations
+
+from typing import Any, Literal
+
+from gradio.events import EventListener
+
+from .....utils.dev import ModelScopeDataLayoutComponent, resolve_frontend_dir
+
+
+# as inputs, outputs
+class AntdDatePickerRangePicker(ModelScopeDataLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/date-picker
+ """
+
+ EVENTS = [
+ EventListener("change",
+ callback=lambda block: block._internal.update(
+ bind_change_event=True)),
+ EventListener(
+ "calendar_change",
+ callback=lambda block: block._internal.update(bind_ok_event=True)),
+ EventListener("focus",
+ callback=lambda block: block._internal.update(
+ bind_calendarChange_event=True)),
+ EventListener("blur",
+ callback=lambda block: block._internal.update(
+ bind_blur_event=True)),
+ ]
+
+ # supported slots
+ SLOTS = [
+ 'allowClear.clearIcon',
+ 'prevIcon',
+ 'nextIcon',
+ 'suffixIcon',
+ 'superNextIcon',
+ 'superPrevIcon',
+ 'renderExtraFooter',
+ 'separator',
+ 'cellRender',
+ 'panelRender',
+ ]
+
+ def __init__(
+ self,
+ value: tuple[str | int | float, str | int | float] | None = None,
+ props: dict | None = None,
+ *,
+ allow_clear: bool | dict = True,
+ auto_focus: bool = False,
+ cell_render: str | None = None,
+ components: dict | None = None,
+ disabled: bool = False,
+ disabled_date: str | None = None,
+ format: str | list[str] | None = None,
+ order: bool = True,
+ preserve_invalid_on_blur: bool = False,
+ input_read_only: bool = False,
+ locale: dict | None = None,
+ mode: Literal['time', 'date', 'month', 'year', 'decade']
+ | None = None,
+ need_confirm: bool | None = None,
+ next_icon: str | None = None,
+ open: bool | None = None,
+ panel_render: str | None = None,
+ picker: Literal['date', 'week', 'month', 'quarter',
+ 'year'] = 'date',
+ placement: Literal['bottomLeft', 'bottomRight', 'topLeft',
+ 'topRight'] = 'bottomLeft',
+ placeholder: str | None = None,
+ popup_class_name: str | None = None,
+ popup_style: dict | None = None,
+ get_popup_container: str | None = None,
+ min_date: str | int | float | None = None,
+ max_date: str | int | float | None = None,
+ prev_icon: str | None = None,
+ size: Literal['large', 'middle', 'small'] | None = None,
+ presets: list[dict] | None = None,
+ status: Literal['error', 'warning'] | None = None,
+ suffix_icon: str | None = None,
+ super_next_icon: str | None = None,
+ super_prev_icon: str | None = None,
+ variant: Literal['outlined', 'borderless', 'filled'] = 'outlined',
+ allow_empty: tuple[bool, bool] | None = None,
+ default_picker_value: str | int | float | None = None,
+ default_value: str | int | float | None = None,
+ disabled_time: str | None = None,
+ id: dict | None = None,
+ picker_value: str | int | float | None = None,
+ render_extra_footer: str | None = None,
+ show_time: bool | dict | None = None,
+ separator: str | None = None,
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(value=value,
+ visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.order = order
+ self.preserve_invalid_on_blur = preserve_invalid_on_blur
+ self.components = components
+ self.locale = locale
+ self.allow_clear = allow_clear
+ self.auto_focus = auto_focus
+ self.cell_render = cell_render
+ self.disabled = disabled
+ self.disabled_date = disabled_date
+ self.format = format
+ self.input_read_only = input_read_only
+ self.mode = mode
+ self.need_confirm = need_confirm
+ self.next_icon = next_icon
+ self.open = open
+ self.panel_render = panel_render
+ self.picker = picker
+ self.placement = placement
+ self.placeholder = placeholder
+ self.popup_class_name = popup_class_name
+ self.popup_style = popup_style
+ self.get_popup_container = get_popup_container
+ self.min_date = min_date
+ self.max_date = max_date
+ self.prev_icon = prev_icon
+ self.size = size
+ self.presets = presets
+ self.status = status
+ self.suffix_icon = suffix_icon
+ self.super_next_icon = super_next_icon
+ self.super_prev_icon = super_prev_icon
+ self.variant = variant
+ self.allow_empty = allow_empty
+ self.default_picker_value = default_picker_value
+ self.default_value = default_value
+ self.disabled_time = disabled_time
+ self.id = id
+ self.picker_value = picker_value
+ self.render_extra_footer = render_extra_footer
+ self.show_time = show_time
+ self.separator = separator
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("date-picker", 'range-picker')
+
+ @property
+ def skip_api(self):
+ return False
+
+ def api_info(self) -> dict[str, Any]:
+ return {
+ "type": "array",
+ "items": {
+ "anyOf": [{
+ "type": "number"
+ }, {
+ "type": "string"
+ }]
+ }
+ }
+
+ def preprocess(
+ self, payload: tuple[str | int | float, str | int | float]
+ ) -> tuple[str | int | float, str | int | float]:
+ return payload
+
+ def postprocess(
+ self, value: tuple[str | int | float, str | int | float]
+ ) -> tuple[str | int | float, str | int | float]:
+ return value
+
+ def example_payload(self) -> None:
+ return None
+
+ def example_value(self) -> None:
+ return None
diff --git a/backend/modelscope_studio/components/antd/descriptions/__init__.py b/backend/modelscope_studio/components/antd/descriptions/__init__.py
new file mode 100644
index 00000000..194cc71d
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/descriptions/__init__.py
@@ -0,0 +1,81 @@
+from __future__ import annotations
+
+from typing import Any, Literal
+
+from ....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+from .item import AntdDescriptionsItem
+
+
+class AntdDescriptions(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/descriptions
+ """
+ Item = AntdDescriptionsItem
+
+ EVENTS = []
+
+ # supported slots
+ SLOTS = ['extra', 'title', "items"]
+
+ def __init__(
+ self,
+ props: dict | None = None,
+ *,
+ bordered: bool = False,
+ colon: bool = True,
+ column: int | dict | None = 3,
+ content_style: dict | None = None,
+ extra: str | None = None,
+ layout: Literal['horizontal', 'vertical'] = 'horizontal',
+ size: Literal['default', 'middle', 'small'] | None = None,
+ title: str | None = None,
+ items: list[dict] | None = None,
+ label_style: dict | None = None,
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.title = title
+ self.items = items
+ self.bordered = bordered
+ self.colon = colon
+ self.column = column
+ self.content_style = content_style
+ self.extra = extra
+ self.layout = layout
+ self.size = size
+ self.root_class_name = root_class_name
+ self.label_style = label_style
+
+ FRONTEND_DIR = resolve_frontend_dir("descriptions")
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: None) -> None:
+ return payload
+
+ def postprocess(self, value: None) -> None:
+
+ return value
+
+ def example_payload(self) -> Any:
+ return None
+
+ def example_value(self) -> Any:
+ return None
diff --git a/backend/modelscope_studio/components/antd/descriptions/item/__init__.py b/backend/modelscope_studio/components/antd/descriptions/item/__init__.py
new file mode 100644
index 00000000..a4b3643f
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/descriptions/item/__init__.py
@@ -0,0 +1,64 @@
+from __future__ import annotations
+
+from typing import Any
+
+from .....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+
+
+class AntdDescriptionsItem(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/descriptions
+ """
+
+ EVENTS = []
+
+ # supported slots
+ SLOTS = ['label', 'children']
+
+ def __init__(
+ self,
+ label: str | None = "",
+ props: dict | None = None,
+ *,
+ content_style: dict | None = None,
+ label_style: dict | None = None,
+ span: int | dict | None = 1,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.label = label
+ self.span = span
+ self.content_style = content_style
+ self.label_style = label_style
+
+ FRONTEND_DIR = resolve_frontend_dir("descriptions", "item")
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: None) -> None:
+ return payload
+
+ def postprocess(self, value: None) -> None:
+ return value
+
+ def example_payload(self) -> Any:
+ return None
+
+ def example_value(self) -> Any:
+ return None
diff --git a/backend/modelscope_studio/components/antd/divider/__init__.py b/backend/modelscope_studio/components/antd/divider/__init__.py
new file mode 100644
index 00000000..985dd34d
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/divider/__init__.py
@@ -0,0 +1,86 @@
+from __future__ import annotations
+
+from typing import Any, Literal
+
+from ....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+
+
+class AntdDivider(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/divider
+
+ A divider line separates different content.
+
+ When to use:
+ - Divide sections of an article.
+ - Divide inline text and links such as the operation column of table.
+ """
+
+ EVENTS = []
+
+ def __init__(
+ self,
+ value: str | None = None,
+ props: dict | None = None,
+ *,
+ dashed: bool = False,
+ variant: Literal["dashed", "dotted", "solid"] = "solid",
+ orientation: Literal["left", "right", "center"] = "center",
+ orientation_margin: str | int | float | None = None,
+ plain: bool = False,
+ type: Literal["horizontal", "vertical"] = "horizontal",
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ """
+ Parameters:
+ value: The wrapped title.
+ dashed: Whether line is dashed.
+ variant: Whether line is dashed, dotted or solid.
+ orientation: The position of title inside divider.
+ orientation_margin: The margin-left/right between the title and its closest border, while the orientation must be left or right, If a numeric value of type string is provided without a unit, it is assumed to be in pixels (px) by default.
+ plain: Divider text show as plain style.
+ type: The direction type of divider.
+ """
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.value = value
+ self.props = props
+ self.dashed = dashed
+ self.variant = variant
+ self.orientation = orientation
+ self.orientation_margin = orientation_margin
+ self.plain = plain
+ self.type = type
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("divider")
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: str | None) -> str | None:
+ return payload
+
+ def postprocess(self, value: str | None) -> str | None:
+
+ return str(value)
+
+ def example_payload(self) -> Any:
+ return None
+
+ def example_value(self) -> Any:
+ return None
diff --git a/backend/modelscope_studio/components/antd/drawer/__init__.py b/backend/modelscope_studio/components/antd/drawer/__init__.py
new file mode 100644
index 00000000..7128b003
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/drawer/__init__.py
@@ -0,0 +1,114 @@
+from __future__ import annotations
+
+from typing import Any, Literal
+
+from gradio.events import EventListener
+
+from ....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+
+
+class AntdDrawer(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/drawer
+ """
+ EVENTS = [
+ EventListener("close",
+ callback=lambda block: block._internal.update(
+ bind_close_event=True))
+ ]
+
+ # supported slots
+ SLOTS = ['closeIcon', 'extra', 'footer', 'title', 'drawerRender']
+
+ def __init__(
+ self,
+ props: dict | None = None,
+ *,
+ after_open_change: str | None = None,
+ auto_focus: bool | None = None,
+ body_style: dict | None = None,
+ close_icon: str | None = None,
+ class_names: dict | None = None,
+ destroy_on_close: bool | None = None,
+ extra: str | None = None,
+ footer: str | None = None,
+ force_render: bool | None = None,
+ get_container: str | None = None,
+ height: int | float | str | None = None,
+ keyboard: bool | None = None,
+ mask: bool | None = None,
+ mask_closable: bool | None = None,
+ placement: Literal['left', 'right', 'top', 'bottom'] | None = None,
+ push: bool | dict | None = None,
+ size: Literal['default', 'large'] | None = None,
+ styles: dict | None = None,
+ title: str | None = None,
+ loading: bool | None = None,
+ open: bool | None = None,
+ width: int | float | None = None,
+ z_index: int | None = None,
+ drawer_render: str | None = None,
+ root_style: dict | None = None,
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.after_open_change = after_open_change
+ self.auto_focus = auto_focus
+ self.body_style = body_style
+ self.close_icon = close_icon
+ self.class_names = class_names
+ self.destroy_on_close = destroy_on_close
+ self.extra = extra
+ self.footer = footer
+ self.force_render = force_render
+ self.get_container = get_container
+ self.height = height
+ self.keyboard = keyboard
+ self.mask = mask
+ self.mask_closable = mask_closable
+ self.placement = placement
+ self.push = push
+ self.size = size
+ self.styles = styles
+ self.title = title
+ self.loading = loading
+ self.open = open
+ self.width = width
+ self.z_index = z_index
+ self.drawer_render = drawer_render
+ self.root_style = root_style
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("drawer")
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: None) -> None:
+ return payload
+
+ def postprocess(self, value: None) -> None:
+
+ return value
+
+ def example_payload(self) -> Any:
+ return None
+
+ def example_value(self) -> Any:
+ return None
diff --git a/backend/modelscope_studio/components/antd/dropdown/__init__.py b/backend/modelscope_studio/components/antd/dropdown/__init__.py
new file mode 100644
index 00000000..6dce67da
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/dropdown/__init__.py
@@ -0,0 +1,110 @@
+from __future__ import annotations
+
+from typing import Any, Literal
+
+from gradio.events import EventListener
+
+from ....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+from .button import AntdDropdownButton
+
+
+class AntdDropdown(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/dropdown
+ """
+ Button = AntdDropdownButton
+ EVENTS = [
+ EventListener("open_change",
+ callback=lambda block: block._internal.update(
+ bind_openChange_event=True)),
+ EventListener("menu_click",
+ callback=lambda block: block._internal.update(
+ bind_menu_click_event=True)),
+ EventListener("menu_deselect",
+ callback=lambda block: block._internal.update(
+ bind_menu_deselect_event=True)),
+ EventListener("menu_open_change",
+ callback=lambda block: block._internal.update(
+ bind_menu_openChange_event=True)),
+ EventListener("menu_select",
+ callback=lambda block: block._internal.update(
+ bind_menu_select_event=True)),
+ ]
+
+ # supported slots
+ SLOTS = [
+ "menu.expandIcon", 'menu.overflowedIndicator', "menu.items",
+ "dropdownRender"
+ ]
+
+ def __init__(
+ self,
+ props: dict | None = None,
+ *,
+ arrow: dict | bool = False,
+ auto_adjust_overflow: bool = True,
+ auto_focus: bool = False,
+ disabled: bool | None = None,
+ destroy_popup_on_hide: bool = False,
+ dropdown_render: str | None = None,
+ get_popup_container: str | None = None,
+ menu: dict | None = None,
+ overlay_class_name: str | None = None,
+ overlay_style: dict | None = None,
+ placement: Literal['topLeft', 'top', 'topRight', 'bottomLeft',
+ 'bottom', 'bottomRight'] = "bottomLeft",
+ trigger: list[Literal['click', 'hover',
+ 'contextMenu']] = ['hover'],
+ open: bool | None = None,
+ inner_elem_style: dict | None = None,
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.arrow = arrow
+ self.auto_adjust_overflow = auto_adjust_overflow
+ self.auto_focus = auto_focus
+ self.disabled = disabled
+ self.destroy_popup_on_hide = destroy_popup_on_hide
+ self.dropdown_render = dropdown_render
+ self.get_popup_container = get_popup_container
+ self.menu = menu
+ self.overlay_class_name = overlay_class_name
+ self.overlay_style = overlay_style
+ self.placement = placement
+ self.trigger = trigger
+ self.open = open
+ self.inner_elem_style = inner_elem_style
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("dropdown")
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: None) -> None:
+ return payload
+
+ def postprocess(self, value: None) -> None:
+ return value
+
+ def example_payload(self) -> Any:
+ return None
+
+ def example_value(self) -> Any:
+ return None
diff --git a/backend/modelscope_studio/components/antd/dropdown/button/__init__.py b/backend/modelscope_studio/components/antd/dropdown/button/__init__.py
new file mode 100644
index 00000000..4bc50154
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/dropdown/button/__init__.py
@@ -0,0 +1,126 @@
+from __future__ import annotations
+
+from typing import Any, Literal
+
+from gradio.events import EventListener
+
+from .....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+
+
+class AntdDropdownButton(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/dropdown
+ """
+
+ EVENTS = [
+ EventListener("click",
+ callback=lambda block: block._internal.update(
+ bind_click_event=True)),
+ EventListener("open_change",
+ callback=lambda block: block._internal.update(
+ bind_openChange_event=True)),
+ EventListener("menu_click",
+ callback=lambda block: block._internal.update(
+ bind_menu_click_event=True)),
+ EventListener("menu_deselect",
+ callback=lambda block: block._internal.update(
+ bind_menu_deselect_event=True)),
+ EventListener("menu_open_change",
+ callback=lambda block: block._internal.update(
+ bind_menu_openChange_event=True)),
+ EventListener("menu_select",
+ callback=lambda block: block._internal.update(
+ bind_menu_select_event=True)),
+ ]
+
+ # supported slots
+ SLOTS = [
+ "icon", 'dropdownRender', 'buttonsRender', "menu.expandIcon",
+ 'menu.overflowedIndicator', "menu.items"
+ ]
+
+ def __init__(
+ self,
+ value: str | None = "Run",
+ props: dict | None = None,
+ *,
+ arrow: dict | bool = False,
+ auto_adjust_overflow: bool = True,
+ auto_focus: bool = False,
+ disabled: bool | None = None,
+ destroy_popup_on_hide: bool = False,
+ dropdown_render: str | None = None,
+ get_popup_container: str | None = None,
+ menu: dict | None = None,
+ overlay_class_name: str | None = None,
+ overlay_style: dict | None = None,
+ placement: Literal['topLeft', 'top', 'topRight', 'bottomLeft',
+ 'bottom', 'bottomRight'] = "bottomLeft",
+ trigger: list[Literal['click', 'hover',
+ 'contextMenu']] = ['hover'],
+ open: bool | None = None,
+ buttons_render: str | None = None,
+ loading: bool | dict = False,
+ danger: bool | None = None,
+ icon: str | None = None,
+ size: Literal["large", "middle", "small"] | None = None,
+ type: Literal["primary", "dashed", "link", "text", "default"]
+ | None = None,
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.value = value
+ self.arrow = arrow
+ self.auto_adjust_overflow = auto_adjust_overflow
+ self.auto_focus = auto_focus
+ self.disabled = disabled
+ self.destroy_popup_on_hide = destroy_popup_on_hide
+ self.dropdown_render = dropdown_render
+ self.get_popup_container = get_popup_container
+ self.menu = menu
+ self.overlay_class_name = overlay_class_name
+ self.overlay_style = overlay_style
+ self.placement = placement
+ self.trigger = trigger
+ self.open = open
+ self.buttons_render = buttons_render
+ self.loading = loading
+ self.danger = danger
+ self.icon = icon
+ self.size = size
+ self.type = type
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("dropdown", "button")
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: str | None) -> str | None:
+ return payload
+
+ def postprocess(self, value: str | None) -> str | None:
+
+ return str(value)
+
+ def example_payload(self) -> Any:
+ return "Run"
+
+ def example_value(self) -> Any:
+ return "Run"
diff --git a/backend/modelscope_studio/components/antd/empty/__init__.py b/backend/modelscope_studio/components/antd/empty/__init__.py
new file mode 100644
index 00000000..c4065120
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/empty/__init__.py
@@ -0,0 +1,64 @@
+from __future__ import annotations
+
+from typing import Any
+
+from ....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+
+
+class AntdEmpty(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/empty
+ """
+
+ EVENTS = []
+
+ # supported slots
+ SLOTS = ['description', 'image']
+
+ def __init__(
+ self,
+ props: dict | None = None,
+ *,
+ description: str | None = None,
+ image: str | None = None,
+ image_style: dict | None = None,
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.description = description
+ self.image = image
+ self.image_style = image_style
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("empty")
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: None) -> None:
+ return payload
+
+ def postprocess(self, value: None) -> None:
+ return value
+
+ def example_payload(self) -> Any:
+ return None
+
+ def example_value(self) -> Any:
+ return None
diff --git a/backend/modelscope_studio/components/antd/flex/__init__.py b/backend/modelscope_studio/components/antd/flex/__init__.py
new file mode 100644
index 00000000..82ecbb57
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/flex/__init__.py
@@ -0,0 +1,91 @@
+from __future__ import annotations
+
+from typing import Any, Literal
+
+from ....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+
+
+class AntdFlex(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/flex
+
+ A flex layout container for alignment.
+
+ When to use:
+ - Good for setting spacing between elements.
+ - Suitable for setting various horizontal and vertical alignments.
+ """
+
+ EVENTS = []
+
+ def __init__(
+ self,
+ props: dict | None = None,
+ *,
+ vertical: bool = False,
+ wrap: Literal['nowrap', 'wrap', 'wrap-reverse'] | bool = "nowrap",
+ justify: Literal['normal', 'start', 'end', 'flex-start',
+ 'flex-end', 'center', 'left', 'right',
+ 'space-between', 'space-around', 'space-evenly',
+ 'stretch', 'safe', 'unsafe'] | None = "normal",
+ align: Literal['normal', 'start', 'end', 'flex-start', 'flex-end',
+ 'center', 'self-start', 'self-end', 'baseline',
+ 'unsafe', 'stretch'] | None = "normal",
+ flex: str | None = "normal",
+ gap: Literal["small", "middle", "large"] | str | int | float
+ | None = None,
+ component: str | None = None,
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ """
+ Parameters:
+ vertical: Is direction of the flex vertical, use flex-direction: column.
+ wrap: Set whether the element is displayed in a single line or in multiple lines.
+ justify: Sets the alignment of elements in the direction of the main axis.
+ align: Sets the alignment of elements in the direction of the cross axis.
+ flex: flex CSS shorthand properties.
+ gap: Sets the gap between grids.
+ component: custom element type.
+ """
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.vertical = vertical
+ self.wrap = wrap
+ self.justify = justify
+ self.align = align
+ self.flex = flex
+ self.gap = gap
+ self.component = component
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("flex")
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: None) -> None:
+ return payload
+
+ def postprocess(self, value: None) -> None:
+ return value
+
+ def example_payload(self) -> Any:
+ return None
+
+ def example_value(self) -> Any:
+ return None
diff --git a/backend/modelscope_studio/components/antd/float_button/__init__.py b/backend/modelscope_studio/components/antd/float_button/__init__.py
new file mode 100644
index 00000000..cde90212
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/float_button/__init__.py
@@ -0,0 +1,105 @@
+from __future__ import annotations
+
+from typing import Literal
+
+from gradio.events import EventListener
+
+from ....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+from .back_top import AntdFloatButtonBackTop
+from .group import AntdFloatButtonGroup
+
+
+class AntdFloatButton(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/float-button
+
+ A button that floats at the top of the page.
+
+ When to use:
+ - For global functionality on the site.
+ - Buttons that can be seen wherever you browse.
+ """
+ BackTop = AntdFloatButtonBackTop
+ Group = AntdFloatButtonGroup
+ EVENTS = [
+ EventListener("click",
+ callback=lambda block: block._internal.update(
+ bind_click_event=True),
+ doc="Set the handler to handle `click` event.")
+ ]
+
+ # supported slots
+ SLOTS = ['icon', 'description', 'tooltip', 'badge.count']
+
+ def __init__(
+ self,
+ props: dict | None = None,
+ *,
+ icon: str | None = None,
+ description: str | None = None,
+ tooltip: str | None = None,
+ type: Literal['default', 'primary'] = 'default',
+ shape: Literal['circle', 'square'] = 'circle',
+ href: str | None = None,
+ href_target: str | None = None,
+ html_type: Literal['submit', 'reset', 'button'] | None = 'button',
+ badge: dict | None = None,
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ """
+ Parameters:
+ icon: Set the icon component of button.
+ description: Text and other.
+ tooltip: The text shown in the tooltip.
+ type: Setting button type.
+ shape: Setting button shape.
+ href_target: The target of hyperlink.
+ target: Specifies where to display the linked URL string.
+ htmlType: Set the original html type of button.
+ badge: Attach Badge to FloatButton. status and other props related are not supported.
+ """
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.icon = icon
+ self.description = description
+ self.tooltip = tooltip
+ self.type = type
+ self.shape = shape
+ self.href = href
+ self.href_target = href_target
+ self.html_type = html_type
+ self.badge = badge
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("float-button")
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: None) -> None:
+ return payload
+
+ def postprocess(self, value: None) -> None:
+
+ return value
+
+ def example_payload(self) -> None:
+ return None
+
+ def example_value(self) -> None:
+ return None
diff --git a/backend/modelscope_studio/components/antd/float_button/back_top/__init__.py b/backend/modelscope_studio/components/antd/float_button/back_top/__init__.py
new file mode 100644
index 00000000..427fb7c1
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/float_button/back_top/__init__.py
@@ -0,0 +1,111 @@
+from __future__ import annotations
+
+from typing import Literal
+
+from gradio.events import EventListener
+
+from .....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+
+
+class AntdFloatButtonBackTop(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/float-button
+
+ A button that floats at the top of the page.
+
+ When to use:
+ - For global functionality on the site.
+ - Buttons that can be seen wherever you browse.
+ """
+
+ EVENTS = [
+ EventListener(
+ "click",
+ callback=lambda block: block._internal.update(bind_click_event=True
+ ),
+ doc=
+ "A callback function, which can be executed when you click the button."
+ )
+ ]
+
+ # supported slots
+ SLOTS = ['icon', 'description', 'tooltip', 'badge.count']
+
+ def __init__(
+ self,
+ props: dict | None = None,
+ *,
+ icon: str | None = None,
+ description: str | None = None,
+ tooltip: str | None = None,
+ type: Literal['default', 'primary'] = 'default',
+ shape: Literal['circle', 'square'] = 'circle',
+ href: str | None = None,
+ html_type: Literal['submit', 'reset', 'button'] | None = 'button',
+ badge: dict | None = None,
+ duration: int | float = 450,
+ get_target: str | None = None,
+ visibility_height: int | float = 400,
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ """
+ Parameters:
+ icon: Set the icon component of button.
+ description: Text and other.
+ tooltip: The text shown in the tooltip.
+ type: Setting button type.
+ shape: Setting button shape.
+ target: Specifies where to display the linked URL string.
+ htmlType: Set the original html type of button.
+ badge: Attach Badge to FloatButton. status and other props related are not supported.
+ duration: Time to return to top(ms).
+ get_target: Specifies the scrollable area dom node.
+ visibility_height: The BackTop button will not show until the scroll height reaches this value.
+ """
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.icon = icon
+ self.description = description
+ self.tooltip = tooltip
+ self.type = type
+ self.shape = shape
+ self.href = href
+ self.html_type = html_type
+ self.badge = badge
+ self.duration = duration
+ self.visibility_height = visibility_height
+ self.get_target = get_target
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("float-button", "back-top")
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: None) -> None:
+ return payload
+
+ def postprocess(self, value: None) -> None:
+
+ return value
+
+ def example_payload(self) -> None:
+ return None
+
+ def example_value(self) -> None:
+ return None
diff --git a/backend/modelscope_studio/components/antd/float_button/group/__init__.py b/backend/modelscope_studio/components/antd/float_button/group/__init__.py
new file mode 100644
index 00000000..d03ddd28
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/float_button/group/__init__.py
@@ -0,0 +1,123 @@
+from __future__ import annotations
+
+from typing import Literal
+
+from gradio.events import EventListener
+
+from .....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+
+
+class AntdFloatButtonGroup(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/float-button
+
+ A button that floats at the top of the page.
+
+ When to use:
+ - For global functionality on the site.
+ - Buttons that can be seen wherever you browse.
+ """
+ EVENTS = [
+ EventListener(
+ "click",
+ callback=lambda block: block._internal.update(bind_click_event=True
+ ),
+ doc=
+ "Set the handler to handle click event (only work in Menu mode)."),
+ EventListener(
+ "open_change",
+ callback=lambda block: block._internal.update(bind_openChange_event
+ =True),
+ doc=
+ "Callback executed when active menu is changed, use it with trigger."
+ )
+ ]
+
+ # supported slots
+ SLOTS = ['icon', 'closeIcon', 'description', 'tooltip', 'badge.count']
+
+ def __init__(
+ self,
+ props: dict | None = None,
+ *,
+ icon: str | None = None,
+ description: str | None = None,
+ tooltip: str | None = None,
+ type: Literal['default', 'primary'] = 'default',
+ shape: Literal['circle', 'square'] = 'circle',
+ href: str | None = None,
+ href_target: str | None = None,
+ html_type: Literal['submit', 'reset', 'button'] | None = 'button',
+ badge: dict | None = None,
+ trigger: Literal['hover', 'click'] | None = None,
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ open: bool | None = None,
+ close_icon: str | None = None,
+ placement: Literal['left', 'right', 'top', 'bottom']
+ | None = 'top',
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ """
+ Parameters:
+ icon: Set the icon component of button.
+ description: Text and other.
+ tooltip: The text shown in the tooltip.
+ type: Setting button type.
+ shape: Setting button shape.
+ href_target: The target of hyperlink.
+ target: Specifies where to display the linked URL string.
+ htmlType: Set the original html type of button.
+ badge: Attach Badge to FloatButton. status and other props related are not supported.
+ trigger: Which action can trigger menu open/close.
+ open: Whether the menu is visible or not, use it with trigger.
+ closeIcon: Customize close button icon.
+ placement: Customize menu animation placement.
+ """
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.icon = icon
+ self.description = description
+ self.tooltip = tooltip
+ self.type = type
+ self.shape = shape
+ self.href = href
+ self.href_target = href_target
+ self.html_type = html_type
+ self.badge = badge
+ self.trigger = trigger
+ self.open = open
+ self.close_icon = close_icon
+ self.placement = placement
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("float-button", "group")
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: None) -> None:
+ return payload
+
+ def postprocess(self, value: None) -> None:
+
+ return value
+
+ def example_payload(self) -> None:
+ return None
+
+ def example_value(self) -> None:
+ return None
diff --git a/backend/modelscope_studio/components/antd/form/__init__.py b/backend/modelscope_studio/components/antd/form/__init__.py
new file mode 100644
index 00000000..93fce2c0
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/form/__init__.py
@@ -0,0 +1,123 @@
+from __future__ import annotations
+
+from typing import Literal, Union
+
+from gradio.data_classes import GradioRootModel
+from gradio.events import EventListener
+
+from ....utils.dev import ModelScopeDataLayoutComponent, resolve_frontend_dir
+from .item import AntdFormItem
+
+
+class AntdFormData(GradioRootModel):
+ root: Union[dict, None] = None
+
+
+class AntdForm(ModelScopeDataLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/form
+ """
+ Item = AntdFormItem
+ EVENTS = [
+ EventListener("fields_change",
+ callback=lambda block: block._internal.update(
+ bind_fieldsChange_event=True)),
+ EventListener("finish",
+ callback=lambda block: block._internal.update(
+ bind_finish_event=True)),
+ EventListener("finish_failed",
+ callback=lambda block: block._internal.update(
+ bind_finishFailed_event=True)),
+ EventListener("values_change",
+ callback=lambda block: block._internal.update(
+ bind_valuesChange_event=True)),
+ ]
+
+ data_model = AntdFormData
+
+ # supported slots
+ SLOTS = ["requiredMark"]
+
+ def __init__(
+ self,
+ value: dict | None = None,
+ props: dict | None = None,
+ *,
+ colon: bool = True,
+ disabled: bool = False,
+ component: str | False | None = None,
+ feedback_icons: str | None = None,
+ initial_values: dict | None = None,
+ label_align: Literal['left', 'right'] = 'right',
+ label_col: dict | None = None,
+ label_wrap: bool = False,
+ layout: Literal['horizontal', 'vertical', 'inline'] = 'horizontal',
+ form_name: str | None = None,
+ preserve: bool = True,
+ required_mark: bool | Literal['optional'] | str | None = None,
+ scroll_to_first_error: bool | dict = False,
+ size: Literal['small', 'middle', 'large'] | None = None,
+ validate_messages: dict | None = None,
+ validate_trigger: str | list[str] = 'onChange',
+ variant: Literal['outlined', 'borderless', 'filled'] = 'outlined',
+ wrapper_col: dict | None = None,
+ clear_on_destroy: bool = False,
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(value=value,
+ visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.colon = colon
+ self.disabled = disabled
+ self.component = component
+ self.feedback_icons = feedback_icons
+ self.initial_values = initial_values
+ self.label_align = label_align
+ self.label_col = label_col
+ self.label_wrap = label_wrap
+ self.layout = layout
+ self.form_name = form_name
+ self.preserve = preserve
+ self.required_mark = required_mark
+ self.scroll_to_first_error = scroll_to_first_error
+ self.size = size
+ self.validate_messages = validate_messages
+ self.validate_trigger = validate_trigger
+ self.variant = variant
+ self.wrapper_col = wrapper_col
+ self.clear_on_destroy = clear_on_destroy
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("form")
+
+ @property
+ def skip_api(self):
+ return False
+
+ def preprocess(self, payload: dict | AntdFormData | None) -> dict | None:
+ if isinstance(payload, AntdFormData):
+ return payload.root
+ return payload
+
+ def postprocess(self, value: dict | None) -> dict | None:
+ return value
+
+ def example_payload(self) -> dict:
+ return {}
+
+ def example_value(self) -> dict:
+ return {}
diff --git a/backend/modelscope_studio/components/antd/form/item/__init__.py b/backend/modelscope_studio/components/antd/form/item/__init__.py
new file mode 100644
index 00000000..465185ac
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/form/item/__init__.py
@@ -0,0 +1,124 @@
+from __future__ import annotations
+
+from typing import Literal
+
+from .....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+from .rule import AntdFormItemRule
+
+
+class AntdFormItem(ModelScopeLayoutComponent):
+ """
+ """
+ Rule = AntdFormItemRule
+ EVENTS = []
+
+ # supported slots
+ SLOTS = [
+ 'extra', 'help', 'label', 'tooltip', 'tooltip.title', 'tooltip.icon'
+ ]
+
+ def __init__(
+ self,
+ label: str | None = None,
+ props: dict | None = None,
+ *,
+ form_name: str | int | float | list[str | int | float]
+ | None = None,
+ colon: bool | None = None,
+ dependencies: list[str | int | float | list[str | int | float]]
+ | None = None,
+ extra: str | None = None,
+ get_value_from_event: str | None = None,
+ get_value_props: str | None = None,
+ has_feedback: bool | dict = False,
+ help: str | None = None,
+ hidden: bool = False,
+ html_for: str | None = None,
+ initial_value: str | int | float | list | dict | None = None,
+ label_align: str | None = None,
+ label_col: dict | None = None,
+ message_variants: dict | None = None,
+ normalize: str | None = None,
+ no_style: bool = False,
+ preserve: bool = True,
+ required: bool = False,
+ rules: list[dict] | None = None,
+ should_update: str | None = None,
+ tooltip: str | dict | None = None,
+ trigger: str | list[str] = 'onChange',
+ validate_debounce: int | float | None = None,
+ validate_first: bool | Literal['parallel'] = False,
+ validate_status: Literal['error', 'success', 'warning',
+ 'validating']
+ | None = None,
+ validate_trigger: str | list[str] = 'onChange',
+ value_prop_name: str | None = None,
+ wrapper_col: dict | None = None,
+ layout: Literal['horizontal', 'vertical'] | None = None,
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.label = label
+ self.form_name = form_name
+ self.props = props
+ self.colon = colon
+ self.dependencies = dependencies
+ self.extra = extra
+ self.get_value_from_event = get_value_from_event
+ self.get_value_props = get_value_props
+ self.has_feedback = has_feedback
+ self.help = help
+ self.hidden = hidden
+ self.html_for = html_for
+ self.initial_value = initial_value
+ self.label_align = label_align
+ self.label_col = label_col
+ self.message_variants = message_variants
+ self.normalize = normalize
+ self.no_style = no_style
+ self.preserve = preserve
+ self.required = required
+ self.rules = rules
+ self.should_update = should_update
+ self.tooltip = tooltip
+ self.trigger = trigger
+ self.validate_debounce = validate_debounce
+ self.validate_first = validate_first
+ self.validate_status = validate_status
+ self.validate_trigger = validate_trigger
+ self.value_prop_name = value_prop_name
+ self.wrapper_col = wrapper_col
+ self.layout = layout
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("form", "item")
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: None) -> None:
+ return payload
+
+ def postprocess(self, value: None) -> None:
+ return value
+
+ def example_payload(self) -> None:
+ return None
+
+ def example_value(self) -> None:
+ return None
diff --git a/backend/modelscope_studio/components/antd/form/item/rule/__init__.py b/backend/modelscope_studio/components/antd/form/item/rule/__init__.py
new file mode 100644
index 00000000..787eb4dc
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/form/item/rule/__init__.py
@@ -0,0 +1,80 @@
+from __future__ import annotations
+
+from ......utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+
+
+class AntdFormItemRule(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/dropdown
+ """
+ EVENTS = []
+
+ def __init__(
+ self,
+ props: dict | None = None,
+ *,
+ default_field: dict | str | None = None,
+ enum: list | None = None,
+ fields: dict | None = None,
+ len: int | None = None,
+ max: int | float | None = None,
+ message: str | None = None,
+ min: int | float | None = None,
+ pattern: str | None = None,
+ required: bool | None = None,
+ transform: str | None = None,
+ type: str | None = None,
+ validator_trigger: str | list[str] | None = None,
+ validator: str | None = None,
+ warning_only: bool | None = None,
+ whitespace: bool | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.default_field = default_field
+ self.enum = enum
+ self.fields = fields
+ self.len = len
+ self.max = max
+ self.message = message
+ self.min = min
+ self.pattern = pattern
+ self.required = required
+ self.transform = transform
+ self.type = type
+ self.validator_trigger = validator_trigger
+ self.validator = validator
+ self.warning_only = warning_only
+ self.whitespace = whitespace
+
+ FRONTEND_DIR = resolve_frontend_dir("form", ["item", "rule"])
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: None) -> None:
+ return payload
+
+ def postprocess(self, value: None) -> None:
+ return value
+
+ def example_payload(self) -> None:
+ return None
+
+ def example_value(self) -> None:
+ return None
diff --git a/backend/modelscope_studio/components/antd/grid/col/__init__.py b/backend/modelscope_studio/components/antd/grid/col/__init__.py
new file mode 100644
index 00000000..824f1141
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/grid/col/__init__.py
@@ -0,0 +1,109 @@
+from __future__ import annotations
+
+from typing import Any
+
+from .....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+
+
+class AntdCol(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/grid
+
+ 24 Grids System.
+
+ In the grid system, we define the frame outside the information area based on row and column, to ensure that every area can have stable arrangement.
+
+ Following is a brief look at how it works:
+
+ - Establish a set of column in the horizontal space defined by row (abbreviated col).
+ - Your content elements should be placed directly in the col, and only col should be placed directly in row.
+ - The column grid system is a value of 1-24 to represent its range spans. For example, three columns of equal width can be created by .
+ - If the sum of col spans in a row are more than 24, then the overflowing col as a whole will start a new line arrangement.
+
+ Our grid systems base on Flex layout to allow the elements within the parent to be aligned horizontally - left, center, right, wide arrangement, and decentralized arrangement. The Grid system also supports vertical alignment - top aligned, vertically centered, bottom-aligned. You can also define the order of elements by using order.
+
+ Layout uses a 24 grid layout to define the width of each "box", but does not rigidly adhere to the grid layout.
+ """
+
+ EVENTS = []
+
+ def __init__(
+ self,
+ props: dict | None = None,
+ *,
+ flex: str | int | None = None,
+ offset: int = 0,
+ order: int = 0,
+ pull: int = 0,
+ push: int = 0,
+ span: int | None = None,
+ xs: int | dict | None = None,
+ sm: int | dict | None = None,
+ md: int | dict | None = None,
+ lg: int | dict | None = None,
+ xl: int | dict | None = None,
+ xxl: int | dict | None = None,
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ """
+ Parameters:
+ flex: Flex layout style.
+ offset: The number of cells to offset Col from the left.
+ order: Raster order.
+ pull: The number of cells that raster is moved to the left.
+ push: The number of cells that raster is moved to the right.
+ span: Raster number of cells to occupy, 0 corresponds to display: none.
+ xs: screen < 576px and also default setting, could be a span value or an object containing above props.
+ sm: screen ≥ 576px, could be a span value or an object containing above props.
+ md: screen ≥ 768px, could be a span value or an object containing above props.
+ lg: screen ≥ 992px, could be a span value or an object containing above props.
+ xl: screen ≥ 1200px, could be a span value or an object containing above props.
+ xxl: screen ≥ 1600px, could be a span value or an object containing above props.
+ """
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.flex = flex
+ self.offset = offset
+ self.order = order
+ self.pull = pull
+ self.push = push
+ self.span = span
+ self.xs = xs
+ self.sm = sm
+ self.md = md
+ self.lg = lg
+ self.xl = xl
+ self.xxl = xxl
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("grid", 'col')
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: None) -> None:
+ return payload
+
+ def postprocess(self, value: None) -> None:
+ return value
+
+ def example_payload(self) -> Any:
+ return None
+
+ def example_value(self) -> Any:
+ return None
diff --git a/backend/modelscope_studio/components/antd/grid/row/__init__.py b/backend/modelscope_studio/components/antd/grid/row/__init__.py
new file mode 100644
index 00000000..be0febe6
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/grid/row/__init__.py
@@ -0,0 +1,89 @@
+from __future__ import annotations
+
+from typing import Any, Literal
+
+from .....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+
+
+class AntdRow(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/grid
+
+ 24 Grids System.
+
+ In the grid system, we define the frame outside the information area based on row and column, to ensure that every area can have stable arrangement.
+
+ Following is a brief look at how it works:
+
+ - Establish a set of column in the horizontal space defined by row (abbreviated col).
+ - Your content elements should be placed directly in the col, and only col should be placed directly in row.
+ - The column grid system is a value of 1-24 to represent its range spans. For example, three columns of equal width can be created by .
+ - If the sum of col spans in a row are more than 24, then the overflowing col as a whole will start a new line arrangement.
+
+ Our grid systems base on Flex layout to allow the elements within the parent to be aligned horizontally - left, center, right, wide arrangement, and decentralized arrangement. The Grid system also supports vertical alignment - top aligned, vertically centered, bottom-aligned. You can also define the order of elements by using order.
+
+ Layout uses a 24 grid layout to define the width of each "box", but does not rigidly adhere to the grid layout.
+ """
+
+ EVENTS = []
+
+ def __init__(
+ self,
+ props: dict | None = None,
+ *,
+ align: Literal["top", "middle", "bottom", "stretch"]
+ | dict[str, Literal["top", "middle", "bottom", "stretch"]] = "top",
+ gutter: int | dict | list[int] = 0,
+ justify: Literal["start", "end", "center", "space-between",
+ 'space-around', 'space-evenly']
+ | dict[str, Literal["start", "end", "center", "space-between",
+ 'space-around', 'space-evenly']] = "start",
+ wrap: bool = True,
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ """
+ Parameters:
+ align: Vertical alignment.
+ gutter: Spacing between grids, could be a number or a object like { xs: 8, sm: 16, md: 24}. Or you can use array to make horizontal and vertical spacing work at the same time [horizontal, vertical].
+ justify: Horizontal arrangement.
+ wrap: Auto wrap line.
+ """
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.align = align
+ self.gutter = gutter
+ self.justify = justify
+ self.wrap = wrap
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("grid", 'row')
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: None) -> None:
+ return payload
+
+ def postprocess(self, value: None) -> None:
+ return value
+
+ def example_payload(self) -> Any:
+ return None
+
+ def example_value(self) -> Any:
+ return None
diff --git a/backend/modelscope_studio/components/antd/icon/__init__.py b/backend/modelscope_studio/components/antd/icon/__init__.py
new file mode 100644
index 00000000..a59b0cf7
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/icon/__init__.py
@@ -0,0 +1,83 @@
+from __future__ import annotations
+
+from gradio.events import EventListener
+
+from ....utils.dev import ModelScopeComponent, resolve_frontend_dir
+from .iconfont_provider import AntdIconIconfontProvider
+
+
+class AntdIcon(ModelScopeComponent):
+ """
+ Ant Design: https://ant.design/components/icon
+
+ Semantic vector graphics.
+ """
+
+ IconfontProvider = AntdIconIconfontProvider
+
+ EVENTS = [
+ EventListener("click",
+ callback=lambda block: block._internal.update(
+ bind_click_event=True))
+ ]
+
+ # supported slots
+ SLOTS = []
+
+ def __init__(
+ self,
+ value: str | None = "GithubOutlined",
+ props: dict | None = None,
+ *,
+ spin: bool = False,
+ rotate: int | float | None = None,
+ two_tone_color: str | None = None,
+ component: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ """
+ Parameters:
+ rotate: Rotate by n degrees (not working in IE9).
+ spin: Rotate icon with animation.
+ two_tone_color: Only supports the two-tone icon. Specify the primary color.
+ component: The component used for the root node.
+ """
+ super().__init__(value=value,
+ visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.spin = spin
+ self.rotate = rotate
+ self.component = component
+ self.two_tone_color = two_tone_color
+
+ FRONTEND_DIR = resolve_frontend_dir("icon")
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: str | None) -> str | None:
+ return payload
+
+ def postprocess(self, value: str | None) -> str | None:
+
+ return str(value)
+
+ def example_payload(self) -> str:
+ return "GithubOutlined"
+
+ def example_value(self) -> str:
+ return "GithubOutlined"
diff --git a/backend/modelscope_studio/components/antd/icon/iconfont_provider/__init__.py b/backend/modelscope_studio/components/antd/icon/iconfont_provider/__init__.py
new file mode 100644
index 00000000..d6445020
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/icon/iconfont_provider/__init__.py
@@ -0,0 +1,61 @@
+from __future__ import annotations
+
+from .....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+
+
+class AntdIconIconfontProvider(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/icon
+
+ Semantic vector graphics.
+
+ A component to help developer use their own icons deployed at https://iconfont.cn in a convenient way.
+ """
+ EVENTS = []
+
+ # supported slots
+ SLOTS = []
+
+ def __init__(
+ self,
+ script_url: str | list[str] | None = None,
+ props: dict | None = None,
+ *,
+ extra_common_props: dict | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ render: bool = True,
+ **kwargs):
+ """
+ Parameters:
+ script_url: The URL generated by https://iconfont.cn project.
+ extra_common_props: Define extra properties to the component.
+ """
+ super().__init__(visible=visible,
+ render=render,
+ as_item=as_item,
+ **kwargs)
+ self.script_url = script_url
+ self.extra_common_props = extra_common_props
+ self.props = props
+
+ FRONTEND_DIR = resolve_frontend_dir("icon", "iconfont-provider")
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: None) -> None:
+ return payload
+
+ def postprocess(self, value: None) -> None:
+
+ return value
+
+ def example_payload(self) -> None:
+ return "GithubOutlined"
+
+ def example_value(self) -> None:
+ return "GithubOutlined"
diff --git a/backend/modelscope_studio/components/antd/image/__init__.py b/backend/modelscope_studio/components/antd/image/__init__.py
new file mode 100644
index 00000000..81f84466
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/image/__init__.py
@@ -0,0 +1,115 @@
+from __future__ import annotations
+
+from pathlib import Path
+from typing import Any, Union
+
+from gradio import processing_utils
+from gradio.data_classes import FileData, GradioRootModel
+from gradio.events import EventListener
+
+from ....utils.dev import ModelScopeDataLayoutComponent, resolve_frontend_dir
+from .preview_group import AntdImagePreviewGroup
+
+
+class AntdImageData(GradioRootModel):
+ root: Union[FileData, str]
+
+
+class AntdImage(ModelScopeDataLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/image
+ """
+ PreviewGroup = AntdImagePreviewGroup
+
+ EVENTS = [
+ EventListener("error",
+ callback=lambda block: block._internal.update(
+ bind_error_event=True)),
+ EventListener("preview_transform",
+ callback=lambda block: block._internal.update(
+ bind_preview_transform_event=True)),
+ EventListener("preview_visible_change",
+ callback=lambda block: block._internal.update(
+ bind_preview_visibleChange_event=True))
+ ]
+
+ # supported slots
+ SLOTS = [
+ 'placeholder',
+ 'preview.mask',
+ 'preview.closeIcon',
+ 'preview.toolbarRender',
+ 'preview.imageRender',
+ ]
+
+ def __init__(
+ self,
+ value: str | None = None,
+ props: dict | None = None,
+ *,
+ alt: str | None = None,
+ fallback: str | None = None,
+ height: str | int | float | None = None,
+ placeholder: bool | str | int | float | None = None,
+ preview: bool | dict | None = True,
+ width: str | int | float | None = None,
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(value=value,
+ visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.alt = alt
+ self.fallback = fallback
+ self.height = height
+ self.placeholder = placeholder
+ self.preview = preview
+ self.width = width
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("image")
+
+ data_model = AntdImageData
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(
+ self,
+ payload: str | AntdImageData | None) -> str | AntdImageData | None:
+ if isinstance(payload, AntdImageData):
+ value = payload.root
+ if isinstance(value, FileData):
+ return value.path
+ return value
+ return payload
+
+ def postprocess(self, value: str | None) -> str | None:
+ if value is None:
+ return None
+ if value.startswith("http") or value.startswith("data"):
+ return AntdImageData(root=value)
+ file = processing_utils.move_resource_to_block_cache(value, self)
+ return AntdImageData(root=FileData(path=file,
+ orig_name=Path(file).name,
+ size=Path(file).stat().st_size))
+
+ def example_payload(self) -> Any:
+ return None
+
+ def example_value(self) -> Any:
+ return None
diff --git a/backend/modelscope_studio/components/antd/image/preview_group/__init__.py b/backend/modelscope_studio/components/antd/image/preview_group/__init__.py
new file mode 100644
index 00000000..be1d218e
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/image/preview_group/__init__.py
@@ -0,0 +1,71 @@
+from __future__ import annotations
+
+from gradio.events import EventListener
+
+from .....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+
+
+class AntdImagePreviewGroup(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/image
+ """
+ EVENTS = [
+ EventListener("preview_transform",
+ callback=lambda block: block._internal.update(
+ bind_preview_transform_event=True)),
+ EventListener("preview_change",
+ callback=lambda block: block._internal.update(
+ bind_preview_change_event=True)),
+ EventListener("preview_visible_change",
+ callback=lambda block: block._internal.update(
+ bind_preview_visibleChange_event=True))
+ ]
+ # supported slots
+ SLOTS = ['preview.mask', 'preview.closeIcon']
+
+ def __init__(
+ self,
+ items: list[dict | str] | None = None,
+ props: dict | None = None,
+ *,
+ preview: bool | dict | None = True,
+ fallback: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.items = items
+ self.preview = preview
+ self.fallback = fallback
+
+ FRONTEND_DIR = resolve_frontend_dir("image", 'preview-group')
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: None) -> None:
+ return payload
+
+ def postprocess(self, value: None) -> None:
+
+ return value
+
+ def example_payload(self) -> None:
+ return None
+
+ def example_value(self) -> None:
+ return None
diff --git a/backend/modelscope_studio/components/antd/input/__init__.py b/backend/modelscope_studio/components/antd/input/__init__.py
new file mode 100644
index 00000000..6c1ce97a
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/input/__init__.py
@@ -0,0 +1,123 @@
+from __future__ import annotations
+
+from typing import Any
+
+from gradio.events import EventListener
+from typing_extensions import Literal
+
+from ....utils.dev import ModelScopeDataLayoutComponent, resolve_frontend_dir
+from .otp import AntdInputOTP
+from .password import AntdInputPassword
+from .search import AntdInputSearch
+from .textarea import AntdInputTextarea
+
+
+# as inputs, outputs
+class AntdInput(ModelScopeDataLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/input
+ """
+ Textarea = AntdInputTextarea
+ Password = AntdInputPassword
+ OTP = AntdInputOTP
+ Search = AntdInputSearch
+
+ EVENTS = [
+ EventListener("change",
+ callback=lambda block: block._internal.update(
+ bind_change_event=True)),
+ EventListener("press_enter",
+ callback=lambda block: block._internal.update(
+ bind_pressEnter_event=True)),
+ EventListener("clear",
+ callback=lambda block: block._internal.update(
+ bind_clear_event=True)),
+ ]
+
+ # supported slots
+ SLOTS = [
+ 'addonAfter', 'addonBefore', 'allowClear.clearIcon', 'prefix',
+ 'suffix', 'showCount.formatter'
+ ]
+
+ def __init__(
+ self,
+ value: str | None = None,
+ props: dict | None = None,
+ *,
+ addon_after: str | None = None,
+ addon_before: str | None = None,
+ allow_clear: bool | dict | None = None,
+ class_names: dict | None = None,
+ count: dict | None = None,
+ default_value: str | None = None,
+ disabled: bool = False,
+ max_length: int | None = None,
+ prefix: str | None = None,
+ show_count: bool | dict = False,
+ size: Literal['large', 'middle', 'small'] | None = None,
+ status: Literal['error', 'warning'] | None = None,
+ styles: dict | None = None,
+ suffix: str | None = None,
+ type: str | None = 'text',
+ placeholder: str | None = None,
+ variant: Literal['outlined', 'borderless', 'filled'] = 'outlined',
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(value=value,
+ visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.addon_after = addon_after
+ self.addon_before = addon_before
+ self.allow_clear = allow_clear
+ self.class_names = class_names
+ self.count = count
+ self.default_value = default_value
+ self.disabled = disabled
+ self.max_length = max_length
+ self.prefix = prefix
+ self.show_count = show_count
+ self.size = size
+ self.status = status
+ self.styles = styles
+ self.suffix = suffix
+ self.type = type
+ self.placeholder = placeholder
+ self.variant = variant
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("input")
+
+ @property
+ def skip_api(self):
+ return False
+
+ def api_info(self) -> dict[str, Any]:
+ return {"type": "string"}
+
+ def preprocess(self, payload: None | str) -> None | str:
+ return payload
+
+ def postprocess(self, value: None | str) -> None | str:
+
+ return value
+
+ def example_payload(self) -> None:
+ return None
+
+ def example_value(self) -> None:
+ return None
diff --git a/backend/modelscope_studio/components/antd/input/otp/__init__.py b/backend/modelscope_studio/components/antd/input/otp/__init__.py
new file mode 100644
index 00000000..f5fb8fcc
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/input/otp/__init__.py
@@ -0,0 +1,88 @@
+from __future__ import annotations
+
+from typing import Any, Literal
+
+from gradio.events import EventListener
+
+from .....utils.dev import ModelScopeDataLayoutComponent, resolve_frontend_dir
+
+
+# as inputs, outputs
+class AntdInputOTP(ModelScopeDataLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/input
+ """
+ EVENTS = [
+ EventListener("change",
+ callback=lambda block: block._internal.update(
+ bind_change_event=True)),
+ ]
+
+ # supported slots
+ SLOTS = []
+
+ def __init__(
+ self,
+ value: str | None = None,
+ props: dict | None = None,
+ *,
+ default_value: str | None = None,
+ disabled: bool = False,
+ formatter: str | None = None,
+ mask: str | bool | None = None,
+ length: int = 6,
+ placeholder: str = '口',
+ size: Literal['large', 'middle', 'small'] | None = None,
+ status: Literal['error', 'warning'] | None = None,
+ variant: Literal['outline', 'borderless', 'filled'] | None = None,
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(value=value,
+ visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.default_value = default_value
+ self.disabled = disabled
+ self.formatter = formatter
+ self.mask = mask
+ self.length = length
+ self.placeholder = placeholder
+ self.size = size
+ self.status = status
+ self.variant = variant
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("input", "otp")
+
+ @property
+ def skip_api(self):
+ return False
+
+ def api_info(self) -> dict[str, Any]:
+ return {"type": "string"}
+
+ def preprocess(self, payload: None | str) -> None | str:
+ return payload
+
+ def postprocess(self, value: None | str) -> None | str:
+
+ return value
+
+ def example_payload(self) -> None:
+ return None
+
+ def example_value(self) -> None:
+ return None
diff --git a/backend/modelscope_studio/components/antd/input/password/__init__.py b/backend/modelscope_studio/components/antd/input/password/__init__.py
new file mode 100644
index 00000000..c11ab936
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/input/password/__init__.py
@@ -0,0 +1,120 @@
+from __future__ import annotations
+
+from typing import Any, Literal
+
+from gradio.events import EventListener
+
+from .....utils.dev import ModelScopeDataLayoutComponent, resolve_frontend_dir
+
+
+# as inputs, outputs
+class AntdInputPassword(ModelScopeDataLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/input
+ """
+ EVENTS = [
+ EventListener("change",
+ callback=lambda block: block._internal.update(
+ bind_change_event=True)),
+ EventListener("press_enter",
+ callback=lambda block: block._internal.update(
+ bind_pressEnter_event=True)),
+ EventListener("clear",
+ callback=lambda block: block._internal.update(
+ bind_clear_event=True)),
+ EventListener("visibility_toggle_visible_change",
+ callback=lambda block: block._internal.update(
+ bind_visibilityToggle_visibleChange__event=True)),
+ ]
+
+ # supported slots
+ SLOTS = [
+ 'addonAfter', 'addonBefore', 'allowClear.clearIcon', 'prefix',
+ 'suffix', 'showCount.formatter'
+ ]
+
+ def __init__(
+ self,
+ value: str | None = None,
+ props: dict | None = None,
+ *,
+ icon_render: str | None = None,
+ visiable_toggle: bool | dict | None = True,
+ addon_after: str | None = None,
+ addon_before: str | None = None,
+ allow_clear: bool | dict | None = None,
+ class_names: dict | None = None,
+ count: dict | None = None,
+ default_value: str | None = None,
+ disabled: bool = False,
+ max_length: int | None = None,
+ prefix: str | None = None,
+ show_count: bool | dict = False,
+ size: Literal['large', 'middle', 'small'] | None = None,
+ status: Literal['error', 'warning'] | None = None,
+ styles: dict | None = None,
+ suffix: str | None = None,
+ type: str | None = 'text',
+ placeholder: str | None = None,
+ variant: Literal['outlined', 'borderless', 'filled'] = 'outlined',
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(value=value,
+ visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.icon_render = icon_render
+ self.visiable_toggle = visiable_toggle
+ self.addon_after = addon_after
+ self.addon_before = addon_before
+ self.allow_clear = allow_clear
+ self.class_names = class_names
+ self.count = count
+ self.default_value = default_value
+ self.disabled = disabled
+ self.max_length = max_length
+ self.prefix = prefix
+ self.show_count = show_count
+ self.size = size
+ self.status = status
+ self.styles = styles
+ self.suffix = suffix
+ self.type = type
+ self.placeholder = placeholder
+ self.variant = variant
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("input", "password")
+
+ @property
+ def skip_api(self):
+ return False
+
+ def api_info(self) -> dict[str, Any]:
+ return {"type": "string"}
+
+ def preprocess(self, payload: None | str) -> None | str:
+ return payload
+
+ def postprocess(self, value: None | str) -> None | str:
+
+ return value
+
+ def example_payload(self) -> None:
+ return None
+
+ def example_value(self) -> None:
+ return None
diff --git a/backend/modelscope_studio/components/antd/input/search/__init__.py b/backend/modelscope_studio/components/antd/input/search/__init__.py
new file mode 100644
index 00000000..0bf6d701
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/input/search/__init__.py
@@ -0,0 +1,120 @@
+from __future__ import annotations
+
+from typing import Any, Literal
+
+from gradio.events import EventListener
+
+from .....utils.dev import ModelScopeDataLayoutComponent, resolve_frontend_dir
+
+
+# as inputs, outputs
+class AntdInputSearch(ModelScopeDataLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/input
+ """
+ EVENTS = [
+ EventListener("change",
+ callback=lambda block: block._internal.update(
+ bind_change_event=True)),
+ EventListener("press_enter",
+ callback=lambda block: block._internal.update(
+ bind_pressEnter_event=True)),
+ EventListener("clear",
+ callback=lambda block: block._internal.update(
+ bind_clear_event=True)),
+ EventListener("search",
+ callback=lambda block: block._internal.update(
+ bind_search_event=True)),
+ ]
+
+ # supported slots
+ SLOTS = [
+ 'addonAfter', 'addonBefore', 'allowClear.clearIcon', 'prefix',
+ 'suffix', 'enterButton', 'showCount.formatter'
+ ]
+
+ def __init__(
+ self,
+ value: str | None = None,
+ props: dict | None = None,
+ *,
+ enter_button: str | bool | None = None,
+ loading: bool = False,
+ addon_after: str | None = None,
+ addon_before: str | None = None,
+ allow_clear: bool | dict | None = None,
+ class_names: dict | None = None,
+ count: dict | None = None,
+ default_value: str | None = None,
+ disabled: bool = False,
+ max_length: int | None = None,
+ prefix: str | None = None,
+ show_count: bool | dict = False,
+ size: Literal['large', 'middle', 'small'] | None = None,
+ status: Literal['error', 'warning'] | None = None,
+ styles: dict | None = None,
+ suffix: str | None = None,
+ type: str | None = 'text',
+ placeholder: str | None = None,
+ variant: Literal['outlined', 'borderless', 'filled'] = 'outlined',
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(value=value,
+ visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.enter_button = enter_button
+ self.loading = loading
+ self.addon_after = addon_after
+ self.addon_before = addon_before
+ self.allow_clear = allow_clear
+ self.class_names = class_names
+ self.count = count
+ self.default_value = default_value
+ self.disabled = disabled
+ self.max_length = max_length
+ self.prefix = prefix
+ self.show_count = show_count
+ self.size = size
+ self.status = status
+ self.styles = styles
+ self.suffix = suffix
+ self.type = type
+ self.placeholder = placeholder
+ self.variant = variant
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("input", "search")
+
+ @property
+ def skip_api(self):
+ return False
+
+ def api_info(self) -> dict[str, Any]:
+ return {"type": "string"}
+
+ def preprocess(self, payload: None | str) -> None | str:
+ return payload
+
+ def postprocess(self, value: None | str) -> None | str:
+
+ return value
+
+ def example_payload(self) -> None:
+ return None
+
+ def example_value(self) -> None:
+ return None
diff --git a/backend/modelscope_studio/components/antd/input/textarea/__init__.py b/backend/modelscope_studio/components/antd/input/textarea/__init__.py
new file mode 100644
index 00000000..7c2007df
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/input/textarea/__init__.py
@@ -0,0 +1,104 @@
+from __future__ import annotations
+
+from typing import Any, Literal
+
+from gradio.events import EventListener
+
+from .....utils.dev import ModelScopeDataLayoutComponent, resolve_frontend_dir
+
+
+# as inputs, outputs
+class AntdInputTextarea(ModelScopeDataLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/input
+ """
+ EVENTS = [
+ EventListener("change",
+ callback=lambda block: block._internal.update(
+ bind_change_event=True)),
+ EventListener("press_enter",
+ callback=lambda block: block._internal.update(
+ bind_pressEnter_event=True)),
+ EventListener("clear",
+ callback=lambda block: block._internal.update(
+ bind_clear_event=True)),
+ ]
+
+ # supported slots
+ SLOTS = ['allowClear.clearIcon', 'showCount.formatter']
+
+ def __init__(
+ self,
+ value: str | None = None,
+ props: dict | None = None,
+ *,
+ auto_size: bool | dict | None = None,
+ allow_clear: bool | dict | None = None,
+ class_names: dict | None = None,
+ count: dict | None = None,
+ default_value: str | None = None,
+ disabled: bool = False,
+ max_length: int | None = None,
+ show_count: bool | dict = False,
+ size: Literal['large', 'middle', 'small'] | None = None,
+ status: Literal['error', 'warning'] | None = None,
+ styles: dict | None = None,
+ type: str | None = 'text',
+ placeholder: str | None = None,
+ variant: Literal['outlined', 'borderless', 'filled'] = 'outlined',
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(value=value,
+ visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.auto_size = auto_size
+ self.allow_clear = allow_clear
+ self.class_names = class_names
+ self.count = count
+ self.default_value = default_value
+ self.disabled = disabled
+ self.max_length = max_length
+ self.show_count = show_count
+ self.size = size
+ self.status = status
+ self.styles = styles
+ self.type = type
+ self.placeholder = placeholder
+ self.variant = variant
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("input", "textarea")
+
+ @property
+ def skip_api(self):
+ return False
+
+ def api_info(self) -> dict[str, Any]:
+ return {"type": "string"}
+
+ def preprocess(self, payload: None | str) -> None | str:
+ return payload
+
+ def postprocess(self, value: None | str) -> None | str:
+
+ return value
+
+ def example_payload(self) -> None:
+ return None
+
+ def example_value(self) -> None:
+ return None
diff --git a/backend/modelscope_studio/components/antd/input_number/__init__.py b/backend/modelscope_studio/components/antd/input_number/__init__.py
new file mode 100644
index 00000000..02ba0f23
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/input_number/__init__.py
@@ -0,0 +1,139 @@
+from __future__ import annotations
+
+from typing import Any, Literal
+
+from gradio.events import EventListener
+
+from ....utils.dev import ModelScopeDataLayoutComponent, resolve_frontend_dir
+
+
+# as inputs, outputs
+class AntdInputNumber(ModelScopeDataLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/input-number
+ """
+
+ EVENTS = [
+ EventListener("change",
+ callback=lambda block: block._internal.update(
+ bind_change_event=True)),
+ EventListener("press_enter",
+ callback=lambda block: block._internal.update(
+ bind_pressEnter_event=True)),
+ EventListener("step",
+ callback=lambda block: block._internal.update(
+ bind_step_event=True)),
+ ]
+
+ # supported slots
+ SLOTS = [
+ 'addonAfter',
+ 'addonBefore',
+ 'controls.upIcon',
+ 'controls.downIcon',
+ 'prefix',
+ 'suffix',
+ ]
+
+ def __init__(
+ self,
+ value: int | float | None = None,
+ props: dict | None = None,
+ *,
+ addon_after: str | None = None,
+ addon_before: str | None = None,
+ auto_focus: bool = False,
+ change_on_blur: bool | None = None,
+ change_on_wheel: bool | None = True,
+ controls: bool | dict | None = None,
+ decimal_separator: str | None = None,
+ placeholder: str | None = None,
+ default_value: int | None = None,
+ disabled: bool = False,
+ formatter: str | None = None,
+ keyboard: bool = True,
+ max: int | float | None = None,
+ min: int | float | None = None,
+ parser: str | None = None,
+ precision: int | float | None = None,
+ prefix: str | None = None,
+ read_only: bool = False,
+ size: Literal['large', 'middle', 'small'] | None = None,
+ status: Literal['error', 'warning'] | None = None,
+ step: int | float | None = 1,
+ string_mode: bool = False,
+ suffix: str | None = None,
+ variant: Literal['outlined', 'borderless', 'filled'] = 'outlined',
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(value=value,
+ visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.addon_after = addon_after
+ self.addon_before = addon_before
+ self.auto_focus = auto_focus
+ self.change_on_blur = change_on_blur
+ self.change_on_wheel = change_on_wheel
+ self.controls = controls
+ self.decimal_separator = decimal_separator
+ self.placeholder = placeholder
+ self.default_value = default_value
+ self.disabled = disabled
+ self.formatter = formatter
+ self.keyboard = keyboard
+ self.max = max
+ self.min = min
+ self.parser = parser
+ self.precision = precision
+ self.prefix = prefix
+ self.read_only = read_only
+ self.size = size
+ self.status = status
+ self.step = step
+ self.string_mode = string_mode
+ self.suffix = suffix
+ self.variant = variant
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("input-number")
+
+ @property
+ def skip_api(self):
+ return False
+
+ def api_info(self) -> dict[str, Any]:
+ return {"type": "number"}
+
+ def preprocess(self, payload: None | int | float) -> None | int | float:
+ if isinstance(payload, str):
+ if '.' in payload:
+ return float(payload)
+ return int(payload)
+ return payload
+
+ def postprocess(self, value: None | int | float) -> None | int | float:
+ if isinstance(value, str):
+ if '.' in value:
+ return float(value)
+ return int(value)
+ return value
+
+ def example_payload(self) -> None:
+ return None
+
+ def example_value(self) -> None:
+ return None
diff --git a/backend/modelscope_studio/components/antd/layout/__init__.py b/backend/modelscope_studio/components/antd/layout/__init__.py
new file mode 100644
index 00000000..036d4682
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/layout/__init__.py
@@ -0,0 +1,86 @@
+from __future__ import annotations
+
+from typing import Any
+
+from gradio.events import EventListener
+
+from ....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+from .content import AntdLayoutContent
+from .footer import AntdLayoutFooter
+from .header import AntdLayoutHeader
+from .sider import AntdLayoutSider
+
+
+class AntdLayout(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/layout
+
+ Handling the overall layout of a page.
+
+ Component overview:
+ - Layout: The layout wrapper, in which Header Sider Content Footer or Layout itself can be nested, and can be placed in any parent container.
+ - Header: The top layout with the default style, in which any element can be nested, and must be placed in Layout.
+ - Sider: The sidebar with default style and basic functions, in which any element can be nested, and must be placed in Layout.
+ - Content: The content layout with the default style, in which any element can be nested, and must be placed in Layout.
+ - Footer: The bottom layout with the default style, in which any element can be nested, and must be placed in Layout.
+ """
+
+ Content = AntdLayoutContent
+ Footer = AntdLayoutFooter
+ Header = AntdLayoutHeader
+ Sider = AntdLayoutSider
+
+ EVENTS = [
+ EventListener("click",
+ callback=lambda block: block._internal.update(
+ bind_click_event=True))
+ ]
+
+ def __init__(
+ self,
+ props: dict | None = None,
+ *,
+ has_sider: bool | None = None,
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ """
+ Parameters:
+ has_sider: Whether contain Sider in children, don't have to assign it normally. Useful in ssr avoid style flickering.
+ """
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.has_sider = has_sider
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("layout")
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: None) -> None:
+ return payload
+
+ def postprocess(self, value: None) -> None:
+
+ return value
+
+ def example_payload(self) -> Any:
+ return None
+
+ def example_value(self) -> Any:
+ return None
diff --git a/backend/modelscope_studio/components/antd/layout/content/__init__.py b/backend/modelscope_studio/components/antd/layout/content/__init__.py
new file mode 100644
index 00000000..983f077f
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/layout/content/__init__.py
@@ -0,0 +1,70 @@
+from __future__ import annotations
+
+from typing import Any
+
+from gradio.events import EventListener
+
+from .....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+
+
+class AntdLayoutContent(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/layout
+
+ Handling the overall layout of a page.
+
+ Component overview:
+ - Layout: The layout wrapper, in which Header Sider Content Footer or Layout itself can be nested, and can be placed in any parent container.
+ - Header: The top layout with the default style, in which any element can be nested, and must be placed in Layout.
+ - Sider: The sidebar with default style and basic functions, in which any element can be nested, and must be placed in Layout.
+ - Content: The content layout with the default style, in which any element can be nested, and must be placed in Layout.
+ - Footer: The bottom layout with the default style, in which any element can be nested, and must be placed in Layout.
+ """
+ EVENTS = [
+ EventListener("click",
+ callback=lambda block: block._internal.update(
+ bind_click_event=True))
+ ]
+
+ def __init__(
+ self,
+ props: dict | None = None,
+ *,
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("layout", 'content')
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: None) -> None:
+ return payload
+
+ def postprocess(self, value: None) -> None:
+
+ return value
+
+ def example_payload(self) -> Any:
+ return None
+
+ def example_value(self) -> Any:
+ return None
diff --git a/backend/modelscope_studio/components/antd/layout/footer/__init__.py b/backend/modelscope_studio/components/antd/layout/footer/__init__.py
new file mode 100644
index 00000000..9ce6dcc8
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/layout/footer/__init__.py
@@ -0,0 +1,70 @@
+from __future__ import annotations
+
+from typing import Any
+
+from gradio.events import EventListener
+
+from .....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+
+
+class AntdLayoutFooter(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/layout
+
+ Handling the overall layout of a page.
+
+ Component overview:
+ - Layout: The layout wrapper, in which Header Sider Content Footer or Layout itself can be nested, and can be placed in any parent container.
+ - Header: The top layout with the default style, in which any element can be nested, and must be placed in Layout.
+ - Sider: The sidebar with default style and basic functions, in which any element can be nested, and must be placed in Layout.
+ - Content: The content layout with the default style, in which any element can be nested, and must be placed in Layout.
+ - Footer: The bottom layout with the default style, in which any element can be nested, and must be placed in Layout.
+ """
+ EVENTS = [
+ EventListener("click",
+ callback=lambda block: block._internal.update(
+ bind_click_event=True))
+ ]
+
+ def __init__(
+ self,
+ props: dict | None = None,
+ *,
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("layout", 'footer')
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: None) -> None:
+ return payload
+
+ def postprocess(self, value: None) -> None:
+
+ return value
+
+ def example_payload(self) -> Any:
+ return None
+
+ def example_value(self) -> Any:
+ return None
diff --git a/backend/modelscope_studio/components/antd/layout/header/__init__.py b/backend/modelscope_studio/components/antd/layout/header/__init__.py
new file mode 100644
index 00000000..b8ecf7cc
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/layout/header/__init__.py
@@ -0,0 +1,70 @@
+from __future__ import annotations
+
+from typing import Any
+
+from gradio.events import EventListener
+
+from .....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+
+
+class AntdLayoutHeader(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/layout
+
+ Handling the overall layout of a page.
+
+ Component overview:
+ - Layout: The layout wrapper, in which Header Sider Content Footer or Layout itself can be nested, and can be placed in any parent container.
+ - Header: The top layout with the default style, in which any element can be nested, and must be placed in Layout.
+ - Sider: The sidebar with default style and basic functions, in which any element can be nested, and must be placed in Layout.
+ - Content: The content layout with the default style, in which any element can be nested, and must be placed in Layout.
+ - Footer: The bottom layout with the default style, in which any element can be nested, and must be placed in Layout.
+ """
+ EVENTS = [
+ EventListener("click",
+ callback=lambda block: block._internal.update(
+ bind_click_event=True))
+ ]
+
+ def __init__(
+ self,
+ props: dict | None = None,
+ *,
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("layout", 'header')
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: None) -> None:
+ return payload
+
+ def postprocess(self, value: None) -> None:
+
+ return value
+
+ def example_payload(self) -> Any:
+ return None
+
+ def example_value(self) -> Any:
+ return None
diff --git a/backend/modelscope_studio/components/antd/layout/sider/__init__.py b/backend/modelscope_studio/components/antd/layout/sider/__init__.py
new file mode 100644
index 00000000..0f87ad87
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/layout/sider/__init__.py
@@ -0,0 +1,116 @@
+from __future__ import annotations
+
+from typing import Any, Literal
+
+from gradio.events import EventListener
+
+from .....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+
+
+class AntdLayoutSider(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/layout
+
+ Handling the overall layout of a page.
+
+ Component overview:
+ - Layout: The layout wrapper, in which Header Sider Content Footer or Layout itself can be nested, and can be placed in any parent container.
+ - Header: The top layout with the default style, in which any element can be nested, and must be placed in Layout.
+ - Sider: The sidebar with default style and basic functions, in which any element can be nested, and must be placed in Layout.
+ - Content: The content layout with the default style, in which any element can be nested, and must be placed in Layout.
+ - Footer: The bottom layout with the default style, in which any element can be nested, and must be placed in Layout.
+ """
+ EVENTS = [
+ EventListener("click",
+ callback=lambda block: block._internal.update(
+ bind_click_event=True)),
+ EventListener(
+ "breakpoint",
+ callback=lambda block: block._internal.update(bind_breakpoint_event
+ =True),
+ doc="The callback function, executed when breakpoints changed."),
+ EventListener(
+ "collapse",
+ callback=lambda block: block._internal.update(bind_collapse_event=
+ True),
+ doc=
+ "The callback function, executed by clicking the trigger or activating the responsive layout."
+ ),
+ ]
+
+ SLOTS = ['trigger']
+
+ def __init__(
+ self,
+ props: dict | None = None,
+ *,
+ breakpoint: Literal['xs', 'sm', 'md', 'lg', 'xl', 'xxl']
+ | None = None,
+ collapsed: bool | None = None,
+ collapsed_width: int | float = 80,
+ collapsible: bool = False,
+ default_collapsed: bool = False,
+ reverse_arrow: bool = False,
+ theme: Literal['light', 'dark'] | None = None,
+ trigger: str | None = 'default',
+ width: int | float | str = 200,
+ zero_width_trigger_style: dict | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ """
+ Parameters:
+ breakpoint: Breakpoints of the responsive layout.
+ collapsed: To set the current status.
+ collapsed_width: Width of the collapsed sidebar, by setting to 0 a special trigger will appear.
+ collapsible: Whether can be collapsed.
+ default_collapsed: To set the initial status.
+ reverse_arrow: Reverse direction of arrow, for a sider that expands from the right.
+ theme: Color theme of the sidebar.
+ trigger: Specify the customized trigger, set to null to hide the trigger.
+ width: Width of the sidebar.
+ zero_width_trigger_style: To customize the styles of the special trigger that appears when collapsed_width is 0.
+ """
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.breakpoint = breakpoint
+ self.collapsed = collapsed
+ self.collapsed_width = collapsed_width
+ self.collapsible = collapsible
+ self.default_collapsed = default_collapsed
+ self.reverse_arrow = reverse_arrow
+ self.theme = theme
+ self.trigger = trigger
+ self.width = width
+ self.zero_width_trigger_style = zero_width_trigger_style
+
+ FRONTEND_DIR = resolve_frontend_dir("layout", 'sider')
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: None) -> None:
+ return payload
+
+ def postprocess(self, value: None) -> None:
+
+ return value
+
+ def example_payload(self) -> Any:
+ return None
+
+ def example_value(self) -> Any:
+ return None
diff --git a/backend/modelscope_studio/components/antd/list/__init__.py b/backend/modelscope_studio/components/antd/list/__init__.py
new file mode 100644
index 00000000..c99cf789
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/list/__init__.py
@@ -0,0 +1,96 @@
+from __future__ import annotations
+
+from typing import Any, Literal
+
+from gradio.events import EventListener
+
+from ....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+from .item import AntdListItem
+
+
+class AntdList(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/list
+ """
+ Item = AntdListItem
+ EVENTS = [
+ EventListener("pagination_change",
+ callback=lambda block: block._internal.update(
+ bind_pagination_change_event=True)),
+ EventListener("pagination_show_size_change",
+ callback=lambda block: block._internal.update(
+ bind_pagination_showSizeChange_event=True)),
+ ]
+
+ # supported slots
+ SLOTS = ['footer', 'header', 'loadMore', 'renderItem']
+
+ def __init__(
+ self,
+ props: dict | None = None,
+ *,
+ bordered: bool = False,
+ data_source: list[Any] | None = None,
+ footer: str | None = None,
+ grid: dict | None = None,
+ header: str | None = None,
+ item_layout: str | None = None,
+ loading: bool | dict | None = False,
+ load_more: str | None = None,
+ locale: dict | None = None,
+ pagination: bool | dict | None = False,
+ render_item: str | None = None,
+ row_key: str | None = None,
+ size: Literal['small', 'default', 'large'] | None = None,
+ split: bool = True,
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.bordered = bordered
+ self.data_source = data_source
+ self.footer = footer
+ self.grid = grid
+ self.header = header
+ self.item_layout = item_layout
+ self.loading = loading
+ self.load_more = load_more
+ self.pagination = pagination
+ self.render_item = render_item
+ self.locale = locale
+ self.row_key = row_key
+ self.size = size
+ self.split = split
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("list")
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: None) -> None:
+ return payload
+
+ def postprocess(self, value: None) -> None:
+ return value
+
+ def example_payload(self) -> Any:
+ return None
+
+ def example_value(self) -> Any:
+ return None
diff --git a/backend/modelscope_studio/components/antd/list/item/__init__.py b/backend/modelscope_studio/components/antd/list/item/__init__.py
new file mode 100644
index 00000000..9a0cbbdc
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/list/item/__init__.py
@@ -0,0 +1,68 @@
+from __future__ import annotations
+
+from typing import Any
+
+from .....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+from .meta import AntdListItemMeta
+
+
+class AntdListItem(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/list
+ """
+ Meta = AntdListItemMeta
+ EVENTS = []
+
+ # supported slots
+ SLOTS = [
+ "actions",
+ 'extra',
+ ]
+
+ def __init__(
+ self,
+ props: dict | None = None,
+ *,
+ actions: list[str] | None = None,
+ class_names: dict | None = None,
+ styles: dict | None = None,
+ extra: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.actions = actions
+ self.extra = extra
+ self.class_names = class_names
+ self.styles = styles
+
+ FRONTEND_DIR = resolve_frontend_dir("list", "item")
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: None) -> None:
+ return payload
+
+ def postprocess(self, value: None) -> None:
+ return value
+
+ def example_payload(self) -> Any:
+ return None
+
+ def example_value(self) -> Any:
+ return None
diff --git a/backend/modelscope_studio/components/antd/list/item/meta/__init__.py b/backend/modelscope_studio/components/antd/list/item/meta/__init__.py
new file mode 100644
index 00000000..bd3b1dd7
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/list/item/meta/__init__.py
@@ -0,0 +1,62 @@
+from __future__ import annotations
+
+from typing import Any
+
+from ......utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+
+
+class AntdListItemMeta(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/list
+ """
+
+ EVENTS = []
+
+ # supported slots
+ SLOTS = ['avatar', 'description', 'title']
+
+ def __init__(
+ self,
+ props: dict | None = None,
+ *,
+ avatar: str | None = None,
+ description: str | None = None,
+ title: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.avatar = avatar
+ self.description = description
+ self.title = title
+
+ FRONTEND_DIR = resolve_frontend_dir("list", ["item", "meta"])
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: None) -> None:
+ return payload
+
+ def postprocess(self, value: None) -> None:
+ return value
+
+ def example_payload(self) -> Any:
+ return None
+
+ def example_value(self) -> Any:
+ return None
diff --git a/backend/modelscope_studio/components/antd/mentions/__init__.py b/backend/modelscope_studio/components/antd/mentions/__init__.py
new file mode 100644
index 00000000..b54a083d
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/mentions/__init__.py
@@ -0,0 +1,123 @@
+from __future__ import annotations
+
+from typing import Any, Literal
+
+from gradio.events import EventListener
+
+from ....utils.dev import ModelScopeDataLayoutComponent, resolve_frontend_dir
+from .option import AntdMentionsOption
+
+
+# as inputs, outputs
+class AntdMentions(ModelScopeDataLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/mentions
+ """
+ Option = AntdMentionsOption
+
+ EVENTS = [
+ EventListener("change",
+ callback=lambda block: block._internal.update(
+ bind_change_event=True)),
+ EventListener("blur",
+ callback=lambda block: block._internal.update(
+ bind_blur_event=True)),
+ EventListener("focus",
+ callback=lambda block: block._internal.update(
+ bind_focus_event=True)),
+ EventListener("search",
+ callback=lambda block: block._internal.update(
+ bind_search_event=True)),
+ EventListener("select",
+ callback=lambda block: block._internal.update(
+ bind_select_event=True)),
+ EventListener("clear",
+ callback=lambda block: block._internal.update(
+ bind_clear_event=True)),
+ EventListener("resize",
+ callback=lambda block: block._internal.update(
+ bind_resize_event=True)),
+ ]
+
+ # supported slots
+ SLOTS = ['allowClear.clearIcon', 'notFoundContent', "options"]
+
+ def __init__(
+ self,
+ value: str | None = None,
+ props: dict | None = None,
+ *,
+ allow_clear: bool | dict | None = None,
+ auto_focus: bool = False,
+ auto_size: bool | dict | None = None,
+ default_value: str | None = None,
+ filter_option: bool | str | None = None,
+ disabled: bool | None = None,
+ read_only: bool | None = None,
+ get_popup_container: str | None = None,
+ not_found_content: str | None = None,
+ options: list[dict] | None = None,
+ placement: Literal['top', 'bottom'] | None = None,
+ prefix: str | list[str] | None = '@',
+ split: str | None = None,
+ status: Literal['error', 'warning'] | None = None,
+ validate_search: str | None = None,
+ variant: Literal['outlined', 'borderless', 'filled'] = 'outlined',
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(value=value,
+ visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.allow_clear = allow_clear
+ self.auto_focus = auto_focus
+ self.auto_size = auto_size
+ self.default_value = default_value
+ self.filter_option = filter_option
+ self.disabled = disabled
+ self.read_only = read_only
+ self.get_popup_container = get_popup_container
+ self.not_found_content = not_found_content
+ self.options = options
+ self.placement = placement
+ self.prefix = prefix
+ self.split = split
+ self.status = status
+ self.validate_search = validate_search
+ self.variant = variant
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("mentions")
+
+ @property
+ def skip_api(self):
+ return False
+
+ def api_info(self) -> dict[str, Any]:
+ return {"type": "string"}
+
+ def preprocess(self, payload: None | str) -> None | str:
+ return payload
+
+ def postprocess(self, value: None | str) -> None | str:
+
+ return value
+
+ def example_payload(self) -> None:
+ return None
+
+ def example_value(self) -> None:
+ return None
diff --git a/backend/modelscope_studio/components/antd/mentions/option/__init__.py b/backend/modelscope_studio/components/antd/mentions/option/__init__.py
new file mode 100644
index 00000000..9f03ea25
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/mentions/option/__init__.py
@@ -0,0 +1,66 @@
+from __future__ import annotations
+
+from typing import Any
+
+from .....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+
+
+class AntdMentionsOption(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/mentions
+ """
+
+ EVENTS = []
+
+ # supported slots
+ SLOTS = [
+ 'label',
+ ]
+
+ def __init__(
+ self,
+ value: str | None = None,
+ label: str | None = None,
+ props: dict | None = None,
+ *,
+ disabled: bool | None = None,
+ key: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.value = value
+ self.label = label
+ self.disabled = disabled
+ self.key = key
+
+ FRONTEND_DIR = resolve_frontend_dir("mentions", "option")
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: None) -> None:
+ return payload
+
+ def postprocess(self, value: None) -> None:
+ return value
+
+ def example_payload(self) -> Any:
+ return None
+
+ def example_value(self) -> Any:
+ return None
diff --git a/backend/modelscope_studio/components/antd/menu/__init__.py b/backend/modelscope_studio/components/antd/menu/__init__.py
new file mode 100644
index 00000000..4b942393
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/menu/__init__.py
@@ -0,0 +1,111 @@
+from __future__ import annotations
+
+from typing import Any, Literal
+
+from gradio.events import EventListener
+
+from ....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+from .item import AntdMenuItem
+
+
+class AntdMenu(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/menu
+ """
+ Item = AntdMenuItem
+
+ EVENTS = [
+ EventListener("click",
+ callback=lambda block: block._internal.update(
+ bind_click_event=True)),
+ EventListener("deselect",
+ callback=lambda block: block._internal.update(
+ bind_deselect_event=True)),
+ EventListener("open_change",
+ callback=lambda block: block._internal.update(
+ bind_openChange_event=True)),
+ EventListener("select",
+ callback=lambda block: block._internal.update(
+ bind_select_event=True)),
+ ]
+
+ # supported slots
+ SLOTS = ["expandIcon", 'overflowedIndicator', "items"]
+
+ def __init__(
+ self,
+ props: dict | None = None,
+ *,
+ open_keys: list[str] | None = None,
+ selected_keys: list[str] | None = None,
+ selectable: bool = True,
+ default_open_keys: list[str] | None = None,
+ default_selected_keys: list[str] | None = None,
+ expand_icon: str | None = None,
+ force_sub_menu_render: bool | None = False,
+ inline_collapsed: bool | None = None,
+ inline_indent: int = 24,
+ items: list[dict] | None = None,
+ mode: Literal['vertical', 'horizontal', 'inline']
+ | None = 'vertical',
+ multiple: bool | None = False,
+ overflowed_indicator: str | None = None,
+ sub_menu_close_delay: int | float = 0.1,
+ sub_menu_open_delay: int | float = 0,
+ theme: Literal['light', 'dark'] | None = None,
+ trigger_sub_menu_action: Literal['click', 'hover'] = 'hover',
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.open_keys = open_keys
+ self.selected_keys = selected_keys
+ self.selectable = selectable
+ self.default_open_keys = default_open_keys
+ self.default_selected_keys = default_selected_keys
+ self.expand_icon = expand_icon
+ self.force_sub_menu_render = force_sub_menu_render
+ self.inline_collapsed = inline_collapsed
+ self.inline_indent = inline_indent
+ self.items = items
+ self.mode = mode
+ self.multiple = multiple
+ self.overflowed_indicator = overflowed_indicator
+ self.sub_menu_close_delay = sub_menu_close_delay
+ self.sub_menu_open_delay = sub_menu_open_delay
+ self.theme = theme
+ self.trigger_sub_menu_action = trigger_sub_menu_action
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("menu")
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: None) -> None:
+ return payload
+
+ def postprocess(self, value: None) -> None:
+
+ return value
+
+ def example_payload(self) -> Any:
+ return None
+
+ def example_value(self) -> Any:
+ return None
diff --git a/backend/modelscope_studio/components/antd/menu/item/__init__.py b/backend/modelscope_studio/components/antd/menu/item/__init__.py
new file mode 100644
index 00000000..605f4f3f
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/menu/item/__init__.py
@@ -0,0 +1,83 @@
+from __future__ import annotations
+
+from typing import Any, Literal
+
+from gradio.events import EventListener
+
+from .....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+
+
+class AntdMenuItem(ModelScopeLayoutComponent):
+ """
+ """
+
+ EVENTS = [
+ EventListener("title_click",
+ callback=lambda block: block._internal.update(
+ bind_titleClick_event=True)),
+ ]
+
+ # supported slots
+ SLOTS = ["title", 'icon', "label", "extra"]
+
+ def __init__(
+ self,
+ label: str | None = None,
+ props: dict | None = None,
+ *,
+ title: str | None = None,
+ danger: bool = False,
+ disabled: bool = False,
+ extra: str | None = None,
+ icon: str | None = None,
+ key: str | None = None,
+ theme: Literal['dark', 'light'] = None,
+ type: Literal['group'] | None = None,
+ popup_class_name: str | None = None,
+ popup_offset: tuple[int | float, int | float] | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.label = label
+ self.props = props
+ self.title = title
+ self.danger = danger
+ self.disabled = disabled
+ self.extra = extra
+ self.icon = icon
+ self.key = key
+ self.theme = theme
+ self.type = type
+ self.popup_class_name = popup_class_name
+ self.popup_offset = popup_offset
+
+ FRONTEND_DIR = resolve_frontend_dir("menu", "item")
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: None) -> None:
+ return payload
+
+ def postprocess(self, value: None) -> None:
+ return value
+
+ def example_payload(self) -> Any:
+ return None
+
+ def example_value(self) -> Any:
+ return None
diff --git a/backend/modelscope_studio/components/antd/message/__init__.py b/backend/modelscope_studio/components/antd/message/__init__.py
new file mode 100644
index 00000000..822795ab
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/message/__init__.py
@@ -0,0 +1,79 @@
+from __future__ import annotations
+
+from gradio.events import EventListener
+
+from ....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+
+
+class AntdMessage(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/message
+ """
+ EVENTS = [
+ EventListener("click",
+ callback=lambda block: block._internal.update(
+ bind_click_event=True)),
+ EventListener("close",
+ callback=lambda block: block._internal.update(
+ bind_close_event=True))
+ ]
+
+ # supported slots
+ SLOTS = ['icon', 'content']
+
+ def __init__(
+ self,
+ content: str | None = "",
+ props: dict | None = None,
+ *,
+ duration: float | int | None = 3,
+ icon: str | None = None,
+ key: str | int | float | None = None,
+ get_container: str | None = None,
+ rtl: bool | None = None,
+ top: int | float | None = 8,
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = False,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.content = content
+ self.duration = duration
+ self.icon = icon
+ self.key = key
+ self.get_container = get_container
+ self.rtl = rtl
+ self.top = top
+ self.root_class_name = root_class_name
+ self.props = props
+
+ FRONTEND_DIR = resolve_frontend_dir("message")
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: str | None) -> str | None:
+ return payload
+
+ def postprocess(self, value: str | None) -> str | None:
+
+ return str(value)
+
+ def example_payload(self) -> str:
+ return "Message"
+
+ def example_value(self) -> str:
+ return "Message"
diff --git a/backend/modelscope_studio/components/antd/modal/__init__.py b/backend/modelscope_studio/components/antd/modal/__init__.py
new file mode 100644
index 00000000..b223bb41
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/modal/__init__.py
@@ -0,0 +1,127 @@
+from __future__ import annotations
+
+from typing import Any
+
+from gradio.events import EventListener
+
+from ....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+
+
+class AntdModal(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/modal
+ """
+ EVENTS = [
+ EventListener(
+ "ok",
+ callback=lambda block: block._internal.update(bind_ok_event=True)),
+ EventListener("cancel",
+ callback=lambda block: block._internal.update(
+ bind_cancel_event=True))
+ ]
+
+ # supported slots
+ SLOTS = [
+ 'closeIcon', 'cancelButtonProps.icon', 'cancelText',
+ 'closable.closeIcon', 'closeIcon', 'footer', 'title',
+ 'okButtonProps.icon', 'okText', 'modalRender'
+ ]
+
+ def __init__(
+ self,
+ props: dict | None = None,
+ *,
+ after_close: str | None = None,
+ class_names: dict | None = None,
+ styles: dict | None = None,
+ cancel_button_props: dict | None = None,
+ cancel_text: str | None = None,
+ centered: bool | None = None,
+ closable: bool | dict | None = None,
+ close_icon: str | None = None,
+ confirm_loading: bool | None = None,
+ destroy_on_close: bool | None = None,
+ focus_trigger_after_close: bool | None = None,
+ footer: str | None = None,
+ force_render: bool | None = None,
+ get_container: str | None = None,
+ keyboard: bool | None = None,
+ mask: bool | None = None,
+ mask_closable: bool | None = None,
+ modal_render: str | None = None,
+ ok_text: str | None = None,
+ ok_type: str | None = None,
+ ok_button_props: dict | None = None,
+ loading: bool | None = None,
+ title: str | None = None,
+ open: bool | None = None,
+ width: int | float | str | None = None,
+ wrap_class_name: str | None = None,
+ z_index: int | None = None,
+ after_open_change: str | None = None,
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.after_close = after_close
+ self.class_names = class_names
+ self.styles = styles
+ self.cancel_button_props = cancel_button_props
+ self.cancel_text = cancel_text
+ self.centered = centered
+ self.closable = closable
+ self.close_icon = close_icon
+ self.confirm_loading = confirm_loading
+ self.destroy_on_close = destroy_on_close
+ self.focus_trigger_after_close = focus_trigger_after_close
+ self.footer = footer
+ self.force_render = force_render
+ self.get_container = get_container
+ self.keyboard = keyboard
+ self.mask = mask
+ self.mask_closable = mask_closable
+ self.modal_render = modal_render
+ self.ok_text = ok_text
+ self.ok_type = ok_type
+ self.ok_button_props = ok_button_props
+ self.loading = loading
+ self.title = title
+ self.open = open
+ self.width = width
+ self.wrap_class_name = wrap_class_name
+ self.z_index = z_index
+ self.after_open_change = after_open_change
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("modal")
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: None) -> None:
+ return payload
+
+ def postprocess(self, value: None) -> None:
+
+ return value
+
+ def example_payload(self) -> Any:
+ return None
+
+ def example_value(self) -> Any:
+ return None
diff --git a/backend/modelscope_studio/components/antd/notification/__init__.py b/backend/modelscope_studio/components/antd/notification/__init__.py
new file mode 100644
index 00000000..de959386
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/notification/__init__.py
@@ -0,0 +1,100 @@
+from __future__ import annotations
+
+from typing import Any, Literal
+
+from gradio.events import EventListener
+
+from ....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+
+
+class AntdNotification(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/notification
+ """
+ EVENTS = [
+ EventListener("click",
+ callback=lambda block: block._internal.update(
+ bind_click_event=True)),
+ EventListener("close",
+ callback=lambda block: block._internal.update(
+ bind_close_event=True))
+ ]
+
+ # supported slots
+ SLOTS = ['btn', 'closeIcon', "description", "icon", "message"]
+
+ def __init__(
+ self,
+ message: str | None = "",
+ description: str | None = "",
+ props: dict | None = None,
+ *,
+ btn: str | None = None,
+ close_icon: str | bool | None = None,
+ duration: int | float | None = 4.5,
+ show_progress: bool | None = None,
+ pause_on_hover: bool | None = None,
+ icon: str | None = None,
+ key: str | None = None,
+ placement: Literal["top", "topLeft", "topRight", "bottom",
+ "bottomLeft", "bottomRight"] | None = None,
+ role: Literal["alert", "status"] | None = None,
+ bottom: int | float | None = 24,
+ rtl: bool | None = None,
+ get_container: str | None = None,
+ stack: bool | dict | None = None,
+ top: int | float | None = 24,
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = False,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.message = message
+ self.description = description
+ self.btn = btn
+ self.close_icon = close_icon
+ self.duration = duration
+ self.show_progress = show_progress
+ self.pause_on_hover = pause_on_hover
+ self.icon = icon
+ self.key = key
+ self.placement = placement
+ self.role = role
+ self.bottom = bottom
+ self.rtl = rtl
+ self.get_container = get_container
+ self.stack = stack
+ self.top = top
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("notification")
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: None) -> None:
+ return payload
+
+ def postprocess(self, value: None) -> None:
+
+ return value
+
+ def example_payload(self) -> Any:
+ return None
+
+ def example_value(self) -> Any:
+ return None
diff --git a/backend/modelscope_studio/components/antd/pagination/__init__.py b/backend/modelscope_studio/components/antd/pagination/__init__.py
new file mode 100644
index 00000000..6a6a85a9
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/pagination/__init__.py
@@ -0,0 +1,102 @@
+from __future__ import annotations
+
+from typing import Literal
+
+from gradio.events import EventListener
+
+from ....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+
+
+class AntdPagination(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/pagination
+ """
+ EVENTS = [
+ EventListener("change",
+ callback=lambda block: block._internal.update(
+ bind_change_event=True)),
+ EventListener("show_size_change",
+ callback=lambda block: block._internal.update(
+ bind_showSizeChange_event=True)),
+ ]
+
+ # supported slots
+ SLOTS = ['showQuickJumper.goButton', 'itemRender']
+
+ def __init__(
+ self,
+ props: dict | None = None,
+ *,
+ align: Literal['start', 'center', 'end'] | None = None,
+ current: int | None = None,
+ default_current: int | None = 1,
+ default_page_size: int | None = 10,
+ page_size: int | None = None,
+ disabled: bool | None = None,
+ hide_on_single_page: bool = False,
+ item_render: str | None = None,
+ page_size_options: list[str] | list[int] = [10, 20, 50, 100],
+ responsive: bool | None = None,
+ show_less_items: bool | None = None,
+ show_quick_jumper: bool | dict | None = None,
+ show_size_changer: bool | dict | None = None,
+ show_title: bool = True,
+ show_total: str | None = None,
+ simple: bool | dict | None = None,
+ size: Literal['small', 'default'] | None = None,
+ total: int = 0,
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.align = align
+ self.current = current
+ self.page_size = page_size
+ self.total = total
+ self.default_current = default_current
+ self.default_page_size = default_page_size
+ self.disabled = disabled
+ self.hide_on_single_page = hide_on_single_page
+ self.item_render = item_render
+ self.page_size_options = page_size_options
+ self.responsive = responsive
+ self.show_less_items = show_less_items
+ self.show_quick_jumper = show_quick_jumper
+ self.show_size_changer = show_size_changer
+ self.show_title = show_title
+ self.show_total = show_total
+ self.simple = simple
+ self.size = size
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("pagination")
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: None) -> None:
+ return payload
+
+ def postprocess(self, value: None) -> None:
+ return value
+
+ def example_payload(self) -> None:
+ return None
+
+ def example_value(self) -> None:
+ return None
diff --git a/backend/modelscope_studio/components/antd/popconfirm/__init__.py b/backend/modelscope_studio/components/antd/popconfirm/__init__.py
new file mode 100644
index 00000000..87c0afd0
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/popconfirm/__init__.py
@@ -0,0 +1,148 @@
+from __future__ import annotations
+
+from typing import Literal
+
+from gradio.events import EventListener
+
+from ....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+
+
+class AntdPopconfirm(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/popconfirm
+ """
+ EVENTS = [
+ EventListener("open_change",
+ callback=lambda block: block._internal.update(
+ bind_openChange_event=True)),
+ EventListener("cancel",
+ callback=lambda block: block._internal.update(
+ bind_cancel_event=True)),
+ EventListener("confirm",
+ callback=lambda block: block._internal.update(
+ bind_confirm_event=True)),
+ EventListener("popup_click",
+ callback=lambda block: block._internal.update(
+ bind_popupClick_event=True))
+ ]
+
+ # supported slots
+ SLOTS = [
+ 'title',
+ 'description',
+ 'cancelButtonProps.icon',
+ 'cancelText',
+ 'okButtonProps.icon',
+ 'okText',
+ ]
+
+ def __init__(
+ self,
+ title: str | None = "",
+ description: str | None = None,
+ props: dict | None = None,
+ *,
+ cancel_button_props: dict | None = None,
+ cancel_text: str | None = None,
+ disabled: bool | None = None,
+ icon: str | None = None,
+ ok_button_props: dict | None = None,
+ ok_text: str | None = None,
+ ok_type: str | None = None,
+ show_cancel: bool | None = None,
+ align: dict | None = None,
+ arrow: bool | dict | None = True,
+ auto_adjust_overflow: bool = True,
+ color: str | None = None,
+ default_open: bool = False,
+ destroy_tooltip_on_hide: bool = False,
+ fresh: bool = False,
+ get_popup_container: str | None = None,
+ mouse_enter_delay: float | int = 0.1,
+ mouse_leave_delay: float | int = 0.1,
+ overlay_class_name: str | None = None,
+ overlay_style: dict | None = None,
+ overlay_inner_style: dict | None = None,
+ placement: Literal[
+ 'top',
+ 'left',
+ 'right',
+ 'bottom',
+ 'topLeft',
+ 'topRight',
+ 'bottomLeft',
+ 'bottomRight',
+ 'leftTop',
+ 'leftBottom',
+ 'rightTop',
+ 'rightBottom',
+ ] = 'top',
+ trigger: Literal['hover', 'focus', 'click', 'contextMenu']
+ | list[Literal['hover', 'focus', 'click', 'contextMenu']] = 'hover',
+ open: bool | None = None,
+ z_index: int | None = None,
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.title = title
+ self.description = description
+ self.cancel_button_props = cancel_button_props
+ self.cancel_text = cancel_text
+ self.disabled = disabled
+ self.icon = icon
+ self.ok_button_props = ok_button_props
+ self.ok_text = ok_text
+ self.ok_type = ok_type
+ self.show_cancel = show_cancel
+ self.align = align
+ self.arrow = arrow
+ self.auto_adjust_overflow = auto_adjust_overflow
+ self.color = color
+ self.default_open = default_open
+ self.destroy_tooltip_on_hide = destroy_tooltip_on_hide
+ self.fresh = fresh
+ self.get_popup_container = get_popup_container
+ self.mouse_enter_delay = mouse_enter_delay
+ self.mouse_leave_delay = mouse_leave_delay
+ self.overlay_class_name = overlay_class_name
+ self.overlay_style = overlay_style
+ self.overlay_inner_style = overlay_inner_style
+ self.placement = placement
+ self.trigger = trigger
+ self.open = open
+ self.z_index = z_index
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("popconfirm")
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: str | None) -> str | None:
+ return payload
+
+ def postprocess(self, value: str | None) -> str | None:
+
+ return str(value)
+
+ def example_payload(self) -> str:
+ return "Popconfirm"
+
+ def example_value(self) -> str:
+ return "Popconfirm"
diff --git a/backend/modelscope_studio/components/antd/popover/__init__.py b/backend/modelscope_studio/components/antd/popover/__init__.py
new file mode 100644
index 00000000..4b54023b
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/popover/__init__.py
@@ -0,0 +1,116 @@
+from __future__ import annotations
+
+from typing import Literal
+
+from gradio.events import EventListener
+
+from ....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+
+
+class AntdPopover(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/popover
+ """
+ EVENTS = [
+ EventListener("open_change",
+ callback=lambda block: block._internal.update(
+ bind_openChange_event=True)),
+ ]
+
+ # supported slots
+ SLOTS = ['title', "content"]
+
+ def __init__(
+ self,
+ content: str | None = "",
+ title: str | None = "",
+ props: dict | None = None,
+ *,
+ align: dict | None = None,
+ arrow: bool | dict | None = True,
+ auto_adjust_overflow: bool = True,
+ color: str | None = None,
+ default_open: bool = False,
+ destroy_tooltip_on_hide: bool = False,
+ fresh: bool = False,
+ get_popup_container: str | None = None,
+ mouse_enter_delay: float | int = 0.1,
+ mouse_leave_delay: float | int = 0.1,
+ overlay_class_name: str | None = None,
+ overlay_style: dict | None = None,
+ overlay_inner_style: dict | None = None,
+ placement: Literal[
+ 'top',
+ 'left',
+ 'right',
+ 'bottom',
+ 'topLeft',
+ 'topRight',
+ 'bottomLeft',
+ 'bottomRight',
+ 'leftTop',
+ 'leftBottom',
+ 'rightTop',
+ 'rightBottom',
+ ] = 'top',
+ trigger: Literal['hover', 'focus', 'click', 'contextMenu']
+ | list[Literal['hover', 'focus', 'click', 'contextMenu']] = 'hover',
+ open: bool | None = None,
+ z_index: int | None = None,
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.title = title
+ self.content = content
+ self.props = props
+ self.align = align
+ self.arrow = arrow
+ self.auto_adjust_overflow = auto_adjust_overflow
+ self.color = color
+ self.default_open = default_open
+ self.destroy_tooltip_on_hide = destroy_tooltip_on_hide
+ self.fresh = fresh
+ self.get_popup_container = get_popup_container
+ self.mouse_enter_delay = mouse_enter_delay
+ self.mouse_leave_delay = mouse_leave_delay
+ self.overlay_class_name = overlay_class_name
+ self.overlay_style = overlay_style
+ self.overlay_inner_style = overlay_inner_style
+ self.placement = placement
+ self.trigger = trigger
+ self.open = open
+ self.z_index = z_index
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("popover")
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: str | None) -> str | None:
+ return payload
+
+ def postprocess(self, value: str | None) -> str | None:
+
+ return str(value)
+
+ def example_payload(self) -> str:
+ return "Popover"
+
+ def example_value(self) -> str:
+ return "Popover"
diff --git a/backend/modelscope_studio/components/antd/progress/__init__.py b/backend/modelscope_studio/components/antd/progress/__init__.py
new file mode 100644
index 00000000..4536fd09
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/progress/__init__.py
@@ -0,0 +1,90 @@
+from __future__ import annotations
+
+from typing import Any, Literal
+
+from ....utils.dev import ModelScopeComponent, resolve_frontend_dir
+
+
+class AntdProgress(ModelScopeComponent):
+ """
+ Ant Design: https://ant.design/components/progress
+ """
+
+ EVENTS = []
+
+ def __init__(
+ self,
+ percent: int = 0,
+ props: dict | None = None,
+ *,
+ format: str | None = None,
+ show_info: bool | None = None,
+ status: Literal['success', 'exception', 'normal', 'active']
+ | None = None,
+ stroke_color: str | None = None,
+ stroke_linecap: Literal['round', 'butt', 'square']
+ | None = None,
+ success: dict | None = None,
+ trail_color: str | None = None,
+ type: Literal['line', 'circle', 'dashboard'] | None = None,
+ size: int | float | list[int | float | str] | dict
+ | Literal['small', 'default']
+ | None = None,
+ steps: int | dict | None = None,
+ percent_position: dict | None = None,
+ stroke_width: int | float | None = None,
+ gap_degree: int | float | None = None,
+ gap_position: Literal['top', 'bottom', 'left', 'right']
+ | None = None,
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.percent = percent
+ self.format = format
+ self.show_info = show_info
+ self.status = status
+ self.stroke_color = stroke_color
+ self.stroke_linecap = stroke_linecap
+ self.success = success
+ self.trail_color = trail_color
+ self.type = type
+ self.size = size
+ self.steps = steps
+ self.percent_position = percent_position
+ self.stroke_width = stroke_width
+ self.gap_degree = gap_degree
+ self.gap_position = gap_position
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("progress")
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: None) -> None:
+ return payload
+
+ def postprocess(self, value: None) -> None:
+ return value
+
+ def example_payload(self) -> Any:
+ return 0
+
+ def example_value(self) -> Any:
+ return 0
diff --git a/backend/modelscope_studio/components/antd/qr_code/__init__.py b/backend/modelscope_studio/components/antd/qr_code/__init__.py
new file mode 100644
index 00000000..513202dc
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/qr_code/__init__.py
@@ -0,0 +1,87 @@
+from __future__ import annotations
+
+from typing import Any, Literal
+
+from gradio.events import EventListener
+
+from ....utils.dev import ModelScopeComponent, resolve_frontend_dir
+
+
+class AntdQRCode(ModelScopeComponent):
+ """
+ Ant Design: https://ant.design/components/qr-code
+ """
+
+ EVENTS = [
+ EventListener("refresh",
+ callback=lambda block: block._internal.update(
+ bind_refresh_event=True)),
+ ]
+
+ # supported slots
+ SLOTS = ["statusRender"]
+
+ def __init__(
+ self,
+ value: str | None = None,
+ props: dict | None = None,
+ *,
+ type: Literal['canvas', 'svg'] | None = 'canvas',
+ bordered: bool = True,
+ color: str | None = "#000",
+ bg_color: str | None = 'transparent',
+ error_level: Literal['L', 'M', 'Q', 'H'] | None = 'M',
+ icon: str | None = None,
+ icon_size: int | dict | None = 40,
+ size: int = 160,
+ status: Literal['active', 'expired', 'loading', 'scanned']
+ | None = 'active',
+ status_render: str | None = None,
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(value=value,
+ visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.type = type
+ self.bordered = bordered
+ self.color = color
+ self.bg_color = bg_color
+ self.error_level = error_level
+ self.icon = icon
+ self.icon_size = icon_size
+ self.size = size
+ self.status = status
+ self.status_render = status_render
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("qr-code")
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: str) -> str:
+ return payload
+
+ def postprocess(self, value: str) -> str:
+ return value
+
+ def example_payload(self) -> Any:
+ return None
+
+ def example_value(self) -> Any:
+ return None
diff --git a/backend/modelscope_studio/components/antd/radio/__init__.py b/backend/modelscope_studio/components/antd/radio/__init__.py
new file mode 100644
index 00000000..c0876219
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/radio/__init__.py
@@ -0,0 +1,80 @@
+from __future__ import annotations
+
+from typing import Any
+
+from gradio.events import EventListener
+
+from ....utils.dev import ModelScopeDataLayoutComponent, resolve_frontend_dir
+from .button import AntdRadioButton
+from .group import AntdRadioGroup
+
+
+# as inputs, outputs
+class AntdRadio(ModelScopeDataLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/radio
+ """
+ Group = AntdRadioGroup
+ Button = AntdRadioButton
+
+ EVENTS = [
+ EventListener("change",
+ callback=lambda block: block._internal.update(
+ bind_change_event=True)),
+ ]
+
+ def __init__(
+ self,
+ group_value: Any | None = None,
+ value: bool | None = None,
+ props: dict | None = None,
+ *,
+ auto_focus: bool | None = None,
+ default_checked: bool | None = None,
+ disabled: bool | None = None,
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(value=value,
+ visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.group_value = group_value
+ self.auto_focus = auto_focus
+ self.default_checked = default_checked
+ self.disabled = disabled
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("radio")
+
+ @property
+ def skip_api(self):
+ return False
+
+ def api_info(self) -> dict[str, Any]:
+ return {"type": "boolean"}
+
+ def preprocess(self, payload: None | bool) -> None | bool:
+ return payload
+
+ def postprocess(self, value: None | bool) -> None | bool:
+
+ return value
+
+ def example_payload(self) -> None:
+ return None
+
+ def example_value(self) -> None:
+ return None
diff --git a/backend/modelscope_studio/components/antd/radio/button/__init__.py b/backend/modelscope_studio/components/antd/radio/button/__init__.py
new file mode 100644
index 00000000..f72d5ba5
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/radio/button/__init__.py
@@ -0,0 +1,76 @@
+from __future__ import annotations
+
+from typing import Any
+
+from gradio.events import EventListener
+
+from .....utils.dev import ModelScopeDataLayoutComponent, resolve_frontend_dir
+
+
+# as inputs, outputs
+class AntdRadioButton(ModelScopeDataLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/radio
+ """
+
+ EVENTS = [
+ EventListener("change",
+ callback=lambda block: block._internal.update(
+ bind_change_event=True)),
+ ]
+
+ def __init__(
+ self,
+ group_value: Any | None = None,
+ value: bool | None = None,
+ props: dict | None = None,
+ *,
+ auto_focus: bool | None = None,
+ default_checked: bool | None = None,
+ disabled: bool | None = None,
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(value=value,
+ visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.group_value = group_value
+ self.auto_focus = auto_focus
+ self.default_checked = default_checked
+ self.disabled = disabled
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("radio", 'button')
+
+ @property
+ def skip_api(self):
+ return False
+
+ def api_info(self) -> dict[str, Any]:
+ return {"type": "boolean"}
+
+ def preprocess(self, payload: None | bool) -> None | bool:
+ return payload
+
+ def postprocess(self, value: None | bool) -> None | bool:
+
+ return value
+
+ def example_payload(self) -> None:
+ return None
+
+ def example_value(self) -> None:
+ return None
diff --git a/backend/modelscope_studio/components/antd/radio/group/__init__.py b/backend/modelscope_studio/components/antd/radio/group/__init__.py
new file mode 100644
index 00000000..e83cf879
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/radio/group/__init__.py
@@ -0,0 +1,100 @@
+from __future__ import annotations
+
+from typing import Any, Literal
+
+from gradio.events import EventListener
+
+from .....utils.dev import ModelScopeDataLayoutComponent, resolve_frontend_dir
+from .option import AntdRadioGroupOption
+
+
+# as inputs, outputs
+class AntdRadioGroup(ModelScopeDataLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/radio
+ """
+ Option = AntdRadioGroupOption
+
+ EVENTS = [
+ EventListener("change",
+ callback=lambda block: block._internal.update(
+ bind_change_event=True)),
+ ]
+ # supported slots
+ SLOTS = ['options']
+
+ def __init__(
+ self,
+ value: Any | None = None,
+ props: dict | None = None,
+ *,
+ button_style: Literal['outline', 'solid'] | None = 'outline',
+ default_value: Any | None = None,
+ disabled: bool | None = None,
+ form_name: str | None = None,
+ options: list[str] | list[int | float] | list[dict] | None = None,
+ option_type: Literal['default', 'button'] | None = 'default',
+ size: Literal['small', 'middle', 'large'] | None = None,
+ block: bool | None = None,
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(value=value,
+ visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.button_style = button_style
+ self.default_value = default_value
+ self.disabled = disabled
+ self.form_name = form_name
+ self.options = options
+ self.option_type = option_type
+ self.size = size
+ self.block = block
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("radio", "group")
+
+ @property
+ def skip_api(self):
+ return False
+
+ def api_info(self) -> dict[str, Any]:
+ return {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ {
+ "type": "boolean"
+ },
+ ],
+ }
+
+ def preprocess(self, payload: Any | None) -> Any | None:
+ return payload
+
+ def postprocess(self, value: Any | None) -> Any | None:
+
+ return value
+
+ def example_payload(self) -> None:
+ return None
+
+ def example_value(self) -> None:
+ return None
diff --git a/backend/modelscope_studio/components/antd/radio/group/option/__init__.py b/backend/modelscope_studio/components/antd/radio/group/option/__init__.py
new file mode 100644
index 00000000..4dbbb21b
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/radio/group/option/__init__.py
@@ -0,0 +1,68 @@
+from __future__ import annotations
+
+from typing import Any
+
+from ......utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+
+
+class AntdRadioGroupOption(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/radio
+ """
+
+ EVENTS = []
+
+ # supported slots
+ SLOTS = [
+ 'label',
+ ]
+
+ def __init__(
+ self,
+ value: str | None = None,
+ props: dict | None = None,
+ *,
+ label: str | None = None,
+ disabled: bool | None = None,
+ title: str | None = None,
+ required: bool | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.value = value
+ self.label = label
+ self.disabled = disabled
+ self.title = title
+ self.required = required
+
+ FRONTEND_DIR = resolve_frontend_dir("radio", ['group', 'option'])
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: None) -> None:
+ return payload
+
+ def postprocess(self, value: None) -> None:
+ return value
+
+ def example_payload(self) -> Any:
+ return None
+
+ def example_value(self) -> Any:
+ return None
diff --git a/backend/modelscope_studio/components/antd/rate/__init__.py b/backend/modelscope_studio/components/antd/rate/__init__.py
new file mode 100644
index 00000000..cf5a2236
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/rate/__init__.py
@@ -0,0 +1,101 @@
+from __future__ import annotations
+
+from typing import Any
+
+from gradio.events import EventListener
+
+from ....utils.dev import ModelScopeDataLayoutComponent, resolve_frontend_dir
+
+
+# as inputs, outputs
+class AntdRate(ModelScopeDataLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/rate
+ """
+
+ EVENTS = [
+ EventListener("change",
+ callback=lambda block: block._internal.update(
+ bind_change_event=True)),
+ EventListener("blur",
+ callback=lambda block: block._internal.update(
+ bind_blur_event=True)),
+ EventListener("focus",
+ callback=lambda block: block._internal.update(
+ bind_focus_event=True)),
+ EventListener("hover_change",
+ callback=lambda block: block._internal.update(
+ bind_hoverChange_event=True)),
+ EventListener("key_down",
+ callback=lambda block: block._internal.update(
+ bind_keyDown_event=True)),
+ ]
+
+ # supported slots
+ SLOTS = ["character"]
+
+ def __init__(
+ self,
+ value: int | float | None = None,
+ props: dict | None = None,
+ *,
+ allow_clear: bool | None = None,
+ allow_half: bool | None = None,
+ auto_focus: bool | None = None,
+ character: str | None = None,
+ count: int | float | None = 5,
+ default_value: int | float | None = 0,
+ disabled: bool | None = None,
+ keyboard: bool | None = None,
+ tooltips: list[str] | None = None,
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(value=value,
+ visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.allow_clear = allow_clear
+ self.allow_half = allow_half
+ self.auto_focus = auto_focus
+ self.character = character
+ self.count = count
+ self.default_value = default_value
+ self.disabled = disabled
+ self.keyboard = keyboard
+ self.tooltips = tooltips
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("rate")
+
+ @property
+ def skip_api(self):
+ return False
+
+ def api_info(self) -> dict[str, Any]:
+ return {"type": "number"}
+
+ def preprocess(self, payload: None | int | float) -> None | int | float:
+ return payload
+
+ def postprocess(self, value: None | int | float) -> None | int | float:
+
+ return value
+
+ def example_payload(self) -> None:
+ return None
+
+ def example_value(self) -> None:
+ return None
diff --git a/backend/modelscope_studio/components/antd/result/__init__.py b/backend/modelscope_studio/components/antd/result/__init__.py
new file mode 100644
index 00000000..37a9badb
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/result/__init__.py
@@ -0,0 +1,70 @@
+from __future__ import annotations
+
+from typing import Literal
+
+from ....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+
+
+class AntdResult(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/result
+ """
+ EVENTS = []
+
+ # supported slots
+ SLOTS = ['extra', 'icon', 'subTitle', 'title']
+
+ def __init__(
+ self,
+ props: dict | None = None,
+ *,
+ extra: str | None = None,
+ icon: str | None = None,
+ status: Literal['success', 'error', 'info', 'warning', '404',
+ '403', '500']
+ | None = None,
+ sub_title: str | None = None,
+ title: str | None = None,
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.extra = extra
+ self.icon = icon
+ self.status = status
+ self.sub_title = sub_title
+ self.title = title
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("result")
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: None) -> None:
+ return payload
+
+ def postprocess(self, value: None) -> None:
+
+ return value
+
+ def example_payload(self) -> None:
+ return None
+
+ def example_value(self) -> None:
+ return None
diff --git a/backend/modelscope_studio/components/antd/segmented/__init__.py b/backend/modelscope_studio/components/antd/segmented/__init__.py
new file mode 100644
index 00000000..e67a7bbf
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/segmented/__init__.py
@@ -0,0 +1,90 @@
+from __future__ import annotations
+
+from typing import Any, Literal
+
+from gradio.events import EventListener
+
+from ....utils.dev import ModelScopeDataLayoutComponent, resolve_frontend_dir
+from .option import AntdSegmentedOption
+
+
+# as inputs, outputs
+class AntdSegmented(ModelScopeDataLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/segmented
+ """
+ Option = AntdSegmentedOption
+
+ EVENTS = [
+ EventListener("change",
+ callback=lambda block: block._internal.update(
+ bind_change_event=True)),
+ ]
+
+ def __init__(
+ self,
+ value: str | int | float | None = None,
+ props: dict | None = None,
+ *,
+ block: bool = False,
+ default_value: str | int | float | None = None,
+ disabled: bool = False,
+ options: list[str] | list[int | float] | list[dict] | None = None,
+ size: Literal['large', 'middle', 'small'] | None = None,
+ vertical: bool = False,
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(value=value,
+ visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.block = block
+ self.default_value = default_value
+ self.disabled = disabled
+ self.options = options
+ self.size = size
+ self.vertical = vertical
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("segmented")
+
+ @property
+ def skip_api(self):
+ return False
+
+ def api_info(self) -> dict[str, list[str]]:
+ return {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "number"
+ },
+ ]
+ }
+
+ def preprocess(self, payload: str | int | float) -> str | int | float:
+ return payload
+
+ def postprocess(self, value: str | int | float) -> str | int | float:
+ return value
+
+ def example_payload(self) -> Any:
+ return None
+
+ def example_value(self) -> Any:
+ return None
diff --git a/backend/modelscope_studio/components/antd/segmented/option/__init__.py b/backend/modelscope_studio/components/antd/segmented/option/__init__.py
new file mode 100644
index 00000000..339d3196
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/segmented/option/__init__.py
@@ -0,0 +1,64 @@
+from __future__ import annotations
+
+from typing import Any
+
+from .....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+
+
+class AntdSegmentedOption(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/segmented
+ """
+
+ EVENTS = []
+
+ # supported slots
+ SLOTS = ['icon', "label"]
+
+ def __init__(
+ self,
+ label: str | None = None,
+ value: str | int | float | None = None,
+ props: dict | None = None,
+ *,
+ icon: str | None = None,
+ disabled: bool = False,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.label = label
+ self.value = value
+ self.props = props
+ self.icon = icon
+ self.disabled = disabled
+
+ FRONTEND_DIR = resolve_frontend_dir("segmented", "option")
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: None) -> None:
+ return payload
+
+ def postprocess(self, value: None) -> None:
+ return value
+
+ def example_payload(self) -> Any:
+ return None
+
+ def example_value(self) -> Any:
+ return None
diff --git a/backend/modelscope_studio/components/antd/select/__init__.py b/backend/modelscope_studio/components/antd/select/__init__.py
new file mode 100644
index 00000000..fb05bc8a
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/select/__init__.py
@@ -0,0 +1,215 @@
+from __future__ import annotations
+
+from typing import Any, Literal
+
+from gradio.events import EventListener
+
+from ....utils.dev import ModelScopeDataLayoutComponent, resolve_frontend_dir
+from .option import AntdSelectOption
+
+
+# as inputs, outputs
+class AntdSelect(ModelScopeDataLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/select
+ """
+ Option = AntdSelectOption
+
+ EVENTS = [
+ EventListener("change",
+ callback=lambda block: block._internal.update(
+ bind_change_event=True)),
+ EventListener("blur",
+ callback=lambda block: block._internal.update(
+ bind_blur_event=True)),
+ EventListener("focus",
+ callback=lambda block: block._internal.update(
+ bind_focus_event=True)),
+ EventListener("search",
+ callback=lambda block: block._internal.update(
+ bind_search_event=True)),
+ EventListener("select",
+ callback=lambda block: block._internal.update(
+ bind_select_event=True)),
+ EventListener("clear",
+ callback=lambda block: block._internal.update(
+ bind_clear_event=True)),
+ EventListener("popup_scroll",
+ callback=lambda block: block._internal.update(
+ bind_popupScroll_event=True)),
+ EventListener("dropdown_visible_change",
+ callback=lambda block: block._internal.update(
+ bind_dropdownVisibleChange_event=True)),
+ ]
+
+ # supported slots
+ SLOTS = [
+ 'allowClear.clearIcon', 'maxTagPlaceholder', 'menuItemSelectedIcon',
+ 'dropdownRender', 'optionRender', 'tagRender', 'labelRender',
+ 'notFoundContent', 'removeIcon', 'suffixIcon', 'options'
+ ]
+
+ def __init__(
+ self,
+ value: str | int | float | list[float | int | str] | None = None,
+ props: dict | None = None,
+ *,
+ allow_clear: bool | dict | None = None,
+ auto_clear_search_value: bool | None = None,
+ auto_focus: bool | None = None,
+ default_active_first_option: bool | None = True,
+ default_open: bool | None = None,
+ default_value: str | int | float | list[float | int | str]
+ | None = None,
+ disabled: bool | None = False,
+ popup_class_name: str | None = None,
+ popup_match_select_width: bool | int | float | None = True,
+ dropdown_render: str | None = None,
+ dropdown_style: dict | None = None,
+ field_names: dict | None = None,
+ filter_option: bool | str | None = None,
+ filter_sort: bool | None = None,
+ get_popup_container: str | None = None,
+ label_in_value: bool | None = False,
+ list_height: int | None = None,
+ loading: bool | None = None,
+ max_count: int | None = None,
+ max_tag_count: int | Literal['responsive'] | None = None,
+ max_tag_placeholder: str | None = None,
+ max_tag_text_length: int | None = None,
+ menu_item_selected_icon: str | None = None,
+ mode: Literal['multiple', 'tags'] | None = None,
+ not_found_content: str | None = None,
+ open: bool | None = None,
+ option_filter_prop: str | None = None,
+ option_label_prop: str | None = None,
+ options: list[dict] | None = None,
+ option_render: str | None = None,
+ placeholder: str | None = None,
+ placement: Literal['bottomLeft', 'bottomRight', 'topLeft',
+ 'topRight'] | None = 'bottomLeft',
+ remove_icon: str | None = None,
+ search_value: str | None = None,
+ show_search: bool | None = None,
+ size: Literal['large', 'middle', 'small'] | None = None,
+ status: Literal['error', 'warning'] | None = None,
+ suffix_icon: str | None = None,
+ tag_render: str | None = None,
+ label_render: str | None = None,
+ token_separators: list[str] | None = None,
+ variant: Literal['outlined', 'borderless', 'filled']
+ | None = 'outlined',
+ virtual: bool | None = True,
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ key: int | str | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(value=value,
+ visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ key=key,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.allow_clear = allow_clear
+ self.auto_clear_search_value = auto_clear_search_value
+ self.auto_focus = auto_focus
+ self.default_active_first_option = default_active_first_option
+ self.default_open = default_open
+ self.default_value = default_value
+ self.disabled = disabled
+ self.popup_class_name = popup_class_name
+ self.popup_match_select_width = popup_match_select_width
+ self.get_popup_container = get_popup_container
+ self.dropdown_render = dropdown_render
+ self.dropdown_style = dropdown_style
+ self.field_names = field_names
+ self.filter_option = filter_option
+ self.filter_sort = filter_sort
+ self.label_in_value = label_in_value
+ self.list_height = list_height
+ self.loading = loading
+ self.max_count = max_count
+ self.max_tag_count = max_tag_count
+ self.max_tag_placeholder = max_tag_placeholder
+ self.max_tag_text_length = max_tag_text_length
+ self.menu_item_selected_icon = menu_item_selected_icon
+ self.mode = mode
+ self.not_found_content = not_found_content
+ self.open = open
+ self.option_filter_prop = option_filter_prop
+ self.option_label_prop = option_label_prop
+ self.options = options
+ self.option_render = option_render
+ self.placeholder = placeholder
+ self.placement = placement
+ self.remove_icon = remove_icon
+ self.search_value = search_value
+ self.show_search = show_search
+ self.size = size
+ self.status = status
+ self.suffix_icon = suffix_icon
+ self.tag_render = tag_render
+ self.label_render = label_render
+ self.token_separators = token_separators
+ self.variant = variant
+ self.virtual = virtual
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("select")
+
+ @property
+ def skip_api(self):
+ return False
+
+ def api_info(self) -> dict[str, Any]:
+ return {
+ "anyOf": [
+ {
+ "type": "string",
+ },
+ {
+ "type": "number",
+ },
+ {
+ "type": "array",
+ "items": {
+ "anyOf": [
+ {
+ "type": "string",
+ },
+ {
+ "type": "number",
+ },
+ ],
+ },
+ },
+ ]
+ }
+
+ def preprocess(
+ self, payload: str | int | float | list[float | int | str] | None
+ ) -> str | int | float | list[float | int | str] | None:
+ return payload
+
+ def postprocess(
+ self, value: str | int | float | list[float | int | str] | None
+ ) -> str | int | float | list[float | int | str] | None:
+
+ return value
+
+ def example_payload(self) -> None:
+ return None
+
+ def example_value(self) -> None:
+ return None
diff --git a/backend/modelscope_studio/components/antd/select/option/__init__.py b/backend/modelscope_studio/components/antd/select/option/__init__.py
new file mode 100644
index 00000000..fcd4df74
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/select/option/__init__.py
@@ -0,0 +1,66 @@
+from __future__ import annotations
+
+from typing import Any
+
+from .....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+
+
+class AntdSelectOption(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/select
+ """
+
+ EVENTS = []
+
+ # supported slots
+ SLOTS = ['label', 'options']
+
+ def __init__(
+ self,
+ value: str | None = None,
+ label: str | None = None,
+ props: dict | None = None,
+ *,
+ title: str | None = None,
+ disabled: bool | None = None,
+ key: str | int | float | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.value = value
+ self.label = label
+ self.disabled = disabled
+ self.title = title
+ self.key = key
+
+ FRONTEND_DIR = resolve_frontend_dir("select", "option")
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: None) -> None:
+ return payload
+
+ def postprocess(self, value: None) -> None:
+ return value
+
+ def example_payload(self) -> Any:
+ return None
+
+ def example_value(self) -> Any:
+ return None
diff --git a/backend/modelscope_studio/components/antd/skeleton/__init__.py b/backend/modelscope_studio/components/antd/skeleton/__init__.py
new file mode 100644
index 00000000..e99c210c
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/skeleton/__init__.py
@@ -0,0 +1,75 @@
+from __future__ import annotations
+
+from ....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+from .avatar import AntdSkeletonAvatar
+from .button import AntdSkeletonButton
+from .image import AntdSkeletonImage
+from .input import AntdSkeletonInput
+from .node import AntdSkeletonNode
+
+
+class AntdSkeleton(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/skeleton
+ """
+ Node = AntdSkeletonNode
+ Avatar = AntdSkeletonAvatar
+ Button = AntdSkeletonButton
+ Image = AntdSkeletonImage
+ Input = AntdSkeletonInput
+ EVENTS = []
+
+ def __init__(
+ self,
+ props: dict | None = None,
+ *,
+ active: bool | None = None,
+ avatar: bool | dict | None = None,
+ loading: bool | None = None,
+ paragraph: bool | dict | None = None,
+ round: bool | None = None,
+ title: bool | dict | None = None,
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.active = active
+ self.avatar = avatar
+ self.loading = loading
+ self.paragraph = paragraph
+ self.round = round
+ self.title = title
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("skeleton")
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: None) -> None:
+ return payload
+
+ def postprocess(self, value: None) -> None:
+
+ return value
+
+ def example_payload(self) -> None:
+ return None
+
+ def example_value(self) -> None:
+ return None
diff --git a/backend/modelscope_studio/components/antd/skeleton/avatar/__init__.py b/backend/modelscope_studio/components/antd/skeleton/avatar/__init__.py
new file mode 100644
index 00000000..9201d609
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/skeleton/avatar/__init__.py
@@ -0,0 +1,62 @@
+from __future__ import annotations
+
+from typing import Literal
+
+from .....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+
+
+class AntdSkeletonAvatar(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/skeleton
+ """
+ EVENTS = []
+
+ def __init__(
+ self,
+ props: dict | None = None,
+ *,
+ active: bool | None = None,
+ shape: Literal['circle', 'square'] | None = None,
+ size: Literal['large', 'small', 'default'] | int | float
+ | None = None,
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.active = active
+ self.shape = shape
+ self.size = size
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("skeleton", "avatar")
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: None) -> None:
+ return payload
+
+ def postprocess(self, value: None) -> None:
+
+ return value
+
+ def example_payload(self) -> None:
+ return None
+
+ def example_value(self) -> None:
+ return None
diff --git a/backend/modelscope_studio/components/antd/skeleton/button/__init__.py b/backend/modelscope_studio/components/antd/skeleton/button/__init__.py
new file mode 100644
index 00000000..9f2e71a2
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/skeleton/button/__init__.py
@@ -0,0 +1,64 @@
+from __future__ import annotations
+
+from typing import Literal
+
+from .....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+
+
+class AntdSkeletonButton(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/skeleton
+ """
+ EVENTS = []
+
+ def __init__(
+ self,
+ props: dict | None = None,
+ *,
+ active: bool | None = None,
+ block: bool | None = None,
+ shape: Literal['default', 'circle', 'round', 'square']
+ | None = None,
+ size: Literal['large', 'small', 'default'] | None = None,
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.active = active
+ self.block = block
+ self.shape = shape
+ self.size = size
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("skeleton", "button")
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: None) -> None:
+ return payload
+
+ def postprocess(self, value: None) -> None:
+
+ return value
+
+ def example_payload(self) -> None:
+ return None
+
+ def example_value(self) -> None:
+ return None
diff --git a/backend/modelscope_studio/components/antd/skeleton/image/__init__.py b/backend/modelscope_studio/components/antd/skeleton/image/__init__.py
new file mode 100644
index 00000000..7189662e
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/skeleton/image/__init__.py
@@ -0,0 +1,55 @@
+from __future__ import annotations
+
+from .....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+
+
+class AntdSkeletonImage(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/skeleton
+ """
+ EVENTS = []
+
+ def __init__(
+ self,
+ props: dict | None = None,
+ *,
+ active: bool | None = None,
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.active = active
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("skeleton", "image")
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: None) -> None:
+ return payload
+
+ def postprocess(self, value: None) -> None:
+
+ return value
+
+ def example_payload(self) -> None:
+ return None
+
+ def example_value(self) -> None:
+ return None
diff --git a/backend/modelscope_studio/components/antd/skeleton/input/__init__.py b/backend/modelscope_studio/components/antd/skeleton/input/__init__.py
new file mode 100644
index 00000000..1b390072
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/skeleton/input/__init__.py
@@ -0,0 +1,59 @@
+from __future__ import annotations
+
+from typing import Literal
+
+from .....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+
+
+class AntdSkeletonInput(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/skeleton
+ """
+ EVENTS = []
+
+ def __init__(
+ self,
+ props: dict | None = None,
+ *,
+ active: bool | None = None,
+ size: Literal['large', 'small', 'default'] | None = None,
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.active = active
+ self.size = size
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("skeleton", "input")
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: None) -> None:
+ return payload
+
+ def postprocess(self, value: None) -> None:
+
+ return value
+
+ def example_payload(self) -> None:
+ return None
+
+ def example_value(self) -> None:
+ return None
diff --git a/backend/modelscope_studio/components/antd/skeleton/node/__init__.py b/backend/modelscope_studio/components/antd/skeleton/node/__init__.py
new file mode 100644
index 00000000..1bfa131b
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/skeleton/node/__init__.py
@@ -0,0 +1,57 @@
+from __future__ import annotations
+
+from .....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+
+
+class AntdSkeletonNode(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/skeleton
+ """
+ EVENTS = []
+
+ def __init__(
+ self,
+ props: dict | None = None,
+ *,
+ active: bool | None = None,
+ full_size: bool | None = None,
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.active = active
+ self.full_size = full_size
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("skeleton", "node")
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: None) -> None:
+ return payload
+
+ def postprocess(self, value: None) -> None:
+
+ return value
+
+ def example_payload(self) -> None:
+ return None
+
+ def example_value(self) -> None:
+ return None
diff --git a/backend/modelscope_studio/components/antd/slider/__init__.py b/backend/modelscope_studio/components/antd/slider/__init__.py
new file mode 100644
index 00000000..986742c8
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/slider/__init__.py
@@ -0,0 +1,125 @@
+from __future__ import annotations
+
+from typing import Any
+
+from gradio.events import EventListener
+
+from ....utils.dev import ModelScopeDataLayoutComponent, resolve_frontend_dir
+from .mark import AntdSliderMark
+
+
+# as inputs, outputs
+class AntdSlider(ModelScopeDataLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/slider
+ """
+ Mark = AntdSliderMark
+
+ EVENTS = [
+ EventListener("change",
+ callback=lambda block: block._internal.update(
+ bind_change_event=True)),
+ EventListener("change_complete",
+ callback=lambda block: block._internal.update(
+ bind_changeComplete_event=True)),
+ ]
+
+ # supported slots
+ SLOTS = ['marks', 'tooltip.formatter']
+
+ def __init__(
+ self,
+ value: int | float | tuple[int | float, int | float] | None = None,
+ props: dict | None = None,
+ *,
+ auto_focus: bool | None = None,
+ class_names: dict | None = None,
+ default_value: int | float | tuple[int | float, int | float]
+ | None = None,
+ disabled: bool | None = None,
+ dots: bool | None = False,
+ included: bool | None = True,
+ keyboard: bool | None = True,
+ marks: dict | None = None,
+ max: int | float | None = 100,
+ min: int | float | None = 0,
+ range: bool | dict | None = False,
+ reverse: bool | None = False,
+ step: int | float | None = 1,
+ styles: dict | None = None,
+ tooltip: dict | None = None,
+ vertical: bool | None = None,
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(value=value,
+ visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.auto_focus = auto_focus
+ self.class_names = class_names
+ self.default_value = default_value
+ self.disabled = disabled
+ self.dots = dots
+ self.included = included
+ self.keyboard = keyboard
+ self.marks = marks
+ self.max = max
+ self.min = min
+ self.range = range
+ self.reverse = reverse
+ self.step = step
+ self.styles = styles
+ self.tooltip = tooltip
+ self.vertical = vertical
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("slider")
+
+ @property
+ def skip_api(self):
+ return False
+
+ def api_info(self) -> dict[str, Any]:
+ return {
+ "anyOf": [
+ {
+ "type": "number",
+ },
+ {
+ "type": "array",
+ "items": {
+ "type": "number",
+ },
+ },
+ ]
+ }
+
+ def preprocess(
+ self, payload: int | float | tuple[int | float, int | float] | None
+ ) -> int | float | tuple[int | float, int | float] | None:
+ return payload
+
+ def postprocess(
+ self, value: int | float | tuple[int | float, int | float] | None
+ ) -> int | float | tuple[int | float, int | float] | None:
+
+ return value
+
+ def example_payload(self) -> None:
+ return None
+
+ def example_value(self) -> None:
+ return None
diff --git a/backend/modelscope_studio/components/antd/slider/mark/__init__.py b/backend/modelscope_studio/components/antd/slider/mark/__init__.py
new file mode 100644
index 00000000..4b503b71
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/slider/mark/__init__.py
@@ -0,0 +1,66 @@
+from __future__ import annotations
+
+from typing import Any
+
+from .....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+
+
+class AntdSliderMark(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/slider
+ """
+
+ EVENTS = []
+
+ # supported slots
+ SLOTS = [
+ 'label',
+ ]
+
+ def __init__(
+ self,
+ number: float | int | None = None,
+ label: str | None = None,
+ props: dict | None = None,
+ *,
+ title: str | None = None,
+ disabled: bool | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.number = number
+ self.label = label
+ self.disabled = disabled
+ self.title = title
+
+ FRONTEND_DIR = resolve_frontend_dir("slider", "mark")
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: None) -> None:
+ return payload
+
+ def postprocess(self, value: None) -> None:
+ return value
+
+ def example_payload(self) -> Any:
+ return None
+
+ def example_value(self) -> Any:
+ return None
diff --git a/backend/modelscope_studio/components/antd/space/__init__.py b/backend/modelscope_studio/components/antd/space/__init__.py
new file mode 100644
index 00000000..d57137b1
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/space/__init__.py
@@ -0,0 +1,97 @@
+from __future__ import annotations
+
+from typing import Literal
+
+from ....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+from .compact import AntdSpaceCompact
+
+
+class AntdSpace(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/space
+
+ Set components spacing.
+
+ When to use:
+ - Avoid components clinging together and set a unified space.
+ - Use Space.Compact when child form components are compactly connected and the border is collapsed
+
+ Difference with Flex component:
+ - Space is used to set the spacing between inline elements. It will add a wrapper element for each child element for inline alignment. Suitable for equidistant arrangement of multiple child elements in rows and columns.
+ - Flex is used to set the layout of block-level elements. It does not add a wrapper element. Suitable for layout of child elements in vertical or horizontal direction, and provides more flexibility and control.
+ """
+ Compact = AntdSpaceCompact
+
+ EVENTS = []
+
+ # supported slots
+ SLOTS = ['split']
+
+ def __init__(
+ self,
+ props: dict | None = None,
+ *,
+ align: Literal['start', 'end', 'center', 'baseline'] | None = None,
+ class_names: dict | None = None,
+ styles: dict | None = None,
+ direction: Literal['vertical', 'horizontal'] | None = 'horizontal',
+ size: Literal['small', 'middle', 'large'] | int | float
+ | list[Literal['small', 'middle', 'large'] | int | float]
+ | None = None,
+ split: str | None = None,
+ wrap: bool = False,
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ """
+ Parameters:
+ align: Align items.
+ class_names: Semantic className.
+ direction: The space direction.
+ size: The space size.
+ split: Set split.
+ styles: Semantic style.
+ wrap: Auto wrap line, when horizontal effective.
+ """
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.align = align
+ self.class_names = class_names
+ self.styles = styles
+ self.direction = direction
+ self.size = size
+ self.split = split
+ self.wrap = wrap
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("space")
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: None) -> None:
+ return payload
+
+ def postprocess(self, value: None) -> None:
+
+ return value
+
+ def example_payload(self) -> None:
+ return None
+
+ def example_value(self) -> None:
+ return None
diff --git a/backend/modelscope_studio/components/antd/space/compact/__init__.py b/backend/modelscope_studio/components/antd/space/compact/__init__.py
new file mode 100644
index 00000000..1c5b4409
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/space/compact/__init__.py
@@ -0,0 +1,76 @@
+from __future__ import annotations
+
+from typing import Literal
+
+from .....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+
+
+class AntdSpaceCompact(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/space
+
+ Set components spacing.
+
+ When to use:
+ - Avoid components clinging together and set a unified space.
+ - Use Space.Compact when child form components are compactly connected and the border is collapsed
+
+ Difference with Flex component:
+ - Space is used to set the spacing between inline elements. It will add a wrapper element for each child element for inline alignment. Suitable for equidistant arrangement of multiple child elements in rows and columns.
+ - Flex is used to set the layout of block-level elements. It does not add a wrapper element. Suitable for layout of child elements in vertical or horizontal direction, and provides more flexibility and control.
+ """
+ EVENTS = []
+
+ def __init__(
+ self,
+ props: dict | None = None,
+ *,
+ block: bool = False,
+ direction: Literal['vertical', 'horizontal'] = 'horizontal',
+ size: Literal['small', 'middle', 'large'] | None = None,
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ """
+ Parameters:
+ block: Option to fit width to its parent's width.
+ direction: Set direction of layout.
+ size: Set child component size.
+ """
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.block = block
+ self.direction = direction
+ self.size = size
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("space", "compact")
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: None) -> None:
+ return payload
+
+ def postprocess(self, value: None) -> None:
+ return value
+
+ def example_payload(self) -> None:
+ return None
+
+ def example_value(self) -> None:
+ return None
diff --git a/backend/modelscope_studio/components/antd/spin/__init__.py b/backend/modelscope_studio/components/antd/spin/__init__.py
new file mode 100644
index 00000000..bdc5d03f
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/spin/__init__.py
@@ -0,0 +1,74 @@
+from __future__ import annotations
+
+from typing import Literal
+
+from ....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+
+
+class AntdSpin(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/spin
+ """
+ EVENTS = []
+
+ # supported slots
+ SLOTS = ['tip', 'indicator']
+
+ def __init__(
+ self,
+ spinning: bool | None = None,
+ props: dict | None = None,
+ *,
+ delay: int | float | None = None,
+ fullscreen: bool | None = None,
+ indicator: str | None = None,
+ percent: int | float | Literal['auto'] | None = None,
+ size: Literal['small', 'default', 'large'] | None = None,
+ tip: str | None = None,
+ wrapper_class_name: str | None = None,
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.spinning = spinning
+ self.delay = delay
+ self.fullscreen = fullscreen
+ self.indicator = indicator
+ self.percent = percent
+ self.size = size
+ self.tip = tip
+ self.wrapper_class_name = wrapper_class_name
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("spin")
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: None) -> None:
+ return payload
+
+ def postprocess(self, value: None) -> None:
+
+ return value
+
+ def example_payload(self) -> None:
+ return None
+
+ def example_value(self) -> None:
+ return None
diff --git a/backend/modelscope_studio/components/antd/splitter/__init__.py b/backend/modelscope_studio/components/antd/splitter/__init__.py
new file mode 100644
index 00000000..01bf2fa0
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/splitter/__init__.py
@@ -0,0 +1,83 @@
+from __future__ import annotations
+
+from typing import Any, Literal
+
+from gradio.events import EventListener
+
+from ....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+from .panel import AntdSplitterPanel
+
+
+class AntdSplitter(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/splitter
+
+ Split panels to isolate.
+
+ When to use:
+ Can be used to separate areas horizontally or vertically. When you need to freely drag and adjust the size of each area. When you need to specify the maximum and minimum width and height of an area.
+ """
+ Panel = AntdSplitterPanel
+
+ EVENTS = [
+ EventListener("resize_start",
+ doc="Callback before dragging starts.",
+ callback=lambda block: block._internal.update(
+ bind_resizeStart_event=True)),
+ EventListener("resize",
+ doc="Panel size change callback.",
+ callback=lambda block: block._internal.update(
+ bind_resize_event=True)),
+ EventListener("resize_end",
+ doc="Drag end callback.",
+ callback=lambda block: block._internal.update(
+ bind_resizeEnd_event=True)),
+ ]
+
+ def __init__(
+ self,
+ props: dict | None = None,
+ *,
+ layout: Literal['horizontal', 'vertical'] | None = 'horizontal',
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ """
+ Parameters:
+ layout: Layout direction.
+ """
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.layout = layout
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("splitter")
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: None) -> None:
+ return payload
+
+ def postprocess(self, value: None) -> None:
+ return value
+
+ def example_payload(self) -> Any:
+ return None
+
+ def example_value(self) -> Any:
+ return None
diff --git a/backend/modelscope_studio/components/antd/splitter/panel/__init__.py b/backend/modelscope_studio/components/antd/splitter/panel/__init__.py
new file mode 100644
index 00000000..46e9e354
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/splitter/panel/__init__.py
@@ -0,0 +1,81 @@
+from __future__ import annotations
+
+from typing import Any
+
+from .....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+
+
+class AntdSplitterPanel(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/splitter
+
+ Split panels to isolate.
+
+ When to use:
+ Can be used to separate areas horizontally or vertically. When you need to freely drag and adjust the size of each area. When you need to specify the maximum and minimum width and height of an area.
+ """
+
+ EVENTS = []
+
+ def __init__(
+ self,
+ props: dict | None = None,
+ *,
+ default_size: str | int | None = None,
+ min: int | str | None = None,
+ max: int | str | None = None,
+ size: int | str | None = None,
+ collapsible: bool | dict = False,
+ resizable: bool = True,
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ """
+ Parameters:
+ default_size: Initial panel size support number for px or 'percent%' usage.
+ min: Minimum threshold support number for px or 'percent%' usage.
+ max: Maximum threshold support number for px or 'percent%' usage.
+ size: Controlled panel size support number for px or 'percent%' usage.
+ collapsible: Quick folding.
+ resizable: Whether to enable drag and drop.
+ """
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.default_size = default_size
+ self.min = min
+ self.max = max
+ self.size = size
+ self.collapsible = collapsible
+ self.resizable = resizable
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("splitter", 'panel')
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: None) -> None:
+ return payload
+
+ def postprocess(self, value: None) -> None:
+ return value
+
+ def example_payload(self) -> Any:
+ return None
+
+ def example_value(self) -> Any:
+ return None
diff --git a/backend/modelscope_studio/components/antd/statistic/__init__.py b/backend/modelscope_studio/components/antd/statistic/__init__.py
new file mode 100644
index 00000000..2b045687
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/statistic/__init__.py
@@ -0,0 +1,79 @@
+from __future__ import annotations
+
+from ....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+from .countdown import AntdStatisticCountdown
+
+
+class AntdStatistic(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/statistic
+ """
+ Countdown = AntdStatisticCountdown
+
+ EVENTS = []
+
+ # supported slots
+ SLOTS = ['prefix', 'suffix', 'title', 'formatter']
+
+ def __init__(
+ self,
+ value: int | float | str | None = None,
+ props: dict | None = None,
+ *,
+ decimal_separator: str | None = None,
+ formatter: str | None = None,
+ group_separator: str | None = None,
+ loading: bool = False,
+ precision: int | float | None = None,
+ prefix: str | None = None,
+ suffix: str | None = None,
+ title: str | None = None,
+ value_style: dict | None = None,
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.value = value
+ self.props = props
+ self.decimal_separator = decimal_separator
+ self.formatter = formatter
+ self.group_separator = group_separator
+ self.loading = loading
+ self.precision = precision
+ self.prefix = prefix
+ self.suffix = suffix
+ self.title = title
+ self.value_style = value_style
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("statistic")
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: None) -> None:
+ return payload
+
+ def postprocess(self, value: None) -> None:
+
+ return value
+
+ def example_payload(self) -> None:
+ return None
+
+ def example_value(self) -> None:
+ return None
diff --git a/backend/modelscope_studio/components/antd/statistic/countdown/__init__.py b/backend/modelscope_studio/components/antd/statistic/countdown/__init__.py
new file mode 100644
index 00000000..560b708f
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/statistic/countdown/__init__.py
@@ -0,0 +1,79 @@
+from __future__ import annotations
+
+from typing import Any
+
+from gradio.events import EventListener
+
+from .....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+
+
+class AntdStatisticCountdown(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/statistic
+ """
+
+ EVENTS = [
+ EventListener("finish",
+ callback=lambda block: block._internal.update(
+ bind_finish_event=True)),
+ EventListener("change",
+ callback=lambda block: block._internal.update(
+ bind_change_event=True)),
+ ]
+
+ # supported slots
+ SLOTS = ['prefix', 'suffix', 'title']
+
+ def __init__(
+ self,
+ value: int | float | None = None,
+ props: dict | None = None,
+ *,
+ format: str | None = None,
+ prefix: str | None = None,
+ suffix: str | None = None,
+ title: str | None = None,
+ value_style: dict | None = None,
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.value = value
+ self.format = format
+ self.prefix = prefix
+ self.suffix = suffix
+ self.title = title
+ self.value_style = value_style
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("statistic", "countdown")
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: str) -> str:
+ return payload
+
+ def postprocess(self, value: str) -> str:
+ return value
+
+ def example_payload(self) -> Any:
+ return None
+
+ def example_value(self) -> Any:
+ return None
diff --git a/backend/modelscope_studio/components/antd/steps/__init__.py b/backend/modelscope_studio/components/antd/steps/__init__.py
new file mode 100644
index 00000000..df2c05d6
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/steps/__init__.py
@@ -0,0 +1,88 @@
+from __future__ import annotations
+
+from typing import Literal
+
+from gradio.events import EventListener
+
+from ....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+from .item import AntdStepsItem
+
+
+class AntdSteps(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/steps
+ """
+ Item = AntdStepsItem
+ EVENTS = [
+ EventListener("change",
+ callback=lambda block: block._internal.update(
+ bind_change_event=True)),
+ ]
+
+ # supported slots
+ SLOTS = ['progressDot', "items"]
+
+ def __init__(
+ self,
+ props: dict | None = None,
+ *,
+ current: int = 0,
+ direction: Literal['vertical', 'horizontal'] = "horizontal",
+ initial: int = 0,
+ label_placement: Literal['horizontal', 'vertical'] = 'horizontal',
+ percent: int | None = None,
+ progress_dot: bool | str = False,
+ responsive: bool = True,
+ size: Literal['small', 'default'] | None = None,
+ status: Literal['wait', 'process', 'finish', 'error'] = 'process',
+ type: Literal['default', 'navigation', 'inline'] = 'default',
+ items: list[dict] | None = None,
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.current = current
+ self.direction = direction
+ self.initial = initial
+ self.label_placement = label_placement
+ self.percent = percent
+ self.progress_dot = progress_dot
+ self.responsive = responsive
+ self.size = size
+ self.status = status
+ self.type = type
+ self.items = items
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("steps")
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: None) -> None:
+ return payload
+
+ def postprocess(self, value: None) -> None:
+
+ return value
+
+ def example_payload(self) -> None:
+ return None
+
+ def example_value(self) -> None:
+ return None
diff --git a/backend/modelscope_studio/components/antd/steps/item/__init__.py b/backend/modelscope_studio/components/antd/steps/item/__init__.py
new file mode 100644
index 00000000..9702c78f
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/steps/item/__init__.py
@@ -0,0 +1,68 @@
+from __future__ import annotations
+
+from typing import Literal
+
+from .....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+
+
+class AntdStepsItem(ModelScopeLayoutComponent):
+ """
+ """
+ EVENTS = []
+
+ # supported slots
+ SLOTS = ['description', "icon", "subTitle", "title"]
+
+ def __init__(
+ self,
+ props: dict | None = None,
+ *,
+ description: str | None = None,
+ disabled: bool | None = False,
+ icon: str | None = None,
+ status: Literal['wait', 'process', 'finish', 'error']
+ | None = None,
+ sub_title: str | None = None,
+ title: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.description = description
+ self.disabled = disabled
+ self.icon = icon
+ self.status = status
+ self.sub_title = sub_title
+ self.title = title
+
+ FRONTEND_DIR = resolve_frontend_dir("steps", "item")
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: None) -> None:
+ return payload
+
+ def postprocess(self, value: None) -> None:
+
+ return value
+
+ def example_payload(self) -> None:
+ return None
+
+ def example_value(self) -> None:
+ return None
diff --git a/backend/modelscope_studio/components/antd/switch/__init__.py b/backend/modelscope_studio/components/antd/switch/__init__.py
new file mode 100644
index 00000000..a9724955
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/switch/__init__.py
@@ -0,0 +1,90 @@
+from __future__ import annotations
+
+from typing import Any, Literal
+
+from gradio.events import EventListener
+
+from ....utils.dev import ModelScopeDataLayoutComponent, resolve_frontend_dir
+
+
+# as inputs, outputs
+class AntdSwitch(ModelScopeDataLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/switch
+ """
+
+ EVENTS = [
+ EventListener("change",
+ callback=lambda block: block._internal.update(
+ bind_change_event=True)),
+ EventListener("click",
+ callback=lambda block: block._internal.update(
+ bind_click_event=True)),
+ ]
+
+ # supported slots
+ SLOTS = ['checkedChildren', 'unCheckedChildren']
+
+ def __init__(
+ self,
+ value: bool | None = False,
+ props: dict | None = None,
+ *,
+ auto_focus: bool | None = None,
+ checked: bool | None = None,
+ checked_children: str | None = None,
+ default_checked: bool | None = None,
+ disabled: bool | None = None,
+ loading: bool | None = None,
+ size: Literal['default', 'small'] | None = None,
+ un_checked_children: str | None = None,
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(value=value,
+ visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.auto_focus = auto_focus
+ self.checked = checked
+ self.checked_children = checked_children
+ self.default_checked = default_checked
+ self.disabled = disabled
+ self.loading = loading
+ self.size = size
+ self.un_checked_children = un_checked_children
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("switch")
+
+ @property
+ def skip_api(self):
+ return False
+
+ def api_info(self) -> dict[str, Any]:
+ return {"type": "boolean"}
+
+ def preprocess(self, payload: None | str) -> None | bool:
+ return payload
+
+ def postprocess(self, value: None | bool) -> None | bool:
+
+ return value
+
+ def example_payload(self) -> None:
+ return None
+
+ def example_value(self) -> None:
+ return None
diff --git a/backend/modelscope_studio/components/antd/table/__init__.py b/backend/modelscope_studio/components/antd/table/__init__.py
new file mode 100644
index 00000000..e2fb8cbd
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/table/__init__.py
@@ -0,0 +1,144 @@
+from __future__ import annotations
+
+from typing import Literal
+
+from gradio.events import EventListener
+
+from ....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+from .column import AntdTableColumn
+from .column_group import AntdTableColumnGroup
+from .constants import (EXPAND_COLUMN, SELECTION_ALL, SELECTION_COLUMN,
+ SELECTION_INVERT, SELECTION_NONE)
+from .expandable import AntdTableExpandable
+from .row_selection import AntdTableRowSelection
+
+
+class AntdTable(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/table
+ """
+ Column = AntdTableColumn
+ ColumnGroup = AntdTableColumnGroup
+ Expandable = AntdTableExpandable
+ RowSelection = AntdTableRowSelection
+
+ # constants
+ EXPAND_COLUMN = EXPAND_COLUMN
+ SELECTION_ALL = SELECTION_ALL
+ SELECTION_COLUMN = SELECTION_COLUMN
+ SELECTION_INVERT = SELECTION_INVERT
+ SELECTION_NONE = SELECTION_NONE
+
+ EVENTS = [
+ EventListener("change",
+ callback=lambda block: block._internal.update(
+ bind_change_event=True)),
+ EventListener("scroll",
+ callback=lambda block: block._internal.update(
+ bind_scroll_event=True)),
+ ]
+
+ # supported slots
+ SLOTS = [
+ 'footer',
+ 'title',
+ 'summary',
+ "expandable",
+ "rowSelection"
+ 'loading.tip',
+ 'loading.indicator',
+ 'pagination.showQuickJumper.goButton',
+ 'pagination.itemRender',
+ 'showSorterTooltip.title',
+ ]
+
+ def __init__(
+ self,
+ data_source: list[dict] | None = None,
+ columns: list[dict] | None = None,
+ props: dict | None = None,
+ *,
+ bordered: bool = False,
+ components: dict | None = None,
+ expandable: dict | None = None,
+ footer: str | None = None,
+ get_popup_container: str | None = None,
+ loading: bool | dict = False,
+ locale: dict | None = None,
+ pagination: bool | dict | None = None,
+ row_class_name: str | None = None,
+ row_key: str | None = None,
+ row_selection: dict | None = None,
+ row_hoverable: bool | None = None,
+ scroll: dict | None = None,
+ show_header: bool = True,
+ show_sorter_tooltip: bool | dict | None = None,
+ size: Literal['large', 'middle', 'small'] | None = None,
+ sort_directions: list[Literal['ascend', 'descend']] | None = None,
+ sticky: bool | dict | None = None,
+ summary: str | None = None,
+ table_layout: Literal['auto', 'fixed'] | None = None,
+ title: str | None = None,
+ virtual: bool | None = None,
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.data_source = data_source
+ self.columns = columns
+ self.bordered = bordered
+ self.components = components
+ self.expandable = expandable
+ self.footer = footer
+ self.get_popup_container = get_popup_container
+ self.loading = loading
+ self.locale = locale
+ self.pagination = pagination
+ self.row_class_name = row_class_name
+ self.row_key = row_key
+ self.row_selection = row_selection
+ self.row_hoverable = row_hoverable
+ self.scroll = scroll
+ self.show_header = show_header
+ self.show_sorter_tooltip = show_sorter_tooltip
+ self.size = size
+ self.sort_directions = sort_directions
+ self.sticky = sticky
+ self.summary = summary
+ self.table_layout = table_layout
+ self.title = title
+ self.virtual = virtual
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("table")
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: None) -> None:
+ return payload
+
+ def postprocess(self, value: None) -> None:
+
+ return value
+
+ def example_payload(self) -> None:
+ return None
+
+ def example_value(self) -> None:
+ return None
diff --git a/backend/modelscope_studio/components/antd/table/column/__init__.py b/backend/modelscope_studio/components/antd/table/column/__init__.py
new file mode 100644
index 00000000..ca210657
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/table/column/__init__.py
@@ -0,0 +1,132 @@
+from __future__ import annotations
+
+from typing import Literal
+
+from gradio.events import EventListener
+
+from .....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+
+
+class AntdTableColumn(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/table
+ """
+ EVENTS = [
+ EventListener("filter_dropdown_open_change",
+ callback=lambda block: block._internal.update(
+ bind_filterDropdownOpenChange_event=True)),
+ ]
+
+ # supported slots
+ SLOTS = [
+ 'filterDropdown', 'filterIcon', 'render', 'title', 'sortIcon',
+ 'showSorterTooltip.title'
+ ]
+
+ def __init__(
+ self,
+ props: dict | None = None,
+ built_in_column: Literal['SELECTION_COLUMN', 'EXPAND_COLUMN']
+ | None = None,
+ *,
+ align: str | None = None,
+ col_span: int | None = None,
+ data_index: str | list[str] | None = None,
+ default_filtered_value: list[str] | None = None,
+ filter_reset_to_default_filtered_value: bool | None = False,
+ default_sort_order: Literal['ascend', 'descend'] | None = None,
+ ellipsis: bool | dict | None = None,
+ filter_dropdown: str | None = None,
+ filter_dropdown_open: bool | None = None,
+ filtered: bool | None = None,
+ filtered_value: list[str] | None = None,
+ filter_icon: str | None = None,
+ filter_on_close: bool | None = None,
+ filter_multiple: bool | None = None,
+ filter_mode: Literal['menu', 'tree'] | None = None,
+ filter_search: bool | str | None = None,
+ filters: list[dict] | None = None,
+ fixed: str | bool | None = None,
+ key: str | None = None,
+ column_render: str | None = None,
+ responsive: list[str] | None = None,
+ row_scope: Literal['row', 'rowgroup'] | None = None,
+ should_cell_update: str | None = None,
+ show_sorter_tooltip: bool | dict | None = None,
+ sort_directions: list[Literal['ascend', 'descend']] | None = None,
+ sorter: bool | dict | str | None = None,
+ sort_order: Literal['ascend', 'descend'] | None = None,
+ sort_icon: str | None = None,
+ title: str | None = None,
+ width: int | float | str | None = None,
+ min_width: int | float | str | None = None,
+ hidden: bool | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.built_in_column = built_in_column
+ self.align = align
+ self.col_span = col_span
+ self.data_index = data_index
+ self.default_filtered_value = default_filtered_value
+ self.filter_reset_to_default_filtered_value = filter_reset_to_default_filtered_value
+ self.default_sort_order = default_sort_order
+ self.ellipsis = ellipsis
+ self.filter_dropdown = filter_dropdown
+ self.filter_dropdown_open = filter_dropdown_open
+ self.filtered = filtered
+ self.filtered_value = filtered_value
+ self.filter_icon = filter_icon
+ self.filter_on_close = filter_on_close
+ self.filter_multiple = filter_multiple
+ self.filter_mode = filter_mode
+ self.filter_search = filter_search
+ self.filters = filters
+ self.fixed = fixed
+ self.key = key
+ self.column_render = column_render
+ self.responsive = responsive
+ self.row_scope = row_scope
+ self.should_cell_update = should_cell_update
+ self.show_sorter_tooltip = show_sorter_tooltip
+ self.sorter = sorter
+ self.sort_directions = sort_directions
+ self.sort_order = sort_order
+ self.sort_icon = sort_icon
+ self.title = title
+ self.width = width
+ self.min_width = min_width
+ self.hidden = hidden
+
+ FRONTEND_DIR = resolve_frontend_dir("table", "column")
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: None) -> None:
+ return payload
+
+ def postprocess(self, value: None) -> None:
+
+ return value
+
+ def example_payload(self) -> None:
+ return None
+
+ def example_value(self) -> None:
+ return None
diff --git a/backend/modelscope_studio/components/antd/table/column_group/__init__.py b/backend/modelscope_studio/components/antd/table/column_group/__init__.py
new file mode 100644
index 00000000..ee3fb2b1
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/table/column_group/__init__.py
@@ -0,0 +1,58 @@
+from __future__ import annotations
+
+from .....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+
+
+class AntdTableColumnGroup(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/table
+ """
+ EVENTS = []
+
+ # supported slots
+ SLOTS = [
+ 'title',
+ ]
+
+ def __init__(
+ self,
+ title: str | None = None,
+ props: dict | None = None,
+ *,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.title = title
+
+ FRONTEND_DIR = resolve_frontend_dir("table", "column-group")
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: None) -> None:
+ return payload
+
+ def postprocess(self, value: None) -> None:
+
+ return value
+
+ def example_payload(self) -> None:
+ return None
+
+ def example_value(self) -> None:
+ return None
diff --git a/backend/modelscope_studio/components/antd/table/constants.py b/backend/modelscope_studio/components/antd/table/constants.py
new file mode 100644
index 00000000..44227dcd
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/table/constants.py
@@ -0,0 +1,5 @@
+EXPAND_COLUMN = "EXPAND_COLUMN"
+SELECTION_COLUMN = "SELECTION_COLUMN"
+SELECTION_ALL = "SELECT_ALL"
+SELECTION_INVERT = "SELECT_INVERT"
+SELECTION_NONE = "SELECT_NONE"
diff --git a/backend/modelscope_studio/components/antd/table/expandable/__init__.py b/backend/modelscope_studio/components/antd/table/expandable/__init__.py
new file mode 100644
index 00000000..8741196b
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/table/expandable/__init__.py
@@ -0,0 +1,93 @@
+from __future__ import annotations
+
+from typing import Literal
+
+from gradio.events import EventListener
+
+from .....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+
+
+class AntdTableExpandable(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/table
+ """
+ EVENTS = [
+ EventListener("expand",
+ callback=lambda block: block._internal.update(
+ bind_expand_event=True)),
+ EventListener("expanded_rows_change",
+ callback=lambda block: block._internal.update(
+ bind_expandedRowsChange_event=True)),
+ ]
+
+ # supported slots
+ SLOTS = ['columnTitle', 'expandIcon', 'expandedRowRender']
+
+ def __init__(
+ self,
+ props: dict | None = None,
+ *,
+ children_column_name: str | None = None,
+ column_title: str | None = None,
+ column_width: int | float | str | None = None,
+ expanded_row_class_name: str | None = None,
+ expanded_row_keys: list[str] | None = None,
+ expanded_row_render: str | None = None,
+ expand_icon: str | None = None,
+ default_expand_all_rows: bool | None = None,
+ default_expanded_row_keys: list[str] | None = None,
+ expand_row_by_click: bool | None = None,
+ fixed: bool | Literal['left', 'right'] | None = None,
+ indent_size: int | float | None = 15,
+ row_expandable: str | None = None,
+ show_expand_column: bool | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.children_column_name = children_column_name
+ self.column_title = column_title
+ self.column_width = column_width
+ self.expanded_row_class_name = expanded_row_class_name
+ self.expanded_row_keys = expanded_row_keys
+ self.expanded_row_render = expanded_row_render
+ self.expand_icon = expand_icon
+ self.default_expand_all_rows = default_expand_all_rows
+ self.default_expanded_row_keys = default_expanded_row_keys
+ self.expand_row_by_click = expand_row_by_click
+ self.fixed = fixed
+ self.indent_size = indent_size
+ self.row_expandable = row_expandable
+ self.show_expand_column = show_expand_column
+
+ FRONTEND_DIR = resolve_frontend_dir("table", "expandable")
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: list[str] | None) -> list[str] | None:
+ return payload
+
+ def postprocess(self, value: list[str] | None) -> list[str] | None:
+
+ return value
+
+ def example_payload(self) -> None:
+ return None
+
+ def example_value(self) -> None:
+ return None
diff --git a/backend/modelscope_studio/components/antd/table/row_selection/__init__.py b/backend/modelscope_studio/components/antd/table/row_selection/__init__.py
new file mode 100644
index 00000000..3b5ad710
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/table/row_selection/__init__.py
@@ -0,0 +1,109 @@
+from __future__ import annotations
+
+from typing import Literal
+
+from gradio.events import EventListener
+
+from .....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+from .selection import AntdTableRowSelectionSelection
+
+
+class AntdTableRowSelection(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/table
+ """
+ Selection = AntdTableRowSelectionSelection
+
+ EVENTS = [
+ EventListener("change",
+ callback=lambda block: block._internal.update(
+ bind_change_event=True)),
+ EventListener("select",
+ callback=lambda block: block._internal.update(
+ bind_select_event=True)),
+ EventListener("select_all",
+ callback=lambda block: block._internal.update(
+ bind_selectAll_event=True)),
+ EventListener("select_invert",
+ callback=lambda block: block._internal.update(
+ bind_selectInvert_event=True)),
+ EventListener("select_none",
+ callback=lambda block: block._internal.update(
+ bind_selectNone_event=True)),
+ EventListener("select_multiple",
+ callback=lambda block: block._internal.update(
+ bind_selectMultiple_event=True)),
+ ]
+
+ # supported slots
+ SLOTS = [
+ 'columnTitle',
+ 'renderCell',
+ 'selections',
+ ]
+
+ def __init__(
+ self,
+ props: dict | None = None,
+ *,
+ check_strictly: bool | None = None,
+ column_title: str | None = None,
+ column_width: int | float | str | None = None,
+ fixed: bool | None = None,
+ get_checkbox_props: str | None = None,
+ hide_select_all: bool | None = None,
+ preserve_selected_rows_keys: bool | None = None,
+ render_cell: str | None = None,
+ selected_row_keys: list[str] | list[int | float] | None = None,
+ default_selected_row_keys: list[str] | list[int | float]
+ | None = None,
+ selections: list[dict] | bool | None = None,
+ type: Literal["checkbox", "radio"] | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.check_strictly = check_strictly
+ self.column_title = column_title
+ self.column_width = column_width
+ self.fixed = fixed
+ self.get_checkbox_props = get_checkbox_props
+ self.hide_select_all = hide_select_all
+ self.preserve_selected_rows_keys = preserve_selected_rows_keys
+ self.render_cell = render_cell
+ self.selected_row_keys = selected_row_keys
+ self.default_selected_row_keys = default_selected_row_keys
+ self.selections = selections
+ self.type = type
+
+ FRONTEND_DIR = resolve_frontend_dir("table", "row-selection")
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: None) -> None:
+ return payload
+
+ def postprocess(self, value: None) -> None:
+
+ return value
+
+ def example_payload(self) -> None:
+ return None
+
+ def example_value(self) -> None:
+ return None
diff --git a/backend/modelscope_studio/components/antd/table/row_selection/selection/__init__.py b/backend/modelscope_studio/components/antd/table/row_selection/selection/__init__.py
new file mode 100644
index 00000000..019b2f52
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/table/row_selection/selection/__init__.py
@@ -0,0 +1,72 @@
+from __future__ import annotations
+
+from typing import Literal
+
+from gradio.events import EventListener
+
+from ......utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+
+
+class AntdTableRowSelectionSelection(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/table
+ """
+ EVENTS = [
+ EventListener("select",
+ callback=lambda block: block._internal.update(
+ bind_select_event=True)),
+ ]
+
+ # supported slots
+ SLOTS = [
+ 'text',
+ ]
+
+ def __init__(
+ self,
+ text: str | None = None,
+ built_in_selection: Literal["SELECT_ALL", "SELECT_INVERT",
+ "SELECT_NONE"] | None = None,
+ props: dict | None = None,
+ *,
+ key: str | int | float | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.key = key
+ self.text = text
+ self.built_in_selection = built_in_selection
+
+ FRONTEND_DIR = resolve_frontend_dir("table",
+ ["row-selection", 'selection'])
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: None) -> None:
+ return payload
+
+ def postprocess(self, value: None) -> None:
+
+ return value
+
+ def example_payload(self) -> None:
+ return None
+
+ def example_value(self) -> None:
+ return None
diff --git a/backend/modelscope_studio/components/antd/tabs/__init__.py b/backend/modelscope_studio/components/antd/tabs/__init__.py
new file mode 100644
index 00000000..18726f41
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/tabs/__init__.py
@@ -0,0 +1,118 @@
+from __future__ import annotations
+
+from typing import Any, Literal
+
+from gradio.events import EventListener
+
+from ....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+from .item import AntdTabsItem
+
+
+class AntdTabs(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/tabs
+ """
+ Item = AntdTabsItem
+ EVENTS = [
+ EventListener("change",
+ callback=lambda block: block._internal.update(
+ bind_change_event=True)),
+ EventListener("edit",
+ callback=lambda block: block._internal.update(
+ bind_edit_event=True)),
+ EventListener("tab_click",
+ callback=lambda block: block._internal.update(
+ bind_tabClick_event=True)),
+ EventListener("tab_scroll",
+ callback=lambda block: block._internal.update(
+ bind_tabScroll_event=True)),
+ ]
+
+ # supported slots
+ SLOTS = [
+ 'addIcon', 'removeIcon', 'renderTabBar', 'tabBarExtraContent',
+ 'tabBarExtraContent.left', 'tabBarExtraContent.right', 'more.icon',
+ 'items'
+ ]
+
+ def __init__(
+ self,
+ props: dict | None = None,
+ *,
+ active_key: str | None = None,
+ add_icon: str | None = None,
+ animated: bool | dict | None = None,
+ centered: bool | None = None,
+ default_active_key: str | None = None,
+ hide_add: bool | None = None,
+ indicator: dict | None = None,
+ items: list[dict] | None = None,
+ more: dict | None = None,
+ remove_icon: str | None = None,
+ popup_class_name: str | None = None,
+ render_tab_bar: str | None = None,
+ size: Literal["small", "middle", "large"] | None = None,
+ tab_bar_extra_content: str | dict | None = None,
+ tab_bar_gutter: int | float | None = None,
+ tab_bar_style: dict | None = None,
+ tab_position: Literal["left", "right", "top", "bottom"]
+ | None = None,
+ destroy_inactive_tab_pane: bool | None = None,
+ type: Literal["card", "line", "editable-card"] | None = None,
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.active_key = active_key
+ self.add_icon = add_icon
+ self.animated = animated
+ self.centered = centered
+ self.default_active_key = default_active_key
+ self.hide_add = hide_add
+ self.indicator = indicator
+ self.items = items
+ self.more = more
+ self.remove_icon = remove_icon
+ self.popup_class_name = popup_class_name
+ self.render_tab_bar = render_tab_bar
+ self.size = size
+ self.tab_bar_extra_content = tab_bar_extra_content
+ self.tab_bar_gutter = tab_bar_gutter
+ self.tab_bar_style = tab_bar_style
+ self.tab_position = tab_position
+ self.destroy_inactive_tab_pane = destroy_inactive_tab_pane
+ self.type = type
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("tabs")
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: str | None) -> str | None:
+ return payload
+
+ def postprocess(self, value: str | None) -> str | None:
+
+ return value
+
+ def example_payload(self) -> None:
+ return None
+
+ def example_value(self) -> None:
+ return None
diff --git a/backend/modelscope_studio/components/antd/tabs/item/__init__.py b/backend/modelscope_studio/components/antd/tabs/item/__init__.py
new file mode 100644
index 00000000..3e481721
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/tabs/item/__init__.py
@@ -0,0 +1,70 @@
+from __future__ import annotations
+
+from .....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+
+
+class AntdTabsItem(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/tabs
+ """
+ EVENTS = []
+
+ # supported slots
+ SLOTS = ['closeIcon', "icon", "label", "children"]
+
+ def __init__(
+ self,
+ props: dict | None = None,
+ *,
+ close_icon: str | None = None,
+ destroy_inactive_tab_pane: bool | None = None,
+ disabled: bool | None = None,
+ force_render: bool | None = None,
+ key: str | None = None,
+ label: str | None = None,
+ icon: str | None = None,
+ closable: bool | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.close_icon = close_icon
+ self.destroy_inactive_tab_pane = destroy_inactive_tab_pane
+ self.disabled = disabled
+ self.force_render = force_render
+ self.key = key
+ self.label = label
+ self.icon = icon
+ self.closable = closable
+
+ FRONTEND_DIR = resolve_frontend_dir("tabs", "item")
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: None) -> None:
+ return payload
+
+ def postprocess(self, value: None) -> None:
+
+ return value
+
+ def example_payload(self) -> None:
+ return None
+
+ def example_value(self) -> None:
+ return None
diff --git a/backend/modelscope_studio/components/antd/tag/__init__.py b/backend/modelscope_studio/components/antd/tag/__init__.py
new file mode 100644
index 00000000..abc7cfaf
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/tag/__init__.py
@@ -0,0 +1,77 @@
+from __future__ import annotations
+
+from typing import Any
+
+from gradio.events import EventListener
+
+from ....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+from .checkable_tag import AntdTagCheckableTag
+
+
+class AntdTag(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/tag
+ """
+ CheckableTag = AntdTagCheckableTag
+
+ EVENTS = [
+ EventListener("close",
+ callback=lambda block: block._internal.update(
+ bind_close_event=True))
+ ]
+
+ # supported slots
+ SLOTS = ['icon', 'closeIcon']
+
+ def __init__(
+ self,
+ value: str | None = "",
+ props: dict | None = None,
+ *,
+ bordered: bool | None = None,
+ close_icon: str | bool | None = None,
+ color: str | None = None,
+ icon: str | None = None,
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.value = value
+ self.props = props
+ self.bordered = bordered
+ self.close_icon = close_icon
+ self.color = color
+ self.icon = icon
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("tag")
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: str | None) -> str | None:
+ return payload
+
+ def postprocess(self, value: str | None) -> str | None:
+
+ return str(value)
+
+ def example_payload(self) -> Any:
+ return "Tag"
+
+ def example_value(self) -> Any:
+ return "Tag"
diff --git a/backend/modelscope_studio/components/antd/tag/checkable_tag/__init__.py b/backend/modelscope_studio/components/antd/tag/checkable_tag/__init__.py
new file mode 100644
index 00000000..f9ffdb64
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/tag/checkable_tag/__init__.py
@@ -0,0 +1,72 @@
+from __future__ import annotations
+
+from typing import Any
+
+from gradio.events import EventListener
+
+from .....utils.dev import ModelScopeDataLayoutComponent, resolve_frontend_dir
+
+
+# as inputs, outputs
+class AntdTagCheckableTag(ModelScopeDataLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/tag
+ """
+
+ EVENTS = [
+ EventListener("change",
+ callback=lambda block: block._internal.update(
+ bind_change_event=True))
+ ]
+
+ def __init__(
+ self,
+ label: str | None = None,
+ value: bool | None = False,
+ props: dict | None = None,
+ *,
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(value=value,
+ visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.label = label
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("tag", 'checkable-tag')
+
+ @property
+ def skip_api(self):
+ return False
+
+ def api_info(self) -> dict[str, Any]:
+ return {
+ "type": "boolean",
+ }
+
+ def preprocess(self, payload: bool | None) -> bool | None:
+ return payload
+
+ def postprocess(self, value: bool | None) -> bool | None:
+
+ return value
+
+ def example_payload(self) -> Any:
+ return None
+
+ def example_value(self) -> Any:
+ return None
diff --git a/backend/modelscope_studio/components/antd/time_picker/__init__.py b/backend/modelscope_studio/components/antd/time_picker/__init__.py
new file mode 100644
index 00000000..cbb1d362
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/time_picker/__init__.py
@@ -0,0 +1,145 @@
+from __future__ import annotations
+
+from typing import Any, Literal
+
+from gradio.events import EventListener
+
+from ....utils.dev import ModelScopeDataLayoutComponent, resolve_frontend_dir
+from .range_picker import AntdTimePickerRangePicker
+
+
+# as inputs, outputs
+class AntdTimePicker(ModelScopeDataLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/time-picker
+ """
+ RangePicker = AntdTimePickerRangePicker
+
+ EVENTS = [
+ EventListener("change",
+ callback=lambda block: block._internal.update(
+ bind_change_event=True)),
+ EventListener("open_change",
+ callback=lambda block: block._internal.update(
+ bind_openChange_event=True)),
+ EventListener("calendar_change",
+ callback=lambda block: block._internal.update(
+ bind_calendarChange_event=True)),
+ ]
+
+ # supported slots
+ SLOTS = [
+ 'allowClear.clearIcon',
+ 'prevIcon',
+ 'nextIcon',
+ 'suffixIcon',
+ 'superNextIcon',
+ 'superPrevIcon',
+ 'renderExtraFooter',
+ 'cellRender',
+ 'panelRender',
+ ]
+
+ def __init__(
+ self,
+ value: str | int | float | None = None,
+ props: dict | None = None,
+ *,
+ allow_clear: bool | dict | None = None,
+ auto_focus: bool | None = None,
+ cell_render: str | None = None,
+ change_on_scroll: bool | None = None,
+ default_value: str | int | float | None = None,
+ disabled: bool | None = None,
+ disabled_time: str | None = None,
+ format: str | None = 'HH:mm:ss',
+ get_popup_container: dict | None = None,
+ hide_disabled_options: bool | None = None,
+ hour_step: int | None = 1,
+ input_read_only: bool | None = False,
+ minute_step: int | None = 1,
+ need_confirm: bool | None = None,
+ open: bool | None = None,
+ placeholder: str | list[str] | None = None,
+ placement: Literal['bottomLeft', 'bottomRight', 'topLeft',
+ 'topRight']
+ | None = 'bottomLeft',
+ popup_class_name: str | None = None,
+ popup_style: dict | None = None,
+ render_extra_footer: str | None = None,
+ second_step: int | None = 1,
+ show_now: bool | None = True,
+ size: Literal['large', 'middle', 'small'] | None = None,
+ status: Literal['error', 'warning'] | None = None,
+ suffix_icon: str | None = None,
+ use_12_hours: bool | None = False,
+ variant: Literal['outlined', 'borderless', 'filled']
+ | None = 'outlined',
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(value=value,
+ visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.allow_clear = allow_clear
+ self.auto_focus = auto_focus
+ self.cell_render = cell_render
+ self.change_on_scroll = change_on_scroll
+ self.default_value = default_value
+ self.disabled = disabled
+ self.disabled_time = disabled_time
+ self.format = format
+ self.get_popup_container = get_popup_container
+ self.hide_disabled_options = hide_disabled_options
+ self.hour_step = hour_step
+ self.input_read_only = input_read_only
+ self.minute_step = minute_step
+ self.need_confirm = need_confirm
+ self.open = open
+ self.placeholder = placeholder
+ self.placement = placement
+ self.popup_class_name = popup_class_name
+ self.popup_style = popup_style
+ self.render_extra_footer = render_extra_footer
+ self.second_step = second_step
+ self.show_now = show_now
+ self.size = size
+ self.status = status
+ self.suffix_icon = suffix_icon
+ self.use_12_hours = use_12_hours
+ self.variant = variant
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("time-picker")
+
+ @property
+ def skip_api(self):
+ return False
+
+ def api_info(self) -> dict[str, Any]:
+ return {"anyOf": [{"type": "number"}, {"type": "string"}]}
+
+ def preprocess(self, payload: int | float) -> int | float:
+ return payload
+
+ def postprocess(self, value: int | float | str) -> int | str:
+ return value
+
+ def example_payload(self) -> None:
+ return None
+
+ def example_value(self) -> None:
+ return None
diff --git a/backend/modelscope_studio/components/antd/time_picker/range_picker/__init__.py b/backend/modelscope_studio/components/antd/time_picker/range_picker/__init__.py
new file mode 100644
index 00000000..a3e4cd8c
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/time_picker/range_picker/__init__.py
@@ -0,0 +1,162 @@
+from __future__ import annotations
+
+from typing import Any, Literal
+
+from gradio.events import EventListener
+
+from .....utils.dev import ModelScopeDataLayoutComponent, resolve_frontend_dir
+
+
+# as inputs, outputs
+class AntdTimePickerRangePicker(ModelScopeDataLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/time-picker
+ """
+
+ EVENTS = [
+ EventListener("change",
+ callback=lambda block: block._internal.update(
+ bind_change_event=True)),
+ EventListener(
+ "calendar_change",
+ callback=lambda block: block._internal.update(bind_ok_event=True)),
+ EventListener("focus",
+ callback=lambda block: block._internal.update(
+ bind_calendarChange_event=True)),
+ EventListener("blur",
+ callback=lambda block: block._internal.update(
+ bind_blur_event=True)),
+ ]
+
+ # supported slots
+ SLOTS = [
+ 'allowClear.clearIcon',
+ 'prevIcon',
+ 'nextIcon',
+ 'suffixIcon',
+ 'superNextIcon',
+ 'superPrevIcon',
+ 'renderExtraFooter',
+ 'separator',
+ 'cellRender',
+ 'panelRender',
+ ]
+
+ def __init__(
+ self,
+ value: tuple[str | int | float, str | int | float] | None = None,
+ props: dict | None = None,
+ *,
+ order: bool = True,
+ allow_clear: bool | dict | None = None,
+ auto_focus: bool | None = None,
+ cell_render: str | None = None,
+ change_on_scroll: bool | None = None,
+ default_value: str | int | float | None = None,
+ disabled: bool | None = None,
+ disabled_time: str | None = None,
+ format: str | None = 'HH:mm:ss',
+ get_popup_container: dict | None = None,
+ hide_disabled_options: bool | None = None,
+ hour_step: int | None = 1,
+ input_read_only: bool | None = False,
+ minute_step: int | None = 1,
+ need_confirm: bool | None = None,
+ open: bool | None = None,
+ placeholder: str | list[str] | None = None,
+ placement: Literal['bottomLeft', 'bottomRight', 'topLeft',
+ 'topRight']
+ | None = 'bottomLeft',
+ popup_class_name: str | None = None,
+ popup_style: dict | None = None,
+ render_extra_footer: str | None = None,
+ second_step: int | None = 1,
+ show_now: bool | None = True,
+ size: Literal['large', 'middle', 'small'] | None = None,
+ status: Literal['error', 'warning'] | None = None,
+ suffix_icon: str | None = None,
+ use_12_hours: bool | None = False,
+ variant: Literal['outlined', 'borderless', 'filled']
+ | None = 'outlined',
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(value=value,
+ visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.order = order
+ self.allow_clear = allow_clear
+ self.auto_focus = auto_focus
+ self.cell_render = cell_render
+ self.change_on_scroll = change_on_scroll
+ self.default_value = default_value
+ self.disabled = disabled
+ self.disabled_time = disabled_time
+ self.format = format
+ self.get_popup_container = get_popup_container
+ self.hide_disabled_options = hide_disabled_options
+ self.hour_step = hour_step
+ self.input_read_only = input_read_only
+ self.minute_step = minute_step
+ self.need_confirm = need_confirm
+ self.open = open
+ self.placeholder = placeholder
+ self.placement = placement
+ self.popup_class_name = popup_class_name
+ self.popup_style = popup_style
+ self.render_extra_footer = render_extra_footer
+ self.second_step = second_step
+ self.show_now = show_now
+ self.size = size
+ self.status = status
+ self.suffix_icon = suffix_icon
+ self.use_12_hours = use_12_hours
+ self.variant = variant
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("time-picker", 'range-picker')
+
+ @property
+ def skip_api(self):
+ return False
+
+ def api_info(self) -> dict[str, Any]:
+ return {
+ "type": "array",
+ "items": {
+ "anyOf": [{
+ "type": "number"
+ }, {
+ "type": "string"
+ }]
+ }
+ }
+
+ def preprocess(
+ self, payload: tuple[str | int | float, str | int | float]
+ ) -> tuple[str | int | float, str | int | float]:
+ return payload
+
+ def postprocess(
+ self, value: tuple[str | int | float, str | int | float]
+ ) -> tuple[str | int | float, str | int | float]:
+ return value
+
+ def example_payload(self) -> None:
+ return None
+
+ def example_value(self) -> None:
+ return None
diff --git a/backend/modelscope_studio/components/antd/timeline/__init__.py b/backend/modelscope_studio/components/antd/timeline/__init__.py
new file mode 100644
index 00000000..5a7768fb
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/timeline/__init__.py
@@ -0,0 +1,70 @@
+from __future__ import annotations
+
+from typing import Literal
+
+from ....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+from .item import AntdTimelineItem
+
+
+class AntdTimeline(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/timeline
+ """
+ Item = AntdTimelineItem
+ EVENTS = []
+
+ # supported slots
+ SLOTS = ['pending', 'pendingDot']
+
+ def __init__(
+ self,
+ props: dict | None = None,
+ *,
+ mode: Literal["left", "alternate", "right"] | None = None,
+ pending: str | bool | None = None,
+ pending_dot: str | None = None,
+ reverse: bool | None = None,
+ items: list[dict] | None = None,
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.mode = mode
+ self.pending = pending
+ self.pending_dot = pending_dot
+ self.reverse = reverse
+ self.items = items
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("timeline")
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: None) -> None:
+ return payload
+
+ def postprocess(self, value: None) -> None:
+
+ return value
+
+ def example_payload(self) -> None:
+ return None
+
+ def example_value(self) -> None:
+ return None
diff --git a/backend/modelscope_studio/components/antd/timeline/item/__init__.py b/backend/modelscope_studio/components/antd/timeline/item/__init__.py
new file mode 100644
index 00000000..dc105958
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/timeline/item/__init__.py
@@ -0,0 +1,64 @@
+from __future__ import annotations
+
+from typing import Literal
+
+from .....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+
+
+class AntdTimelineItem(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/timeline
+ """
+ EVENTS = []
+
+ # supported slots
+ SLOTS = ['dot', "label", "children"]
+
+ def __init__(
+ self,
+ props: dict | None = None,
+ *,
+ color: str | None = None,
+ dot: str | None = None,
+ label: str | None = None,
+ position: Literal["left", "right"] | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.color = color
+ self.dot = dot
+ self.label = label
+ self.position = position
+
+ FRONTEND_DIR = resolve_frontend_dir("timeline", "item")
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: None) -> None:
+ return payload
+
+ def postprocess(self, value: None) -> None:
+
+ return value
+
+ def example_payload(self) -> None:
+ return None
+
+ def example_value(self) -> None:
+ return None
diff --git a/backend/modelscope_studio/components/antd/tooltip/__init__.py b/backend/modelscope_studio/components/antd/tooltip/__init__.py
new file mode 100644
index 00000000..a3cec615
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/tooltip/__init__.py
@@ -0,0 +1,114 @@
+from __future__ import annotations
+
+from typing import Literal
+
+from gradio.events import EventListener
+
+from ....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+
+
+class AntdTooltip(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/tooltip
+ """
+ EVENTS = [
+ EventListener("open_change",
+ callback=lambda block: block._internal.update(
+ bind_openChange_event=True))
+ ]
+
+ # supported slots
+ SLOTS = ['title']
+
+ def __init__(
+ self,
+ title: str | None = "",
+ props: dict | None = None,
+ *,
+ align: dict | None = None,
+ arrow: bool | dict | None = True,
+ auto_adjust_overflow: bool = True,
+ color: str | None = None,
+ default_open: bool = False,
+ destroy_tooltip_on_hide: bool = False,
+ fresh: bool = False,
+ get_popup_container: str | None = None,
+ mouse_enter_delay: float | int = 0.1,
+ mouse_leave_delay: float | int = 0.1,
+ overlay_class_name: str | None = None,
+ overlay_style: dict | None = None,
+ overlay_inner_style: dict | None = None,
+ placement: Literal[
+ 'top',
+ 'left',
+ 'right',
+ 'bottom',
+ 'topLeft',
+ 'topRight',
+ 'bottomLeft',
+ 'bottomRight',
+ 'leftTop',
+ 'leftBottom',
+ 'rightTop',
+ 'rightBottom',
+ ] = 'top',
+ trigger: Literal['hover', 'focus', 'click', 'contextMenu']
+ | list[Literal['hover', 'focus', 'click', 'contextMenu']] = 'hover',
+ open: bool | None = None,
+ z_index: int | None = None,
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.title = title
+ self.props = props
+ self.align = align
+ self.arrow = arrow
+ self.auto_adjust_overflow = auto_adjust_overflow
+ self.color = color
+ self.default_open = default_open
+ self.destroy_tooltip_on_hide = destroy_tooltip_on_hide
+ self.fresh = fresh
+ self.get_popup_container = get_popup_container
+ self.mouse_enter_delay = mouse_enter_delay
+ self.mouse_leave_delay = mouse_leave_delay
+ self.overlay_class_name = overlay_class_name
+ self.overlay_style = overlay_style
+ self.overlay_inner_style = overlay_inner_style
+ self.placement = placement
+ self.trigger = trigger
+ self.open = open
+ self.z_index = z_index
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("tooltip")
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: str | None) -> str | None:
+ return payload
+
+ def postprocess(self, value: str | None) -> str | None:
+
+ return str(value)
+
+ def example_payload(self) -> str:
+ return "Tooltip"
+
+ def example_value(self) -> str:
+ return "Tooltip"
diff --git a/backend/modelscope_studio/components/antd/tour/__init__.py b/backend/modelscope_studio/components/antd/tour/__init__.py
new file mode 100644
index 00000000..52e5dc1e
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/tour/__init__.py
@@ -0,0 +1,102 @@
+from __future__ import annotations
+
+from typing import Literal
+
+from gradio.events import EventListener
+
+from ....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+from .step import AntdTourStep
+
+
+class AntdTour(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/tour
+ """
+ Step = AntdTourStep
+ EVENTS = [
+ EventListener("change",
+ callback=lambda block: block._internal.update(
+ bind_change_event=True)),
+ EventListener("close",
+ callback=lambda block: block._internal.update(
+ bind_close_event=True)),
+ EventListener("finish",
+ callback=lambda block: block._internal.update(
+ bind_finish_event=True)),
+ ]
+
+ # supported slots
+ SLOTS = ['closeIcon', 'indicatorsRender']
+
+ def __init__(
+ self,
+ props: dict | None = None,
+ *,
+ open: bool | None = None,
+ current: int | None = None,
+ arrow: bool | dict | None = True,
+ close_icon: str | None = None,
+ disabled_interaction: bool | None = False,
+ gap: dict | None = None,
+ placement: Literal['center', 'left', 'leftTop', 'leftBottom',
+ 'right'
+ 'rightTop', 'rightBottom', 'top', 'topLeft',
+ 'topRight', 'bottom', 'bottomLeft',
+ 'bottomRight'] = 'bottom',
+ mask: bool | dict = True,
+ type: Literal['default', 'primary'] = 'default',
+ scroll_into_view_options: bool | dict = True,
+ indicators_render: str | None = None,
+ z_index: int | None = None,
+ get_popup_container: str | None = None,
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.open = open
+ self.current = current
+ self.arrow = arrow
+ self.close_icon = close_icon
+ self.disabled_interaction = disabled_interaction
+ self.gap = gap
+ self.placement = placement
+ self.mask = mask
+ self.type = type
+ self.scroll_into_view_options = scroll_into_view_options
+ self.indicators_render = indicators_render
+ self.z_index = z_index
+ self.get_popup_container = get_popup_container
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("tour")
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: None) -> None:
+ return payload
+
+ def postprocess(self, value: None) -> None:
+
+ return value
+
+ def example_payload(self) -> None:
+ return None
+
+ def example_value(self) -> None:
+ return None
diff --git a/backend/modelscope_studio/components/antd/tour/step/__init__.py b/backend/modelscope_studio/components/antd/tour/step/__init__.py
new file mode 100644
index 00000000..2b68fddb
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/tour/step/__init__.py
@@ -0,0 +1,99 @@
+from __future__ import annotations
+
+from typing import Literal
+
+from gradio.events import EventListener
+
+from .....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+
+
+class AntdTourStep(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/tour
+ """
+ EVENTS = [
+ EventListener("close",
+ callback=lambda block: block._internal.update(
+ bind_close_event=True)),
+ EventListener("next_button_props_click",
+ callback=lambda block: block._internal.update(
+ bind_nextButtonProps_click_event=True)),
+ EventListener("prev_button_props_click",
+ callback=lambda block: block._internal.update(
+ bind_prevButtonProps_click_event=True)),
+ ]
+
+ # supported slots
+ SLOTS = [
+ 'closeIcon', "cover", "title", "description",
+ "nextButtonProps.children", "prevButtonProps.children"
+ ]
+
+ def __init__(
+ self,
+ props: dict | None = None,
+ *,
+ get_target: str | None = None,
+ arrow: bool | dict | None = True,
+ close_icon: str | None = None,
+ cover: str | None = None,
+ title: str | None = None,
+ description: str | None = None,
+ placement: Literal['center', 'left', 'leftTop', 'leftBottom',
+ 'right'
+ 'rightTop', 'rightBottom', 'top', 'topLeft',
+ 'topRight', 'bottom', 'bottomLeft',
+ 'bottomRight'] = 'bottom',
+ mask: bool | dict = True,
+ type: Literal['default', 'primary'] = 'default',
+ next_button_props: dict | None = None,
+ prev_button_props: dict | None = None,
+ scroll_into_view_options: bool | dict = True,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.get_target = get_target
+ self.arrow = arrow
+ self.close_icon = close_icon
+ self.cover = cover
+ self.title = title
+ self.description = description
+ self.placement = placement
+ self.mask = mask
+ self.type = type
+ self.next_button_props = next_button_props
+ self.prev_button_props = prev_button_props
+ self.scroll_into_view_options = scroll_into_view_options
+
+ FRONTEND_DIR = resolve_frontend_dir("tour", "step")
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: None) -> None:
+ return payload
+
+ def postprocess(self, value: None) -> None:
+
+ return value
+
+ def example_payload(self) -> None:
+ return None
+
+ def example_value(self) -> None:
+ return None
diff --git a/backend/modelscope_studio/components/antd/transfer/__init__.py b/backend/modelscope_studio/components/antd/transfer/__init__.py
new file mode 100644
index 00000000..0348ac93
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/transfer/__init__.py
@@ -0,0 +1,139 @@
+from __future__ import annotations
+
+from typing import Any, Literal
+
+from gradio.events import EventListener
+
+from ....utils.dev import ModelScopeDataLayoutComponent, resolve_frontend_dir
+
+
+# as inputs, outputs
+class AntdTransfer(ModelScopeDataLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/transfer
+ """
+
+ EVENTS = [
+ EventListener("change",
+ callback=lambda block: block._internal.update(
+ bind_change_event=True)),
+ EventListener("scroll",
+ callback=lambda block: block._internal.update(
+ bind_scroll_event=True)),
+ EventListener("search",
+ callback=lambda block: block._internal.update(
+ bind_search_event=True)),
+ EventListener("select_change",
+ callback=lambda block: block._internal.update(
+ bind_selectChange_event=True)),
+ ]
+
+ # supported slots
+ SLOTS = [
+ 'selectionsIcon', 'titles', 'footer', 'locale.notFoundContent',
+ 'selectAllLabels', 'render'
+ ]
+
+ def __init__(
+ self,
+ value: list[float | int | str] | None = None,
+ props: dict | None = None,
+ *,
+ data_source: list[dict] | None = None,
+ disabled: bool | None = None,
+ selections_icon: str | None = None,
+ filter_option: str | None = None,
+ footer: str | None = None,
+ list_style: dict | str | None = None,
+ locale: dict | None = None,
+ one_way: bool | None = False,
+ operations: list[str] | None = None,
+ operations_style: dict | None = None,
+ pagination: bool | dict | None = False,
+ item_render: str | None = None,
+ select_all_labels: list[str] | None = None,
+ selected_keys: list[str] | list[int | float] | None = None,
+ show_search: bool | None = False,
+ show_select_all: bool | None = True,
+ status: Literal['error', 'warning'] | None = None,
+ target_keys: list[str] | list[int | float] | None = None,
+ titles: list[str] | None = None,
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ key: int | str | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(value=value,
+ visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ key=key,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.data_source = data_source
+ self.disabled = disabled
+ self.selections_icon = selections_icon
+ self.filter_option = filter_option
+ self.footer = footer
+ self.list_style = list_style
+ self.locale = locale
+ self.one_way = one_way
+ self.operations = operations
+ self.operations_style = operations_style
+ self.pagination = pagination
+ self.item_render = item_render
+ self.select_all_labels = select_all_labels
+ self.selected_keys = selected_keys
+ self.show_search = show_search
+ self.show_select_all = show_select_all
+ self.status = status
+ self.target_keys = target_keys
+ self.titles = titles
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("transfer")
+
+ @property
+ def skip_api(self):
+ return False
+
+ def api_info(self) -> dict[str, Any]:
+ return {
+ "type": "array",
+ "items": {
+ "anyOf": [
+ {
+ "type": "string",
+ },
+ {
+ "type": "number",
+ },
+ ],
+ },
+ },
+
+ def preprocess(
+ self, payload: list[float | int | str] | None
+ ) -> list[float | int | str] | None:
+ return payload
+
+ def postprocess(
+ self, value: list[float | int | str] | None
+ ) -> list[float | int | str] | None:
+
+ return value
+
+ def example_payload(self) -> None:
+ return None
+
+ def example_value(self) -> None:
+ return None
diff --git a/backend/modelscope_studio/components/antd/tree/__init__.py b/backend/modelscope_studio/components/antd/tree/__init__.py
new file mode 100644
index 00000000..4825f7e5
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/tree/__init__.py
@@ -0,0 +1,166 @@
+from __future__ import annotations
+
+from typing import Any
+
+from gradio.events import EventListener
+
+from ....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+from .directory_tree import AntdTreeDirectoryTree
+from .tree_node import AntdTreeTreeNode
+
+
+class AntdTree(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/tree
+ """
+ TreeNode = AntdTreeTreeNode
+ DirectoryTree = AntdTreeDirectoryTree
+
+ EVENTS = [
+ EventListener("check",
+ callback=lambda block: block._internal.update(
+ bind_click_event=True)),
+ EventListener("drag_end",
+ callback=lambda block: block._internal.update(
+ bind_dragEnd_event=True)),
+ EventListener("drag_enter",
+ callback=lambda block: block._internal.update(
+ bind_dragEnter_event=True)),
+ EventListener("drag_leave",
+ callback=lambda block: block._internal.update(
+ bind_dragLeave_event=True)),
+ EventListener("drag_over",
+ callback=lambda block: block._internal.update(
+ bind_dragOver_event=True)),
+ EventListener("drag_start",
+ callback=lambda block: block._internal.update(
+ bind_dragStart_event=True)),
+ EventListener("drop",
+ callback=lambda block: block._internal.update(
+ bind_dragDrop_event=True)),
+ EventListener("expand",
+ callback=lambda block: block._internal.update(
+ bind_expand_event=True)),
+ EventListener("load",
+ callback=lambda block: block._internal.update(
+ bind_load_event=True)),
+ EventListener("right_click",
+ callback=lambda block: block._internal.update(
+ bind_rightClick_event=True)),
+ EventListener("select",
+ callback=lambda block: block._internal.update(
+ bind_select_event=True)),
+ EventListener("load_data",
+ callback=lambda block: block._internal.update(
+ bind_loadData_event=True)),
+ ]
+
+ # supported slots
+ SLOTS = [
+ 'switcherLoadingIcon',
+ 'switcherIcon',
+ 'showLine.showLeafIcon',
+ 'icon',
+ 'treeData',
+ 'draggable.icon',
+ ]
+
+ def __init__(
+ self,
+ props: dict | None = None,
+ *,
+ allow_drop: str | None = None,
+ auto_expand_parent: bool | None = None,
+ block_node: bool | None = None,
+ checkable: bool | None = None,
+ checked_keys: list[str] | dict | None = None,
+ check_strictly: bool | None = None,
+ default_checked_keys: list[str] | None = None,
+ default_expand_all: bool | None = None,
+ default_expanded_keys: list[str] | None = None,
+ default_expand_parent: bool | None = None,
+ default_selected_keys: list[str] | None = None,
+ disabled: bool | None = None,
+ draggable: bool | dict | str | None = None,
+ expanded_keys: list[str] | None = None,
+ filed_names: dict | None = None,
+ filter_tree_node: str | None = None,
+ height: int | float | None = None,
+ icon: str | None = None,
+ loaded_keys: list[str] | None = None,
+ multiple: bool | None = None,
+ root_style: dict | None = None,
+ selectable: bool | None = None,
+ selected_keys: list[str] | None = None,
+ show_icon: bool | None = None,
+ show_line: bool | dict | None = None,
+ switcher_icon: str | None = None,
+ title_render: str | None = None,
+ tree_data: list[dict] | None = None,
+ virtual: bool | None = None,
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.allow_drop = allow_drop
+ self.auto_expand_parent = auto_expand_parent
+ self.block_node = block_node
+ self.checkable = checkable
+ self.checked_keys = checked_keys
+ self.check_strictly = check_strictly
+ self.default_checked_keys = default_checked_keys
+ self.default_expand_all = default_expand_all
+ self.default_expanded_keys = default_expanded_keys
+ self.default_expand_parent = default_expand_parent
+ self.default_selected_keys = default_selected_keys
+ self.disabled = disabled
+ self.draggable = draggable
+ self.expanded_keys = expanded_keys
+ self.filed_names = filed_names
+ self.filter_tree_node = filter_tree_node
+ self.height = height
+ self.icon = icon
+ self.loaded_keys = loaded_keys
+ self.multiple = multiple
+ self.root_style = root_style
+ self.selectable = selectable
+ self.selected_keys = selected_keys
+ self.show_icon = show_icon
+ self.show_line = show_line
+ self.switcher_icon = switcher_icon
+ self.title_render = title_render
+ self.tree_data = tree_data
+ self.virtual = virtual
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("tree")
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: None) -> None:
+ return payload
+
+ def postprocess(self, value: None | None) -> None:
+ return value
+
+ def example_payload(self) -> Any:
+ return None
+
+ def example_value(self) -> Any:
+ return None
diff --git a/backend/modelscope_studio/components/antd/tree/directory_tree/__init__.py b/backend/modelscope_studio/components/antd/tree/directory_tree/__init__.py
new file mode 100644
index 00000000..0d987747
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/tree/directory_tree/__init__.py
@@ -0,0 +1,165 @@
+from __future__ import annotations
+
+from typing import Any, Literal
+
+from gradio.events import EventListener
+
+from .....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+
+
+class AntdTreeDirectoryTree(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/tree
+ """
+
+ EVENTS = [
+ EventListener("check",
+ callback=lambda block: block._internal.update(
+ bind_click_event=True)),
+ EventListener("drag_end",
+ callback=lambda block: block._internal.update(
+ bind_dragEnd_event=True)),
+ EventListener("drag_enter",
+ callback=lambda block: block._internal.update(
+ bind_dragEnter_event=True)),
+ EventListener("drag_leave",
+ callback=lambda block: block._internal.update(
+ bind_dragLeave_event=True)),
+ EventListener("drag_over",
+ callback=lambda block: block._internal.update(
+ bind_dragOver_event=True)),
+ EventListener("drag_start",
+ callback=lambda block: block._internal.update(
+ bind_dragStart_event=True)),
+ EventListener("drop",
+ callback=lambda block: block._internal.update(
+ bind_dragDrop_event=True)),
+ EventListener("expand",
+ callback=lambda block: block._internal.update(
+ bind_expand_event=True)),
+ EventListener("load",
+ callback=lambda block: block._internal.update(
+ bind_load_event=True)),
+ EventListener("right_click",
+ callback=lambda block: block._internal.update(
+ bind_rightClick_event=True)),
+ EventListener("select",
+ callback=lambda block: block._internal.update(
+ bind_select_event=True)),
+ EventListener("load_data",
+ callback=lambda block: block._internal.update(
+ bind_loadData_event=True)),
+ ]
+
+ # supported slots
+ SLOTS = [
+ 'switcherLoadingIcon',
+ 'switcherIcon',
+ 'showLine.showLeafIcon',
+ 'icon',
+ 'treeData',
+ 'draggable.icon',
+ ]
+
+ def __init__(
+ self,
+ props: dict | None = None,
+ *,
+ expand_action: Literal['click', 'doubleClick'] | bool
+ | None = None,
+ allow_drop: str | None = None,
+ auto_expand_parent: bool | None = None,
+ block_node: bool | None = None,
+ checkable: bool | None = None,
+ checked_keys: list[str] | dict | None = None,
+ check_strictly: bool | None = None,
+ default_checked_keys: list[str] | None = None,
+ default_expand_all: bool | None = None,
+ default_expanded_keys: list[str] | None = None,
+ default_expand_parent: bool | None = None,
+ default_selected_keys: list[str] | None = None,
+ disabled: bool | None = None,
+ draggable: bool | dict | str | None = None,
+ expanded_keys: list[str] | None = None,
+ filed_names: dict | None = None,
+ filter_tree_node: str | None = None,
+ height: int | float | None = None,
+ icon: str | None = None,
+ loaded_keys: list[str] | None = None,
+ multiple: bool | None = None,
+ root_style: dict | None = None,
+ selectable: bool | None = None,
+ selected_keys: list[str] | None = None,
+ show_icon: bool | None = None,
+ show_line: bool | dict | None = None,
+ switcher_icon: str | None = None,
+ title_render: str | None = None,
+ tree_data: list[dict] | None = None,
+ virtual: bool | None = None,
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.expand_action = expand_action
+ self.allow_drop = allow_drop
+ self.auto_expand_parent = auto_expand_parent
+ self.block_node = block_node
+ self.checkable = checkable
+ self.checked_keys = checked_keys
+ self.check_strictly = check_strictly
+ self.default_checked_keys = default_checked_keys
+ self.default_expand_all = default_expand_all
+ self.default_expanded_keys = default_expanded_keys
+ self.default_expand_parent = default_expand_parent
+ self.default_selected_keys = default_selected_keys
+ self.disabled = disabled
+ self.draggable = draggable
+ self.expanded_keys = expanded_keys
+ self.filed_names = filed_names
+ self.filter_tree_node = filter_tree_node
+ self.height = height
+ self.icon = icon
+ self.loaded_keys = loaded_keys
+ self.multiple = multiple
+ self.root_style = root_style
+ self.selectable = selectable
+ self.selected_keys = selected_keys
+ self.show_icon = show_icon
+ self.show_line = show_line
+ self.switcher_icon = switcher_icon
+ self.title_render = title_render
+ self.tree_data = tree_data
+ self.virtual = virtual
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("tree", "directory-tree")
+
+ @property
+ def skip_api(self):
+ return False
+
+ def preprocess(self, payload: None) -> None:
+ return payload
+
+ def postprocess(self, value: None) -> None:
+ return value
+
+ def example_payload(self) -> Any:
+ return None
+
+ def example_value(self) -> Any:
+ return None
diff --git a/backend/modelscope_studio/components/antd/tree/tree_node/__init__.py b/backend/modelscope_studio/components/antd/tree/tree_node/__init__.py
new file mode 100644
index 00000000..77b1a648
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/tree/tree_node/__init__.py
@@ -0,0 +1,72 @@
+from __future__ import annotations
+
+from typing import Any
+
+from .....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+
+
+class AntdTreeTreeNode(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/tree
+ """
+
+ EVENTS = []
+
+ # supported slots
+ SLOTS = ["title", 'icon']
+
+ def __init__(
+ self,
+ title: str | None = None,
+ props: dict | None = None,
+ *,
+ checkable: bool | None = None,
+ disable_checkbox: bool | None = None,
+ disabled: bool | None = None,
+ icon: str | None = None,
+ is_leaf: bool | None = None,
+ key: str | None = None,
+ selectable: bool | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.title = title
+ self.props = props
+ self.checkable = checkable
+ self.disable_checkbox = disable_checkbox
+ self.disabled = disabled
+ self.icon = icon
+ self.is_leaf = is_leaf
+ self.key = key
+ self.selectable = selectable
+
+ FRONTEND_DIR = resolve_frontend_dir("tree", "tree-node")
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: None) -> None:
+ return payload
+
+ def postprocess(self, value: None) -> None:
+ return value
+
+ def example_payload(self) -> Any:
+ return None
+
+ def example_value(self) -> Any:
+ return None
diff --git a/backend/modelscope_studio/components/antd/tree_select/__init__.py b/backend/modelscope_studio/components/antd/tree_select/__init__.py
new file mode 100644
index 00000000..5f3c82f1
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/tree_select/__init__.py
@@ -0,0 +1,204 @@
+from __future__ import annotations
+
+from typing import Any, Literal
+
+from gradio.events import EventListener
+
+from ....utils.dev import ModelScopeDataLayoutComponent, resolve_frontend_dir
+from .tree_node import AntdTreeSelectTreeNode
+
+
+# as inputs, outputs
+class AntdTreeSelect(ModelScopeDataLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/tree-select
+ """
+ TreeNode = AntdTreeSelectTreeNode
+
+ EVENTS = [
+ EventListener("change",
+ callback=lambda block: block._internal.update(
+ bind_change_event=True)),
+ EventListener("select",
+ callback=lambda block: block._internal.update(
+ bind_select_event=True)),
+ EventListener("search",
+ callback=lambda block: block._internal.update(
+ bind_search_event=True)),
+ EventListener("tree_expand",
+ callback=lambda block: block._internal.update(
+ bind_treeExpand_event=True)),
+ EventListener("popup_scroll",
+ callback=lambda block: block._internal.update(
+ bind_popupScroll_event=True)),
+ EventListener("dropdown_visible_change",
+ callback=lambda block: block._internal.update(
+ bind_dropdownVisibleChange_event=True)),
+ EventListener("load_data",
+ callback=lambda block: block._internal.update(
+ bind_loadData_event=True)),
+ ]
+
+ # supported slots
+ SLOTS = [
+ 'allowClear.clearIcon',
+ 'maxTagPlaceholder',
+ 'notFoundContent',
+ 'suffixIcon',
+ 'switcherIcon',
+ 'dropdownRender',
+ 'tagRender',
+ 'treeTitleRender',
+ ]
+
+ def __init__(
+ self,
+ value: str | list[str] | None = None,
+ props: dict | None = None,
+ *,
+ allow_clear: bool | dict | None = None,
+ auto_clear_search_value: bool | None = True,
+ auto_focus: bool | None = None,
+ default_value: str | list[str] | None = None,
+ disabled: bool | None = False,
+ popup_class_name: str | None = None,
+ popup_match_select_width: bool | float | int | None = True,
+ dropdown_render: str | None = None,
+ dropdown_style: dict | None = None,
+ field_names: dict | None = None,
+ filter_tree_node: str | bool | None = None,
+ get_popup_container: dict | None = None,
+ label_in_value: bool | None = False,
+ list_height: int | None = 256,
+ loading: bool | None = None,
+ max_tag_count: int | None = None,
+ max_tag_placeholder: str | None = None,
+ max_tag_text_length: int | None = None,
+ multiple: bool | None = None,
+ not_found_content: str | None = None,
+ placeholder: str | None = None,
+ placement: Literal['bottomLeft', 'bottomRight', 'topLeft',
+ 'topRight'] | None = 'bottomLeft',
+ search_value: str | None = None,
+ show_checked_strategy: Literal['SHOW_ALL', 'SHOW_PARENT',
+ 'SHOW_CHILD'] | None = None,
+ show_search: bool | None = None,
+ size: Literal['large', 'middle', 'small'] | None = None,
+ status: Literal['error', 'warning'] | None = None,
+ suffix_icon: str | None = None,
+ switcher_icon: str | None = None,
+ tag_render: str | None = None,
+ tree_checkable: bool | None = False,
+ tree_check_strictly: bool | None = False,
+ tree_data: list[dict] | None = None,
+ tree_data_simple_mode: bool | dict | None = False,
+ tree_title_render: str | None = None,
+ tree_default_expand_all: bool | None = False,
+ tree_default_expanded_keys: list[str] | None = None,
+ tree_expand_action: str | bool = False,
+ tree_expanded_keys: list[str] | None = None,
+ tree_icon: bool | None = None,
+ tree_line: bool | dict | None = None,
+ tree_loaded_keys: list[str] | None = None,
+ tree_node_filter_prop: str | None = None,
+ tree_node_label_prop: str | None = None,
+ variant: Literal['outline', 'borderless', 'solid']
+ | None = 'outline',
+ virtual: bool | None = True,
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(value=value,
+ visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.allow_clear = allow_clear
+ self.auto_focus = auto_focus
+ self.auto_clear_search_value = auto_clear_search_value
+ self.default_value = default_value
+ self.disabled = disabled
+ self.popup_class_name = popup_class_name
+ self.popup_match_select_width = popup_match_select_width
+ self.dropdown_render = dropdown_render
+ self.dropdown_style = dropdown_style
+ self.field_names = field_names
+ self.filter_tree_node = filter_tree_node
+ self.get_popup_container = get_popup_container
+ self.label_in_value = label_in_value
+ self.list_height = list_height
+ self.loading = loading
+ self.max_tag_count = max_tag_count
+ self.max_tag_placeholder = max_tag_placeholder
+ self.max_tag_text_length = max_tag_text_length
+ self.multiple = multiple
+ self.not_found_content = not_found_content
+ self.placeholder = placeholder
+ self.placement = placement
+ self.search_value = search_value
+ self.show_checked_strategy = show_checked_strategy
+ self.show_search = show_search
+ self.size = size
+ self.status = status
+ self.suffix_icon = suffix_icon
+ self.switcher_icon = switcher_icon
+ self.tag_render = tag_render
+ self.tree_checkable = tree_checkable
+ self.tree_check_strictly = tree_check_strictly
+ self.tree_data = tree_data
+ self.tree_data_simple_mode = tree_data_simple_mode
+ self.tree_title_render = tree_title_render
+ self.tree_default_expand_all = tree_default_expand_all
+ self.tree_default_expanded_keys = tree_default_expanded_keys
+ self.tree_expand_action = tree_expand_action
+ self.tree_expanded_keys = tree_expanded_keys
+ self.tree_icon = tree_icon
+ self.tree_line = tree_line
+ self.tree_loaded_keys = tree_loaded_keys
+ self.tree_node_filter_prop = tree_node_filter_prop
+ self.tree_node_label_prop = tree_node_label_prop
+ self.variant = variant
+ self.virtual = virtual
+ self.root_class_name = root_class_name
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("tree-select")
+
+ @property
+ def skip_api(self):
+ return False
+
+ def api_info(self) -> dict[str, Any]:
+ return {
+ "anyOf": [{
+ "type": "string"
+ }, {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }]
+ }
+
+ def preprocess(self, payload: str | list[str]) -> str | list[str]:
+ return payload
+
+ def postprocess(self, value: str | list[str] | None) -> str | list[str]:
+ return value
+
+ def example_payload(self) -> Any:
+ return None
+
+ def example_value(self) -> Any:
+ return None
diff --git a/backend/modelscope_studio/components/antd/tree_select/tree_node/__init__.py b/backend/modelscope_studio/components/antd/tree_select/tree_node/__init__.py
new file mode 100644
index 00000000..6d960dd0
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/tree_select/tree_node/__init__.py
@@ -0,0 +1,72 @@
+from __future__ import annotations
+
+from typing import Any
+
+from .....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+
+
+class AntdTreeSelectTreeNode(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/tree-select
+ """
+
+ EVENTS = []
+
+ # supported slots
+ SLOTS = ["title"]
+
+ def __init__(
+ self,
+ value: str | None = None,
+ title: str | None = None,
+ props: dict | None = None,
+ *,
+ disabled: bool = False,
+ selectable: bool = True,
+ checkable: bool | None = None,
+ disable_checkbox: bool = False,
+ is_leaf: bool = False,
+ key: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.value = value
+ self.title = title
+ self.disabled = disabled
+ self.selectable = selectable
+ self.checkable = checkable
+ self.disable_checkbox = disable_checkbox
+ self.is_leaf = is_leaf
+ self.key = key
+ self.props = props
+
+ FRONTEND_DIR = resolve_frontend_dir("tree-select", "tree-node")
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: None) -> None:
+ return payload
+
+ def postprocess(self, value: None) -> None:
+ return value
+
+ def example_payload(self) -> Any:
+ return None
+
+ def example_value(self) -> Any:
+ return None
diff --git a/backend/modelscope_studio/components/antd/typography/__init__.py b/backend/modelscope_studio/components/antd/typography/__init__.py
new file mode 100644
index 00000000..213b9805
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/typography/__init__.py
@@ -0,0 +1,11 @@
+from .link import AntdTypographyLink
+from .paragraph import AntdTypographyParagraph
+from .text import AntdTypographyText
+from .title import AntdTypographyTitle
+
+
+class AntdTypography:
+ Text = AntdTypographyText
+ Title = AntdTypographyTitle
+ Paragraph = AntdTypographyParagraph
+ Link = AntdTypographyLink
diff --git a/backend/modelscope_studio/components/antd/typography/link/__init__.py b/backend/modelscope_studio/components/antd/typography/link/__init__.py
new file mode 100644
index 00000000..9adfa26d
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/typography/link/__init__.py
@@ -0,0 +1,144 @@
+from __future__ import annotations
+
+from typing import Any, Literal
+
+from gradio.events import EventListener
+
+from .....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+
+
+class AntdTypographyLink(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/typography
+
+ Basic text writing, including headings, body text, lists, and more.
+
+ When to use:
+ - When you need to display a title or paragraph contents in Articles/Blogs/Notes.
+ - When you need copyable/editable/ellipsis texts.
+ """
+
+ EVENTS = [
+ EventListener("click",
+ callback=lambda block: block._internal.update(
+ bind_click_event=True),
+ doc="Set the handler to handle click event."),
+ EventListener("copyable_copy",
+ callback=lambda block: block._internal.update(
+ bind_copyable_copy_event=True),
+ doc="Called when copied text."),
+ EventListener("editable_change",
+ callback=lambda block: block._internal.update(
+ bind_editable_change_event=True),
+ doc="Called when input at textarea."),
+ EventListener("editable_cancel",
+ callback=lambda block: block._internal.update(
+ bind_editable_cancel_event=True),
+ doc="Called when type ESC to exit editable state."),
+ EventListener("editable_start",
+ callback=lambda block: block._internal.update(
+ bind_editable_start_event=True),
+ doc="Called when enter editable state."),
+ EventListener("editable_end",
+ callback=lambda block: block._internal.update(
+ bind_editable_end_event=True),
+ doc="Called when type ENTER to exit editable state."),
+ ]
+
+ # supported slots
+ SLOTS = [
+ 'copyable.icon',
+ 'copyable.tooltips',
+ 'editable.icon',
+ 'editable.tooltip',
+ 'editable.enterIcon',
+ ]
+
+ def __init__(
+ self,
+ value: str | None = "",
+ props: dict | None = None,
+ *,
+ href: str | None = None,
+ href_target: str | None = None,
+ code: bool = False,
+ copyable: bool | dict = False,
+ delete: bool = False,
+ disabled: bool = False,
+ editable: bool | dict = False,
+ ellipsis: bool = False,
+ keyboard: bool = False,
+ mark: bool = False,
+ strong: bool = False,
+ italic: bool = False,
+ type: Literal['secondary', 'success', 'warning', 'danger']
+ | None = None,
+ underline: bool = False,
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ """
+ Parameters:
+ code: Code style.
+ copyable: Whether to be copyable, customize it via setting an object.
+ delete: Deleted line style.
+ disabled: Disabled content.
+ editable: If editable. Can control edit state when is object.
+ ellipsis: Display ellipsis when text overflows.
+ keyboard: Keyboard style.
+ mark: Marked style.
+ strong: Bold style.
+ italic: Italic style.
+ type: Content type.
+ underline: Underlined style.
+ """
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.value = value
+ self.props = props
+ self.code = code
+ self.copyable = copyable
+ self.delete = delete
+ self.disabled = disabled
+ self.editable = editable
+ self.ellipsis = ellipsis
+ self.keyboard = keyboard
+ self.mark = mark
+ self.strong = strong
+ self.italic = italic
+ self.type = type
+ self.underline = underline
+ self.href = href
+ self.href_target = href_target
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("typography", "link")
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: str | None) -> str | None:
+ return payload
+
+ def postprocess(self, value: str | None) -> str | None:
+
+ return str(value)
+
+ def example_payload(self) -> Any:
+ return "Hello"
+
+ def example_value(self) -> Any:
+ return "Hello"
diff --git a/backend/modelscope_studio/components/antd/typography/paragraph/__init__.py b/backend/modelscope_studio/components/antd/typography/paragraph/__init__.py
new file mode 100644
index 00000000..48f07710
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/typography/paragraph/__init__.py
@@ -0,0 +1,155 @@
+from __future__ import annotations
+
+from typing import Any, Literal
+
+from gradio.events import EventListener
+
+from .....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+
+
+class AntdTypographyParagraph(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/typography
+
+ Basic text writing, including headings, body text, lists, and more.
+
+ When to use:
+ - When you need to display a title or paragraph contents in Articles/Blogs/Notes.
+ - When you need copyable/editable/ellipsis texts.
+ """
+
+ EVENTS = [
+ EventListener("click",
+ callback=lambda block: block._internal.update(
+ bind_click_event=True),
+ doc="Set the handler to handle click event."),
+ EventListener("copyable_copy",
+ callback=lambda block: block._internal.update(
+ bind_copyable_copy_event=True),
+ doc="Called when copied text."),
+ EventListener("editable_change",
+ callback=lambda block: block._internal.update(
+ bind_editable_change_event=True),
+ doc="Called when input at textarea."),
+ EventListener("editable_cancel",
+ callback=lambda block: block._internal.update(
+ bind_editable_cancel_event=True),
+ doc="Called when type ESC to exit editable state."),
+ EventListener("editable_start",
+ callback=lambda block: block._internal.update(
+ bind_editable_start_event=True),
+ doc="Called when enter editable state."),
+ EventListener("editable_end",
+ callback=lambda block: block._internal.update(
+ bind_editable_end_event=True),
+ doc="Called when type ENTER to exit editable state."),
+ EventListener("ellipsis_ellipsis",
+ callback=lambda block: block._internal.update(
+ bind_ellipsis_ellipsis_event=True),
+ doc="Called when enter or leave ellipsis state."),
+ EventListener(
+ "ellipsis_tooltip_open_change",
+ callback=lambda block: block._internal.update(
+ bind_ellipsis_tooltip_openChange_event=True),
+ doc=
+ "Callback executed when visibility of the tooltip card is changed."
+ ),
+ EventListener("ellipsis_expand",
+ callback=lambda block: block._internal.update(
+ bind_ellipsis_expand_event=True),
+ doc="Called when expand content."),
+ ]
+
+ # supported slots
+ SLOTS = [
+ 'copyable.icon',
+ 'copyable.tooltips',
+ 'editable.icon',
+ 'editable.tooltip',
+ 'editable.enterIcon',
+ 'ellipsis.symbol',
+ 'ellipsis.tooltip',
+ 'ellipsis.tooltip.title',
+ ]
+
+ def __init__(
+ self,
+ value: str | None = "",
+ props: dict | None = None,
+ *,
+ code: bool = False,
+ copyable: bool | dict = False,
+ delete: bool = False,
+ disabled: bool = False,
+ editable: bool | dict = False,
+ ellipsis: bool | dict = False,
+ mark: bool = False,
+ strong: bool = False,
+ italic: bool = False,
+ type: Literal['secondary', 'success', 'warning', 'danger']
+ | None = None,
+ underline: bool = False,
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ """
+ Parameters:
+ code: Code style.
+ copyable: Whether to be copyable, customize it via setting an object.
+ delete: Deleted line style.
+ disabled: Disabled content.
+ editable: If editable. Can control edit state when is object.
+ ellipsis: Display ellipsis when text overflows, can configure rows and expandable by using object.
+ mark: Marked style.
+ strong: Bold style.
+ italic: Italic style.
+ type: Content type.
+ underline: Underlined style.
+ """
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.value = value
+ self.props = props
+ self.code = code
+ self.copyable = copyable
+ self.delete = delete
+ self.disabled = disabled
+ self.editable = editable
+ self.ellipsis = ellipsis
+ self.mark = mark
+ self.strong = strong
+ self.italic = italic
+ self.type = type
+ self.underline = underline
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("typography", "paragraph")
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: str | None) -> str | None:
+ return payload
+
+ def postprocess(self, value: str | None) -> str | None:
+
+ return str(value)
+
+ def example_payload(self) -> Any:
+ return "Hello"
+
+ def example_value(self) -> Any:
+ return "Hello"
diff --git a/backend/modelscope_studio/components/antd/typography/text/__init__.py b/backend/modelscope_studio/components/antd/typography/text/__init__.py
new file mode 100644
index 00000000..f3734322
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/typography/text/__init__.py
@@ -0,0 +1,154 @@
+from __future__ import annotations
+
+from typing import Any, Literal
+
+from gradio.events import EventListener
+
+from .....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+
+
+class AntdTypographyText(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/typography
+
+ Basic text writing, including headings, body text, lists, and more.
+
+ When to use:
+ - When you need to display a title or paragraph contents in Articles/Blogs/Notes.
+ - When you need copyable/editable/ellipsis texts.
+ """
+
+ EVENTS = [
+ EventListener("click",
+ callback=lambda block: block._internal.update(
+ bind_click_event=True),
+ doc="Set the handler to handle click event."),
+ EventListener("copyable_copy",
+ callback=lambda block: block._internal.update(
+ bind_copyable_copy_event=True),
+ doc="Called when copied text."),
+ EventListener("editable_change",
+ callback=lambda block: block._internal.update(
+ bind_editable_change_event=True),
+ doc="Called when input at textarea."),
+ EventListener("editable_cancel",
+ callback=lambda block: block._internal.update(
+ bind_editable_cancel_event=True),
+ doc="Called when type ESC to exit editable state."),
+ EventListener("editable_start",
+ callback=lambda block: block._internal.update(
+ bind_editable_start_event=True),
+ doc="Called when enter editable state."),
+ EventListener("editable_end",
+ callback=lambda block: block._internal.update(
+ bind_editable_end_event=True),
+ doc="Called when type ENTER to exit editable state."),
+ EventListener("ellipsis_ellipsis",
+ callback=lambda block: block._internal.update(
+ bind_ellipsis_ellipsis_event=True),
+ doc="Called when enter or leave ellipsis state."),
+ EventListener(
+ "ellipsis_tooltip_open_change",
+ callback=lambda block: block._internal.update(
+ bind_ellipsis_tooltip_openChange_event=True),
+ doc=
+ "Callback executed when visibility of the tooltip card is changed."
+ ),
+ ]
+
+ # supported slots
+ SLOTS = [
+ 'copyable.icon',
+ 'copyable.tooltips',
+ 'editable.icon',
+ 'editable.tooltip',
+ 'editable.enterIcon',
+ 'ellipsis.symbol',
+ 'ellipsis.tooltip',
+ 'ellipsis.tooltip.title',
+ ]
+
+ def __init__(
+ self,
+ value: str | None = "",
+ props: dict | None = None,
+ *,
+ code: bool = False,
+ copyable: bool | dict = False,
+ delete: bool = False,
+ disabled: bool = False,
+ editable: bool | dict = False,
+ ellipsis: bool | dict = False,
+ keyboard: bool = False,
+ mark: bool = False,
+ strong: bool = False,
+ italic: bool = False,
+ type: Literal['secondary', 'success', 'warning', 'danger']
+ | None = None,
+ underline: bool = False,
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ """
+ Parameters:
+ code: Code style.
+ copyable: Whether to be copyable, customize it via setting an object.
+ delete: Deleted line style.
+ disabled: Disabled content.
+ editable: If editable. Can control edit state when is object.
+ ellipsis: Display ellipsis when text overflows, can't configure expandable、rows and onExpand by using object. Diff with Typography.Paragraph, Text do not have 100% width style which means it will fix width on the first ellipsis. If you want to have responsive ellipsis, please set width manually.
+ keyboard: Keyboard style.
+ mark: Marked style.
+ strong: Bold style.
+ italic: Italic style.
+ type: Content type.
+ underline: Underlined style.
+ """
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.value = value
+ self.props = props
+ self.code = code
+ self.copyable = copyable
+ self.delete = delete
+ self.disabled = disabled
+ self.editable = editable
+ self.ellipsis = ellipsis
+ self.keyboard = keyboard
+ self.mark = mark
+ self.strong = strong
+ self.italic = italic
+ self.type = type
+ self.underline = underline
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("typography", "text")
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: str | None) -> str | None:
+ return payload
+
+ def postprocess(self, value: str | None) -> str | None:
+
+ return str(value)
+
+ def example_payload(self) -> Any:
+ return "Hello"
+
+ def example_value(self) -> Any:
+ return "Hello"
diff --git a/backend/modelscope_studio/components/antd/typography/title/__init__.py b/backend/modelscope_studio/components/antd/typography/title/__init__.py
new file mode 100644
index 00000000..cffcde10
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/typography/title/__init__.py
@@ -0,0 +1,155 @@
+from __future__ import annotations
+
+from typing import Any, Literal
+
+from gradio.events import EventListener
+
+from .....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+
+
+class AntdTypographyTitle(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/typography
+
+ Basic text writing, including headings, body text, lists, and more.
+
+ When to use:
+ - When you need to display a title or paragraph contents in Articles/Blogs/Notes.
+ - When you need copyable/editable/ellipsis texts.
+ """
+
+ EVENTS = [
+ EventListener("click",
+ callback=lambda block: block._internal.update(
+ bind_click_event=True),
+ doc="Set the handler to handle click event."),
+ EventListener("copyable_copy",
+ callback=lambda block: block._internal.update(
+ bind_copyable_copy_event=True),
+ doc="Called when copied text."),
+ EventListener("editable_change",
+ callback=lambda block: block._internal.update(
+ bind_editable_change_event=True),
+ doc="Called when input at textarea."),
+ EventListener("editable_cancel",
+ callback=lambda block: block._internal.update(
+ bind_editable_cancel_event=True),
+ doc="Called when type ESC to exit editable state."),
+ EventListener("editable_start",
+ callback=lambda block: block._internal.update(
+ bind_editable_start_event=True),
+ doc="Called when enter editable state."),
+ EventListener("editable_end",
+ callback=lambda block: block._internal.update(
+ bind_editable_end_event=True),
+ doc="Called when type ENTER to exit editable state."),
+ EventListener("ellipsis_ellipsis",
+ callback=lambda block: block._internal.update(
+ bind_ellipsis_ellipsis_event=True),
+ doc="Called when enter or leave ellipsis state."),
+ EventListener(
+ "ellipsis_tooltip_open_change",
+ callback=lambda block: block._internal.update(
+ bind_ellipsis_tooltip_openChange_event=True),
+ doc=
+ "Callback executed when visibility of the tooltip card is changed."
+ ),
+ EventListener("ellipsis_expand",
+ callback=lambda block: block._internal.update(
+ bind_ellipsis_expand_event=True),
+ doc="Called when expand content."),
+ ]
+
+ # supported slots
+ SLOTS = [
+ 'copyable.icon',
+ 'copyable.tooltips',
+ 'editable.icon',
+ 'editable.tooltip',
+ 'editable.enterIcon',
+ 'ellipsis.symbol',
+ 'ellipsis.tooltip',
+ 'ellipsis.tooltip.title',
+ ]
+
+ def __init__(
+ self,
+ value: str | None = "",
+ props: dict | None = None,
+ *,
+ code: bool = False,
+ copyable: bool | dict = False,
+ delete: bool = False,
+ disabled: bool = False,
+ editable: bool | dict = False,
+ ellipsis: bool | dict = False,
+ level: Literal[1, 2, 3, 4, 5] = 1,
+ mark: bool = False,
+ italic: bool = False,
+ type: Literal['secondary', 'success', 'warning', 'danger']
+ | None = None,
+ underline: bool = False,
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ """
+ Parameters:
+ code: Code style.
+ copyable: Whether to be copyable, customize it via setting an object.
+ delete: Deleted line style.
+ disabled: Disabled content.
+ editable: If editable. Can control edit state when is object.
+ ellipsis: Display ellipsis when text overflows, can configure rows and expandable by using object.
+ level: Set content importance. Match with h1, h2, h3, h4, h5.
+ mark: Marked style.
+ italic: Italic style.
+ type: Content type.
+ underline: Underlined style.
+ """
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.value = value
+ self.props = props
+ self.code = code
+ self.copyable = copyable
+ self.delete = delete
+ self.disabled = disabled
+ self.editable = editable
+ self.ellipsis = ellipsis
+ self.level = level
+ self.mark = mark
+ self.italic = italic
+ self.type = type
+ self.underline = underline
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("typography", "title")
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: str | None) -> str | None:
+ return payload
+
+ def postprocess(self, value: str | None) -> str | None:
+
+ return str(value)
+
+ def example_payload(self) -> Any:
+ return "Hello"
+
+ def example_value(self) -> Any:
+ return "Hello"
diff --git a/backend/modelscope_studio/components/antd/upload/__init__.py b/backend/modelscope_studio/components/antd/upload/__init__.py
new file mode 100644
index 00000000..362428a6
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/upload/__init__.py
@@ -0,0 +1,205 @@
+from __future__ import annotations
+
+import tempfile
+from pathlib import Path
+from typing import TYPE_CHECKING, Any, Callable, Literal
+
+import gradio_client.utils as client_utils
+from gradio import processing_utils
+from gradio.components.base import Component
+from gradio.data_classes import FileData, ListFiles
+from gradio.events import EventListener
+from gradio.utils import NamedString
+from gradio_client import handle_file
+
+from ....utils.dev import ModelScopeDataLayoutComponent, resolve_frontend_dir
+from .dragger import AntdUploadDragger
+
+if TYPE_CHECKING:
+ from gradio.components import Timer
+
+
+# as inputs, outputs
+class AntdUpload(ModelScopeDataLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/upload
+ """
+ Dragger = AntdUploadDragger
+
+ EVENTS = [
+ EventListener("change",
+ callback=lambda block: block._internal.update(
+ bind_click_event=True)),
+ EventListener("drop",
+ callback=lambda block: block._internal.update(
+ bind_drop_event=True)),
+ EventListener("download",
+ callback=lambda block: block._internal.update(
+ bind_download_event=True)),
+ EventListener("preview",
+ callback=lambda block: block._internal.update(
+ bind_preview_event=True)),
+ EventListener("remove",
+ callback=lambda block: block._internal.update(
+ bind_remove_event=True))
+ ]
+
+ # supported slots
+ SLOTS = [
+ 'showUploadList.extra',
+ 'showUploadList.previewIcon',
+ 'showUploadList.removeIcon',
+ 'showUploadList.downloadIcon',
+ 'iconRender',
+ 'itemRender',
+ ]
+
+ data_model = ListFiles
+
+ def __init__(
+ self,
+ value: list[str] | Callable | None = None,
+ props: dict | None = None,
+ *,
+ accept: str | None = None,
+ action: str | None = None,
+ before_upload: str | None = None,
+ custom_request: str | None = None,
+ data: dict | str | None = None,
+ default_file_list: list[dict] | None = None,
+ directory: bool | None = False,
+ disabled: bool = False,
+ file_list: list[dict] | None = None,
+ headers: dict | None = None,
+ icon_render: str | None = None,
+ is_image_url: str | None = None,
+ item_render: str | None = None,
+ list_type: Literal['text', 'picture', 'picture-card',
+ 'picture-circle'] | None = None,
+ max_count: int | None = None,
+ method: str | None = None,
+ multiple: bool | None = False,
+ form_name: str | None = None,
+ open_file_dialog_on_click: bool | None = True,
+ preview_file: str | None = None,
+ progress: dict | None = None,
+ show_upload_list: bool | dict | None = True,
+ with_credentials: bool | None = False,
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ key: int | str | None = None,
+ every: Timer | float | None = None,
+ inputs: Component | list[Component] | set[Component] | None = None,
+ render: bool = True,
+ **kwargs):
+
+ super().__init__(as_item=as_item,
+ visible=visible,
+ value=value,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ key=key,
+ elem_style=elem_style,
+ every=every,
+ inputs=inputs,
+ render=render,
+ **kwargs)
+ self.props = props
+ self.accept = accept
+ self.action = action
+ self.before_upload = before_upload
+ self.custom_request = custom_request
+ self.data = data
+ self.default_file_list = default_file_list
+ self.directory = directory
+ self.disabled = disabled
+ self.file_list = file_list
+ self.headers = headers
+ self.icon_render = icon_render
+ self.is_image_url = is_image_url
+ self.item_render = item_render
+ self.list_type = list_type
+ self.max_count = max_count
+ self.method = method
+ self.multiple = multiple
+ self.form_name = form_name
+ self.open_file_dialog_on_click = open_file_dialog_on_click
+ self.preview_file = preview_file
+ self.progress = progress
+ self.show_upload_list = show_upload_list
+ self.with_credentials = with_credentials
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("upload")
+
+ def _process_single_file(self, f: FileData) -> NamedString:
+ file_name = f.path
+ file = tempfile.NamedTemporaryFile(delete=False, dir=self.GRADIO_CACHE)
+ file.name = file_name
+ return NamedString(file_name)
+
+ def preprocess(self, payload: ListFiles | None) -> list[str] | None:
+ """
+ Parameters:
+ payload: File information as a list of FileData objects.
+ Returns:
+ Passes the file as a list of `str`.
+ """
+ if payload is None:
+ return None
+
+ return [self._process_single_file(f) for f in payload] # type: ignore
+
+ def _download_files(self, value: list[str]) -> list[str]:
+ downloaded_files = []
+ for file in value:
+ if client_utils.is_http_url_like(file):
+ downloaded_file = processing_utils.save_url_to_cache(
+ file, self.GRADIO_CACHE)
+ downloaded_files.append(downloaded_file)
+ else:
+ downloaded_files.append(file)
+ return downloaded_files
+
+ def postprocess(self, value: list[str] | None) -> ListFiles | None:
+ """
+ Parameters:
+ value: a `list[str]` of filepaths/URLs.
+ Returns:
+ File information as a list of FileData objects.
+ """
+ if value is None:
+ return None
+ value = self._download_files(value)
+ return ListFiles(root=[
+ FileData(
+ path=file,
+ orig_name=Path(file).name,
+ size=Path(file).stat().st_size,
+ ) for file in value
+ ])
+
+ @property
+ def skip_api(self):
+ return False
+
+ def api_info(self) -> dict[str, list[str]]:
+ return ListFiles.model_json_schema()
+
+ def example_payload(self) -> Any:
+ return [
+ handle_file(
+ "https://github.com/gradio-app/gradio/raw/main/test/test_files/sample_file.pdf"
+ )
+ ]
+
+ def example_value(self) -> Any:
+ return [
+ "https://github.com/gradio-app/gradio/raw/main/test/test_files/sample_file.pdf"
+ ]
diff --git a/backend/modelscope_studio/components/antd/upload/dragger/__init__.py b/backend/modelscope_studio/components/antd/upload/dragger/__init__.py
new file mode 100644
index 00000000..d291d675
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/upload/dragger/__init__.py
@@ -0,0 +1,153 @@
+from __future__ import annotations
+
+import tempfile
+from pathlib import Path
+from typing import TYPE_CHECKING, Any, Callable
+
+import gradio_client.utils as client_utils
+from gradio import processing_utils
+from gradio.components.base import Component
+from gradio.data_classes import FileData, ListFiles
+from gradio.events import EventListener
+from gradio.utils import NamedString
+from gradio_client import handle_file
+
+from .....utils.dev import ModelScopeDataLayoutComponent, resolve_frontend_dir
+
+if TYPE_CHECKING:
+ from gradio.components import Timer
+
+
+# as inputs, outputs
+class AntdUploadDragger(ModelScopeDataLayoutComponent):
+ """
+ """
+ EVENTS = [
+ EventListener("change",
+ callback=lambda block: block._internal.update(
+ bind_click_event=True)),
+ EventListener("drop",
+ callback=lambda block: block._internal.update(
+ bind_drop_event=True)),
+ EventListener("download",
+ callback=lambda block: block._internal.update(
+ bind_download_event=True)),
+ EventListener("preview",
+ callback=lambda block: block._internal.update(
+ bind_preview_event=True)),
+ EventListener("remove",
+ callback=lambda block: block._internal.update(
+ bind_remove_event=True))
+ ]
+
+ # supported slots
+ SLOTS = [
+ 'showUploadList.extra',
+ 'showUploadList.previewIcon',
+ 'showUploadList.removeIcon',
+ 'showUploadList.downloadIcon',
+ 'iconRender',
+ 'itemRender',
+ ]
+
+ data_model = ListFiles
+
+ def __init__(
+ self,
+ value: list[str] | Callable | None = None,
+ props: dict | None = None,
+ *,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ key: int | str | None = None,
+ every: Timer | float | None = None,
+ inputs: Component | list[Component] | set[Component] | None = None,
+ render: bool = True,
+ **kwargs):
+
+ super().__init__(as_item=as_item,
+ visible=visible,
+ value=value,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ key=key,
+ elem_style=elem_style,
+ every=every,
+ inputs=inputs,
+ render=render,
+ **kwargs)
+
+ self.props = props
+
+ FRONTEND_DIR = resolve_frontend_dir("upload", "dragger")
+
+ def _process_single_file(self, f: FileData) -> NamedString:
+ file_name = f.path
+ file = tempfile.NamedTemporaryFile(delete=False, dir=self.GRADIO_CACHE)
+ file.name = file_name
+ return NamedString(file_name)
+
+ def preprocess(self, payload: ListFiles | None) -> list[str] | None:
+ """
+ Parameters:
+ payload: File information as a list of FileData objects.
+ Returns:
+ Passes the file as a list of `str`.
+ """
+ if payload is None:
+ return None
+
+ return [self._process_single_file(f) for f in payload] # type: ignore
+
+ def _download_files(self, value: list[str]) -> list[str]:
+ downloaded_files = []
+ for file in value:
+ if client_utils.is_http_url_like(file):
+ downloaded_file = processing_utils.save_url_to_cache(
+ file, self.GRADIO_CACHE)
+ downloaded_files.append(downloaded_file)
+ else:
+ downloaded_files.append(file)
+ return downloaded_files
+
+ def postprocess(self, value: list[str] | None) -> ListFiles | None:
+ """
+ Parameters:
+ value: a `list[str]` of filepaths/URLs.
+ Returns:
+ File information as a list of FileData objects.
+ """
+ if value is None:
+ return None
+ value = self._download_files(value)
+ return ListFiles(root=[
+ FileData(
+ path=file,
+ orig_name=Path(file).name,
+ size=Path(file).stat().st_size,
+ ) for file in value
+ ])
+
+ @property
+ def skip_api(self):
+ return False
+
+ def api_info(self) -> dict[str, list[str]]:
+ return ListFiles.model_json_schema()
+
+ def example_payload(self) -> Any:
+ return [
+ handle_file(
+ "https://github.com/gradio-app/gradio/raw/main/test/test_files/sample_file.pdf"
+ )
+ ]
+
+ def example_value(self) -> Any:
+ return [
+ "https://github.com/gradio-app/gradio/raw/main/test/test_files/sample_file.pdf"
+ ]
diff --git a/backend/modelscope_studio/components/antd/watermark/__init__.py b/backend/modelscope_studio/components/antd/watermark/__init__.py
new file mode 100644
index 00000000..1854fc40
--- /dev/null
+++ b/backend/modelscope_studio/components/antd/watermark/__init__.py
@@ -0,0 +1,73 @@
+from __future__ import annotations
+
+from ....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+
+
+class AntdWatermark(ModelScopeLayoutComponent):
+ """
+ Ant Design: https://ant.design/components/watermark
+ """
+ EVENTS = []
+
+ def __init__(
+ self,
+ content: str | list[str] | None = "",
+ props: dict | None = None,
+ *,
+ width: int | float | None = None,
+ height: int | float | None = None,
+ inherit: bool | None = None,
+ rotate: int | float | None = None,
+ z_index: int | None = None,
+ image: str | None = None,
+ font: dict | None = None,
+ gap: list[int | float] | None = None,
+ offset: list[int | float] | None = None,
+ root_class_name: str | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ self.props = props
+ self.content = content
+ self.width = width
+ self.height = height
+ self.inherit = inherit
+ self.rotate = rotate
+ self.z_index = z_index
+ self.image = image
+ self.font = font
+ self.gap = gap
+ self.offset = offset
+ self.root_class_name = root_class_name
+
+ FRONTEND_DIR = resolve_frontend_dir("watermark")
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: None) -> None:
+ return payload
+
+ def postprocess(self, value: None) -> None:
+
+ return value
+
+ def example_payload(self) -> None:
+ return None
+
+ def example_value(self) -> None:
+ return None
diff --git a/backend/modelscope_studio/components/base/__init__.py b/backend/modelscope_studio/components/base/__init__.py
new file mode 100644
index 00000000..60d3a873
--- /dev/null
+++ b/backend/modelscope_studio/components/base/__init__.py
@@ -0,0 +1,8 @@
+from .application import ModelScopeApplication as Application
+from .div import ModelScopeDiv as Div
+from .each import ModelScopeEach as Each
+from .filter import ModelScopeFilter as Filter
+from .fragment import ModelScopeFragment as Fragment
+from .slot import ModelScopeSlot as Slot
+from .span import ModelScopeSpan as Span
+from .text import ModelScopeText as Text
diff --git a/backend/modelscope_studio/components/base/application/__init__.py b/backend/modelscope_studio/components/base/application/__init__.py
new file mode 100644
index 00000000..47df9842
--- /dev/null
+++ b/backend/modelscope_studio/components/base/application/__init__.py
@@ -0,0 +1,106 @@
+from __future__ import annotations
+
+from typing import Any
+
+from gradio.data_classes import GradioModel
+from gradio.events import EventListener
+
+from ....utils.dev import ModelScopeDataLayoutComponent, resolve_frontend_dir
+
+
+class ApplicationPageScreenData(GradioModel):
+ width: float
+ height: float
+ scrollX: float
+ scrollY: float
+
+
+class ApplicationPageData(GradioModel):
+ screen: ApplicationPageScreenData
+ language: str
+ theme: str
+ userAgent: str
+
+
+class ModelScopeApplication(ModelScopeDataLayoutComponent):
+ """
+ """
+
+ EVENTS = [
+ EventListener(
+ "custom",
+ doc=
+ "This listener is triggered when the `window.ms_globals.dispatch` is called in javascript.",
+ callback=lambda block: block._internal.update(bind_custom_event=
+ True)),
+ EventListener(
+ "mount",
+ doc=
+ "This listener is triggered when the application initially mount in the browser.",
+ callback=lambda block: block._internal.update(bind_mount_event=True
+ )),
+ EventListener(
+ "resize",
+ doc=
+ "This listener is triggered when the user resizes the browser window.",
+ callback=lambda block: block._internal.update(bind_resize_event=
+ True)),
+ EventListener(
+ "unmount",
+ doc="This listener is triggered when the user leaves the page.",
+ callback=lambda block: block._internal.update(bind_unmount_event=
+ True)),
+ ]
+
+ # supported slots
+ SLOTS = []
+
+ def __init__(
+ self,
+ value: ApplicationPageData | dict | None = None,
+ *,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ key: int | str | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(value=value,
+ visible=visible,
+ render=render,
+ key=key,
+ **kwargs)
+
+ FRONTEND_DIR = resolve_frontend_dir("application", type="base")
+
+ data_model = ApplicationPageData
+
+ def preprocess(
+ self, payload: ApplicationPageData | dict | None
+ ) -> ApplicationPageData | dict | None:
+ return payload
+
+ def postprocess(
+ self, value: ApplicationPageData | dict | None
+ ) -> ApplicationPageData | dict | None:
+
+ return value
+
+ def example_payload(self) -> Any:
+ return {
+ "screen": {
+ "width": 1920,
+ "height": 1080,
+ "scrollX": 0,
+ "scrollY": 0,
+ },
+ "theme":
+ "light",
+ "language":
+ "en",
+ "userAgent":
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
+ }
+
+ def example_value(self) -> Any:
+ return None
diff --git a/backend/modelscope_studio/components/base/div/__init__.py b/backend/modelscope_studio/components/base/div/__init__.py
new file mode 100644
index 00000000..7fdd1b62
--- /dev/null
+++ b/backend/modelscope_studio/components/base/div/__init__.py
@@ -0,0 +1,93 @@
+from __future__ import annotations
+
+from typing import Any
+
+from gradio.events import EventListener
+
+from ....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+from ...antd.carousel import AntdCarousel
+from ...antd.space import AntdSpace
+from ..slot import ModelScopeSlot
+
+
+class ModelScopeDiv(ModelScopeLayoutComponent):
+ """
+ """
+
+ EVENTS = [
+ EventListener("click",
+ callback=lambda block: block._internal.update(
+ bind_click_event=True)),
+ EventListener("dblclick",
+ callback=lambda block: block._internal.update(
+ bind_dblclick_event=True)),
+ EventListener("mousedown",
+ callback=lambda block: block._internal.update(
+ bind_mousedown_event=True)),
+ EventListener("mouseup",
+ callback=lambda block: block._internal.update(
+ bind_mouseup_event=True)),
+ EventListener("mouseover",
+ callback=lambda block: block._internal.update(
+ bind_mouseover_event=True)),
+ EventListener("mouseout",
+ callback=lambda block: block._internal.update(
+ bind_mouseout_event=True)),
+ EventListener("mousemove",
+ callback=lambda block: block._internal.update(
+ bind_mousemove_event=True)),
+ EventListener("scroll",
+ callback=lambda block: block._internal.update(
+ bind_scroll_event=True)),
+ ]
+
+ # supported slots
+ SLOTS = []
+
+ def __init__(
+ self,
+ value: str | None = None,
+ props: dict | None = None,
+ *,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+
+ if self.parent and self._internal and (any(
+ isinstance(self.parent, component)
+ for component in [AntdCarousel, AntdSpace, ModelScopeSlot])):
+ self._internal.update(fragment=True)
+ self.value = value
+ self.props = props
+
+ FRONTEND_DIR = resolve_frontend_dir("div", type="base")
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: str | None) -> str | None:
+ return payload
+
+ def postprocess(self, value: str | None) -> str | None:
+
+ return str(value)
+
+ def example_payload(self) -> Any:
+ return None
+
+ def example_value(self) -> Any:
+ return None
diff --git a/backend/modelscope_studio/components/base/each/__init__.py b/backend/modelscope_studio/components/base/each/__init__.py
new file mode 100644
index 00000000..c740b2e0
--- /dev/null
+++ b/backend/modelscope_studio/components/base/each/__init__.py
@@ -0,0 +1,72 @@
+from __future__ import annotations
+
+from timeit import Timer
+from typing import Callable
+
+from gradio.components.base import Component
+from gradio.data_classes import GradioRootModel
+
+from ....utils.dev import ModelScopeDataLayoutComponent, resolve_frontend_dir
+
+
+class ModelScopeEachData(GradioRootModel):
+ root: list = []
+
+
+# as inputs, outputs
+class ModelScopeEach(ModelScopeDataLayoutComponent):
+ """
+ """
+ EVENTS = []
+ data_model = ModelScopeEachData
+
+ def __init__(
+ self,
+ value: list[dict] | Callable = None,
+ *,
+ context_value: dict | None = None,
+ as_item: str | None = None,
+ _internal: None = None,
+
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ key: int | str | None = None,
+ every: Timer | float | None = None,
+ inputs: Component | list[Component] | set[Component] | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(visible=visible,
+ render=render,
+ value=value,
+ as_item=as_item,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ key=key,
+ elem_style=elem_style,
+ every=every,
+ inputs=inputs,
+ **kwargs)
+ self.context_value = context_value
+
+ FRONTEND_DIR = resolve_frontend_dir("each", type='base')
+
+ @property
+ def skip_api(self):
+ return False
+
+ def preprocess(self, payload: list | ModelScopeEachData) -> list:
+ if isinstance(payload, ModelScopeEachData):
+ return payload.root
+ return payload
+
+ def postprocess(self, value: list) -> list:
+ return value
+
+ def example_payload(self) -> list:
+ return []
+
+ def example_value(self) -> list:
+ return []
diff --git a/backend/modelscope_studio/components/base/filter/__init__.py b/backend/modelscope_studio/components/base/filter/__init__.py
new file mode 100644
index 00000000..2cefc6fc
--- /dev/null
+++ b/backend/modelscope_studio/components/base/filter/__init__.py
@@ -0,0 +1,44 @@
+from __future__ import annotations
+
+from typing import Any
+
+from ....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+
+
+class ModelScopeFilter(ModelScopeLayoutComponent):
+ """
+ """
+ EVENTS = []
+
+ def __init__(self,
+ params_mapping: str | None = None,
+ *,
+ as_item: str | None = None,
+ _internal: None = None,
+ visible: bool = True,
+ render: bool = True,
+ **kwargs):
+ super().__init__(visible=visible,
+ render=render,
+ as_item=as_item,
+ **kwargs)
+ self.params_mapping = params_mapping
+
+ FRONTEND_DIR = resolve_frontend_dir("filter", type='base')
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: None) -> None:
+ return payload
+
+ def postprocess(self, value: None) -> None:
+
+ return value
+
+ def example_payload(self) -> Any:
+ return None
+
+ def example_value(self) -> Any:
+ return None
diff --git a/backend/modelscope_studio/components/base/fragment/__init__.py b/backend/modelscope_studio/components/base/fragment/__init__.py
new file mode 100644
index 00000000..bce7db61
--- /dev/null
+++ b/backend/modelscope_studio/components/base/fragment/__init__.py
@@ -0,0 +1,48 @@
+from __future__ import annotations
+
+from typing import Any
+
+from ....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+
+
+class ModelScopeFragment(ModelScopeLayoutComponent):
+ """
+ """
+
+ EVENTS = []
+
+ # supported slots
+ SLOTS = []
+
+ def __init__(
+ self,
+ *,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ render: bool = True,
+ **kwargs):
+ super().__init__(visible=visible,
+ render=render,
+ as_item=as_item,
+ **kwargs)
+
+ FRONTEND_DIR = resolve_frontend_dir("fragment", type="base")
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: None) -> None:
+ return payload
+
+ def postprocess(self, value: None) -> None:
+
+ return value
+
+ def example_payload(self) -> Any:
+ return None
+
+ def example_value(self) -> Any:
+ return None
diff --git a/backend/modelscope_studio/components/base/slot/__init__.py b/backend/modelscope_studio/components/base/slot/__init__.py
new file mode 100644
index 00000000..da27db0e
--- /dev/null
+++ b/backend/modelscope_studio/components/base/slot/__init__.py
@@ -0,0 +1,51 @@
+from __future__ import annotations
+
+from typing import Any
+
+from ....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+
+
+class ModelScopeSlot(ModelScopeLayoutComponent):
+ """
+ """
+ EVENTS = []
+
+ def __init__(self,
+ value: str = '',
+ params_mapping: str | None = None,
+ *,
+ skip_context_value: bool = True,
+ as_item: str | None = None,
+ _internal: None = None,
+ visible: bool = True,
+ render: bool = True,
+ **kwargs):
+ super().__init__(visible=visible,
+ render=render,
+ as_item=as_item,
+ **kwargs)
+ self.params_mapping = params_mapping
+ self.skip_context_value = skip_context_value
+ if isinstance(self.parent, ModelScopeSlot):
+ self.value = f"{self.parent.value}.{value}"
+ else:
+ self.value = value
+
+ FRONTEND_DIR = resolve_frontend_dir("slot", type='base')
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: str) -> str:
+ return payload
+
+ def postprocess(self, value: str) -> str:
+
+ return value
+
+ def example_payload(self) -> Any:
+ return None
+
+ def example_value(self) -> Any:
+ return None
diff --git a/backend/modelscope_studio/components/base/span/__init__.py b/backend/modelscope_studio/components/base/span/__init__.py
new file mode 100644
index 00000000..eda853d1
--- /dev/null
+++ b/backend/modelscope_studio/components/base/span/__init__.py
@@ -0,0 +1,92 @@
+from __future__ import annotations
+
+from typing import Any
+
+from gradio.events import EventListener
+
+from ....utils.dev import ModelScopeLayoutComponent, resolve_frontend_dir
+from ...antd.carousel import AntdCarousel
+from ...antd.space import AntdSpace
+from ..slot import ModelScopeSlot
+
+
+class ModelScopeSpan(ModelScopeLayoutComponent):
+ """
+ """
+
+ EVENTS = [
+ EventListener("click",
+ callback=lambda block: block._internal.update(
+ bind_click_event=True)),
+ EventListener("dblclick",
+ callback=lambda block: block._internal.update(
+ bind_dblclick_event=True)),
+ EventListener("mousedown",
+ callback=lambda block: block._internal.update(
+ bind_mousedown_event=True)),
+ EventListener("mouseup",
+ callback=lambda block: block._internal.update(
+ bind_mouseup_event=True)),
+ EventListener("mouseover",
+ callback=lambda block: block._internal.update(
+ bind_mouseover_event=True)),
+ EventListener("mouseout",
+ callback=lambda block: block._internal.update(
+ bind_mouseout_event=True)),
+ EventListener("mousemove",
+ callback=lambda block: block._internal.update(
+ bind_mousemove_event=True)),
+ EventListener("scroll",
+ callback=lambda block: block._internal.update(
+ bind_scroll_event=True)),
+ ]
+
+ # supported slots
+ SLOTS = []
+
+ def __init__(
+ self,
+ value: str | None = None,
+ props: dict | None = None,
+ *,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ if self.parent and self._internal and (any(
+ isinstance(self.parent, component)
+ for component in [AntdCarousel, AntdSpace, ModelScopeSlot])):
+ self._internal.update(fragment=True)
+ self.value = value
+ self.props = props
+
+ FRONTEND_DIR = resolve_frontend_dir("span", type="base")
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: str | None) -> str | None:
+ return payload
+
+ def postprocess(self, value: str | None) -> str | None:
+
+ return str(value)
+
+ def example_payload(self) -> Any:
+ return None
+
+ def example_value(self) -> Any:
+ return None
diff --git a/backend/modelscope_studio/components/base/text/__init__.py b/backend/modelscope_studio/components/base/text/__init__.py
new file mode 100644
index 00000000..a13ac3d7
--- /dev/null
+++ b/backend/modelscope_studio/components/base/text/__init__.py
@@ -0,0 +1,62 @@
+from __future__ import annotations
+
+from typing import Any
+
+from ....utils.dev import ModelScopeComponent, resolve_frontend_dir
+from ...antd.carousel import AntdCarousel
+from ...antd.space import AntdSpace
+
+
+class ModelScopeText(ModelScopeComponent):
+ """
+ """
+
+ EVENTS = []
+
+ # supported slots
+ SLOTS = []
+
+ def __init__(
+ self,
+ value: str | None = None,
+ *,
+ as_item: str | None = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: str | None = None,
+ elem_classes: list[str] | str | None = None,
+ elem_style: dict | None = None,
+ render: bool = True,
+ **kwargs):
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render,
+ as_item=as_item,
+ elem_style=elem_style,
+ **kwargs)
+ if self.parent and self._internal and (any(
+ isinstance(self.parent, component)
+ for component in [AntdCarousel, AntdSpace])):
+ self._internal.update(fragment=True)
+ self.value = value
+
+ FRONTEND_DIR = resolve_frontend_dir("text", type="base")
+
+ @property
+ def skip_api(self):
+ return True
+
+ def preprocess(self, payload: str | None) -> str | None:
+ return payload
+
+ def postprocess(self, value: str | None) -> str | None:
+
+ return str(value)
+
+ def example_payload(self) -> Any:
+ return None
+
+ def example_value(self) -> Any:
+ return None
diff --git a/backend/modelscope_studio/components/Chatbot/__init__.py b/backend/modelscope_studio/components/legacy/Chatbot/__init__.py
similarity index 99%
rename from backend/modelscope_studio/components/Chatbot/__init__.py
rename to backend/modelscope_studio/components/legacy/Chatbot/__init__.py
index b6d89299..853cbcf1 100644
--- a/backend/modelscope_studio/components/Chatbot/__init__.py
+++ b/backend/modelscope_studio/components/legacy/Chatbot/__init__.py
@@ -11,7 +11,8 @@
from gradio_client import utils as client_utils
from gradio_client.documentation import document, set_documentation_group
-from ...utils import CustomComponentDict, process_links, resolve_frontend_dir
+from ....utils.dev import (CustomComponentDict, process_links,
+ resolve_frontend_dir)
from ..MultimodalInput import MultimodalInputData
@@ -57,7 +58,7 @@ class ModelScopeChatbot(Component):
Demos: chatbot_simple, chatbot_multimodal
Guides: creating-a-chatbot
"""
- FRONTEND_DIR = resolve_frontend_dir("Chatbot")
+ FRONTEND_DIR = resolve_frontend_dir("Chatbot", type='legacy')
EVENTS = [Events.change, Events.select, Events.like, 'flushed', 'custom']
data_model = ChatbotData
diff --git a/backend/modelscope_studio/components/Chatbot/llm_thinking_presets.py b/backend/modelscope_studio/components/legacy/Chatbot/llm_thinking_presets.py
similarity index 100%
rename from backend/modelscope_studio/components/Chatbot/llm_thinking_presets.py
rename to backend/modelscope_studio/components/legacy/Chatbot/llm_thinking_presets.py
diff --git a/backend/modelscope_studio/components/Flow/__init__.py b/backend/modelscope_studio/components/legacy/Flow/__init__.py
similarity index 97%
rename from backend/modelscope_studio/components/Flow/__init__.py
rename to backend/modelscope_studio/components/legacy/Flow/__init__.py
index bbcec0fc..5de50c11 100644
--- a/backend/modelscope_studio/components/Flow/__init__.py
+++ b/backend/modelscope_studio/components/legacy/Flow/__init__.py
@@ -9,7 +9,7 @@
from gradio.events import Events
from gradio_client.documentation import document
-from ...utils import CustomComponentDict, resolve_frontend_dir
+from ....utils.dev import CustomComponentDict, resolve_frontend_dir
from .edge import *
from .edge import Edge
from .node import *
@@ -43,7 +43,7 @@ class BackgroundPropsDict(TypedDict):
@document()
class ModelScopeFlow(Component):
data_model = FlowData
- FRONTEND_DIR = resolve_frontend_dir("Flow")
+ FRONTEND_DIR = resolve_frontend_dir("Flow", type='legacy')
EVENTS = [Events.change, 'data_change', 'custom']
def __init__(
diff --git a/backend/modelscope_studio/components/Flow/edge.py b/backend/modelscope_studio/components/legacy/Flow/edge.py
similarity index 100%
rename from backend/modelscope_studio/components/Flow/edge.py
rename to backend/modelscope_studio/components/legacy/Flow/edge.py
diff --git a/backend/modelscope_studio/components/Flow/node.py b/backend/modelscope_studio/components/legacy/Flow/node.py
similarity index 100%
rename from backend/modelscope_studio/components/Flow/node.py
rename to backend/modelscope_studio/components/legacy/Flow/node.py
diff --git a/backend/modelscope_studio/components/Flow/node_schema.py b/backend/modelscope_studio/components/legacy/Flow/node_schema.py
similarity index 100%
rename from backend/modelscope_studio/components/Flow/node_schema.py
rename to backend/modelscope_studio/components/legacy/Flow/node_schema.py
diff --git a/backend/modelscope_studio/components/Lifecycle/__init__.py b/backend/modelscope_studio/components/legacy/Lifecycle/__init__.py
similarity index 93%
rename from backend/modelscope_studio/components/Lifecycle/__init__.py
rename to backend/modelscope_studio/components/legacy/Lifecycle/__init__.py
index cbaa3d4f..cbcf1e30 100644
--- a/backend/modelscope_studio/components/Lifecycle/__init__.py
+++ b/backend/modelscope_studio/components/legacy/Lifecycle/__init__.py
@@ -7,7 +7,7 @@
from gradio.events import EventListener
from gradio_client.documentation import document, set_documentation_group
-from ...utils import resolve_frontend_dir
+from ....utils.dev import resolve_frontend_dir
set_documentation_group("component")
@@ -28,7 +28,7 @@ class LifecycleData(GradioModel):
@document()
class ModelScopeLifecycle(Component):
- FRONTEND_DIR = resolve_frontend_dir("Lifecycle")
+ FRONTEND_DIR = resolve_frontend_dir("Lifecycle", type='legacy')
EVENTS = [
EventListener(
@@ -56,6 +56,7 @@ class ModelScopeLifecycle(Component):
def __init__(
self,
+ value: LifecycleData | dict | None = None,
*,
every: float | None = None,
_bind_mount_event: bool | None = None,
@@ -69,7 +70,7 @@ def __init__(
self._bind_mount_event = _bind_mount_event
self._bind_resize_event = _bind_resize_event
self._bind_unmount_event = _bind_unmount_event
- super().__init__(every=every)
+ super().__init__(value=value, every=every)
def preprocess(
self, payload: LifecycleData | dict | None
diff --git a/backend/modelscope_studio/components/Markdown/__init__.py b/backend/modelscope_studio/components/legacy/Markdown/__init__.py
similarity index 97%
rename from backend/modelscope_studio/components/Markdown/__init__.py
rename to backend/modelscope_studio/components/legacy/Markdown/__init__.py
index b6bed0a6..58e0ce14 100644
--- a/backend/modelscope_studio/components/Markdown/__init__.py
+++ b/backend/modelscope_studio/components/legacy/Markdown/__init__.py
@@ -7,7 +7,8 @@
from gradio.events import Events
from gradio_client.documentation import document, set_documentation_group
-from ...utils import CustomComponentDict, process_links, resolve_frontend_dir
+from ....utils.dev import (CustomComponentDict, process_links,
+ resolve_frontend_dir)
set_documentation_group("component")
@@ -22,7 +23,7 @@ class ModelScopeMarkdown(Component):
Demos: blocks_hello, blocks_kinematics
Guides: key-features
"""
- FRONTEND_DIR = resolve_frontend_dir("Markdown")
+ FRONTEND_DIR = resolve_frontend_dir("Markdown", type='legacy')
EVENTS = [Events.change, "custom"]
@staticmethod
diff --git a/backend/modelscope_studio/components/MultimodalInput/__init__.py b/backend/modelscope_studio/components/legacy/MultimodalInput/__init__.py
similarity index 98%
rename from backend/modelscope_studio/components/MultimodalInput/__init__.py
rename to backend/modelscope_studio/components/legacy/MultimodalInput/__init__.py
index 1dab2e4e..cde41580 100644
--- a/backend/modelscope_studio/components/MultimodalInput/__init__.py
+++ b/backend/modelscope_studio/components/legacy/MultimodalInput/__init__.py
@@ -9,7 +9,7 @@
from gradio_client import utils as client_utils
from gradio_client.documentation import document, set_documentation_group
-from ...utils import resolve_frontend_dir
+from ....utils.dev import resolve_frontend_dir
set_documentation_group("component")
@@ -30,7 +30,7 @@ class ModelScopeMultimodalInput(FormComponent):
Demos: hello_world, diff_texts, sentence_builder
Guides: creating-a-chatbot, real-time-speech-recognition
"""
- FRONTEND_DIR = resolve_frontend_dir("MultimodalInput")
+ FRONTEND_DIR = resolve_frontend_dir("MultimodalInput", type='legacy')
EVENTS = [
Events.change,
diff --git a/backend/modelscope_studio/components/WaterfallGallery/__init__.py b/backend/modelscope_studio/components/legacy/WaterfallGallery/__init__.py
similarity index 99%
rename from backend/modelscope_studio/components/WaterfallGallery/__init__.py
rename to backend/modelscope_studio/components/legacy/WaterfallGallery/__init__.py
index e41b017c..7a258efa 100644
--- a/backend/modelscope_studio/components/WaterfallGallery/__init__.py
+++ b/backend/modelscope_studio/components/legacy/WaterfallGallery/__init__.py
@@ -14,7 +14,7 @@
from gradio_client.utils import is_http_url_like
from PIL import Image as _Image # using _ to minimize namespace pollution
-from ...utils import resolve_frontend_dir
+from ....utils.dev import resolve_frontend_dir
set_documentation_group("component")
@@ -53,7 +53,7 @@ class ModelScopeWaterfallGallery(Component):
doc="Triggered when the image action button is clicked."),
"load_more"
]
- FRONTEND_DIR = resolve_frontend_dir("WaterfallGallery")
+ FRONTEND_DIR = resolve_frontend_dir("WaterfallGallery", type='legacy')
data_model = GalleryData
def __init__(self,
diff --git a/backend/modelscope_studio/components/legacy/__init__.py b/backend/modelscope_studio/components/legacy/__init__.py
new file mode 100644
index 00000000..6c2db370
--- /dev/null
+++ b/backend/modelscope_studio/components/legacy/__init__.py
@@ -0,0 +1,6 @@
+from .Chatbot import ModelScopeChatbot as Chatbot
+from .Flow import ModelScopeFlow as Flow
+from .Lifecycle import ModelScopeLifecycle as Lifecycle
+from .Markdown import ModelScopeMarkdown as Markdown
+from .MultimodalInput import ModelScopeMultimodalInput as MultimodalInput
+from .WaterfallGallery import ModelScopeWaterfallGallery as WaterfallGallery
diff --git a/backend/modelscope_studio/utils/__init__.py b/backend/modelscope_studio/utils/dev/__init__.py
similarity index 69%
rename from backend/modelscope_studio/utils/__init__.py
rename to backend/modelscope_studio/utils/dev/__init__.py
index e392f4d3..393cd789 100644
--- a/backend/modelscope_studio/utils/__init__.py
+++ b/backend/modelscope_studio/utils/dev/__init__.py
@@ -1,13 +1,11 @@
from typing import List, Optional, TypedDict
+from .component import *
from .process_links import process_links
+from .resolve_frontend_dir import *
class CustomComponentDict(TypedDict):
props: Optional[List[str]]
template: Optional[str]
js: Optional[str]
-
-
-def resolve_frontend_dir(component: str):
- return f"../../../../frontend/{component}"
diff --git a/backend/modelscope_studio/utils/dev/component.py b/backend/modelscope_studio/utils/dev/component.py
new file mode 100644
index 00000000..ed9d90a7
--- /dev/null
+++ b/backend/modelscope_studio/utils/dev/component.py
@@ -0,0 +1,150 @@
+from timeit import Timer
+from typing import Any, Callable, List, Set, Union
+
+from gradio.component_meta import ComponentMeta
+from gradio.components.base import BlockContext, Component
+
+
+class ModelScopeLayoutComponent(BlockContext, metaclass=ComponentMeta):
+ """
+ """
+
+ EVENTS = []
+
+ # supported slots
+ SLOTS = []
+
+ def __exit__(self, *args, **kwargs):
+ self._internal.update(layout=True)
+ super().__exit__(*args, **kwargs)
+
+ def __init__(
+ self,
+ *,
+ as_item: Union[str, None] = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: Union[str, None] = None,
+ elem_classes: Union[List[str], str, None] = None,
+ elem_style: Union[dict, None] = None,
+ render: bool = True):
+ super().__init__(visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render)
+ self.as_item = as_item
+ if self.parent:
+ self._internal = dict(index=len(self.parent.children) - 1)
+ else:
+ self._internal = dict()
+
+ self.elem_style = elem_style
+
+ @property
+ def skip_api(self):
+ return True
+
+
+class ModelScopeComponent(Component):
+ """
+ """
+
+ def __init__(
+ self,
+ value: Any = None,
+ *,
+ as_item: Union[str, None] = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: Union[str, None] = None,
+ elem_classes: Union[List[str], str, None] = None,
+ elem_style: Union[dict, None] = None,
+ key: Union[int, str, None] = None,
+ every: Union[Timer, float, None] = None,
+ inputs: Union[Component, List[Component], Set[Component],
+ None] = None,
+ load_fn: Union[Callable, None] = None,
+ render: bool = True):
+ super().__init__(visible=visible,
+ value=value,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ key=key,
+ every=every,
+ inputs=inputs,
+ load_fn=load_fn,
+ render=render)
+ if self.parent:
+ self._internal = dict(index=len(self.parent.children) - 1)
+ else:
+ self._internal = dict()
+ self.as_item = as_item
+ self.elem_style = elem_style
+
+
+class ModelScopeDataLayoutComponent(Component,
+ BlockContext,
+ metaclass=ComponentMeta):
+ """
+ """
+ EVENTS = []
+ # supported slots
+ SLOTS = []
+
+ # fix gradio’s bug
+ @property
+ def component_class_id(self):
+ return self.get_component_class_id()
+
+ @component_class_id.setter
+ def component_class_id(self, value):
+ pass
+
+ @property
+ def skip_api(self):
+ return False
+
+ def __exit__(self, *args, **kwargs):
+ self._internal.update(layout=True)
+ super().__exit__(*args, **kwargs)
+
+ def __init__(
+ self,
+ value: Any = None,
+ *,
+ as_item: Union[str, None] = None,
+ _internal: None = None,
+ # gradio properties
+ visible: bool = True,
+ elem_id: Union[str, None] = None,
+ elem_classes: Union[List[str], str, None] = None,
+ elem_style: Union[dict, None] = None,
+ key: Union[int, str, None] = None,
+ every: Union[Timer, float, None] = None,
+ inputs: Union[Component, List[Component], Set[Component],
+ None] = None,
+ load_fn: Union[Callable, None] = None,
+ render: bool = True):
+ super().__init__(
+ visible=visible,
+ value=value,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ key=key,
+ every=every,
+ inputs=inputs,
+ load_fn=load_fn,
+ # disable render twice
+ render=False)
+ BlockContext.__init__(self,
+ visible=visible,
+ elem_id=elem_id,
+ elem_classes=elem_classes,
+ render=render)
+ if self.parent:
+ self._internal = dict(index=len(self.parent.children) - 1)
+ else:
+ self._internal = dict()
+ self.as_item = as_item
+ self.elem_style = elem_style
diff --git a/backend/modelscope_studio/utils/process_links.py b/backend/modelscope_studio/utils/dev/process_links.py
similarity index 100%
rename from backend/modelscope_studio/utils/process_links.py
rename to backend/modelscope_studio/utils/dev/process_links.py
diff --git a/backend/modelscope_studio/utils/dev/resolve_frontend_dir.py b/backend/modelscope_studio/utils/dev/resolve_frontend_dir.py
new file mode 100644
index 00000000..676c9c01
--- /dev/null
+++ b/backend/modelscope_studio/utils/dev/resolve_frontend_dir.py
@@ -0,0 +1,15 @@
+from typing import Literal, Union
+
+
+def resolve_frontend_dir(component: str,
+ sub_component: Union[str, list, tuple] = None,
+ type: Literal['antd', 'base'] = 'antd'):
+ if isinstance(sub_component, list) or isinstance(sub_component, tuple):
+ dir = ''
+ for c in sub_component:
+ dir = dir + f"/{c}"
+ return f"{'../' * len(sub_component)}../../../../../frontend/{type}/{component}{dir}"
+
+ if (sub_component):
+ return f"../../../../../../frontend/{type}/{component}/{sub_component}"
+ return f"../../../../../frontend/{type}/{component}"
diff --git a/backend/modelscope_studio/version.py b/backend/modelscope_studio/version.py
index 72251527..81a2814f 100644
--- a/backend/modelscope_studio/version.py
+++ b/backend/modelscope_studio/version.py
@@ -1 +1 @@
-__version__ = "0.5.2"
+__version__ = "1.0.0-beta.3"
diff --git a/config/changelog/CHANGELOG.md b/config/changelog/CHANGELOG.md
index c5819025..0970a8e6 100644
--- a/config/changelog/CHANGELOG.md
+++ b/config/changelog/CHANGELOG.md
@@ -1,5 +1,29 @@
# @modelscope-studio/changelog
+## 1.0.0-beta.3
+
+### Features
+
+- [`9f3c59c`](https://github.com/modelscope/modelscope-studio/commit/9f3c59c9c5a0bf8af3980588cb07a467323b1d17) - add new features. Thanks [@Col0ring](https://github.com/Col0ring)!
+
+## 1.0.0-beta.2
+
+### Features
+
+- [`9e5da52`](https://github.com/modelscope/modelscope-studio/commit/9e5da52fc739c6862225192fecf95f6bfd7923ad) - complete components params in Python. Thanks [@Col0ring](https://github.com/Col0ring)!
+
+## 1.0.0-beta.1
+
+### Features
+
+- [`025f728`](https://github.com/modelscope/modelscope-studio/commit/025f72825bdafbc60b4a09e577a363e43189bd1d) - migrate to gradio 5. Thanks [@Col0ring](https://github.com/Col0ring)!
+
+## 1.0.0-beta.0
+
+### Features
+
+- [`4a46970`](https://github.com/modelscope/modelscope-studio/commit/4a46970007452af606abe02cdfa54a4959b2f3db) - integrate ant design. Thanks [@Col0ring](https://github.com/Col0ring)!
+
## 0.5.2
No significant changes to this package were made in this release.
diff --git a/config/changelog/package.json b/config/changelog/package.json
index aa4622c1..2a08709e 100644
--- a/config/changelog/package.json
+++ b/config/changelog/package.json
@@ -1,15 +1,15 @@
{
"name": "@modelscope-studio/changelog",
- "version": "0.5.2",
+ "version": "1.0.0-beta.3",
"private": false,
"description": "ModelScope Studio Changelog",
"repository": "git@github.com:modelscope/modelscope-studio.git",
"license": "Apache-2.0",
"exports": {
".": {
+ "types": "./dist/index.d.ts",
"import": "./dist/index.mjs",
- "require": "./dist/index.cjs",
- "types": "./dist/index.d.ts"
+ "require": "./dist/index.cjs"
}
},
"main": "dist/index.cjs",
@@ -20,12 +20,12 @@
},
"dependencies": {
"@changesets/get-github-info": "^0.6.0",
- "@manypkg/get-packages": "^2.2.1",
+ "@manypkg/get-packages": "^2.2.2",
"detect-indent": "^7.0.1"
},
"devDependencies": {
"@changesets/types": "^6.0.0",
- "@types/node": "^20.14.9",
- "tsup": "^8.1.0"
+ "@types/node": "^22.7.5",
+ "tsup": "^8.3.0"
}
}
diff --git a/config/lint-config/CHANGELOG.md b/config/lint-config/CHANGELOG.md
index c4e86d04..789af92b 100644
--- a/config/lint-config/CHANGELOG.md
+++ b/config/lint-config/CHANGELOG.md
@@ -1,5 +1,29 @@
# @modelscope-studio/lint-config
+## 1.0.0-beta.3
+
+### Features
+
+- [`9f3c59c`](https://github.com/modelscope/modelscope-studio/commit/9f3c59c9c5a0bf8af3980588cb07a467323b1d17) - add new features. Thanks [@Col0ring](https://github.com/Col0ring)!
+
+## 1.0.0-beta.2
+
+### Features
+
+- [`9e5da52`](https://github.com/modelscope/modelscope-studio/commit/9e5da52fc739c6862225192fecf95f6bfd7923ad) - complete components params in Python. Thanks [@Col0ring](https://github.com/Col0ring)!
+
+## 1.0.0-beta.1
+
+### Features
+
+- [`025f728`](https://github.com/modelscope/modelscope-studio/commit/025f72825bdafbc60b4a09e577a363e43189bd1d) - migrate to gradio 5. Thanks [@Col0ring](https://github.com/Col0ring)!
+
+## 1.0.0-beta.0
+
+### Features
+
+- [`4a46970`](https://github.com/modelscope/modelscope-studio/commit/4a46970007452af606abe02cdfa54a4959b2f3db) - integrate ant design. Thanks [@Col0ring](https://github.com/Col0ring)!
+
## 0.5.2
No significant changes to this package were made in this release.
diff --git a/config/lint-config/configs/eslint/basic.mjs b/config/lint-config/configs/eslint/basic.mjs
index 0ce9c94f..2f10e72d 100644
--- a/config/lint-config/configs/eslint/basic.mjs
+++ b/config/lint-config/configs/eslint/basic.mjs
@@ -5,11 +5,12 @@ import eslintPluginPrettierRecommended from 'eslint-plugin-prettier/recommended'
import simpleImportSort from 'eslint-plugin-simple-import-sort';
import globals from 'globals';
/**
- * @type {import('eslint').Linter.FlatConfig[]}
+ * @type {import('eslint').Linter.Config[]}
*/
export const basic = [
{
ignores: [
+ '**/backend/**',
'**/.git/**',
'**/node_modules/**',
'**/*.min.*',
diff --git a/config/lint-config/configs/eslint/react.mjs b/config/lint-config/configs/eslint/react.mjs
index 25dafd9f..a36a4278 100644
--- a/config/lint-config/configs/eslint/react.mjs
+++ b/config/lint-config/configs/eslint/react.mjs
@@ -4,7 +4,7 @@ import reactRefresh from 'eslint-plugin-react-refresh';
import { fixupPluginRules } from '@eslint/compat';
import jsxA11y from 'eslint-plugin-jsx-a11y';
/**
- * @type {import('eslint').Linter.FlatConfig[]}
+ * @type {import('eslint').Linter.Config[]}
*/
export const react = [
eslintPluginReactRecommendedConfig,
diff --git a/config/lint-config/configs/eslint/svelte.mjs b/config/lint-config/configs/eslint/svelte.mjs
index 18ca2469..2bbdf834 100644
--- a/config/lint-config/configs/eslint/svelte.mjs
+++ b/config/lint-config/configs/eslint/svelte.mjs
@@ -1,7 +1,7 @@
import eslintPluginSvelte from 'eslint-plugin-svelte';
/**
- * @type {import('eslint').Linter.FlatConfig[]}
+ * @type {import('eslint').Linter.Config[]}
*/
export const svelte = [
...eslintPluginSvelte.configs['flat/recommended'],
@@ -14,6 +14,7 @@ export const svelte = [
},
rules: {
'svelte/no-at-html-tags': 'off',
+ 'svelte/valid-compile': 'warn',
},
},
];
diff --git a/config/lint-config/configs/eslint/typescript.mjs b/config/lint-config/configs/eslint/typescript.mjs
index 40103e6d..51b0dce5 100644
--- a/config/lint-config/configs/eslint/typescript.mjs
+++ b/config/lint-config/configs/eslint/typescript.mjs
@@ -1,7 +1,7 @@
import eslintPluginImport from 'eslint-plugin-import';
import tseslint from 'typescript-eslint';
/**
- * @type {import('eslint').Linter.FlatConfig[]}
+ * @type {import('eslint').Linter.Config[]}
*/
export const typescript = [
...tseslint.configs.recommended.map((config) => ({
@@ -43,15 +43,11 @@ export const typescript = [
'warn',
{ vars: 'all', varsIgnorePattern: '^_' },
],
- '@typescript-eslint/ban-types': [
- 'error',
- {
- types: {
- '{}': false,
- },
- extendDefaults: true,
- },
- ],
+ '@typescript-eslint/no-unused-expressions': 'off',
+ '@typescript-eslint/ban-types': 'off',
+ '@typescript-eslint/no-empty-object-type': 'off',
+ '@typescript-eslint/no-wrapper-object-types': 'error',
+ '@typescript-eslint/no-unsafe-function-type': 'error',
// import type
'@typescript-eslint/consistent-type-imports': [
'error',
diff --git a/config/lint-config/eslint.mjs b/config/lint-config/eslint.mjs
index 75119b48..9deefb5b 100644
--- a/config/lint-config/eslint.mjs
+++ b/config/lint-config/eslint.mjs
@@ -5,6 +5,6 @@ import { svelte } from './configs/eslint/svelte.mjs';
import { typescript } from './configs/eslint/typescript.mjs';
/**
- * @type {import('eslint').Linter.FlatConfig[]}
+ * @type {import('eslint').Linter.Config[]}
*/
export default [].concat(basic, react, typescript, svelte);
diff --git a/config/lint-config/package.json b/config/lint-config/package.json
index 3c3f5d58..37410bf3 100644
--- a/config/lint-config/package.json
+++ b/config/lint-config/package.json
@@ -1,6 +1,6 @@
{
"name": "@modelscope-studio/lint-config",
- "version": "0.5.2",
+ "version": "1.0.0-beta.3",
"private": false,
"description": "ModelScope Studio Lint Config",
"repository": "git@github.com:modelscope/modelscope-studio.git",
@@ -16,33 +16,33 @@
}
},
"dependencies": {
- "@eslint/compat": "^1.1.0",
- "@eslint/js": "^9.5.0",
- "@typescript-eslint/parser": "^7.14.1",
+ "@eslint/compat": "^1.2.0",
+ "@eslint/js": "^9.12.0",
+ "@typescript-eslint/parser": "^8.8.1",
"eslint-config-prettier": "^9.0.0",
"eslint-import-resolver-typescript": "^3.6.0",
- "eslint-plugin-import": "^2.29.1",
+ "eslint-plugin-import": "^2.31.0",
"eslint-plugin-jsx-a11y": "^6.9.0",
- "eslint-plugin-prettier": "5.1.3",
- "eslint-plugin-react": "^7.34.3",
+ "eslint-plugin-prettier": "5.2.1",
+ "eslint-plugin-react": "^7.37.1",
"eslint-plugin-react-hooks": "^4.6.2",
- "eslint-plugin-react-refresh": "^0.4.7",
+ "eslint-plugin-react-refresh": "^0.4.12",
"eslint-plugin-simple-import-sort": "^12.1.0",
- "eslint-plugin-svelte": "^2.41.0",
- "globals": "^15.6.0",
- "postcss": "^8.4.38",
+ "eslint-plugin-svelte": "^2.44.1",
+ "globals": "^15.11.0",
+ "postcss": "^8.4.47",
"postcss-less": "^6.0.0",
"stylelint-config-ali": "^2.1.1",
"stylelint-config-rational-order": "^0.1.2",
"stylelint-config-standard": "^36.0.1",
"stylelint-declaration-block-no-ignored-properties": "^2.8.0",
"stylelint-order": "^6.0.4",
- "stylelint-prettier": "^5.0.0",
- "svelte-eslint-parser": "^0.39.2",
- "typescript-eslint": "^7.14.1"
+ "stylelint-prettier": "^5.0.2",
+ "svelte-eslint-parser": "^0.41.1",
+ "typescript-eslint": "^8.8.1"
},
"devDependencies": {
- "@types/eslint": "^8.56.10",
+ "@types/eslint": "^9.6.1",
"@types/eslint__js": "^8.42.3"
}
}
diff --git a/docs/Dockerfile b/docs/Dockerfile
deleted file mode 100644
index 02d9fbef..00000000
--- a/docs/Dockerfile
+++ /dev/null
@@ -1,15 +0,0 @@
-FROM python:3.9
-
-WORKDIR /code
-
-COPY --link --chown=1000 . .
-
-RUN mkdir -p /tmp/cache/
-RUN chmod a+rwx -R /tmp/cache/
-ENV TRANSFORMERS_CACHE=/tmp/cache/
-
-RUN pip install --no-cache-dir -r requirements.txt
-
-ENV PYTHONUNBUFFERED=1 GRADIO_ALLOW_FLAGGING=never GRADIO_NUM_PORTS=1 GRADIO_SERVER_NAME=0.0.0.0 GRADIO_SERVER_PORT=7860 SYSTEM=spaces
-
-CMD ["python", "app.py"]
diff --git a/docs/README-zh_CN.md b/docs/README-zh_CN.md
index fa6b2694..f569b710 100644
--- a/docs/README-zh_CN.md
+++ b/docs/README-zh_CN.md
@@ -1,4 +1,4 @@
-ModelScope Studio
+# ModelScope Studio
@@ -9,25 +9,46 @@
-GitHub | 🤖 ModelScope Studio | 🤗 Hugging Face Space
+GitHub | 🤖 ModelScope Studio | 🤗 Hugging Face Space
-`modelscope_studio` 是一套基于 gradio 4.x 的扩展组件库,致力于服务于 ModelScope 创空间中对于 gradio 应用的各类扩展需求,目前主要聚集在对话场景增强、多模态场景以及一些其他垂直场景支持。
+`modelscope_studio`是一个基于 Gradio 的三方组件库,在原有 Gradio 组件的基础上延伸了更多的组件和使用形式。
-## Install
+目前支持的 UI 库:
+
+- [Ant Design](https://ant.design/)
+
+## 何时使用
+
+比起 Gradio 自身的组件,`modelscope_studio`更加注重页面布局和组件的灵活性,如果您想要构建更漂亮的用户界面,我们非常推荐您使用`modelscope_studio`。然而,当您的应用需要 Gradio 在 Python 端更多地处理内置数据时,`modelscope_studio`可能不是最好的选择,但仍然可以使用`modelscope_studio`的布局和展示组件来帮助您构建页面。
+
+## 依赖
+
+- Gradio >= 4.0
+
+## 安装
+
+> 目前`modelscope_studio` 1.0 版本仍在开发中,您可以通过安装`beta`版本提前使用。
```sh
-pip install modelscope_studio
+pip install modelscope_studio~=1.0.0b
```
-## API
+## 示例
+
+
+
+## 迁移到 1.0
-- load
+如果您在之前使用了`modelscope_studio`的组件,并且想要在新版本中继续使用。不需要对原有组件做任何修改,只需要在外层引入`ms.Application`即可。
-## Components
+```python
+import gradio as gr
+import modelscope_studio.components.base as ms
+import modelscope_studio.components.legacy as mgr
-- Chatbot
-- MultimodalInput
-- Markdown
-- WaterfallGallery
-- Lifecycle
-- Flow
+with gr.Blocks() as demo:
+ with ms.Application():
+ mgr.Chatbot()
+
+demo.launch()
+```
diff --git a/docs/README.md b/docs/README.md
index d66732f7..b862f3d4 100644
--- a/docs/README.md
+++ b/docs/README.md
@@ -1,20 +1,21 @@
---
tags:
- gradio-custom-component
- - Chatbot
- - MutilmodalInput
- - Markdown
- - gradio-template-Chatbot
- - gradio-template-Markdown
+ - component library
+ - Ant Design
+ - modelscope-studio
title: modelscope-studio
colorFrom: blue
colorTo: gray
-sdk: docker
+short_description: A third-party component library based on Gradio.
+sdk: gradio
pinned: false
+header: mini
+app_file: app.py
license: apache-2.0
---
-
ModelScope Studio
+# ModelScope Studio
@@ -25,25 +26,46 @@ license: apache-2.0
-GitHub | 🤖 ModelScope Studio | 🤗 Hugging Face Space
+GitHub | 🤖 ModelScope Studio | 🤗 Hugging Face Space
-`modelscope_studio` is a set of extension component libraries based on gradio 4.x, dedicated to serving the various extension needs of gradio applications within the ModelScope Studio. It mainly focuses on enhancing conversational scenarios, supporting multimodal contexts, and providing assistance for various other specialized scenarios.
+`modelscope_studio` is a third-party component library based on Gradio, extending more components and usage forms on top of the original Gradio components.
-## Install
+Currently supported UI libraries:
+
+- [Ant Design](https://ant.design/)
+
+## When to Use
+
+Compared to Gradio's own components, `modelscope_studio` focuses more on page layout and component flexibility. If you want to build a more beautiful user interface, we highly recommend using `modelscope_studio`. However, when your application needs Gradio to handle more built-in data on the Python side, `modelscope_studio` may not be the best choice, but you can still use `modelscope_studio`'s layout and display components to help you build pages.
+
+## Dependencies
+
+- Gradio >= 4.0
+
+## Installation
+
+> Currently, `modelscope_studio` version 1.0 is still under development. You can use the `beta` version in advance.
```sh
-pip install modelscope_studio
+pip install modelscope_studio~=1.0.0b
```
-## API
+## Examples
+
+
+
+## Migration to 1.0
-- load
+If you have previously used `modelscope_studio` components and want to continue using them in the new version, no modifications to the original components are needed. You just need to introduce `ms.Application` in the outer layer.
-## Components
+```python
+import gradio as gr
+import modelscope_studio.components.base as ms
+import modelscope_studio.components.legacy as mgr
-- Chatbot
-- MultimodalInput
-- Markdown
-- Lifecycle
-- WaterfallGallery
-- Flow
+with gr.Blocks() as demo:
+ with ms.Application():
+ mgr.Chatbot()
+
+demo.launch()
+```
diff --git a/docs/api/app.py b/docs/api/app.py
index 85d6e013..6f651d0b 100644
--- a/docs/api/app.py
+++ b/docs/api/app.py
@@ -1,6 +1,6 @@
import os
-from components.Docs import Docs
+from components.legacy.Docs import Docs
def resolve(relative_path: str):
diff --git a/docs/app.py b/docs/app.py
index 1d93e6b4..bd9e1604 100644
--- a/docs/app.py
+++ b/docs/app.py
@@ -1,30 +1,195 @@
-import gradio as gr
-from api.app import docs as api_docs
-from components.Chatbot.app import docs as chatbot_docs
-from components.Docs import Docs
-from components.Flow.app import docs as flow_docs
-from components.Lifecycle.app import docs as lifecycle_docs
-from components.Markdown.app import docs as markdown_docs
-from components.MultimodalInput.app import docs as multimodel_input_docs
-from components.WaterfallGallery.app import docs as waterfall_gallery_docs
-
-readme_docs = Docs(__file__)
-
-docs = [
- ["Quick Start", readme_docs],
- ["API", api_docs],
- ["Chatbot", chatbot_docs],
- ["MultimodalInput", multimodel_input_docs],
- ["Markdown", markdown_docs],
- ["Lifecycle", lifecycle_docs],
- ["WaterfallGallery", waterfall_gallery_docs],
- ["Flow", flow_docs],
+import os
+from typing import Literal
+
+from helper.Docs import Docs
+from helper.env import is_modelscope_studio
+from helper.Site import Site
+from legacy_app import legacy_demo
+
+import modelscope_studio.components.antd as antd
+import modelscope_studio.components.base as ms
+
+
+def get_text(text: str, cn_text: str):
+ if is_modelscope_studio:
+ return cn_text
+ return text
+
+
+def get_docs(file_path: str, type: Literal["antd", "base"]):
+ import importlib.util
+
+ components = []
+ components_dir = os.path.join(os.path.dirname(file_path), "components",
+ type)
+ for dir in os.listdir(components_dir):
+ abs_dir = os.path.join(components_dir, dir)
+ if os.path.isdir(abs_dir):
+ app_file = os.path.join(abs_dir, "app.py")
+ if os.path.exists(app_file):
+ components.append(dir)
+
+ docs = {}
+ for component in components:
+ spec = importlib.util.spec_from_file_location(
+ "doc", os.path.join(components_dir, component, "app.py"))
+ module = importlib.util.module_from_spec(spec)
+ spec.loader.exec_module(module)
+ docs[component] = module.docs
+ return docs
+
+
+index_docs = {"modelscope_studio": Docs(__file__)}
+
+base_docs = get_docs(__file__, "base")
+antd_docs = get_docs(__file__, "antd")
+
+default_active_tab = "index"
+
+index_menu_items = [{
+ "label": get_text("ModelScope-Studio", "ModelScope-Studio"),
+ "key": "modelscope_studio"
+}]
+
+base_menu_items = [{
+ "label":
+ get_text("Core", "核心"),
+ "type":
+ "group",
+ "children": [{
+ "label": "Application",
+ "key": "application"
+ }, {
+ "label": "Slot",
+ "key": "slot"
+ }, {
+ "label": "Fragment",
+ "key": "fragment"
+ }]
+}, {
+ "label":
+ get_text("Layout", "布局"),
+ "type":
+ "group",
+ "children": [{
+ "label": "Div",
+ "key": "div"
+ }, {
+ "label": "Span",
+ "key": "span"
+ }, {
+ "label": "Text",
+ "key": "text"
+ }]
+}, {
+ "label":
+ get_text("Render", "渲染"),
+ "type":
+ "group",
+ "children": [{
+ "label": "Each",
+ "key": "each"
+ }, {
+ "label": "Filter",
+ "key": "filter"
+ }]
+}]
+
+antd_menu_items = [{
+ "label": get_text("Overview", "概览"),
+ "key": "overview"
+}, {
+ "label":
+ get_text("General", "通用"),
+ "type":
+ "group",
+ "children": [{
+ "label": get_text("Button", "Button 按钮"),
+ "key": "button"
+ }, {
+ "label": get_text("FloatButton", "FloatButton 悬浮按钮"),
+ "key": "float_button"
+ }, {
+ "label": get_text("Icon", "Icon 图标"),
+ "key": "icon"
+ }, {
+ "label": get_text("Typography", "Typography 排版"),
+ "key": "typography"
+ }]
+}, {
+ "label":
+ get_text("Layout", "布局"),
+ "type":
+ "group",
+ "children": [{
+ "label": get_text("Divider", "Divider 分割线"),
+ "key": "divider"
+ }]
+}]
+
+
+def logo():
+ with antd.Flex(align='center', gap=8):
+ antd.Image(os.path.join(os.path.dirname(__file__),
+ "./resources/modelscope.png"),
+ preview=False,
+ height=20)
+ ms.Span('✖️')
+ antd.Image(os.path.join(os.path.dirname(__file__),
+ "./resources/gradio.png"),
+ preview=False,
+ height=40)
+
+
+def more_components():
+ with antd.Button(type="link",
+ href="https://ant.design/components/overview/",
+ href_target="_blank"):
+ ms.Text(get_text("More Components", "更多组件"))
+
+ with ms.Slot("icon"):
+ antd.Icon("ExportOutlined")
+
+
+tabs = [
+ {
+ "label": get_text("Overview", "预览"),
+ "key": "index",
+ "default_active_key": "modelscope_studio",
+ "menus": index_menu_items
+ },
+ {
+ "label": get_text("Base Components", "基础组件"),
+ "key": "base",
+ "default_active_key": "application",
+ "menus": base_menu_items
+ },
+ {
+ "label": get_text("Antd Components", "Antd 组件"),
+ "key": "antd",
+ "default_active_key": "overview",
+ "menus": antd_menu_items,
+ "extra_menu_footer": more_components
+ },
+ {
+ "label": get_text("Version 0.x", "0.x 版本"),
+ "key": "legacy",
+ "content": legacy_demo
+ },
]
-with gr.Blocks() as demo:
- with gr.Tabs() as components_tabs:
- for doc in docs:
- with gr.TabItem(doc[0], id=doc[0]):
- doc[1].render(components_tabs)
+site = Site(
+ tabs=tabs,
+ docs={
+ # match the key of tabs
+ "index": index_docs,
+ "antd": antd_docs,
+ "base": base_docs
+ },
+ default_active_tab=default_active_tab,
+ logo=logo)
+
+demo = site.render()
-demo.queue().launch()
+if __name__ == "__main__":
+ demo.queue().launch(ssr_mode=False)
diff --git a/docs/components/WaterfallGallery/app.py b/docs/components/WaterfallGallery/app.py
deleted file mode 100644
index 77372ef2..00000000
--- a/docs/components/WaterfallGallery/app.py
+++ /dev/null
@@ -1,6 +0,0 @@
-from components.Docs import Docs
-
-docs = Docs(__file__)
-
-if __name__ == "__main__":
- docs.render().queue().launch()
diff --git a/docs/components/antd/button/README-zh_CN.md b/docs/components/antd/button/README-zh_CN.md
new file mode 100644
index 00000000..065a0795
--- /dev/null
+++ b/docs/components/antd/button/README-zh_CN.md
@@ -0,0 +1,7 @@
+# Button
+
+To trigger an operation. See [Ant Design](https://ant.design/components/button/) for more information.
+
+## Examples
+
+
diff --git a/docs/components/antd/button/README.md b/docs/components/antd/button/README.md
new file mode 100644
index 00000000..065a0795
--- /dev/null
+++ b/docs/components/antd/button/README.md
@@ -0,0 +1,7 @@
+# Button
+
+To trigger an operation. See [Ant Design](https://ant.design/components/button/) for more information.
+
+## Examples
+
+
diff --git a/docs/components/Chatbot/app.py b/docs/components/antd/button/app.py
similarity index 72%
rename from docs/components/Chatbot/app.py
rename to docs/components/antd/button/app.py
index 77372ef2..0018b7c1 100644
--- a/docs/components/Chatbot/app.py
+++ b/docs/components/antd/button/app.py
@@ -1,4 +1,4 @@
-from components.Docs import Docs
+from helper.Docs import Docs
docs = Docs(__file__)
diff --git a/docs/components/antd/button/demos/basic.py b/docs/components/antd/button/demos/basic.py
new file mode 100644
index 00000000..887efeeb
--- /dev/null
+++ b/docs/components/antd/button/demos/basic.py
@@ -0,0 +1,26 @@
+import gradio as gr
+
+import modelscope_studio.components.antd as antd
+import modelscope_studio.components.base as ms
+
+with gr.Blocks() as demo:
+ with ms.Application():
+ with antd.ConfigProvider():
+ with antd.Flex(gap="small", wrap=True):
+ btn = antd.Button("Primary Button", type="primary")
+ btn.click(lambda: print("clicked"))
+ with antd.Button():
+ ms.Text("Default Button")
+ antd.Button("Dashed Button", type="dashed")
+ antd.Button("Text Button", type="text")
+ antd.Button("Link Button", type="link")
+ antd.Button("Filled", color="default", variant="filled")
+ antd.Button("Filled", color="danger", variant="filled")
+ with antd.Button(type="primary", loading=True):
+ ms.Text("Loading")
+ with ms.Slot("icon"):
+ antd.Icon("PoweroffOutlined")
+ antd.Button("Block", type="primary", block=True)
+
+if __name__ == "__main__":
+ demo.queue().launch()
diff --git a/docs/components/antd/divider/README-zh_CN.md b/docs/components/antd/divider/README-zh_CN.md
new file mode 100644
index 00000000..36464d04
--- /dev/null
+++ b/docs/components/antd/divider/README-zh_CN.md
@@ -0,0 +1,7 @@
+# Divider
+
+A divider line separates different content. See [Ant Design](https://ant.design/components/divider/) for more information.
+
+## Examples
+
+
diff --git a/docs/components/antd/divider/README.md b/docs/components/antd/divider/README.md
new file mode 100644
index 00000000..36464d04
--- /dev/null
+++ b/docs/components/antd/divider/README.md
@@ -0,0 +1,7 @@
+# Divider
+
+A divider line separates different content. See [Ant Design](https://ant.design/components/divider/) for more information.
+
+## Examples
+
+
diff --git a/docs/components/Flow/app.py b/docs/components/antd/divider/app.py
similarity index 72%
rename from docs/components/Flow/app.py
rename to docs/components/antd/divider/app.py
index 77372ef2..0018b7c1 100644
--- a/docs/components/Flow/app.py
+++ b/docs/components/antd/divider/app.py
@@ -1,4 +1,4 @@
-from components.Docs import Docs
+from helper.Docs import Docs
docs = Docs(__file__)
diff --git a/docs/components/antd/divider/demos/basic.py b/docs/components/antd/divider/demos/basic.py
new file mode 100644
index 00000000..70ecf62a
--- /dev/null
+++ b/docs/components/antd/divider/demos/basic.py
@@ -0,0 +1,29 @@
+import gradio as gr
+
+import modelscope_studio.components.antd as antd
+import modelscope_studio.components.base as ms
+
+with gr.Blocks() as demo:
+ with ms.Application():
+ with antd.ConfigProvider():
+ ms.Div(
+ " Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed nonne merninisti licere mihi istaprobare, quae sunt a te dicta? Refert tamen, quo modo."
+ )
+ antd.Divider("Solid", elem_style=dict(borderColor='#7cb305'))
+ ms.Div(
+ " Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed nonne merninisti licere mihi istaprobare, quae sunt a te dicta? Refert tamen, quo modo."
+ )
+ with antd.Divider(elem_style=dict(borderColor='#7cb305'),
+ variant="dotted"):
+ ms.Text("Dotted")
+ ms.Div(
+ " Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed nonne merninisti licere mihi istaprobare, quae sunt a te dicta? Refert tamen, quo modo."
+ )
+ with antd.Divider(elem_style=dict(borderColor='#7cb305'),
+ variant="dashed"):
+ ms.Text("Dashed")
+ ms.Div(
+ " Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed nonne merninisti licere mihi istaprobare, quae sunt a te dicta? Refert tamen, quo modo."
+ )
+if __name__ == "__main__":
+ demo.queue().launch()
diff --git a/docs/components/antd/float_button/README-zh_CN.md b/docs/components/antd/float_button/README-zh_CN.md
new file mode 100644
index 00000000..0c7d28f3
--- /dev/null
+++ b/docs/components/antd/float_button/README-zh_CN.md
@@ -0,0 +1,7 @@
+# FloatButton
+
+A button that floats at the top of the page. See [Ant Design](https://ant.design/components/float-button/) for more information.
+
+## Examples
+
+
diff --git a/docs/components/antd/float_button/README.md b/docs/components/antd/float_button/README.md
new file mode 100644
index 00000000..0c7d28f3
--- /dev/null
+++ b/docs/components/antd/float_button/README.md
@@ -0,0 +1,7 @@
+# FloatButton
+
+A button that floats at the top of the page. See [Ant Design](https://ant.design/components/float-button/) for more information.
+
+## Examples
+
+
diff --git a/docs/components/Lifecycle/app.py b/docs/components/antd/float_button/app.py
similarity index 72%
rename from docs/components/Lifecycle/app.py
rename to docs/components/antd/float_button/app.py
index 77372ef2..0018b7c1 100644
--- a/docs/components/Lifecycle/app.py
+++ b/docs/components/antd/float_button/app.py
@@ -1,4 +1,4 @@
-from components.Docs import Docs
+from helper.Docs import Docs
docs = Docs(__file__)
diff --git a/docs/components/antd/float_button/demos/basic.py b/docs/components/antd/float_button/demos/basic.py
new file mode 100644
index 00000000..c0ab7f93
--- /dev/null
+++ b/docs/components/antd/float_button/demos/basic.py
@@ -0,0 +1,30 @@
+import gradio as gr
+
+import modelscope_studio.components.antd as antd
+import modelscope_studio.components.base as ms
+
+with gr.Blocks() as demo:
+ with ms.Application():
+ with antd.ConfigProvider():
+ with antd.FloatButton.Group(shape="circle",
+ elem_style=dict(insetInlineEnd=24)):
+ with antd.FloatButton(badge=dict(count=12)):
+ antd.Icon("QuestionCircleOutlined")
+ antd.FloatButton(badge=dict(count=123, overflowCount=999))
+ antd.FloatButton.BackTop(visibility_height=0)
+
+ antd.FloatButton(type="primary",
+ elem_style=dict(insetInlineEnd=24 + 70))
+
+ with antd.FloatButton(elem_style=dict(insetInlineEnd=24 + 70 +
+ 70)):
+ with ms.Slot("icon"):
+ antd.Icon("QuestionCircleOutlined")
+ with antd.FloatButton(type="primary",
+ description="Tooltip",
+ elem_style=dict(insetInlineEnd=24 + 140 +
+ 70)):
+ with ms.Slot("tooltip"):
+ ms.Div("Documents")
+if __name__ == "__main__":
+ demo.queue().launch()
diff --git a/docs/components/antd/icon/README-zh_CN.md b/docs/components/antd/icon/README-zh_CN.md
new file mode 100644
index 00000000..4305174e
--- /dev/null
+++ b/docs/components/antd/icon/README-zh_CN.md
@@ -0,0 +1,9 @@
+# Icon
+
+Semantic vector graphics. See [Ant Design](https://ant.design/components/icon/) for more information.
+
+## Examples
+
+
+
+
diff --git a/docs/components/antd/icon/README.md b/docs/components/antd/icon/README.md
new file mode 100644
index 00000000..4305174e
--- /dev/null
+++ b/docs/components/antd/icon/README.md
@@ -0,0 +1,9 @@
+# Icon
+
+Semantic vector graphics. See [Ant Design](https://ant.design/components/icon/) for more information.
+
+## Examples
+
+
+
+
diff --git a/docs/components/MultimodalInput/app.py b/docs/components/antd/icon/app.py
similarity index 72%
rename from docs/components/MultimodalInput/app.py
rename to docs/components/antd/icon/app.py
index 77372ef2..0018b7c1 100644
--- a/docs/components/MultimodalInput/app.py
+++ b/docs/components/antd/icon/app.py
@@ -1,4 +1,4 @@
-from components.Docs import Docs
+from helper.Docs import Docs
docs = Docs(__file__)
diff --git a/docs/components/antd/icon/demos/basic.py b/docs/components/antd/icon/demos/basic.py
new file mode 100644
index 00000000..edb488dd
--- /dev/null
+++ b/docs/components/antd/icon/demos/basic.py
@@ -0,0 +1,20 @@
+import gradio as gr
+
+import modelscope_studio.components.antd as antd
+import modelscope_studio.components.base as ms
+
+with gr.Blocks() as demo:
+ with ms.Application():
+ with antd.ConfigProvider():
+ with antd.Space():
+ antd.Icon("HomeOutlined")
+ antd.Icon("SettingFilled")
+ antd.Icon("SmileOutlined")
+ antd.Icon("SyncOutlined", spin=True)
+ antd.Icon("SmileOutlined", rotate=180)
+ antd.Icon("LoadingOutlined")
+ antd.Icon("SmileTwoTone")
+ icon = antd.Icon("HeartTwoTone", two_tone_color="#eb2f96")
+ icon.click(lambda: print("clicked"))
+if __name__ == "__main__":
+ demo.queue().launch()
diff --git a/docs/components/antd/icon/demos/iconfont.py b/docs/components/antd/icon/demos/iconfont.py
new file mode 100644
index 00000000..d724724e
--- /dev/null
+++ b/docs/components/antd/icon/demos/iconfont.py
@@ -0,0 +1,22 @@
+import gradio as gr
+
+import modelscope_studio.components.antd as antd
+import modelscope_studio.components.base as ms
+
+with gr.Blocks() as demo:
+ with ms.Application():
+ with antd.ConfigProvider():
+ # If you are using [iconfont.cn](https://www.iconfont.cn/), you can use the icons in your project gracefully.
+ with antd.Icon.IconfontProvider(script_url=[
+ "//at.alicdn.com/t/font_8d5l8fzk5b87iudi.js",
+ "//at.alicdn.com/t/font_1788592_a5xf2bdic3u.js"
+ ]):
+ with antd.Space():
+ antd.Icon("icon-python")
+ antd.Icon("icon-tuichu")
+ antd.Icon("icon-facebook",
+ elem_style=dict(color="#1877F2"))
+ antd.Icon("icon-twitter")
+
+if __name__ == "__main__":
+ demo.queue().launch()
diff --git a/docs/components/antd/overview/README-zh_CN.md b/docs/components/antd/overview/README-zh_CN.md
new file mode 100644
index 00000000..e4ab567a
--- /dev/null
+++ b/docs/components/antd/overview/README-zh_CN.md
@@ -0,0 +1,73 @@
+# 概览
+
+`modelscope_studio`集成了 [Ant Design](https://ant.design/) 的组件,并支持大部分的组件属性,您只需要引入`antd`模块即可直接使用。
+
+```python
+import modelscope_studio.components.antd as antd
+```
+
+## 快速开始
+
+
+
+注意:其中`ms.Application`与`antd.ConfigProvider`是必须的。
+
+- `Application` 包含了`modelscope_studio`中所有的组件依赖,请确保`modelscope_studio`所有导出的组件都被其包裹,否则页面将会无法成功预览。
+- `ConfigProvider` 与 Ant Design 中的功能一致,除此之外,我们还加了一些额外的适配来兼容 Gradio 的样式。因此,为了保证页面样式正常,所有的`antd`组件需要包裹在该组件下。
+
+## 属性限制
+
+由于 Python 的类型限制,一些组件属性的支持形式有所不同。
+
+### 事件
+
+在`antd`中,所有以`onXxx`形式绑定的事件,均改为了`gradio`的事件绑定形式,如`onClick`、`onChange`等。如果您想要获取事件参数,也需要绑定`gr.EventData`,所有的事件参数都通过数组的形式保存在`e._data["payload"]`中。
+
+
+
+### ReactNode
+
+在 Python 中无法直接将某个组件作为参数,因此我们提供了插槽机制,您可以使用`ms.Slot`来包裹需要被渲染的模块。
+
+
+
+**注:**
+
+- 您可以通过查看组件的`SLOTS`属性获取所有支持的插槽。
+- 如果您只想渲染一段字符串或数字,您依然可以直接将其作为组件的属性传入,无需使用`ms.Slot`。下面两种写法效果是一样的,并且更推荐直接作为组件属性传入:
+
+ ```python
+ antd.Card(title="Card Title")
+
+ with antd.Card():
+ ms.Slot("title"):
+ ms.Text("Card Title")
+ ```
+
+### 普通函数((...args) => {})
+
+为了支持在 Python 直接传入 Javascript 函数,我们将其改为了`str`类型。因此,您只需要传递普通的函数字符串即可,它会在前端被自动编译为 Javascript 函数。
+
+
+
+我们在全局注入了事件通知对象,您可以通过在函数中调用`window.ms_globals.dispatch`来主动向 Python 端发送事件,在 Python 端可以通过`ms.Application.custom`事件接收。
+
+
+
+### 返回 ReactNode 的函数 ((...args) => ReactNode)
+
+当您的 Javascript 函数返回值为 ReactNode 时,我们提供了两种处理方式:
+
+1. 将其当做普通的 ReactNode 值,继续使用`ms.Slot`来渲染模块,在此基础上,`ms.Slot`还支持传入`params_mapping`参数,该参数同样接收一个 Javascript 函数字符串,它可以将函数的参数映射为当前`slot`环境的上下文(具体请参考`ms.Each`)。
+
+
+
+2. 将其当做普通函数,通过`window.ms_globals.React`与`window.ms_globals.antd`等全局变量在前端生成 ReactNode(注意此时不能使用 jsx,需要使用 `React.createElement`)。
+
+
+
+## 集成其他 Gradio 组件
+
+某些组件的插槽可能只支持`modelscope_studio`中的组件,如果您想要支持其他的 Gradio 组件,您需要使用`Fragment`来将其包裹。
+
+
diff --git a/docs/components/antd/overview/README.md b/docs/components/antd/overview/README.md
new file mode 100644
index 00000000..82bb9278
--- /dev/null
+++ b/docs/components/antd/overview/README.md
@@ -0,0 +1,73 @@
+# Overview
+
+`modelscope_studio` integrates [Ant Design](https://ant.design/) components and supports most component properties. You can use them directly by importing the `antd` module.
+
+```python
+import modelscope_studio.components.antd as antd
+```
+
+## Quick Start
+
+
+
+Note: Both `ms.Application` and `antd.ConfigProvider` are required.
+
+- `Application` contains all component dependencies in `modelscope_studio`. Please ensure that all components exported from `modelscope_studio` are wrapped by it, otherwise the page will not be successfully previewed.
+- `ConfigProvider` functions the same as in Ant Design. Additionally, we have added some extra adaptations to be compatible with Gradio's styles. Therefore, to ensure normal page styling, all `antd` components need to be wrapped within this component.
+
+## Property Limitations
+
+Due to Python's type restrictions, the support for some component properties differs.
+
+### Events
+
+In `antd`, all events bound in the form of `onXxx` have been changed to Gradio's event binding form, such as `onClick`, `onChange`, etc. If you want to get event parameters, you also need to bind `gr.EventData`. All event parameters are stored in the form of an array in `e._data["payload"]`.
+
+
+
+### ReactNode
+
+In Python, it's not possible to directly pass a component as a parameter, so we provide a slot mechanism. You can use `ms.Slot` to wrap the module that needs to be rendered.
+
+
+
+**Note:**
+
+- You can view the `SLOTS` property of the component to get all supported slots.
+- If you only want to render a string or number, you can still pass it directly as a component property without using `ms.Slot`. The following two ways of writing have the same effect, and it's more recommended to pass it directly as a component property:
+
+ ```python
+ antd.Card(title="Card Title")
+
+ with antd.Card():
+ ms.Slot("title"):
+ ms.Text("Card Title")
+ ```
+
+### Regular Functions ((...args) => {})
+
+To support passing JavaScript functions directly in Python, we have changed them to `str` type. Therefore, you only need to pass a regular function string, and it will be automatically compiled into a JavaScript function on the frontend.
+
+
+
+We have injected a global event notification object. You can actively send events to the Python side by calling `window.ms_globals.dispatch` in the function, which can be received on the Python side through the `ms.Application.custom` event.
+
+
+
+### Functions Returning ReactNode ((...args) => ReactNode)
+
+When your JavaScript function returns a ReactNode, we provide two handling methods:
+
+1. Treat it as a regular ReactNode value and continue using `ms.Slot` to render the module. Additionally, `ms.Slot` supports passing a `params_mapping` parameter, which also accepts a JavaScript function string. It can map the function's parameters to the context of the current `slot` environment (refer to `ms.Each` for details).
+
+
+
+2. Treat it as a regular function and generate ReactNode on the frontend using global variables like `window.ms_globals.React` and `window.ms_globals.antd` (note that JSX cannot be used here, you need to use `React.createElement`).
+
+
+
+## Integrating Other Gradio Components
+
+Some component slots may only support components from `modelscope_studio`. If you want to support other Gradio components, you need to wrap them with `Fragment`.
+
+
diff --git a/docs/components/antd/overview/app.py b/docs/components/antd/overview/app.py
new file mode 100644
index 00000000..0018b7c1
--- /dev/null
+++ b/docs/components/antd/overview/app.py
@@ -0,0 +1,6 @@
+from helper.Docs import Docs
+
+docs = Docs(__file__)
+
+if __name__ == "__main__":
+ docs.render().queue().launch()
diff --git a/docs/components/antd/overview/demos/integrate_other_components.py b/docs/components/antd/overview/demos/integrate_other_components.py
new file mode 100644
index 00000000..5749b5c1
--- /dev/null
+++ b/docs/components/antd/overview/demos/integrate_other_components.py
@@ -0,0 +1,17 @@
+import gradio as gr
+
+import modelscope_studio.components.antd as antd
+import modelscope_studio.components.base as ms
+
+with gr.Blocks() as demo:
+ with ms.Application():
+ with antd.ConfigProvider():
+ with antd.Space():
+ antd.Button("1")
+ antd.Button("2")
+ # other gradio components
+ with ms.Fragment():
+ gr.Button("3")
+
+if __name__ == "__main__":
+ demo.queue().launch()
diff --git a/docs/components/antd/overview/demos/limit_event.py b/docs/components/antd/overview/demos/limit_event.py
new file mode 100644
index 00000000..f41e652b
--- /dev/null
+++ b/docs/components/antd/overview/demos/limit_event.py
@@ -0,0 +1,18 @@
+import gradio as gr
+
+import modelscope_studio.components.antd as antd
+import modelscope_studio.components.base as ms
+
+
+def on_change(e: gr.EventData):
+ print(e._data["payload"])
+
+
+with gr.Blocks() as demo:
+ with ms.Application():
+ with antd.ConfigProvider():
+ rate = antd.Rate()
+ rate.change(on_change)
+
+if __name__ == "__main__":
+ demo.queue().launch()
diff --git a/docs/components/antd/overview/demos/limit_function.py b/docs/components/antd/overview/demos/limit_function.py
new file mode 100644
index 00000000..646efb1f
--- /dev/null
+++ b/docs/components/antd/overview/demos/limit_function.py
@@ -0,0 +1,14 @@
+import gradio as gr
+
+import modelscope_studio.components.antd as antd
+import modelscope_studio.components.base as ms
+
+with gr.Blocks() as demo:
+ with ms.Application():
+ with antd.ConfigProvider():
+ antd.Input(show_count=dict(formatter="""({ count }) => {
+ return `${count} characters`;
+ }"""))
+
+if __name__ == "__main__":
+ demo.queue().launch()
diff --git a/docs/components/antd/overview/demos/limit_function_with_event.py b/docs/components/antd/overview/demos/limit_function_with_event.py
new file mode 100644
index 00000000..61eb45a8
--- /dev/null
+++ b/docs/components/antd/overview/demos/limit_function_with_event.py
@@ -0,0 +1,21 @@
+import gradio as gr
+
+import modelscope_studio.components.antd as antd
+import modelscope_studio.components.base as ms
+
+
+def on_custom(e: gr.EventData):
+ print(e._data)
+
+
+with gr.Blocks() as demo:
+ with ms.Application() as app:
+ with antd.ConfigProvider():
+ antd.Input(show_count=dict(formatter="""({ count }) => {
+ window.ms_globals.dispatch({ type: "input_count_change", payload: count });
+ return `${count} characters`;
+ }"""))
+ app.custom(on_custom)
+
+if __name__ == "__main__":
+ demo.queue().launch()
diff --git a/docs/components/antd/overview/demos/limit_react_node.py b/docs/components/antd/overview/demos/limit_react_node.py
new file mode 100644
index 00000000..70cf6f4b
--- /dev/null
+++ b/docs/components/antd/overview/demos/limit_react_node.py
@@ -0,0 +1,22 @@
+import gradio as gr
+
+import modelscope_studio.components.antd as antd
+import modelscope_studio.components.base as ms
+
+with gr.Blocks() as demo:
+ with ms.Application():
+ with antd.ConfigProvider():
+ with antd.Card():
+ ms.Div("Card Content")
+ ms.Div("Card Content")
+ ms.Div("Card Content")
+ # slots
+ with ms.Slot("title"):
+ ms.Text("Card Title")
+ with ms.Slot("extra"):
+ with antd.Button():
+ ms.Text("GitHub")
+ with ms.Slot("icon"):
+ antd.Icon("GithubOutlined")
+if __name__ == "__main__":
+ demo.queue().launch()
diff --git a/docs/components/antd/overview/demos/limit_react_node_function_by_function.py b/docs/components/antd/overview/demos/limit_react_node_function_by_function.py
new file mode 100644
index 00000000..d0046788
--- /dev/null
+++ b/docs/components/antd/overview/demos/limit_react_node_function_by_function.py
@@ -0,0 +1,75 @@
+import gradio as gr
+
+import modelscope_studio.components.antd as antd
+import modelscope_studio.components.base as ms
+
+
+def on_custom(e: gr.EventData):
+ print(e._data)
+
+
+with gr.Blocks() as demo:
+ with ms.Application() as app:
+ with antd.ConfigProvider():
+ with antd.Table([
+ {
+ "key": '1',
+ "name": 'Mike',
+ "age": 32,
+ "address": '10 Downing Street',
+ },
+ {
+ "key": '2',
+ "name": 'John',
+ "age": 42,
+ "address": '11 Downing Street',
+ },
+ ],
+ pagination=False):
+ antd.Table.Column(title="Name", data_index="name", key="name")
+ antd.Table.Column(title="Age", data_index="age", key="age")
+ antd.Table.Column(title="Address",
+ data_index="address",
+ key="address")
+ antd.Table.Column(title="Action",
+ key="action",
+ column_render="""(_, record) => {
+ const React = window.ms_globals.React;
+ const antd = window.ms_globals.antd;
+ const dispatch = window.ms_globals.dispatch;
+ return React.createElement(antd.Space, {
+ size: "middle",
+ children: [
+ React.createElement(antd.Button, {
+ type: "link",
+ onClick: () => {
+ dispatch({
+ type: "table_column_action",
+ payload: {
+ action: "invite",
+ record,
+ },
+ });
+ },
+ children: "Invite " + record.name
+ }),
+ React.createElement(antd.Button, {
+ type: "link",
+ children: "Delete",
+ onClick: () => {
+ dispatch({
+ type: "table_column_action",
+ payload: {
+ action: "delete",
+ record,
+ },
+ });
+ },
+ }),
+ ],
+ });
+ }""")
+
+ app.custom(on_custom)
+if __name__ == "__main__":
+ demo.queue().launch()
diff --git a/docs/components/antd/overview/demos/limit_react_node_function_by_slot.py b/docs/components/antd/overview/demos/limit_react_node_function_by_slot.py
new file mode 100644
index 00000000..6d543362
--- /dev/null
+++ b/docs/components/antd/overview/demos/limit_react_node_function_by_slot.py
@@ -0,0 +1,15 @@
+import gradio as gr
+
+import modelscope_studio.components.antd as antd
+import modelscope_studio.components.base as ms
+
+with gr.Blocks() as demo:
+ with ms.Application():
+ with antd.ConfigProvider():
+ with antd.Statistic(title="Active Users", value=112893):
+ with ms.Slot("formatter",
+ params_mapping="(value) => ({ text: { value }})"):
+ antd.Typography.Text(type="success", as_item="text")
+
+if __name__ == "__main__":
+ demo.queue().launch()
diff --git a/docs/components/antd/overview/demos/quick_start.py b/docs/components/antd/overview/demos/quick_start.py
new file mode 100644
index 00000000..e2e76aea
--- /dev/null
+++ b/docs/components/antd/overview/demos/quick_start.py
@@ -0,0 +1,12 @@
+import gradio as gr
+
+import modelscope_studio.components.antd as antd
+import modelscope_studio.components.base as ms
+
+with gr.Blocks() as demo:
+ with ms.Application():
+ with antd.ConfigProvider():
+ antd.Button("Hello Ant Design", type="primary")
+
+if __name__ == "__main__":
+ demo.queue().launch()
diff --git a/docs/components/antd/typography/README-zh_CN.md b/docs/components/antd/typography/README-zh_CN.md
new file mode 100644
index 00000000..809ae866
--- /dev/null
+++ b/docs/components/antd/typography/README-zh_CN.md
@@ -0,0 +1,7 @@
+# Button
+
+See [Ant Design](https://ant.design/components/float-button/) for more information.
+
+## Examples
+
+
diff --git a/docs/components/antd/typography/README.md b/docs/components/antd/typography/README.md
new file mode 100644
index 00000000..cefa66ef
--- /dev/null
+++ b/docs/components/antd/typography/README.md
@@ -0,0 +1,7 @@
+# Typography
+
+Basic text writing, including headings, body text, lists, and more. See [Ant Design](https://ant.design/components/typography/) for more information.
+
+## Examples
+
+
diff --git a/docs/components/antd/typography/app.py b/docs/components/antd/typography/app.py
new file mode 100644
index 00000000..0018b7c1
--- /dev/null
+++ b/docs/components/antd/typography/app.py
@@ -0,0 +1,6 @@
+from helper.Docs import Docs
+
+docs = Docs(__file__)
+
+if __name__ == "__main__":
+ docs.render().queue().launch()
diff --git a/docs/components/antd/typography/demos/basic.py b/docs/components/antd/typography/demos/basic.py
new file mode 100644
index 00000000..0bb2e584
--- /dev/null
+++ b/docs/components/antd/typography/demos/basic.py
@@ -0,0 +1,23 @@
+import gradio as gr
+
+import modelscope_studio.components.antd as antd
+import modelscope_studio.components.base as ms
+
+
+def on_edit(e: gr.EventData):
+ return gr.update(value=e._data["payload"][0])
+
+
+with gr.Blocks() as demo:
+ with ms.Application():
+ with antd.ConfigProvider():
+ antd.Typography.Title("Hello, World!", level=3)
+ antd.Typography.Text("Hello, World!", disabled=True)
+ antd.Typography.Text("Hello, World!", type="danger")
+ antd.Typography.Paragraph('This is a copyable text.',
+ copyable=True)
+ p = antd.Typography.Paragraph('This is an editable text.')
+ p.editable_change(on_edit, outputs=[p])
+
+if __name__ == "__main__":
+ demo.queue().launch()
diff --git a/docs/components/base/application/README-zh_CN.md b/docs/components/base/application/README-zh_CN.md
new file mode 100644
index 00000000..d73dbb8c
--- /dev/null
+++ b/docs/components/base/application/README-zh_CN.md
@@ -0,0 +1,20 @@
+# Application
+
+应用的根组件,该组件包含了所有`modelscope_studio`的组件依赖,需要确保所有从`modelscope_studio`导出的组件都被其包裹,否则页面将会无法成功预览。
+
+该组件还可以监听用户页面的生命周期,并获取当前用户的环境信息,您可以
+
+- 获取当前用户的语言、页面主题、user agent 和屏幕状态。
+- 监听页面行为并触发相应事件(页面加载、尺寸变化、页面关闭等)。
+
+另外,该组件还提供了`custom`事件,您可以通过在任意 Javascript 函数中调用`window.ms_globals.dispatch`主动向 Python 端发送事件,在 Python 端可以通过`ms.Application.custom`事件接收。
+
+## 示例
+
+
+
+
+
+
+
+
diff --git a/docs/components/base/application/README.md b/docs/components/base/application/README.md
new file mode 100644
index 00000000..49721844
--- /dev/null
+++ b/docs/components/base/application/README.md
@@ -0,0 +1,20 @@
+# Application
+
+The root component of the application, this component contains all the component dependencies of `modelscope_studio`. It is necessary to ensure that all components exported from `modelscope_studio` are wrapped by it, otherwise the page will not be successfully previewed.
+
+In addition, this component can also listen to the lifecycle of the user's page and obtain the current user's environment information, you can:
+
+- Obtain the current user's language, page theme, user agent, and screen status.
+- Listen to page behaviors and trigger corresponding events (page loading, size changes, page closing, etc.).
+
+In addition, this component provides the `custom` event, you can send events to the Python side by calling `window.ms_globals.dispatch` in any Javascript function, and receive the events on the Python side through the `ms.Application.custom` event.
+
+## Examples
+
+
+
+
+
+
+
+
diff --git a/docs/components/base/application/app.py b/docs/components/base/application/app.py
new file mode 100644
index 00000000..0018b7c1
--- /dev/null
+++ b/docs/components/base/application/app.py
@@ -0,0 +1,6 @@
+from helper.Docs import Docs
+
+docs = Docs(__file__)
+
+if __name__ == "__main__":
+ docs.render().queue().launch()
diff --git a/docs/components/base/application/demos/basic.py b/docs/components/base/application/demos/basic.py
new file mode 100644
index 00000000..14d84d05
--- /dev/null
+++ b/docs/components/base/application/demos/basic.py
@@ -0,0 +1,14 @@
+import gradio as gr
+
+import modelscope_studio.components.antd as antd
+import modelscope_studio.components.base as ms
+
+with gr.Blocks() as demo:
+ with ms.Application():
+ with antd.ConfigProvider():
+ antd.Button("Primary Button", type="primary")
+ antd.Divider()
+ antd.Input()
+
+if __name__ == "__main__":
+ demo.queue().launch()
diff --git a/docs/components/base/application/demos/custom_event.py b/docs/components/base/application/demos/custom_event.py
new file mode 100644
index 00000000..3251dca2
--- /dev/null
+++ b/docs/components/base/application/demos/custom_event.py
@@ -0,0 +1,20 @@
+import gradio as gr
+
+import modelscope_studio.components.antd as antd
+import modelscope_studio.components.base as ms
+
+
+def on_custom(e: gr.EventData):
+ print(e._data)
+
+
+with gr.Blocks() as demo:
+ with ms.Application() as app:
+ with antd.ConfigProvider():
+ gr.HTML(
+ """Click me """
+ )
+
+ app.custom(on_custom)
+if __name__ == "__main__":
+ demo.queue().launch()
diff --git a/docs/components/base/application/demos/language_adaptation.py b/docs/components/base/application/demos/language_adaptation.py
new file mode 100644
index 00000000..b1ae2170
--- /dev/null
+++ b/docs/components/base/application/demos/language_adaptation.py
@@ -0,0 +1,39 @@
+import time
+
+import gradio as gr
+
+import modelscope_studio.components.base as ms
+
+messages = {
+ 'en': {
+ "hello": "Hello"
+ },
+ 'en-US': {
+ "hello": "Hello"
+ },
+ 'zh-CN': {
+ "hello": "你好"
+ }
+}
+
+default_lang = "en"
+
+
+def mount(e: gr.EventData, _state):
+ lang = e._data["language"]
+ if (lang in messages):
+ _state["current_lang"] = lang
+ yield 'Switch Language...', _state
+ time.sleep(2)
+ yield messages[lang]["hello"], _state
+
+
+with gr.Blocks() as demo:
+ with ms.Application() as app:
+ state = gr.State({"current_lang": default_lang})
+ markdown = gr.Markdown(value=messages[default_lang]["hello"])
+
+ app.mount(fn=mount, inputs=[state], outputs=[markdown, state])
+
+if __name__ == "__main__":
+ demo.queue().launch()
diff --git a/docs/components/base/application/demos/theme_adaptation.py b/docs/components/base/application/demos/theme_adaptation.py
new file mode 100644
index 00000000..4d9cb2ef
--- /dev/null
+++ b/docs/components/base/application/demos/theme_adaptation.py
@@ -0,0 +1,34 @@
+import gradio as gr
+
+import modelscope_studio.components.antd as antd
+import modelscope_studio.components.base as ms
+
+
+def mount(e: gr.EventData, _state):
+ _state["theme"] = e._data["theme"]
+ yield _state
+
+
+def fn(_state):
+ theme = _state["theme"]
+ color = '000/fff' if theme == 'dark' else 'fff/000'
+ yield gr.update(
+ value=f"https://dummyimage.com/200x100/{color}.png&text={theme}")
+
+
+with gr.Blocks() as demo:
+ state = gr.State({"theme": "light"})
+ with ms.Application() as app:
+ with antd.ConfigProvider():
+ btn = antd.Button(
+ "Run",
+ type="primary",
+ block=True,
+ )
+ image = antd.Image()
+
+ app.mount(fn=mount, inputs=[state], outputs=[state])
+ btn.click(fn=fn, inputs=[state], outputs=[image])
+
+if __name__ == "__main__":
+ demo.queue().launch()
diff --git a/docs/components/base/div/README-zh_CN.md b/docs/components/base/div/README-zh_CN.md
new file mode 100644
index 00000000..34937273
--- /dev/null
+++ b/docs/components/base/div/README-zh_CN.md
@@ -0,0 +1,7 @@
+# Div
+
+同 HTML 中的`div`标签,用于辅助布局,可以绑定常用的 HTML 事件,具体事件请查看`EVENTS`属性。
+
+## 示例
+
+
diff --git a/docs/components/base/div/README.md b/docs/components/base/div/README.md
new file mode 100644
index 00000000..76615738
--- /dev/null
+++ b/docs/components/base/div/README.md
@@ -0,0 +1,7 @@
+# Div
+
+Same as the `div` tag in HTML, used for layout assistance, can bind common HTML events, please refer to the `EVENTS` property for specific events.
+
+## Examples
+
+
diff --git a/docs/components/base/div/app.py b/docs/components/base/div/app.py
new file mode 100644
index 00000000..0018b7c1
--- /dev/null
+++ b/docs/components/base/div/app.py
@@ -0,0 +1,6 @@
+from helper.Docs import Docs
+
+docs = Docs(__file__)
+
+if __name__ == "__main__":
+ docs.render().queue().launch()
diff --git a/docs/components/base/div/demos/basic.py b/docs/components/base/div/demos/basic.py
new file mode 100644
index 00000000..ca614f9b
--- /dev/null
+++ b/docs/components/base/div/demos/basic.py
@@ -0,0 +1,12 @@
+import gradio as gr
+
+import modelscope_studio.components.antd as antd
+import modelscope_studio.components.base as ms
+
+with gr.Blocks() as demo:
+ with ms.Application():
+ with ms.Div(elem_style=dict(color="red", fontSize=22)):
+ ms.Text("Hello Div")
+
+if __name__ == "__main__":
+ demo.queue().launch()
diff --git a/docs/components/base/each/README-zh_CN.md b/docs/components/base/each/README-zh_CN.md
new file mode 100644
index 00000000..d2fb4257
--- /dev/null
+++ b/docs/components/base/each/README-zh_CN.md
@@ -0,0 +1,27 @@
+# Each
+
+辅助渲染组件,该组件支持传入列表作为参数,并会在前端遍历被包裹的组件,将列表的每一项注入当前遍历的上下文中,被包裹的组件属性会在前端被相应的上下文属性替换(只支持从`modelscope_studio`中导出的组件)。
+
+## 何时使用
+
+- 当被遍历的组件中全部都是`modelscope_studio`组件或非`modelscope_studio`的组件值不与被遍历的值绑定时;
+- 当需要遍历展示的列表长度无法确定时;
+
+## 示例
+
+
+
+`modelscope_studio`中的每个组件都有一个`as_item`参数(包括`Each`组件本身),指定该参数值后可以直接基于上下文的值做过滤,逻辑上类似`ctx_value = ctx_value["as_item"]`。该特性通常在需要遍历多个组件时使用,可以有效避免属性冲突。
+
+
+
+如果您需要为所有的列表项的组件都添加某些统一的属性,您还可以传入`context_value`参数,该参数会与列表项的上下文深度合并,共同传递给前端组件。
+
+
+
+### API
+
+| 属性 | 类型 | 默认值 | 描述 |
+| ------------- | ---- | ------ | ---------------- |
+| value | list | None | 组件的数据源 |
+| context_value | dict | None | 统一的上下文参数 |
diff --git a/docs/components/base/each/README.md b/docs/components/base/each/README.md
new file mode 100644
index 00000000..2c22674d
--- /dev/null
+++ b/docs/components/base/each/README.md
@@ -0,0 +1,27 @@
+# Each
+
+A helper rendering component that supports passing a list as a parameter and will traverse the wrapped components on the front end, injecting each item of the list into the current traversal context. The attributes of the wrapped components will be replaced by corresponding context properties on the front end (only supports components exported from `modelscope_studio`).
+
+## When to Use
+
+- When all components being traversed are `modelscope_studio` components or non-`modelscope_studio` components whose values do not bind to the traversed values.
+- When the length of the list to be traversed is uncertain.
+
+## Examples
+
+
+
+Each component within `modelscope_studio` has an `as_item` parameter (including the `Each` component itself). Specifying this parameter value allows filtering based directly on the context value, similar logically to `ctx_value = ctx_value["as_item"]`. This feature is typically used when multiple components need to be iterated over, effectively avoiding property conflicts.
+
+
+
+If you need to add certain unified properties to all list item components, you can also pass in the `context_value` parameter. This parameter will be deeply merged with the list item's context and passed together to the front-end component.
+
+
+
+### API
+
+| Attribute | Type | Default Value | Description |
+| ------------- | ---- | ------------- | ----------------------------- |
+| value | list | None | Data source for the component |
+| context_value | dict | None | Unified context parameters |
diff --git a/docs/components/base/each/app.py b/docs/components/base/each/app.py
new file mode 100644
index 00000000..0018b7c1
--- /dev/null
+++ b/docs/components/base/each/app.py
@@ -0,0 +1,6 @@
+from helper.Docs import Docs
+
+docs = Docs(__file__)
+
+if __name__ == "__main__":
+ docs.render().queue().launch()
diff --git a/docs/components/base/each/demos/basic.py b/docs/components/base/each/demos/basic.py
new file mode 100644
index 00000000..ca274360
--- /dev/null
+++ b/docs/components/base/each/demos/basic.py
@@ -0,0 +1,35 @@
+import gradio as gr
+
+import modelscope_studio.components.antd as antd
+import modelscope_studio.components.base as ms
+
+data = [{
+ "message": "Success Text",
+ "description":
+ "Success Description Success Description Success Description Success Description",
+ "type": "success"
+}, {
+ "message": "Info Text",
+ "description":
+ "Info Description Info Description Info Description Info Description",
+ "type": "info"
+}, {
+ "message": "Warning Text",
+ "description":
+ "Warning Description Warning Description Warning Description Warning Description",
+ "type": "warning"
+}, {
+ "message": "Error Text",
+ "description":
+ "Error Description Error Description Error Description Error Description",
+ "type": "error"
+}]
+
+with gr.Blocks() as demo:
+ with ms.Application():
+ with antd.Space(direction="vertical"):
+ with ms.Each(value=data):
+ antd.Alert()
+
+if __name__ == "__main__":
+ demo.queue().launch()
diff --git a/docs/components/base/each/demos/use_as_item.py b/docs/components/base/each/demos/use_as_item.py
new file mode 100644
index 00000000..a2982911
--- /dev/null
+++ b/docs/components/base/each/demos/use_as_item.py
@@ -0,0 +1,69 @@
+import gradio as gr
+
+import modelscope_studio.components.antd as antd
+import modelscope_studio.components.base as ms
+
+data = [{
+ "card": {
+ "title": "Success Card Title",
+ },
+ "each": {
+ "value": [{
+ "value": "Card Content"
+ }, {
+ "value": "Card Content"
+ }, {
+ "value": "Card Content"
+ }]
+ }
+}, {
+ "card": {
+ "title": "Info Card Title",
+ },
+ "each": {
+ "value": [{
+ "value": "Card Content"
+ }, {
+ "value": "Card Content"
+ }, {
+ "value": "Card Content"
+ }]
+ }
+}, {
+ "card": {
+ "title": "Warning Card Title",
+ },
+ "each": {
+ "value": [{
+ "value": "Card Content"
+ }, {
+ "value": "Card Content"
+ }, {
+ "value": "Card Content"
+ }]
+ }
+}, {
+ "card": {
+ "title": "Error Card Title",
+ },
+ "each": {
+ "value": [{
+ "value": "Card Content"
+ }, {
+ "value": "Card Content"
+ }, {
+ "value": "Card Content"
+ }]
+ }
+}]
+
+with gr.Blocks() as demo:
+ with ms.Application():
+ with ms.Each(value=data):
+ with antd.Card(as_item="card"):
+ # Inner loop
+ with ms.Each(as_item="each"):
+ antd.Typography.Paragraph()
+
+if __name__ == "__main__":
+ demo.queue().launch()
diff --git a/docs/components/base/each/demos/use_context_value.py b/docs/components/base/each/demos/use_context_value.py
new file mode 100644
index 00000000..2e6e0f19
--- /dev/null
+++ b/docs/components/base/each/demos/use_context_value.py
@@ -0,0 +1,69 @@
+import gradio as gr
+
+import modelscope_studio.components.antd as antd
+import modelscope_studio.components.base as ms
+
+data = [{
+ "card": {
+ "title": "Success Card Title",
+ },
+ "each": {
+ "value": [{
+ "value": "Card Content"
+ }, {
+ "value": "Card Content"
+ }, {
+ "value": "Card Content"
+ }]
+ }
+}, {
+ "card": {
+ "title": "Info Card Title",
+ },
+ "each": {
+ "value": [{
+ "value": "Card Content"
+ }, {
+ "value": "Card Content"
+ }, {
+ "value": "Card Content"
+ }]
+ }
+}, {
+ "card": {
+ "title": "Warning Card Title",
+ },
+ "each": {
+ "value": [{
+ "value": "Card Content"
+ }, {
+ "value": "Card Content"
+ }, {
+ "value": "Card Content"
+ }]
+ }
+}, {
+ "card": {
+ "title": "Error Card Title",
+ },
+ "each": {
+ "value": [{
+ "value": "Card Content"
+ }, {
+ "value": "Card Content"
+ }, {
+ "value": "Card Content"
+ }]
+ }
+}]
+
+with gr.Blocks() as demo:
+ with ms.Application():
+ with ms.Each(value=data, context_value={"card": {"hoverable": True}}):
+ with antd.Card(as_item="card"):
+ # Inner loop
+ with ms.Each(as_item="each"):
+ antd.Typography.Paragraph()
+
+if __name__ == "__main__":
+ demo.queue().launch()
diff --git a/docs/components/base/filter/README-zh_CN.md b/docs/components/base/filter/README-zh_CN.md
new file mode 100644
index 00000000..488c422f
--- /dev/null
+++ b/docs/components/base/filter/README-zh_CN.md
@@ -0,0 +1,21 @@
+# Filter
+
+辅助渲染组件,该组件需要与`Each`组件配合使用,用于过滤`Each`组件中的上下文信息。
+
+该组件的`as_item`参数有所不同,它会将过滤后的上下文信息作为基础继续往下传递,适合在多个模块组件的`Each`组件遍历中使用。
+
+同时,您也可以传入`params_mapping`参数,该参数允许用户通过 Javascript 函数的形式自定义过滤上下文信息。
+
+而如果不传入任何参数,该组件会阻断`Each`组件的上下文传递,让属性的覆盖失效。
+
+## 示例
+
+
+
+
+
+
+
+### API
+
+| Property | Type | Default Value | Description |
+| -------------- | ---- | ------------- | -------------------------------------------------------------------------------------------------------------------------------------------- |
+| params_mapping | str | None | This value is a string of a Javascript function, allowing users to customize the filtering of context information via a JavaScript function. |
diff --git a/docs/components/base/filter/app.py b/docs/components/base/filter/app.py
new file mode 100644
index 00000000..0018b7c1
--- /dev/null
+++ b/docs/components/base/filter/app.py
@@ -0,0 +1,6 @@
+from helper.Docs import Docs
+
+docs = Docs(__file__)
+
+if __name__ == "__main__":
+ docs.render().queue().launch()
diff --git a/docs/components/base/filter/demos/basic.py b/docs/components/base/filter/demos/basic.py
new file mode 100644
index 00000000..54f66581
--- /dev/null
+++ b/docs/components/base/filter/demos/basic.py
@@ -0,0 +1,20 @@
+import gradio as gr
+
+import modelscope_studio.components.antd as antd
+import modelscope_studio.components.base as ms
+
+data = [{"value": "Hello"}, {"value": "World"}]
+
+with gr.Blocks() as demo:
+ with ms.Application():
+ with antd.Space(direction="vertical"):
+ antd.Divider("Without Filter")
+ with ms.Each(value=data):
+ antd.Button()
+ antd.Divider("With Filter")
+ with ms.Each(value=data):
+ with ms.Filter():
+ antd.Button("Run")
+
+if __name__ == "__main__":
+ demo.queue().launch()
diff --git a/docs/components/base/filter/demos/use_as_item.py b/docs/components/base/filter/demos/use_as_item.py
new file mode 100644
index 00000000..a6fc55c0
--- /dev/null
+++ b/docs/components/base/filter/demos/use_as_item.py
@@ -0,0 +1,27 @@
+import gradio as gr
+
+import modelscope_studio.components.antd as antd
+import modelscope_studio.components.base as ms
+
+data = [{
+ "title": "Card Title",
+ "btn": {
+ "value": "Hello"
+ }
+}, {
+ "title": "Card Title",
+ "btn": {
+ "value": "World"
+ }
+}]
+
+with gr.Blocks() as demo:
+ with ms.Application():
+ with antd.Space(direction="vertical"):
+ with ms.Each(value=data):
+ with antd.Card():
+ with ms.Filter(as_item="btn"):
+ antd.Button()
+
+if __name__ == "__main__":
+ demo.queue().launch()
diff --git a/docs/components/base/filter/demos/use_params_mapping.py b/docs/components/base/filter/demos/use_params_mapping.py
new file mode 100644
index 00000000..e048ca7d
--- /dev/null
+++ b/docs/components/base/filter/demos/use_params_mapping.py
@@ -0,0 +1,26 @@
+import gradio as gr
+
+import modelscope_studio.components.antd as antd
+import modelscope_studio.components.base as ms
+
+data = [{
+ "title": "Card Title",
+ "desc": "Hello"
+}, {
+ "title": "Card Title",
+ "desc": "World"
+}]
+
+with gr.Blocks() as demo:
+ with ms.Application():
+ with antd.Space(direction="vertical"):
+ with ms.Each(value=data):
+ with antd.Card():
+ with ms.Filter(
+ params_mapping=
+ """(props) => ({ value: props.desc, type: props.desc === 'World' ? 'primary' : 'default' })"""
+ ):
+ antd.Button()
+
+if __name__ == "__main__":
+ demo.queue().launch()
diff --git a/docs/components/base/fragment/README-zh_CN.md b/docs/components/base/fragment/README-zh_CN.md
new file mode 100644
index 00000000..c6018905
--- /dev/null
+++ b/docs/components/base/fragment/README-zh_CN.md
@@ -0,0 +1,9 @@
+# Fragment
+
+分段组件,该组件本身不会参与页面布局,它的主要作用是组合多个子组件,并将它们共同包装为`modelscope_studio`组件。
+
+> 部分组件的插槽仅支持从`modelscope_studio`中导出的组件,如果您需要插入其他组件,就需要使用`Fragment`组件进行包裹。
+
+## 示例
+
+
diff --git a/docs/components/base/fragment/README.md b/docs/components/base/fragment/README.md
new file mode 100644
index 00000000..02bc4b45
--- /dev/null
+++ b/docs/components/base/fragment/README.md
@@ -0,0 +1,9 @@
+# Fragment
+
+A fragment component that does not participate in page layout itself. Its main purpose is to combine multiple child components and wrap them together as a `modelscope_studio` component.
+
+> Some component slots only support components exported from `modelscope_studio`. If you need to insert other components, you'll need to wrap them with the `Fragment` component.
+
+## Examples
+
+
diff --git a/docs/components/base/fragment/app.py b/docs/components/base/fragment/app.py
new file mode 100644
index 00000000..0018b7c1
--- /dev/null
+++ b/docs/components/base/fragment/app.py
@@ -0,0 +1,6 @@
+from helper.Docs import Docs
+
+docs = Docs(__file__)
+
+if __name__ == "__main__":
+ docs.render().queue().launch()
diff --git a/docs/components/base/fragment/demos/basic.py b/docs/components/base/fragment/demos/basic.py
new file mode 100644
index 00000000..4f82b3ea
--- /dev/null
+++ b/docs/components/base/fragment/demos/basic.py
@@ -0,0 +1,22 @@
+import gradio as gr
+
+import modelscope_studio.components.antd as antd
+import modelscope_studio.components.base as ms
+
+with gr.Blocks() as demo:
+ with ms.Application():
+ with antd.ConfigProvider():
+ antd.Divider("Without Fragment")
+ with antd.Space():
+ antd.Button("Antd Button")
+ antd.Button("Antd Button")
+ gr.Button("Gradio Button")
+ antd.Divider("With Fragment")
+ with antd.Space():
+ antd.Button("Antd Button")
+ antd.Button("Antd Button")
+ with ms.Fragment():
+ gr.Button("Gradio Button")
+
+if __name__ == "__main__":
+ demo.queue().launch()
diff --git a/docs/components/base/slot/README-zh_CN.md b/docs/components/base/slot/README-zh_CN.md
new file mode 100644
index 00000000..376a2617
--- /dev/null
+++ b/docs/components/base/slot/README-zh_CN.md
@@ -0,0 +1,16 @@
+# Slot
+
+插槽组件,需要与`modelscope_studio`中的其他组件一起使用,可以传入指定插槽名称,从而将该组件插入到目标组件的指定位置。
+
+`modelscope_studio`中组件的插槽可以通过获取`SLOTS`属性查看。
+
+## 示例
+
+
+
+### API
+
+| 属性 | 类型 | 默认值 | 描述 |
+| -------------- | ---- | ------ | -------------------------------------------------------------------------------------------------------------------------- |
+| value | str | None | 插槽名称 |
+| params_mapping | str | None | 该值为一个 Javascript 的函数字符串,当对应插槽可以接受参数时,通过此参数可以将参数映射为插槽的上下文,具体请参考`Each`组件 |
diff --git a/docs/components/base/slot/README.md b/docs/components/base/slot/README.md
new file mode 100644
index 00000000..a8c4fc4b
--- /dev/null
+++ b/docs/components/base/slot/README.md
@@ -0,0 +1,16 @@
+# Slot
+
+A slot component that needs to be used with other components in `modelscope_studio`. You can pass in a specified slot name to insert this component into the specified position of the target component.
+
+The slots of components in `modelscope_studio` can be viewed by getting the `SLOTS` property.
+
+## Examples
+
+
+
+### API
+
+| Attribute | Type | Default Value | Description |
+| -------------- | ---- | ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| value | str | None | Slot name |
+| params_mapping | str | None | This value is a string of a Javascript function. When the corresponding slot can accept parameters, the parameters can be mapped to the slot context through this parameter, please refer to the `Each` component for details. |
diff --git a/docs/components/base/slot/app.py b/docs/components/base/slot/app.py
new file mode 100644
index 00000000..0018b7c1
--- /dev/null
+++ b/docs/components/base/slot/app.py
@@ -0,0 +1,6 @@
+from helper.Docs import Docs
+
+docs = Docs(__file__)
+
+if __name__ == "__main__":
+ docs.render().queue().launch()
diff --git a/docs/components/base/slot/demos/basic.py b/docs/components/base/slot/demos/basic.py
new file mode 100644
index 00000000..7123e0a3
--- /dev/null
+++ b/docs/components/base/slot/demos/basic.py
@@ -0,0 +1,23 @@
+import gradio as gr
+
+import modelscope_studio.components.antd as antd
+import modelscope_studio.components.base as ms
+
+with gr.Blocks() as demo:
+ with ms.Application():
+ with antd.ConfigProvider():
+ with antd.Card():
+ ms.Div("Card Content")
+ ms.Div("Card Content")
+ ms.Div("Card Content")
+ # slots
+ with ms.Slot("title"):
+ ms.Text("Card Title")
+ with ms.Slot("extra"):
+ with antd.Button():
+ ms.Text("GitHub")
+ with ms.Slot("icon"):
+ antd.Icon("GithubOutlined")
+
+if __name__ == "__main__":
+ demo.queue().launch()
diff --git a/docs/components/base/span/README-zh_CN.md b/docs/components/base/span/README-zh_CN.md
new file mode 100644
index 00000000..22ed1ed9
--- /dev/null
+++ b/docs/components/base/span/README-zh_CN.md
@@ -0,0 +1,7 @@
+# Span
+
+同 HTML 中的`span`标签,用于辅助布局,可以绑定常用的 HTML 事件,具体事件请查看`EVENTS`属性。
+
+## 示例
+
+
diff --git a/docs/components/base/span/README.md b/docs/components/base/span/README.md
new file mode 100644
index 00000000..df2c4b44
--- /dev/null
+++ b/docs/components/base/span/README.md
@@ -0,0 +1,7 @@
+# Span
+
+Same as the `span` tag in HTML, used for layout assistance, can bind common HTML events, please refer to the `EVENTS` property for specific events.
+
+## Examples
+
+
diff --git a/docs/components/base/span/app.py b/docs/components/base/span/app.py
new file mode 100644
index 00000000..0018b7c1
--- /dev/null
+++ b/docs/components/base/span/app.py
@@ -0,0 +1,6 @@
+from helper.Docs import Docs
+
+docs = Docs(__file__)
+
+if __name__ == "__main__":
+ docs.render().queue().launch()
diff --git a/docs/components/base/span/demos/basic.py b/docs/components/base/span/demos/basic.py
new file mode 100644
index 00000000..ed722ca8
--- /dev/null
+++ b/docs/components/base/span/demos/basic.py
@@ -0,0 +1,12 @@
+import gradio as gr
+
+import modelscope_studio.components.antd as antd
+import modelscope_studio.components.base as ms
+
+with gr.Blocks() as demo:
+ with ms.Application():
+ with ms.Span(elem_style=dict(color="red", fontSize=22)):
+ ms.Text("Hello Span")
+
+if __name__ == "__main__":
+ demo.queue().launch()
diff --git a/docs/components/base/text/README-zh_CN.md b/docs/components/base/text/README-zh_CN.md
new file mode 100644
index 00000000..d932c34b
--- /dev/null
+++ b/docs/components/base/text/README-zh_CN.md
@@ -0,0 +1,7 @@
+# Text
+
+纯文本字符串,类似 HTML 中的`textNode`,用于辅助布局。
+
+## 示例
+
+
diff --git a/docs/components/base/text/README.md b/docs/components/base/text/README.md
new file mode 100644
index 00000000..902e8054
--- /dev/null
+++ b/docs/components/base/text/README.md
@@ -0,0 +1,7 @@
+# Text
+
+Plain text string, similar to `textNode` in HTML, used for layout assistance.
+
+## Examples
+
+
diff --git a/docs/components/base/text/app.py b/docs/components/base/text/app.py
new file mode 100644
index 00000000..0018b7c1
--- /dev/null
+++ b/docs/components/base/text/app.py
@@ -0,0 +1,6 @@
+from helper.Docs import Docs
+
+docs = Docs(__file__)
+
+if __name__ == "__main__":
+ docs.render().queue().launch()
diff --git a/docs/components/base/text/demos/basic.py b/docs/components/base/text/demos/basic.py
new file mode 100644
index 00000000..e6ec5d4e
--- /dev/null
+++ b/docs/components/base/text/demos/basic.py
@@ -0,0 +1,11 @@
+import gradio as gr
+
+import modelscope_studio.components.antd as antd
+import modelscope_studio.components.base as ms
+
+with gr.Blocks() as demo:
+ with ms.Application():
+ ms.Text("Hello Text")
+
+if __name__ == "__main__":
+ demo.queue().launch()
diff --git a/docs/components/Chatbot/README-zh_CN.md b/docs/components/legacy/Chatbot/README-zh_CN.md
similarity index 99%
rename from docs/components/Chatbot/README-zh_CN.md
rename to docs/components/legacy/Chatbot/README-zh_CN.md
index d88ea4a8..307e40d8 100644
--- a/docs/components/Chatbot/README-zh_CN.md
+++ b/docs/components/legacy/Chatbot/README-zh_CN.md
@@ -30,7 +30,7 @@
```python
import modelscope_studio as mgr
-from modelscope_studio.components.Chatbot.llm_thinking_presets import qwen
+from modelscope_studio.components.legacy.Chatbot.llm_thinking_presets import qwen
# 添加 qwen 解析预设
mgr.Chatbot(llm_thinking_presets=[qwen()])
diff --git a/docs/components/Chatbot/README.md b/docs/components/legacy/Chatbot/README.md
similarity index 99%
rename from docs/components/Chatbot/README.md
rename to docs/components/legacy/Chatbot/README.md
index 21d1904d..5aeb32e1 100644
--- a/docs/components/Chatbot/README.md
+++ b/docs/components/legacy/Chatbot/README.md
@@ -29,7 +29,7 @@ Additionally, to adapt to the toolchain usage of large models, some preset confi
```python
import modelscope_studio as mgr
-from modelscope_studio.components.Chatbot.llm_thinking_presets import qwen
+from modelscope_studio.components.legacy.Chatbot.llm_thinking_presets import qwen
# Add qwen preset
mgr.Chatbot(llm_thinking_presets=[qwen()])
diff --git a/docs/components/legacy/Chatbot/app.py b/docs/components/legacy/Chatbot/app.py
new file mode 100644
index 00000000..ea841f78
--- /dev/null
+++ b/docs/components/legacy/Chatbot/app.py
@@ -0,0 +1,6 @@
+from components.legacy.Docs import Docs
+
+docs = Docs(__file__)
+
+if __name__ == "__main__":
+ docs.render().queue().launch()
diff --git a/docs/components/Chatbot/demos/accordion.py b/docs/components/legacy/Chatbot/demos/accordion.py
similarity index 93%
rename from docs/components/Chatbot/demos/accordion.py
rename to docs/components/legacy/Chatbot/demos/accordion.py
index 2f6430bd..ed3ca9e2 100644
--- a/docs/components/Chatbot/demos/accordion.py
+++ b/docs/components/legacy/Chatbot/demos/accordion.py
@@ -3,7 +3,8 @@
import gradio as gr
import modelscope_studio as mgr
-from modelscope_studio.components.Chatbot.llm_thinking_presets import qwen
+from modelscope_studio.components.legacy.Chatbot.llm_thinking_presets import \
+ qwen
def resolve_assets(relative_path):
diff --git a/docs/components/Chatbot/demos/basic.py b/docs/components/legacy/Chatbot/demos/basic.py
similarity index 100%
rename from docs/components/Chatbot/demos/basic.py
rename to docs/components/legacy/Chatbot/demos/basic.py
diff --git a/docs/components/Chatbot/demos/chart.py b/docs/components/legacy/Chatbot/demos/chart.py
similarity index 100%
rename from docs/components/Chatbot/demos/chart.py
rename to docs/components/legacy/Chatbot/demos/chart.py
diff --git a/docs/components/Chatbot/demos/message_config.py b/docs/components/legacy/Chatbot/demos/message_config.py
similarity index 100%
rename from docs/components/Chatbot/demos/message_config.py
rename to docs/components/legacy/Chatbot/demos/message_config.py
diff --git a/docs/components/Chatbot/demos/multi_bots.py b/docs/components/legacy/Chatbot/demos/multi_bots.py
similarity index 100%
rename from docs/components/Chatbot/demos/multi_bots.py
rename to docs/components/legacy/Chatbot/demos/multi_bots.py
diff --git a/docs/components/Chatbot/demos/multimodal.py b/docs/components/legacy/Chatbot/demos/multimodal.py
similarity index 100%
rename from docs/components/Chatbot/demos/multimodal.py
rename to docs/components/legacy/Chatbot/demos/multimodal.py
diff --git a/docs/components/Chatbot/demos/select-box.py b/docs/components/legacy/Chatbot/demos/select-box.py
similarity index 88%
rename from docs/components/Chatbot/demos/select-box.py
rename to docs/components/legacy/Chatbot/demos/select-box.py
index 6035ba30..89b7b6f7 100644
--- a/docs/components/Chatbot/demos/select-box.py
+++ b/docs/components/legacy/Chatbot/demos/select-box.py
@@ -11,9 +11,9 @@
None, f"""
Single Select:
-Multiple Select:
+Multiple Select:
-Vertical Direction:
+Vertical Direction:
diff --git a/docs/components/Docs.py b/docs/components/legacy/Docs.py
similarity index 97%
rename from docs/components/Docs.py
rename to docs/components/legacy/Docs.py
index 71d863bb..ca095155 100644
--- a/docs/components/Docs.py
+++ b/docs/components/legacy/Docs.py
@@ -3,6 +3,7 @@
from typing import Callable
import gradio as gr
+from helper.env import is_modelscope_studio
import modelscope_studio as mgr
@@ -62,9 +63,6 @@ def get_demo_modules(file_path: str):
return demo_modules
-is_modelscope_studio = os.getenv('MODELSCOPE_ENVIRONMENT') == 'studio'
-
-
class Docs:
def __init__(self, file_path: str, markdown_files: list = None):
@@ -153,7 +151,7 @@ def render_markdown(self,
def render(self, components_tabs=None):
def tab_link_click(data: gr.EventData):
- tab: str = data._data["value"].get("tab", '')
+ tab: str = data._data.get("value", {}).get("tab", '')
component_tab: str = data._data["value"].get("component_tab", '')
if tab and tabs:
return {tabs: gr.update(selected=tab)}
diff --git a/docs/components/Flow/README-zh_CN.md b/docs/components/legacy/Flow/README-zh_CN.md
similarity index 100%
rename from docs/components/Flow/README-zh_CN.md
rename to docs/components/legacy/Flow/README-zh_CN.md
diff --git a/docs/components/Flow/README.md b/docs/components/legacy/Flow/README.md
similarity index 100%
rename from docs/components/Flow/README.md
rename to docs/components/legacy/Flow/README.md
diff --git a/docs/components/legacy/Flow/app.py b/docs/components/legacy/Flow/app.py
new file mode 100644
index 00000000..ea841f78
--- /dev/null
+++ b/docs/components/legacy/Flow/app.py
@@ -0,0 +1,6 @@
+from components.legacy.Docs import Docs
+
+docs = Docs(__file__)
+
+if __name__ == "__main__":
+ docs.render().queue().launch()
diff --git a/docs/components/Flow/define_schema-zh_CN.md b/docs/components/legacy/Flow/define_schema-zh_CN.md
similarity index 100%
rename from docs/components/Flow/define_schema-zh_CN.md
rename to docs/components/legacy/Flow/define_schema-zh_CN.md
diff --git a/docs/components/Flow/define_schema.md b/docs/components/legacy/Flow/define_schema.md
similarity index 100%
rename from docs/components/Flow/define_schema.md
rename to docs/components/legacy/Flow/define_schema.md
diff --git a/docs/components/Flow/demos/basic.py b/docs/components/legacy/Flow/demos/basic.py
similarity index 92%
rename from docs/components/Flow/demos/basic.py
rename to docs/components/legacy/Flow/demos/basic.py
index 920e7fc5..3505892f 100644
--- a/docs/components/Flow/demos/basic.py
+++ b/docs/components/legacy/Flow/demos/basic.py
@@ -4,7 +4,7 @@
import gradio as gr
import modelscope_studio as mgr
-from modelscope_studio.components.Flow import Edge, Node
+from modelscope_studio.components.legacy.Flow import Edge, Node
with open((os.path.join(os.path.dirname(__file__),
"../schema/agents_schema.json"))) as f:
diff --git a/docs/components/Flow/demos/component_options.py b/docs/components/legacy/Flow/demos/component_options.py
similarity index 96%
rename from docs/components/Flow/demos/component_options.py
rename to docs/components/legacy/Flow/demos/component_options.py
index b080470f..6182594f 100644
--- a/docs/components/Flow/demos/component_options.py
+++ b/docs/components/legacy/Flow/demos/component_options.py
@@ -4,7 +4,8 @@
import gradio as gr
import modelscope_studio as mgr
-from modelscope_studio.components.Flow import BackgroundPropsDict, Edge, Node
+from modelscope_studio.components.legacy.Flow import (BackgroundPropsDict,
+ Edge, Node)
with open((os.path.join(os.path.dirname(__file__),
"../schema/agents_schema.json"))) as f:
diff --git a/docs/components/Flow/demos/custom_node_type.py b/docs/components/legacy/Flow/demos/custom_node_type.py
similarity index 87%
rename from docs/components/Flow/demos/custom_node_type.py
rename to docs/components/legacy/Flow/demos/custom_node_type.py
index e40d3e40..c3f59e74 100644
--- a/docs/components/Flow/demos/custom_node_type.py
+++ b/docs/components/legacy/Flow/demos/custom_node_type.py
@@ -1,9 +1,9 @@
import gradio as gr
import modelscope_studio as mgr
-from modelscope_studio.components.Flow import (FlowSchemaDict, Node,
- NodeSchemaAttributeDict,
- NodeSchemaDict)
+from modelscope_studio.components.legacy.Flow import (FlowSchemaDict, Node,
+ NodeSchemaAttributeDict,
+ NodeSchemaDict)
def on_data_change(_flow):
diff --git a/docs/components/Flow/schema/agents_schema.json b/docs/components/legacy/Flow/schema/agents_schema.json
similarity index 100%
rename from docs/components/Flow/schema/agents_schema.json
rename to docs/components/legacy/Flow/schema/agents_schema.json
diff --git a/docs/components/Flow/schema/agents_schema.py b/docs/components/legacy/Flow/schema/agents_schema.py
similarity index 97%
rename from docs/components/Flow/schema/agents_schema.py
rename to docs/components/legacy/Flow/schema/agents_schema.py
index 9cc1f6c8..d80f7848 100644
--- a/docs/components/Flow/schema/agents_schema.py
+++ b/docs/components/legacy/Flow/schema/agents_schema.py
@@ -1,6 +1,6 @@
import os
-from modelscope_studio.components.Flow import (
+from modelscope_studio.components.legacy.Flow import (
FlowSchemaDict, NodeSchemaAttributeDict, NodeSchemaAttributeListDict,
NodeSchemaAttributeRequiredDict, NodeSchemaDict, NodeSchemaPortsDict,
NodeSchemaTemplateDict)
diff --git a/docs/components/Lifecycle/README-zh_CN.md b/docs/components/legacy/Lifecycle/README-zh_CN.md
similarity index 100%
rename from docs/components/Lifecycle/README-zh_CN.md
rename to docs/components/legacy/Lifecycle/README-zh_CN.md
diff --git a/docs/components/Lifecycle/README.md b/docs/components/legacy/Lifecycle/README.md
similarity index 100%
rename from docs/components/Lifecycle/README.md
rename to docs/components/legacy/Lifecycle/README.md
diff --git a/docs/components/legacy/Lifecycle/app.py b/docs/components/legacy/Lifecycle/app.py
new file mode 100644
index 00000000..ea841f78
--- /dev/null
+++ b/docs/components/legacy/Lifecycle/app.py
@@ -0,0 +1,6 @@
+from components.legacy.Docs import Docs
+
+docs = Docs(__file__)
+
+if __name__ == "__main__":
+ docs.render().queue().launch()
diff --git a/docs/components/Lifecycle/demos/basic.py b/docs/components/legacy/Lifecycle/demos/basic.py
similarity index 100%
rename from docs/components/Lifecycle/demos/basic.py
rename to docs/components/legacy/Lifecycle/demos/basic.py
diff --git a/docs/components/Lifecycle/demos/language_adaptation.py b/docs/components/legacy/Lifecycle/demos/language_adaptation.py
similarity index 100%
rename from docs/components/Lifecycle/demos/language_adaptation.py
rename to docs/components/legacy/Lifecycle/demos/language_adaptation.py
diff --git a/docs/components/Lifecycle/demos/theme_adaptation.py b/docs/components/legacy/Lifecycle/demos/theme_adaptation.py
similarity index 100%
rename from docs/components/Lifecycle/demos/theme_adaptation.py
rename to docs/components/legacy/Lifecycle/demos/theme_adaptation.py
diff --git a/docs/components/Markdown/README-zh_CN.md b/docs/components/legacy/Markdown/README-zh_CN.md
similarity index 100%
rename from docs/components/Markdown/README-zh_CN.md
rename to docs/components/legacy/Markdown/README-zh_CN.md
diff --git a/docs/components/Markdown/README.md b/docs/components/legacy/Markdown/README.md
similarity index 100%
rename from docs/components/Markdown/README.md
rename to docs/components/legacy/Markdown/README.md
diff --git a/docs/components/Markdown/app.py b/docs/components/legacy/Markdown/app.py
similarity index 90%
rename from docs/components/Markdown/app.py
rename to docs/components/legacy/Markdown/app.py
index 4e59b254..7b991a9d 100644
--- a/docs/components/Markdown/app.py
+++ b/docs/components/legacy/Markdown/app.py
@@ -1,6 +1,6 @@
import os
-from components.Docs import Docs
+from components.legacy.Docs import Docs
def resolve(relative_path: str):
diff --git a/docs/components/Markdown/custom_tags/accordion-zh_CN.md b/docs/components/legacy/Markdown/custom_tags/accordion-zh_CN.md
similarity index 100%
rename from docs/components/Markdown/custom_tags/accordion-zh_CN.md
rename to docs/components/legacy/Markdown/custom_tags/accordion-zh_CN.md
diff --git a/docs/components/Markdown/custom_tags/accordion.md b/docs/components/legacy/Markdown/custom_tags/accordion.md
similarity index 100%
rename from docs/components/Markdown/custom_tags/accordion.md
rename to docs/components/legacy/Markdown/custom_tags/accordion.md
diff --git a/docs/components/Markdown/custom_tags/chart-zh_CN.md b/docs/components/legacy/Markdown/custom_tags/chart-zh_CN.md
similarity index 100%
rename from docs/components/Markdown/custom_tags/chart-zh_CN.md
rename to docs/components/legacy/Markdown/custom_tags/chart-zh_CN.md
diff --git a/docs/components/Markdown/custom_tags/chart.md b/docs/components/legacy/Markdown/custom_tags/chart.md
similarity index 100%
rename from docs/components/Markdown/custom_tags/chart.md
rename to docs/components/legacy/Markdown/custom_tags/chart.md
diff --git a/docs/components/Markdown/custom_tags/select-box-zh_CN.md b/docs/components/legacy/Markdown/custom_tags/select-box-zh_CN.md
similarity index 100%
rename from docs/components/Markdown/custom_tags/select-box-zh_CN.md
rename to docs/components/legacy/Markdown/custom_tags/select-box-zh_CN.md
diff --git a/docs/components/Markdown/custom_tags/select-box.md b/docs/components/legacy/Markdown/custom_tags/select-box.md
similarity index 100%
rename from docs/components/Markdown/custom_tags/select-box.md
rename to docs/components/legacy/Markdown/custom_tags/select-box.md
diff --git a/docs/components/Markdown/demos/accordion.py b/docs/components/legacy/Markdown/demos/accordion.py
similarity index 89%
rename from docs/components/Markdown/demos/accordion.py
rename to docs/components/legacy/Markdown/demos/accordion.py
index 924b3548..dc92779e 100644
--- a/docs/components/Markdown/demos/accordion.py
+++ b/docs/components/legacy/Markdown/demos/accordion.py
@@ -12,7 +12,7 @@
-Use `::accordion-title` to support markdown:
+Use `::accordion-title` to support markdown:
diff --git a/docs/components/Markdown/demos/basic.py b/docs/components/legacy/Markdown/demos/basic.py
similarity index 100%
rename from docs/components/Markdown/demos/basic.py
rename to docs/components/legacy/Markdown/demos/basic.py
diff --git a/docs/components/Markdown/demos/chart.py b/docs/components/legacy/Markdown/demos/chart.py
similarity index 100%
rename from docs/components/Markdown/demos/chart.py
rename to docs/components/legacy/Markdown/demos/chart.py
diff --git a/docs/components/Markdown/demos/custom-tag.py b/docs/components/legacy/Markdown/demos/custom-tag.py
similarity index 100%
rename from docs/components/Markdown/demos/custom-tag.py
rename to docs/components/legacy/Markdown/demos/custom-tag.py
diff --git a/docs/components/Markdown/demos/custom-tag2.py b/docs/components/legacy/Markdown/demos/custom-tag2.py
similarity index 100%
rename from docs/components/Markdown/demos/custom-tag2.py
rename to docs/components/legacy/Markdown/demos/custom-tag2.py
diff --git a/docs/components/Markdown/demos/custom-tag3.py b/docs/components/legacy/Markdown/demos/custom-tag3.py
similarity index 100%
rename from docs/components/Markdown/demos/custom-tag3.py
rename to docs/components/legacy/Markdown/demos/custom-tag3.py
diff --git a/docs/components/Markdown/demos/custom-tag4.py b/docs/components/legacy/Markdown/demos/custom-tag4.py
similarity index 100%
rename from docs/components/Markdown/demos/custom-tag4.py
rename to docs/components/legacy/Markdown/demos/custom-tag4.py
diff --git a/docs/components/Markdown/demos/custom_tags/accordion/accordion-title.py b/docs/components/legacy/Markdown/demos/custom_tags/accordion/accordion-title.py
similarity index 100%
rename from docs/components/Markdown/demos/custom_tags/accordion/accordion-title.py
rename to docs/components/legacy/Markdown/demos/custom_tags/accordion/accordion-title.py
diff --git a/docs/components/Markdown/demos/custom_tags/accordion/basic.py b/docs/components/legacy/Markdown/demos/custom_tags/accordion/basic.py
similarity index 100%
rename from docs/components/Markdown/demos/custom_tags/accordion/basic.py
rename to docs/components/legacy/Markdown/demos/custom_tags/accordion/basic.py
diff --git a/docs/components/Markdown/demos/custom_tags/chart/basic.py b/docs/components/legacy/Markdown/demos/custom_tags/chart/basic.py
similarity index 100%
rename from docs/components/Markdown/demos/custom_tags/chart/basic.py
rename to docs/components/legacy/Markdown/demos/custom_tags/chart/basic.py
diff --git a/docs/components/Markdown/demos/custom_tags/select-box/basic.py b/docs/components/legacy/Markdown/demos/custom_tags/select-box/basic.py
similarity index 75%
rename from docs/components/Markdown/demos/custom_tags/select-box/basic.py
rename to docs/components/legacy/Markdown/demos/custom_tags/select-box/basic.py
index eb03c2fe..faa90914 100644
--- a/docs/components/Markdown/demos/custom_tags/select-box/basic.py
+++ b/docs/components/legacy/Markdown/demos/custom_tags/select-box/basic.py
@@ -10,9 +10,9 @@
mgr.Markdown(
f"""Single Select:
-Multiple Select:
+Multiple Select:
-Vertical Direction:
+Vertical Direction:
""", )
diff --git a/docs/components/Markdown/demos/custom_tags/select-box/card_shape.py b/docs/components/legacy/Markdown/demos/custom_tags/select-box/card_shape.py
similarity index 95%
rename from docs/components/Markdown/demos/custom_tags/select-box/card_shape.py
rename to docs/components/legacy/Markdown/demos/custom_tags/select-box/card_shape.py
index b2813b85..6142f959 100644
--- a/docs/components/Markdown/demos/custom_tags/select-box/card_shape.py
+++ b/docs/components/legacy/Markdown/demos/custom_tags/select-box/card_shape.py
@@ -20,11 +20,11 @@
mgr.Markdown(
f"""
-Custom Columns:
+Custom Columns:
-Vertical Direction:
+Vertical Direction:
""")
diff --git a/docs/components/Markdown/demos/custom_tags/select-box/card_shape_width_auto.py b/docs/components/legacy/Markdown/demos/custom_tags/select-box/card_shape_width_auto.py
similarity index 100%
rename from docs/components/Markdown/demos/custom_tags/select-box/card_shape_width_auto.py
rename to docs/components/legacy/Markdown/demos/custom_tags/select-box/card_shape_width_auto.py
diff --git a/docs/components/Markdown/demos/custom_tags/select-box/python_events.py b/docs/components/legacy/Markdown/demos/custom_tags/select-box/python_events.py
similarity index 100%
rename from docs/components/Markdown/demos/custom_tags/select-box/python_events.py
rename to docs/components/legacy/Markdown/demos/custom_tags/select-box/python_events.py
diff --git a/docs/components/Markdown/demos/multimodal.py b/docs/components/legacy/Markdown/demos/multimodal.py
similarity index 100%
rename from docs/components/Markdown/demos/multimodal.py
rename to docs/components/legacy/Markdown/demos/multimodal.py
diff --git a/docs/components/Markdown/demos/select-box.py b/docs/components/legacy/Markdown/demos/select-box.py
similarity index 85%
rename from docs/components/Markdown/demos/select-box.py
rename to docs/components/legacy/Markdown/demos/select-box.py
index 9b69862b..5aca51aa 100644
--- a/docs/components/Markdown/demos/select-box.py
+++ b/docs/components/legacy/Markdown/demos/select-box.py
@@ -11,9 +11,9 @@
mgr.Markdown(f"""
Single Select:
-Multiple Select:
+Multiple Select:
-Vertical Direction:
+Vertical Direction:
diff --git a/docs/components/MultimodalInput/README-zh_CN.md b/docs/components/legacy/MultimodalInput/README-zh_CN.md
similarity index 100%
rename from docs/components/MultimodalInput/README-zh_CN.md
rename to docs/components/legacy/MultimodalInput/README-zh_CN.md
diff --git a/docs/components/MultimodalInput/README.md b/docs/components/legacy/MultimodalInput/README.md
similarity index 100%
rename from docs/components/MultimodalInput/README.md
rename to docs/components/legacy/MultimodalInput/README.md
diff --git a/docs/components/legacy/MultimodalInput/app.py b/docs/components/legacy/MultimodalInput/app.py
new file mode 100644
index 00000000..ea841f78
--- /dev/null
+++ b/docs/components/legacy/MultimodalInput/app.py
@@ -0,0 +1,6 @@
+from components.legacy.Docs import Docs
+
+docs = Docs(__file__)
+
+if __name__ == "__main__":
+ docs.render().queue().launch()
diff --git a/docs/components/MultimodalInput/demos/basic.py b/docs/components/legacy/MultimodalInput/demos/basic.py
similarity index 100%
rename from docs/components/MultimodalInput/demos/basic.py
rename to docs/components/legacy/MultimodalInput/demos/basic.py
diff --git a/docs/components/MultimodalInput/demos/config_buttons.py b/docs/components/legacy/MultimodalInput/demos/config_buttons.py
similarity index 100%
rename from docs/components/MultimodalInput/demos/config_buttons.py
rename to docs/components/legacy/MultimodalInput/demos/config_buttons.py
diff --git a/docs/components/MultimodalInput/demos/upload_sources.py b/docs/components/legacy/MultimodalInput/demos/upload_sources.py
similarity index 100%
rename from docs/components/MultimodalInput/demos/upload_sources.py
rename to docs/components/legacy/MultimodalInput/demos/upload_sources.py
diff --git a/docs/components/MultimodalInput/demos/with_chatbot.py b/docs/components/legacy/MultimodalInput/demos/with_chatbot.py
similarity index 100%
rename from docs/components/MultimodalInput/demos/with_chatbot.py
rename to docs/components/legacy/MultimodalInput/demos/with_chatbot.py
diff --git a/docs/components/legacy/README-zh_CN.md b/docs/components/legacy/README-zh_CN.md
new file mode 100644
index 00000000..578a1739
--- /dev/null
+++ b/docs/components/legacy/README-zh_CN.md
@@ -0,0 +1,33 @@
+ModelScope Studio
+
+
+
+
+ ✖️
+
+
+
+
+
+GitHub | 🤖 ModelScope Studio | 🤗 Hugging Face Space
+
+`modelscope_studio` 是一套基于 gradio 4.x 的扩展组件库,致力于服务于 ModelScope 创空间中对于 gradio 应用的各类扩展需求,目前主要聚集在对话场景增强、多模态场景以及一些其他垂直场景支持。
+
+## Install
+
+```sh
+pip install modelscope_studio
+```
+
+## API
+
+- load
+
+## Components
+
+- Chatbot
+- MultimodalInput
+- Markdown
+- WaterfallGallery
+- Lifecycle
+- Flow
diff --git a/docs/components/legacy/README.md b/docs/components/legacy/README.md
new file mode 100644
index 00000000..821b96fa
--- /dev/null
+++ b/docs/components/legacy/README.md
@@ -0,0 +1,33 @@
+
ModelScope Studio
+
+
+
+
+ ✖️
+
+
+
+
+
+GitHub | 🤖 ModelScope Studio | 🤗 Hugging Face Space
+
+`modelscope_studio` is a set of extension component libraries based on gradio 4.x, dedicated to serving the various extension needs of gradio applications within the ModelScope Studio. It mainly focuses on enhancing conversational scenarios, supporting multimodal contexts, and providing assistance for various other specialized scenarios.
+
+## Install
+
+```sh
+pip install modelscope_studio
+```
+
+## API
+
+- load
+
+## Components
+
+- Chatbot
+- MultimodalInput
+- Markdown
+- Lifecycle
+- WaterfallGallery
+- Flow
diff --git a/docs/components/WaterfallGallery/README-zh_CN.md b/docs/components/legacy/WaterfallGallery/README-zh_CN.md
similarity index 100%
rename from docs/components/WaterfallGallery/README-zh_CN.md
rename to docs/components/legacy/WaterfallGallery/README-zh_CN.md
diff --git a/docs/components/WaterfallGallery/README.md b/docs/components/legacy/WaterfallGallery/README.md
similarity index 100%
rename from docs/components/WaterfallGallery/README.md
rename to docs/components/legacy/WaterfallGallery/README.md
diff --git a/docs/components/legacy/WaterfallGallery/app.py b/docs/components/legacy/WaterfallGallery/app.py
new file mode 100644
index 00000000..ea841f78
--- /dev/null
+++ b/docs/components/legacy/WaterfallGallery/app.py
@@ -0,0 +1,6 @@
+from components.legacy.Docs import Docs
+
+docs = Docs(__file__)
+
+if __name__ == "__main__":
+ docs.render().queue().launch()
diff --git a/docs/components/WaterfallGallery/demos/basic.py b/docs/components/legacy/WaterfallGallery/demos/basic.py
similarity index 100%
rename from docs/components/WaterfallGallery/demos/basic.py
rename to docs/components/legacy/WaterfallGallery/demos/basic.py
diff --git a/docs/components/WaterfallGallery/demos/like_click_feedback.py b/docs/components/legacy/WaterfallGallery/demos/like_click_feedback.py
similarity index 100%
rename from docs/components/WaterfallGallery/demos/like_click_feedback.py
rename to docs/components/legacy/WaterfallGallery/demos/like_click_feedback.py
diff --git a/docs/components/WaterfallGallery/demos/load_more.py b/docs/components/legacy/WaterfallGallery/demos/load_more.py
similarity index 100%
rename from docs/components/WaterfallGallery/demos/load_more.py
rename to docs/components/legacy/WaterfallGallery/demos/load_more.py
diff --git a/docs/components/WaterfallGallery/demos/responsive_columns.py b/docs/components/legacy/WaterfallGallery/demos/responsive_columns.py
similarity index 100%
rename from docs/components/WaterfallGallery/demos/responsive_columns.py
rename to docs/components/legacy/WaterfallGallery/demos/responsive_columns.py
diff --git a/docs/components/legacy/app.py b/docs/components/legacy/app.py
new file mode 100644
index 00000000..b379d049
--- /dev/null
+++ b/docs/components/legacy/app.py
@@ -0,0 +1,35 @@
+import gradio as gr
+from api.app import docs as api_docs
+from components.legacy.Chatbot.app import docs as chatbot_docs
+from components.legacy.Docs import Docs
+from components.legacy.Flow.app import docs as flow_docs
+from components.legacy.Lifecycle.app import docs as lifecycle_docs
+from components.legacy.Markdown.app import docs as markdown_docs
+from components.legacy.MultimodalInput.app import docs as multimodel_input_docs
+from components.legacy.WaterfallGallery.app import \
+ docs as waterfall_gallery_docs
+
+import modelscope_studio.components.base as ms
+
+readme_docs = Docs(__file__)
+
+docs = [
+ ["Quick Start", readme_docs],
+ ["API", api_docs],
+ ["Chatbot", chatbot_docs],
+ ["MultimodalInput", multimodel_input_docs],
+ ["Markdown", markdown_docs],
+ ["Lifecycle", lifecycle_docs],
+ ["WaterfallGallery", waterfall_gallery_docs],
+ ["Flow", flow_docs],
+]
+
+with gr.Blocks() as legacy_demo:
+ with ms.Application():
+ with gr.Tabs() as components_tabs:
+ for doc in docs:
+ with gr.TabItem(doc[0], id=doc[0]):
+ doc[1].render(components_tabs)
+
+if __name__ == "__main__":
+ legacy_demo.launch()
diff --git a/docs/components/parse_markdown.py b/docs/components/legacy/parse_markdown.py
similarity index 100%
rename from docs/components/parse_markdown.py
rename to docs/components/legacy/parse_markdown.py
diff --git a/docs/components/resources/audio.wav b/docs/components/legacy/resources/audio.wav
similarity index 100%
rename from docs/components/resources/audio.wav
rename to docs/components/legacy/resources/audio.wav
diff --git a/docs/components/resources/bot.jpeg b/docs/components/legacy/resources/bot.jpeg
similarity index 100%
rename from docs/components/resources/bot.jpeg
rename to docs/components/legacy/resources/bot.jpeg
diff --git a/docs/components/resources/custom_components/custom_select.js b/docs/components/legacy/resources/custom_components/custom_select.js
similarity index 100%
rename from docs/components/resources/custom_components/custom_select.js
rename to docs/components/legacy/resources/custom_components/custom_select.js
diff --git a/docs/components/resources/dog.mp4 b/docs/components/legacy/resources/dog.mp4
similarity index 100%
rename from docs/components/resources/dog.mp4
rename to docs/components/legacy/resources/dog.mp4
diff --git a/docs/components/resources/image-bot.jpeg b/docs/components/legacy/resources/image-bot.jpeg
similarity index 100%
rename from docs/components/resources/image-bot.jpeg
rename to docs/components/legacy/resources/image-bot.jpeg
diff --git a/docs/components/resources/modelscope.svg b/docs/components/legacy/resources/modelscope.svg
similarity index 100%
rename from docs/components/resources/modelscope.svg
rename to docs/components/legacy/resources/modelscope.svg
diff --git a/docs/components/resources/music-bot.jpeg b/docs/components/legacy/resources/music-bot.jpeg
similarity index 100%
rename from docs/components/resources/music-bot.jpeg
rename to docs/components/legacy/resources/music-bot.jpeg
diff --git a/docs/components/resources/screen.jpeg b/docs/components/legacy/resources/screen.jpeg
similarity index 100%
rename from docs/components/resources/screen.jpeg
rename to docs/components/legacy/resources/screen.jpeg
diff --git a/docs/components/resources/user.jpeg b/docs/components/legacy/resources/user.jpeg
similarity index 100%
rename from docs/components/resources/user.jpeg
rename to docs/components/legacy/resources/user.jpeg
diff --git a/docs/components/tab-link.js b/docs/components/legacy/tab-link.js
similarity index 100%
rename from docs/components/tab-link.js
rename to docs/components/legacy/tab-link.js
diff --git a/docs/demos/example.py b/docs/demos/example.py
new file mode 100644
index 00000000..a5551f18
--- /dev/null
+++ b/docs/demos/example.py
@@ -0,0 +1,12 @@
+import gradio as gr
+
+import modelscope_studio.components.antd as antd
+import modelscope_studio.components.base as ms
+
+with gr.Blocks() as demo:
+ with ms.Application():
+ with antd.ConfigProvider():
+ antd.DatePicker()
+
+if __name__ == "__main__":
+ demo.queue().launch()
diff --git a/docs/helper/Docs.py b/docs/helper/Docs.py
new file mode 100644
index 00000000..c072332e
--- /dev/null
+++ b/docs/helper/Docs.py
@@ -0,0 +1,128 @@
+import os
+import re
+
+import gradio as gr
+
+import modelscope_studio.components.antd as antd
+import modelscope_studio.components.base as ms
+import modelscope_studio.components.legacy as mgr
+
+from .env import is_modelscope_studio
+from .parse_markdown import parse_markdown
+
+
+class Docs:
+
+ def __init__(self, file_path: str):
+ self.file_path = file_path
+ # default current directory
+ self.markdown_files = [
+ filename for filename in os.listdir(os.path.dirname(file_path))
+ if filename.endswith(".md")
+ ]
+ self.demo_modules = self._get_demo_modules()
+ if is_modelscope_studio:
+ self.markdown_files = list(
+ filter(
+ lambda x: x.endswith("-zh_CN.md") or
+ (f"{'.'.join(x.split('.')[:-1])}-zh_CN.md" not in self.
+ markdown_files), self.markdown_files))
+ else:
+ self.markdown_files = list(
+ filter(lambda x: not x.endswith("-zh_CN.md"),
+ self.markdown_files))
+
+ def _remove_formatter(self, markdown_text):
+ pattern = r"^ *---[\s\S]*?---"
+ replaced_text = re.sub(pattern, "", markdown_text)
+ return replaced_text
+
+ def _list_demos(self, dir_path: str, prefix=''):
+ result = []
+ if (not os.path.isdir(dir_path)):
+ return result
+ for name in os.listdir(dir_path):
+ path = os.path.join(dir_path, name)
+
+ if os.path.isfile(path):
+ result.append(prefix + name)
+ elif os.path.isdir(path):
+ sub_prefix = prefix + name + '/'
+ result.extend(self._list_demos(path, sub_prefix))
+
+ return result
+
+ def _get_demo_modules(self):
+ import importlib.util
+
+ demos = [
+ demo for demo in self._list_demos(
+ os.path.join(os.path.dirname(self.file_path), "demos"))
+ if demo.endswith(".py") and not demo.startswith("__")
+ ]
+ demo_modules = {}
+ for demo in demos:
+ demo_name = demo.split(".")[0]
+ spec = importlib.util.spec_from_file_location(
+ "demo",
+ os.path.join(os.path.dirname(self.file_path), "demos", demo))
+ module = importlib.util.module_from_spec(spec)
+ spec.loader.exec_module(module)
+ demo_modules[demo_name] = module
+ return demo_modules
+
+ def _read_file(self, relative_path: str):
+ with open(os.path.join(os.path.dirname(self.file_path), relative_path),
+ "r") as f:
+ return f.read()
+
+ def _render_demo(self,
+ demo_name,
+ prefix='',
+ suffix='',
+ fixed=False,
+ title=''):
+ content = self._read_file(f"./demos/{demo_name}.py")
+ module = self.demo_modules[demo_name]
+ with antd.Card(styles=dict(body=dict(padding=10)),
+ elem_style=dict(margin="8px 0")):
+ if title:
+ with ms.Slot("title"):
+ ms.Text(title)
+ with antd.Row(align="stretch", wrap=False):
+ with antd.Col(span=10):
+ with antd.Flex(elem_style=dict(height='100%')):
+ prefix = prefix + "\n" if prefix else ""
+ suffix = "\n" + suffix if suffix else ""
+ gr.Markdown(f"""{prefix}```python
+{content}
+```{suffix}""",
+ header_links=True)
+ antd.Divider(type="vertical",
+ variant="dashed",
+ elem_style=dict(height='100%'))
+ with antd.Col(
+ span=14,
+ elem_style=dict(
+ width='100%',
+ transform="translate(0, 0)" if fixed else None)):
+ module.demo.render()
+
+ def _render_markdown(self, markdown_file):
+ items = parse_markdown(self._remove_formatter(
+ self._read_file(markdown_file)),
+ read_file=self._read_file)
+ for item in items:
+ if item["type"] == "text":
+ mgr.Markdown(item["value"], header_links=True, preview=False)
+ elif item["type"] == "demo":
+ self._render_demo(item["name"],
+ prefix=item["prefix"],
+ suffix=item["suffix"],
+ fixed=item["fixed"],
+ title=item["title"])
+
+ def render(self):
+ with gr.Blocks() as demo:
+ self._render_markdown(self.markdown_files[0])
+ return demo
diff --git a/docs/helper/Site.py b/docs/helper/Site.py
new file mode 100644
index 00000000..2b8bda34
--- /dev/null
+++ b/docs/helper/Site.py
@@ -0,0 +1,197 @@
+from typing import Callable
+
+import gradio as gr
+from gradio.components.base import Component
+
+import modelscope_studio.components.antd as antd
+import modelscope_studio.components.base as ms
+
+
+class Site:
+
+ def __init__(self,
+ tabs: list,
+ docs: dict,
+ default_active_tab: str | None = None,
+ logo: Component | Callable | None = None):
+ self.tabs = tabs
+ self.docs = docs
+ self.default_active_tab = default_active_tab
+ self.default_active_tab_item = next(
+ (item for item in self.tabs if item["key"] == default_active_tab),
+ {})
+ self.logo = logo
+
+ def _render_docs(self, items: list, tab: dict):
+ docs_tabs = []
+ for item in items:
+ if "children" in item:
+ docs_tabs.extend(self._render_docs(item["children"], tab))
+ elif "key" in item:
+ key = item["key"].replace("-", "_")
+ tab_docs = self.docs.get(tab["key"], {})
+ if key in tab_docs:
+ with antd.Tabs.Item(
+ key=key,
+ visible=True if tab.get("default_active_key")
+ == key else False) as docs_tab:
+ docs_tabs.append(docs_tab)
+ tab_docs[key].render()
+ return docs_tabs
+
+ def render(self):
+
+ def on_tab_menu_select(e: gr.EventData):
+ selected_tab = e._data["payload"][0]["key"]
+ item = next(
+ (item for item in tab_components if item.key == selected_tab),
+ tab_components[0])
+
+ return {
+ tab_menu: gr.update(selected_keys=[selected_tab]),
+ tabs: gr.update(active_key=selected_tab),
+ item: gr.update(visible=True)
+ }
+
+ with gr.Blocks(css="""
+.gradio-container {
+ max-width: 100% !important;
+ padding: 0 !important;
+}
+""") as demo:
+ with ms.Application():
+ with antd.ConfigProvider():
+ with antd.Layout(elem_style=dict(
+ height=
+ "calc(100vh - var(--size-4) - var(--body-text-size) * 1.5)"
+ )):
+ with antd.Layout.Header(elem_style=dict(
+ padding='0 16px',
+ backgroundColor=
+ "var(--ms-gr-ant-color-bg-container)")):
+ with antd.Flex(align='center', gap=8):
+ if self.logo:
+ with antd.Flex(
+ justify="center",
+ align='center',
+ elem_style=dict(height='100%')):
+ if callable(self.logo):
+ self.logo()
+ else:
+ self.logo.render()
+ tab_menu = antd.Menu(
+ mode="horizontal",
+ selected_keys=[self.default_active_tab],
+ items=self.tabs,
+ elem_style=dict(flex=1, minWidth=0))
+
+ with antd.Tabs(
+ active_key=self.default_active_tab,
+ render_tab_bar="() => null",
+ ) as tabs:
+ tab_components = []
+ for tab in self.tabs:
+ with antd.Tabs.Item(
+ key=tab["key"],
+ elem_style=dict(
+ height=
+ "calc(100vh - var(--size-4) - var(--body-text-size) * 1.5 - 64px)"
+ ),
+ visible=True if self.default_active_tab
+ == tab["key"] else False) as tab_item:
+ tab_components.append(tab_item)
+ if "content" in tab:
+ # custom render
+ with ms.Div(elem_style=dict(
+ maxHeight="100%",
+ overflow="auto")):
+ tab["content"].render()
+ elif "menus" in tab:
+ # menus render
+ with antd.Layout(elem_style=dict(
+ height='100%')):
+ with antd.Layout.Sider(
+ elem_style=dict(
+ height=
+ "calc(100vh - 64px)",
+ overflow="auto",
+ position="relative",
+ backgroundColor=
+ "var(--ms-gr-ant-color-bg-container)"
+ )):
+ sider_menu = antd.Menu(
+ selected_keys=[
+ tab.get(
+ "default_active_key",
+ None)
+ ],
+ mode="inline",
+ items=tab.get("menus", []))
+ if "extra_menu_footer" in tab:
+ if callable(tab[
+ "extra_menu_footer"]
+ ):
+ tab["extra_menu_footer"](
+ )
+ else:
+ tab["extra_menu_footer"].render(
+ )
+
+ with antd.Layout(elem_style=dict(
+ width=0)):
+ with antd.Layout.Content(
+ elem_style=dict(
+ padding='12px 28px',
+ overflow="auto")):
+ with antd.Tabs(
+ active_key=tab.get(
+ "default_active_key",
+ None),
+ render_tab_bar=
+ "() => null"
+ ) as layout_content_tabs:
+ docs_tabs = self._render_docs(
+ tab.get(
+ "menus", []),
+ tab)
+
+ def on_layout_menu_select_wrapper(
+ tabs, sider_menu,
+ layout_content_tabs):
+
+ def on_layout_menu_select(
+ e: gr.EventData):
+ selected_menu = e._data["payload"][
+ 0]["key"]
+
+ item = next(
+ (item for item in tabs
+ if item.key == selected_menu),
+ tabs[0])
+
+ return {
+ sider_menu:
+ gr.update(selected_keys=[
+ selected_menu
+ ]),
+ layout_content_tabs:
+ gr.update(
+ active_key=selected_menu),
+ item:
+ gr.update(visible=True)
+ }
+
+ return on_layout_menu_select
+
+ sider_menu.select(
+ fn=on_layout_menu_select_wrapper(
+ docs_tabs, sider_menu,
+ layout_content_tabs),
+ outputs=[
+ sider_menu, layout_content_tabs,
+ *docs_tabs
+ ])
+ tab_menu.select(
+ fn=on_tab_menu_select,
+ outputs=[tab_menu, tabs, *tab_components])
+ return demo
diff --git a/docs/helper/env.py b/docs/helper/env.py
new file mode 100644
index 00000000..f8bcd124
--- /dev/null
+++ b/docs/helper/env.py
@@ -0,0 +1,3 @@
+import os
+
+is_modelscope_studio = os.getenv('MODELSCOPE_ENVIRONMENT') == 'studio'
diff --git a/docs/helper/parse_markdown.py b/docs/helper/parse_markdown.py
new file mode 100644
index 00000000..73f58104
--- /dev/null
+++ b/docs/helper/parse_markdown.py
@@ -0,0 +1,81 @@
+from html.parser import HTMLParser
+
+
+def default_read_file(path):
+ with open(path, "r") as f:
+ return f.read()
+
+
+enable_tags = ["demo", "demo-prefix", "demo-suffix", "file"]
+
+
+class MarkdownParser(HTMLParser):
+
+ def __init__(self, read_file=None):
+ super().__init__()
+ self.value = [{"type": "text", "value": ""}]
+ self.tag_stack = []
+ self.read_file = read_file or default_read_file
+ self.current_tag = None
+
+ def get_value(self):
+ return self.value
+
+ def handle_data(self, data: str) -> None:
+ if self.value[-1]["type"] == "text":
+ self.value[-1]["value"] += data
+ elif self.current_tag is None:
+ self.value.append({"type": "text", "value": data})
+ elif self.current_tag == "demo-prefix":
+ self.value[-1]["prefix"] += data
+ elif self.current_tag == "demo-suffix":
+ self.value[-1]["suffix"] += data
+
+ def handle_startendtag(self, tag: str, attrs) -> None:
+ if tag not in enable_tags:
+ self.handle_data(self.get_starttag_text())
+ return
+
+ def handle_starttag(self, tag: str, attrs) -> None:
+ if (tag not in enable_tags):
+ self.handle_data(self.get_starttag_text())
+ return
+ if tag == "demo":
+ self.value.append({
+ "type": "demo",
+ "name": dict(attrs)["name"],
+ "fixed": "fixed" in dict(attrs),
+ "prefix": "",
+ "suffix": "",
+ "title": dict(attrs).get("title", "")
+ })
+ elif tag == "file":
+ content = self.read_file(dict(attrs)["src"])
+ if self.value[-1]["type"] == "text":
+ self.value[-1]["value"] += content
+ elif self.current_tag == "demo-prefix":
+ self.value[-1]["prefix"] += content
+ elif self.current_tag == "demo-suffix":
+ self.value[-1]["suffix"] += content
+ self.current_tag = tag
+ self.tag_stack.append(self.current_tag)
+
+ def handle_endtag(self, tag: str) -> None:
+
+ if (tag not in enable_tags):
+ self.handle_data(f"{tag}>")
+ return
+ if (len(self.tag_stack) > 0):
+ self.tag_stack.pop()
+ if (len(self.tag_stack) > 0):
+ self.current_tag = self.tag_stack[-1]
+ else:
+ self.current_tag = None
+ else:
+ self.current_tag = None
+
+
+def parse_markdown(markdown: str, read_file=None):
+ parser = MarkdownParser(read_file=read_file)
+ parser.feed(markdown)
+ return parser.get_value()
diff --git a/docs/legacy_app.py b/docs/legacy_app.py
new file mode 100644
index 00000000..d7b855df
--- /dev/null
+++ b/docs/legacy_app.py
@@ -0,0 +1,6 @@
+from components.legacy.app import legacy_demo
+
+demo = legacy_demo
+
+if __name__ == "__main__":
+ demo.launch()
diff --git a/docs/requirements.txt b/docs/requirements.txt
index b4f81f0e..793fbae6 100644
--- a/docs/requirements.txt
+++ b/docs/requirements.txt
@@ -1,2 +1,2 @@
modelscope_studio
-modelscope_studio-0.4.0-py3-none-any.whl
+modelscope_studio-1.0.0b3-py3-none-any.whl
diff --git a/docs/resources/gradio.png b/docs/resources/gradio.png
new file mode 100644
index 0000000000000000000000000000000000000000..8b0eedf4af724e36d28caa72882695cb0a5e5e06
GIT binary patch
literal 52484
zcmeFZ_g9nK(>@%Ef+8RyqEdpQf*^v@L?GAz0R>Td3yOerkq&{xic&?SNQ+97E?ruJ
zpdejpq$Ys$l28)@NxnOHp7&39fBKxWT&{Ii_TIB+&&)M*&D`hB9er)?{m1u1AP{by
zn>X%4ARGh;gcZxV7yK7bGM
z-f`!v{gM0V+n0}$te;PY3CNlm@?F)uy6=>HX>5A{Zn4geb>Bn04faM7pRnvsfgn_mVhE|X7eq=oh`847BOF;*A5
zJQe=?@$A_GA18EEO^;skOh%r#KVG=s8J85=m(D>dXbP(ApXQt>ii(!)pd+-8{o5Wj
z;#{B;?N+N=@VZ(xw_L^_odgNV=ybu2My~aSEfT%@{@eOjq*)Bc(N&(&$~j7O<{;WB
z2D9v#jrOZ))Lq=(PTljL)~biHN_)K?)NB=Lm-}+!9nYXVe(F;4G1eNg>iEI`e)Msn
zuS@?W=P0iHIk`Bg4uY{RK2FbV8uHF4W&8J&E6pycNusz*s@$4xLnjbK6!?u`h6DRb
zUb@B(f2z!X8(r3SkzDFlQx$=J-yStA@bz(kXqaHXz~AckK}ErDW{+?k5#ILK26qsf
zd4-Ql8})aj4pk89R9Pu8)pEgk7$q8}loR~YJE>7G4nu#kL80HZzYWg`3_|7veoAMB
zK;GUH>eBCuAOySh4SX?4*h{i2$ApB;dzpYuQRc;nt+bafT9r^Nk!4Q
z_jwEAR#*>-r!^2DyjYP%fkJkG!+L;*^r%2T&_b6s1n+G1-eM!XN8OOx$W+xm2V2`g
zdT?gz+DTVv7=f0{*{i&yML3V*0OzN3j^*)H{NgY`%oIzhdW`+qitwY
zc05w=rDdhw=jKt{$`?+mdFYEh7OV&R{%vWJ?;UCS&^<$IpIyTQQ^vSh5GF3e{;i9!|cnf{y-^ekC-Nv9|a>iW<`Qm*>H!T^%Gt&L7McrwgyzOuFPdbHiFh
z)?nla6e;XOd_#b0a!mS<
zYP_+dt(_|)TAH;TvE`g(fuOW;%WEN87RSo(Tav&cW^Z?~I
zx-Nj7saK8itXU~7>?AuM$F)PWabU+Edo@2+=jbsNl0GaxtOSedkj`dBm;%gW&J9~Th`?lFWLbfUjn#UmoeN87V^w71$!Fun#
zEC|!&UenyPffF<0LfXi`@4>mzU(oS3eV1fLMVY=MSl{&!cuy_X+8jxlv@B3){>2VV
zb?`Kbc(*NqXfA2oweZ!eq^ig)sLC7!GnD}~brF&A?eZl;a6UV!RHQz-Kj9S~9e+F%
zoG2H>PO^52raxJFE)r-{v7V6EoNNw4g*t!8on)CgJx#m{9}#*^R~_pab6EV22tr11ZxQXHp|Y<
zU`g7yt*g6lYn#PMsL{q>$vg!2t8?iztfDrGM}2|)JjVt>o$p0xTO7_C(}0c#F^yuG
zo1pQnz&%1NIIvd_f)|(OJMQ()bB-!|
zaN+lm0`?I~hmMzTKJ}TajPPX&D+>1eZJJ99N=VB#K`hJ4^#VhCUOtdfHyk`>a2p%u
zymSya&)VU7N6Q|^jVteWLxdbRJ1Mp3PGLt!V6LAF1YIx!uW%i-aS#IU{1F7yd%eg?
zfEtJDXVifqs3t-6o0FN~Bj>|hS7fAK;L=DgE|?83Pxt^V^Y_)`9=ElX#^MVj{v8)|
z7UiKhkZIy&U43R=vXmKE&KN-OgVQ|c)Wt9Z+@qrP+QHJ86cq0-|AI`FQ|FqOU8I0t2=OWUBMBl^Ht0
znr#+D4bTkQX~$72`8GJ}D=^s9ydtx$SmBq%C8+~_Y4!u)GzFK`c%DaThl0mUGsi<;
z5?TFOb}q3}IPs-Jhsu2$wR^8JO%tMakp(d`FKuklW(mQY=F{uU!3}#)Evx}k-?w2r
zm&S>=Tsj1xpPgT0vHO|ae|
z7`P=O!@5%QV3CFzIBf9+1e4y?L0%QC#}gKp?jJ`|(LfZjeIEnSl#PxXwXZat=|j
z9{r{e*M1Ewp>VSxw9(00Jf`({XXd>QKT3UAL
zr@AcK98~sKWclm;vaahktE&KDt#c3om~e*{37%VKPUv66V5M|&0t~9zh|UsBDgdXg
zOR*pvlT^R1qf+*guosyZOLoXG)5uiVN;KbBeuMvs-!?L44ygf@=L&Q9uJp0|Hj
zDdV+!NH6a$4Krm_3*#IkKfPWAa`e
zH2h|1njB3Cmdq9HXIj;oXuUFQtk7YN-^pjeZce9=>9l{}Krmh#aZ<>b8UfPOY3*bm
zAcEF*E%pSp7JGqKCQ=(62V4O!#Egay%9u}=oyS}lAci7Zy?o;4-pNXVXHT`M-vgj~
zyU3u+srE#$dT#mkU2`E@Kr{|DIBpbBC3@DZ!CfG;zTinsB#p6Y=@2@N86DK!dhc95
zb#3!Mj9{APCddsn=l#mT?>|}sl!yl`MD_Jan)W<%j%NSr0O8*Rs$n)~<)XuUs3taX4EjEZ4*`g>C
zM!XIJp(M4|aTmqGy(u~S2->;bwQAHxcuX207nsl$i9_{%Edf$cuRDkivd?$`^$CJH
zw7~*-3om#-tw2|o@z~L(cJu58IpCR55KRBKT5CT=Sv`reflPJlm&|uM1#rhua=>Q5
ze&$i*{hz0`lk9=Hn0QGVi$BDkXds)^uMzPIh9H@5UYTL#XW0l;9{HRNJle!s4lRUHsI(Ft6)
z?4wmGw3!ej;%_s+&BL?o<^Xgi)Pc*?eX)d7wyCrR-q&>PLmz9p+75LE3S|0jW3lXy_j
zEPMt94N!*{f4wp;BX82qX?som_z(CQRF^SC<1WasqrZK9t3IGx2k=avEkLbb`rtJg21#vy@A#h5<=g~TMq>>
z!M1uIVeQkM{2hDY*lmY#HAH2RnKd)N{Jl{EBSyydu6}{u*o91(EXz)?p|quARJRt@RB20=r;IO0Wr!wU`LwT
zMlqVMRb5u_7%OSMvAlK-Ot65Q#g;Ua+0TdJ
z1sXX705H2ZAygwZ%4Y+Zv~4bsJG-c?tPfsT7-^@VHWfUk*UwS%77J1wp9~hrY#=XB
z=5ydw{CQ&_vVt^v9|08aT|c@KvLB?}c#XWlPD%h9AFfB{T3e73ju-@qW`~#{~ec$|xSxfw~ZMD1;ug
zGC9?I!F_&48%bH~DPX0HfMQ_7HvcueA0Pm6p1J$OeT1Ov6%W)+im(c-TYj4f&Za+C
zwy*Y0rwZd7ki~(Ph}w%GG}Vbos0i#5#Yp=g1U2$nfG8VAq5+CxH}@T8qi`EuuNj^R
z{tVLCZXx;)P6F~Ys_Qlc?WTk7k4`qt+|9(}02rg*9I7W*T>JEu$SfRE`b+HFHlN%8
zZd5Rh%}QTjBo(>=&H*gG4#A#wUScEa7$mo>^i@l$X9k3C%S`MU*{adDbPsbPDiNJA?I{Y$Sk{q+s9lQ{VW3f>Y{Up=<1TTU5
z%HyV*ND7l>FrGVTY6#4u={kfL#E-imJ?Hl8w38@H@7LT)BtHN~vWh@q#q){A{~i
z*(j9$%ztk3*(|Rt3iyG>UDIYg=x*}#Rfrvw%vanM40OZiB{I7-|3B*TCN^h5s!?7%3P^>yk{*%?+!2P-9oog{t&kr!~A>dL;tWu3|5V9KoOyE%SE
zUMpU8jN*jI_3o
zex>S8ZVDFE`*p%Hy8#neKotM|Ek2N!u8#7Ify*AM_lP6}k7j}7HF7mHh{QHWpl*X~
zbNhji*RFB+DrzLadcP^fMLt30RN8(oj*b>shT}UzTN661tGzX}xgm-AyZ5#$qn{O#
z8=49B9~lSImaj4CN!P$7BU~WZg>j$Vqo3(xewswGTlO
zSGNx{4O&iUUb^QQXA90i2f!(@3=%@i>g`oaN6fp{N~(*qQp)+NJp^_!)pTubZk}Rx
zv6aOa4lkxQ_+P0F*e`mK@%c`njOPs&RL&`;VLKQtWUT*f3M-RhU2A&(3Pc8dPJ+jA
zo75=z)@*~d38Ob+^uS#eb{{W9!U~+MlX(5p#&`
z{IV(2y6X?T79|8lZU!*6-gAI02YCp{9yMz;`B<`^9c^4zM+213yRh$utBaJqfuvaW
z!n7`v?mU0~JgC`uscJB6=~~WaDBlhA!SR(=Q1^ELd{Ld8)Li-PJ?fF`YrMnYjiyts
zGa0=6{XgexCdlX>cz#_)k2L17t&&Ldf9P%!B9UCQ64c6dL?nn*Uw=g#A$uCdku}W3oLXiMMNZQu
z^Y*2!B?rB04fm~e%&C188kF?F$J1AK2o9V62mq=`d>_QxwKr^CmG3RmZU_XW9oIdi
z$Z01~oV2gArz55#H$wpz8=MY-DFcc;IGg@*{aU(kU~lcyRu6mLxKb42ltNL+nfa(M
z1@h~J4f+?$&*x>{OJ!@z(W3eKumsXeJ@kd-=1h;rq&F)n!CuF)%Q7p68a0kSU6g}H
zU!K=lO0Ws*$3_MO%+GSkDE}DQ(Ftn5)qnm#=6vePN)uqE#4pTrzNR7v^-h?7T=+iw
zLnQDop_f-$HYXB>qGLS~rrN=Bg>L95J9^v~qV}kABrZ;?&)Se7U^kuAo$$G{)g~>B
zgMjR={OW79`5;E{!tCim+Ko?U+jWbY4HQ4}Z9w4;B?{u2YQF`qi$0W^9xF=62yXmb
zJpF@n4u4nD6dtq3Xf0Z8`Zq-(D|iJ35lsY7C`hI1g`=Ue`V8XYaiu2(`Bwa1>otaC
z{gv7x?a@)w!VsClxP?h7!W|(Th9we95>lvp_wv5!a*FC@g@|O(yXL-fHsNju0rx{k
zGTrZ9FCrbW=~jEGBT_8Hjh$qYZD{w|3Tde-Jeh+1X9LT<&yriO))hUjWgKE>`O+2+q57E6cgKaNXo@`0pm({*KP}>5nm9o6p^`uVC|?!Yiwqn^$10
z?a0n+0jei|=adxSO9iGqqt}|c1@A8tOSV67lq4J&Ry8_cBo$l7d$68Om4-P}5fUvZ
z#eiWXYW=+xw+GH+O}ET9PX-)mg_`8IsnR$AvOwC
zwMTuUGMnFW;azBVsv1YS24d~`93ZlY|I)&og&tY)*BTd|QR*VRXV06PT^!=S9Q127
zJS9}KU{h(OIBe(Z(^kWKt8a6SRGi{5QF=4yt*hb6us$It>)*kO$nlB!Tf*sEQ$M*T
zh})HkvGA_$+O}tfK7$q0gPq4!st}!L0jU<}hD_RXEj@3@QtDcrna;@AUDb+}&5y~0
z3OzyJR_7D5p}?pUeX~OZHj4eXriz%Pqit=o7DS_E`@@5!snI|U`Fm4Tyhw?_^2)^(
zbaU`bzy)kbA3ynQ=KM^F%%V1Ni7dAtV*5@h^?jPqC$dcGAtoI!kMdB!f9eXVbSk(V
z9S#YRyhgtLUsk_F^_knFrQ%(yGB~hWynpeT)3WTypn#>6c3r^d`-qAT+PR|rRZ2mR
z25z&-S_bs|tT|ijT^*%&M7Oy$1^Wg&LlsR7!bYWS5R-BfY#r`0WAfxs0AlmvRkbhl
z%&);@lcgrzYJ(eMjNI<}H@UsF2z^8xv@hMNClQn3~XB;qxv?`aZ4awNufiT{3P}rV_{y+y=9ML7u*4CUD{)|a)20(uB({{^BRfwl|
zn-8w-4Q?R6PRB}v;o)k@xW$l?w9
z$SwF$w3{*X>Nwoev+3cohgL;R=ji6@y^VKc1|_K>(<0>$#~KU0SSdPufZ(b5d4KA3
zdH2HKqKG!ne(OQKk~Q7u+DA1Za?Uj{qQ+7pCjphd{X&2Npyhmc~!W%sN2)jap`*kI3`9UV{<1y2DUty-zLQuBkLV
z68Pxip7PT{kAlrSTVmMQ*tWeXT--uKmS=pw+He!NUJmh3kg?+QlvgU{z0RGwNRt2C
zA!d9;=J;wNc#=~?qY@p_VIeEnN%#}d5D}Th)w?bZPgs*^-B`e1$vzsFS&9lYAeiD`<$JJ
z)_nGgI$4AFz`0@kESp#*;Q8W8#Dm9_eGmYMKN(f#>P{N
zhLWZ>sT*Az2X8E8j3w|8}9UVzsdYd=X@#Bvw@V~WpcTI8jG&Vgh
z`XG^;*}6OuRxW#t%+!|SOo{b_#lO8Omc80-B?;a`WNV0=dk0ddoU;`B$CwFTfN6K2
z6*%2qSenbxQmN^ong!lvC+2;g|F0^^^j;%z&kbs+EMgiOTCX5Vk#!uR^M)0h7_nhY
z<-I1iF*eHPk&jdJ7L)FkF5m75r{q*9cuf#%+Aa|1hx$ObCN$1rOVQ7Ej>R*r>&?)E
zT4~TPNJ|~j6HE{WZBLk6gwJ%LI_QCi8ScM=8!YVF9w>;j=5`{}H-66YGUECi-#3bzVGvzr0-Lfc+#!wEdCD!NBii~m%;iS-c)7iV
z>$_xSZ4P3Wu@O}(bz&D|CuOLgKFAdvWDq=yXy+&T$N!pGqT`34b&&mAUZtd6b
z8(CXJsdAm%yLa!Vr{C|<-D;Yz7TJ?%0$fn7<{R?7Y|hUMw0O^cW4!VR3~RP+oi2!q
z>I+l;D4t;>`h6q18U~C?Ljf37a2$+ytGoO`zQztR3%!p?k4E<;^jP!#K!4Owi;#Tp
zB0I2PeY?axlK!GArJv)q$^in`RBPVG5%iUxCNz1`bx;iV4-5q4wVG}pG2!(~_?=4C
zjl;fP^DpuQO=wns(esuYqOy{89l;K`fq`!Z=DlZCV_2?OdTHh=nPdn(;Rne;v-3C5
zdX$;FlAe+?P<={Wg_Ue<2pVL7nu?)50d#jl4@0hX&e)u>3@U{saeRHy+fQe#{SNPS
z?n)|HNhyVd=p(D1hJtYW5pgVCTm(r2Sgp9K^|N6w@7@}u+6+o9Sd
zW`qK56y>Ws)Z1{~wa6!dI)FScqr9SdiCTQgSwdTF)w@Q{fyWK{(Uoeab~}H6=KRl6
z#l7jo9ii0cRs->WjK}|8`sp>I?p*t635~
zi(jtWiNCcuc4Fg|)m~zqNIkNW9uG>gln*A1n}Ig$BnIFWjhS;6O{P7$13oRvYkwIm
z8%%FYr?c@&_Z>Eo7o9C=ZNtXJIM9B7d@(3ZT~I
zo#l!4(8#aNP#U&VsRTjvtR
z=q14CyZ`;!B`fh^aU}C#drFpfilIJ66l27Yvdmfh{vxSF3J3e6e2MZy|0o{x)0>N}
z+-}`=PbM{7Su!t0rWOSMsQN|I(?&y&npI$H!gx6Gf-;xorbm35GXF*LN2(@KL>Art~fT`iT=T>46x*tN|zc2d>;
z-8lsJUL2UkNpZ)S7S^4?9K+8)eUbDz@avsI%;(r9e`OAmq4KeNv4y-o4VNM~(j+bk
zsvDXPPy56dZGnc-Jh^b!+wPwe$diqjEdQQ3*E00mv~VZN98#ZAPCvV(3|esXG_J8V
zXg&T2qi#eJ{a08;Rvoi7X5>~YQTHvtJN!OZ
zkjvV=%Dbhi_I%d5ZC~y{L5s6Q^k$w+AXB*yQa8DLPX{t;5!S`?GKI
zF&)IUdBplH>s*PQbE7y=ZtyoVV0L$Q-_z=oS&+GK-u=nU>^xD~aYoJ{r2a=^VceW1
z-xbD3$LHjoy(F?G1ykbVFocstUm=8qT$W=cCukEw4EvVAkXGvUTZ^@~m$R)awXF|7
z-D#VoKxZH66DUPGL6zH$@T6tXZD8{2szCacZfHnUj6O~can{&0fbub`km0$ssBgV-
z7Db$s`K~cyjvF1SOid6y7Bn>r6{
zlNbAnsq$EyO%iP@YV})J3rmL{m`A~f{-@czxwb~QUh~l@?+}VjKwT)0vy_z0Uy41l
znA)7G2G~$_OUqJvR;t30?eIAHlmyXgSiE$RZ}WxgWJNHHWYL|&PSS-Cw>1`w(*qxCUjF8|T|1)&tnX}a#n!8`-;z+rUo~gcD?CFix-ZF&j`ECF7PWAYhQSDB
z>Aw-mW{HM%@sp3SpwW~Ef#nrMCIcmQ%-u;((eE?OP5FEOdD1&66YOtgIscp4(E%)o
zXp^eV7=58|TISC#Kli}gq+l+W=Bl;C*x{u!5z7DCuYMs6!+cB&-;t(lko!)~nf#+w1Ld5*_*@_AlFasMK)1q&eec}vh<{nG?5!7V$Aa)EoKRk@8A?=^-Ab`L#b>S!|ns
zJ7;ulFFo5F*~9FBfTrqGm6fse&zxh(3NU#($ecXY#}{Iy!Kmm_biM|HHo0=KyScXr
zxb-fr1IvRddkjF+c>Hf#=hJK|j(4%`Rcxs)y<=69pWK9jU?diLI=K%>qkTgH-IZVQ
zR+D@9s@5h4_V;=!}0wFtK<6`w?bhKPzIHx6_cgqC6P+dO<3f9-Pai_-B;L!-QZ-JYiz=5zaB?U0S~~k6yn1a@w@_qhaTw+E+`9
zFppg1()VXcx4^g{dbTMpg_Sa9NwblZRjKxZzA~kwz51Th2zth^Zw
z&p_ndJ}nh_`!Pdp^|P1{^fZqB&WDVnf0Lkgmwcx5L2qR&$S@-v`Z_^SFg05=|G`EY
zbJnO@`ol97qkOujaPR#|-F<{ONQj_arWx&dOuS*!i{pMY3X`$Ce}rW{aXfDB8z5Z{
z=FXf)F+%##$Hyl_j@d^yy>!xiv79^v@XqJ=eu~I^>YU(4Y0n#Kqk-6K#tmvO=O`9H
z%5Bj9QqER=g-wf+Z}`9xbhx#DL-f=aoj$+)T!OOm(>h>uqY4t@8OqzDVlK@wlPj?x
zTzNY70G{IrRH)fAy*PvEvDom1hdD||n;$%1`FI8)Yh4)P#w3Q9FGB)Pqb!bHoorP&
zcL(4-5}A+C&_R<|h7low_i4{&*FwJge%}_~Ln1D{W)59}x{s(DK8YBg2rKhoCrW6J
z0vUCHjE#oU5s$MrSZ-AXmV|OTU*t_$Bay%m<2|1M<%pJ9HYCQYKel{uppah~TkC&S
zxDkF-TNeVXSXG($<@DObr4hGtUs{MG_qI@~yr|kx{kGn;4S~7QXX{pbNS5LV_;&pr
zs*E@Sp;T~tEm<&2cAykYAy&(Rq07=9Dz)Y=y7Y3V%LH}3Z<<VMjLfu+WtHzAt-xV*2-!rY{9E|_0UY7W94VYwfP=j
z(Nb!Ut}DJMHHrzoAn{l7o9m%X9362L{&M!fIHOyH^NP*$tWRa8?7yIVpJyacMZB3V
zV5X;Ai+pM3+Q1C$bD2^_3V!Gh3_)B5@l9(j6-@Zts{7h3eT|a7kdW!J8<9(?Hy4u1
z61qE#&L*@)hllP|20Z?F=8n*IRIW&T_7-^C57i|uqVIUmsbBFJNOO-RUGtNw@ffSM
zk3M_Y1%A=@Jtz}oQTXy}Ie~93e9Zcm#Mc0w)Mpp-cxsoAhz=nV1wR6aVqEP*9~+!Z
z;V4j$xV9N*xWODwYc+-73#lLGL}}v^XBsv&!Xb2yU8N01<2^*>j2|p)`32d2JR{5#
z=Zq9bnU0#Q5CWW(Bik@{H?(F7w40q@v@9Dn2}q?nj)33>1YvO6r2`DxGVL|efK9xf
zzc&&I`FqyL;)A|G+RRB5Qtlb~(}0tcMtUIPm8>op>AUUc#x({iB9A=zUenO7o7knr
z=rzqqFt1OYn)?AlpbUz*3bbe0GaTW3Mg+rq4yJ@L9GkfRH0cIy=WUOt!IApBGQ;s)<{WB`2<)^0|Rz=f(SDDI_O7domAl6VAMyVtEHznkIfFK9yI>77e
zI>gsn
zlKc%)5&tV+ulJ{8dg1vY7w11S2l+uE-|wMD!p5x#1|6|OHV`g#6QJd|
zJZJUq-{a$B%F{m8MvmyB*~}D$>cRW1TPtcJ?Yy%+KmVH)5=RhC3xj_L;O*T+>bj^Q
zh-h*oh4Pa!Hl0hM6n96%7o|=jt`%l8PK#&>uB5zm(84iZi3aY
zNW4pX%#nuQo>;3^pJterCJ1Rk@4}S=LvWgpcAjpw-Qv6Hwq131DXbgr7u@Gps?n%6
z80j`^H})-PQ1eS4&&>$F|I!i>jA^uAXJ!BBQc%yo1|s~SEMG#~RCDA4swq5%tF?a%
zOtIrThR_kUUq&%Sw75xClXB^iPY~~%>9BQW*0sU|1ZaeX0LvU*YlQ*^*VFbe$3Kvd
zz|5gCcaeVcF~!LP6Sz#;Nd)|u4|ccvo}YxjiF7+G-x=EPxJfYa=Y2SC@ZxA&GwrQC
zd5MqrTUzqVh!sCt^$hFhiFfv_l(a(lL*AWX-jnIgkC^lN&0dS81%{=97NDz%Z+hO{
zFRpsqNcr~Q4CqW%BsV*JvI_or3zPA_T=LD@${YVnw9ZR{(xpo`hU@G&;*ap06(Rr4
z*%@Mf(E(fk^*vj#RWB;)H~lo<5W_O1sC-GlQ5@&KCOw>)iDX5U*2ZxWa-~w%;w~eyEca##O}f2z?Qb%ksKl#=bUK=gRyXp!*7)E{Y6z
zT%{_2a_4$;vNrN7<^0nCQ-C&;&4M1nx)tbS*|!rit_ulf%PNn7c`=wZ%T53@>57ye
z0$+X1Ii(pYz=Vo!dWm~uFFEHyFhQ)8**!?p1ru52;$+@DakXOs2fO9JZ!Zn9O@0XZ
z6<-h)9Vfszh;9^7U;j7-=wy&0mY8r4dbWvP)^Ap8ZTOha{bM%%qx$xlCZTg|eroz<5}zHy9KKW4JK|vy8!C_LZXS?{jB1
zw6G)dZcCNR*(VMQM?Zb~G+4`YmXjAp*!W`g4{!_@En@YJsrCj^NTh9^&Mm{3nr8_5r0VJHoYQ`?rD
z6ap7z@hk<`$J1{0XCfTAy|4BCxGXi#-fQy5-SF?ruDWe|e;6@-oXsXYm)bl?vfRg)
z*5hyja=l+$pAC8a;m(MA+!datE-O@|_e_Im#IQzbozB#8|ID$-Sgt3zIP7`o%SrKU
z3z)ma{Z$-r)F14o~X8J||zT=SWyQexQw`elw`#)iP6^Qan$~pE4uM@(XEJ5Qu`9q6JOZP}H9VYxCf)gMviVTBd#c
zWrcv}2-}PI3Mbq3S4CLxmMrLS35)ZePhQ77oYvKR6_ly5Q|HXh3ae+uST`^tj&WHw
zEabUTxabc&HtjpazT+^dUZnl??)UA)Zq>Q7#%HqZl_}MQuU6h(
z=qYYe$xqH~g_7AbC9)fzAcrMl{it`@58Qrvt-|Z1
zG}3pe(A}~Yf!35~SOm47d
zeb>Rcu~#VGER=yp!I6vi?tA&uh=2F^N9Mo>w(C60zj#lWp7d|{6M3Yq>MqXb8TgLJ
z7Jjdj{$Vt;Cs+MS$e55S`Zc-j?eXs@Dph34&jS0Q*uvO;&~ffDH80UW8&yi1nC!$J
zu#P1vD=4gUtsUK->S#=i?lq40D(IBhM~i-)cB4L-1?ZRjOdwj?O;p4D(P>Gi*8)u>
zwxUq7S*Wgz^X*NSw-$6hv>78E>_W=U8F7R^f`f|^_EF+;eLBE5W2J|yN4|E(SId{~
zn(bHCty3)b&*kDmprgE$Ed-?^dso!@W%blN5|G?cr2itK*(iLt)G
z7WCL}=Nz`~N7ot7ZLlIsnf+zkzgp-HkI?q#$l3P~6Yow$D3~Du+P6pH{aJd47sF1%;GQ
zx1l;K=ei|++KQ<)q?u;~d70GCu(H6NfvHyZ2!4sN!FoA3kXtrG;a`qx)?=Tdc;AED
zo94!}-a|R2
zB=>CBiH8su9EvV}uQwY#=?`L^1=zA9N`H~xd^n@e
zGo!b9#3%6=*>CD^kOM#Sxw4th^{Z*J2Z~8EPlA5fHb%xQ^Pf)QBYi(eI#inY;r9pK
zHkBXsMYC|l357(QkmB-~E#XXC>}4Jf)-hGSCEp_-Yo0S0zG!b*S7;#kryjo1hlIto^x>_**fwz!ft(zNNrpEx;cDn@7vWW~s=
zy&sAkfpx44T+`W5UFXJ!Kv9<>bE>V|_Z9rJjOAdlI07<
zxgEGBO^6{LJo$I>BNw+>W%MhpYd`p(PmxD${adyibJI8YOdPjcx?WGUYu0l>nfmp6
zt&t>&7mufHf1PfmO^CxJa0Hdf++%&;#J>%*K-f8BzDIJdzT={JQ%@qCeQ2il`u
z(d6VlRiU4%tTv7;c+r`h<{Lk77i!kTz0gDE?1Y@FV3(h>j
zV`~!f+T1ts`SBrI0NrmNB-xbdw3`JLQdvvYyM!@j#%~^>pQB_`Q3kMddVTwI;nio`
zxhJw4O>UfwS-O5w=$2G@P`*A6=E@2?7O>Jar>3CqVJuW
z7nQ`i}4Ih0YYARju&Xn@Fxl8
z?BydFoFM3l5lnOWKX?+x6WkQXPX{;Fe^FOBH#tpyj%<5dTw|T>0=>wh!MnnCKTFDa
zcd}
z?!fB-qJI2~ul#Rn99>3W4{}=U?io)WxVW)i^OwM77Hk>BbFH33gdK6^iTwyI{=UlU
z=<6vSF)m-lfzIH)k!z}NZm{yQKn}8BVu3gClkEDHKX_VZPnqJx_8y=2|iK>
zU*59V#Zy-bJqp)eWx1#*e#C@m+i6~JuS*$#o(Opb`~@iP&OlhruYBJ3BOWm<%B9oi
zvhSYSvG5xD`c3135etMBqE47&fgUai9&^lVRtob=-LqrFjySC-n7j6mj7hMb0
zc{i@Hg{w*)fR64;BFv6}47@QGip6JkeC2&_t49p=obi9Y9PTIg83gky8IQ%E)xKcG
zsQ1jp_Wf-?S}raBo45wEyv@HgCWUmUkRo_!)ra1ycf3&_RD5O_Nq~+aBJhDD2Bc
z&fiY*s)q(`2AYzS3g_%@3-iYi?GC7I(Y+Ohexn6&9W!R^2m)}7iD2S`=c|8nb8kFT
zpDj26^=v7(aQKy&y_eT_)AkMvr1e%{ehJ^-(}KXhbOtGMD*7S`PDY<-x~jp+mz7j3
z3%bI{R$_!2kl?+vsh^q1>>JFzkneIP)-bpyyzgcVk*NDnDTc^NdB;gv#~aHS@QTTn
z;c@g#wP~xyOG8*iTdye<>%z)$R(g8a7uuc@@p?x-6)G~x#x=)Bs@~6wpOZ4j1eEMZG}GsR8_x`^X(i2!T7|38%(LEyPTEzez@IS
zE#ahCm57ui3d0QkOc~onltjO
z-jSwmngcC+X#*9s2q!zfH#Kx7NyV)U}kdv?B*WM)<*E`;wJk^v}l|>HiYJU$SR_dVr445fbG>Z5XMNT)?Z|pMj
zN*ikX>r)znIsVq-i^I(_H|A}o4w7V7`yhjndTn*)YY8j3zqr}Pn}JiOQx`VyW_giw
zj|(~kNSmN6MHRR@G^cJWSm9;1PaRS{=F=5E?DxSqa7;b9zdtqrASMv?BEGbp?`uog
zCm(@_b+yg-_xDI{&z3134)5KJ||5NVR
zK8h9M+{us#C)&6?IgfsFR6