confsmith 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../node_modules/canvas-confetti/dist/confetti.module.mjs", "../../../node_modules/stimulus-confetti/node_modules/@hotwired/stimulus/dist/stimulus.js", "../../../node_modules/stimulus-confetti/src/index.js", "../../javascript/confsmith.js"],
4
+ "sourcesContent": ["// canvas-confetti v1.9.3 built on 2024-04-30T22:19:17.794Z\nvar module = {};\n\n// source content\n/* globals Map */\n\n(function main(global, module, isWorker, workerSize) {\n var canUseWorker = !!(\n global.Worker &&\n global.Blob &&\n global.Promise &&\n global.OffscreenCanvas &&\n global.OffscreenCanvasRenderingContext2D &&\n global.HTMLCanvasElement &&\n global.HTMLCanvasElement.prototype.transferControlToOffscreen &&\n global.URL &&\n global.URL.createObjectURL);\n\n var canUsePaths = typeof Path2D === 'function' && typeof DOMMatrix === 'function';\n var canDrawBitmap = (function () {\n // this mostly supports ssr\n if (!global.OffscreenCanvas) {\n return false;\n }\n\n var canvas = new OffscreenCanvas(1, 1);\n var ctx = canvas.getContext('2d');\n ctx.fillRect(0, 0, 1, 1);\n var bitmap = canvas.transferToImageBitmap();\n\n try {\n ctx.createPattern(bitmap, 'no-repeat');\n } catch (e) {\n return false;\n }\n\n return true;\n })();\n\n function noop() {}\n\n // create a promise if it exists, otherwise, just\n // call the function directly\n function promise(func) {\n var ModulePromise = module.exports.Promise;\n var Prom = ModulePromise !== void 0 ? ModulePromise : global.Promise;\n\n if (typeof Prom === 'function') {\n return new Prom(func);\n }\n\n func(noop, noop);\n\n return null;\n }\n\n var bitmapMapper = (function (skipTransform, map) {\n // see https://github.com/catdad/canvas-confetti/issues/209\n // creating canvases is actually pretty expensive, so we should create a\n // 1:1 map for bitmap:canvas, so that we can animate the confetti in\n // a performant manner, but also not store them forever so that we don't\n // have a memory leak\n return {\n transform: function(bitmap) {\n if (skipTransform) {\n return bitmap;\n }\n\n if (map.has(bitmap)) {\n return map.get(bitmap);\n }\n\n var canvas = new OffscreenCanvas(bitmap.width, bitmap.height);\n var ctx = canvas.getContext('2d');\n ctx.drawImage(bitmap, 0, 0);\n\n map.set(bitmap, canvas);\n\n return canvas;\n },\n clear: function () {\n map.clear();\n }\n };\n })(canDrawBitmap, new Map());\n\n var raf = (function () {\n var TIME = Math.floor(1000 / 60);\n var frame, cancel;\n var frames = {};\n var lastFrameTime = 0;\n\n if (typeof requestAnimationFrame === 'function' && typeof cancelAnimationFrame === 'function') {\n frame = function (cb) {\n var id = Math.random();\n\n frames[id] = requestAnimationFrame(function onFrame(time) {\n if (lastFrameTime === time || lastFrameTime + TIME - 1 < time) {\n lastFrameTime = time;\n delete frames[id];\n\n cb();\n } else {\n frames[id] = requestAnimationFrame(onFrame);\n }\n });\n\n return id;\n };\n cancel = function (id) {\n if (frames[id]) {\n cancelAnimationFrame(frames[id]);\n }\n };\n } else {\n frame = function (cb) {\n return setTimeout(cb, TIME);\n };\n cancel = function (timer) {\n return clearTimeout(timer);\n };\n }\n\n return { frame: frame, cancel: cancel };\n }());\n\n var getWorker = (function () {\n var worker;\n var prom;\n var resolves = {};\n\n function decorate(worker) {\n function execute(options, callback) {\n worker.postMessage({ options: options || {}, callback: callback });\n }\n worker.init = function initWorker(canvas) {\n var offscreen = canvas.transferControlToOffscreen();\n worker.postMessage({ canvas: offscreen }, [offscreen]);\n };\n\n worker.fire = function fireWorker(options, size, done) {\n if (prom) {\n execute(options, null);\n return prom;\n }\n\n var id = Math.random().toString(36).slice(2);\n\n prom = promise(function (resolve) {\n function workerDone(msg) {\n if (msg.data.callback !== id) {\n return;\n }\n\n delete resolves[id];\n worker.removeEventListener('message', workerDone);\n\n prom = null;\n\n bitmapMapper.clear();\n\n done();\n resolve();\n }\n\n worker.addEventListener('message', workerDone);\n execute(options, id);\n\n resolves[id] = workerDone.bind(null, { data: { callback: id }});\n });\n\n return prom;\n };\n\n worker.reset = function resetWorker() {\n worker.postMessage({ reset: true });\n\n for (var id in resolves) {\n resolves[id]();\n delete resolves[id];\n }\n };\n }\n\n return function () {\n if (worker) {\n return worker;\n }\n\n if (!isWorker && canUseWorker) {\n var code = [\n 'var CONFETTI, SIZE = {}, module = {};',\n '(' + main.toString() + ')(this, module, true, SIZE);',\n 'onmessage = function(msg) {',\n ' if (msg.data.options) {',\n ' CONFETTI(msg.data.options).then(function () {',\n ' if (msg.data.callback) {',\n ' postMessage({ callback: msg.data.callback });',\n ' }',\n ' });',\n ' } else if (msg.data.reset) {',\n ' CONFETTI && CONFETTI.reset();',\n ' } else if (msg.data.resize) {',\n ' SIZE.width = msg.data.resize.width;',\n ' SIZE.height = msg.data.resize.height;',\n ' } else if (msg.data.canvas) {',\n ' SIZE.width = msg.data.canvas.width;',\n ' SIZE.height = msg.data.canvas.height;',\n ' CONFETTI = module.exports.create(msg.data.canvas);',\n ' }',\n '}',\n ].join('\\n');\n try {\n worker = new Worker(URL.createObjectURL(new Blob([code])));\n } catch (e) {\n // eslint-disable-next-line no-console\n typeof console !== undefined && typeof console.warn === 'function' ? console.warn('\uD83C\uDF8A Could not load worker', e) : null;\n\n return null;\n }\n\n decorate(worker);\n }\n\n return worker;\n };\n })();\n\n var defaults = {\n particleCount: 50,\n angle: 90,\n spread: 45,\n startVelocity: 45,\n decay: 0.9,\n gravity: 1,\n drift: 0,\n ticks: 200,\n x: 0.5,\n y: 0.5,\n shapes: ['square', 'circle'],\n zIndex: 100,\n colors: [\n '#26ccff',\n '#a25afd',\n '#ff5e7e',\n '#88ff5a',\n '#fcff42',\n '#ffa62d',\n '#ff36ff'\n ],\n // probably should be true, but back-compat\n disableForReducedMotion: false,\n scalar: 1\n };\n\n function convert(val, transform) {\n return transform ? transform(val) : val;\n }\n\n function isOk(val) {\n return !(val === null || val === undefined);\n }\n\n function prop(options, name, transform) {\n return convert(\n options && isOk(options[name]) ? options[name] : defaults[name],\n transform\n );\n }\n\n function onlyPositiveInt(number){\n return number < 0 ? 0 : Math.floor(number);\n }\n\n function randomInt(min, max) {\n // [min, max)\n return Math.floor(Math.random() * (max - min)) + min;\n }\n\n function toDecimal(str) {\n return parseInt(str, 16);\n }\n\n function colorsToRgb(colors) {\n return colors.map(hexToRgb);\n }\n\n function hexToRgb(str) {\n var val = String(str).replace(/[^0-9a-f]/gi, '');\n\n if (val.length < 6) {\n val = val[0]+val[0]+val[1]+val[1]+val[2]+val[2];\n }\n\n return {\n r: toDecimal(val.substring(0,2)),\n g: toDecimal(val.substring(2,4)),\n b: toDecimal(val.substring(4,6))\n };\n }\n\n function getOrigin(options) {\n var origin = prop(options, 'origin', Object);\n origin.x = prop(origin, 'x', Number);\n origin.y = prop(origin, 'y', Number);\n\n return origin;\n }\n\n function setCanvasWindowSize(canvas) {\n canvas.width = document.documentElement.clientWidth;\n canvas.height = document.documentElement.clientHeight;\n }\n\n function setCanvasRectSize(canvas) {\n var rect = canvas.getBoundingClientRect();\n canvas.width = rect.width;\n canvas.height = rect.height;\n }\n\n function getCanvas(zIndex) {\n var canvas = document.createElement('canvas');\n\n canvas.style.position = 'fixed';\n canvas.style.top = '0px';\n canvas.style.left = '0px';\n canvas.style.pointerEvents = 'none';\n canvas.style.zIndex = zIndex;\n\n return canvas;\n }\n\n function ellipse(context, x, y, radiusX, radiusY, rotation, startAngle, endAngle, antiClockwise) {\n context.save();\n context.translate(x, y);\n context.rotate(rotation);\n context.scale(radiusX, radiusY);\n context.arc(0, 0, 1, startAngle, endAngle, antiClockwise);\n context.restore();\n }\n\n function randomPhysics(opts) {\n var radAngle = opts.angle * (Math.PI / 180);\n var radSpread = opts.spread * (Math.PI / 180);\n\n return {\n x: opts.x,\n y: opts.y,\n wobble: Math.random() * 10,\n wobbleSpeed: Math.min(0.11, Math.random() * 0.1 + 0.05),\n velocity: (opts.startVelocity * 0.5) + (Math.random() * opts.startVelocity),\n angle2D: -radAngle + ((0.5 * radSpread) - (Math.random() * radSpread)),\n tiltAngle: (Math.random() * (0.75 - 0.25) + 0.25) * Math.PI,\n color: opts.color,\n shape: opts.shape,\n tick: 0,\n totalTicks: opts.ticks,\n decay: opts.decay,\n drift: opts.drift,\n random: Math.random() + 2,\n tiltSin: 0,\n tiltCos: 0,\n wobbleX: 0,\n wobbleY: 0,\n gravity: opts.gravity * 3,\n ovalScalar: 0.6,\n scalar: opts.scalar,\n flat: opts.flat\n };\n }\n\n function updateFetti(context, fetti) {\n fetti.x += Math.cos(fetti.angle2D) * fetti.velocity + fetti.drift;\n fetti.y += Math.sin(fetti.angle2D) * fetti.velocity + fetti.gravity;\n fetti.velocity *= fetti.decay;\n\n if (fetti.flat) {\n fetti.wobble = 0;\n fetti.wobbleX = fetti.x + (10 * fetti.scalar);\n fetti.wobbleY = fetti.y + (10 * fetti.scalar);\n\n fetti.tiltSin = 0;\n fetti.tiltCos = 0;\n fetti.random = 1;\n } else {\n fetti.wobble += fetti.wobbleSpeed;\n fetti.wobbleX = fetti.x + ((10 * fetti.scalar) * Math.cos(fetti.wobble));\n fetti.wobbleY = fetti.y + ((10 * fetti.scalar) * Math.sin(fetti.wobble));\n\n fetti.tiltAngle += 0.1;\n fetti.tiltSin = Math.sin(fetti.tiltAngle);\n fetti.tiltCos = Math.cos(fetti.tiltAngle);\n fetti.random = Math.random() + 2;\n }\n\n var progress = (fetti.tick++) / fetti.totalTicks;\n\n var x1 = fetti.x + (fetti.random * fetti.tiltCos);\n var y1 = fetti.y + (fetti.random * fetti.tiltSin);\n var x2 = fetti.wobbleX + (fetti.random * fetti.tiltCos);\n var y2 = fetti.wobbleY + (fetti.random * fetti.tiltSin);\n\n context.fillStyle = 'rgba(' + fetti.color.r + ', ' + fetti.color.g + ', ' + fetti.color.b + ', ' + (1 - progress) + ')';\n\n context.beginPath();\n\n if (canUsePaths && fetti.shape.type === 'path' && typeof fetti.shape.path === 'string' && Array.isArray(fetti.shape.matrix)) {\n context.fill(transformPath2D(\n fetti.shape.path,\n fetti.shape.matrix,\n fetti.x,\n fetti.y,\n Math.abs(x2 - x1) * 0.1,\n Math.abs(y2 - y1) * 0.1,\n Math.PI / 10 * fetti.wobble\n ));\n } else if (fetti.shape.type === 'bitmap') {\n var rotation = Math.PI / 10 * fetti.wobble;\n var scaleX = Math.abs(x2 - x1) * 0.1;\n var scaleY = Math.abs(y2 - y1) * 0.1;\n var width = fetti.shape.bitmap.width * fetti.scalar;\n var height = fetti.shape.bitmap.height * fetti.scalar;\n\n var matrix = new DOMMatrix([\n Math.cos(rotation) * scaleX,\n Math.sin(rotation) * scaleX,\n -Math.sin(rotation) * scaleY,\n Math.cos(rotation) * scaleY,\n fetti.x,\n fetti.y\n ]);\n\n // apply the transform matrix from the confetti shape\n matrix.multiplySelf(new DOMMatrix(fetti.shape.matrix));\n\n var pattern = context.createPattern(bitmapMapper.transform(fetti.shape.bitmap), 'no-repeat');\n pattern.setTransform(matrix);\n\n context.globalAlpha = (1 - progress);\n context.fillStyle = pattern;\n context.fillRect(\n fetti.x - (width / 2),\n fetti.y - (height / 2),\n width,\n height\n );\n context.globalAlpha = 1;\n } else if (fetti.shape === 'circle') {\n context.ellipse ?\n context.ellipse(fetti.x, fetti.y, Math.abs(x2 - x1) * fetti.ovalScalar, Math.abs(y2 - y1) * fetti.ovalScalar, Math.PI / 10 * fetti.wobble, 0, 2 * Math.PI) :\n ellipse(context, fetti.x, fetti.y, Math.abs(x2 - x1) * fetti.ovalScalar, Math.abs(y2 - y1) * fetti.ovalScalar, Math.PI / 10 * fetti.wobble, 0, 2 * Math.PI);\n } else if (fetti.shape === 'star') {\n var rot = Math.PI / 2 * 3;\n var innerRadius = 4 * fetti.scalar;\n var outerRadius = 8 * fetti.scalar;\n var x = fetti.x;\n var y = fetti.y;\n var spikes = 5;\n var step = Math.PI / spikes;\n\n while (spikes--) {\n x = fetti.x + Math.cos(rot) * outerRadius;\n y = fetti.y + Math.sin(rot) * outerRadius;\n context.lineTo(x, y);\n rot += step;\n\n x = fetti.x + Math.cos(rot) * innerRadius;\n y = fetti.y + Math.sin(rot) * innerRadius;\n context.lineTo(x, y);\n rot += step;\n }\n } else {\n context.moveTo(Math.floor(fetti.x), Math.floor(fetti.y));\n context.lineTo(Math.floor(fetti.wobbleX), Math.floor(y1));\n context.lineTo(Math.floor(x2), Math.floor(y2));\n context.lineTo(Math.floor(x1), Math.floor(fetti.wobbleY));\n }\n\n context.closePath();\n context.fill();\n\n return fetti.tick < fetti.totalTicks;\n }\n\n function animate(canvas, fettis, resizer, size, done) {\n var animatingFettis = fettis.slice();\n var context = canvas.getContext('2d');\n var animationFrame;\n var destroy;\n\n var prom = promise(function (resolve) {\n function onDone() {\n animationFrame = destroy = null;\n\n context.clearRect(0, 0, size.width, size.height);\n bitmapMapper.clear();\n\n done();\n resolve();\n }\n\n function update() {\n if (isWorker && !(size.width === workerSize.width && size.height === workerSize.height)) {\n size.width = canvas.width = workerSize.width;\n size.height = canvas.height = workerSize.height;\n }\n\n if (!size.width && !size.height) {\n resizer(canvas);\n size.width = canvas.width;\n size.height = canvas.height;\n }\n\n context.clearRect(0, 0, size.width, size.height);\n\n animatingFettis = animatingFettis.filter(function (fetti) {\n return updateFetti(context, fetti);\n });\n\n if (animatingFettis.length) {\n animationFrame = raf.frame(update);\n } else {\n onDone();\n }\n }\n\n animationFrame = raf.frame(update);\n destroy = onDone;\n });\n\n return {\n addFettis: function (fettis) {\n animatingFettis = animatingFettis.concat(fettis);\n\n return prom;\n },\n canvas: canvas,\n promise: prom,\n reset: function () {\n if (animationFrame) {\n raf.cancel(animationFrame);\n }\n\n if (destroy) {\n destroy();\n }\n }\n };\n }\n\n function confettiCannon(canvas, globalOpts) {\n var isLibCanvas = !canvas;\n var allowResize = !!prop(globalOpts || {}, 'resize');\n var hasResizeEventRegistered = false;\n var globalDisableForReducedMotion = prop(globalOpts, 'disableForReducedMotion', Boolean);\n var shouldUseWorker = canUseWorker && !!prop(globalOpts || {}, 'useWorker');\n var worker = shouldUseWorker ? getWorker() : null;\n var resizer = isLibCanvas ? setCanvasWindowSize : setCanvasRectSize;\n var initialized = (canvas && worker) ? !!canvas.__confetti_initialized : false;\n var preferLessMotion = typeof matchMedia === 'function' && matchMedia('(prefers-reduced-motion)').matches;\n var animationObj;\n\n function fireLocal(options, size, done) {\n var particleCount = prop(options, 'particleCount', onlyPositiveInt);\n var angle = prop(options, 'angle', Number);\n var spread = prop(options, 'spread', Number);\n var startVelocity = prop(options, 'startVelocity', Number);\n var decay = prop(options, 'decay', Number);\n var gravity = prop(options, 'gravity', Number);\n var drift = prop(options, 'drift', Number);\n var colors = prop(options, 'colors', colorsToRgb);\n var ticks = prop(options, 'ticks', Number);\n var shapes = prop(options, 'shapes');\n var scalar = prop(options, 'scalar');\n var flat = !!prop(options, 'flat');\n var origin = getOrigin(options);\n\n var temp = particleCount;\n var fettis = [];\n\n var startX = canvas.width * origin.x;\n var startY = canvas.height * origin.y;\n\n while (temp--) {\n fettis.push(\n randomPhysics({\n x: startX,\n y: startY,\n angle: angle,\n spread: spread,\n startVelocity: startVelocity,\n color: colors[temp % colors.length],\n shape: shapes[randomInt(0, shapes.length)],\n ticks: ticks,\n decay: decay,\n gravity: gravity,\n drift: drift,\n scalar: scalar,\n flat: flat\n })\n );\n }\n\n // if we have a previous canvas already animating,\n // add to it\n if (animationObj) {\n return animationObj.addFettis(fettis);\n }\n\n animationObj = animate(canvas, fettis, resizer, size , done);\n\n return animationObj.promise;\n }\n\n function fire(options) {\n var disableForReducedMotion = globalDisableForReducedMotion || prop(options, 'disableForReducedMotion', Boolean);\n var zIndex = prop(options, 'zIndex', Number);\n\n if (disableForReducedMotion && preferLessMotion) {\n return promise(function (resolve) {\n resolve();\n });\n }\n\n if (isLibCanvas && animationObj) {\n // use existing canvas from in-progress animation\n canvas = animationObj.canvas;\n } else if (isLibCanvas && !canvas) {\n // create and initialize a new canvas\n canvas = getCanvas(zIndex);\n document.body.appendChild(canvas);\n }\n\n if (allowResize && !initialized) {\n // initialize the size of a user-supplied canvas\n resizer(canvas);\n }\n\n var size = {\n width: canvas.width,\n height: canvas.height\n };\n\n if (worker && !initialized) {\n worker.init(canvas);\n }\n\n initialized = true;\n\n if (worker) {\n canvas.__confetti_initialized = true;\n }\n\n function onResize() {\n if (worker) {\n // TODO this really shouldn't be immediate, because it is expensive\n var obj = {\n getBoundingClientRect: function () {\n if (!isLibCanvas) {\n return canvas.getBoundingClientRect();\n }\n }\n };\n\n resizer(obj);\n\n worker.postMessage({\n resize: {\n width: obj.width,\n height: obj.height\n }\n });\n return;\n }\n\n // don't actually query the size here, since this\n // can execute frequently and rapidly\n size.width = size.height = null;\n }\n\n function done() {\n animationObj = null;\n\n if (allowResize) {\n hasResizeEventRegistered = false;\n global.removeEventListener('resize', onResize);\n }\n\n if (isLibCanvas && canvas) {\n if (document.body.contains(canvas)) {\n document.body.removeChild(canvas); \n }\n canvas = null;\n initialized = false;\n }\n }\n\n if (allowResize && !hasResizeEventRegistered) {\n hasResizeEventRegistered = true;\n global.addEventListener('resize', onResize, false);\n }\n\n if (worker) {\n return worker.fire(options, size, done);\n }\n\n return fireLocal(options, size, done);\n }\n\n fire.reset = function () {\n if (worker) {\n worker.reset();\n }\n\n if (animationObj) {\n animationObj.reset();\n }\n };\n\n return fire;\n }\n\n // Make default export lazy to defer worker creation until called.\n var defaultFire;\n function getDefaultFire() {\n if (!defaultFire) {\n defaultFire = confettiCannon(null, { useWorker: true, resize: true });\n }\n return defaultFire;\n }\n\n function transformPath2D(pathString, pathMatrix, x, y, scaleX, scaleY, rotation) {\n var path2d = new Path2D(pathString);\n\n var t1 = new Path2D();\n t1.addPath(path2d, new DOMMatrix(pathMatrix));\n\n var t2 = new Path2D();\n // see https://developer.mozilla.org/en-US/docs/Web/API/DOMMatrix/DOMMatrix\n t2.addPath(t1, new DOMMatrix([\n Math.cos(rotation) * scaleX,\n Math.sin(rotation) * scaleX,\n -Math.sin(rotation) * scaleY,\n Math.cos(rotation) * scaleY,\n x,\n y\n ]));\n\n return t2;\n }\n\n function shapeFromPath(pathData) {\n if (!canUsePaths) {\n throw new Error('path confetti are not supported in this browser');\n }\n\n var path, matrix;\n\n if (typeof pathData === 'string') {\n path = pathData;\n } else {\n path = pathData.path;\n matrix = pathData.matrix;\n }\n\n var path2d = new Path2D(path);\n var tempCanvas = document.createElement('canvas');\n var tempCtx = tempCanvas.getContext('2d');\n\n if (!matrix) {\n // attempt to figure out the width of the path, up to 1000x1000\n var maxSize = 1000;\n var minX = maxSize;\n var minY = maxSize;\n var maxX = 0;\n var maxY = 0;\n var width, height;\n\n // do some line skipping... this is faster than checking\n // every pixel and will be mostly still correct\n for (var x = 0; x < maxSize; x += 2) {\n for (var y = 0; y < maxSize; y += 2) {\n if (tempCtx.isPointInPath(path2d, x, y, 'nonzero')) {\n minX = Math.min(minX, x);\n minY = Math.min(minY, y);\n maxX = Math.max(maxX, x);\n maxY = Math.max(maxY, y);\n }\n }\n }\n\n width = maxX - minX;\n height = maxY - minY;\n\n var maxDesiredSize = 10;\n var scale = Math.min(maxDesiredSize/width, maxDesiredSize/height);\n\n matrix = [\n scale, 0, 0, scale,\n -Math.round((width/2) + minX) * scale,\n -Math.round((height/2) + minY) * scale\n ];\n }\n\n return {\n type: 'path',\n path: path,\n matrix: matrix\n };\n }\n\n function shapeFromText(textData) {\n var text,\n scalar = 1,\n color = '#000000',\n // see https://nolanlawson.com/2022/04/08/the-struggle-of-using-native-emoji-on-the-web/\n fontFamily = '\"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\", \"EmojiOne Color\", \"Android Emoji\", \"Twemoji Mozilla\", \"system emoji\", sans-serif';\n\n if (typeof textData === 'string') {\n text = textData;\n } else {\n text = textData.text;\n scalar = 'scalar' in textData ? textData.scalar : scalar;\n fontFamily = 'fontFamily' in textData ? textData.fontFamily : fontFamily;\n color = 'color' in textData ? textData.color : color;\n }\n\n // all other confetti are 10 pixels,\n // so this pixel size is the de-facto 100% scale confetti\n var fontSize = 10 * scalar;\n var font = '' + fontSize + 'px ' + fontFamily;\n\n var canvas = new OffscreenCanvas(fontSize, fontSize);\n var ctx = canvas.getContext('2d');\n\n ctx.font = font;\n var size = ctx.measureText(text);\n var width = Math.ceil(size.actualBoundingBoxRight + size.actualBoundingBoxLeft);\n var height = Math.ceil(size.actualBoundingBoxAscent + size.actualBoundingBoxDescent);\n\n var padding = 2;\n var x = size.actualBoundingBoxLeft + padding;\n var y = size.actualBoundingBoxAscent + padding;\n width += padding + padding;\n height += padding + padding;\n\n canvas = new OffscreenCanvas(width, height);\n ctx = canvas.getContext('2d');\n ctx.font = font;\n ctx.fillStyle = color;\n\n ctx.fillText(text, x, y);\n\n var scale = 1 / scalar;\n\n return {\n type: 'bitmap',\n // TODO these probably need to be transfered for workers\n bitmap: canvas.transferToImageBitmap(),\n matrix: [scale, 0, 0, scale, -width * scale / 2, -height * scale / 2]\n };\n }\n\n module.exports = function() {\n return getDefaultFire().apply(this, arguments);\n };\n module.exports.reset = function() {\n getDefaultFire().reset();\n };\n module.exports.create = confettiCannon;\n module.exports.shapeFromPath = shapeFromPath;\n module.exports.shapeFromText = shapeFromText;\n}((function () {\n if (typeof window !== 'undefined') {\n return window;\n }\n\n if (typeof self !== 'undefined') {\n return self;\n }\n\n return this || {};\n})(), module, false));\n\n// end source content\n\nexport default module.exports;\nexport var create = module.exports.create;\n", "/*\nStimulus 3.1.1\nCopyright © 2022 Basecamp, LLC\n */\nclass EventListener {\n constructor(eventTarget, eventName, eventOptions) {\n this.eventTarget = eventTarget;\n this.eventName = eventName;\n this.eventOptions = eventOptions;\n this.unorderedBindings = new Set();\n }\n connect() {\n this.eventTarget.addEventListener(this.eventName, this, this.eventOptions);\n }\n disconnect() {\n this.eventTarget.removeEventListener(this.eventName, this, this.eventOptions);\n }\n bindingConnected(binding) {\n this.unorderedBindings.add(binding);\n }\n bindingDisconnected(binding) {\n this.unorderedBindings.delete(binding);\n }\n handleEvent(event) {\n const extendedEvent = extendEvent(event);\n for (const binding of this.bindings) {\n if (extendedEvent.immediatePropagationStopped) {\n break;\n }\n else {\n binding.handleEvent(extendedEvent);\n }\n }\n }\n hasBindings() {\n return this.unorderedBindings.size > 0;\n }\n get bindings() {\n return Array.from(this.unorderedBindings).sort((left, right) => {\n const leftIndex = left.index, rightIndex = right.index;\n return leftIndex < rightIndex ? -1 : leftIndex > rightIndex ? 1 : 0;\n });\n }\n}\nfunction extendEvent(event) {\n if (\"immediatePropagationStopped\" in event) {\n return event;\n }\n else {\n const { stopImmediatePropagation } = event;\n return Object.assign(event, {\n immediatePropagationStopped: false,\n stopImmediatePropagation() {\n this.immediatePropagationStopped = true;\n stopImmediatePropagation.call(this);\n },\n });\n }\n}\n\nclass Dispatcher {\n constructor(application) {\n this.application = application;\n this.eventListenerMaps = new Map();\n this.started = false;\n }\n start() {\n if (!this.started) {\n this.started = true;\n this.eventListeners.forEach((eventListener) => eventListener.connect());\n }\n }\n stop() {\n if (this.started) {\n this.started = false;\n this.eventListeners.forEach((eventListener) => eventListener.disconnect());\n }\n }\n get eventListeners() {\n return Array.from(this.eventListenerMaps.values()).reduce((listeners, map) => listeners.concat(Array.from(map.values())), []);\n }\n bindingConnected(binding) {\n this.fetchEventListenerForBinding(binding).bindingConnected(binding);\n }\n bindingDisconnected(binding, clearEventListeners = false) {\n this.fetchEventListenerForBinding(binding).bindingDisconnected(binding);\n if (clearEventListeners)\n this.clearEventListenersForBinding(binding);\n }\n handleError(error, message, detail = {}) {\n this.application.handleError(error, `Error ${message}`, detail);\n }\n clearEventListenersForBinding(binding) {\n const eventListener = this.fetchEventListenerForBinding(binding);\n if (!eventListener.hasBindings()) {\n eventListener.disconnect();\n this.removeMappedEventListenerFor(binding);\n }\n }\n removeMappedEventListenerFor(binding) {\n const { eventTarget, eventName, eventOptions } = binding;\n const eventListenerMap = this.fetchEventListenerMapForEventTarget(eventTarget);\n const cacheKey = this.cacheKey(eventName, eventOptions);\n eventListenerMap.delete(cacheKey);\n if (eventListenerMap.size == 0)\n this.eventListenerMaps.delete(eventTarget);\n }\n fetchEventListenerForBinding(binding) {\n const { eventTarget, eventName, eventOptions } = binding;\n return this.fetchEventListener(eventTarget, eventName, eventOptions);\n }\n fetchEventListener(eventTarget, eventName, eventOptions) {\n const eventListenerMap = this.fetchEventListenerMapForEventTarget(eventTarget);\n const cacheKey = this.cacheKey(eventName, eventOptions);\n let eventListener = eventListenerMap.get(cacheKey);\n if (!eventListener) {\n eventListener = this.createEventListener(eventTarget, eventName, eventOptions);\n eventListenerMap.set(cacheKey, eventListener);\n }\n return eventListener;\n }\n createEventListener(eventTarget, eventName, eventOptions) {\n const eventListener = new EventListener(eventTarget, eventName, eventOptions);\n if (this.started) {\n eventListener.connect();\n }\n return eventListener;\n }\n fetchEventListenerMapForEventTarget(eventTarget) {\n let eventListenerMap = this.eventListenerMaps.get(eventTarget);\n if (!eventListenerMap) {\n eventListenerMap = new Map();\n this.eventListenerMaps.set(eventTarget, eventListenerMap);\n }\n return eventListenerMap;\n }\n cacheKey(eventName, eventOptions) {\n const parts = [eventName];\n Object.keys(eventOptions)\n .sort()\n .forEach((key) => {\n parts.push(`${eventOptions[key] ? \"\" : \"!\"}${key}`);\n });\n return parts.join(\":\");\n }\n}\n\nconst defaultActionDescriptorFilters = {\n stop({ event, value }) {\n if (value)\n event.stopPropagation();\n return true;\n },\n prevent({ event, value }) {\n if (value)\n event.preventDefault();\n return true;\n },\n self({ event, value, element }) {\n if (value) {\n return element === event.target;\n }\n else {\n return true;\n }\n },\n};\nconst descriptorPattern = /^((.+?)(@(window|document))?->)?(.+?)(#([^:]+?))(:(.+))?$/;\nfunction parseActionDescriptorString(descriptorString) {\n const source = descriptorString.trim();\n const matches = source.match(descriptorPattern) || [];\n return {\n eventTarget: parseEventTarget(matches[4]),\n eventName: matches[2],\n eventOptions: matches[9] ? parseEventOptions(matches[9]) : {},\n identifier: matches[5],\n methodName: matches[7],\n };\n}\nfunction parseEventTarget(eventTargetName) {\n if (eventTargetName == \"window\") {\n return window;\n }\n else if (eventTargetName == \"document\") {\n return document;\n }\n}\nfunction parseEventOptions(eventOptions) {\n return eventOptions\n .split(\":\")\n .reduce((options, token) => Object.assign(options, { [token.replace(/^!/, \"\")]: !/^!/.test(token) }), {});\n}\nfunction stringifyEventTarget(eventTarget) {\n if (eventTarget == window) {\n return \"window\";\n }\n else if (eventTarget == document) {\n return \"document\";\n }\n}\n\nfunction camelize(value) {\n return value.replace(/(?:[_-])([a-z0-9])/g, (_, char) => char.toUpperCase());\n}\nfunction capitalize(value) {\n return value.charAt(0).toUpperCase() + value.slice(1);\n}\nfunction dasherize(value) {\n return value.replace(/([A-Z])/g, (_, char) => `-${char.toLowerCase()}`);\n}\nfunction tokenize(value) {\n return value.match(/[^\\s]+/g) || [];\n}\n\nclass Action {\n constructor(element, index, descriptor) {\n this.element = element;\n this.index = index;\n this.eventTarget = descriptor.eventTarget || element;\n this.eventName = descriptor.eventName || getDefaultEventNameForElement(element) || error(\"missing event name\");\n this.eventOptions = descriptor.eventOptions || {};\n this.identifier = descriptor.identifier || error(\"missing identifier\");\n this.methodName = descriptor.methodName || error(\"missing method name\");\n }\n static forToken(token) {\n return new this(token.element, token.index, parseActionDescriptorString(token.content));\n }\n toString() {\n const eventNameSuffix = this.eventTargetName ? `@${this.eventTargetName}` : \"\";\n return `${this.eventName}${eventNameSuffix}->${this.identifier}#${this.methodName}`;\n }\n get params() {\n const params = {};\n const pattern = new RegExp(`^data-${this.identifier}-(.+)-param$`, \"i\");\n for (const { name, value } of Array.from(this.element.attributes)) {\n const match = name.match(pattern);\n const key = match && match[1];\n if (key) {\n params[camelize(key)] = typecast(value);\n }\n }\n return params;\n }\n get eventTargetName() {\n return stringifyEventTarget(this.eventTarget);\n }\n}\nconst defaultEventNames = {\n a: () => \"click\",\n button: () => \"click\",\n form: () => \"submit\",\n details: () => \"toggle\",\n input: (e) => (e.getAttribute(\"type\") == \"submit\" ? \"click\" : \"input\"),\n select: () => \"change\",\n textarea: () => \"input\",\n};\nfunction getDefaultEventNameForElement(element) {\n const tagName = element.tagName.toLowerCase();\n if (tagName in defaultEventNames) {\n return defaultEventNames[tagName](element);\n }\n}\nfunction error(message) {\n throw new Error(message);\n}\nfunction typecast(value) {\n try {\n return JSON.parse(value);\n }\n catch (o_O) {\n return value;\n }\n}\n\nclass Binding {\n constructor(context, action) {\n this.context = context;\n this.action = action;\n }\n get index() {\n return this.action.index;\n }\n get eventTarget() {\n return this.action.eventTarget;\n }\n get eventOptions() {\n return this.action.eventOptions;\n }\n get identifier() {\n return this.context.identifier;\n }\n handleEvent(event) {\n if (this.willBeInvokedByEvent(event) && this.applyEventModifiers(event)) {\n this.invokeWithEvent(event);\n }\n }\n get eventName() {\n return this.action.eventName;\n }\n get method() {\n const method = this.controller[this.methodName];\n if (typeof method == \"function\") {\n return method;\n }\n throw new Error(`Action \"${this.action}\" references undefined method \"${this.methodName}\"`);\n }\n applyEventModifiers(event) {\n const { element } = this.action;\n const { actionDescriptorFilters } = this.context.application;\n let passes = true;\n for (const [name, value] of Object.entries(this.eventOptions)) {\n if (name in actionDescriptorFilters) {\n const filter = actionDescriptorFilters[name];\n passes = passes && filter({ name, value, event, element });\n }\n else {\n continue;\n }\n }\n return passes;\n }\n invokeWithEvent(event) {\n const { target, currentTarget } = event;\n try {\n const { params } = this.action;\n const actionEvent = Object.assign(event, { params });\n this.method.call(this.controller, actionEvent);\n this.context.logDebugActivity(this.methodName, { event, target, currentTarget, action: this.methodName });\n }\n catch (error) {\n const { identifier, controller, element, index } = this;\n const detail = { identifier, controller, element, index, event };\n this.context.handleError(error, `invoking action \"${this.action}\"`, detail);\n }\n }\n willBeInvokedByEvent(event) {\n const eventTarget = event.target;\n if (this.element === eventTarget) {\n return true;\n }\n else if (eventTarget instanceof Element && this.element.contains(eventTarget)) {\n return this.scope.containsElement(eventTarget);\n }\n else {\n return this.scope.containsElement(this.action.element);\n }\n }\n get controller() {\n return this.context.controller;\n }\n get methodName() {\n return this.action.methodName;\n }\n get element() {\n return this.scope.element;\n }\n get scope() {\n return this.context.scope;\n }\n}\n\nclass ElementObserver {\n constructor(element, delegate) {\n this.mutationObserverInit = { attributes: true, childList: true, subtree: true };\n this.element = element;\n this.started = false;\n this.delegate = delegate;\n this.elements = new Set();\n this.mutationObserver = new MutationObserver((mutations) => this.processMutations(mutations));\n }\n start() {\n if (!this.started) {\n this.started = true;\n this.mutationObserver.observe(this.element, this.mutationObserverInit);\n this.refresh();\n }\n }\n pause(callback) {\n if (this.started) {\n this.mutationObserver.disconnect();\n this.started = false;\n }\n callback();\n if (!this.started) {\n this.mutationObserver.observe(this.element, this.mutationObserverInit);\n this.started = true;\n }\n }\n stop() {\n if (this.started) {\n this.mutationObserver.takeRecords();\n this.mutationObserver.disconnect();\n this.started = false;\n }\n }\n refresh() {\n if (this.started) {\n const matches = new Set(this.matchElementsInTree());\n for (const element of Array.from(this.elements)) {\n if (!matches.has(element)) {\n this.removeElement(element);\n }\n }\n for (const element of Array.from(matches)) {\n this.addElement(element);\n }\n }\n }\n processMutations(mutations) {\n if (this.started) {\n for (const mutation of mutations) {\n this.processMutation(mutation);\n }\n }\n }\n processMutation(mutation) {\n if (mutation.type == \"attributes\") {\n this.processAttributeChange(mutation.target, mutation.attributeName);\n }\n else if (mutation.type == \"childList\") {\n this.processRemovedNodes(mutation.removedNodes);\n this.processAddedNodes(mutation.addedNodes);\n }\n }\n processAttributeChange(node, attributeName) {\n const element = node;\n if (this.elements.has(element)) {\n if (this.delegate.elementAttributeChanged && this.matchElement(element)) {\n this.delegate.elementAttributeChanged(element, attributeName);\n }\n else {\n this.removeElement(element);\n }\n }\n else if (this.matchElement(element)) {\n this.addElement(element);\n }\n }\n processRemovedNodes(nodes) {\n for (const node of Array.from(nodes)) {\n const element = this.elementFromNode(node);\n if (element) {\n this.processTree(element, this.removeElement);\n }\n }\n }\n processAddedNodes(nodes) {\n for (const node of Array.from(nodes)) {\n const element = this.elementFromNode(node);\n if (element && this.elementIsActive(element)) {\n this.processTree(element, this.addElement);\n }\n }\n }\n matchElement(element) {\n return this.delegate.matchElement(element);\n }\n matchElementsInTree(tree = this.element) {\n return this.delegate.matchElementsInTree(tree);\n }\n processTree(tree, processor) {\n for (const element of this.matchElementsInTree(tree)) {\n processor.call(this, element);\n }\n }\n elementFromNode(node) {\n if (node.nodeType == Node.ELEMENT_NODE) {\n return node;\n }\n }\n elementIsActive(element) {\n if (element.isConnected != this.element.isConnected) {\n return false;\n }\n else {\n return this.element.contains(element);\n }\n }\n addElement(element) {\n if (!this.elements.has(element)) {\n if (this.elementIsActive(element)) {\n this.elements.add(element);\n if (this.delegate.elementMatched) {\n this.delegate.elementMatched(element);\n }\n }\n }\n }\n removeElement(element) {\n if (this.elements.has(element)) {\n this.elements.delete(element);\n if (this.delegate.elementUnmatched) {\n this.delegate.elementUnmatched(element);\n }\n }\n }\n}\n\nclass AttributeObserver {\n constructor(element, attributeName, delegate) {\n this.attributeName = attributeName;\n this.delegate = delegate;\n this.elementObserver = new ElementObserver(element, this);\n }\n get element() {\n return this.elementObserver.element;\n }\n get selector() {\n return `[${this.attributeName}]`;\n }\n start() {\n this.elementObserver.start();\n }\n pause(callback) {\n this.elementObserver.pause(callback);\n }\n stop() {\n this.elementObserver.stop();\n }\n refresh() {\n this.elementObserver.refresh();\n }\n get started() {\n return this.elementObserver.started;\n }\n matchElement(element) {\n return element.hasAttribute(this.attributeName);\n }\n matchElementsInTree(tree) {\n const match = this.matchElement(tree) ? [tree] : [];\n const matches = Array.from(tree.querySelectorAll(this.selector));\n return match.concat(matches);\n }\n elementMatched(element) {\n if (this.delegate.elementMatchedAttribute) {\n this.delegate.elementMatchedAttribute(element, this.attributeName);\n }\n }\n elementUnmatched(element) {\n if (this.delegate.elementUnmatchedAttribute) {\n this.delegate.elementUnmatchedAttribute(element, this.attributeName);\n }\n }\n elementAttributeChanged(element, attributeName) {\n if (this.delegate.elementAttributeValueChanged && this.attributeName == attributeName) {\n this.delegate.elementAttributeValueChanged(element, attributeName);\n }\n }\n}\n\nclass StringMapObserver {\n constructor(element, delegate) {\n this.element = element;\n this.delegate = delegate;\n this.started = false;\n this.stringMap = new Map();\n this.mutationObserver = new MutationObserver((mutations) => this.processMutations(mutations));\n }\n start() {\n if (!this.started) {\n this.started = true;\n this.mutationObserver.observe(this.element, { attributes: true, attributeOldValue: true });\n this.refresh();\n }\n }\n stop() {\n if (this.started) {\n this.mutationObserver.takeRecords();\n this.mutationObserver.disconnect();\n this.started = false;\n }\n }\n refresh() {\n if (this.started) {\n for (const attributeName of this.knownAttributeNames) {\n this.refreshAttribute(attributeName, null);\n }\n }\n }\n processMutations(mutations) {\n if (this.started) {\n for (const mutation of mutations) {\n this.processMutation(mutation);\n }\n }\n }\n processMutation(mutation) {\n const attributeName = mutation.attributeName;\n if (attributeName) {\n this.refreshAttribute(attributeName, mutation.oldValue);\n }\n }\n refreshAttribute(attributeName, oldValue) {\n const key = this.delegate.getStringMapKeyForAttribute(attributeName);\n if (key != null) {\n if (!this.stringMap.has(attributeName)) {\n this.stringMapKeyAdded(key, attributeName);\n }\n const value = this.element.getAttribute(attributeName);\n if (this.stringMap.get(attributeName) != value) {\n this.stringMapValueChanged(value, key, oldValue);\n }\n if (value == null) {\n const oldValue = this.stringMap.get(attributeName);\n this.stringMap.delete(attributeName);\n if (oldValue)\n this.stringMapKeyRemoved(key, attributeName, oldValue);\n }\n else {\n this.stringMap.set(attributeName, value);\n }\n }\n }\n stringMapKeyAdded(key, attributeName) {\n if (this.delegate.stringMapKeyAdded) {\n this.delegate.stringMapKeyAdded(key, attributeName);\n }\n }\n stringMapValueChanged(value, key, oldValue) {\n if (this.delegate.stringMapValueChanged) {\n this.delegate.stringMapValueChanged(value, key, oldValue);\n }\n }\n stringMapKeyRemoved(key, attributeName, oldValue) {\n if (this.delegate.stringMapKeyRemoved) {\n this.delegate.stringMapKeyRemoved(key, attributeName, oldValue);\n }\n }\n get knownAttributeNames() {\n return Array.from(new Set(this.currentAttributeNames.concat(this.recordedAttributeNames)));\n }\n get currentAttributeNames() {\n return Array.from(this.element.attributes).map((attribute) => attribute.name);\n }\n get recordedAttributeNames() {\n return Array.from(this.stringMap.keys());\n }\n}\n\nfunction add(map, key, value) {\n fetch(map, key).add(value);\n}\nfunction del(map, key, value) {\n fetch(map, key).delete(value);\n prune(map, key);\n}\nfunction fetch(map, key) {\n let values = map.get(key);\n if (!values) {\n values = new Set();\n map.set(key, values);\n }\n return values;\n}\nfunction prune(map, key) {\n const values = map.get(key);\n if (values != null && values.size == 0) {\n map.delete(key);\n }\n}\n\nclass Multimap {\n constructor() {\n this.valuesByKey = new Map();\n }\n get keys() {\n return Array.from(this.valuesByKey.keys());\n }\n get values() {\n const sets = Array.from(this.valuesByKey.values());\n return sets.reduce((values, set) => values.concat(Array.from(set)), []);\n }\n get size() {\n const sets = Array.from(this.valuesByKey.values());\n return sets.reduce((size, set) => size + set.size, 0);\n }\n add(key, value) {\n add(this.valuesByKey, key, value);\n }\n delete(key, value) {\n del(this.valuesByKey, key, value);\n }\n has(key, value) {\n const values = this.valuesByKey.get(key);\n return values != null && values.has(value);\n }\n hasKey(key) {\n return this.valuesByKey.has(key);\n }\n hasValue(value) {\n const sets = Array.from(this.valuesByKey.values());\n return sets.some((set) => set.has(value));\n }\n getValuesForKey(key) {\n const values = this.valuesByKey.get(key);\n return values ? Array.from(values) : [];\n }\n getKeysForValue(value) {\n return Array.from(this.valuesByKey)\n .filter(([_key, values]) => values.has(value))\n .map(([key, _values]) => key);\n }\n}\n\nclass IndexedMultimap extends Multimap {\n constructor() {\n super();\n this.keysByValue = new Map();\n }\n get values() {\n return Array.from(this.keysByValue.keys());\n }\n add(key, value) {\n super.add(key, value);\n add(this.keysByValue, value, key);\n }\n delete(key, value) {\n super.delete(key, value);\n del(this.keysByValue, value, key);\n }\n hasValue(value) {\n return this.keysByValue.has(value);\n }\n getKeysForValue(value) {\n const set = this.keysByValue.get(value);\n return set ? Array.from(set) : [];\n }\n}\n\nclass TokenListObserver {\n constructor(element, attributeName, delegate) {\n this.attributeObserver = new AttributeObserver(element, attributeName, this);\n this.delegate = delegate;\n this.tokensByElement = new Multimap();\n }\n get started() {\n return this.attributeObserver.started;\n }\n start() {\n this.attributeObserver.start();\n }\n pause(callback) {\n this.attributeObserver.pause(callback);\n }\n stop() {\n this.attributeObserver.stop();\n }\n refresh() {\n this.attributeObserver.refresh();\n }\n get element() {\n return this.attributeObserver.element;\n }\n get attributeName() {\n return this.attributeObserver.attributeName;\n }\n elementMatchedAttribute(element) {\n this.tokensMatched(this.readTokensForElement(element));\n }\n elementAttributeValueChanged(element) {\n const [unmatchedTokens, matchedTokens] = this.refreshTokensForElement(element);\n this.tokensUnmatched(unmatchedTokens);\n this.tokensMatched(matchedTokens);\n }\n elementUnmatchedAttribute(element) {\n this.tokensUnmatched(this.tokensByElement.getValuesForKey(element));\n }\n tokensMatched(tokens) {\n tokens.forEach((token) => this.tokenMatched(token));\n }\n tokensUnmatched(tokens) {\n tokens.forEach((token) => this.tokenUnmatched(token));\n }\n tokenMatched(token) {\n this.delegate.tokenMatched(token);\n this.tokensByElement.add(token.element, token);\n }\n tokenUnmatched(token) {\n this.delegate.tokenUnmatched(token);\n this.tokensByElement.delete(token.element, token);\n }\n refreshTokensForElement(element) {\n const previousTokens = this.tokensByElement.getValuesForKey(element);\n const currentTokens = this.readTokensForElement(element);\n const firstDifferingIndex = zip(previousTokens, currentTokens).findIndex(([previousToken, currentToken]) => !tokensAreEqual(previousToken, currentToken));\n if (firstDifferingIndex == -1) {\n return [[], []];\n }\n else {\n return [previousTokens.slice(firstDifferingIndex), currentTokens.slice(firstDifferingIndex)];\n }\n }\n readTokensForElement(element) {\n const attributeName = this.attributeName;\n const tokenString = element.getAttribute(attributeName) || \"\";\n return parseTokenString(tokenString, element, attributeName);\n }\n}\nfunction parseTokenString(tokenString, element, attributeName) {\n return tokenString\n .trim()\n .split(/\\s+/)\n .filter((content) => content.length)\n .map((content, index) => ({ element, attributeName, content, index }));\n}\nfunction zip(left, right) {\n const length = Math.max(left.length, right.length);\n return Array.from({ length }, (_, index) => [left[index], right[index]]);\n}\nfunction tokensAreEqual(left, right) {\n return left && right && left.index == right.index && left.content == right.content;\n}\n\nclass ValueListObserver {\n constructor(element, attributeName, delegate) {\n this.tokenListObserver = new TokenListObserver(element, attributeName, this);\n this.delegate = delegate;\n this.parseResultsByToken = new WeakMap();\n this.valuesByTokenByElement = new WeakMap();\n }\n get started() {\n return this.tokenListObserver.started;\n }\n start() {\n this.tokenListObserver.start();\n }\n stop() {\n this.tokenListObserver.stop();\n }\n refresh() {\n this.tokenListObserver.refresh();\n }\n get element() {\n return this.tokenListObserver.element;\n }\n get attributeName() {\n return this.tokenListObserver.attributeName;\n }\n tokenMatched(token) {\n const { element } = token;\n const { value } = this.fetchParseResultForToken(token);\n if (value) {\n this.fetchValuesByTokenForElement(element).set(token, value);\n this.delegate.elementMatchedValue(element, value);\n }\n }\n tokenUnmatched(token) {\n const { element } = token;\n const { value } = this.fetchParseResultForToken(token);\n if (value) {\n this.fetchValuesByTokenForElement(element).delete(token);\n this.delegate.elementUnmatchedValue(element, value);\n }\n }\n fetchParseResultForToken(token) {\n let parseResult = this.parseResultsByToken.get(token);\n if (!parseResult) {\n parseResult = this.parseToken(token);\n this.parseResultsByToken.set(token, parseResult);\n }\n return parseResult;\n }\n fetchValuesByTokenForElement(element) {\n let valuesByToken = this.valuesByTokenByElement.get(element);\n if (!valuesByToken) {\n valuesByToken = new Map();\n this.valuesByTokenByElement.set(element, valuesByToken);\n }\n return valuesByToken;\n }\n parseToken(token) {\n try {\n const value = this.delegate.parseValueForToken(token);\n return { value };\n }\n catch (error) {\n return { error };\n }\n }\n}\n\nclass BindingObserver {\n constructor(context, delegate) {\n this.context = context;\n this.delegate = delegate;\n this.bindingsByAction = new Map();\n }\n start() {\n if (!this.valueListObserver) {\n this.valueListObserver = new ValueListObserver(this.element, this.actionAttribute, this);\n this.valueListObserver.start();\n }\n }\n stop() {\n if (this.valueListObserver) {\n this.valueListObserver.stop();\n delete this.valueListObserver;\n this.disconnectAllActions();\n }\n }\n get element() {\n return this.context.element;\n }\n get identifier() {\n return this.context.identifier;\n }\n get actionAttribute() {\n return this.schema.actionAttribute;\n }\n get schema() {\n return this.context.schema;\n }\n get bindings() {\n return Array.from(this.bindingsByAction.values());\n }\n connectAction(action) {\n const binding = new Binding(this.context, action);\n this.bindingsByAction.set(action, binding);\n this.delegate.bindingConnected(binding);\n }\n disconnectAction(action) {\n const binding = this.bindingsByAction.get(action);\n if (binding) {\n this.bindingsByAction.delete(action);\n this.delegate.bindingDisconnected(binding);\n }\n }\n disconnectAllActions() {\n this.bindings.forEach((binding) => this.delegate.bindingDisconnected(binding, true));\n this.bindingsByAction.clear();\n }\n parseValueForToken(token) {\n const action = Action.forToken(token);\n if (action.identifier == this.identifier) {\n return action;\n }\n }\n elementMatchedValue(element, action) {\n this.connectAction(action);\n }\n elementUnmatchedValue(element, action) {\n this.disconnectAction(action);\n }\n}\n\nclass ValueObserver {\n constructor(context, receiver) {\n this.context = context;\n this.receiver = receiver;\n this.stringMapObserver = new StringMapObserver(this.element, this);\n this.valueDescriptorMap = this.controller.valueDescriptorMap;\n }\n start() {\n this.stringMapObserver.start();\n this.invokeChangedCallbacksForDefaultValues();\n }\n stop() {\n this.stringMapObserver.stop();\n }\n get element() {\n return this.context.element;\n }\n get controller() {\n return this.context.controller;\n }\n getStringMapKeyForAttribute(attributeName) {\n if (attributeName in this.valueDescriptorMap) {\n return this.valueDescriptorMap[attributeName].name;\n }\n }\n stringMapKeyAdded(key, attributeName) {\n const descriptor = this.valueDescriptorMap[attributeName];\n if (!this.hasValue(key)) {\n this.invokeChangedCallback(key, descriptor.writer(this.receiver[key]), descriptor.writer(descriptor.defaultValue));\n }\n }\n stringMapValueChanged(value, name, oldValue) {\n const descriptor = this.valueDescriptorNameMap[name];\n if (value === null)\n return;\n if (oldValue === null) {\n oldValue = descriptor.writer(descriptor.defaultValue);\n }\n this.invokeChangedCallback(name, value, oldValue);\n }\n stringMapKeyRemoved(key, attributeName, oldValue) {\n const descriptor = this.valueDescriptorNameMap[key];\n if (this.hasValue(key)) {\n this.invokeChangedCallback(key, descriptor.writer(this.receiver[key]), oldValue);\n }\n else {\n this.invokeChangedCallback(key, descriptor.writer(descriptor.defaultValue), oldValue);\n }\n }\n invokeChangedCallbacksForDefaultValues() {\n for (const { key, name, defaultValue, writer } of this.valueDescriptors) {\n if (defaultValue != undefined && !this.controller.data.has(key)) {\n this.invokeChangedCallback(name, writer(defaultValue), undefined);\n }\n }\n }\n invokeChangedCallback(name, rawValue, rawOldValue) {\n const changedMethodName = `${name}Changed`;\n const changedMethod = this.receiver[changedMethodName];\n if (typeof changedMethod == \"function\") {\n const descriptor = this.valueDescriptorNameMap[name];\n try {\n const value = descriptor.reader(rawValue);\n let oldValue = rawOldValue;\n if (rawOldValue) {\n oldValue = descriptor.reader(rawOldValue);\n }\n changedMethod.call(this.receiver, value, oldValue);\n }\n catch (error) {\n if (error instanceof TypeError) {\n error.message = `Stimulus Value \"${this.context.identifier}.${descriptor.name}\" - ${error.message}`;\n }\n throw error;\n }\n }\n }\n get valueDescriptors() {\n const { valueDescriptorMap } = this;\n return Object.keys(valueDescriptorMap).map((key) => valueDescriptorMap[key]);\n }\n get valueDescriptorNameMap() {\n const descriptors = {};\n Object.keys(this.valueDescriptorMap).forEach((key) => {\n const descriptor = this.valueDescriptorMap[key];\n descriptors[descriptor.name] = descriptor;\n });\n return descriptors;\n }\n hasValue(attributeName) {\n const descriptor = this.valueDescriptorNameMap[attributeName];\n const hasMethodName = `has${capitalize(descriptor.name)}`;\n return this.receiver[hasMethodName];\n }\n}\n\nclass TargetObserver {\n constructor(context, delegate) {\n this.context = context;\n this.delegate = delegate;\n this.targetsByName = new Multimap();\n }\n start() {\n if (!this.tokenListObserver) {\n this.tokenListObserver = new TokenListObserver(this.element, this.attributeName, this);\n this.tokenListObserver.start();\n }\n }\n stop() {\n if (this.tokenListObserver) {\n this.disconnectAllTargets();\n this.tokenListObserver.stop();\n delete this.tokenListObserver;\n }\n }\n tokenMatched({ element, content: name }) {\n if (this.scope.containsElement(element)) {\n this.connectTarget(element, name);\n }\n }\n tokenUnmatched({ element, content: name }) {\n this.disconnectTarget(element, name);\n }\n connectTarget(element, name) {\n var _a;\n if (!this.targetsByName.has(name, element)) {\n this.targetsByName.add(name, element);\n (_a = this.tokenListObserver) === null || _a === void 0 ? void 0 : _a.pause(() => this.delegate.targetConnected(element, name));\n }\n }\n disconnectTarget(element, name) {\n var _a;\n if (this.targetsByName.has(name, element)) {\n this.targetsByName.delete(name, element);\n (_a = this.tokenListObserver) === null || _a === void 0 ? void 0 : _a.pause(() => this.delegate.targetDisconnected(element, name));\n }\n }\n disconnectAllTargets() {\n for (const name of this.targetsByName.keys) {\n for (const element of this.targetsByName.getValuesForKey(name)) {\n this.disconnectTarget(element, name);\n }\n }\n }\n get attributeName() {\n return `data-${this.context.identifier}-target`;\n }\n get element() {\n return this.context.element;\n }\n get scope() {\n return this.context.scope;\n }\n}\n\nclass Context {\n constructor(module, scope) {\n this.logDebugActivity = (functionName, detail = {}) => {\n const { identifier, controller, element } = this;\n detail = Object.assign({ identifier, controller, element }, detail);\n this.application.logDebugActivity(this.identifier, functionName, detail);\n };\n this.module = module;\n this.scope = scope;\n this.controller = new module.controllerConstructor(this);\n this.bindingObserver = new BindingObserver(this, this.dispatcher);\n this.valueObserver = new ValueObserver(this, this.controller);\n this.targetObserver = new TargetObserver(this, this);\n try {\n this.controller.initialize();\n this.logDebugActivity(\"initialize\");\n }\n catch (error) {\n this.handleError(error, \"initializing controller\");\n }\n }\n connect() {\n this.bindingObserver.start();\n this.valueObserver.start();\n this.targetObserver.start();\n try {\n this.controller.connect();\n this.logDebugActivity(\"connect\");\n }\n catch (error) {\n this.handleError(error, \"connecting controller\");\n }\n }\n disconnect() {\n try {\n this.controller.disconnect();\n this.logDebugActivity(\"disconnect\");\n }\n catch (error) {\n this.handleError(error, \"disconnecting controller\");\n }\n this.targetObserver.stop();\n this.valueObserver.stop();\n this.bindingObserver.stop();\n }\n get application() {\n return this.module.application;\n }\n get identifier() {\n return this.module.identifier;\n }\n get schema() {\n return this.application.schema;\n }\n get dispatcher() {\n return this.application.dispatcher;\n }\n get element() {\n return this.scope.element;\n }\n get parentElement() {\n return this.element.parentElement;\n }\n handleError(error, message, detail = {}) {\n const { identifier, controller, element } = this;\n detail = Object.assign({ identifier, controller, element }, detail);\n this.application.handleError(error, `Error ${message}`, detail);\n }\n targetConnected(element, name) {\n this.invokeControllerMethod(`${name}TargetConnected`, element);\n }\n targetDisconnected(element, name) {\n this.invokeControllerMethod(`${name}TargetDisconnected`, element);\n }\n invokeControllerMethod(methodName, ...args) {\n const controller = this.controller;\n if (typeof controller[methodName] == \"function\") {\n controller[methodName](...args);\n }\n }\n}\n\nfunction readInheritableStaticArrayValues(constructor, propertyName) {\n const ancestors = getAncestorsForConstructor(constructor);\n return Array.from(ancestors.reduce((values, constructor) => {\n getOwnStaticArrayValues(constructor, propertyName).forEach((name) => values.add(name));\n return values;\n }, new Set()));\n}\nfunction readInheritableStaticObjectPairs(constructor, propertyName) {\n const ancestors = getAncestorsForConstructor(constructor);\n return ancestors.reduce((pairs, constructor) => {\n pairs.push(...getOwnStaticObjectPairs(constructor, propertyName));\n return pairs;\n }, []);\n}\nfunction getAncestorsForConstructor(constructor) {\n const ancestors = [];\n while (constructor) {\n ancestors.push(constructor);\n constructor = Object.getPrototypeOf(constructor);\n }\n return ancestors.reverse();\n}\nfunction getOwnStaticArrayValues(constructor, propertyName) {\n const definition = constructor[propertyName];\n return Array.isArray(definition) ? definition : [];\n}\nfunction getOwnStaticObjectPairs(constructor, propertyName) {\n const definition = constructor[propertyName];\n return definition ? Object.keys(definition).map((key) => [key, definition[key]]) : [];\n}\n\nfunction bless(constructor) {\n return shadow(constructor, getBlessedProperties(constructor));\n}\nfunction shadow(constructor, properties) {\n const shadowConstructor = extend(constructor);\n const shadowProperties = getShadowProperties(constructor.prototype, properties);\n Object.defineProperties(shadowConstructor.prototype, shadowProperties);\n return shadowConstructor;\n}\nfunction getBlessedProperties(constructor) {\n const blessings = readInheritableStaticArrayValues(constructor, \"blessings\");\n return blessings.reduce((blessedProperties, blessing) => {\n const properties = blessing(constructor);\n for (const key in properties) {\n const descriptor = blessedProperties[key] || {};\n blessedProperties[key] = Object.assign(descriptor, properties[key]);\n }\n return blessedProperties;\n }, {});\n}\nfunction getShadowProperties(prototype, properties) {\n return getOwnKeys(properties).reduce((shadowProperties, key) => {\n const descriptor = getShadowedDescriptor(prototype, properties, key);\n if (descriptor) {\n Object.assign(shadowProperties, { [key]: descriptor });\n }\n return shadowProperties;\n }, {});\n}\nfunction getShadowedDescriptor(prototype, properties, key) {\n const shadowingDescriptor = Object.getOwnPropertyDescriptor(prototype, key);\n const shadowedByValue = shadowingDescriptor && \"value\" in shadowingDescriptor;\n if (!shadowedByValue) {\n const descriptor = Object.getOwnPropertyDescriptor(properties, key).value;\n if (shadowingDescriptor) {\n descriptor.get = shadowingDescriptor.get || descriptor.get;\n descriptor.set = shadowingDescriptor.set || descriptor.set;\n }\n return descriptor;\n }\n}\nconst getOwnKeys = (() => {\n if (typeof Object.getOwnPropertySymbols == \"function\") {\n return (object) => [...Object.getOwnPropertyNames(object), ...Object.getOwnPropertySymbols(object)];\n }\n else {\n return Object.getOwnPropertyNames;\n }\n})();\nconst extend = (() => {\n function extendWithReflect(constructor) {\n function extended() {\n return Reflect.construct(constructor, arguments, new.target);\n }\n extended.prototype = Object.create(constructor.prototype, {\n constructor: { value: extended },\n });\n Reflect.setPrototypeOf(extended, constructor);\n return extended;\n }\n function testReflectExtension() {\n const a = function () {\n this.a.call(this);\n };\n const b = extendWithReflect(a);\n b.prototype.a = function () { };\n return new b();\n }\n try {\n testReflectExtension();\n return extendWithReflect;\n }\n catch (error) {\n return (constructor) => class extended extends constructor {\n };\n }\n})();\n\nfunction blessDefinition(definition) {\n return {\n identifier: definition.identifier,\n controllerConstructor: bless(definition.controllerConstructor),\n };\n}\n\nclass Module {\n constructor(application, definition) {\n this.application = application;\n this.definition = blessDefinition(definition);\n this.contextsByScope = new WeakMap();\n this.connectedContexts = new Set();\n }\n get identifier() {\n return this.definition.identifier;\n }\n get controllerConstructor() {\n return this.definition.controllerConstructor;\n }\n get contexts() {\n return Array.from(this.connectedContexts);\n }\n connectContextForScope(scope) {\n const context = this.fetchContextForScope(scope);\n this.connectedContexts.add(context);\n context.connect();\n }\n disconnectContextForScope(scope) {\n const context = this.contextsByScope.get(scope);\n if (context) {\n this.connectedContexts.delete(context);\n context.disconnect();\n }\n }\n fetchContextForScope(scope) {\n let context = this.contextsByScope.get(scope);\n if (!context) {\n context = new Context(this, scope);\n this.contextsByScope.set(scope, context);\n }\n return context;\n }\n}\n\nclass ClassMap {\n constructor(scope) {\n this.scope = scope;\n }\n has(name) {\n return this.data.has(this.getDataKey(name));\n }\n get(name) {\n return this.getAll(name)[0];\n }\n getAll(name) {\n const tokenString = this.data.get(this.getDataKey(name)) || \"\";\n return tokenize(tokenString);\n }\n getAttributeName(name) {\n return this.data.getAttributeNameForKey(this.getDataKey(name));\n }\n getDataKey(name) {\n return `${name}-class`;\n }\n get data() {\n return this.scope.data;\n }\n}\n\nclass DataMap {\n constructor(scope) {\n this.scope = scope;\n }\n get element() {\n return this.scope.element;\n }\n get identifier() {\n return this.scope.identifier;\n }\n get(key) {\n const name = this.getAttributeNameForKey(key);\n return this.element.getAttribute(name);\n }\n set(key, value) {\n const name = this.getAttributeNameForKey(key);\n this.element.setAttribute(name, value);\n return this.get(key);\n }\n has(key) {\n const name = this.getAttributeNameForKey(key);\n return this.element.hasAttribute(name);\n }\n delete(key) {\n if (this.has(key)) {\n const name = this.getAttributeNameForKey(key);\n this.element.removeAttribute(name);\n return true;\n }\n else {\n return false;\n }\n }\n getAttributeNameForKey(key) {\n return `data-${this.identifier}-${dasherize(key)}`;\n }\n}\n\nclass Guide {\n constructor(logger) {\n this.warnedKeysByObject = new WeakMap();\n this.logger = logger;\n }\n warn(object, key, message) {\n let warnedKeys = this.warnedKeysByObject.get(object);\n if (!warnedKeys) {\n warnedKeys = new Set();\n this.warnedKeysByObject.set(object, warnedKeys);\n }\n if (!warnedKeys.has(key)) {\n warnedKeys.add(key);\n this.logger.warn(message, object);\n }\n }\n}\n\nfunction attributeValueContainsToken(attributeName, token) {\n return `[${attributeName}~=\"${token}\"]`;\n}\n\nclass TargetSet {\n constructor(scope) {\n this.scope = scope;\n }\n get element() {\n return this.scope.element;\n }\n get identifier() {\n return this.scope.identifier;\n }\n get schema() {\n return this.scope.schema;\n }\n has(targetName) {\n return this.find(targetName) != null;\n }\n find(...targetNames) {\n return targetNames.reduce((target, targetName) => target || this.findTarget(targetName) || this.findLegacyTarget(targetName), undefined);\n }\n findAll(...targetNames) {\n return targetNames.reduce((targets, targetName) => [\n ...targets,\n ...this.findAllTargets(targetName),\n ...this.findAllLegacyTargets(targetName),\n ], []);\n }\n findTarget(targetName) {\n const selector = this.getSelectorForTargetName(targetName);\n return this.scope.findElement(selector);\n }\n findAllTargets(targetName) {\n const selector = this.getSelectorForTargetName(targetName);\n return this.scope.findAllElements(selector);\n }\n getSelectorForTargetName(targetName) {\n const attributeName = this.schema.targetAttributeForScope(this.identifier);\n return attributeValueContainsToken(attributeName, targetName);\n }\n findLegacyTarget(targetName) {\n const selector = this.getLegacySelectorForTargetName(targetName);\n return this.deprecate(this.scope.findElement(selector), targetName);\n }\n findAllLegacyTargets(targetName) {\n const selector = this.getLegacySelectorForTargetName(targetName);\n return this.scope.findAllElements(selector).map((element) => this.deprecate(element, targetName));\n }\n getLegacySelectorForTargetName(targetName) {\n const targetDescriptor = `${this.identifier}.${targetName}`;\n return attributeValueContainsToken(this.schema.targetAttribute, targetDescriptor);\n }\n deprecate(element, targetName) {\n if (element) {\n const { identifier } = this;\n const attributeName = this.schema.targetAttribute;\n const revisedAttributeName = this.schema.targetAttributeForScope(identifier);\n this.guide.warn(element, `target:${targetName}`, `Please replace ${attributeName}=\"${identifier}.${targetName}\" with ${revisedAttributeName}=\"${targetName}\". ` +\n `The ${attributeName} attribute is deprecated and will be removed in a future version of Stimulus.`);\n }\n return element;\n }\n get guide() {\n return this.scope.guide;\n }\n}\n\nclass Scope {\n constructor(schema, element, identifier, logger) {\n this.targets = new TargetSet(this);\n this.classes = new ClassMap(this);\n this.data = new DataMap(this);\n this.containsElement = (element) => {\n return element.closest(this.controllerSelector) === this.element;\n };\n this.schema = schema;\n this.element = element;\n this.identifier = identifier;\n this.guide = new Guide(logger);\n }\n findElement(selector) {\n return this.element.matches(selector) ? this.element : this.queryElements(selector).find(this.containsElement);\n }\n findAllElements(selector) {\n return [\n ...(this.element.matches(selector) ? [this.element] : []),\n ...this.queryElements(selector).filter(this.containsElement),\n ];\n }\n queryElements(selector) {\n return Array.from(this.element.querySelectorAll(selector));\n }\n get controllerSelector() {\n return attributeValueContainsToken(this.schema.controllerAttribute, this.identifier);\n }\n}\n\nclass ScopeObserver {\n constructor(element, schema, delegate) {\n this.element = element;\n this.schema = schema;\n this.delegate = delegate;\n this.valueListObserver = new ValueListObserver(this.element, this.controllerAttribute, this);\n this.scopesByIdentifierByElement = new WeakMap();\n this.scopeReferenceCounts = new WeakMap();\n }\n start() {\n this.valueListObserver.start();\n }\n stop() {\n this.valueListObserver.stop();\n }\n get controllerAttribute() {\n return this.schema.controllerAttribute;\n }\n parseValueForToken(token) {\n const { element, content: identifier } = token;\n const scopesByIdentifier = this.fetchScopesByIdentifierForElement(element);\n let scope = scopesByIdentifier.get(identifier);\n if (!scope) {\n scope = this.delegate.createScopeForElementAndIdentifier(element, identifier);\n scopesByIdentifier.set(identifier, scope);\n }\n return scope;\n }\n elementMatchedValue(element, value) {\n const referenceCount = (this.scopeReferenceCounts.get(value) || 0) + 1;\n this.scopeReferenceCounts.set(value, referenceCount);\n if (referenceCount == 1) {\n this.delegate.scopeConnected(value);\n }\n }\n elementUnmatchedValue(element, value) {\n const referenceCount = this.scopeReferenceCounts.get(value);\n if (referenceCount) {\n this.scopeReferenceCounts.set(value, referenceCount - 1);\n if (referenceCount == 1) {\n this.delegate.scopeDisconnected(value);\n }\n }\n }\n fetchScopesByIdentifierForElement(element) {\n let scopesByIdentifier = this.scopesByIdentifierByElement.get(element);\n if (!scopesByIdentifier) {\n scopesByIdentifier = new Map();\n this.scopesByIdentifierByElement.set(element, scopesByIdentifier);\n }\n return scopesByIdentifier;\n }\n}\n\nclass Router {\n constructor(application) {\n this.application = application;\n this.scopeObserver = new ScopeObserver(this.element, this.schema, this);\n this.scopesByIdentifier = new Multimap();\n this.modulesByIdentifier = new Map();\n }\n get element() {\n return this.application.element;\n }\n get schema() {\n return this.application.schema;\n }\n get logger() {\n return this.application.logger;\n }\n get controllerAttribute() {\n return this.schema.controllerAttribute;\n }\n get modules() {\n return Array.from(this.modulesByIdentifier.values());\n }\n get contexts() {\n return this.modules.reduce((contexts, module) => contexts.concat(module.contexts), []);\n }\n start() {\n this.scopeObserver.start();\n }\n stop() {\n this.scopeObserver.stop();\n }\n loadDefinition(definition) {\n this.unloadIdentifier(definition.identifier);\n const module = new Module(this.application, definition);\n this.connectModule(module);\n }\n unloadIdentifier(identifier) {\n const module = this.modulesByIdentifier.get(identifier);\n if (module) {\n this.disconnectModule(module);\n }\n }\n getContextForElementAndIdentifier(element, identifier) {\n const module = this.modulesByIdentifier.get(identifier);\n if (module) {\n return module.contexts.find((context) => context.element == element);\n }\n }\n handleError(error, message, detail) {\n this.application.handleError(error, message, detail);\n }\n createScopeForElementAndIdentifier(element, identifier) {\n return new Scope(this.schema, element, identifier, this.logger);\n }\n scopeConnected(scope) {\n this.scopesByIdentifier.add(scope.identifier, scope);\n const module = this.modulesByIdentifier.get(scope.identifier);\n if (module) {\n module.connectContextForScope(scope);\n }\n }\n scopeDisconnected(scope) {\n this.scopesByIdentifier.delete(scope.identifier, scope);\n const module = this.modulesByIdentifier.get(scope.identifier);\n if (module) {\n module.disconnectContextForScope(scope);\n }\n }\n connectModule(module) {\n this.modulesByIdentifier.set(module.identifier, module);\n const scopes = this.scopesByIdentifier.getValuesForKey(module.identifier);\n scopes.forEach((scope) => module.connectContextForScope(scope));\n }\n disconnectModule(module) {\n this.modulesByIdentifier.delete(module.identifier);\n const scopes = this.scopesByIdentifier.getValuesForKey(module.identifier);\n scopes.forEach((scope) => module.disconnectContextForScope(scope));\n }\n}\n\nconst defaultSchema = {\n controllerAttribute: \"data-controller\",\n actionAttribute: \"data-action\",\n targetAttribute: \"data-target\",\n targetAttributeForScope: (identifier) => `data-${identifier}-target`,\n};\n\nclass Application {\n constructor(element = document.documentElement, schema = defaultSchema) {\n this.logger = console;\n this.debug = false;\n this.logDebugActivity = (identifier, functionName, detail = {}) => {\n if (this.debug) {\n this.logFormattedMessage(identifier, functionName, detail);\n }\n };\n this.element = element;\n this.schema = schema;\n this.dispatcher = new Dispatcher(this);\n this.router = new Router(this);\n this.actionDescriptorFilters = Object.assign({}, defaultActionDescriptorFilters);\n }\n static start(element, schema) {\n const application = new Application(element, schema);\n application.start();\n return application;\n }\n async start() {\n await domReady();\n this.logDebugActivity(\"application\", \"starting\");\n this.dispatcher.start();\n this.router.start();\n this.logDebugActivity(\"application\", \"start\");\n }\n stop() {\n this.logDebugActivity(\"application\", \"stopping\");\n this.dispatcher.stop();\n this.router.stop();\n this.logDebugActivity(\"application\", \"stop\");\n }\n register(identifier, controllerConstructor) {\n this.load({ identifier, controllerConstructor });\n }\n registerActionOption(name, filter) {\n this.actionDescriptorFilters[name] = filter;\n }\n load(head, ...rest) {\n const definitions = Array.isArray(head) ? head : [head, ...rest];\n definitions.forEach((definition) => {\n if (definition.controllerConstructor.shouldLoad) {\n this.router.loadDefinition(definition);\n }\n });\n }\n unload(head, ...rest) {\n const identifiers = Array.isArray(head) ? head : [head, ...rest];\n identifiers.forEach((identifier) => this.router.unloadIdentifier(identifier));\n }\n get controllers() {\n return this.router.contexts.map((context) => context.controller);\n }\n getControllerForElementAndIdentifier(element, identifier) {\n const context = this.router.getContextForElementAndIdentifier(element, identifier);\n return context ? context.controller : null;\n }\n handleError(error, message, detail) {\n var _a;\n this.logger.error(`%s\\n\\n%o\\n\\n%o`, message, error, detail);\n (_a = window.onerror) === null || _a === void 0 ? void 0 : _a.call(window, message, \"\", 0, 0, error);\n }\n logFormattedMessage(identifier, functionName, detail = {}) {\n detail = Object.assign({ application: this }, detail);\n this.logger.groupCollapsed(`${identifier} #${functionName}`);\n this.logger.log(\"details:\", Object.assign({}, detail));\n this.logger.groupEnd();\n }\n}\nfunction domReady() {\n return new Promise((resolve) => {\n if (document.readyState == \"loading\") {\n document.addEventListener(\"DOMContentLoaded\", () => resolve());\n }\n else {\n resolve();\n }\n });\n}\n\nfunction ClassPropertiesBlessing(constructor) {\n const classes = readInheritableStaticArrayValues(constructor, \"classes\");\n return classes.reduce((properties, classDefinition) => {\n return Object.assign(properties, propertiesForClassDefinition(classDefinition));\n }, {});\n}\nfunction propertiesForClassDefinition(key) {\n return {\n [`${key}Class`]: {\n get() {\n const { classes } = this;\n if (classes.has(key)) {\n return classes.get(key);\n }\n else {\n const attribute = classes.getAttributeName(key);\n throw new Error(`Missing attribute \"${attribute}\"`);\n }\n },\n },\n [`${key}Classes`]: {\n get() {\n return this.classes.getAll(key);\n },\n },\n [`has${capitalize(key)}Class`]: {\n get() {\n return this.classes.has(key);\n },\n },\n };\n}\n\nfunction TargetPropertiesBlessing(constructor) {\n const targets = readInheritableStaticArrayValues(constructor, \"targets\");\n return targets.reduce((properties, targetDefinition) => {\n return Object.assign(properties, propertiesForTargetDefinition(targetDefinition));\n }, {});\n}\nfunction propertiesForTargetDefinition(name) {\n return {\n [`${name}Target`]: {\n get() {\n const target = this.targets.find(name);\n if (target) {\n return target;\n }\n else {\n throw new Error(`Missing target element \"${name}\" for \"${this.identifier}\" controller`);\n }\n },\n },\n [`${name}Targets`]: {\n get() {\n return this.targets.findAll(name);\n },\n },\n [`has${capitalize(name)}Target`]: {\n get() {\n return this.targets.has(name);\n },\n },\n };\n}\n\nfunction ValuePropertiesBlessing(constructor) {\n const valueDefinitionPairs = readInheritableStaticObjectPairs(constructor, \"values\");\n const propertyDescriptorMap = {\n valueDescriptorMap: {\n get() {\n return valueDefinitionPairs.reduce((result, valueDefinitionPair) => {\n const valueDescriptor = parseValueDefinitionPair(valueDefinitionPair, this.identifier);\n const attributeName = this.data.getAttributeNameForKey(valueDescriptor.key);\n return Object.assign(result, { [attributeName]: valueDescriptor });\n }, {});\n },\n },\n };\n return valueDefinitionPairs.reduce((properties, valueDefinitionPair) => {\n return Object.assign(properties, propertiesForValueDefinitionPair(valueDefinitionPair));\n }, propertyDescriptorMap);\n}\nfunction propertiesForValueDefinitionPair(valueDefinitionPair, controller) {\n const definition = parseValueDefinitionPair(valueDefinitionPair, controller);\n const { key, name, reader: read, writer: write } = definition;\n return {\n [name]: {\n get() {\n const value = this.data.get(key);\n if (value !== null) {\n return read(value);\n }\n else {\n return definition.defaultValue;\n }\n },\n set(value) {\n if (value === undefined) {\n this.data.delete(key);\n }\n else {\n this.data.set(key, write(value));\n }\n },\n },\n [`has${capitalize(name)}`]: {\n get() {\n return this.data.has(key) || definition.hasCustomDefaultValue;\n },\n },\n };\n}\nfunction parseValueDefinitionPair([token, typeDefinition], controller) {\n return valueDescriptorForTokenAndTypeDefinition({\n controller,\n token,\n typeDefinition,\n });\n}\nfunction parseValueTypeConstant(constant) {\n switch (constant) {\n case Array:\n return \"array\";\n case Boolean:\n return \"boolean\";\n case Number:\n return \"number\";\n case Object:\n return \"object\";\n case String:\n return \"string\";\n }\n}\nfunction parseValueTypeDefault(defaultValue) {\n switch (typeof defaultValue) {\n case \"boolean\":\n return \"boolean\";\n case \"number\":\n return \"number\";\n case \"string\":\n return \"string\";\n }\n if (Array.isArray(defaultValue))\n return \"array\";\n if (Object.prototype.toString.call(defaultValue) === \"[object Object]\")\n return \"object\";\n}\nfunction parseValueTypeObject(payload) {\n const typeFromObject = parseValueTypeConstant(payload.typeObject.type);\n if (!typeFromObject)\n return;\n const defaultValueType = parseValueTypeDefault(payload.typeObject.default);\n if (typeFromObject !== defaultValueType) {\n const propertyPath = payload.controller ? `${payload.controller}.${payload.token}` : payload.token;\n throw new Error(`The specified default value for the Stimulus Value \"${propertyPath}\" must match the defined type \"${typeFromObject}\". The provided default value of \"${payload.typeObject.default}\" is of type \"${defaultValueType}\".`);\n }\n return typeFromObject;\n}\nfunction parseValueTypeDefinition(payload) {\n const typeFromObject = parseValueTypeObject({\n controller: payload.controller,\n token: payload.token,\n typeObject: payload.typeDefinition,\n });\n const typeFromDefaultValue = parseValueTypeDefault(payload.typeDefinition);\n const typeFromConstant = parseValueTypeConstant(payload.typeDefinition);\n const type = typeFromObject || typeFromDefaultValue || typeFromConstant;\n if (type)\n return type;\n const propertyPath = payload.controller ? `${payload.controller}.${payload.typeDefinition}` : payload.token;\n throw new Error(`Unknown value type \"${propertyPath}\" for \"${payload.token}\" value`);\n}\nfunction defaultValueForDefinition(typeDefinition) {\n const constant = parseValueTypeConstant(typeDefinition);\n if (constant)\n return defaultValuesByType[constant];\n const defaultValue = typeDefinition.default;\n if (defaultValue !== undefined)\n return defaultValue;\n return typeDefinition;\n}\nfunction valueDescriptorForTokenAndTypeDefinition(payload) {\n const key = `${dasherize(payload.token)}-value`;\n const type = parseValueTypeDefinition(payload);\n return {\n type,\n key,\n name: camelize(key),\n get defaultValue() {\n return defaultValueForDefinition(payload.typeDefinition);\n },\n get hasCustomDefaultValue() {\n return parseValueTypeDefault(payload.typeDefinition) !== undefined;\n },\n reader: readers[type],\n writer: writers[type] || writers.default,\n };\n}\nconst defaultValuesByType = {\n get array() {\n return [];\n },\n boolean: false,\n number: 0,\n get object() {\n return {};\n },\n string: \"\",\n};\nconst readers = {\n array(value) {\n const array = JSON.parse(value);\n if (!Array.isArray(array)) {\n throw new TypeError(`expected value of type \"array\" but instead got value \"${value}\" of type \"${parseValueTypeDefault(array)}\"`);\n }\n return array;\n },\n boolean(value) {\n return !(value == \"0\" || String(value).toLowerCase() == \"false\");\n },\n number(value) {\n return Number(value);\n },\n object(value) {\n const object = JSON.parse(value);\n if (object === null || typeof object != \"object\" || Array.isArray(object)) {\n throw new TypeError(`expected value of type \"object\" but instead got value \"${value}\" of type \"${parseValueTypeDefault(object)}\"`);\n }\n return object;\n },\n string(value) {\n return value;\n },\n};\nconst writers = {\n default: writeString,\n array: writeJSON,\n object: writeJSON,\n};\nfunction writeJSON(value) {\n return JSON.stringify(value);\n}\nfunction writeString(value) {\n return `${value}`;\n}\n\nclass Controller {\n constructor(context) {\n this.context = context;\n }\n static get shouldLoad() {\n return true;\n }\n get application() {\n return this.context.application;\n }\n get scope() {\n return this.context.scope;\n }\n get element() {\n return this.scope.element;\n }\n get identifier() {\n return this.scope.identifier;\n }\n get targets() {\n return this.scope.targets;\n }\n get classes() {\n return this.scope.classes;\n }\n get data() {\n return this.scope.data;\n }\n initialize() {\n }\n connect() {\n }\n disconnect() {\n }\n dispatch(eventName, { target = this.element, detail = {}, prefix = this.identifier, bubbles = true, cancelable = true } = {}) {\n const type = prefix ? `${prefix}:${eventName}` : eventName;\n const event = new CustomEvent(type, { detail, bubbles, cancelable });\n target.dispatchEvent(event);\n return event;\n }\n}\nController.blessings = [ClassPropertiesBlessing, TargetPropertiesBlessing, ValuePropertiesBlessing];\nController.targets = [];\nController.values = {};\n\nexport { Application, AttributeObserver, Context, Controller, ElementObserver, IndexedMultimap, Multimap, StringMapObserver, TokenListObserver, ValueListObserver, add, defaultSchema, del, fetch, prune };\n", "import {Controller} from \"@hotwired/stimulus\"\nimport confetti from \"canvas-confetti\"\n\nconst inlineStylesFormObject = (styles = {}) => {\n const resultAsArray = Object.keys(styles).map((property) => {\n const value = styles[property]\n\n return `${property}:${value}`\n })\n\n return resultAsArray.join(\";\")\n}\n\nclass Confetti extends Controller {\n static targets = [\"element\"]\n static values = {\n follow: {\n type: Boolean,\n default: true\n },\n\n // Type of animation basic|school-pride|stars\n animation: {\n type: String,\n default: 'basic'\n },\n\n duration: {\n type: Number,\n default: 5 // number of seconds\n },\n\n firstColor: {\n type: String,\n default: \"#0886DE\"\n },\n\n secondColor: {\n type: String,\n default: \"#FF6154\"\n },\n\n particleCount: {\n type: Number,\n default: 100\n },\n startVelocity: {\n type: Number,\n default: 20\n },\n spread: {\n type: Number,\n default: 360\n },\n ticks: {\n type: Number,\n default: 90\n },\n\n debug: {\n type: Boolean,\n default: false\n }\n }\n\n clicked = false\n canvasElement = null\n\n get canvas() {\n if (this.canvasElement) {\n return this.canvasElement\n }\n\n // Create a canvas as big as the screen and make it fixed and ontop of everything\n const myCanvas = document.createElement(\"canvas\")\n myCanvas.style.cssText = inlineStylesFormObject({\n position: \"fixed\",\n top: 0,\n right: 0,\n bottom: 0,\n left: 0,\n width: \"100%\",\n height: \"100%\",\n \"pointer-events\": \"none\",\n \"z-index\": \"9999\",\n })\n\n // Add it to the DOM\n document.body.appendChild(myCanvas)\n\n // Cache it\n this.canvasElement = myCanvas\n\n return this.canvasElement\n }\n\n get instance() {\n return confetti.create(this.canvas, {\n resize: true,\n useWorker: true,\n })\n }\n\n spray(e) {\n e.preventDefault()\n\n this.log(\"Spraying\")\n\n this.getStyle(e).then(() => {\n this.log(\"Finished animation\")\n if (this.followValue) {\n // Actually follow the link\n if (this.clicked === false) {\n this.followLink()\n }\n\n this.clicked = true\n }\n })\n }\n\n getStyle(e) {\n switch (this.animationValue) {\n case 'basic':\n default:\n return this.basic(e)\n case 'school-pride':\n return this.schoolPride(e)\n case 'stars':\n return this.stars(e)\n }\n }\n\n basic(e) {\n this.log(\"Basic started\")\n\n return this.instance({\n particleCount: this.particleCountValue,\n startVelocity: this.startVelocityValue,\n spread: this.spreadValue,\n ticks: this.ticksValue,\n origin: {\n x: e.clientX / window.innerWidth,\n y: e.clientY / window.innerHeight,\n },\n })\n }\n\n stars(e) {\n this.log(\"Stars started\")\n\n var defaults = {\n spread: this.spreadValue,\n ticks: 50,\n gravity: 0,\n decay: 0.94,\n startVelocity: this.startVelocityValue,\n shapes: ['star'],\n colors: ['FFE400', 'FFBD00', 'E89400', 'FFCA6C', 'FDFFB8'],\n origin: {\n x: e.clientX / window.innerWidth,\n y: e.clientY / window.innerHeight,\n },\n };\n\n return new Promise((resolve) => {\n setTimeout(() => {\n this.instance({\n ...defaults,\n particleCount: this.particleCountValue,\n // scalar: 1.2,\n shapes: ['star']\n });\n }, 70);\n\n this.instance({\n ...defaults,\n particleCount: this.particleCountValue,\n // scalar: 0.75,\n shapes: ['star']\n }).then(() => {\n this.log(\"Stars ended\")\n resolve()\n });\n })\n }\n\n schoolPride(e) {\n this.log(\"School pride started\")\n return new Promise((resolve) => {\n var end = Date.now() + (this.durationValue * 1000);\n // go Buckeyes!\n var colors = [this.firstColorValue, this.secondColorValue];\n const vm = this;\n\n (function frame() {\n vm.instance({\n particleCount: 2,\n angle: 60,\n spread: 55,\n origin: { x: 0 },\n colors: colors\n });\n vm.instance({\n particleCount: 2,\n angle: 120,\n spread: 55,\n origin: { x: 1 },\n colors: colors\n });\n\n if (Date.now() < end) {\n requestAnimationFrame(frame);\n } else {\n vm.log(\"School pride ended\")\n resolve()\n }\n })();\n })\n }\n\n followLink() {\n this.log(\"Following link\")\n // Create a link\n const link = document.createElement(\"a\")\n link.style.cssText = inlineStylesFormObject({\n opacity:0,\n display: \"hidden\"\n })\n link.href = this.context.element.href\n link.target = this.context.element.target\n // Add it to the DOM\n document.body.appendChild(link)\n // Click it\n link.click()\n this.log(\"Followed link\")\n\n // Mark it as clicked and reset the state\n setTimeout(() => {\n this.log(\"Reset state\")\n this.clicked = false\n }, 1);\n }\n\n log(message) {\n if (this.debugValue) {\n console.log(`[Stimulus confetti] ${message}`)\n }\n }\n}\n\nexport { Confetti }", "console.log('hi from confsmith')\n\n// We're importing Confetti and doing a console log here just to make sure it's bundling the package in app/assets/builds/confsmith.js\nimport { Confetti } from \"stimulus-confetti\"\nconsole.log(Confetti)\n\n// demo of the top-level async\nconst t = async function() {\n console.log('t')\n}\n\nawait t()"],
5
+ "mappings": "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",
6
+ "names": ["module", "e", "worker", "fettis", "camelize", "value", "replace", "_", "char", "toUpperCase", "capitalize", "charAt", "slice", "readInheritableStaticArrayValues", "constructor", "propertyName", "ancestors", "getAncestorsForConstructor", "Array", "from", "reduce", "values", "definition", "isArray", "forEach", "name", "add", "Set", "push", "Object", "getPrototypeOf", "reverse", "parseValueDefinitionPair", "token", "typeDefinition", "controller", "payload", "key", "toLowerCase", "type", "typeFromObject", "parseValueTypeConstant", "typeObject", "defaultValueType", "parseValueTypeDefault", "default", "Error", "typeFromDefaultValue", "typeFromConstant", "defaultValue", "constant", "defaultValuesByType", "hasCustomDefaultValue", "reader", "readers", "writer", "writers", "Boolean", "Number", "String", "prototype", "toString", "call", "b", "extended", "Reflect", "construct", "arguments", "create", "setPrototypeOf", "this", "a", "testReflectExtension", "error", "array", "boolean", "number", "object", "string", "JSON", "parse", "TypeError", "writeJSON", "stringify", "Controller", "context", "shouldLoad", "application", "scope", "element", "identifier", "targets", "classes", "data", "initialize", "connect", "disconnect", "dispatch", "eventName", "target", "detail", "prefix", "bubbles", "cancelable", "event", "CustomEvent", "dispatchEvent", "blessings", "properties", "classDefinition", "assign", "get", "has", "attribute", "getAttributeName", "getAll", "targetDefinition", "find", "findAll", "valueDefinitionPairs", "pairs", "keys", "map", "propertyDescriptorMap", "valueDescriptorMap", "result", "valueDefinitionPair", "valueDescriptor", "attributeName", "getAttributeNameForKey", "propertiesForValueDefinitionPair", "read", "write", "set", "delete", "inlineStylesFormObject", "styles", "property", "join", "Confetti", "clicked", "canvasElement", "canvas", "myCanvas", "document", "createElement", "style", "cssText", "position", "top", "right", "bottom", "left", "width", "height", "body", "appendChild", "instance", "confetti", "resize", "useWorker", "spray", "e", "preventDefault", "log", "getStyle", "then", "followValue", "followLink", "animationValue", "basic", "schoolPride", "stars", "particleCount", "particleCountValue", "startVelocity", "startVelocityValue", "spread", "spreadValue", "ticks", "ticksValue", "origin", "x", "clientX", "window", "innerWidth", "y", "clientY", "innerHeight", "r", "gravity", "decay", "shapes", "colors", "Promise", "resolve", "setTimeout", "defaults", "end", "Date", "now", "durationValue", "firstColorValue", "secondColorValue", "n", "frame", "vm", "angle", "requestAnimationFrame", "link", "opacity", "display", "href", "click", "message", "debugValue", "console", "follow", "animation", "duration", "firstColor", "secondColor", "debug"]
7
+ }
@@ -0,0 +1,15 @@
1
+ /*
2
+ * This is a manifest file that'll be compiled into application.css, which will include all the files
3
+ * listed below.
4
+ *
5
+ * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
6
+ * or any plugin's vendor/assets/stylesheets directory can be referenced here using a relative path.
7
+ *
8
+ * You're free to add application-wide styles to this file and they'll appear at the bottom of the
9
+ * compiled file so the styles you add here take precedence over styles defined in any other CSS/SCSS
10
+ * files in this directory. Styles in this file should be added after the last require_* statement.
11
+ * It is generally better to create a new file per style scope.
12
+ *
13
+ *= require_tree .
14
+ *= require_self
15
+ */
@@ -0,0 +1,4 @@
1
+ module Confsmith
2
+ class ApplicationController < ActionController::Base
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module Confsmith
2
+ module ApplicationHelper
3
+ end
4
+ end
@@ -0,0 +1,12 @@
1
+ console.log('hi from confsmith')
2
+
3
+ // We're importing Confetti and doing a console log here just to make sure it's bundling the package in app/assets/builds/confsmith.js
4
+ import { Confetti } from "stimulus-confetti"
5
+ console.log(Confetti)
6
+
7
+ // demo of the top-level async
8
+ const t = async function() {
9
+ console.log('t')
10
+ }
11
+
12
+ await t()
@@ -0,0 +1,4 @@
1
+ module Confsmith
2
+ class ApplicationJob < ActiveJob::Base
3
+ end
4
+ end
@@ -0,0 +1,6 @@
1
+ module Confsmith
2
+ class ApplicationMailer < ActionMailer::Base
3
+ default from: "from@example.com"
4
+ layout "mailer"
5
+ end
6
+ end
@@ -0,0 +1,5 @@
1
+ module Confsmith
2
+ class ApplicationRecord < ActiveRecord::Base
3
+ self.abstract_class = true
4
+ end
5
+ end
@@ -0,0 +1 @@
1
+ <%= textarea_tag :markdown %>
@@ -0,0 +1,17 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>Confsmith</title>
5
+ <%= csrf_meta_tags %>
6
+ <%= csp_meta_tag %>
7
+
8
+ <%= yield :head %>
9
+
10
+ <%= stylesheet_link_tag "confsmith/application", media: "all" %>
11
+ </head>
12
+ <body>
13
+
14
+ <%= yield %>
15
+
16
+ </body>
17
+ </html>
@@ -0,0 +1,3 @@
1
+ pin "confsmith"
2
+ pin "stimulus-confetti" # @1.0.1
3
+ pin "canvas-confetti" # @1.9.3
data/config/routes.rb ADDED
@@ -0,0 +1,2 @@
1
+ Confsmith::Engine.routes.draw do
2
+ end
@@ -0,0 +1,21 @@
1
+ module Confsmith
2
+ class Engine < ::Rails::Engine
3
+ isolate_namespace Confsmith
4
+
5
+ # Add our own importmap config to the main app
6
+ initializer "confsmith.importmap", before: "importmap" do |app|
7
+ if Rails.application.respond_to?(:importmap)
8
+ app.config.importmap.paths << Engine.root.join("config/importmap.rb")
9
+ end
10
+ end
11
+
12
+ # removed after we added bundling to the engine
13
+ # # Add our the javascript directory to the assets path
14
+ # initializer "confsmith.assets.precompile" do |app|
15
+ # if Rails.application.config.respond_to?(:assets)
16
+ # app.config.assets.paths << Engine.root.join("app/javascript/").to_s
17
+ # app.config.assets.paths << Engine.root.join("vendor/javascript/").to_s
18
+ # end
19
+ # end
20
+ end
21
+ end
@@ -0,0 +1,3 @@
1
+ module Confsmith
2
+ VERSION = "0.1.0"
3
+ end
data/lib/confsmith.rb ADDED
@@ -0,0 +1,6 @@
1
+ require "confsmith/version"
2
+ require "confsmith/engine"
3
+
4
+ module Confsmith
5
+ # Your code goes here...
6
+ end
@@ -0,0 +1,4 @@
1
+ # desc "Explaining what the task does"
2
+ # task :confsmith do
3
+ # # Task goes here
4
+ # end
metadata ADDED
@@ -0,0 +1,82 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: confsmith
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Adrian
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2025-07-03 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rails
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 8.0.2
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 8.0.2
27
+ description: Confsmith is a dummy Rails plugin that shows how to register assets using
28
+ the various methods available today.
29
+ email:
30
+ - adrian@adrianthedev.com
31
+ executables: []
32
+ extensions: []
33
+ extra_rdoc_files: []
34
+ files:
35
+ - MIT-LICENSE
36
+ - README.md
37
+ - Rakefile
38
+ - app/assets/builds/confsmith.js
39
+ - app/assets/builds/confsmith.js.map
40
+ - app/assets/stylesheets/confsmith/application.css
41
+ - app/controllers/confsmith/application_controller.rb
42
+ - app/helpers/confsmith/application_helper.rb
43
+ - app/javascript/confsmith.js
44
+ - app/jobs/confsmith/application_job.rb
45
+ - app/mailers/confsmith/application_mailer.rb
46
+ - app/models/confsmith/application_record.rb
47
+ - app/views/confsmith/_editor.html.erb
48
+ - app/views/layouts/confsmith/application.html.erb
49
+ - config/importmap.rb
50
+ - config/routes.rb
51
+ - lib/confsmith.rb
52
+ - lib/confsmith/engine.rb
53
+ - lib/confsmith/version.rb
54
+ - lib/tasks/confsmith_tasks.rake
55
+ homepage: https://github.com/avo-hq/confsmith
56
+ licenses:
57
+ - MIT
58
+ metadata:
59
+ homepage_uri: https://github.com/avo-hq/confsmith
60
+ source_code_uri: https://github.com/avo-hq/confsmith
61
+ changelog_uri: https://github.com/avo-hq/confsmith
62
+ post_install_message:
63
+ rdoc_options: []
64
+ require_paths:
65
+ - lib
66
+ required_ruby_version: !ruby/object:Gem::Requirement
67
+ requirements:
68
+ - - ">="
69
+ - !ruby/object:Gem::Version
70
+ version: '0'
71
+ required_rubygems_version: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ requirements: []
77
+ rubygems_version: 3.5.9
78
+ signing_key:
79
+ specification_version: 4
80
+ summary: Confsmith is a dummy Rails plugin that shows how to register assets using
81
+ the various methods available today.
82
+ test_files: []