This repository was archived by the owner on Aug 29, 2025. It is now read-only.

Component as props support. - #92

Closed
T4rk1n wants to merge 7 commits into
masterfrom
component-props
Closed

Component as props support.#92
T4rk1n wants to merge 7 commits into
masterfrom
component-props

Conversation

@T4rk1n

Copy link
Copy Markdown
Contributor

Add support for component as props.

With this you can set a prop type as PropTypes.node, and have the props be a dash component.

@T4rk1nT4rk1n changed the title [WIP] Component as props support.Component as props support.Oct 26, 2018
@T4rk1n

Copy link
Copy Markdown
ContributorAuthor

I included a component lib in a tar file with a test component that got components as props since we didn't have any for testing purpose.

Here's the component src:

importReact,{Component}from'react';importPropTypesfrom'prop-types';/** * ExampleComponent is an example component. * It takes a property, `label`, and * displays it. * It renders an input with the property `value` * which is editable by the user. */exportdefaultclassComponentPropsextendsComponent{render(){const{id, component_props, comp_array}=this.props;return(<divid={id}>{component_props}<div>{comp_array}</div></div>);}}ComponentProps.defaultProps={};ComponentProps.propTypes={/** * The ID used to identify this component in Dash callbacks */id: PropTypes.string,/** * Dash-assigned callback that should be called whenever any of the * properties change */setProps: PropTypes.func,component_props: PropTypes.node,comp_array: PropTypes.arrayOf(PropTypes.node),};

@T4rk1nT4rk1n mentioned this pull request Oct 30, 2018
2 tasks

@chriddypchriddyp left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

At first glance, it looks like this handles rendering a component that's in the layout but it doesn't handle:

  • Using that component's properties as Input or State
  • Updating that component's properties through Output

If we support rendering components as props, then they should be valid inputs and outputs like children.

Supporting this in a general sense will be quite a bit more work I believe. I'd prefer that we'd have a larger design discussion about how to do this before we dig in to the code. I've created an issue to discuss here: https://github.com/plotly/dash-renderer/issues/95

@byronz

byronz commented Apr 23, 2019

Copy link
Copy Markdown
Contributor

@alexcjohnson I think the changes in the treecontainer is not valid anymore and have never been addressed to Chris' review comments. a larger feature design discussion is in #95.

@byronzbyronz closed this Apr 23, 2019
@codytodonnell

Copy link
Copy Markdown

@chriddyp and @T4rk1n I'm curious if there has been any movement on this issue since your discussion here. This is probably the primary limitation I run into when developing react components for Dash. I think this would be a very powerful addition. Doing this would make it much easier to integrate third party react libraries that utilize component props and it would also make it much easier to develop react components for Dash in general. It's such a common and useful pattern in react, I think it would be a huge value add not just for react-Dash developers but pure Dash developers too.

@alexcjohnson

Copy link
Copy Markdown
Collaborator

This repo is obsolete, but the feature has just recently been revived by @T4rk1n in plotly/dash#1965 and we expect to include it in either the next dash release or the one after. Please take a look and let us know what you think!

@codytodonnell

Copy link
Copy Markdown

That's great news! Thanks for sharing the link

Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@T4rk1n@byronz@codytodonnell@alexcjohnson@chriddyp
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content
This repository was archived by the owner on Aug 29, 2025. It is now read-only.

Component as props support. - #92

Closed
T4rk1n wants to merge 7 commits into
masterfrom
component-props
Closed

Component as props support.#92
T4rk1n wants to merge 7 commits into
masterfrom
component-props

Conversation

@T4rk1n

Copy link
Copy Markdown
Contributor

Add support for component as props.

With this you can set a prop type as PropTypes.node, and have the props be a dash component.

@T4rk1nT4rk1n changed the title [WIP] Component as props support.Component as props support.Oct 26, 2018
@T4rk1n

Copy link
Copy Markdown
ContributorAuthor

I included a component lib in a tar file with a test component that got components as props since we didn't have any for testing purpose.

Here's the component src:

importReact,{Component}from'react';importPropTypesfrom'prop-types';/** * ExampleComponent is an example component. * It takes a property, `label`, and * displays it. * It renders an input with the property `value` * which is editable by the user. */exportdefaultclassComponentPropsextendsComponent{render(){const{id, component_props, comp_array}=this.props;return(<divid={id}>{component_props}<div>{comp_array}</div></div>);}}ComponentProps.defaultProps={};ComponentProps.propTypes={/** * The ID used to identify this component in Dash callbacks */id: PropTypes.string,/** * Dash-assigned callback that should be called whenever any of the * properties change */setProps: PropTypes.func,component_props: PropTypes.node,comp_array: PropTypes.arrayOf(PropTypes.node),};

@T4rk1nT4rk1n mentioned this pull request Oct 30, 2018
2 tasks

@chriddypchriddyp left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

At first glance, it looks like this handles rendering a component that's in the layout but it doesn't handle:

  • Using that component's properties as Input or State
  • Updating that component's properties through Output

If we support rendering components as props, then they should be valid inputs and outputs like children.

Supporting this in a general sense will be quite a bit more work I believe. I'd prefer that we'd have a larger design discussion about how to do this before we dig in to the code. I've created an issue to discuss here: https://github.com/plotly/dash-renderer/issues/95

@byronz

byronz commented Apr 23, 2019

Copy link
Copy Markdown
Contributor

@alexcjohnson I think the changes in the treecontainer is not valid anymore and have never been addressed to Chris' review comments. a larger feature design discussion is in #95.

@byronzbyronz closed this Apr 23, 2019
@codytodonnell

Copy link
Copy Markdown

@chriddyp and @T4rk1n I'm curious if there has been any movement on this issue since your discussion here. This is probably the primary limitation I run into when developing react components for Dash. I think this would be a very powerful addition. Doing this would make it much easier to integrate third party react libraries that utilize component props and it would also make it much easier to develop react components for Dash in general. It's such a common and useful pattern in react, I think it would be a huge value add not just for react-Dash developers but pure Dash developers too.

@alexcjohnson

Copy link
Copy Markdown
Collaborator

This repo is obsolete, but the feature has just recently been revived by @T4rk1n in plotly/dash#1965 and we expect to include it in either the next dash release or the one after. Please take a look and let us know what you think!

@codytodonnell

Copy link
Copy Markdown

That's great news! Thanks for sharing the link

Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@T4rk1n@byronz@codytodonnell@alexcjohnson@chriddyp
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Aug 29, 2025. It is now read-only.

Component as props support. - #92

Closed
T4rk1n wants to merge 7 commits into
masterfrom
component-props
Closed

Component as props support.#92
T4rk1n wants to merge 7 commits into
masterfrom
component-props

Conversation

@T4rk1n

Copy link
Copy Markdown
Contributor

Add support for component as props.

With this you can set a prop type as PropTypes.node, and have the props be a dash component.

@T4rk1nT4rk1n changed the title [WIP] Component as props support.Component as props support.Oct 26, 2018
@T4rk1n

Copy link
Copy Markdown
ContributorAuthor

I included a component lib in a tar file with a test component that got components as props since we didn't have any for testing purpose.

Here's the component src:

importReact,{Component}from'react';importPropTypesfrom'prop-types';/** * ExampleComponent is an example component. * It takes a property, `label`, and * displays it. * It renders an input with the property `value` * which is editable by the user. */exportdefaultclassComponentPropsextendsComponent{render(){const{id, component_props, comp_array}=this.props;return(<divid={id}>{component_props}<div>{comp_array}</div></div>);}}ComponentProps.defaultProps={};ComponentProps.propTypes={/** * The ID used to identify this component in Dash callbacks */id: PropTypes.string,/** * Dash-assigned callback that should be called whenever any of the * properties change */setProps: PropTypes.func,component_props: PropTypes.node,comp_array: PropTypes.arrayOf(PropTypes.node),};

@T4rk1nT4rk1n mentioned this pull request Oct 30, 2018
2 tasks

@chriddypchriddyp left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

At first glance, it looks like this handles rendering a component that's in the layout but it doesn't handle:

  • Using that component's properties as Input or State
  • Updating that component's properties through Output

If we support rendering components as props, then they should be valid inputs and outputs like children.

Supporting this in a general sense will be quite a bit more work I believe. I'd prefer that we'd have a larger design discussion about how to do this before we dig in to the code. I've created an issue to discuss here: https://github.com/plotly/dash-renderer/issues/95

@byronz

byronz commented Apr 23, 2019

Copy link
Copy Markdown
Contributor

@alexcjohnson I think the changes in the treecontainer is not valid anymore and have never been addressed to Chris' review comments. a larger feature design discussion is in #95.

@byronzbyronz closed this Apr 23, 2019
@codytodonnell

Copy link
Copy Markdown

@chriddyp and @T4rk1n I'm curious if there has been any movement on this issue since your discussion here. This is probably the primary limitation I run into when developing react components for Dash. I think this would be a very powerful addition. Doing this would make it much easier to integrate third party react libraries that utilize component props and it would also make it much easier to develop react components for Dash in general. It's such a common and useful pattern in react, I think it would be a huge value add not just for react-Dash developers but pure Dash developers too.

@alexcjohnson

Copy link
Copy Markdown
Collaborator

This repo is obsolete, but the feature has just recently been revived by @T4rk1n in plotly/dash#1965 and we expect to include it in either the next dash release or the one after. Please take a look and let us know what you think!

@codytodonnell

Copy link
Copy Markdown

That's great news! Thanks for sharing the link

Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@T4rk1n@byronz@codytodonnell@alexcjohnson@chriddyp
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Aug 29, 2025. It is now read-only.

Component as props support. - #92

Closed
T4rk1n wants to merge 7 commits into
masterfrom
component-props
Closed

Component as props support.#92
T4rk1n wants to merge 7 commits into
masterfrom
component-props

Conversation

@T4rk1n

Copy link
Copy Markdown
Contributor

Add support for component as props.

With this you can set a prop type as PropTypes.node, and have the props be a dash component.

@T4rk1nT4rk1n changed the title [WIP] Component as props support.Component as props support.Oct 26, 2018
@T4rk1n

Copy link
Copy Markdown
ContributorAuthor

I included a component lib in a tar file with a test component that got components as props since we didn't have any for testing purpose.

Here's the component src:

importReact,{Component}from'react';importPropTypesfrom'prop-types';/** * ExampleComponent is an example component. * It takes a property, `label`, and * displays it. * It renders an input with the property `value` * which is editable by the user. */exportdefaultclassComponentPropsextendsComponent{render(){const{id, component_props, comp_array}=this.props;return(<divid={id}>{component_props}<div>{comp_array}</div></div>);}}ComponentProps.defaultProps={};ComponentProps.propTypes={/** * The ID used to identify this component in Dash callbacks */id: PropTypes.string,/** * Dash-assigned callback that should be called whenever any of the * properties change */setProps: PropTypes.func,component_props: PropTypes.node,comp_array: PropTypes.arrayOf(PropTypes.node),};

@T4rk1nT4rk1n mentioned this pull request Oct 30, 2018
2 tasks

@chriddypchriddyp left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

At first glance, it looks like this handles rendering a component that's in the layout but it doesn't handle:

  • Using that component's properties as Input or State
  • Updating that component's properties through Output

If we support rendering components as props, then they should be valid inputs and outputs like children.

Supporting this in a general sense will be quite a bit more work I believe. I'd prefer that we'd have a larger design discussion about how to do this before we dig in to the code. I've created an issue to discuss here: https://github.com/plotly/dash-renderer/issues/95

@byronz

byronz commented Apr 23, 2019

Copy link
Copy Markdown
Contributor

@alexcjohnson I think the changes in the treecontainer is not valid anymore and have never been addressed to Chris' review comments. a larger feature design discussion is in #95.

@byronzbyronz closed this Apr 23, 2019
@codytodonnell

Copy link
Copy Markdown

@chriddyp and @T4rk1n I'm curious if there has been any movement on this issue since your discussion here. This is probably the primary limitation I run into when developing react components for Dash. I think this would be a very powerful addition. Doing this would make it much easier to integrate third party react libraries that utilize component props and it would also make it much easier to develop react components for Dash in general. It's such a common and useful pattern in react, I think it would be a huge value add not just for react-Dash developers but pure Dash developers too.

@alexcjohnson

Copy link
Copy Markdown
Collaborator

This repo is obsolete, but the feature has just recently been revived by @T4rk1n in plotly/dash#1965 and we expect to include it in either the next dash release or the one after. Please take a look and let us know what you think!

@codytodonnell

Copy link
Copy Markdown

That's great news! Thanks for sharing the link

Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@T4rk1n@byronz@codytodonnell@alexcjohnson@chriddyp
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content
This repository was archived by the owner on Aug 29, 2025. It is now read-only.

Component as props support. - #92

Closed
T4rk1n wants to merge 7 commits into
masterfrom
component-props
Closed

Component as props support.#92
T4rk1n wants to merge 7 commits into
masterfrom
component-props

Conversation

@T4rk1n

Copy link
Copy Markdown
Contributor

Add support for component as props.

With this you can set a prop type as PropTypes.node, and have the props be a dash component.

@T4rk1nT4rk1n changed the title [WIP] Component as props support.Component as props support.Oct 26, 2018
@T4rk1n

Copy link
Copy Markdown
ContributorAuthor

I included a component lib in a tar file with a test component that got components as props since we didn't have any for testing purpose.

Here's the component src:

importReact,{Component}from'react';importPropTypesfrom'prop-types';/** * ExampleComponent is an example component. * It takes a property, `label`, and * displays it. * It renders an input with the property `value` * which is editable by the user. */exportdefaultclassComponentPropsextendsComponent{render(){const{id, component_props, comp_array}=this.props;return(<divid={id}>{component_props}<div>{comp_array}</div></div>);}}ComponentProps.defaultProps={};ComponentProps.propTypes={/** * The ID used to identify this component in Dash callbacks */id: PropTypes.string,/** * Dash-assigned callback that should be called whenever any of the * properties change */setProps: PropTypes.func,component_props: PropTypes.node,comp_array: PropTypes.arrayOf(PropTypes.node),};

@T4rk1nT4rk1n mentioned this pull request Oct 30, 2018
2 tasks

@chriddypchriddyp left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

At first glance, it looks like this handles rendering a component that's in the layout but it doesn't handle:

  • Using that component's properties as Input or State
  • Updating that component's properties through Output

If we support rendering components as props, then they should be valid inputs and outputs like children.

Supporting this in a general sense will be quite a bit more work I believe. I'd prefer that we'd have a larger design discussion about how to do this before we dig in to the code. I've created an issue to discuss here: https://github.com/plotly/dash-renderer/issues/95

@byronz

byronz commented Apr 23, 2019

Copy link
Copy Markdown
Contributor

@alexcjohnson I think the changes in the treecontainer is not valid anymore and have never been addressed to Chris' review comments. a larger feature design discussion is in #95.

@byronzbyronz closed this Apr 23, 2019
@codytodonnell

Copy link
Copy Markdown

@chriddyp and @T4rk1n I'm curious if there has been any movement on this issue since your discussion here. This is probably the primary limitation I run into when developing react components for Dash. I think this would be a very powerful addition. Doing this would make it much easier to integrate third party react libraries that utilize component props and it would also make it much easier to develop react components for Dash in general. It's such a common and useful pattern in react, I think it would be a huge value add not just for react-Dash developers but pure Dash developers too.

@alexcjohnson

Copy link
Copy Markdown
Collaborator

This repo is obsolete, but the feature has just recently been revived by @T4rk1n in plotly/dash#1965 and we expect to include it in either the next dash release or the one after. Please take a look and let us know what you think!

@codytodonnell

Copy link
Copy Markdown

That's great news! Thanks for sharing the link

Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@T4rk1n@byronz@codytodonnell@alexcjohnson@chriddyp
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Aug 29, 2025. It is now read-only.

Component as props support. - #92

Closed
T4rk1n wants to merge 7 commits into
masterfrom
component-props
Closed

Component as props support.#92
T4rk1n wants to merge 7 commits into
masterfrom
component-props

Conversation

@T4rk1n

Copy link
Copy Markdown
Contributor

Add support for component as props.

With this you can set a prop type as PropTypes.node, and have the props be a dash component.

@T4rk1nT4rk1n changed the title [WIP] Component as props support.Component as props support.Oct 26, 2018
@T4rk1n

Copy link
Copy Markdown
ContributorAuthor

I included a component lib in a tar file with a test component that got components as props since we didn't have any for testing purpose.

Here's the component src:

importReact,{Component}from'react';importPropTypesfrom'prop-types';/** * ExampleComponent is an example component. * It takes a property, `label`, and * displays it. * It renders an input with the property `value` * which is editable by the user. */exportdefaultclassComponentPropsextendsComponent{render(){const{id, component_props, comp_array}=this.props;return(<divid={id}>{component_props}<div>{comp_array}</div></div>);}}ComponentProps.defaultProps={};ComponentProps.propTypes={/** * The ID used to identify this component in Dash callbacks */id: PropTypes.string,/** * Dash-assigned callback that should be called whenever any of the * properties change */setProps: PropTypes.func,component_props: PropTypes.node,comp_array: PropTypes.arrayOf(PropTypes.node),};

@T4rk1nT4rk1n mentioned this pull request Oct 30, 2018
2 tasks

@chriddypchriddyp left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

At first glance, it looks like this handles rendering a component that's in the layout but it doesn't handle:

  • Using that component's properties as Input or State
  • Updating that component's properties through Output

If we support rendering components as props, then they should be valid inputs and outputs like children.

Supporting this in a general sense will be quite a bit more work I believe. I'd prefer that we'd have a larger design discussion about how to do this before we dig in to the code. I've created an issue to discuss here: https://github.com/plotly/dash-renderer/issues/95

@byronz

byronz commented Apr 23, 2019

Copy link
Copy Markdown
Contributor

@alexcjohnson I think the changes in the treecontainer is not valid anymore and have never been addressed to Chris' review comments. a larger feature design discussion is in #95.

@byronzbyronz closed this Apr 23, 2019
@codytodonnell

Copy link
Copy Markdown

@chriddyp and @T4rk1n I'm curious if there has been any movement on this issue since your discussion here. This is probably the primary limitation I run into when developing react components for Dash. I think this would be a very powerful addition. Doing this would make it much easier to integrate third party react libraries that utilize component props and it would also make it much easier to develop react components for Dash in general. It's such a common and useful pattern in react, I think it would be a huge value add not just for react-Dash developers but pure Dash developers too.

@alexcjohnson

Copy link
Copy Markdown
Collaborator

This repo is obsolete, but the feature has just recently been revived by @T4rk1n in plotly/dash#1965 and we expect to include it in either the next dash release or the one after. Please take a look and let us know what you think!

@codytodonnell

Copy link
Copy Markdown

That's great news! Thanks for sharing the link

Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@T4rk1n@byronz@codytodonnell@alexcjohnson@chriddyp
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Aug 29, 2025. It is now read-only.

Component as props support. - #92

Closed
T4rk1n wants to merge 7 commits into
masterfrom
component-props
Closed

Component as props support.#92
T4rk1n wants to merge 7 commits into
masterfrom
component-props

Conversation

@T4rk1n

Copy link
Copy Markdown
Contributor

Add support for component as props.

With this you can set a prop type as PropTypes.node, and have the props be a dash component.

@T4rk1nT4rk1n changed the title [WIP] Component as props support.Component as props support.Oct 26, 2018
@T4rk1n

Copy link
Copy Markdown
ContributorAuthor

I included a component lib in a tar file with a test component that got components as props since we didn't have any for testing purpose.

Here's the component src:

importReact,{Component}from'react';importPropTypesfrom'prop-types';/** * ExampleComponent is an example component. * It takes a property, `label`, and * displays it. * It renders an input with the property `value` * which is editable by the user. */exportdefaultclassComponentPropsextendsComponent{render(){const{id, component_props, comp_array}=this.props;return(<divid={id}>{component_props}<div>{comp_array}</div></div>);}}ComponentProps.defaultProps={};ComponentProps.propTypes={/** * The ID used to identify this component in Dash callbacks */id: PropTypes.string,/** * Dash-assigned callback that should be called whenever any of the * properties change */setProps: PropTypes.func,component_props: PropTypes.node,comp_array: PropTypes.arrayOf(PropTypes.node),};

@T4rk1nT4rk1n mentioned this pull request Oct 30, 2018
2 tasks

@chriddypchriddyp left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

At first glance, it looks like this handles rendering a component that's in the layout but it doesn't handle:

  • Using that component's properties as Input or State
  • Updating that component's properties through Output

If we support rendering components as props, then they should be valid inputs and outputs like children.

Supporting this in a general sense will be quite a bit more work I believe. I'd prefer that we'd have a larger design discussion about how to do this before we dig in to the code. I've created an issue to discuss here: https://github.com/plotly/dash-renderer/issues/95

@byronz

byronz commented Apr 23, 2019

Copy link
Copy Markdown
Contributor

@alexcjohnson I think the changes in the treecontainer is not valid anymore and have never been addressed to Chris' review comments. a larger feature design discussion is in #95.

@byronzbyronz closed this Apr 23, 2019
@codytodonnell

Copy link
Copy Markdown

@chriddyp and @T4rk1n I'm curious if there has been any movement on this issue since your discussion here. This is probably the primary limitation I run into when developing react components for Dash. I think this would be a very powerful addition. Doing this would make it much easier to integrate third party react libraries that utilize component props and it would also make it much easier to develop react components for Dash in general. It's such a common and useful pattern in react, I think it would be a huge value add not just for react-Dash developers but pure Dash developers too.

@alexcjohnson

Copy link
Copy Markdown
Collaborator

This repo is obsolete, but the feature has just recently been revived by @T4rk1n in plotly/dash#1965 and we expect to include it in either the next dash release or the one after. Please take a look and let us know what you think!

@codytodonnell

Copy link
Copy Markdown

That's great news! Thanks for sharing the link

Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@T4rk1n@byronz@codytodonnell@alexcjohnson@chriddyp
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content
This repository was archived by the owner on Aug 29, 2025. It is now read-only.

Component as props support. - #92

Closed
T4rk1n wants to merge 7 commits into
masterfrom
component-props
Closed

Component as props support.#92
T4rk1n wants to merge 7 commits into
masterfrom
component-props

Conversation

@T4rk1n

Copy link
Copy Markdown
Contributor

Add support for component as props.

With this you can set a prop type as PropTypes.node, and have the props be a dash component.

@T4rk1nT4rk1n changed the title [WIP] Component as props support.Component as props support.Oct 26, 2018
@T4rk1n

Copy link
Copy Markdown
ContributorAuthor

I included a component lib in a tar file with a test component that got components as props since we didn't have any for testing purpose.

Here's the component src:

importReact,{Component}from'react';importPropTypesfrom'prop-types';/** * ExampleComponent is an example component. * It takes a property, `label`, and * displays it. * It renders an input with the property `value` * which is editable by the user. */exportdefaultclassComponentPropsextendsComponent{render(){const{id, component_props, comp_array}=this.props;return(<divid={id}>{component_props}<div>{comp_array}</div></div>);}}ComponentProps.defaultProps={};ComponentProps.propTypes={/** * The ID used to identify this component in Dash callbacks */id: PropTypes.string,/** * Dash-assigned callback that should be called whenever any of the * properties change */setProps: PropTypes.func,component_props: PropTypes.node,comp_array: PropTypes.arrayOf(PropTypes.node),};

@T4rk1nT4rk1n mentioned this pull request Oct 30, 2018
2 tasks

@chriddypchriddyp left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

At first glance, it looks like this handles rendering a component that's in the layout but it doesn't handle:

  • Using that component's properties as Input or State
  • Updating that component's properties through Output

If we support rendering components as props, then they should be valid inputs and outputs like children.

Supporting this in a general sense will be quite a bit more work I believe. I'd prefer that we'd have a larger design discussion about how to do this before we dig in to the code. I've created an issue to discuss here: https://github.com/plotly/dash-renderer/issues/95

@byronz

byronz commented Apr 23, 2019

Copy link
Copy Markdown
Contributor

@alexcjohnson I think the changes in the treecontainer is not valid anymore and have never been addressed to Chris' review comments. a larger feature design discussion is in #95.

@byronzbyronz closed this Apr 23, 2019
@codytodonnell

Copy link
Copy Markdown

@chriddyp and @T4rk1n I'm curious if there has been any movement on this issue since your discussion here. This is probably the primary limitation I run into when developing react components for Dash. I think this would be a very powerful addition. Doing this would make it much easier to integrate third party react libraries that utilize component props and it would also make it much easier to develop react components for Dash in general. It's such a common and useful pattern in react, I think it would be a huge value add not just for react-Dash developers but pure Dash developers too.

@alexcjohnson

Copy link
Copy Markdown
Collaborator

This repo is obsolete, but the feature has just recently been revived by @T4rk1n in plotly/dash#1965 and we expect to include it in either the next dash release or the one after. Please take a look and let us know what you think!

@codytodonnell

Copy link
Copy Markdown

That's great news! Thanks for sharing the link

Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@T4rk1n@byronz@codytodonnell@alexcjohnson@chriddyp