diff --git a/lite-vimeo.js b/lite-vimeo.js
index c003b4942aa8b4db5a5efa32a801c50e07ea2f8e..bcb404b41ca30af17f512b658b4f760866d63bac 100644
--- a/lite-vimeo.js
+++ b/lite-vimeo.js
@@ -142,6 +142,7 @@ let LiteVimeoEmbed = /** @class */ (() => {
           border-radius: 10%;
           transition: all 0.2s cubic-bezier(0, 0, 0.2, 1);
           border: 0;
+          cursor: pointer;
         }
         #frame:hover .lvo-playbtn {
           background-color: rgb(98, 175, 237);diff --git a/LICENSE b/LICENSE
index 561dff2..486c72e 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,6 +1,6 @@
-
 Copyright 2020 Shane Holloway. (ES Module port)
 Copyright 2019 David Bau.
+Copyright (C) 2010 by Johannes Baagøe <baagoe@baagoe.org>
 
 Permission is hereby granted, free of charge, to any person obtaining
 a copy of this software and associated documentation files (the
@@ -20,4 +20,3 @@ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
 CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
 TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
 SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
diff --git a/package.json b/package.json
index 99e77b2..470dae8 100644
--- a/package.json
+++ b/package.json
@@ -11,7 +11,8 @@
     "type": "git",
     "url": "git://github.com/shanewholloway/js-esm-seedrandom.git"
   },
-  "author": [
+  "contributors": [
+    "Johannes Baagøe <baagoe@baagoe.org>",
     "David Bau",
     "Shane Holloway"
   ],
diff --git a/index.js b/index.js
index 7bb9ede9700c322d39a403d41cbc3c1057db1bf6..3942421195cc3fb26bb2692016eef922160f3b7c 100644
--- a/index.js
+++ b/index.js
@@ -45,7 +45,7 @@ function iface () {
     if (!opts) opts = {}
     var depper = gdeps(opts)
     var deps = depper.inline(src, opts.basedir || basedir)
-    return bundle(deps)
+    return { source: bundle(deps), deps }
   }
   function file(filename, opts) {
     if (!opts) opts = {}diff --git a/build/quantities.mjs b/build/quantities.mjs
index 958840ff536508004faa20ddae17e75884b39632..ac24d533965cc38fb2065835340ecb9cefb12c38 100644
--- a/build/quantities.mjs
+++ b/build/quantities.mjs
@@ -338,6 +338,7 @@ var UNITS = {
   /* molar_concentration */
   "<molar>" : [["M","molar"], 1000, "molar_concentration", ["<mole>"], ["<meter>","<meter>","<meter>"]],
   "<wtpercent>"  : [["wt%","wtpercent"], 10, "molar_concentration", ["<kilogram>"], ["<meter>","<meter>","<meter>"]],
+  "<dobson>"  : [["DU","Dobson unit"], 4.4615e-4, "concentration", ["<mole>"], ["<meter>","<meter>"]],
 
   /* activity */
   "<katal>" :  [["kat","katal","Katal"], 1.0, "activity", ["<mole>"], ["<second>"]],
diff --git a/index.js b/index.js
index 85474ec0aeaed7104ccd6b4784541ed7c85220dc..2c1e423d1b155e457d974935f5049fad65165f03 100644
--- a/index.js
+++ b/index.js
@@ -58,7 +58,12 @@ module.exports = function glslify(userOptions = {}) {
                 options
             );
 
-            code = compile(code, fileOptions);
+            const { source, deps } = compile(code, fileOptions);
+            code = source;
+
+            for (const dep of deps.filter(dep => !dep.entry)) {
+              this.addWatchFile(dep.file);
+            }
 
             if (typeof options.compress === 'function') {
                 code = options.compress(code);
diff --git a/LICENSE-MPL-2.0 b/LICENSE-MPL-2.0
deleted file mode 100644
index 14e2f777f6c395e7e04ab4aa306bbcc4b0c1120e..0000000000000000000000000000000000000000
diff --git a/src/RangeSlider.svelte b/src/RangeSlider.svelte
index 460bf5c0bb18d349217644b625e4816a0b1ea656..dafbbf129bd599e821f7c3e42e4342fbfc2804af 100644
--- a/src/RangeSlider.svelte
+++ b/src/RangeSlider.svelte
@@ -20,7 +20,16 @@
   export let reversed = false;
   export let hoverable = true;
   export let disabled = false;
+  export let value = values[0];
 
+  // keep value and values in sync with each other
+  const updateValues = () => { if (value !== values[0]) values = [value] };
+  const updateValue = () => {
+    if (alignValueToStep(value) !== values[0]) value = values[0];
+  };
+  $: value, updateValues();
+  $: values, updateValue();
+ 
   // range pips / values props
   export let pips = false;
   export let pipstep = undefined;
@@ -799,6 +808,7 @@
 </style>
 
 <div
+  role="presentation"
   {id}
   bind:this={slider}
   class="rangeSlider"
diff --git a/src/runtime/internal/dom.js b/src/runtime/internal/dom.js
index 37cbb314f25f637068b7fc1a9f10d2021eef54e8..2c2069f4ffa8105c69a9f44b1da7d1df08c9e4dd 100644
--- a/src/runtime/internal/dom.js
+++ b/src/runtime/internal/dom.js
@@ -940,51 +940,9 @@ export function is_crossorigin() {
  * @returns {() => void}
  */
 export function add_iframe_resize_listener(node, fn) {
-	const computed_style = getComputedStyle(node);
-	if (computed_style.position === 'static') {
-		node.style.position = 'relative';
-	}
-	const iframe = element('iframe');
-	iframe.setAttribute(
-		'style',
-		'display: block; position: absolute; top: 0; left: 0; width: 100%; height: 100%; ' +
-			'overflow: hidden; border: 0; opacity: 0; pointer-events: none; z-index: -1;'
-	);
-	iframe.setAttribute('aria-hidden', 'true');
-	iframe.tabIndex = -1;
-	const crossorigin = is_crossorigin();
-
-	/**
-	 * @type {() => void}
-	 */
-	let unsubscribe;
-	if (crossorigin) {
-		iframe.src = "data:text/html,<script>onresize=function(){parent.postMessage(0,'*')}</script>";
-		unsubscribe = listen(
-			window,
-			'message',
-			/** @param {MessageEvent} event */ (event) => {
-				if (event.source === iframe.contentWindow) fn();
-			}
-		);
-	} else {
-		iframe.src = 'about:blank';
-		iframe.onload = () => {
-			unsubscribe = listen(iframe.contentWindow, 'resize', fn);
-			// make sure an initial resize event is fired _after_ the iframe is loaded (which is asynchronous)
-			// see https://github.com/sveltejs/svelte/issues/4233
-			fn();
-		};
-	}
-	append(node, iframe);
-	return () => {
-		if (crossorigin) {
-			unsubscribe();
-		} else if (unsubscribe && iframe.contentWindow) {
-			unsubscribe();
-		}
-		detach(iframe);
-	};
+	const ro = new ResizeObserver(fn);
+	ro.observe(node);
+	return () => ro.disconnect();
 }
 export const resize_observer_content_box = /* @__PURE__ */ new ResizeObserverSingleton({
 	box: 'content-box'
diff --git a/dist/tippy.css b/dist/tippy.css
index e6ae635cb1f82b176c18afa80dfa029c7a536e70..341d2237d5aabe71305398646c113a42727ea1cb 100644
--- a/dist/tippy.css
+++ b/dist/tippy.css
@@ -1 +1 @@
-.tippy-box[data-animation=fade][data-state=hidden]{opacity:0}[data-tippy-root]{max-width:calc(100vw - 10px)}.tippy-box{position:relative;background-color:#333;color:#fff;border-radius:4px;font-size:14px;line-height:1.4;white-space:normal;outline:0;transition-property:transform,visibility,opacity}.tippy-box[data-placement^=top]>.tippy-arrow{bottom:0}.tippy-box[data-placement^=top]>.tippy-arrow:before{bottom:-7px;left:0;border-width:8px 8px 0;border-top-color:initial;transform-origin:center top}.tippy-box[data-placement^=bottom]>.tippy-arrow{top:0}.tippy-box[data-placement^=bottom]>.tippy-arrow:before{top:-7px;left:0;border-width:0 8px 8px;border-bottom-color:initial;transform-origin:center bottom}.tippy-box[data-placement^=left]>.tippy-arrow{right:0}.tippy-box[data-placement^=left]>.tippy-arrow:before{border-width:8px 0 8px 8px;border-left-color:initial;right:-7px;transform-origin:center left}.tippy-box[data-placement^=right]>.tippy-arrow{left:0}.tippy-box[data-placement^=right]>.tippy-arrow:before{left:-7px;border-width:8px 8px 8px 0;border-right-color:initial;transform-origin:center right}.tippy-box[data-inertia][data-state=visible]{transition-timing-function:cubic-bezier(.54,1.5,.38,1.11)}.tippy-arrow{width:16px;height:16px;color:#333}.tippy-arrow:before{content:"";position:absolute;border-color:transparent;border-style:solid}.tippy-content{position:relative;padding:5px 9px;z-index:1}
\ No newline at end of file
+.tippy-box[data-animation=fade][data-state=hidden]{opacity:0}[data-tippy-root]{max-width:calc(100vw - 10px)}.tippy-box{position:relative;background-color:#333;color:#fff;border-radius:4px;font-size:0.875rem;line-height:1.4;white-space:normal;outline:0;transition-property:transform,visibility,opacity}.tippy-box[data-placement^=top]>.tippy-arrow{bottom:0}.tippy-box[data-placement^=top]>.tippy-arrow:before{bottom:-7px;left:0;border-width:8px 8px 0;border-top-color:initial;transform-origin:center top}.tippy-box[data-placement^=bottom]>.tippy-arrow{top:0}.tippy-box[data-placement^=bottom]>.tippy-arrow:before{top:-7px;left:0;border-width:0 8px 8px;border-bottom-color:initial;transform-origin:center bottom}.tippy-box[data-placement^=left]>.tippy-arrow{right:0}.tippy-box[data-placement^=left]>.tippy-arrow:before{border-width:8px 0 8px 8px;border-left-color:initial;right:-7px;transform-origin:center left}.tippy-box[data-placement^=right]>.tippy-arrow{left:0}.tippy-box[data-placement^=right]>.tippy-arrow:before{left:-7px;border-width:8px 8px 8px 0;border-right-color:initial;transform-origin:center right}.tippy-box[data-inertia][data-state=visible]{transition-timing-function:cubic-bezier(.54,1.5,.38,1.11)}.tippy-arrow{width:16px;height:16px;color:#333}.tippy-arrow:before{content:"";position:absolute;border-color:transparent;border-style:solid}.tippy-content{position:relative;padding:5px 9px;z-index:1}