- Spec files
pypi-streamlit
Describes: pkg:pypi/streamlit@1.50.x
- Description
- A faster way to build and share data apps
- Author
- tessl
- Last updated
components-config.md docs/
1# Components and Configuration23Custom component framework and column configuration for data editors and dataframes. These features enable extending Streamlit with custom functionality and fine-grained control over data presentation.45## Capabilities67### Custom Components89Framework for creating and integrating custom HTML/JavaScript components into Streamlit applications.1011```python { .api }12# Available in st.components.v1 namespace13def html(html, *, width=None, height=None, scrolling=False):14"""15Display HTML content in an iframe with optional sizing and scrolling.1617Args:18html (str): HTML content to display19width (int, optional): Component width in pixels20height (int, optional): Component height in pixels21scrolling (bool): Whether to allow scrolling within the iframe2223Returns:24Any: Data returned from the HTML component (if any)25"""2627def iframe(src, *, width=None, height=None, scrolling=False):28"""29Display external web page or content in an iframe.3031Args:32src (str): URL of the content to display33width (int, optional): Iframe width in pixels34height (int, optional): Iframe height in pixels35scrolling (bool): Whether to allow scrolling within the iframe3637Returns:38Any: Data returned from the iframe (if any)39"""4041def declare_component(name, path=None, url=None):42"""43Declare a custom Streamlit component for use in the application.4445Args:46name (str): Component name for identification47path (str, optional): Local path to component files48url (str, optional): URL where component is hosted4950Returns:51callable: Component function that can be called to render the component52"""53```5455Example usage:56```python57import streamlit.components.v1 as components5859# Simple HTML component60html_content = """61<div style="background: linear-gradient(90deg, #ff6b6b, #4ecdc4);62color: white; padding: 20px; border-radius: 10px; text-align: center;">63<h2>Custom HTML Component</h2>64<p>This is rendered from HTML!</p>65<button onclick="window.parent.postMessage({type: 'click', data: 'Button clicked!'})">66Click Me67</button>68</div>69"""7071# Display HTML with return value72result = components.html(html_content, height=150)73if result:74st.write(f"Component returned: {result}")7576# Iframe component77components.iframe("https://example.com", height=400)7879# Custom component declaration80# Component files in ./my_component/81my_component = components.declare_component("my_component", path="./my_component")8283# Use custom component84component_value = my_component(85name="example",86value=42,87options=["A", "B", "C"]88)89```9091### Column Configuration9293Comprehensive configuration system for customizing dataframe and data editor column behavior and appearance.9495```python { .api }96# Available in st.column_config namespace9798class Column:99"""100Base column configuration with common properties.101102Args:103label (str, optional): Column display name104width (str or int, optional): Column width ("small", "medium", "large", or pixels)105help (str, optional): Tooltip text for column header106disabled (bool, optional): Whether column is read-only107required (bool, optional): Whether column value is required108"""109110class TextColumn(Column):111"""112Text column configuration for string data.113114Args:115label (str, optional): Column display name116width (str or int, optional): Column width117help (str, optional): Tooltip text118disabled (bool, optional): Whether column is read-only119required (bool, optional): Whether column value is required120default (str, optional): Default value for new rows121max_chars (int, optional): Maximum number of characters allowed122validate (callable, optional): Validation function for input123"""124125class NumberColumn(Column):126"""127Number column configuration for numeric data.128129Args:130label (str, optional): Column display name131width (str or int, optional): Column width132help (str, optional): Tooltip text133disabled (bool, optional): Whether column is read-only134required (bool, optional): Whether column value is required135default (float, optional): Default value for new rows136min_value (float, optional): Minimum allowed value137max_value (float, optional): Maximum allowed value138step (float, optional): Step size for increment/decrement139format (str, optional): Number format string (e.g., "%.2f", "%d")140"""141142class CheckboxColumn(Column):143"""144Checkbox column configuration for boolean data.145146Args:147label (str, optional): Column display name148width (str or int, optional): Column width149help (str, optional): Tooltip text150disabled (bool, optional): Whether column is read-only151required (bool, optional): Whether column value is required152default (bool, optional): Default value for new rows153"""154155class SelectboxColumn(Column):156"""157Selectbox column configuration for categorical data.158159Args:160label (str, optional): Column display name161width (str or int, optional): Column width162help (str, optional): Tooltip text163disabled (bool, optional): Whether column is read-only164required (bool, optional): Whether column value is required165default (Any, optional): Default selected value166options (list): Available options to choose from167"""168169class DatetimeColumn(Column):170"""171Datetime column configuration for timestamp data.172173Args:174label (str, optional): Column display name175width (str or int, optional): Column width176help (str, optional): Tooltip text177disabled (bool, optional): Whether column is read-only178required (bool, optional): Whether column value is required179default (datetime, optional): Default datetime value180min_value (datetime, optional): Minimum allowed datetime181max_value (datetime, optional): Maximum allowed datetime182format (str, optional): Datetime display format183step (int, optional): Step size in seconds184"""185186class DateColumn(Column):187"""188Date column configuration for date-only data.189190Args:191label (str, optional): Column display name192width (str or int, optional): Column width193help (str, optional): Tooltip text194disabled (bool, optional): Whether column is read-only195required (bool, optional): Whether column value is required196default (date, optional): Default date value197min_value (date, optional): Minimum allowed date198max_value (date, optional): Maximum allowed date199format (str, optional): Date display format200"""201202class TimeColumn(Column):203"""204Time column configuration for time-only data.205206Args:207label (str, optional): Column display name208width (str or int, optional): Column width209help (str, optional): Tooltip text210disabled (bool, optional): Whether column is read-only211required (bool, optional): Whether column value is required212default (time, optional): Default time value213min_value (time, optional): Minimum allowed time214max_value (time, optional): Maximum allowed time215format (str, optional): Time display format216step (int, optional): Step size in seconds217"""218219class ListColumn(Column):220"""221List column configuration for array/list data.222223Args:224label (str, optional): Column display name225width (str or int, optional): Column width226help (str, optional): Tooltip text227"""228229class LinkColumn(Column):230"""231Link column configuration for URL data with clickable links.232233Args:234label (str, optional): Column display name235width (str or int, optional): Column width236help (str, optional): Tooltip text237disabled (bool, optional): Whether column is read-only238required (bool, optional): Whether column value is required239default (str, optional): Default URL value240max_chars (int, optional): Maximum URL length241validate (callable, optional): URL validation function242display_text (str or callable, optional): Text to display instead of URL243"""244245class ImageColumn(Column):246"""247Image column configuration for displaying images from URLs.248249Args:250label (str, optional): Column display name251width (str or int, optional): Column width252help (str, optional): Tooltip text253"""254255class LineChartColumn(Column):256"""257Line chart column configuration for displaying small charts in cells.258259Args:260label (str, optional): Column display name261width (str or int, optional): Column width262help (str, optional): Tooltip text263y_min (float, optional): Minimum Y-axis value264y_max (float, optional): Maximum Y-axis value265"""266267class BarChartColumn(Column):268"""269Bar chart column configuration for displaying small bar charts in cells.270271Args:272label (str, optional): Column display name273width (str or int, optional): Column width274help (str, optional): Tooltip text275y_min (float, optional): Minimum Y-axis value276y_max (float, optional): Maximum Y-axis value277"""278279class ProgressColumn(Column):280"""281Progress bar column configuration for displaying progress indicators.282283Args:284label (str, optional): Column display name285width (str or int, optional): Column width286help (str, optional): Tooltip text287min_value (float, optional): Minimum progress value (default 0)288max_value (float, optional): Maximum progress value (default 100)289format (str, optional): Progress display format290"""291```292293Example usage:294```python295import pandas as pd296import streamlit as st297298# Sample dataframe299data = pd.DataFrame({300"name": ["Alice", "Bob", "Charlie"],301"age": [25, 30, 35],302"active": [True, False, True],303"category": ["A", "B", "A"],304"score": [85.5, 92.1, 78.3],305"signup_date": ["2023-01-15", "2023-02-20", "2023-03-10"],306"website": ["https://alice.com", "https://bob.org", "https://charlie.net"],307"progress": [75, 90, 60],308"trend": [[1,3,2,4], [2,1,4,3], [3,4,2,1]]309})310311# Configure columns312column_config = {313"name": st.column_config.TextColumn(314"Full Name",315help="Employee full name",316max_chars=50,317required=True318),319"age": st.column_config.NumberColumn(320"Age",321help="Employee age in years",322min_value=18,323max_value=65,324step=1,325format="%d years"326),327"active": st.column_config.CheckboxColumn(328"Active Status",329help="Whether employee is currently active",330default=True331),332"category": st.column_config.SelectboxColumn(333"Department",334help="Employee department",335options=["A", "B", "C"],336required=True337),338"score": st.column_config.NumberColumn(339"Performance Score",340help="Performance rating out of 100",341min_value=0,342max_value=100,343format="%.1f"344),345"signup_date": st.column_config.DateColumn(346"Start Date",347help="Employee start date",348format="YYYY-MM-DD"349),350"website": st.column_config.LinkColumn(351"Personal Website",352help="Employee personal website",353display_text="Visit"354),355"progress": st.column_config.ProgressColumn(356"Project Progress",357help="Current project completion percentage",358min_value=0,359max_value=100,360format="%d%%"361),362"trend": st.column_config.LineChartColumn(363"Performance Trend",364help="Performance over last 4 quarters"365)366}367368# Display configured dataframe369st.data_editor(370data,371column_config=column_config,372use_container_width=True,373num_rows="dynamic" # Allow adding/removing rows374)375```376377### Advanced Configuration Patterns378379#### Conditional Column Configuration380381```python382def get_column_config(user_role, data_types):383"""Generate column config based on user role and data."""384config = {}385386for col_name, col_type in data_types.items():387base_config = {"help": f"{col_name} column"}388389# Role-based permissions390if user_role != "admin":391base_config["disabled"] = col_name in ["salary", "ssn"]392393# Type-specific configuration394if col_type == "currency":395config[col_name] = st.column_config.NumberColumn(396col_name.title(),397format="$%.2f",398min_value=0,399**base_config400)401elif col_type == "percentage":402config[col_name] = st.column_config.ProgressColumn(403col_name.title(),404min_value=0,405max_value=100,406format="%d%%",407**base_config408)409elif col_type == "category":410config[col_name] = st.column_config.SelectboxColumn(411col_name.title(),412options=get_category_options(col_name),413**base_config414)415416return config417418# Usage419user_role = get_current_user_role()420data_types = analyze_dataframe_types(df)421column_config = get_column_config(user_role, data_types)422423st.data_editor(df, column_config=column_config)424```425426#### Dynamic Image Display427428```python429# Image column with dynamic URLs430image_data = pd.DataFrame({431"product_name": ["Widget A", "Widget B", "Widget C"],432"image_url": [433"https://example.com/images/widget-a.jpg",434"https://example.com/images/widget-b.jpg",435"https://example.com/images/widget-c.jpg"436],437"price": [19.99, 24.99, 29.99]438})439440column_config = {441"product_name": st.column_config.TextColumn("Product", width="medium"),442"image_url": st.column_config.ImageColumn("Product Image", width="large"),443"price": st.column_config.NumberColumn("Price", format="$%.2f")444}445446st.dataframe(image_data, column_config=column_config)447```448449#### Interactive Chart Columns450451```python452# Line chart column with time series data453chart_data = pd.DataFrame({454"stock": ["AAPL", "GOOGL", "MSFT"],455"current_price": [150.25, 2800.50, 300.75],456"price_history": [457[145, 148, 152, 150], # AAPL last 4 days458[2750, 2780, 2820, 2800], # GOOGL459[295, 298, 305, 301] # MSFT460],461"volatility": [0.15, 0.12, 0.18]462})463464column_config = {465"stock": st.column_config.TextColumn("Symbol", width="small"),466"current_price": st.column_config.NumberColumn(467"Price",468format="$%.2f"469),470"price_history": st.column_config.LineChartColumn(471"4-Day Trend",472width="medium"473),474"volatility": st.column_config.ProgressColumn(475"Volatility",476min_value=0,477max_value=1,478format="%.1%%"479)480}481482st.dataframe(chart_data, column_config=column_config)483```484485### Custom Component Development486487#### Basic HTML Component488489```python490# my_component.py491import streamlit.components.v1 as components492493def color_picker_component(default_color="#000000", key=None):494"""Custom color picker component."""495html_template = f"""496<div>497<label for="color-picker">Choose a color:</label>498<input type="color" id="color-picker" value="{default_color}"499onchange="sendColor(this.value)">500<div id="preview" style="width:50px;height:50px;background:{default_color};margin-top:10px;"></div>501</div>502503<script>504function sendColor(color) {{505document.getElementById('preview').style.background = color;506window.parent.postMessage({{507type: 'streamlit:setComponentValue',508value: color509}});510}}511</script>512"""513514return components.html(html_template, height=100, key=key)515516# Usage517selected_color = color_picker_component(default_color="#ff6b6b", key="color")518if selected_color:519st.write(f"Selected color: {selected_color}")520```521522#### React-based Component523524```python525# Declare React component (assumes component built separately)526react_component = components.declare_component(527"my_react_component",528url="http://localhost:3001" # Development server529)530531def data_table_component(data, editable=True, key=None):532"""Custom data table with advanced features."""533return react_component(534data=data.to_dict('records'),535columns=list(data.columns),536editable=editable,537key=key538)539540# Usage541df = pd.DataFrame({"A": [1, 2, 3], "B": [4, 5, 6]})542edited_data = data_table_component(df, editable=True, key="table")543544if edited_data:545st.write("Edited data:", edited_data)546```547548#### Component with Bidirectional Communication549550```python551def interactive_chart_component(data, chart_type="bar", key=None):552"""Interactive chart that returns clicked data point."""553554# Convert data to JSON for JavaScript555chart_data = data.to_dict('records')556557html_template = f"""558<div id="chart-container" style="width: 100%; height: 400px;"></div>559560<script src="https://cdn.plot.ly/plotly-latest.min.js"></script>561<script>562const data = {chart_data};563const chartType = "{chart_type}";564565// Create Plotly chart566const plotData = [{{567x: data.map(d => d.x),568y: data.map(d => d.y),569type: chartType,570marker: {{ color: 'rgb(55, 128, 191)' }}571}}];572573const layout = {{574title: 'Interactive Chart',575xaxis: {{ title: 'X Axis' }},576yaxis: {{ title: 'Y Axis' }}577}};578579Plotly.newPlot('chart-container', plotData, layout);580581// Handle click events582document.getElementById('chart-container').on('plotly_click', function(eventData) {{583const point = eventData.points[0];584const clickedData = {{585x: point.x,586y: point.y,587pointIndex: point.pointIndex588}};589590// Send data back to Streamlit591window.parent.postMessage({{592type: 'streamlit:setComponentValue',593value: clickedData594}});595}});596</script>597"""598599return components.html(html_template, height=450, key=key)600601# Usage602chart_data = pd.DataFrame({603'x': ['A', 'B', 'C', 'D'],604'y': [10, 15, 13, 17]605})606607clicked_point = interactive_chart_component(chart_data, chart_type="bar", key="chart")608609if clicked_point:610st.write(f"Clicked point: {clicked_point}")611st.json(clicked_point)612```