Public
Edited
Jan 18
Importers
1 star
Insert cell
Insert cell
Insert cell
Insert cell
button = (props = {}) => {
const { label, value, setValue, ...otherProps } = props;
return jsx`<button ...${otherProps} onClick=${event => {
if (props.onClick) {
props.onClick(event, setValue);
}
}}>
${label}
</button>`;
}
Insert cell
renderedButton = (props = {}) =>
renderWithState((state, setState) => button(props))
Insert cell
renderedButton({
label: 'Test',
onClick: event => {
console.log('button', 'Test test');
}
})
Insert cell
Insert cell
input = (props = {}) => {
const { value = '', setValue, ...otherProps } = props;
return jsx`<input ...${otherProps} value=${value} onChange=${event => {
if (setValue) setValue(event.target.value);
if (props.onChange) {
props.onChange(event);
}
}} />`;
}
Insert cell
renderedInput = (props = {}) =>
renderWithState(
(state, setState) =>
input({
...props,
value: state,
onChange: (event) => {
setState(event.target.value);
}
}),
props.value || ""
)
Insert cell
viewof testInput = renderedInput({
type: "number",
value: "1",
onChange: (event) => {
console.log("input", event.target.value);
}
})
Insert cell
testInput
Insert cell
Insert cell
text = (props = {}) => {
const { value = '', setValue, ...otherProps } = props;
return jsx`<input ...${otherProps} type="text" value=${value} onChange=${event => {
if (setValue) setValue(event.target.value);
if (props.onChange) {
props.onChange(event);
}
}} />`;
}
Insert cell
renderedText = (props = {}) =>
renderWithState(
(state, setState) =>
text({
...props,
value: state,
onChange: (event) => {
setState(event.target.value);
}
}),
props.value || ''
)
Insert cell
viewof testText = renderedText({
onChange: event => {
console.log('text', event.target.value);
}
})
Insert cell
testText
Insert cell
Insert cell
checkbox = (props = {}) => {
const { value = false, setValue, ...otherProps } = props;
return jsx`<input ...${otherProps} type="checkbox" checked=${value} onChange=${event => {
if (setValue) setValue(event.target.checked);
if (props.onChange) {
props.onChange(event);
}
}} />`;
}
Insert cell
renderedCheckbox = (props = {}) =>
renderWithState(
(state, setState) =>
checkbox({
...props,
value: state,
onChange: (event) => {
setState(!state);
}
}),
props.value || false
)
Insert cell
viewof testCheckbox = renderedCheckbox({
onChange: event => {
console.log('checkbox', event.target.checked);
}
})
Insert cell
testCheckbox
Insert cell
Insert cell
select = (props = {}) => {
const { options = [], value, setValue, ...otherProps } = props;
const defaultValue = value || options[0];
return jsx`<select ...${otherProps} value=${defaultValue} onChange=${event => {
if (setValue) setValue(event.target.value);
if (props.onChange) {
props.onChange(event);
}
}}>
${options.map((option, index) => {
return jsx`<option key=${index} value=${option}>${option}</option>`;
})}
</select>`;
}
Insert cell
renderedSelect = (props = {}) =>
renderWithState(
(state, setState) =>
select({
...props,
value: state,
onChange: (event) => {
setState(event.target.value);
}
}),
props.options[0]
)
Insert cell
viewof testSelect = renderedSelect({
options: ['one', 'two', 'three'],
onChange: event => {
console.log('select', event.target.value);
}
})
Insert cell
testSelect
Insert cell
Insert cell
textarea = (props = {}) => {
const { value = '', setValue, ...otherProps } = props;
const defaultProps = { style: { width: '100%' }, rows: 10 };
return jsx`<textarea ...${{
...defaultProps,
...otherProps
}} value=${value} onChange=${event => {
if (setValue) setValue(event.target.value);
if (props.onChange) {
props.onChange(event);
}
}} />`;
}
Insert cell
renderedTextarea = (props = {}) =>
renderWithState(
(state, setState) =>
textarea({
...props,
value: state,
onChange: (event) => {
setState(event.target.value);
}
}),
props.value || ""
)
Insert cell
viewof testTextarea = renderedTextarea({
value: "Placeholder",
onChange: (event) => {
console.log("textarea", event.target.value);
}
})
Insert cell
testTextarea
Insert cell
Insert cell
date = (props = {}) => {
const { value = toDateString(), setValue, ...otherProps } = props;
return jsx`<input ...${otherProps} type="date" value=${value} onChange=${event => {
if (setValue) setValue(event.target.value);
if (props.onChange) {
props.onChange(event);
}
}} />`;
}
Insert cell
renderedDate = (props = {}) =>
renderWithState(
(state, setState) =>
date({
...props,
value: state,
onChange: (event) => {
setState(event.target.value);
}
}),
props.value || toDateString()
)
Insert cell
viewof testDate = renderedDate()
Insert cell
testDate
Insert cell
Insert cell
helpers = [
'html',
'base',
'head',
'link',
'meta',
'style',
'title',
'body',
'address',
'article',
'aside',
'footer',
'header',
'h1',
'hgroup',
'main',
'nav',
'section',
'blockquote',
'dd',
'div',
'dl',
'dt',
'figcaption',
'figure',
'hr',
'li',
'ol',
'p',
'pre',
'ul',
'a',
'abbr',
'b',
'bdi',
'bdo',
'br',
'cite',
'code',
'data',
'dfn',
'em',
'i',
'kbd',
'mark',
'q',
'rb',
'rp',
'rt',
'rtc',
'ruby',
's',
'samp',
'small',
'span',
'strong',
'sub',
'sup',
'time',
'u',
'var',
'wbr',
'area',
'audio',
'img',
'map',
'track',
'video',
'embed',
'iframe',
'object',
'param',
'picture',
'source',
'svg',
'math',
'canvas',
'noscript',
'script',
'del',
'ins',
'caption',
'col',
'colgroup',
'table',
'tbody',
'td',
'tfoot',
'th',
'thead',
'tr',
'button',
'datalist',
'fieldset',
'form',
'input',
'label',
'legend',
'meter',
'optgroup',
'option',
'output',
'progress',
'select',
'textarea',
'details',
'dialog',
'menu',
'summary',
'slot',
'template'
].reduce(
(result, tag) => ({
...result,
[tag]: (props = {}, children = []) =>
jsx`<${tag} ...${props}>${children}</${tag}>`
}),
{}
)
Insert cell
Insert cell
// viewof test = render(({ useSetter }) => {
// const [state, setState] = useState({
// button: 0,
// select: 'one',
// textarea: ''
// });
// useSetter(state);
// // return jsx`<${button} label="Test" onClick=${event => {
// // console.log('button', 'Test test');
// // setState({ ...state, button: state.button + 1 });
// // }} /><${select} options=${['one', 'two', 'three']} setValue=${value => {
// // console.log('select', value);
// // setState({ ...state, select: value });
// // }} /><${textarea} setValue=${value => {
// // console.log('textarea', value);
// // setState({ ...state, textarea: value });
// // }} />`;
// return [
// button({
// label: 'Test',
// onClick: event => {
// console.log('button', 'Test test');
// setState({ ...state, button: state.button + 1 });
// }
// }),
// select({
// options: ['one', 'two', 'three'],
// value: state.select,
// setValue: value => {
// console.log('select', value);
// setState({ ...state, select: value });
// }
// }),
// textarea({
// value: state.textarea,
// setValue: value => {
// console.log('textarea', value);
// setState({ ...state, textarea: value });
// }
// })
// ];
// })
viewof test = renderWithState(
(state, setState) => [
button({
label: "Test",
onClick: (event) => {
setState({ ...state, button: state.button + 1 });
}
}),
select({
options: ["one", "two", "three"],
value: state.select,
setValue: (value) => {
setState({ ...state, select: value });
}
}),
textarea({
value: state.textarea,
setValue: (value) => {
setState({ ...state, textarea: value });
}
})
],
{ button: 0, select: "one", textarea: "" }
)
Insert cell
test
Insert cell
Insert cell
copyButton = ({ data, ...props }) =>
renderedButton({
label: "Copy",
onClick: () => {
copy(data);
},
...props
})
Insert cell
// customSelect = (options, displayProperty = "name") => {
// if (!options || options.length === 0) return null;
// return render(({ useSetter }) => {
// const [value, setValue] = useState(options[0]);
// useSetter(value);
// return select({
// options: options.map((value) => value[displayProperty]),
// value: value[displayProperty],
// setValue: (value) =>
// setValue(options.find((_value) => _value[displayProperty] === value))
// });
// });
// }
customSelect = (options = [], displayProperty = "name") =>
renderWithState((state, setState) => {
if (!options || options.length === 0) return null;
return select({
options: options.map((value) => value[displayProperty]),
value: state[displayProperty],
setValue: (value) =>
setState(options.find((_value) => _value[displayProperty] === value))
});
}, options[0])
Insert cell
Insert cell
renderWithState = (f, defaultValue = {}) =>
render(() => {
const [state, setState] = useObservableState(defaultValue);
const mergeAndSetState = (change) => setState({ ...state, ...change });
return f(state, setState);
})
Insert cell
toDateString = date =>
date
? date.toISOString().replace(/T.+/, '')
: new Date().toISOString().replace(/T.+/, '')
Insert cell
import {
render,
useObservableState,
React,
ReactDOM,
useEffect,
useState,
useContext,
useRef,
useMemo,
useCallback,
useImperativeHandle,
useReducer,
useId,
useTransition,
Fragment,
memo,
lazy,
forwardRef,
startTransition,
createContext,
Suspense,
createFactory,
createElement,
createRoot,
createPortal,
jsx
} from "@gnestor/react"
Insert cell
import { copy } from '@gnestor/grants-utilities'
Insert cell

Purpose-built for displays of data

Observable is your go-to platform for exploring data and creating expressive data visualizations. Use reactive JavaScript notebooks for prototyping and a collaborative canvas for visual data exploration and dashboard creation.
Learn more