mirror of
https://github.com/gradio-app/gradio.git
synced 2025-04-12 12:40:29 +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 commit e2a26e6d28772587dadce2bb00c3581f97883664.
* 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 commit 9e2ae433307356fcc296a08071a43ad3c964dc00.
* Revert "changes"
This reverts commit 9f4c3eec0f4a906ef339f6556a4010f417615cc1.
* 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 commit a89fcb11344db2623a883fac78324dc0e2f3ef93.
* 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 commit 4605302df40bc2d1874e80ea79dc9830b0e867f6.
* 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 commit 855b012a2083cc672783d6be1bc098677ab3cbbc.
* 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 commit 4605302df40bc2d1874e80ea79dc9830b0e867f6.
* 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 commit 855b012a2083cc672783d6be1bc098677ab3cbbc.
* 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 commit 2e43584a87425da063f066582b25d8e406c5d73b.
---------
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 commit 278645b649fb590e6c9608c568ee0903c735a536.
* 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 in 98cbcaef82/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 commit 40c9e396a1a8bedf452ff2765e5b296be905ec68.
* Revert "test"
This reverts commit 660a6b06ea49408acbd59942faccf1d2d0bcd805.
* 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
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 Width: | Height: | 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…
x
Reference in New Issue
Block a user