mirror of
https://github.com/gradio-app/gradio.git
synced 2025-02-17 11:29:58 +08:00
Ensure components can be remounted with their previous data (#10192)
* Fi * Streaming out tweaks (#8976) * Tweaks * Better * typo * lint * Improve url downloads for file objects (#8978) * changes * changes * add changeset * add changeset * Ci security tweaks (#9010) * asd * asd * asd * asd * asd * asd * asd * asd * asd * asd * asd * asd * asd * asd * change * changes * changes * changes * changes * changes * changes --------- Co-authored-by: Ali Abid <aliabid94@gmail.com> Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> Co-authored-by: pngwn <hello@pngwn.io> * merge main (#9050) * lint * Have gr.on set value at start as well (#9065) * changes * changes * changes --------- Co-authored-by: Ali Abid <aliabid94@gmail.com> * No token passed by default in `gr.load()` (#9069) * changes * add changeset * docstring * change * client changess --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * changes * Set default `format` in `gr.Audio` to be `None` to avoid unnecessary preprocessing (#9073) * audio format * add changeset * lint * docstring * format * fix tests * tweaks * refactor * fix --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * Streaming inputs for 5.0 (#8941) * Fix code * Add code * Add code * working demo * hacky video * Add code for video * Fixing some code * clean queieing * low streaming mode audio * reworking * remove console * Pretty good spot * Delete unused * consolidate * Add progress bar * Set time limit null * delete * Fix then issue * merge out * Add code * clean up * Remove base64 * Add code * minor bugs * End stream * Fix rerender * remove unwanted * Address streaming comments * Commit file lol * ;int * lint backend * lint * Fix queue status. Stream_every defined in event * Fix types * Add code * Add code * Add code * queue time * docstring wording * Fix typo * add changeset --------- Co-authored-by: Abubakar Abid <abubakar@huggingface.co> Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * 3.10 (#9133) * Deprecate passing a tuple for gr.Code value (#9132) * Add code * add changeset * lint * type check --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * Postprocess hardening (#9122) * hardenning * Fix code * add changeset * Fix tests * add test fuzzer * Clean up * revert * Fix * Add code --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> Co-authored-by: Abubakar Abid <abubakar@huggingface.co> * Drop python 3.8 and 3.9 (#9140) * drop support for python 3.8 and 3.9 * add changeset * format * changes * add changeset * changes * add changeset * changes * 3.10 * string * tweak * tweak * changes * changes * format * more tweaks * update actions * website docs build * fix func tests * rev req * test fix * remove ruff rule for zip strict --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * Raise WasmUnsupportedError for ffmpeg usage on Lite (#9130) * Raise WasmUnsupportedError for ffmpeg usage on Lite * add changeset * add changeset * Add WasmUnsupportedError in Audio._convert_to_adts * Add WasmUnsupportedError in processing_utils.audio_to_file * Fix * Raise WasmUnsupportedError from processing_utils.audio_from_file * empty commit --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * Video gallery (#9052) * video support * tests and backend changes * undo main merge * upload fix * Revert "undo main merge" This reverts commite2a26e6d28
. * type fixes * format * pr fixes * Update gradio/components/gallery.py Co-authored-by: Abubakar Abid <abubakar@huggingface.co> * Update gradio/components/gallery.py Co-authored-by: Abubakar Abid <abubakar@huggingface.co> * type fix * thumbnails * thumbnail type * remove thumbnail generation * add changeset * test fixes * test fixes * python test fix * python test fixc * fix * fix * story fix --------- Co-authored-by: Abubakar Abid <abubakar@huggingface.co> Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * Open audio/image input stream only when queue is ready (#9149) * fix * submit logic happens in Blocks * add changeset * trigger ci * trigger ci * Add code * Add code * Fix retrigger refactor * Add code --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * trigger ci * update (#9176) * File access security guide (#9156) * first draft Add code Add code Add code emphasis * suggestions * redirects * add changeset * trigger ci * typos --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * fix guide * Fix notebook (#9181) * DNS resolver on ip check (#9150) * changes * changes * add changeset * chaanges * changes * changes * changes * changes * add caching and whitelist * remove hf.space --------- Co-authored-by: Ali Abid <aliabid94@gmail.com> Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> Co-authored-by: Abubakar Abid <abubakar@huggingface.co> * Change dark mode color theme from `gray` to `zinc` (#9175) * use zinc as neutral colour * add changeset * fix test * add changeset --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * Streaming Guides (#9173) * Fix unified case * commit * Add code * add changeset * notebook * Lint * delete * Fix code * fix tests * File access security guide (#9156) * first draft Add code Add code Add code emphasis * suggestions * redirects * add changeset * trigger ci * typos --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * redirect * typos * link * fix * See what the problem is * less time * fix * try again with busted cache * try again * Code * Demo and code --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> Co-authored-by: pngwn <hello@pngwn.io> * Fix (#9215) * Deprecate type='tuples for chatbot and focus chatbot docs on 'messages' type (#9194) * Remove grey background behind all components (#9213) * remove panel padding and border * add changeset * revert radius change * add changeset * format * add changeset --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * changes * changes * Revert "changes" This reverts commit9e2ae43330
. * Revert "changes" This reverts commit9f4c3eec0f
. * Redesign `gr.Slider()` (#9197) * redesign slider * add changeset * fix test * update slider design * slider tweaks --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * 🔡 Update default core Gradio font (#9204) * change sans font from Source Sans Pro to Asap * change misc refs to Source Sans Pro * add changeset * revert old changes * add changeset * replace asap with IBM Plex Sans * add changeset * repalce asaps with ibm plex * tweak --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * Redesign `gr.Button()` (#9167) * *add new button styling *add origin theme class with old button styling * add changeset * remove new colour * add changeset * color and radius tweaks * remove neutral hue change * *update button demo *style tweaks * format * fix test * use white text on primary btn * adjust primary orange * tweak colour * disabled fixes * refactor * refactor * refactor * refactor * remove non-button changes * test * revert test * make cancel btn darker in light mode * change button stories to interactive * fix slider test * fix test * tweak * tweak secondary colour to work with gr.group() * add changeset * tweak * tweak button hover grey --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> Co-authored-by: pngwn <hello@pngwn.io> * Minor changes to flagging for 5.0 (#9166) * init * add changeset * rename * flagging * flagging * changes * update * changes * more * more * changes * add changeset * fix test * changes * update demos --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * Adds TLS to FRP tunnel (#9218) * tls tunnel * add changeset * add changeset * arm64 * checksums * changes * tweaks * tweak --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * Move buttons from chat_interface into Chatbot (#9201) * First draft * type check * test * add changeset * Fix e2e styling and tests * fix lint * Add code * add changeset * Remove shadow of copy button, make a box * lint * add changeset * fix padding + lint * make buttons a bit smaller. use different icon * Add code * add changeset * tunneling * fix * Add code * fix + lint * Add code --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> Co-authored-by: Abubakar Abid <abubakar@huggingface.co> * Improve button consistency across light/dark mode (#9236) * ensure btn borders are consistent in light and dark mode * add changeset --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * Redesign `gr.Tabs()` (#9199) * Decrease component radii and remove input shadows (#9216) * fix py chatbot test * Lighten secondary button grey fill (#9245) * lighten secondary button grey * add changeset --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * Stop using `multiprocessing` in `flagging.CSVLogger` on Lite v5 (#9246) * Fix the default demo code for the dev * Use ClassicCSVLogger for Lite * add changeset * add changeset * Revert "Use ClassicCSVLogger for Lite" This reverts commita89fcb1134
. * Avoid using multiprocessing.Lock on Lite * add changeset --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * prefix api routes (#9200) * Built-in submit and stop buttons in `gr.ChatInterface(multimodal=False)`, adding `submit_btn` and `stop_btn` props to `gr.Textbox()` and `gr.MultimodalText()` (#9235) * Add submit_btn prop to the Textbox component and use it in ChatInterface for a consistent design with multimodal=True * Change the default value of MultimodalTextbox.submit_btn to False for consistency with Textbox.submit_btn * add changeset * Set the default value of Textbox.submit_btn as False for consistency * add changeset * Add stop_btn prop to Textbox and MultimodalTextbox and use it in ChatInterface for a built-in stop button * add changeset * add changeset * Fix Python tests * Fix JS tests * nit fix * Make the submit and stop buttons not exclusive for simplicity * Replace the Pause icon with the Square icon * add changeset * Update the docstring * Preserve the original values of textbox.submit_btn and .stop_btn after running a generator * Show the stop button only when the submit_btn is enabled from the beginning * Respect the user-specified values of submit_btn and stop_btn * Add ChatInterface.submit_btn and .stop_btn params * Fix Textbox.svelte style with string values of submit_btn and stop_btn * Fix Python tests * Fix Python code * fix test * Apply suggestions from code review Co-authored-by: Abubakar Abid <abubakar@huggingface.co> --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> Co-authored-by: Abubakar Abid <abubakar@huggingface.co> * Adds a "huggingface" button variant, and makes it the default for `gr.LoginButton` and `gr.DuplicateButton` (#9254) * add clear variant * add changeset * duplicate button * add changeset * tweak * tweak * format * add changeset --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * chore: update versions (beta) (#8829) Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> * fix cs * chore: update versions (beta) (#9262) Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> * Improve Icon Button consistency (#9250) * * update icon buttons * add image editor specific icon button * tweak hover * margin tweak * add changeset * improve gr.Video button UI * radius tweak * ensure even spacing * fix typechecks * add changeset * revert irrelevant changes * typefix * fix image editor buttons * fix download link icon * disable undo if no change events dispatched in model3d and video * add changeset * add iconbuttonwrapper around gallery share btn --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * format * Fix reload mode and streaming in 5.0 dev (#9269) * Fix reload mode + streaming * use api_prefix for reload * add changeset * comments --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * Raise error instead of warning if checksums for binary do not match (#9268) * tunneling * add changeset * format --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * Fix stop recording button colors (#9270) * Add code * add changeset --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * Match style of textbox stop button to submit button (#9280) * Change styles * styling * add changeset * add changeset * consistent width --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * Raise ChecksumMismatchError (#9300) * raise mismatch * add changeset * changes * format backend --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * Further tweak to is_in_or_equal (#9282) * Add code * add changeset * add changeset * is_launching tweak * no resolve symlink * Use has_launched --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * changes (#9301) * Fixes race condition in `update_root_in_config` (#9306) * test * lint * tests * add changeset * change * lint * reduce num attempts --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * docstring * Adds ability to block event trigger when file is uploading (#9253) * input_ready * add changeset * update value * block event when input waiting * format * add changeset * dep index --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * 5.0 merge (#9318) * merge * pythong format * fix typecheck * fix json scroll * fix test --------- Co-authored-by: Abubakar Abid <abubakar@huggingface.co> Co-authored-by: Hannah <hannahblair@users.noreply.github.com> * Proposal: remove `gr.make_waveform` and remove `matplotlib` as a dependency (#9312) * remove matplotlib * add changeset * remove tests, demo * Fix the Lite worker to set the matplotlib backend engine only when the matplotlib package is installed * add changeset * Fix comment --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> Co-authored-by: Yuichiro Tachibana (Tsuchiya) <t.yic.yt@gmail.com> * Dont move files to cache automatically in chatbot postprocess (#9303) * Fix * add changeset * Add code --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * Remove two dependencies: `importlib_resources` and `urllib3` (if not in Wasm) (#9321) * remove-importlib_resources * add changeset * urllib only on wasm * add changeset * format * format --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * Make `gr.Image` preprocessing more efficient (#9314) * image preprocess * add changeset * changes * fix tests * docstring * docstring * image * fix * format * changes * fix test * changes * handle svg files --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * 5.0 merge take 2 (#9326) * chore: update versions (#9168) Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> * chore: update error.svx (#9291) * chore: update error.svx occured -> occurred * add changeset --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * Update docs to use new Image init (#9304) * Fix scrollbars everywhere (#9276) * changes * add changeset * scroll fix * remove .json css, adjust scroll height to account for label --------- Co-authored-by: Ali Abid <aliabid94@gmail.com> Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> Co-authored-by: Hannah <hannahblair@users.noreply.github.com> * Separate starlette.Request from PredictBody. Only set in new PredictBodyInternal object (#9279) * use custom pydantic type annotatio * add changeset * Add code * add changeset * rework * dont use arbitrary_types_allowed * add changeset * fix test * revert path change --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * Add root_url to components created by gr.render (#9267) * Fix bug * add changeset --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * Fileformat whitelist (#9302) * changes * add changeset * Update routes.py --------- Co-authored-by: Ali Abid <aliabid94@gmail.com> Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * Fix multiple trigger bug when function has js (#9188) * add code * add changeset * lint --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * chore: update versions (#9298) Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> * fix json * harden test * harden test * clean * format * add changeset * notebooks * fix old conflicts --------- Co-authored-by: Gradio PR Bot <121576822+gradio-pr-bot@users.noreply.github.com> Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> Co-authored-by: Ikko Eltociear Ashimine <eltociear@gmail.com> Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> Co-authored-by: Tayfun Sen <tayfun.sen@gmail.com> Co-authored-by: aliabid94 <aabid94@gmail.com> Co-authored-by: Ali Abid <aliabid94@gmail.com> Co-authored-by: Hannah <hannahblair@users.noreply.github.com> Co-authored-by: Freddy Boulton <alfonsoboulton@gmail.com> * Add `matplotlib` requirements to several demos (#9327) * add matplotlib req to demos * add matplotlib req to demos * more * update reqs * clean * format * Standardize `height` across components and add `max_height` and `min_height` parameters where appropriate (#9313) * height * changelog * height * add changeset * add changeset * add changeset * revert clog * more changes * add changeset * chatbot * restore * filexplorer * add changeset * json * add changeset * markdown * add changeset * row * add changeset * height * format frontend * revert * max height * fix * fix docstrings * fix py tests * add story --------- Co-authored-by: Dawood <dawoodkhan82@gmail.com> Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * Fix typo in `tunneling.py` (#9338) * tunneling fix * add changeset --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * Set the color of placeholder in a disabled textbox to gray instead of black, and disable typing while a response is generating in `gr.ChatInterface`, allow `gr.MultimodalTextbox` to accept string values (#9328) * textbox * add changeset * changes' * revert demos * add changeset * add changeset * changes * multimodal * add changeset * changes * format * revert demo * fix test --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * Improve is_in_or_equal and fuzzer (#9341) * improve fuzzer * test case * add changeset * verify * Update gradio/utils.py Co-authored-by: Abubakar Abid <abubakar@huggingface.co> --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> Co-authored-by: Abubakar Abid <abubakar@huggingface.co> * Add info about Powershell client (#9343) * clients * add changeset --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * Remove lite/theme.css from the Git-managed file tree (#9335) * Delete js/lite/src/theme.css from the Git managed file tree as it's dynamically generated * Remove lite-related npm scripts from spa/package.json * add changeset --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * 9227 chatinterface retry bug (#9316) * first draft * add code * tip * add changeset * delete dead code * Type check notebook * consolidate like section with guide * Add comments * add value * Lint * lint * guide --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> Co-authored-by: Abubakar Abid <abubakar@huggingface.co> * Move icons into `IconButtonWrapper` (#9261) * * update icon buttons * add image editor specific icon button * tweak hover * margin tweak * add changeset * improve gr.Video button UI * radius tweak * ensure even spacing * fix typechecks * add changeset * revert irrelevant changes * typefix * fix image editor buttons * fix download link icon * disable undo if no change events dispatched in model3d and video * use icons with iconbuttonwrapper * add iconbuttonwrapper around gallery share btn * Revert "add iconbuttonwrapper around gallery share btn" This reverts commit4605302df4
. * add changeset * design fixes * add changeset * move status tracker progress to bottom of component * add changeset * use iconbutton for like/dislike * fix lint error * fix type errors * type errors * fix test * revert undo icon change * btn spacing --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * Added gradio-in-r (#9340) * Added gradio-in-r * add changeset * section * remove * tweaks * delete changeset * R * Updated using-gradio-in-other-programming-languages.md --------- Co-authored-by: Abubakar Abid <abubakar@huggingface.co> Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * Enhance Lite E2E tests and fix a networking problem on Lite (#9333) * Add Lite E2E test to check a matplotlib problem which was fixed in https://github.com/gradio-app/gradio/pull/9312 * Restore js/app/test/image_remote_url.spec.ts, which was deleted in https://github.com/gradio-app/gradio/pull/8716 * Fix tootils import * Format * Fix processing_utils.resolve_with_google_dns to use the HTTPX client instead of urllib so it works on Lite * add changeset * add changeset * Move js/app/test/image_remote_url.spec.ts -> js/spa/test/image_remote_url.spec.ts * Use pyodide.http in resolve_with_google_dns on Lite --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * Do not attach `content_disposition_type = "attachment"` headers for files explicitly allowed by developer (#9348) * changes * add changeset * format * fix type * type * add test --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * Fix overflowing markdown in Chatbot (#9260) * fix markdown overflowing table * add changeset * revert undo icon * add changeset * Revert "revert undo icon" This reverts commit855b012a20
. * add changeset --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * Small tweak to how thoughts are shown in `gr.Chatbot` (#9359) * thiknk chat * add changeset * lint --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * Use `container` param in `gr.Markdown` (#9356) * * add param * add story * add changeset * Use IconButton for copy btn * fix test --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * run format * Fixes website build in 5.0-dev (#9382) * changes * add changeset --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * Small tweaks to improve the DX for the "tuples"/"messages" argument in `gr.Chatbot` (#9358) * change format * format * add changeset * revert * revert --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * Update babylon.js to `v7` for `gr.Model3D` (#9377) * update package.json * add changeset * add changeset * update pnpm lock * add changeset --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * Fix `gr.ImageEditor` toolbar cutoff (#9371) * fix wrap alignment * add changeset --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * Adds LLM to the Playground (#9233) * simple system prompt * faster model and streaming and better system prompt * changes * changes * add changeset * formatting * add placeholder wheel * changes * save to db finally working * clean * fix open in playground button * better fix for open in playground * changes * format * fix * try * remove * remove make waveform * fix * using fallback mode and other changes * add show_error * fix lite refresh issue * fix css * add demo * format * lite using latest wheel * cleanup * formatting * hack fix for b vs betta * formatting --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * Refactor lazy caching (#9361) * changes * lazy * redo lazy * add changeset * changes * helpers * docstrings' * lint * Update guides/04_additional-features/09_environment-variables.md Co-authored-by: Charles <charles@huggingface.co> * Update gradio/chat_interface.py Co-authored-by: Dawood Khan <dawoodkhan82@gmail.com> * Update gradio/chat_interface.py Co-authored-by: Dawood Khan <dawoodkhan82@gmail.com> * tolerant --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> Co-authored-by: Charles <charles@huggingface.co> Co-authored-by: Dawood Khan <dawoodkhan82@gmail.com> * Added max lines and overflow scrollbar for `gr.Code` (#9311) * add max lines for gr.Code * add changeset * revert default lines to 5 * fix tests * lint --------- Co-authored-by: Abubakar Abid <abubakar@huggingface.co> Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * Fix File Types for MultimodalTextbox (#9393) * fix file_types * add changeset --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * Prevent HTML and Markdown height changing when status is hidden (#9363) * fix markdown height changing * * add min_height param to html * prevent height from changing based on status * add changeset * add changeset * param desc change * fix test * format * * add max height to html * share css_units func * add changeset * fix backend test * fe --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> Co-authored-by: Abubakar Abid <abubakar@huggingface.co> * Object Detection From Webcam Stream Guide (#9336) * guides * Add demo * guide * Add info about Powershell client (#9343) * clients * add changeset --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * Remove lite/theme.css from the Git-managed file tree (#9335) * Delete js/lite/src/theme.css from the Git managed file tree as it's dynamically generated * Remove lite-related npm scripts from spa/package.json * add changeset --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * 9227 chatinterface retry bug (#9316) * first draft * add code * tip * add changeset * delete dead code * Type check notebook * consolidate like section with guide * Add comments * add value * Lint * lint * guide --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> Co-authored-by: Abubakar Abid <abubakar@huggingface.co> * Move icons into `IconButtonWrapper` (#9261) * * update icon buttons * add image editor specific icon button * tweak hover * margin tweak * add changeset * improve gr.Video button UI * radius tweak * ensure even spacing * fix typechecks * add changeset * revert irrelevant changes * typefix * fix image editor buttons * fix download link icon * disable undo if no change events dispatched in model3d and video * use icons with iconbuttonwrapper * add iconbuttonwrapper around gallery share btn * Revert "add iconbuttonwrapper around gallery share btn" This reverts commit4605302df4
. * add changeset * design fixes * add changeset * move status tracker progress to bottom of component * add changeset * use iconbutton for like/dislike * fix lint error * fix type errors * type errors * fix test * revert undo icon change * btn spacing --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * Added gradio-in-r (#9340) * Added gradio-in-r * add changeset * section * remove * tweaks * delete changeset * R * Updated using-gradio-in-other-programming-languages.md --------- Co-authored-by: Abubakar Abid <abubakar@huggingface.co> Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * Enhance Lite E2E tests and fix a networking problem on Lite (#9333) * Add Lite E2E test to check a matplotlib problem which was fixed in https://github.com/gradio-app/gradio/pull/9312 * Restore js/app/test/image_remote_url.spec.ts, which was deleted in https://github.com/gradio-app/gradio/pull/8716 * Fix tootils import * Format * Fix processing_utils.resolve_with_google_dns to use the HTTPX client instead of urllib so it works on Lite * add changeset * add changeset * Move js/app/test/image_remote_url.spec.ts -> js/spa/test/image_remote_url.spec.ts * Use pyodide.http in resolve_with_google_dns on Lite --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * Do not attach `content_disposition_type = "attachment"` headers for files explicitly allowed by developer (#9348) * changes * add changeset * format * fix type * type * add test --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * Fix overflowing markdown in Chatbot (#9260) * fix markdown overflowing table * add changeset * revert undo icon * add changeset * Revert "revert undo icon" This reverts commit855b012a20
. * add changeset --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * demo name * Guide on Streaming Video for Object Detection (#9365) * Add code * notebooks * Suggestions * Add gif * Small tweak to how thoughts are shown in `gr.Chatbot` (#9359) * thiknk chat * add changeset * lint --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * Use `container` param in `gr.Markdown` (#9356) * * add param * add story * add changeset * Use IconButton for copy btn * fix test --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * small fixes (#9347) * Updated Guide: Real Time Speech Recognition (#9349) * Update real-time-speech-recognition.md added necessary dependency * Update run.py updated code to handle cases with stereo microphone * Update real-time-speech-recognition.md improved english * Update run.py updated code for streaming * Update run.py * chunk space uploads (#9360) * chunk space uploads * Update upload_demo_to_space.py Co-authored-by: Lucain <lucainp@gmail.com> * address comments + tweak CI --------- Co-authored-by: Lucain <lucainp@gmail.com> * add find (#9368) * New branch (#9369) * add find * fix syntax * New branch (#9370) * add find * fix syntax * add hidden files * run format * Testing CI (#9379) * remove unnecessary redirects * add changeset * fix * formatting --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * Fixes website build in 5.0-dev (#9382) * changes * add changeset --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * Small tweaks to improve the DX for the "tuples"/"messages" argument in `gr.Chatbot` (#9358) * change format * format * add changeset * revert * revert --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * Update babylon.js to `v7` for `gr.Model3D` (#9377) * update package.json * add changeset * add changeset * update pnpm lock * add changeset --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * Fix `gr.ImageEditor` toolbar cutoff (#9371) * fix wrap alignment * add changeset --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * add lite upload (#9385) * fix sha (#9386) * Fix lite ci (#9387) * fix sha * fix name * fix name * Add code * feedback * link * add changeset * code * check * Update guides/04_additional-features/02_streaming-outputs.md * Update guides/07_streaming/02_object-detection-from-webcam.md --------- Co-authored-by: Abubakar Abid <abubakar@huggingface.co> Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> Co-authored-by: Yuichiro Tachibana (Tsuchiya) <t.yic.yt@gmail.com> Co-authored-by: Hannah <hannahblair@users.noreply.github.com> Co-authored-by: Ifeanyi Idiaye <72707830+Ifeanyi55@users.noreply.github.com> Co-authored-by: Julien Chaumond <julien@huggingface.co> Co-authored-by: Nikita Krasnytskyi <nikita.kras.kyiv@gmail.com> Co-authored-by: pngwn <hello@pngwn.io> Co-authored-by: Lucain <lucainp@gmail.com> Co-authored-by: Ali Abdalla <ali.si3luwa@gmail.com> * Fix gradio.js aws path (#9397) * fix folder path for beta * add changeset --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * Trigger state change event on iterators (#9299) * Fix render async * add changeset * Fix regression * tests * Add code --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> Co-authored-by: Abubakar Abid <abubakar@huggingface.co> * add local fonts and update themes (#9367) * add local fonts and update themes * add changeset * tweak * - dedent css - fix if logic * store theme fonts locally + update themes with `LocalFont` * lint * fix font loading --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> Co-authored-by: freddyaboulton <alfonsoboulton@gmail.com> * Disable liking user message in chatbot by default but make it configurable (#9323) * Code * add changeset * revert * test" " * typo * Fix code --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * Fix Cached Examples for Streamed Media (#9373) * fix problem * add changeset * gitignore * lint * Add code * Add code * Fix extension * add changeset * unit test * typecheck * typecheck * lint * test --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * Fixes annoying height bug in playground (#9402) * fix styling issue * add changeset --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * Chatbot Examples (#8966) * examples * examples * first pass * remove comments * remove comments * add changeset * Fix chatinterface e2e test (#9104) * Refactor test * comment * Fix image * add changeset * add changeset --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * fix version + pkg name (#9110) * fix version + pkg name * add changeset --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * fix dev (#9115) * fix asset locations * fix changeset * Be able to set optimizeDeps options in gradio.config.js (#9091) * Add code * add changeset * build * Remove unused import --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * Better text styling on docs (#9108) * margin and size * add changeset --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * setup npm-previews of all packages (#9118) * add workflow * fix pkg jsons * workflow name * add changeset * fix * add changeset * fix build command --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * Fix chatinterface multimodal bug (#9119) * Add test * add changeset * comments --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * chatbot examples * examples changes * chatinterface * chatinterface * pr fixes * remove html demo change * suggestion width * type fixes * format * comment our examples test * remove cache * comment example caching test * bug fix * bug fix * format * type fix * Proposal: remove `gr.make_waveform` and remove `matplotlib` as a dependency (#9312) * remove matplotlib * add changeset * remove tests, demo * Fix the Lite worker to set the matplotlib backend engine only when the matplotlib package is installed * add changeset * Fix comment --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> Co-authored-by: Yuichiro Tachibana (Tsuchiya) <t.yic.yt@gmail.com> * Dont move files to cache automatically in chatbot postprocess (#9303) * Fix * add changeset * Add code --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * test fix * format * changes * update guide * cache examples * add changeset * format * changes * changes * changes * changes * changes * changes * format * fixes * test chat interface fixes --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> Co-authored-by: Freddy Boulton <alfonsoboulton@gmail.com> Co-authored-by: pngwn <hello@pngwn.io> Co-authored-by: Ali Abdalla <ali.si3luwa@gmail.com> Co-authored-by: Abubakar Abid <abubakar@huggingface.co> Co-authored-by: Yuichiro Tachibana (Tsuchiya) <t.yic.yt@gmail.com> Co-authored-by: Ali Abid <aliabid94@gmail.com> * Ssr part 2 (#9339) * chore: update versions (beta) (#9263) * Center icon in button when no text is present (#9405) * center button when only icon is present * add changeset * format * add story --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * fix SSR apps on spaces (#9412) * test * add changeset * test * test * test * fix? * fix? * add changeset * fix * fix * fix * fix * fix finally? * fix * add changeset * lints etc * add changeset * remove spa mode * fix env * typing * change * lint * remove node logs * remove node logs --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> Co-authored-by: Abubakar Abid <abubakar@huggingface.co> * Small fixes to `gr.Dataframe` and chatbot docs (#9376) * docs * add changeset --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * chore: update versions (beta) (#9416) Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> * Allow skipping an arbitrary number of output components, and also raise a warning if the number of output components does not match the number of values returned from a function (#9406) * demo * add warnings * add changeset * add changeset * add doc section * format * fix check * fix typing issues * docs * lint --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * fix css (#9427) * fix css * add changeset * format --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> Co-authored-by: Dawood <dawoodkhan82@gmail.com> * Fix Python unit tests on `5.0-dev` branch (#9432) * fix python unit tests * changes * changes * fix * Lite: HTTPX client improvement (#9413) * Use the httpx client in resolve_with_google_dns both for normal and Lite * add changeset * Set decode_content=False * Add type hints * Set decode_content=True and remove the Content-Encoding header so the content is decoded by urllib3 instead of httpx * Fix * Add comment * Restore the original resolve_with_google_dns to make such changes in another PR * add changeset * Update comment * Updated the test requirements * Fix type hint * Revert "Updated the test requirements" This reverts commit2e43584a87
. --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> Co-authored-by: Abubakar Abid <abubakar@huggingface.co> * Use or `pathlib.Path` objects to indicate filepaths for `css`, `js`, and `head` parameters (#9448) * format * add changeset --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * Reduce analytics that are collected (#9447) * reduce analytics collected * analytics * add changeset * bring back css --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * Fix SSR mode flag with `mount_gradio_app` and revert changes to pytests (#9446) * Revert "Fix Python unit tests on `5.0-dev` branch (#9432)" This reverts commit278645b649
. * revert changes to pytest * add changeset * fix --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * Small changes to caching (#9438) * caching changes * add changeset * typo * typo * changes * fix * fix --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * Refactoring playground (#9426) * Use @gradio/code.BaseCode instead of its default export like https://github.com/gradio-app/gradio/pull/8804 * Delete unused code * add changeset * Fix * Rename a variable to be descriptive * Mount single <Code> instance instead of creating one for each demo * Fix the initial value passed to createGradioApp * Use const instead of let * Rename variable * Update * Fix layout * Restore the preset requirements * Delete unused variable * Add type hint * Attach the keydown handler directly to the input element instead of the window object * Add code editor widget --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * Chatbot bug fixes (#9453) * image fixes * add changeset * more fixes * fix * fix * css fixes --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> Co-authored-by: Abubakar Abid <abubakar@huggingface.co> * Update object detection guide (#9456) * First draft * Add code * update guide * add changeset * revert * edits * Add code * notebooks * fix code --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * Start/stop recoding from the backend. Add guide on conversational chatbots (#9419) * Add code * stop displatch * first draft * edit * add changeset * lint * Docstring * Make recording * fix video * fix guide link * redirect * add changeset --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * Improve UI on the Playground (#9462) * ai prompt always there * fix overflow * better ui and suggested prompts * cancel generation and showing erro * formatting * add changeset * fix height issue and button * changes * fix --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * Fix. Triggered dataframe change event for header change (#9469) * Fix. Triggered dataframe change event for header change * add changeset * lint * add changeset --------- Co-authored-by: Abubakar Abid <abubakar@huggingface.co> Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * chore: update versions (beta) (#9420) Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> * format * Fix package.json `exports` of @gradio/preview (#9468) * Fix package.json exports of @gradio/preview * add changeset --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> Co-authored-by: Abubakar Abid <abubakar@huggingface.co> * Fix plots (#9464) * fix * add changeset * lint * clean * ts * format * add changeset * format * remove test that is wrong * fixxxxxx * add changeset * format --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> Co-authored-by: Abubakar Abid <abubakar@huggingface.co> * Pre/post-processing download requests (#9383) * changes * add changeset * changes * change * changes * changes * changes * changes * change * changes * changes * changes * changes * changes * changes * changes * Update gradio/processing_utils.py Co-authored-by: Abubakar Abid <abubakar@huggingface.co> * changes * changes * changes * changes * changes * changes * Fix Lite's ASGI receiver to convert memoryview to bytes as the multipart parser called in98cbcaef82/gradio/route_utils.py (L650)
calls bytes.find() and memoryview objects don't have the method * add changeset * Fix async_get_with_secure_transport to use the unsecure but Pyodide-compatible transport in the case of Wasm --------- Co-authored-by: Ali Abid <aliabid94@gmail.com> Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> Co-authored-by: Abubakar Abid <abubakar@huggingface.co> Co-authored-by: Yuichiro Tachibana (Tsuchiya) <t.yic.yt@gmail.com> * Add support for 3rd party providers to `gr.load`, and provide a better UX for conversational models (#9470) * changes * add changeset * changes * changes * docstring * chatbot * changes * fix test * format * add changeset * update req * remove conversational * add changeset * remove args --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * chore: update versions (beta) (#9476) Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> * Fix `slider-color` var (#9481) * fix slider-color * add changeset --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * Playground requirements tab (#9460) * Add a tab navigation to the playground so the user can specify the requirement packages * Add Transformers.js.py demo and fix the playground to install the requirements immediately after switching the demo * add changeset * Format * add changeset * Fix preview flex * Add requirements to the share link and deploy to Spaces buttons * Add requirements.txt to each demo * Format * Update notebooks * Fix * Update --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> Co-authored-by: aliabd <ali.si3luwa@gmail.com> * Fix prettierignore (#9486) * Minor fixes to docs and a demo (#9493) * small things * docstring * add changeset --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * Check for `file_types` parameter in the backend (#9431) * file check fix * format * add changeset * tests * add changeset * Update gradio/components/file.py Co-authored-by: Abubakar Abid <abubakar@huggingface.co> * Update client/python/gradio_client/utils.py Co-authored-by: Abubakar Abid <abubakar@huggingface.co> * fixes * fixes * test fix * test fix * test --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> Co-authored-by: Abubakar Abid <abubakar@huggingface.co> * Ensure media queries work for SSR mode (#9428) * asd * asd * fix * add changeset * add changeset --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> Co-authored-by: Abubakar Abid <abubakar@huggingface.co> * Fix custom component CLI unit tests (#9495) * fix * fix audio test * fix template * add changeset --------- Co-authored-by: Abubakar Abid <abubakar@huggingface.co> Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * Fixes: Chatbot examples for custom chatbot + rename `suggestions` -> `examples` (#9488) * fix * add changeset * notebooks * fixes * fix * type fix --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> Co-authored-by: Abubakar Abid <abubakar@huggingface.co> * UI theme fixes (#9496) * changes * add changeset * changes * changes * add changeset * changes --------- Co-authored-by: Ali Abid <aliabid94@gmail.com> Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> Co-authored-by: Abubakar Abid <abubakar@huggingface.co> * Centre components within `Block` when height and width are set (#9504) * add centering margin * add changeset * add changeset --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * Improve `gr.Code` (#9450) * fix check icon on download * * apply unused min_width param * improve gutter spacing * hide `BlockLabel` spacing if `show_label` is false * format * tweak spacing, remove `fit-content` * add changeset * revert height change * fix * allow setting max_lines to None * add line wrapping * add wrap lines param * fix type error * fix py test * fix type check --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * Fix node process to run with correct server name (#9506) * fix node process * add changeset * add changeset * format * cleanup --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * yaml lint * Add Bokeh plot demo (#9423) * Add Bokeh plot demo * Update notebook --------- Co-authored-by: Abubakar Abid <abubakar@huggingface.co> * Expanding AI Playground Prompt for Qwen (#9452) * expand prompt for qwen * add changeset * clean * add changeset * heavily modify prompt * changes * many changes * fix weird syntax error * fix * ? * changes * fix requirements * formatting --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * docs: update 01_quickstart.md (#9515) arbitary -> arbitrary Co-authored-by: Abubakar Abid <abubakar@huggingface.co> * Fix change triggers for dropdown and radio (#9519) * fix change triggers * add changeset --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * chore: update versions (beta) (#9485) Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> * better layer handling * Fix single select dropdown (#9526) * Set the default value of Dropdown as undefined instead of [] when multiselect=false * Refactoring * add changeset * Fix tests --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * Hide x axis labels (#9497) * changes * add changeset * fix --------- Co-authored-by: Ali Abid <aliabid94@gmail.com> Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> Co-authored-by: Abubakar Abid <abubakar@huggingface.co> * Add Jinja2 language to Code component (#9545) * Add jinja2 codemirror language * add jinja2 * add changeset --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * Disable sagemaker_check() for now (#9546) * Add is_sagemaker param to Blocks, so sagemaker_check() can be explicitly disabled * revert * add changeset * format * add changeset --------- Co-authored-by: Mate Valko <> Co-authored-by: Abubakar Abid <abubakar@huggingface.co> Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * chore: update versions (beta) (#9544) Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> * Update gr.ColorPicker UI (#9570) * update color picker dialog * add changeset * add tinycolor types * fix disabled param * add changeset --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * Fix cut off in gr.ImageEditor (#9525) * remove default height value * remove canvas w x h * revert comment * add changeset * add changeset * fix stage-wrap shift * empty tweak * add changeset * tweak * type fix * test --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> Co-authored-by: Abubakar Abid <abubakar@huggingface.co> * Change caching to occur not at the creation of a `gr.Examples()` but when the Blocks is actually launched (#9508) * changes * changes * add changeset * await * add changeset * changes * changes * changes * changes --------- Co-authored-by: Ali Abid <aliabid94@gmail.com> Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> Co-authored-by: Abubakar Abid <abubakar@huggingface.co> * Add `css_paths` and `head_paths` parameters (#9524) * paths * add changeset * changes * fixes * add new lines * remove js_paths * add changeset * format --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * Fix most flaky Python tests in `5.0-dev` branch (#9550) * fix flaky tests * add changeset * token * changes * fixes * hf token * format * test * format * root url * format * fix * fix tests * add changeset * remove huggingface hub fixed version * add changeset * remove print --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * Api info fix (#9522) * api-info-fix * add changeset * Add with fallback * route utils * update --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * Send Streaming data over Websocket if possible. Also support base64 output format for images. (#9483) * b64 first draft * ws * onMount + demos and guide * guide * add changeset * Add code * lint * type check * Have a fallback * Add code * delete unneccessary input * API info tweaks * Revert type param type hint * Add code * api-info-fix * add changeset * Add with fallback * route utils * update * final tweaks * type check * fix * add changeset * fix * add changeset --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> Co-authored-by: Abubakar Abid <abubakar@huggingface.co> * Allow `info=` to render markdown (#9521) * allow info to render markdown * add changeset * update docstrings * format * fixes * add changeset * fix * add changeset * root * add changeset --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> Co-authored-by: Abubakar Abid <abubakar@huggingface.co> * Equal height columns (#9577) * changes * add changeset * add changeset --------- Co-authored-by: Ali Abid <aliabid94@gmail.com> Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * Fix chatinterface embedding height issues (#9571) * changes * add changeset * changes * changes * lint --------- Co-authored-by: Ali Abid <aliabid94@gmail.com> Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> Co-authored-by: Abubakar Abid <abubakar@huggingface.co> * chore: update versions (beta) (#9572) Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> * Update gr.Dataframe UI with action popover (#9575) * add dialog for actions * add changeset * add story * add changeset * * remove temp select column * change open dialog UX in mobile * fix border * fix test --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * Disable the submit button and enter-key submit when the text is empty (#9583) * Disable the submit button and enter-key submit when the text is empty * add changeset --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * Chat Interface Multimodal Fix & Fallback to `gr.Examples()` (#9584) * fic * add changeset * fallback to original examples * add changeset * lint --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> Co-authored-by: Abubakar Abid <abubakar@huggingface.co> * Fix `gr.Chatbot` panels layout (#9499) * fix avatar margins * separate component logic out and add message component * fix panel mode and upate chatbot buttons * add changeset * fix type check * fix typecheck * reduce message padding * fix empty message * revert css removal * test * test * Revert "test" This reverts commit40c9e396a1
. * Revert "test" This reverts commit660a6b06ea
. * move message-wrap styes * bubble width + markdown tweak * fix test --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * Equal height in row false by default (#9591) * changes * add changeset * changes --------- Co-authored-by: Ali Abid <aliabid94@gmail.com> Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * Fix reload mode (#9576) * Ddebuig * Fixing * fix * notebook * add changeset * SSR MODE * add changeset --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * Chatbot autoscroll (#9582) * Auto scroll on the Chatbot component * Scroll down button's design * Parameterize autoscroll * add changeset * Fix test * Fix * Fix the <Video> component to dispatch the load event after the metadata is loaded * add changeset * Add tick * Fix * Fix * Add loadstart and loadeddata and remove load event forwarder from <Video> because <video> doesn't dispatch the load event * Fix <Player> as well * Fix * Add pending_message as the scroll trigger and remove unnecessary tick * Refactoring <Image> * add changeset * Fix * Fix * icon fix * add changeset --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> Co-authored-by: Abubakar Abid <abubakar@huggingface.co> Co-authored-by: Dawood <dawoodkhan82@gmail.com> * Only move files to the cache that have a meta key (#9589) * Fix code * add changeset * Code * test * tests * add changeset * lint --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * Some more chatbot fixes (#9593) * some fixes * add changeset --------- Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> * persist imed histopry * stoof * stoof * fix * rende ronly visible * format pythong * format js * remove * fix files * add changeset * fix files * add changeset * fix files * add changeset * more fix * format * notebooks * add changeset * add changeset * lockfile * fix files * fix files * add changeset * fix webcam * disable selective rendering * changes * add changeset * fix test * fmt * add changeset --------- Co-authored-by: freddyaboulton <alfonsoboulton@gmail.com> Co-authored-by: aliabid94 <aabid94@gmail.com> Co-authored-by: Ali Abid <aliabid94@gmail.com> Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com> Co-authored-by: Abubakar Abid <abubakar@huggingface.co> Co-authored-by: Yuichiro Tachibana (Tsuchiya) <t.yic.yt@gmail.com> Co-authored-by: Dawood Khan <dawoodkhan82@gmail.com> Co-authored-by: Hannah <hannahblair@users.noreply.github.com> Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> Co-authored-by: Gradio PR Bot <121576822+gradio-pr-bot@users.noreply.github.com> Co-authored-by: Ikko Eltociear Ashimine <eltociear@gmail.com> Co-authored-by: Tayfun Sen <tayfun.sen@gmail.com> Co-authored-by: Ifeanyi Idiaye <72707830+Ifeanyi55@users.noreply.github.com> Co-authored-by: Ali Abdalla <ali.si3luwa@gmail.com> Co-authored-by: Charles <charles@huggingface.co> Co-authored-by: Michał Pstrąg <m.pstrag.kontakt@gmail.com> Co-authored-by: Julien Chaumond <julien@huggingface.co> Co-authored-by: Nikita Krasnytskyi <nikita.kras.kyiv@gmail.com> Co-authored-by: Lucain <lucainp@gmail.com> Co-authored-by: Joodith <67360396+Joodith@users.noreply.github.com> Co-authored-by: Col0ring <47329987+Col0ring@users.noreply.github.com> Co-authored-by: Sigbjørn Skjæret <sigbjorn.skjaeret@scala.com> Co-authored-by: Mate Valko <3168272+vmatt@users.noreply.github.com>
This commit is contained in:
parent
6edf0380b9
commit
4fc7fb777c
.changeset
demo/render_visibility
js
atoms/src
core/src
image/shared
imageeditor
Index.svelte
shared
markdown-code
markdown/shared
tabitem
tabs
video/shared
14
.changeset/fuzzy-webs-change.md
Normal file
14
.changeset/fuzzy-webs-change.md
Normal file
@ -0,0 +1,14 @@
|
||||
---
|
||||
"@gradio/atoms": minor
|
||||
"@gradio/core": minor
|
||||
"@gradio/image": minor
|
||||
"@gradio/imageeditor": minor
|
||||
"@gradio/markdown": minor
|
||||
"@gradio/markdown-code": minor
|
||||
"@gradio/tabitem": minor
|
||||
"@gradio/tabs": minor
|
||||
"@gradio/video": minor
|
||||
"gradio": minor
|
||||
---
|
||||
|
||||
feat:Ensure components can be remounted with their previous data
|
1
demo/render_visibility/run.ipynb
Normal file
1
demo/render_visibility/run.ipynb
Normal file
@ -0,0 +1 @@
|
||||
{"cells": [{"cell_type": "markdown", "id": "302934307671667531413257853548643485645", "metadata": {}, "source": ["# Gradio Demo: render_visibility"]}, {"cell_type": "code", "execution_count": null, "id": "272996653310673477252411125948039410165", "metadata": {}, "outputs": [], "source": ["!pip install -q gradio "]}, {"cell_type": "code", "execution_count": null, "id": "288918539441861185822528903084949547379", "metadata": {}, "outputs": [], "source": ["import gradio as gr\n", "\n", "\n", "def greet(name):\n", " return \"Hello \" + name + \"!\"\n", "\n", "\n", "with gr.Blocks() as demo:\n", " with gr.Tabs():\n", " with gr.TabItem(\"Tab 1\"):\n", " t = gr.Textbox(\"Some value\", label=\"Name\", visible=False)\n", " btn = gr.Button(\"Show\")\n", " btn.click(lambda: gr.Textbox(visible=True), inputs=None, outputs=t)\n", " with gr.TabItem(\"Tab 2\"):\n", " t2 = gr.Textbox(\"Some other value\", label=\"Name\", visible=False)\n", " btn2 = gr.Button(\"Show\")\n", " btn2.click(lambda: gr.Textbox(visible=True), inputs=None, outputs=t2)\n", "\n", "if __name__ == \"__main__\":\n", " demo.launch()\n"]}], "metadata": {}, "nbformat": 4, "nbformat_minor": 5}
|
20
demo/render_visibility/run.py
Normal file
20
demo/render_visibility/run.py
Normal file
@ -0,0 +1,20 @@
|
||||
import gradio as gr
|
||||
|
||||
|
||||
def greet(name):
|
||||
return "Hello " + name + "!"
|
||||
|
||||
|
||||
with gr.Blocks() as demo:
|
||||
with gr.Tabs():
|
||||
with gr.TabItem("Tab 1"):
|
||||
t = gr.Textbox("Some value", label="Name", visible=False)
|
||||
btn = gr.Button("Show")
|
||||
btn.click(lambda: gr.Textbox(visible=True), inputs=None, outputs=t)
|
||||
with gr.TabItem("Tab 2"):
|
||||
t2 = gr.Textbox("Some other value", label="Name", visible=False)
|
||||
btn2 = gr.Button("Show")
|
||||
btn2.click(lambda: gr.Textbox(visible=True), inputs=None, outputs=t2)
|
||||
|
||||
if __name__ == "__main__":
|
||||
demo.launch()
|
BIN
demo/render_visibility/screenshot.gif
Normal file
BIN
demo/render_visibility/screenshot.gif
Normal file
Binary file not shown.
After ![]() (image error) Size: 90 KiB |
@ -62,7 +62,7 @@
|
||||
data-testid={test_id}
|
||||
id={elem_id}
|
||||
class:hidden={visible === false}
|
||||
class="block {elem_classes.join(' ')}"
|
||||
class="block {elem_classes?.join(' ') || ''}"
|
||||
class:padded={padding}
|
||||
class:flex
|
||||
class:border_focus={border_mode === "focus"}
|
||||
|
@ -88,6 +88,7 @@
|
||||
{...node.props}
|
||||
{theme_mode}
|
||||
{root}
|
||||
visible={typeof node.props.visible === "boolean" ? node.props.visible : true}
|
||||
>
|
||||
{#if node.children && node.children.length}
|
||||
{#each node.children as _node (_node.id)}
|
||||
|
@ -17,6 +17,7 @@
|
||||
export let elem_id: string;
|
||||
export let elem_classes: string[];
|
||||
export let _id: number;
|
||||
export let visible: boolean;
|
||||
|
||||
const s = (id: number, p: string, v: any): CustomEvent =>
|
||||
new CustomEvent("prop_change", { detail: { id, prop: p, value: v } });
|
||||
@ -51,6 +52,7 @@
|
||||
const _component = wrap(component);
|
||||
</script>
|
||||
|
||||
<!-- {#if visible} -->
|
||||
<svelte:component
|
||||
this={_component}
|
||||
bind:this={instance}
|
||||
@ -59,9 +61,11 @@
|
||||
{elem_id}
|
||||
{elem_classes}
|
||||
{target}
|
||||
{visible}
|
||||
{...$$restProps}
|
||||
{theme_mode}
|
||||
{root}
|
||||
>
|
||||
<slot />
|
||||
</svelte:component>
|
||||
<!-- {/if} -->
|
||||
|
@ -300,15 +300,15 @@ export function create_components(initial_layout: ComponentMeta | undefined): {
|
||||
|
||||
if (instance.type === "tabs" && !instance.props.initial_tabs) {
|
||||
const tab_items_props =
|
||||
node.children?.map((c) => {
|
||||
node.children?.map((c, i) => {
|
||||
const instance = instance_map[c.id];
|
||||
// console.log("tabs", JSON.stringify(instance.props, null, 2));
|
||||
instance.props.id ??= c.id;
|
||||
return {
|
||||
type: instance.type,
|
||||
props: {
|
||||
...(instance.props as any),
|
||||
id: instance.props.id
|
||||
id: instance.props.id,
|
||||
order: i
|
||||
}
|
||||
};
|
||||
}) || [];
|
||||
@ -321,10 +321,18 @@ export function create_components(initial_layout: ComponentMeta | undefined): {
|
||||
label: child.props.label,
|
||||
id: child.props.id,
|
||||
visible: child.props.visible,
|
||||
interactive: child.props.interactive
|
||||
interactive: child.props.interactive,
|
||||
order: child.props.order
|
||||
}));
|
||||
}
|
||||
|
||||
if (instance.type === "tabs") {
|
||||
node.children?.forEach((c, i) => {
|
||||
const child = instance_map[c.id];
|
||||
child.props.order = i;
|
||||
});
|
||||
}
|
||||
|
||||
return instance;
|
||||
}
|
||||
|
||||
@ -414,7 +422,7 @@ export function create_components(initial_layout: ComponentMeta | undefined): {
|
||||
state: "open" | "closed" | "waiting"
|
||||
): void {
|
||||
const comp = _component_map.get(id);
|
||||
if (comp?.instance?.modify_stream_state) {
|
||||
if (comp && comp.instance?.modify_stream_state) {
|
||||
comp.instance.modify_stream_state(state);
|
||||
}
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
<script lang="ts">
|
||||
import { createEventDispatcher, onMount } from "svelte";
|
||||
import { createEventDispatcher, onDestroy, onMount } from "svelte";
|
||||
import {
|
||||
Camera,
|
||||
Circle,
|
||||
@ -198,7 +198,7 @@
|
||||
}
|
||||
};
|
||||
ReaderObj.readAsDataURL(video_blob);
|
||||
} else {
|
||||
} else if (typeof MediaRecorder !== "undefined") {
|
||||
dispatch("start_recording");
|
||||
recorded_blobs = [];
|
||||
let validMimeTypes = ["video/webm", "video/mp4"];
|
||||
@ -273,6 +273,12 @@
|
||||
event.stopPropagation();
|
||||
options_open = false;
|
||||
}
|
||||
|
||||
onDestroy(() => {
|
||||
if (typeof window === "undefined") return;
|
||||
record_video_or_photo();
|
||||
stream?.getTracks().forEach((track) => track.stop());
|
||||
});
|
||||
</script>
|
||||
|
||||
<div class="wrap">
|
||||
|
@ -57,6 +57,7 @@
|
||||
};
|
||||
export let canvas_size: [number, number] | undefined;
|
||||
export let show_fullscreen_button = true;
|
||||
export let full_history: any = null;
|
||||
|
||||
export let gradio: Gradio<{
|
||||
change: never;
|
||||
@ -185,6 +186,7 @@
|
||||
/>
|
||||
|
||||
<InteractiveImageEditor
|
||||
on:history={(e) => (full_history = e.detail)}
|
||||
bind:dragging
|
||||
{canvas_size}
|
||||
on:change={() => handle_history_change()}
|
||||
@ -221,6 +223,7 @@
|
||||
upload={(...args) => gradio.client.upload(...args)}
|
||||
stream_handler={(...args) => gradio.client.stream(...args)}
|
||||
{placeholder}
|
||||
{full_history}
|
||||
></InteractiveImageEditor>
|
||||
</Block>
|
||||
{/if}
|
||||
|
@ -2,7 +2,7 @@
|
||||
import type { Writable, Readable } from "svelte/store";
|
||||
import type { Spring } from "svelte/motion";
|
||||
import { type PixiApp } from "./utils/pixi";
|
||||
import { type CommandManager } from "./utils/commands";
|
||||
import { type CommandManager, type CommandNode } from "./utils/commands";
|
||||
|
||||
export const EDITOR_KEY = Symbol("editor");
|
||||
export type context_type = "bg" | "layers" | "crop" | "draw" | "erase";
|
||||
@ -71,10 +71,12 @@
|
||||
clear?: never;
|
||||
save: void;
|
||||
change: void;
|
||||
history: CommandManager["current_history"];
|
||||
}>();
|
||||
export let crop_constraint = false;
|
||||
export let canvas_size: [number, number] | undefined;
|
||||
export let parent_height: number;
|
||||
export let full_history: CommandNode | null = null;
|
||||
|
||||
$: orig_canvas_size = canvas_size;
|
||||
|
||||
@ -114,7 +116,15 @@
|
||||
|
||||
const { can_redo, can_undo, current_history } = CommandManager;
|
||||
|
||||
function get_start_history(history: any): any {
|
||||
if (history.previous) {
|
||||
return get_start_history(history.previous);
|
||||
}
|
||||
return history;
|
||||
}
|
||||
|
||||
$: $current_history.previous, dispatch("change");
|
||||
$: dispatch("history", get_start_history($current_history));
|
||||
|
||||
$: {
|
||||
history = !!$current_history.previous || $active_tool !== "bg";
|
||||
@ -316,6 +326,12 @@
|
||||
|
||||
resize(...$dimensions);
|
||||
|
||||
tick().then(() => {
|
||||
if (full_history) {
|
||||
CommandManager.hydrate(full_history);
|
||||
}
|
||||
});
|
||||
|
||||
return () => {
|
||||
$pixi?.destroy();
|
||||
resizer.disconnect();
|
||||
|
@ -16,7 +16,7 @@
|
||||
import { createEventDispatcher } from "svelte";
|
||||
import { type I18nFormatter } from "@gradio/utils";
|
||||
import { prepare_files, type FileData, type Client } from "@gradio/client";
|
||||
|
||||
import { type CommandNode } from "./utils/commands";
|
||||
import ImageEditor from "./ImageEditor.svelte";
|
||||
import Layers from "./layers/Layers.svelte";
|
||||
import { type Brush as IBrush } from "./tools/Brush.svelte";
|
||||
@ -57,6 +57,7 @@
|
||||
export let dragging: boolean;
|
||||
export let placeholder: string | undefined = undefined;
|
||||
export let height = 450;
|
||||
export let full_history: CommandNode | null = null;
|
||||
|
||||
const dispatch = createEventDispatcher<{
|
||||
clear?: never;
|
||||
@ -215,6 +216,7 @@
|
||||
label={label || i18n("image.image")}
|
||||
/>
|
||||
<ImageEditor
|
||||
on:history
|
||||
{canvas_size}
|
||||
crop_size={Array.isArray(crop_size) ? crop_size : undefined}
|
||||
bind:this={editor}
|
||||
@ -228,6 +230,7 @@
|
||||
bind:bg
|
||||
{sources}
|
||||
crop_constraint={!!crop_constraint}
|
||||
{full_history}
|
||||
>
|
||||
<Tools {i18n}>
|
||||
<Layers layer_files={value?.layers || null} enable_layers={layers} />
|
||||
|
@ -12,11 +12,22 @@
|
||||
export let layer_files: (FileData | null)[] | null = [];
|
||||
export let enable_layers = true;
|
||||
|
||||
const { pixi, current_layer, dimensions, register_context } =
|
||||
getContext<EditorContext>(EDITOR_KEY);
|
||||
const {
|
||||
pixi,
|
||||
current_layer,
|
||||
dimensions,
|
||||
register_context,
|
||||
command_manager,
|
||||
current_history
|
||||
} = getContext<EditorContext>(EDITOR_KEY);
|
||||
|
||||
const { can_undo } = command_manager;
|
||||
|
||||
const LayerManager = layer_manager();
|
||||
let layers: LayerScene[] = [];
|
||||
const manager_current_layer = LayerManager.active_layer;
|
||||
const layers = LayerManager.layers;
|
||||
|
||||
$: current_layer.set($manager_current_layer);
|
||||
|
||||
register_context("layers", {
|
||||
init_fn: () => {
|
||||
@ -28,7 +39,7 @@
|
||||
});
|
||||
|
||||
async function validate_layers(): Promise<void> {
|
||||
let invalid = layers.some(
|
||||
let invalid = $layers.some(
|
||||
(layer) =>
|
||||
layer.composite.texture?.width != $dimensions[0] ||
|
||||
layer.composite.texture?.height != $dimensions[1]
|
||||
@ -44,14 +55,17 @@
|
||||
async function new_layer(): Promise<void> {
|
||||
if (!$pixi) return;
|
||||
|
||||
const [active_layer, all_layers] = LayerManager.add_layer(
|
||||
const new_layer = LayerManager.add_layer(
|
||||
$pixi.layer_container,
|
||||
$pixi.renderer,
|
||||
...$dimensions
|
||||
);
|
||||
|
||||
$current_layer = active_layer;
|
||||
layers = all_layers;
|
||||
if ($can_undo || $layers.length > 0) {
|
||||
command_manager.execute(new_layer);
|
||||
} else {
|
||||
new_layer.execute();
|
||||
}
|
||||
}
|
||||
|
||||
$: render_layer_files(layer_files);
|
||||
@ -88,20 +102,20 @@
|
||||
|
||||
LayerManager.reset();
|
||||
|
||||
let last_layer: [LayerScene, LayerScene[]] | null = null;
|
||||
for (const blob of blobs.filter(is_not_null)) {
|
||||
last_layer = await LayerManager.add_layer_from_blob(
|
||||
const new_layer = await LayerManager.add_layer_from_blob(
|
||||
$pixi.layer_container,
|
||||
$pixi.renderer,
|
||||
blob,
|
||||
$pixi.view
|
||||
);
|
||||
|
||||
if ($can_undo && $layers.length === 0) {
|
||||
command_manager.execute(new_layer);
|
||||
} else {
|
||||
new_layer.execute();
|
||||
}
|
||||
}
|
||||
|
||||
if (!last_layer) return;
|
||||
|
||||
$current_layer = last_layer[0];
|
||||
layers = last_layer[1];
|
||||
}
|
||||
|
||||
onMount(async () => {
|
||||
@ -121,13 +135,13 @@
|
||||
<button
|
||||
aria-label="Show Layers"
|
||||
on:click={() => (show_layers = !show_layers)}
|
||||
><span class="icon"><Layers /></span> Layer {layers.findIndex(
|
||||
><span class="icon"><Layers /></span> Layer {$layers.findIndex(
|
||||
(l) => l === $current_layer
|
||||
) + 1}
|
||||
</button>
|
||||
{#if show_layers}
|
||||
<ul>
|
||||
{#each layers as layer, i (i)}
|
||||
{#each $layers as layer, i (i)}
|
||||
<li>
|
||||
<button
|
||||
class:selected_layer={$current_layer === layer}
|
||||
|
@ -8,6 +8,9 @@ import {
|
||||
Filter
|
||||
} from "pixi.js";
|
||||
|
||||
import { type Command } from "../utils/commands";
|
||||
import { get, writable, type Writable } from "svelte/store";
|
||||
|
||||
/**
|
||||
* GLSL Shader that takes two textures and erases the second texture from the first.
|
||||
*/
|
||||
@ -65,8 +68,9 @@ interface LayerManager {
|
||||
container: Container,
|
||||
renderer: IRenderer,
|
||||
width: number,
|
||||
height: number
|
||||
): [LayerScene, LayerScene[]];
|
||||
height: number,
|
||||
sprite?: Sprite
|
||||
): Command;
|
||||
/**
|
||||
* Swaps the layer with the layer above or below it.
|
||||
* @param layer The index layer to swap.
|
||||
@ -89,13 +93,15 @@ interface LayerManager {
|
||||
* @returns The layers.
|
||||
*/
|
||||
get_layers(): LayerScene[];
|
||||
layers: Writable<LayerScene[]>;
|
||||
active_layer: Writable<LayerScene | null>;
|
||||
|
||||
add_layer_from_blob(
|
||||
container: Container,
|
||||
renderer: IRenderer,
|
||||
blob: Blob,
|
||||
view: HTMLCanvasElement
|
||||
): Promise<[LayerScene, LayerScene[]]>;
|
||||
): Promise<Command>;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -126,47 +132,71 @@ export function layer_manager(): LayerManager {
|
||||
container: Container,
|
||||
renderer: IRenderer,
|
||||
width: number,
|
||||
height: number
|
||||
): [LayerScene, LayerScene[]] {
|
||||
const layer_container = new Container() as Container & DisplayObject;
|
||||
position++;
|
||||
layer_container.zIndex = position;
|
||||
height: number,
|
||||
sprite?: Sprite
|
||||
): Command {
|
||||
let layer_container: Container & DisplayObject;
|
||||
let layer_number: number;
|
||||
let that = this;
|
||||
return {
|
||||
execute: function () {
|
||||
layer_container = new Container() as Container & DisplayObject;
|
||||
position++;
|
||||
layer_container.zIndex = position;
|
||||
|
||||
const composite_texture = RenderTexture.create({
|
||||
width,
|
||||
height
|
||||
});
|
||||
const composite_texture = RenderTexture.create({
|
||||
width,
|
||||
height
|
||||
});
|
||||
|
||||
const composite = new Sprite(composite_texture) as Sprite & DisplayObject;
|
||||
const composite = new Sprite(composite_texture) as Sprite &
|
||||
DisplayObject;
|
||||
|
||||
layer_container.addChild(composite);
|
||||
layer_container.addChild(composite);
|
||||
|
||||
composite.zIndex = position;
|
||||
composite.zIndex = position;
|
||||
|
||||
const layer_scene: LayerScene = {
|
||||
draw_texture: RenderTexture.create({
|
||||
width,
|
||||
height
|
||||
}),
|
||||
erase_texture: RenderTexture.create({
|
||||
width,
|
||||
height
|
||||
}),
|
||||
composite
|
||||
const layer_scene: LayerScene = {
|
||||
draw_texture: RenderTexture.create({
|
||||
width,
|
||||
height
|
||||
}),
|
||||
erase_texture: RenderTexture.create({
|
||||
width,
|
||||
height
|
||||
}),
|
||||
composite
|
||||
};
|
||||
|
||||
const erase_filter = new Filter(undefined, erase_shader, {
|
||||
uEraserTexture: layer_scene.erase_texture,
|
||||
uDrawingTexture: layer_scene.draw_texture
|
||||
});
|
||||
|
||||
composite.filters = [erase_filter];
|
||||
|
||||
container.addChild(layer_container);
|
||||
|
||||
that.layers.update((s) => [...s, layer_scene]);
|
||||
that.active_layer.set(layer_scene);
|
||||
|
||||
layer_number = get(that.layers).length - 1;
|
||||
|
||||
if (sprite) {
|
||||
renderer.render(sprite, {
|
||||
renderTexture: layer_scene.draw_texture
|
||||
});
|
||||
}
|
||||
},
|
||||
undo: function () {
|
||||
container.removeChild(layer_container);
|
||||
|
||||
const _layers = get(that.layers);
|
||||
that.layers.set(_layers.filter((_, i) => i !== layer_number));
|
||||
const new_layer = _layers[layer_number - 1] || _layers[0] || null;
|
||||
that.active_layer.set(new_layer);
|
||||
}
|
||||
};
|
||||
|
||||
const erase_filter = new Filter(undefined, erase_shader, {
|
||||
uEraserTexture: layer_scene.erase_texture,
|
||||
uDrawingTexture: layer_scene.draw_texture
|
||||
});
|
||||
|
||||
composite.filters = [erase_filter];
|
||||
|
||||
container.addChild(layer_container);
|
||||
|
||||
_layers.push(layer_scene);
|
||||
|
||||
return [layer_scene, _layers];
|
||||
},
|
||||
|
||||
swap_layers: function (
|
||||
@ -182,7 +212,8 @@ export function layer_manager(): LayerManager {
|
||||
},
|
||||
|
||||
change_active_layer: function (layer: number): LayerScene {
|
||||
current_layer = layer;
|
||||
// current_layer = layer;
|
||||
this.active_layer.set(get(this.layers)[layer]);
|
||||
return _layers[layer];
|
||||
},
|
||||
reset() {
|
||||
@ -194,13 +225,15 @@ export function layer_manager(): LayerManager {
|
||||
_layers = [];
|
||||
current_layer = 0;
|
||||
position = 0;
|
||||
this.active_layer.set(null);
|
||||
this.layers.set([]);
|
||||
},
|
||||
async add_layer_from_blob(
|
||||
container: Container,
|
||||
renderer: IRenderer,
|
||||
blob: Blob,
|
||||
view: HTMLCanvasElement
|
||||
) {
|
||||
): Promise<Command> {
|
||||
const img = await createImageBitmap(blob);
|
||||
const bitmap_texture = Texture.from(img);
|
||||
|
||||
@ -217,22 +250,19 @@ export function layer_manager(): LayerManager {
|
||||
sprite.width = w;
|
||||
sprite.height = h;
|
||||
|
||||
const [layer, layers] = this.add_layer(
|
||||
return this.add_layer(
|
||||
container,
|
||||
renderer,
|
||||
view.width,
|
||||
view.height
|
||||
view.height,
|
||||
sprite
|
||||
);
|
||||
|
||||
renderer.render(sprite, {
|
||||
renderTexture: layer.draw_texture
|
||||
});
|
||||
|
||||
return [layer, layers];
|
||||
},
|
||||
get_layers() {
|
||||
return _layers;
|
||||
}
|
||||
},
|
||||
layers: writable([]),
|
||||
active_layer: writable(null)
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -43,9 +43,12 @@
|
||||
export let color_mode: Brush["color_mode"] | undefined = undefined;
|
||||
export let mode: "erase" | "draw";
|
||||
|
||||
$: processed_colors = colors
|
||||
? colors.map(process_color).filter((_, i) => i < 4)
|
||||
: [];
|
||||
let processed_colors: string[] = [];
|
||||
let old_colors: string[] = [];
|
||||
if (colors && JSON.stringify(old_colors) !== JSON.stringify(colors)) {
|
||||
processed_colors = colors.map(process_color).filter((_, i) => i < 4);
|
||||
old_colors = processed_colors;
|
||||
}
|
||||
|
||||
let selected_color = process_color(default_color || "#000000");
|
||||
|
||||
|
@ -67,12 +67,17 @@ export interface CommandManager {
|
||||
* Observable store that you can subscribe to for updates
|
||||
*/
|
||||
readonly current_history: Writable<CommandNode>;
|
||||
/**
|
||||
* Hydrates the command manager with a full history
|
||||
* @param full_history the full history to hydrate with
|
||||
*/
|
||||
hydrate(full_history: CommandNode): void;
|
||||
}
|
||||
|
||||
/**
|
||||
* Command node interface that is used to create the undo/redo history
|
||||
*/
|
||||
interface CommandNode {
|
||||
export interface CommandNode {
|
||||
/**
|
||||
* Command that the node holds
|
||||
*/
|
||||
@ -147,7 +152,14 @@ export function command_manager(): CommandManager {
|
||||
can_redo.set(!!history.next);
|
||||
current_history.set(history);
|
||||
},
|
||||
|
||||
hydrate: function (full_history: CommandNode) {
|
||||
setTimeout(() => {
|
||||
while (full_history.next) {
|
||||
this.execute(full_history.next.command!);
|
||||
full_history = full_history.next;
|
||||
}
|
||||
}, 1000);
|
||||
},
|
||||
can_undo,
|
||||
can_redo,
|
||||
current_history,
|
||||
|
@ -1,5 +1,5 @@
|
||||
<script lang="ts">
|
||||
import { afterUpdate } from "svelte";
|
||||
import { afterUpdate, tick } from "svelte";
|
||||
import render_math_in_element from "katex/contrib/auto-render";
|
||||
import "katex/dist/katex.min.css";
|
||||
import { create_marked } from "./utils";
|
||||
@ -25,7 +25,7 @@
|
||||
const marked = create_marked({
|
||||
header_links,
|
||||
line_breaks,
|
||||
latex_delimiters
|
||||
latex_delimiters: latex_delimiters || []
|
||||
});
|
||||
|
||||
function escapeRegExp(string: string): string {
|
||||
@ -73,7 +73,7 @@
|
||||
|
||||
async function render_html(value: string): Promise<void> {
|
||||
if (latex_delimiters.length > 0 && value) {
|
||||
const containsDelimiter = latex_delimiters.some(
|
||||
const containsDelimiter = latex_delimiters.every(
|
||||
(delimiter) =>
|
||||
value.includes(delimiter.left) && value.includes(delimiter.right)
|
||||
);
|
||||
|
@ -160,7 +160,7 @@ export function create_marked({
|
||||
},
|
||||
markedHighlight({
|
||||
highlight: (code: string, lang: string) => {
|
||||
if (Prism.languages[lang]) {
|
||||
if (Prism?.languages?.[lang]) {
|
||||
return Prism.highlight(code, Prism.languages[lang], lang);
|
||||
}
|
||||
return code;
|
||||
|
@ -54,7 +54,7 @@
|
||||
</script>
|
||||
|
||||
<div
|
||||
class="prose {elem_classes.join(' ')}"
|
||||
class="prose {elem_classes?.join(' ') || ''}"
|
||||
class:hide={!visible}
|
||||
data-testid="markdown"
|
||||
dir={rtl ? "rtl" : "ltr"}
|
||||
|
@ -17,6 +17,7 @@
|
||||
| undefined;
|
||||
export let visible = true;
|
||||
export let interactive = true;
|
||||
export let order: number;
|
||||
</script>
|
||||
|
||||
<TabItem
|
||||
@ -26,6 +27,7 @@
|
||||
{visible}
|
||||
{interactive}
|
||||
{id}
|
||||
{order}
|
||||
on:select={({ detail }) => gradio?.dispatch("select", detail)}
|
||||
>
|
||||
<slot />
|
||||
|
@ -10,6 +10,7 @@
|
||||
export let id: string | number | object = {};
|
||||
export let visible: boolean;
|
||||
export let interactive: boolean;
|
||||
export let order: number;
|
||||
|
||||
const dispatch = createEventDispatcher<{ select: SelectData }>();
|
||||
|
||||
@ -18,16 +19,20 @@
|
||||
|
||||
let tab_index: number;
|
||||
|
||||
$: tab_index = register_tab({ label, id, elem_id, visible, interactive });
|
||||
$: tab_index = register_tab(
|
||||
{ label, id, elem_id, visible, interactive },
|
||||
order
|
||||
);
|
||||
|
||||
onMount(() => {
|
||||
return (): void => unregister_tab({ label, id, elem_id });
|
||||
return (): void => unregister_tab({ label, id, elem_id }, order);
|
||||
});
|
||||
|
||||
$: $selected_tab_index === tab_index &&
|
||||
tick().then(() => dispatch("select", { value: label, index: tab_index }));
|
||||
</script>
|
||||
|
||||
<!-- {#if $selected_tab === id && visible} -->
|
||||
<div
|
||||
id={elem_id}
|
||||
class="tabitem {elem_classes.join(' ')}"
|
||||
@ -39,9 +44,11 @@
|
||||
</Column>
|
||||
</div>
|
||||
|
||||
<!-- {/if} -->
|
||||
|
||||
<style>
|
||||
div {
|
||||
display: flex;
|
||||
display: block;
|
||||
position: relative;
|
||||
border: none;
|
||||
border-radius: var(--radius-sm);
|
||||
|
@ -9,6 +9,7 @@
|
||||
<Template let:args>
|
||||
<Tabs {...args}>
|
||||
<TabItem
|
||||
order={0}
|
||||
id="tab-1"
|
||||
label="Image Tab"
|
||||
gradio={undefined}
|
||||
@ -23,6 +24,7 @@
|
||||
/>
|
||||
</TabItem>
|
||||
<TabItem
|
||||
order={1}
|
||||
id="tab-2"
|
||||
label="Hidden Tab"
|
||||
gradio={undefined}
|
||||
@ -33,6 +35,7 @@
|
||||
Secret Tab
|
||||
</TabItem>
|
||||
<TabItem
|
||||
order={2}
|
||||
id="tab-3"
|
||||
label="Visible Tab"
|
||||
gradio={undefined}
|
||||
|
@ -22,9 +22,9 @@
|
||||
export let selected: number | string;
|
||||
export let initial_tabs: Tab[];
|
||||
|
||||
let tabs: Tab[] = [...initial_tabs];
|
||||
let visible_tabs: Tab[] = [...initial_tabs];
|
||||
let overflow_tabs: Tab[] = [];
|
||||
let tabs: (Tab | null)[] = [...initial_tabs];
|
||||
let visible_tabs: (Tab | null)[] = [...initial_tabs];
|
||||
let overflow_tabs: (Tab | null)[] = [];
|
||||
let overflow_menu_open = false;
|
||||
let overflow_menu: HTMLElement;
|
||||
|
||||
@ -36,7 +36,7 @@
|
||||
selected || tabs[0]?.id || false
|
||||
);
|
||||
const selected_tab_index = writable<number>(
|
||||
tabs.findIndex((t) => t.id === selected) || 0
|
||||
tabs.findIndex((t) => t?.id === selected) || 0
|
||||
);
|
||||
const dispatch = createEventDispatcher<{
|
||||
change: undefined;
|
||||
@ -55,35 +55,28 @@
|
||||
});
|
||||
|
||||
setContext(TABS, {
|
||||
register_tab: (tab: Tab) => {
|
||||
let index = tabs.findIndex((t) => t.id === tab.id);
|
||||
if (index !== -1) {
|
||||
tabs[index] = { ...tabs[index], ...tab };
|
||||
} else {
|
||||
tabs = [...tabs, tab];
|
||||
index = tabs.length - 1;
|
||||
}
|
||||
register_tab: (tab: Tab, order: number) => {
|
||||
tabs[order] = tab;
|
||||
|
||||
if ($selected_tab === false && tab.visible && tab.interactive) {
|
||||
$selected_tab = tab.id;
|
||||
}
|
||||
return index;
|
||||
return order;
|
||||
},
|
||||
unregister_tab: (tab: Tab) => {
|
||||
const index = tabs.findIndex((t) => t.id === tab.id);
|
||||
if (index !== -1) {
|
||||
tabs = tabs.filter((t) => t.id !== tab.id);
|
||||
if ($selected_tab === tab.id) {
|
||||
$selected_tab = tabs[0]?.id || false;
|
||||
}
|
||||
unregister_tab: (tab: Tab, order: number) => {
|
||||
if ($selected_tab === tab.id) {
|
||||
$selected_tab = tabs[0]?.id || false;
|
||||
}
|
||||
tabs[order] = null;
|
||||
},
|
||||
selected_tab,
|
||||
selected_tab_index
|
||||
});
|
||||
|
||||
function change_tab(id: string | number): void {
|
||||
const tab_to_activate = tabs.find((t) => t.id === id);
|
||||
function change_tab(id: string | number | undefined): void {
|
||||
const tab_to_activate = tabs.find((t) => t?.id === id);
|
||||
if (
|
||||
id !== undefined &&
|
||||
tab_to_activate &&
|
||||
tab_to_activate.interactive &&
|
||||
tab_to_activate.visible &&
|
||||
@ -91,7 +84,7 @@
|
||||
) {
|
||||
selected = id;
|
||||
$selected_tab = id;
|
||||
$selected_tab_index = tabs.findIndex((t) => t.id === id);
|
||||
$selected_tab_index = tabs.findIndex((t) => t?.id === id);
|
||||
dispatch("change");
|
||||
overflow_menu_open = false;
|
||||
}
|
||||
@ -123,6 +116,7 @@
|
||||
|
||||
for (let i = tabs.length - 1; i >= 0; i--) {
|
||||
const tab = tabs[i];
|
||||
if (!tab) continue;
|
||||
const tab_rect = tab_sizes[tab.id];
|
||||
if (!tab_rect) continue;
|
||||
if (tab_rect.right - offset < max_width) {
|
||||
@ -145,15 +139,16 @@
|
||||
selected_tab: number | string | false
|
||||
): boolean {
|
||||
if (selected_tab === false) return false;
|
||||
return overflow_tabs.some((t) => t.id === selected_tab);
|
||||
return overflow_tabs.some((t) => t?.id === selected_tab);
|
||||
}
|
||||
|
||||
function get_tab_sizes(
|
||||
tabs: Tab[],
|
||||
tabs: (Tab | null)[],
|
||||
tab_els: Record<string | number, HTMLElement>
|
||||
): Record<string | number, DOMRect> {
|
||||
const tab_sizes: Record<string | number, DOMRect> = {};
|
||||
tabs.forEach((tab) => {
|
||||
if (!tab) return;
|
||||
tab_sizes[tab.id] = tab_els[tab.id]?.getBoundingClientRect();
|
||||
});
|
||||
return tab_sizes;
|
||||
@ -169,17 +164,17 @@
|
||||
{#if has_tabs}
|
||||
<div class="tab-wrapper">
|
||||
<div class="tab-container visually-hidden" aria-hidden="true">
|
||||
{#each tabs as t, i (t.id)}
|
||||
{#if t.visible}
|
||||
{#each tabs as t, i}
|
||||
{#if t?.visible}
|
||||
<button bind:this={tab_els[t.id]}>
|
||||
{t.label}
|
||||
{t?.label}
|
||||
</button>
|
||||
{/if}
|
||||
{/each}
|
||||
</div>
|
||||
<div class="tab-container" bind:this={tab_nav_el} role="tablist">
|
||||
{#each visible_tabs as t, i (t.id)}
|
||||
{#if t.visible}
|
||||
{#each visible_tabs as t, i}
|
||||
{#if t?.visible}
|
||||
<button
|
||||
role="tab"
|
||||
class:selected={t.id === $selected_tab}
|
||||
@ -216,10 +211,10 @@
|
||||
<div class="overflow-dropdown" class:hide={!overflow_menu_open}>
|
||||
{#each overflow_tabs as t}
|
||||
<button
|
||||
on:click={() => change_tab(t.id)}
|
||||
class:selected={t.id === $selected_tab}
|
||||
on:click={() => change_tab(t?.id)}
|
||||
class:selected={t?.id === $selected_tab}
|
||||
>
|
||||
{t.label}
|
||||
{t?.label}
|
||||
</button>
|
||||
{/each}
|
||||
</div>
|
||||
|
@ -97,6 +97,9 @@
|
||||
function open_full_screen(): void {
|
||||
video.requestFullscreen();
|
||||
}
|
||||
|
||||
$: time = time || 0;
|
||||
$: duration = duration || 0;
|
||||
</script>
|
||||
|
||||
<div class="wrap">
|
||||
|
Loading…
Reference in New Issue
Block a user