@unabridged/midwest 0.16.1 → 0.17.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 @@
1
+ {"version":3,"file":"color_thief.js","sources":["../../../../../../../app/components/midwest/image_component/color_thief.ts"],"sourcesContent":["//@ts-nocheck\n/*\n * Color Thief v2.0\n * by Lokesh Dhakar - http://www.lokeshdhakar.com\n *\n * Thanks\n * ------\n * Nick Rabinowitz - For creating quantize.js.\n * John Schulz - For clean up and optimization. @JFSIII\n * Nathan Spady - For adding drag and drop support to the demo page.\n *\n * License\n * -------\n * Copyright 2011, 2015 Lokesh Dhakar\n * Released under the MIT license\n * https://raw.githubusercontent.com/lokesh/color-thief/master/LICENSE\n *\n * @license\n */\n\n\n/*\n CanvasImage Class\n Class that wraps the html image element and canvas.\n It also simplifies some of the canvas context manipulation\n with a set of helper functions.\n*/\nconst CanvasImage = function (image) {\n this.canvas = document.createElement('canvas');\n this.context = this.canvas.getContext('2d');\n\n document.body.appendChild(this.canvas);\n\n this.width = this.canvas.width = image.width;\n this.height = this.canvas.height = image.height;\n\n this.context.drawImage(image, 0, 0, this.width, this.height);\n};\n\nCanvasImage.prototype.clear = function () {\n this.context.clearRect(0, 0, this.width, this.height);\n};\n\nCanvasImage.prototype.update = function (imageData) {\n this.context.putImageData(imageData, 0, 0);\n};\n\nCanvasImage.prototype.getPixelCount = function () {\n return this.width * this.height;\n};\n\nCanvasImage.prototype.getImageData = function () {\n return this.context.getImageData(0, 0, this.width, this.height);\n};\n\nCanvasImage.prototype.removeCanvas = function () {\n this.canvas.parentNode.removeChild(this.canvas);\n};\n\n\nconst ColorThief = function () { };\n\n/*\n * getColor(sourceImage[, quality])\n * returns {r: num, g: num, b: num}\n *\n * Use the median cut algorithm provided by quantize.js to cluster similar\n * colors and return the base color from the largest cluster.\n *\n * Quality is an optional argument. It needs to be an integer. 1 is the highest quality settings.\n * 10 is the default. There is a trade-off between quality and speed. The bigger the number, the\n * faster a color will be returned but the greater the likelihood that it will not be the visually\n * most dominant color.\n *\n * */\nColorThief.prototype.getColor = function (sourceImage, quality) {\n const palette = this.getPalette(sourceImage, 5, quality);\n const dominantColor = palette[0];\n return dominantColor;\n};\n\n\n/*\n * getPalette(sourceImage[, colorCount, quality])\n * returns array[ {r: num, g: num, b: num}, {r: num, g: num, b: num}, ...]\n *\n * Use the median cut algorithm provided by quantize.js to cluster similar colors.\n *\n * colorCount determines the size of the palette; the number of colors returned. If not set, it\n * defaults to 10.\n *\n * BUGGY: Function does not always return the requested amount of colors. It can be +/- 2.\n *\n * quality is an optional argument. It needs to be an integer. 1 is the highest quality settings.\n * 10 is the default. There is a trade-off between quality and speed. The bigger the number, the\n * faster the palette generation but the greater the likelihood that colors will be missed.\n *\n *\n */\nColorThief.prototype.getPalette = function (sourceImage, colorCount, quality) {\n\n if (typeof colorCount === 'undefined' || colorCount < 2 || colorCount > 256) {\n colorCount = 10;\n }\n if (typeof quality === 'undefined' || quality < 1) {\n quality = 10;\n }\n\n // Create custom CanvasImage object\n const image = new CanvasImage(sourceImage);\n const imageData = image.getImageData();\n const pixels = imageData.data;\n const pixelCount = image.getPixelCount();\n\n // Store the RGB values in an array format suitable for quantize function\n const pixelArray = [];\n for (var i = 0, offset, r, g, b, a; i < pixelCount; i = i + quality) {\n offset = i * 4;\n r = pixels[offset + 0];\n g = pixels[offset + 1];\n b = pixels[offset + 2];\n a = pixels[offset + 3];\n // If pixel is mostly opaque and not white\n if (a >= 125) {\n if (!(r > 250 && g > 250 && b > 250)) {\n pixelArray.push([r, g, b]);\n }\n }\n }\n\n // Send array to quantize function which clusters values\n // using median cut algorithm\n const cmap = MMCQ.quantize(pixelArray, colorCount);\n const palette = cmap ? cmap.palette() : null;\n\n // Clean up\n image.removeCanvas();\n\n return palette;\n};\n\nColorThief.prototype.getColorFromUrl = function (imageUrl, callback, quality) {\n sourceImage = document.createElement(\"img\");\n const thief = this;\n sourceImage.addEventListener('load', function () {\n const palette = thief.getPalette(sourceImage, 5, quality);\n const dominantColor = palette[0];\n callback(dominantColor, imageUrl);\n });\n sourceImage.src = imageUrl\n};\n\n\nColorThief.prototype.getImageData = function (imageUrl, callback) {\n xhr = new XMLHttpRequest();\n xhr.open('GET', imageUrl, true);\n xhr.responseType = 'arraybuffer'\n xhr.onload = function (e) {\n if (this.status == 200) {\n uInt8Array = new Uint8Array(this.response)\n i = uInt8Array.length\n binaryString = new Array(i);\n for (var i = 0; i < uInt8Array.length; i++) {\n binaryString[i] = String.fromCharCode(uInt8Array[i])\n }\n data = binaryString.join('')\n base64 = window.btoa(data)\n callback(\"data:image/png;base64,\" + base64)\n }\n }\n xhr.send();\n};\n\nColorThief.prototype.getColorAsync = function (imageUrl, callback, quality) {\n const thief = this;\n this.getImageData(imageUrl, function (imageData) {\n sourceImage = document.createElement(\"img\");\n sourceImage.addEventListener('load', function () {\n const palette = thief.getPalette(sourceImage, 5, quality);\n const dominantColor = palette[0];\n callback(dominantColor, this);\n });\n sourceImage.src = imageData;\n });\n};\n\n\n\n/*!\n * quantize.js Copyright 2008 Nick Rabinowitz.\n * Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php\n * @license\n */\n\n// fill out a couple protovis dependencies\n/*!\n * Block below copied from Protovis: http://mbostock.github.com/protovis/\n * Copyright 2010 Stanford Visualization Group\n * Licensed under the BSD License: http://www.opensource.org/licenses/bsd-license.php\n * @license\n */\nif (!pv) {\n var pv = {\n map: function (array, f) {\n const o = {};\n return f ? array.map(function (d, i) { o.index = i; return f.call(o, d); }) : array.slice();\n },\n naturalOrder: function (a, b) {\n return (a < b) ? -1 : ((a > b) ? 1 : 0);\n },\n sum: function (array, f) {\n const o = {};\n return array.reduce(f ? function (p, d, i) { o.index = i; return p + f.call(o, d); } : function (p, d) { return p + d; }, 0);\n },\n max: function (array, f) {\n return Math.max.apply(null, f ? pv.map(array, f) : array);\n }\n };\n}\n\n\n\n/**\n * Basic Javascript port of the MMCQ (modified median cut quantization)\n * algorithm from the Leptonica library (http://www.leptonica.com/).\n * Returns a color map you can use to map original pixels to the reduced\n * palette. Still a work in progress.\n *\n * @author Nick Rabinowitz\n * @example\n\n// array of pixels as [R,G,B] arrays\nvar myPixels = [[190,197,190], [202,204,200], [207,214,210], [211,214,211], [205,207,207]\n // etc\n ];\nvar maxColors = 4;\n\nvar cmap = MMCQ.quantize(myPixels, maxColors);\nvar newPalette = cmap.palette();\nvar newPixels = myPixels.map(function(p) {\n return cmap.map(p);\n});\n\n */\nvar MMCQ = (function () {\n // private constants\n const sigbits = 5,\n rshift = 8 - sigbits,\n maxIterations = 1000,\n fractByPopulations = 0.75;\n\n // get reduced-space color index for a pixel\n function getColorIndex(r, g, b) {\n return (r << (2 * sigbits)) + (g << sigbits) + b;\n }\n\n // Simple priority queue\n function PQueue(comparator) {\n let contents = [],\n sorted = false;\n\n function sort() {\n contents.sort(comparator);\n sorted = true;\n }\n\n return {\n push: function (o) {\n contents.push(o);\n sorted = false;\n },\n peek: function (index) {\n if (!sorted) sort();\n if (index === undefined) index = contents.length - 1;\n return contents[index];\n },\n pop: function () {\n if (!sorted) sort();\n return contents.pop();\n },\n size: function () {\n return contents.length;\n },\n map: function (f) {\n return contents.map(f);\n },\n debug: function () {\n if (!sorted) sort();\n return contents;\n }\n };\n }\n\n // 3d color space box\n function VBox(r1, r2, g1, g2, b1, b2, histo) {\n const vbox = this;\n vbox.r1 = r1;\n vbox.r2 = r2;\n vbox.g1 = g1;\n vbox.g2 = g2;\n vbox.b1 = b1;\n vbox.b2 = b2;\n vbox.histo = histo;\n }\n VBox.prototype = {\n volume: function (force) {\n const vbox = this;\n if (!vbox._volume || force) {\n vbox._volume = ((vbox.r2 - vbox.r1 + 1) * (vbox.g2 - vbox.g1 + 1) * (vbox.b2 - vbox.b1 + 1));\n }\n return vbox._volume;\n },\n count: function (force) {\n const vbox = this,\n histo = vbox.histo;\n if (!vbox._count_set || force) {\n let npix = 0,\n index, i, j, k;\n for (i = vbox.r1; i <= vbox.r2; i++) {\n for (j = vbox.g1; j <= vbox.g2; j++) {\n for (k = vbox.b1; k <= vbox.b2; k++) {\n index = getColorIndex(i, j, k);\n npix += (histo[index] || 0);\n }\n }\n }\n vbox._count = npix;\n vbox._count_set = true;\n }\n return vbox._count;\n },\n copy: function () {\n const vbox = this;\n return new VBox(vbox.r1, vbox.r2, vbox.g1, vbox.g2, vbox.b1, vbox.b2, vbox.histo);\n },\n avg: function (force) {\n const vbox = this,\n histo = vbox.histo;\n if (!vbox._avg || force) {\n let ntot = 0,\n mult = 1 << (8 - sigbits),\n rsum = 0,\n gsum = 0,\n bsum = 0,\n hval,\n i, j, k, histoindex;\n for (i = vbox.r1; i <= vbox.r2; i++) {\n for (j = vbox.g1; j <= vbox.g2; j++) {\n for (k = vbox.b1; k <= vbox.b2; k++) {\n histoindex = getColorIndex(i, j, k);\n hval = histo[histoindex] || 0;\n ntot += hval;\n rsum += (hval * (i + 0.5) * mult);\n gsum += (hval * (j + 0.5) * mult);\n bsum += (hval * (k + 0.5) * mult);\n }\n }\n }\n if (ntot) {\n vbox._avg = [~~(rsum / ntot), ~~(gsum / ntot), ~~(bsum / ntot)];\n } else {\n vbox._avg = [\n ~~(mult * (vbox.r1 + vbox.r2 + 1) / 2),\n ~~(mult * (vbox.g1 + vbox.g2 + 1) / 2),\n ~~(mult * (vbox.b1 + vbox.b2 + 1) / 2)\n ];\n }\n }\n return vbox._avg;\n },\n contains: function (pixel) {\n const vbox = this,\n rval = pixel[0] >> rshift;\n gval = pixel[1] >> rshift;\n bval = pixel[2] >> rshift;\n return (rval >= vbox.r1 && rval <= vbox.r2 &&\n gval >= vbox.g1 && gval <= vbox.g2 &&\n bval >= vbox.b1 && bval <= vbox.b2);\n }\n };\n\n // Color map\n function CMap() {\n this.vboxes = new PQueue(function (a, b) {\n return pv.naturalOrder(\n a.vbox.count() * a.vbox.volume(),\n b.vbox.count() * b.vbox.volume()\n );\n });\n }\n CMap.prototype = {\n push: function (vbox) {\n this.vboxes.push({\n vbox: vbox,\n color: vbox.avg()\n });\n },\n palette: function () {\n return this.vboxes.map(function (vb) { return vb.color; });\n },\n size: function () {\n return this.vboxes.size();\n },\n map: function (color) {\n const vboxes = this.vboxes;\n for (let i = 0; i < vboxes.size(); i++) {\n if (vboxes.peek(i).vbox.contains(color)) {\n return vboxes.peek(i).color;\n }\n }\n return this.nearest(color);\n },\n nearest: function (color) {\n let vboxes = this.vboxes,\n d1, d2, pColor;\n for (let i = 0; i < vboxes.size(); i++) {\n d2 = Math.sqrt(\n Math.pow(color[0] - vboxes.peek(i).color[0], 2) +\n Math.pow(color[1] - vboxes.peek(i).color[1], 2) +\n Math.pow(color[2] - vboxes.peek(i).color[2], 2)\n );\n if (d2 < d1 || d1 === undefined) {\n d1 = d2;\n pColor = vboxes.peek(i).color;\n }\n }\n return pColor;\n },\n forcebw: function () {\n // XXX: won't work yet\n const vboxes = this.vboxes;\n vboxes.sort(function (a, b) { return pv.naturalOrder(pv.sum(a.color), pv.sum(b.color)); });\n\n // force darkest color to black if everything < 5\n const lowest = vboxes[0].color;\n if (lowest[0] < 5 && lowest[1] < 5 && lowest[2] < 5)\n vboxes[0].color = [0, 0, 0];\n\n // force lightest color to white if everything > 251\n const idx = vboxes.length - 1,\n highest = vboxes[idx].color;\n if (highest[0] > 251 && highest[1] > 251 && highest[2] > 251)\n vboxes[idx].color = [255, 255, 255];\n }\n };\n\n // histo (1-d array, giving the number of pixels in\n // each quantized region of color space), or null on error\n function getHisto(pixels) {\n let histosize = 1 << (3 * sigbits),\n histo = new Array(histosize),\n index, rval, gval, bval;\n pixels.forEach(function (pixel) {\n rval = pixel[0] >> rshift;\n gval = pixel[1] >> rshift;\n bval = pixel[2] >> rshift;\n index = getColorIndex(rval, gval, bval);\n histo[index] = (histo[index] || 0) + 1;\n });\n return histo;\n }\n\n function vboxFromPixels(pixels, histo) {\n let rmin = 1000000, rmax = 0,\n gmin = 1000000, gmax = 0,\n bmin = 1000000, bmax = 0,\n rval, gval, bval;\n // find min/max\n pixels.forEach(function (pixel) {\n rval = pixel[0] >> rshift;\n gval = pixel[1] >> rshift;\n bval = pixel[2] >> rshift;\n if (rval < rmin) rmin = rval;\n else if (rval > rmax) rmax = rval;\n if (gval < gmin) gmin = gval;\n else if (gval > gmax) gmax = gval;\n if (bval < bmin) bmin = bval;\n else if (bval > bmax) bmax = bval;\n });\n return new VBox(rmin, rmax, gmin, gmax, bmin, bmax, histo);\n }\n\n function medianCutApply(histo, vbox) {\n if (!vbox.count()) return;\n\n const rw = vbox.r2 - vbox.r1 + 1,\n gw = vbox.g2 - vbox.g1 + 1,\n bw = vbox.b2 - vbox.b1 + 1,\n maxw = pv.max([rw, gw, bw]);\n // only one pixel, no split\n if (vbox.count() == 1) {\n return [vbox.copy()];\n }\n /* Find the partial sum arrays along the selected axis. */\n let total = 0,\n partialsum = [],\n lookaheadsum = [],\n i, j, k, sum, index;\n if (maxw == rw) {\n for (i = vbox.r1; i <= vbox.r2; i++) {\n sum = 0;\n for (j = vbox.g1; j <= vbox.g2; j++) {\n for (k = vbox.b1; k <= vbox.b2; k++) {\n index = getColorIndex(i, j, k);\n sum += (histo[index] || 0);\n }\n }\n total += sum;\n partialsum[i] = total;\n }\n }\n else if (maxw == gw) {\n for (i = vbox.g1; i <= vbox.g2; i++) {\n sum = 0;\n for (j = vbox.r1; j <= vbox.r2; j++) {\n for (k = vbox.b1; k <= vbox.b2; k++) {\n index = getColorIndex(j, i, k);\n sum += (histo[index] || 0);\n }\n }\n total += sum;\n partialsum[i] = total;\n }\n }\n else { /* maxw == bw */\n for (i = vbox.b1; i <= vbox.b2; i++) {\n sum = 0;\n for (j = vbox.r1; j <= vbox.r2; j++) {\n for (k = vbox.g1; k <= vbox.g2; k++) {\n index = getColorIndex(j, k, i);\n sum += (histo[index] || 0);\n }\n }\n total += sum;\n partialsum[i] = total;\n }\n }\n partialsum.forEach(function (d, i) {\n lookaheadsum[i] = total - d;\n });\n function doCut(color) {\n let dim1 = color + '1',\n dim2 = color + '2',\n left, right, vbox1, vbox2, d2, count2 = 0;\n for (i = vbox[dim1]; i <= vbox[dim2]; i++) {\n if (partialsum[i] > total / 2) {\n vbox1 = vbox.copy();\n vbox2 = vbox.copy();\n left = i - vbox[dim1];\n right = vbox[dim2] - i;\n if (left <= right)\n d2 = Math.min(vbox[dim2] - 1, ~~(i + right / 2));\n else d2 = Math.max(vbox[dim1], ~~(i - 1 - left / 2));\n // avoid 0-count boxes\n while (!partialsum[d2]) d2++;\n count2 = lookaheadsum[d2];\n while (!count2 && partialsum[d2 - 1]) count2 = lookaheadsum[--d2];\n // set dimensions\n vbox1[dim2] = d2;\n vbox2[dim1] = vbox1[dim2] + 1;\n return [vbox1, vbox2];\n }\n }\n\n }\n // determine the cut planes\n return maxw == rw ? doCut('r') :\n maxw == gw ? doCut('g') :\n doCut('b');\n }\n\n function quantize(pixels, maxcolors) {\n // short-circuit\n if (!pixels.length || maxcolors < 2 || maxcolors > 256) {\n return false;\n }\n\n // XXX: check color content and convert to grayscale if insufficient\n\n const histo = getHisto(pixels),\n histosize = 1 << (3 * sigbits);\n\n // check that we aren't below maxcolors already\n let nColors = 0;\n histo.forEach(function () { nColors++; });\n if (nColors <= maxcolors) {\n // XXX: generate the new colors from the histo and return\n }\n\n // get the beginning vbox from the colors\n const vbox = vboxFromPixels(pixels, histo),\n pq = new PQueue(function (a, b) { return pv.naturalOrder(a.count(), b.count()); });\n pq.push(vbox);\n\n // inner function to do the iteration\n function iter(lh, target) {\n let ncolors = 1,\n niters = 0,\n vbox;\n while (niters < maxIterations) {\n vbox = lh.pop();\n if (!vbox.count()) { /* just put it back */\n lh.push(vbox);\n niters++;\n continue;\n }\n // do the cut\n const vboxes = medianCutApply(histo, vbox),\n vbox1 = vboxes[0],\n vbox2 = vboxes[1];\n\n if (!vbox1) {\n return;\n }\n lh.push(vbox1);\n if (vbox2) { /* vbox2 can be null */\n lh.push(vbox2);\n ncolors++;\n }\n if (ncolors >= target) return;\n if (niters++ > maxIterations) {\n return;\n }\n }\n }\n\n // first set of colors, sorted by population\n iter(pq, fractByPopulations * maxcolors);\n\n // Re-sort by the product of pixel occupancy times the size in color space.\n const pq2 = new PQueue(function (a, b) {\n return pv.naturalOrder(a.count() * a.volume(), b.count() * b.volume());\n });\n while (pq.size()) {\n pq2.push(pq.pop());\n }\n\n // next set - generate the median cuts using the (npix * vol) sorting.\n iter(pq2, maxcolors - pq2.size());\n\n // calculate the actual colors\n const cmap = new CMap();\n while (pq2.size()) {\n cmap.push(pq2.pop());\n }\n\n return cmap;\n }\n\n return {\n quantize: quantize\n };\n})();\n\nexport { ColorThief, CanvasImage };\n"],"names":["sourceImage","gval","bval","i","vbox","vbox2"],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ import { Controller } from '@hotwired/stimulus';
2
+ import { ColorThief } from './color_thief.js';
3
+
4
+ class Image extends Controller {
5
+ static targets = ["dialog"];
6
+ static values = { poster: String };
7
+ connect() {
8
+ this.extractColor();
9
+ }
10
+ extractColor() {
11
+ if (!this.hasDialogTarget)
12
+ return;
13
+ const mainImg = this.element.querySelector("img.midwest-image-main");
14
+ const colorSource = this.posterValue || mainImg?.src;
15
+ if (!colorSource)
16
+ return;
17
+ const sample = new window.Image(80, 80);
18
+ sample.crossOrigin = "Anonymous";
19
+ sample.addEventListener("load", () => {
20
+ try {
21
+ const [r, g, b] = new ColorThief().getColor(sample);
22
+ this.dialogTarget.style.setProperty("--image-dominant-color", `${r} ${g} ${b}`);
23
+ } catch {
24
+ }
25
+ });
26
+ sample.src = colorSource;
27
+ }
28
+ zoom() {
29
+ if (this.hasDialogTarget) {
30
+ this.dialogTarget.showModal();
31
+ }
32
+ }
33
+ close() {
34
+ if (this.hasDialogTarget) {
35
+ this.dialogTarget.close();
36
+ }
37
+ }
38
+ // Close when clicking the backdrop (outside the dialog content).
39
+ backdropClose(event) {
40
+ if (event.target === this.dialogTarget) {
41
+ this.dialogTarget.close();
42
+ }
43
+ }
44
+ }
45
+
46
+ export { Image as default };
47
+ //# sourceMappingURL=image_component_controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image_component_controller.js","sources":["../../../../../../../app/components/midwest/image_component/image_component_controller.ts"],"sourcesContent":["import { Controller } from '@hotwired/stimulus'\nimport { ColorThief } from './color_thief'\n\nexport default class Image extends Controller<HTMLElement> {\n static targets = ['dialog']\n static values = { poster: String }\n\n declare readonly dialogTarget: HTMLDialogElement\n declare readonly hasDialogTarget: boolean\n declare readonly posterValue: string\n\n connect () {\n this.extractColor()\n }\n\n private extractColor () {\n if (!this.hasDialogTarget) return\n\n const mainImg = this.element.querySelector<HTMLImageElement>('img.midwest-image-main')\n const colorSource = this.posterValue || mainImg?.src\n if (!colorSource) return\n\n const sample = new window.Image(80, 80)\n sample.crossOrigin = 'Anonymous'\n sample.addEventListener('load', () => {\n try {\n const [r, g, b] = new ColorThief().getColor(sample)\n this.dialogTarget.style.setProperty('--image-dominant-color', `${r} ${g} ${b}`)\n } catch {\n // Canvas SecurityError for cross-origin images without CORS headers — skip\n }\n })\n sample.src = colorSource\n }\n\n zoom () {\n if (this.hasDialogTarget) {\n this.dialogTarget.showModal()\n }\n }\n\n close () {\n if (this.hasDialogTarget) {\n this.dialogTarget.close()\n }\n }\n\n // Close when clicking the backdrop (outside the dialog content).\n backdropClose (event: MouseEvent) {\n if (event.target === this.dialogTarget) {\n this.dialogTarget.close()\n }\n }\n}\n"],"names":[],"mappings":";;;AAGA,MAAqB,cAAc,UAAwB,CAAA;AAAA,EACzD,OAAO,OAAU,GAAA,CAAC,QAAQ,CAAA,CAAA;AAAA,EAC1B,OAAO,MAAA,GAAS,EAAE,MAAA,EAAQ,MAAO,EAAA,CAAA;AAAA,EAMjC,OAAW,GAAA;AACT,IAAA,IAAA,CAAK,YAAa,EAAA,CAAA;AAAA,GACpB;AAAA,EAEQ,YAAgB,GAAA;AACtB,IAAA,IAAI,CAAC,IAAK,CAAA,eAAA;AAAiB,MAAA,OAAA;AAE3B,IAAA,MAAM,OAAU,GAAA,IAAA,CAAK,OAAQ,CAAA,aAAA,CAAgC,wBAAwB,CAAA,CAAA;AACrF,IAAM,MAAA,WAAA,GAAc,IAAK,CAAA,WAAA,IAAe,OAAS,EAAA,GAAA,CAAA;AACjD,IAAA,IAAI,CAAC,WAAA;AAAa,MAAA,OAAA;AAElB,IAAA,MAAM,MAAS,GAAA,IAAI,MAAO,CAAA,KAAA,CAAM,IAAI,EAAE,CAAA,CAAA;AACtC,IAAA,MAAA,CAAO,WAAc,GAAA,WAAA,CAAA;AACrB,IAAO,MAAA,CAAA,gBAAA,CAAiB,QAAQ,MAAM;AACpC,MAAI,IAAA;AACF,QAAM,MAAA,CAAC,GAAG,CAAG,EAAA,CAAC,IAAI,IAAI,UAAA,EAAa,CAAA,QAAA,CAAS,MAAM,CAAA,CAAA;AAClD,QAAA,IAAA,CAAK,aAAa,KAAM,CAAA,WAAA,CAAY,0BAA0B,CAAG,EAAA,CAAA,CAAA,CAAA,EAAK,KAAK,CAAG,CAAA,CAAA,CAAA,CAAA;AAAA,OAC9E,CAAA,MAAA;AAAA,OAEF;AAAA,KACD,CAAA,CAAA;AACD,IAAA,MAAA,CAAO,GAAM,GAAA,WAAA,CAAA;AAAA,GACf;AAAA,EAEA,IAAQ,GAAA;AACN,IAAA,IAAI,KAAK,eAAiB,EAAA;AACxB,MAAA,IAAA,CAAK,aAAa,SAAU,EAAA,CAAA;AAAA,KAC9B;AAAA,GACF;AAAA,EAEA,KAAS,GAAA;AACP,IAAA,IAAI,KAAK,eAAiB,EAAA;AACxB,MAAA,IAAA,CAAK,aAAa,KAAM,EAAA,CAAA;AAAA,KAC1B;AAAA,GACF;AAAA;AAAA,EAGA,cAAe,KAAmB,EAAA;AAChC,IAAI,IAAA,KAAA,CAAM,MAAW,KAAA,IAAA,CAAK,YAAc,EAAA;AACtC,MAAA,IAAA,CAAK,aAAa,KAAM,EAAA,CAAA;AAAA,KAC1B;AAAA,GACF;AACF;;;;"}
@@ -1,16 +1,23 @@
1
1
  import { Controller } from '@hotwired/stimulus';
2
2
 
3
3
  class Tabs extends Controller {
4
- static targets = ["tab", "panel"];
4
+ static targets = ["tab", "panel", "list"];
5
5
  connect() {
6
6
  const activeIndex = this.tabTargets.findIndex(
7
7
  (tab) => tab.getAttribute("aria-selected") === "true"
8
8
  );
9
9
  this.activateTab(activeIndex >= 0 ? activeIndex : 0);
10
10
  this.element.addEventListener("keydown", this.handleKeydown);
11
+ if (this.hasListTarget) {
12
+ this.updateOverflow();
13
+ this.listTarget.addEventListener("scroll", this.updateOverflow);
14
+ }
11
15
  }
12
16
  disconnect() {
13
17
  this.element.removeEventListener("keydown", this.handleKeydown);
18
+ if (this.hasListTarget) {
19
+ this.listTarget.removeEventListener("scroll", this.updateOverflow);
20
+ }
14
21
  }
15
22
  select(event) {
16
23
  const tab = event.currentTarget;
@@ -18,6 +25,13 @@ class Tabs extends Controller {
18
25
  if (index >= 0)
19
26
  this.activateTab(index);
20
27
  }
28
+ updateOverflow = () => {
29
+ if (!this.hasListTarget)
30
+ return;
31
+ const list = this.listTarget;
32
+ list.classList.toggle("can-scroll-left", list.scrollLeft > 0);
33
+ list.classList.toggle("can-scroll-right", list.scrollLeft < list.scrollWidth - list.clientWidth - 1);
34
+ };
21
35
  handleKeydown = (event) => {
22
36
  const tabs = this.tabTargets;
23
37
  if (tabs.length === 0)
@@ -1 +1 @@
1
- {"version":3,"file":"tabs_component_controller.js","sources":["../../../../../../../app/components/midwest/tabs_component/tabs_component_controller.ts"],"sourcesContent":["\nimport { Controller } from '@hotwired/stimulus'\n\nexport default class Tabs extends Controller<HTMLElement> {\n static targets = ['tab', 'panel']\n\n declare readonly tabTargets: HTMLButtonElement[]\n declare readonly panelTargets: HTMLElement[]\n\n connect () {\n const activeIndex = this.tabTargets.findIndex(\n tab => tab.getAttribute('aria-selected') === 'true'\n )\n this.activateTab(activeIndex >= 0 ? activeIndex : 0)\n this.element.addEventListener('keydown', this.handleKeydown)\n }\n\n disconnect () {\n this.element.removeEventListener('keydown', this.handleKeydown)\n }\n\n select (event: Event) {\n const tab = event.currentTarget as HTMLButtonElement\n const index = this.tabTargets.indexOf(tab)\n if (index >= 0) this.activateTab(index)\n }\n\n private handleKeydown = (event: KeyboardEvent) => {\n const tabs = this.tabTargets\n if (tabs.length === 0) return\n\n const currentIndex = tabs.findIndex(t => t === document.activeElement)\n if (currentIndex < 0) return\n\n let nextIndex: number\n\n switch (event.key) {\n case 'ArrowLeft':\n nextIndex = (currentIndex - 1 + tabs.length) % tabs.length\n break\n case 'ArrowRight':\n nextIndex = (currentIndex + 1) % tabs.length\n break\n case 'Home':\n nextIndex = 0\n break\n case 'End':\n nextIndex = tabs.length - 1\n break\n default:\n return\n }\n\n event.preventDefault()\n this.activateTab(nextIndex)\n tabs[nextIndex].focus()\n }\n\n private activateTab (index: number) {\n this.tabTargets.forEach((tab, i) => {\n const active = i === index\n tab.setAttribute('aria-selected', String(active))\n tab.setAttribute('tabindex', active ? '0' : '-1')\n tab.classList.toggle('active', active)\n })\n\n this.panelTargets.forEach((panel, i) => {\n if (i === index) {\n panel.removeAttribute('hidden')\n } else {\n panel.setAttribute('hidden', '')\n }\n })\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tabs_component_controller.js","sources":["../../../../../../../app/components/midwest/tabs_component/tabs_component_controller.ts"],"sourcesContent":["\nimport { Controller } from '@hotwired/stimulus'\n\nexport default class Tabs extends Controller<HTMLElement> {\n static targets = ['tab', 'panel', 'list']\n\n declare readonly tabTargets: HTMLButtonElement[]\n declare readonly panelTargets: HTMLElement[]\n declare readonly listTarget: HTMLElement\n declare readonly hasListTarget: boolean\n\n connect () {\n const activeIndex = this.tabTargets.findIndex(\n tab => tab.getAttribute('aria-selected') === 'true'\n )\n this.activateTab(activeIndex >= 0 ? activeIndex : 0)\n this.element.addEventListener('keydown', this.handleKeydown)\n if (this.hasListTarget) {\n this.updateOverflow()\n this.listTarget.addEventListener('scroll', this.updateOverflow)\n }\n }\n\n disconnect () {\n this.element.removeEventListener('keydown', this.handleKeydown)\n if (this.hasListTarget) {\n this.listTarget.removeEventListener('scroll', this.updateOverflow)\n }\n }\n\n select (event: Event) {\n const tab = event.currentTarget as HTMLButtonElement\n const index = this.tabTargets.indexOf(tab)\n if (index >= 0) this.activateTab(index)\n }\n\n private updateOverflow = () => {\n if (!this.hasListTarget) return\n const list = this.listTarget\n list.classList.toggle('can-scroll-left', list.scrollLeft > 0)\n list.classList.toggle('can-scroll-right', list.scrollLeft < list.scrollWidth - list.clientWidth - 1)\n }\n\n private handleKeydown = (event: KeyboardEvent) => {\n const tabs = this.tabTargets\n if (tabs.length === 0) return\n\n const currentIndex = tabs.findIndex(t => t === document.activeElement)\n if (currentIndex < 0) return\n\n let nextIndex: number\n\n switch (event.key) {\n case 'ArrowLeft':\n nextIndex = (currentIndex - 1 + tabs.length) % tabs.length\n break\n case 'ArrowRight':\n nextIndex = (currentIndex + 1) % tabs.length\n break\n case 'Home':\n nextIndex = 0\n break\n case 'End':\n nextIndex = tabs.length - 1\n break\n default:\n return\n }\n\n event.preventDefault()\n this.activateTab(nextIndex)\n tabs[nextIndex].focus()\n }\n\n private activateTab (index: number) {\n this.tabTargets.forEach((tab, i) => {\n const active = i === index\n tab.setAttribute('aria-selected', String(active))\n tab.setAttribute('tabindex', active ? '0' : '-1')\n tab.classList.toggle('active', active)\n })\n\n this.panelTargets.forEach((panel, i) => {\n if (i === index) {\n panel.removeAttribute('hidden')\n } else {\n panel.setAttribute('hidden', '')\n }\n })\n }\n}\n"],"names":[],"mappings":"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"}