I have a notebook which I’m trying to embed in a webpage. When I try and embed a radio button I get an error
viewof p = RuntimeError: radio could not be resolved
I’ve embedded some other cells with no issue. - actually not true, seems only the logo is resolving.
I see in this example a viewof radio button cell can be embedded and when I try and embed from the notebook in the example above, I can. I’ve even copied the radio button cell I want from that example into my notebook but I still get the above error. Here’s a link to my notebook (the cell I want to embed is the first one - viewof p).
https://observablehq.com/d/xxxx
The code I’m using to embed (again, this works for the example notebook from above).
<script type="module">
import {
Runtime,
Inspector
} from "https://unpkg.com/@observablehq/notebook-runtime?module";
// Your notebook, compiled as an ES module.
import notebook from "https://api.observablehq.com/d/xxxjs";
const renders = {
"viewof p": "#viewof-p"
};
for (let i in renders)
renders[i] = document.querySelector(renders[i]);
Runtime.load(notebook, (variable) => {
if (renders[variable.name]){
return new Inspector(renders[variable.name]);}
});
I wonder is there something about my notebook (which has lots of data sources) that is leading to this error?
1 Like
The underlying issue here is that the “input” cell appears twice in https://api.observablehq.com/d/09fe7ea0f0ac07fd.js
There are a few solutions described in this recent thread. The most future-proof one is to switch to using the v3 module format like this:
<script type="module">
import {
Runtime,
Inspector
} from "https://cdn.jsdelivr.net/npm/@observablehq/runtime@4/dist/runtime.js";
// Your notebook, compiled as an ES module.
import define from "https://api.observablehq.com/d/09fe7ea0f0ac07fd.js?v=3";
const renders = {
"viewof p": "#viewof-p"
};
for (let i in renders)
renders[i] = document.querySelector(renders[i]);
const runtime = new Runtime();
const main = runtime.module(define, name => {
if (renders[name]) {
return new Inspector(renders[name]);
}
});
</script>
2 Likes
Great. that’s very helpful. Just a follow up. Is it possible to import the default observable styles when embedding? Most of the examples I see don’t do that (i.e., https://jsfiddle.net/5w906pL1/20/)
I ended up just copying the observable css from the dev tools.
I’m no lawyer, but I wouldn’t recommend copying large amounts of CSS (or other content or code) from other websites to your own site (unless you’re licensed to) as in my understanding that is a violation of copyright.
You could instead use the stylesheet provided with the Observable Inspector by putting this in the <head>
of your html:
<link href="https://cdn.jsdelivr.net/npm/@observablehq/inspector@3/dist/inspector.css" rel="stylesheet"/>
This is only a subset of the styles used on observablehq.com, but it should be enough to get you started.
1 Like
Yeah, I opted not to when I saw the Copyright in the header. Nice to have this as an option. Ta.
1 Like
Most of Observable’s styles come from libraries: About 80% are from Tachyons, some are from CodeMirror, ReactCrop and others, and only a small percentage are actual custom classes and rules.
2 Likes