@nordhealth/components 5.0.0-alpha.0 → 5.0.1

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.
Files changed (206) hide show
  1. package/custom-elements.json +26353 -25540
  2. package/lib/Accordion.js.map +1 -1
  3. package/lib/AccordionHeader.js.map +1 -1
  4. package/lib/AccordionItem.js.map +1 -1
  5. package/lib/AccordionPanel.js.map +1 -1
  6. package/lib/AccordionTrigger.js +1 -1
  7. package/lib/AccordionTrigger.js.map +1 -1
  8. package/lib/Aside.js.map +1 -1
  9. package/lib/AsideDrawer.js.map +1 -1
  10. package/lib/Autocomplete.js +1 -1
  11. package/lib/Autocomplete.js.map +1 -1
  12. package/lib/Avatar.js.map +1 -1
  13. package/lib/Button.js +1 -1
  14. package/lib/Button.js.map +1 -1
  15. package/lib/Calendar-D47b20IT.js +2 -0
  16. package/lib/Calendar-D47b20IT.js.map +1 -0
  17. package/lib/Calendar.js +1 -1
  18. package/lib/Card.js.map +1 -1
  19. package/lib/Collapsible.js.map +1 -1
  20. package/lib/CollapsiblePanel.js.map +1 -1
  21. package/lib/CollapsibleTrigger.js.map +1 -1
  22. package/lib/Combobox-DBxXlbY7.js +2 -0
  23. package/lib/Combobox-DBxXlbY7.js.map +1 -0
  24. package/lib/Combobox.js +1 -1
  25. package/lib/Combobox.js.map +1 -1
  26. package/lib/ComboboxBase.js +1 -1
  27. package/lib/ComboboxBase.js.map +1 -1
  28. package/lib/CommandMenu.js +1 -1
  29. package/lib/CommandMenu.js.map +1 -1
  30. package/lib/DatePicker.js +1 -1
  31. package/lib/DatePicker.js.map +1 -1
  32. package/lib/DateRangePicker.js +1 -1
  33. package/lib/DateRangePicker.js.map +1 -1
  34. package/lib/Divider.js.map +1 -1
  35. package/lib/Drawer.js.map +1 -1
  36. package/lib/Dropdown.js +1 -1
  37. package/lib/Dropdown.js.map +1 -1
  38. package/lib/DropdownSubmenu.js +1 -1
  39. package/lib/DropdownSubmenu.js.map +1 -1
  40. package/lib/FilterAddButton.js +1 -1
  41. package/lib/FilterAddButton.js.map +1 -1
  42. package/lib/FilterDateRange.js +1 -1
  43. package/lib/FilterDateRange.js.map +1 -1
  44. package/lib/FilterDropdown.js +1 -1
  45. package/lib/FilterDropdown.js.map +1 -1
  46. package/lib/FilterField.js +1 -1
  47. package/lib/FilterField.js.map +1 -1
  48. package/lib/FilterInput.js +1 -1
  49. package/lib/FilterInput.js.map +1 -1
  50. package/lib/FilterResetButton.js +1 -1
  51. package/lib/FilterResetButton.js.map +1 -1
  52. package/lib/Footer.js.map +1 -1
  53. package/lib/Header.js.map +1 -1
  54. package/lib/Icon.js.map +1 -1
  55. package/lib/Item.js +1 -1
  56. package/lib/Item.js.map +1 -1
  57. package/lib/Kbd.js.map +1 -1
  58. package/lib/KbdGroup.js.map +1 -1
  59. package/lib/KeyboardController.js +1 -1
  60. package/lib/KeyboardController.js.map +1 -1
  61. package/lib/Layout.js +1 -1
  62. package/lib/Layout.js.map +1 -1
  63. package/lib/{LightDismissController-4pH8cdko.js → LightDismissController-wcL1ziJa.js} +2 -2
  64. package/lib/{LightDismissController-4pH8cdko.js.map → LightDismissController-wcL1ziJa.js.map} +1 -1
  65. package/lib/LocalizeController.js +1 -1
  66. package/lib/LocalizeController.js.map +1 -1
  67. package/lib/Message.js +1 -1
  68. package/lib/Message.js.map +1 -1
  69. package/lib/Meter.js +1 -1
  70. package/lib/Meter.js.map +1 -1
  71. package/lib/Modal.js +1 -1
  72. package/lib/Modal.js.map +1 -1
  73. package/lib/ModalController.js +1 -1
  74. package/lib/ModalController.js.map +1 -1
  75. package/lib/NavGroup.js +1 -1
  76. package/lib/NavGroup.js.map +1 -1
  77. package/lib/NavItem.js +1 -1
  78. package/lib/NavItem.js.map +1 -1
  79. package/lib/NavToggle-ROsuaJkW.js +2 -0
  80. package/lib/{NavToggle-BY83xpx0.js.map → NavToggle-ROsuaJkW.js.map} +1 -1
  81. package/lib/NavToggle.js +1 -1
  82. package/lib/Notification.js +1 -1
  83. package/lib/Notification.js.map +1 -1
  84. package/lib/NumberField.js +1 -1
  85. package/lib/NumberField.js.map +1 -1
  86. package/lib/OtpField.js +1 -1
  87. package/lib/OtpField.js.map +1 -1
  88. package/lib/Outline.js +2 -0
  89. package/lib/Outline.js.map +1 -0
  90. package/lib/OutlineItem.js +2 -0
  91. package/lib/OutlineItem.js.map +1 -0
  92. package/lib/Pagination.js +1 -1
  93. package/lib/Pagination.js.map +1 -1
  94. package/lib/Popout-B6Hirj3y.js +2 -0
  95. package/lib/{Popout-DpN7PP9h.js.map → Popout-B6Hirj3y.js.map} +1 -1
  96. package/lib/Popout.js +1 -1
  97. package/lib/Qrcode.js.map +1 -1
  98. package/lib/ScrollArea.js.map +1 -1
  99. package/lib/ShortcutController-CV5b0BZl.js +2 -0
  100. package/lib/ShortcutController-CV5b0BZl.js.map +1 -0
  101. package/lib/Stack.js.map +1 -1
  102. package/lib/Tag.js +1 -1
  103. package/lib/Tag.js.map +1 -1
  104. package/lib/TagGroup.js.map +1 -1
  105. package/lib/Textarea.js +1 -1
  106. package/lib/Textarea.js.map +1 -1
  107. package/lib/TimePicker.js +1 -1
  108. package/lib/TimePicker.js.map +1 -1
  109. package/lib/TopBar.js.map +1 -1
  110. package/lib/Truncate.js.map +1 -1
  111. package/lib/VisuallyHidden.js.map +1 -1
  112. package/lib/bundle.js +13 -13
  113. package/lib/bundle.js.map +1 -1
  114. package/lib/en-us.js +1 -1
  115. package/lib/en-us.js.map +1 -1
  116. package/lib/fi-fi.js +1 -1
  117. package/lib/fi-fi.js.map +1 -1
  118. package/lib/index.js +1 -1
  119. package/lib/localization13.js +1 -1
  120. package/lib/localization13.js.map +1 -1
  121. package/lib/localization14.js +1 -1
  122. package/lib/localization14.js.map +1 -1
  123. package/lib/localization15.js +1 -1
  124. package/lib/localization15.js.map +1 -1
  125. package/lib/localization16.js +1 -1
  126. package/lib/localization16.js.map +1 -1
  127. package/lib/localization17.js +1 -1
  128. package/lib/localization17.js.map +1 -1
  129. package/lib/localization18.js +1 -1
  130. package/lib/localization18.js.map +1 -1
  131. package/lib/localization19.js +1 -1
  132. package/lib/localization19.js.map +1 -1
  133. package/lib/localization20.js +1 -1
  134. package/lib/localization20.js.map +1 -1
  135. package/lib/localization21.js +1 -1
  136. package/lib/localization21.js.map +1 -1
  137. package/lib/localization22.js +1 -1
  138. package/lib/localization22.js.map +1 -1
  139. package/lib/localization23.js +2 -0
  140. package/lib/localization23.js.map +1 -0
  141. package/lib/localization24.js +2 -0
  142. package/lib/localization24.js.map +1 -0
  143. package/lib/nav-context.js +2 -0
  144. package/lib/nav-context.js.map +1 -0
  145. package/lib/react.d.ts +15 -0
  146. package/lib/src/accordion/Accordion.d.ts +1 -1
  147. package/lib/src/accordion/AccordionHeader.d.ts +1 -1
  148. package/lib/src/accordion/AccordionItem.d.ts +1 -1
  149. package/lib/src/accordion/AccordionPanel.d.ts +1 -1
  150. package/lib/src/accordion/AccordionTrigger.d.ts +4 -3
  151. package/lib/src/aside/Aside.d.ts +1 -1
  152. package/lib/src/aside-drawer/AsideDrawer.d.ts +1 -1
  153. package/lib/src/autocomplete/Autocomplete.d.ts +4 -4
  154. package/lib/src/avatar/Avatar.d.ts +1 -1
  155. package/lib/src/button/Button.d.ts +1 -0
  156. package/lib/src/calendar/Calendar.d.ts +1 -1
  157. package/lib/src/card/Card.d.ts +1 -1
  158. package/lib/src/collapsible/Collapsible.d.ts +1 -1
  159. package/lib/src/collapsible/CollapsiblePanel.d.ts +1 -1
  160. package/lib/src/collapsible/CollapsibleTrigger.d.ts +1 -1
  161. package/lib/src/combobox/ComboboxBase.d.ts +7 -7
  162. package/lib/src/common/controllers/ShortcutController.d.ts +5 -5
  163. package/lib/src/divider/Divider.d.ts +1 -1
  164. package/lib/src/drawer/Drawer.d.ts +1 -1
  165. package/lib/src/dropdown/Dropdown.d.ts +3 -0
  166. package/lib/src/footer/Footer.d.ts +1 -1
  167. package/lib/src/header/Header.d.ts +1 -1
  168. package/lib/src/icon/Icon.d.ts +1 -1
  169. package/lib/src/index.d.ts +2 -0
  170. package/lib/src/kbd/Kbd.d.ts +1 -1
  171. package/lib/src/kbd/KbdGroup.d.ts +1 -1
  172. package/lib/src/layout/Layout.d.ts +13 -1
  173. package/lib/src/layout/localization.d.ts +5 -0
  174. package/lib/src/localization/en-us.d.ts +7 -0
  175. package/lib/src/localization/translation.d.ts +7 -0
  176. package/lib/src/nav-group/NavGroup.d.ts +1 -0
  177. package/lib/src/nav-group/nav-context.d.ts +11 -0
  178. package/lib/src/nav-item/NavItem.d.ts +23 -0
  179. package/lib/src/otp-field/OtpField.d.ts +11 -0
  180. package/lib/src/outline/Outline.d.ts +111 -0
  181. package/lib/src/outline/OutlineItem.d.ts +42 -0
  182. package/lib/src/outline/localization.d.ts +4 -0
  183. package/lib/src/qrcode/Qrcode.d.ts +1 -1
  184. package/lib/src/scroll-area/ScrollArea.d.ts +1 -1
  185. package/lib/src/stack/Stack.d.ts +1 -1
  186. package/lib/src/tag/Tag.d.ts +1 -1
  187. package/lib/src/tag-group/TagGroup.d.ts +1 -1
  188. package/lib/src/top-bar/TopBar.d.ts +1 -1
  189. package/lib/src/truncate/Truncate.d.ts +1 -1
  190. package/lib/src/visually-hidden/VisuallyHidden.d.ts +1 -1
  191. package/lib/tinykeys-DwvDXsEb.js +2 -0
  192. package/lib/tinykeys-DwvDXsEb.js.map +1 -0
  193. package/lib/translation.js +1 -1
  194. package/lib/translation.js.map +1 -1
  195. package/lib/vue.d.ts +11 -0
  196. package/package.json +5 -5
  197. package/lib/Calendar-C1SxrlzN.js +0 -2
  198. package/lib/Calendar-C1SxrlzN.js.map +0 -1
  199. package/lib/Combobox-By4h1Sp-.js +0 -2
  200. package/lib/Combobox-By4h1Sp-.js.map +0 -1
  201. package/lib/NavToggle-BY83xpx0.js +0 -2
  202. package/lib/Popout-DpN7PP9h.js +0 -2
  203. package/lib/ShortcutController-BIb3WGzH.js +0 -2
  204. package/lib/ShortcutController-BIb3WGzH.js.map +0 -1
  205. package/lib/tinykeys.module-_6MZt7MP.js +0 -2
  206. package/lib/tinykeys.module-_6MZt7MP.js.map +0 -1
package/lib/Qrcode.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"Qrcode.js","sources":["../../../node_modules/.pnpm/qr@0.4.2/node_modules/qr/esm/index.js","../src/qrcode/Qrcode.ts"],"sourcesContent":["/*!\nCopyright (c) 2023 Paul Miller (paulmillr.com)\nThe library paulmillr-qr is dual-licensed under the Apache 2.0 OR MIT license.\nYou can select a license of your choice.\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n/**\n * Methods for encoding (generating) QR code patterns.\n * Check out decode.ts for decoding (reading).\n * @module\n * @example\n```js\nimport encodeQR from '@paulmillr/qr';\nconst txt = 'Hello world';\nconst ascii = encodeQR(txt, 'ascii'); // Not all fonts are supported\nconst terminalFriendly = encodeQR(txt, 'term'); // 2x larger, all fonts are OK\nconst gifBytes = encodeQR(txt, 'gif'); // Uncompressed GIF\nconst svgElement = encodeQR(txt, 'svg'); // SVG vector image element\nconst array = encodeQR(txt, 'raw'); // 2d array for canvas or other libs\n// import decodeQR from '@paulmillr/qr/decode';\n```\n */\n// We do not use newline escape code directly in strings because it's not parser-friendly\nconst chCodes = { newline: 10, reset: 27 };\nfunction assertNumber(n) {\n if (!Number.isSafeInteger(n))\n throw new Error(`integer expected: ${n}`);\n}\nfunction validateVersion(ver) {\n if (!Number.isSafeInteger(ver) || ver < 1 || ver > 40)\n throw new Error(`Invalid version=${ver}. Expected number [1..40]`);\n}\nfunction bin(dec, pad) {\n return dec.toString(2).padStart(pad, '0');\n}\nfunction mod(a, b) {\n const result = a % b;\n return result >= 0 ? result : b + result;\n}\nfunction fillArr(length, val) {\n return new Array(length).fill(val);\n}\n/**\n * Interleaves byte blocks.\n * @param blocks [[1, 2, 3], [4, 5, 6]]\n * @returns [1, 4, 2, 5, 3, 6]\n */\nfunction interleaveBytes(...blocks) {\n let len = 0;\n for (const b of blocks)\n len = Math.max(len, b.length);\n const res = [];\n for (let i = 0; i < len; i++) {\n for (const b of blocks) {\n if (i >= b.length)\n continue; // outside of block, skip\n res.push(b[i]);\n }\n }\n return new Uint8Array(res);\n}\nfunction includesAt(lst, pattern, index) {\n if (index < 0 || index + pattern.length > lst.length)\n return false;\n for (let i = 0; i < pattern.length; i++)\n if (pattern[i] !== lst[index + i])\n return false;\n return true;\n}\n// Optimize for minimal score/penalty\nfunction best() {\n let best;\n let bestScore = Infinity;\n return {\n add(score, value) {\n if (score >= bestScore)\n return;\n best = value;\n bestScore = score;\n },\n get: () => best,\n score: () => bestScore,\n };\n}\n// Based on https://github.com/paulmillr/scure-base/blob/main/index.ts\nfunction alphabet(alphabet) {\n return {\n has: (char) => alphabet.includes(char),\n decode: (input) => {\n if (!Array.isArray(input) || (input.length && typeof input[0] !== 'string'))\n throw new Error('alphabet.decode input should be array of strings');\n return input.map((letter) => {\n if (typeof letter !== 'string')\n throw new Error(`alphabet.decode: not string element=${letter}`);\n const index = alphabet.indexOf(letter);\n if (index === -1)\n throw new Error(`Unknown letter: \"${letter}\". Allowed: ${alphabet}`);\n return index;\n });\n },\n encode: (digits) => {\n if (!Array.isArray(digits) || (digits.length && typeof digits[0] !== 'number'))\n throw new Error('alphabet.encode input should be an array of numbers');\n return digits.map((i) => {\n assertNumber(i);\n if (i < 0 || i >= alphabet.length)\n throw new Error(`Digit index outside alphabet: ${i} (alphabet: ${alphabet.length})`);\n return alphabet[i];\n });\n },\n };\n}\nexport class Bitmap {\n static size(size, limit) {\n if (typeof size === 'number')\n size = { height: size, width: size };\n if (!Number.isSafeInteger(size.height) && size.height !== Infinity)\n throw new Error(`Bitmap: invalid height=${size.height} (${typeof size.height})`);\n if (!Number.isSafeInteger(size.width) && size.width !== Infinity)\n throw new Error(`Bitmap: invalid width=${size.width} (${typeof size.width})`);\n if (limit !== undefined) {\n // Clamp length, so it won't overflow, also allows to use Infinity, so we draw until end\n size = {\n width: Math.min(size.width, limit.width),\n height: Math.min(size.height, limit.height),\n };\n }\n return size;\n }\n static fromString(s) {\n // Remove linebreaks on start and end, so we draw in `` section\n s = s.replace(/^\\n+/g, '').replace(/\\n+$/g, '');\n const lines = s.split(String.fromCharCode(chCodes.newline));\n const height = lines.length;\n const data = new Array(height);\n let width;\n for (const line of lines) {\n const row = line.split('').map((i) => {\n if (i === 'X')\n return true;\n if (i === ' ')\n return false;\n if (i === '?')\n return undefined;\n throw new Error(`Bitmap.fromString: unknown symbol=${i}`);\n });\n if (width && row.length !== width)\n throw new Error(`Bitmap.fromString different row sizes: width=${width} cur=${row.length}`);\n width = row.length;\n data.push(row);\n }\n if (!width)\n width = 0;\n return new Bitmap({ height, width }, data);\n }\n constructor(size, data) {\n const { height, width } = Bitmap.size(size);\n this.data = data || Array.from({ length: height }, () => fillArr(width, undefined));\n this.height = height;\n this.width = width;\n }\n point(p) {\n return this.data[p.y][p.x];\n }\n isInside(p) {\n return 0 <= p.x && p.x < this.width && 0 <= p.y && p.y < this.height;\n }\n size(offset) {\n if (!offset)\n return { height: this.height, width: this.width };\n const { x, y } = this.xy(offset);\n return { height: this.height - y, width: this.width - x };\n }\n xy(c) {\n if (typeof c === 'number')\n c = { x: c, y: c };\n if (!Number.isSafeInteger(c.x))\n throw new Error(`Bitmap: invalid x=${c.x}`);\n if (!Number.isSafeInteger(c.y))\n throw new Error(`Bitmap: invalid y=${c.y}`);\n // Do modulo, so we can use negative positions\n c.x = mod(c.x, this.width);\n c.y = mod(c.y, this.height);\n return c;\n }\n // Basically every operation can be represented as rect\n rect(c, size, value) {\n const { x, y } = this.xy(c);\n const { height, width } = Bitmap.size(size, this.size({ x, y }));\n for (let yPos = 0; yPos < height; yPos++) {\n for (let xPos = 0; xPos < width; xPos++) {\n // NOTE: we use give function relative coordinates inside box\n this.data[y + yPos][x + xPos] =\n typeof value === 'function'\n ? value({ x: xPos, y: yPos }, this.data[y + yPos][x + xPos])\n : value;\n }\n }\n return this;\n }\n // returns rectangular part of bitmap\n rectRead(c, size, fn) {\n return this.rect(c, size, (c, cur) => {\n fn(c, cur);\n return cur;\n });\n }\n // Horizontal & vertical lines\n hLine(c, len, value) {\n return this.rect(c, { width: len, height: 1 }, value);\n }\n vLine(c, len, value) {\n return this.rect(c, { width: 1, height: len }, value);\n }\n // add border\n border(border = 2, value) {\n const height = this.height + 2 * border;\n const width = this.width + 2 * border;\n const v = fillArr(border, value);\n const h = Array.from({ length: border }, () => fillArr(width, value));\n return new Bitmap({ height, width }, [...h, ...this.data.map((i) => [...v, ...i, ...v]), ...h]);\n }\n // Embed another bitmap on coordinates\n embed(c, bm) {\n return this.rect(c, bm.size(), ({ x, y }) => bm.data[y][x]);\n }\n // returns rectangular part of bitmap\n rectSlice(c, size = this.size()) {\n const rect = new Bitmap(Bitmap.size(size, this.size(this.xy(c))));\n this.rect(c, size, ({ x, y }, cur) => (rect.data[y][x] = cur));\n return rect;\n }\n // Change shape, replace rows with columns (data[y][x] -> data[x][y])\n inverse() {\n const { height, width } = this;\n const res = new Bitmap({ height: width, width: height });\n return res.rect({ x: 0, y: 0 }, Infinity, ({ x, y }) => this.data[x][y]);\n }\n // Each pixel size is multiplied by factor\n scale(factor) {\n if (!Number.isSafeInteger(factor) || factor > 1024)\n throw new Error(`invalid scale factor: ${factor}`);\n const { height, width } = this;\n const res = new Bitmap({ height: factor * height, width: factor * width });\n return res.rect({ x: 0, y: 0 }, Infinity, ({ x, y }) => this.data[Math.floor(y / factor)][Math.floor(x / factor)]);\n }\n clone() {\n const res = new Bitmap(this.size());\n return res.rect({ x: 0, y: 0 }, this.size(), ({ x, y }) => this.data[y][x]);\n }\n // Ensure that there is no undefined values left\n assertDrawn() {\n this.rectRead(0, Infinity, (_, cur) => {\n if (typeof cur !== 'boolean')\n throw new Error(`Invalid color type=${typeof cur}`);\n });\n }\n // Simple string representation for debugging\n toString() {\n return this.data\n .map((i) => i.map((j) => (j === undefined ? '?' : j ? 'X' : ' ')).join(''))\n .join(String.fromCharCode(chCodes.newline));\n }\n toASCII() {\n const { height, width, data } = this;\n let out = '';\n // Terminal character height is x2 of character width, so we process two rows of bitmap\n // to produce one row of ASCII\n for (let y = 0; y < height; y += 2) {\n for (let x = 0; x < width; x++) {\n const first = data[y][x];\n const second = y + 1 >= height ? true : data[y + 1][x]; // if last row outside bitmap, make it black\n if (!first && !second)\n out += '█'; // both rows white (empty)\n else if (!first && second)\n out += '▀'; // top row white\n else if (first && !second)\n out += '▄'; // down row white\n else if (first && second)\n out += ' '; // both rows black\n }\n out += String.fromCharCode(chCodes.newline);\n }\n return out;\n }\n toTerm() {\n const cc = String.fromCharCode(chCodes.reset);\n const reset = cc + '[0m';\n const whiteBG = cc + '[1;47m ' + reset;\n const darkBG = cc + `[40m ` + reset;\n return this.data\n .map((i) => i.map((j) => (j ? darkBG : whiteBG)).join(''))\n .join(String.fromCharCode(chCodes.newline));\n }\n toSVG(optimize = true) {\n let out = `<svg viewBox=\"0 0 ${this.width} ${this.height}\" xmlns=\"http://www.w3.org/2000/svg\">`;\n // Construct optimized SVG path data.\n let pathData = '';\n let prevPoint;\n this.rectRead(0, Infinity, (point, val) => {\n if (!val)\n return;\n const { x, y } = point;\n if (!optimize) {\n out += `<rect x=\"${x}\" y=\"${y}\" width=\"1\" height=\"1\" />`;\n return;\n }\n // https://developer.mozilla.org/en-US/docs/Web/SVG/Reference/Attribute/d#path_commands\n // Determine the shortest way to represent the initial cursor movement.\n // M - Move cursor (without drawing) to absolute coordinate pair.\n let m = `M${x} ${y}`;\n // Only allow using the relative cursor move command if previous points\n // were drawn.\n if (prevPoint) {\n // m - Move cursor (without drawing) to relative coordinate pair.\n const relM = `m${x - prevPoint.x} ${y - prevPoint.y}`;\n if (relM.length <= m.length)\n m = relM;\n }\n // Determine the shortest way to represent the cell's bottom line draw.\n // H - Draw line from cursor position to absolute x coordinate.\n // h - Draw line from cursor position to relative x coordinate.\n const bH = x < 10 ? `H${x}` : 'h-1';\n // v - Draw line from cursor position to relative y coordinate.\n // Z - Close path (draws line from cursor position to M coordinate).\n pathData += `${m}h1v1${bH}Z`;\n prevPoint = point;\n });\n if (optimize)\n out += `<path d=\"${pathData}\"/>`;\n out += `</svg>`;\n return out;\n }\n toGIF() {\n // NOTE: Small, but inefficient implementation.\n // Uses 1 byte per pixel.\n const u16le = (i) => [i & 0xff, (i >>> 8) & 0xff];\n const dims = [...u16le(this.width), ...u16le(this.height)];\n const data = [];\n this.rectRead(0, Infinity, (_, cur) => data.push(+(cur === true)));\n const N = 126; // Block size\n // prettier-ignore\n const bytes = [\n 0x47, 0x49, 0x46, 0x38, 0x37, 0x61, ...dims, 0xf6, 0x00, 0x00, 0xff, 0xff, 0xff,\n ...fillArr(3 * 127, 0x00), 0x2c, 0x00, 0x00, 0x00, 0x00, ...dims, 0x00, 0x07\n ];\n const fullChunks = Math.floor(data.length / N);\n // Full blocks\n for (let i = 0; i < fullChunks; i++)\n bytes.push(N + 1, 0x80, ...data.slice(N * i, N * (i + 1)).map((i) => +i));\n // Remaining bytes\n bytes.push((data.length % N) + 1, 0x80, ...data.slice(fullChunks * N).map((i) => +i));\n bytes.push(0x01, 0x81, 0x00, 0x3b);\n return new Uint8Array(bytes);\n }\n toImage(isRGB = false) {\n const { height, width } = this.size();\n const data = new Uint8Array(height * width * (isRGB ? 3 : 4));\n let i = 0;\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n const value = !!this.data[y][x] ? 0 : 255;\n data[i++] = value;\n data[i++] = value;\n data[i++] = value;\n if (!isRGB)\n data[i++] = 255; // alpha channel\n }\n }\n return { height, width, data };\n }\n}\n// End of utils\n// Runtime type-checking\n/** Error correction mode. low: 7%, medium: 15%, quartile: 25%, high: 30% */\nexport const ECMode = ['low', 'medium', 'quartile', 'high'];\n/** QR Code encoding */\nexport const Encoding = ['numeric', 'alphanumeric', 'byte', 'kanji', 'eci'];\n// Various constants & tables\n// prettier-ignore\nconst BYTES = [\n // 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,\n 26, 44, 70, 100, 134, 172, 196, 242, 292, 346, 404, 466, 532, 581, 655, 733, 815, 901, 991, 1085,\n // 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40\n 1156, 1258, 1364, 1474, 1588, 1706, 1828, 1921, 2051, 2185, 2323, 2465, 2611, 2761, 2876, 3034, 3196, 3362, 3532, 3706,\n];\n// prettier-ignore\nconst WORDS_PER_BLOCK = {\n // Version 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40\n low: [7, 10, 15, 20, 26, 18, 20, 24, 30, 18, 20, 24, 26, 30, 22, 24, 28, 30, 28, 28, 28, 28, 30, 30, 26, 28, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30],\n medium: [10, 16, 26, 18, 24, 16, 18, 22, 22, 26, 30, 22, 22, 24, 24, 28, 28, 26, 26, 26, 26, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28],\n quartile: [13, 22, 18, 26, 18, 24, 18, 22, 20, 24, 28, 26, 24, 20, 30, 24, 28, 28, 26, 30, 28, 30, 30, 30, 30, 28, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30],\n high: [17, 28, 22, 16, 22, 28, 26, 26, 24, 28, 24, 28, 22, 24, 24, 30, 28, 28, 26, 28, 30, 24, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30],\n};\n// prettier-ignore\nconst ECC_BLOCKS = {\n // Version 1, 2, 3, 4, 5, 6, 7, 8, 9,10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40\n low: [1, 1, 1, 1, 1, 2, 2, 2, 2, 4, 4, 4, 4, 4, 6, 6, 6, 6, 7, 8, 8, 9, 9, 10, 12, 12, 12, 13, 14, 15, 16, 17, 18, 19, 19, 20, 21, 22, 24, 25],\n medium: [1, 1, 1, 2, 2, 4, 4, 4, 5, 5, 5, 8, 9, 9, 10, 10, 11, 13, 14, 16, 17, 17, 18, 20, 21, 23, 25, 26, 28, 29, 31, 33, 35, 37, 38, 40, 43, 45, 47, 49],\n quartile: [1, 1, 2, 2, 4, 4, 6, 6, 8, 8, 8, 10, 12, 16, 12, 17, 16, 18, 21, 20, 23, 23, 25, 27, 29, 34, 34, 35, 38, 40, 43, 45, 48, 51, 53, 56, 59, 62, 65, 68],\n high: [1, 1, 2, 4, 4, 4, 5, 6, 8, 8, 11, 11, 16, 16, 18, 16, 19, 21, 25, 25, 25, 34, 30, 32, 35, 37, 40, 42, 45, 48, 51, 54, 57, 60, 63, 66, 70, 74, 77, 81],\n};\nconst info = {\n size: {\n encode: (ver) => 21 + 4 * (ver - 1), // ver1 = 21, ver40=177 blocks\n decode: (size) => (size - 17) / 4,\n },\n sizeType: (ver) => Math.floor((ver + 7) / 17),\n // Based on https://codereview.stackexchange.com/questions/74925/algorithm-to-generate-this-alignment-pattern-locations-table-for-qr-codes\n alignmentPatterns(ver) {\n if (ver === 1)\n return [];\n const first = 6;\n const last = info.size.encode(ver) - first - 1;\n const distance = last - first;\n const count = Math.ceil(distance / 28);\n let interval = Math.floor(distance / count);\n if (interval % 2)\n interval += 1;\n else if ((distance % count) * 2 >= count)\n interval += 2;\n const res = [first];\n for (let m = 1; m < count; m++)\n res.push(last - (count - m) * interval);\n res.push(last);\n return res;\n },\n ECCode: {\n low: 0b01,\n medium: 0b00,\n quartile: 0b11,\n high: 0b10,\n },\n formatMask: 0b101010000010010,\n formatBits(ecc, maskIdx) {\n const data = (info.ECCode[ecc] << 3) | maskIdx;\n let d = data;\n for (let i = 0; i < 10; i++)\n d = (d << 1) ^ ((d >> 9) * 0b10100110111);\n return ((data << 10) | d) ^ info.formatMask;\n },\n versionBits(ver) {\n let d = ver;\n for (let i = 0; i < 12; i++)\n d = (d << 1) ^ ((d >> 11) * 0b1111100100101);\n return (ver << 12) | d;\n },\n alphabet: {\n numeric: alphabet('0123456789'),\n alphanumerc: alphabet('0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:'),\n }, // as Record<EncodingType, ReturnType<typeof alphabet>>,\n lengthBits(ver, type) {\n const table = {\n numeric: [10, 12, 14],\n alphanumeric: [9, 11, 13],\n byte: [8, 16, 16],\n kanji: [8, 10, 12],\n eci: [0, 0, 0],\n };\n return table[type][info.sizeType(ver)];\n },\n modeBits: {\n numeric: '0001',\n alphanumeric: '0010',\n byte: '0100',\n kanji: '1000',\n eci: '0111',\n },\n capacity(ver, ecc) {\n const bytes = BYTES[ver - 1];\n const words = WORDS_PER_BLOCK[ecc][ver - 1];\n const numBlocks = ECC_BLOCKS[ecc][ver - 1];\n const blockLen = Math.floor(bytes / numBlocks) - words;\n const shortBlocks = numBlocks - (bytes % numBlocks);\n return {\n words,\n numBlocks,\n shortBlocks,\n blockLen,\n capacity: (bytes - words * numBlocks) * 8,\n total: (words + blockLen) * numBlocks + numBlocks - shortBlocks,\n };\n },\n};\nconst PATTERNS = [\n (x, y) => (x + y) % 2 == 0,\n (_x, y) => y % 2 == 0,\n (x, _y) => x % 3 == 0,\n (x, y) => (x + y) % 3 == 0,\n (x, y) => (Math.floor(y / 2) + Math.floor(x / 3)) % 2 == 0,\n (x, y) => ((x * y) % 2) + ((x * y) % 3) == 0,\n (x, y) => (((x * y) % 2) + ((x * y) % 3)) % 2 == 0,\n (x, y) => (((x + y) % 2) + ((x * y) % 3)) % 2 == 0,\n];\n// Galois field && reed-solomon encoding\nconst GF = {\n tables: ((p_poly) => {\n const exp = fillArr(256, 0);\n const log = fillArr(256, 0);\n for (let i = 0, x = 1; i < 256; i++) {\n exp[i] = x;\n log[x] = i;\n x <<= 1;\n if (x & 0x100)\n x ^= p_poly;\n }\n return { exp, log };\n })(0x11d),\n exp: (x) => GF.tables.exp[x],\n log(x) {\n if (x === 0)\n throw new Error(`GF.log: invalid arg=${x}`);\n return GF.tables.log[x] % 255;\n },\n mul(x, y) {\n if (x === 0 || y === 0)\n return 0;\n return GF.tables.exp[(GF.tables.log[x] + GF.tables.log[y]) % 255];\n },\n add: (x, y) => x ^ y,\n pow: (x, e) => GF.tables.exp[(GF.tables.log[x] * e) % 255],\n inv(x) {\n if (x === 0)\n throw new Error(`GF.inverse: invalid arg=${x}`);\n return GF.tables.exp[255 - GF.tables.log[x]];\n },\n polynomial(poly) {\n if (poly.length == 0)\n throw new Error('GF.polymomial: invalid length');\n if (poly[0] !== 0)\n return poly;\n // Strip leading zeros\n let i = 0;\n for (; i < poly.length - 1 && poly[i] == 0; i++)\n ;\n return poly.slice(i);\n },\n monomial(degree, coefficient) {\n if (degree < 0)\n throw new Error(`GF.monomial: invalid degree=${degree}`);\n if (coefficient == 0)\n return [0];\n let coefficients = fillArr(degree + 1, 0);\n coefficients[0] = coefficient;\n return GF.polynomial(coefficients);\n },\n degree: (a) => a.length - 1,\n coefficient: (a, degree) => a[GF.degree(a) - degree],\n mulPoly(a, b) {\n if (a[0] === 0 || b[0] === 0)\n return [0];\n const res = fillArr(a.length + b.length - 1, 0);\n for (let i = 0; i < a.length; i++) {\n for (let j = 0; j < b.length; j++) {\n res[i + j] = GF.add(res[i + j], GF.mul(a[i], b[j]));\n }\n }\n return GF.polynomial(res);\n },\n mulPolyScalar(a, scalar) {\n if (scalar == 0)\n return [0];\n if (scalar == 1)\n return a;\n const res = fillArr(a.length, 0);\n for (let i = 0; i < a.length; i++)\n res[i] = GF.mul(a[i], scalar);\n return GF.polynomial(res);\n },\n mulPolyMonomial(a, degree, coefficient) {\n if (degree < 0)\n throw new Error('GF.mulPolyMonomial: invalid degree');\n if (coefficient == 0)\n return [0];\n const res = fillArr(a.length + degree, 0);\n for (let i = 0; i < a.length; i++)\n res[i] = GF.mul(a[i], coefficient);\n return GF.polynomial(res);\n },\n addPoly(a, b) {\n if (a[0] === 0)\n return b;\n if (b[0] === 0)\n return a;\n let smaller = a;\n let larger = b;\n if (smaller.length > larger.length)\n [smaller, larger] = [larger, smaller];\n let sumDiff = fillArr(larger.length, 0);\n let lengthDiff = larger.length - smaller.length;\n let s = larger.slice(0, lengthDiff);\n for (let i = 0; i < s.length; i++)\n sumDiff[i] = s[i];\n for (let i = lengthDiff; i < larger.length; i++)\n sumDiff[i] = GF.add(smaller[i - lengthDiff], larger[i]);\n return GF.polynomial(sumDiff);\n },\n remainderPoly(data, divisor) {\n const out = Array.from(data);\n for (let i = 0; i < data.length - divisor.length + 1; i++) {\n const elm = out[i];\n if (elm === 0)\n continue;\n for (let j = 1; j < divisor.length; j++) {\n if (divisor[j] !== 0)\n out[i + j] = GF.add(out[i + j], GF.mul(divisor[j], elm));\n }\n }\n return out.slice(data.length - divisor.length + 1, out.length);\n },\n divisorPoly(degree) {\n let g = [1];\n for (let i = 0; i < degree; i++)\n g = GF.mulPoly(g, [1, GF.pow(2, i)]);\n return g;\n },\n evalPoly(poly, a) {\n if (a == 0)\n return GF.coefficient(poly, 0); // Just return the x^0 coefficient\n let res = poly[0];\n for (let i = 1; i < poly.length; i++)\n res = GF.add(GF.mul(a, res), poly[i]);\n return res;\n },\n // TODO: cleanup\n euclidian(a, b, R) {\n // Force degree(a) >= degree(b)\n if (GF.degree(a) < GF.degree(b))\n [a, b] = [b, a];\n let rLast = a;\n let r = b;\n let tLast = [0];\n let t = [1];\n // while degree of Ri ≥ t/2\n while (2 * GF.degree(r) >= R) {\n let rLastLast = rLast;\n let tLastLast = tLast;\n rLast = r;\n tLast = t;\n if (rLast[0] === 0)\n throw new Error('rLast[0] === 0');\n r = rLastLast;\n let q = [0];\n const dltInverse = GF.inv(rLast[0]);\n while (GF.degree(r) >= GF.degree(rLast) && r[0] !== 0) {\n const degreeDiff = GF.degree(r) - GF.degree(rLast);\n const scale = GF.mul(r[0], dltInverse);\n q = GF.addPoly(q, GF.monomial(degreeDiff, scale));\n r = GF.addPoly(r, GF.mulPolyMonomial(rLast, degreeDiff, scale));\n }\n q = GF.mulPoly(q, tLast);\n t = GF.addPoly(q, tLastLast);\n if (GF.degree(r) >= GF.degree(rLast))\n throw new Error(`Division failed r: ${r}, rLast: ${rLast}`);\n }\n const sigmaTildeAtZero = GF.coefficient(t, 0);\n if (sigmaTildeAtZero == 0)\n throw new Error('sigmaTilde(0) was zero');\n const inverse = GF.inv(sigmaTildeAtZero);\n return [GF.mulPolyScalar(t, inverse), GF.mulPolyScalar(r, inverse)];\n },\n};\nfunction RS(eccWords) {\n return {\n encode(from) {\n const d = GF.divisorPoly(eccWords);\n const pol = Array.from(from);\n pol.push(...d.slice(0, -1).fill(0));\n return Uint8Array.from(GF.remainderPoly(pol, d));\n },\n decode(to) {\n const res = to.slice();\n const poly = GF.polynomial(Array.from(to));\n // Find errors\n let syndrome = fillArr(eccWords, 0);\n let hasError = false;\n for (let i = 0; i < eccWords; i++) {\n const evl = GF.evalPoly(poly, GF.exp(i));\n syndrome[syndrome.length - 1 - i] = evl;\n if (evl !== 0)\n hasError = true;\n }\n if (!hasError)\n return res;\n syndrome = GF.polynomial(syndrome);\n const monomial = GF.monomial(eccWords, 1);\n const [errorLocator, errorEvaluator] = GF.euclidian(monomial, syndrome, eccWords);\n // Error locations\n const locations = fillArr(GF.degree(errorLocator), 0);\n let e = 0;\n for (let i = 1; i < 256 && e < locations.length; i++) {\n if (GF.evalPoly(errorLocator, i) === 0)\n locations[e++] = GF.inv(i);\n }\n if (e !== locations.length)\n throw new Error('RS.decode: invalid errors number');\n for (let i = 0; i < locations.length; i++) {\n const pos = res.length - 1 - GF.log(locations[i]);\n if (pos < 0)\n throw new Error('RS.decode: invalid error location');\n const xiInverse = GF.inv(locations[i]);\n let denominator = 1;\n for (let j = 0; j < locations.length; j++) {\n if (i === j)\n continue;\n denominator = GF.mul(denominator, GF.add(1, GF.mul(locations[j], xiInverse)));\n }\n res[pos] = GF.add(res[pos], GF.mul(GF.evalPoly(errorEvaluator, xiInverse), GF.inv(denominator)));\n }\n return res;\n },\n };\n}\n// Interleaves blocks\nfunction interleave(ver, ecc) {\n const { words, shortBlocks, numBlocks, blockLen, total } = info.capacity(ver, ecc);\n const rs = RS(words);\n return {\n encode(bytes) {\n // Add error correction to bytes\n const blocks = [];\n const eccBlocks = [];\n for (let i = 0; i < numBlocks; i++) {\n const isShort = i < shortBlocks;\n const len = blockLen + (isShort ? 0 : 1);\n blocks.push(bytes.subarray(0, len));\n eccBlocks.push(rs.encode(bytes.subarray(0, len)));\n bytes = bytes.subarray(len);\n }\n const resBlocks = interleaveBytes(...blocks);\n const resECC = interleaveBytes(...eccBlocks);\n const res = new Uint8Array(resBlocks.length + resECC.length);\n res.set(resBlocks);\n res.set(resECC, resBlocks.length);\n return res;\n },\n decode(data) {\n if (data.length !== total)\n throw new Error(`interleave.decode: len(data)=${data.length}, total=${total}`);\n const blocks = [];\n for (let i = 0; i < numBlocks; i++) {\n const isShort = i < shortBlocks;\n blocks.push(new Uint8Array(words + blockLen + (isShort ? 0 : 1)));\n }\n // Short blocks\n let pos = 0;\n for (let i = 0; i < blockLen; i++) {\n for (let j = 0; j < numBlocks; j++)\n blocks[j][i] = data[pos++];\n }\n // Long blocks\n for (let j = shortBlocks; j < numBlocks; j++)\n blocks[j][blockLen] = data[pos++];\n // ECC\n for (let i = blockLen; i < blockLen + words; i++) {\n for (let j = 0; j < numBlocks; j++) {\n const isShort = j < shortBlocks;\n blocks[j][i + (isShort ? 0 : 1)] = data[pos++];\n }\n }\n // Decode\n // Error-correct and copy data blocks together into a stream of bytes\n const res = [];\n for (const block of blocks)\n res.push(...Array.from(rs.decode(block)).slice(0, -words));\n return Uint8Array.from(res);\n },\n };\n}\n// Draw\n// Generic template per version+ecc+mask. Can be cached, to speedup calculations.\nfunction drawTemplate(ver, ecc, maskIdx, test = false) {\n const size = info.size.encode(ver);\n let b = new Bitmap(size + 2);\n // Finder patterns\n // We draw full pattern and later slice, since before addition of borders finder is truncated by one pixel on sides\n const finder = new Bitmap(3).rect(0, 3, true).border(1, false).border(1, true).border(1, false);\n b = b\n .embed(0, finder) // top left\n .embed({ x: -finder.width, y: 0 }, finder) // top right\n .embed({ x: 0, y: -finder.height }, finder); // bottom left\n b = b.rectSlice(1, size);\n // Alignment patterns\n const align = new Bitmap(1).rect(0, 1, true).border(1, false).border(1, true);\n const alignPos = info.alignmentPatterns(ver);\n for (const y of alignPos) {\n for (const x of alignPos) {\n if (b.data[y][x] !== undefined)\n continue;\n b.embed({ x: x - 2, y: y - 2 }, align); // center of pattern should be at position\n }\n }\n // Timing patterns\n b = b\n .hLine({ x: 0, y: 6 }, Infinity, ({ x }, cur) => (cur === undefined ? x % 2 == 0 : cur))\n .vLine({ x: 6, y: 0 }, Infinity, ({ y }, cur) => (cur === undefined ? y % 2 == 0 : cur));\n // Format information\n {\n const bits = info.formatBits(ecc, maskIdx);\n const getBit = (i) => !test && ((bits >> i) & 1) == 1;\n // vertical\n for (let i = 0; i < 6; i++)\n b.data[i][8] = getBit(i); // right of top-left finder\n // TODO: re-write as lines, like:\n // b.vLine({ x: 8, y: 0 }, 6, ({ x, y }) => getBit(y));\n for (let i = 6; i < 8; i++)\n b.data[i + 1][8] = getBit(i); // after timing pattern\n for (let i = 8; i < 15; i++)\n b.data[size - 15 + i][8] = getBit(i); // right of bottom-left finder\n // horizontal\n for (let i = 0; i < 8; i++)\n b.data[8][size - i - 1] = getBit(i); // under top-right finder\n for (let i = 8; i < 9; i++)\n b.data[8][15 - i - 1 + 1] = getBit(i); // VVV, after timing\n for (let i = 9; i < 15; i++)\n b.data[8][15 - i - 1] = getBit(i); // under top-left finder\n b.data[size - 8][8] = !test; // bottom-left finder, right\n }\n // Version information\n if (ver >= 7) {\n const bits = info.versionBits(ver);\n for (let i = 0; i < 18; i += 1) {\n const bit = !test && ((bits >> i) & 1) == 1;\n const x = Math.floor(i / 3);\n const y = (i % 3) + size - 8 - 3;\n // two copies\n b.data[x][y] = bit;\n b.data[y][x] = bit;\n }\n }\n return b;\n}\n// zigzag: bottom->top && top->bottom\nfunction zigzag(tpl, maskIdx, fn) {\n const size = tpl.height;\n const pattern = PATTERNS[maskIdx];\n // zig-zag pattern\n let dir = -1;\n let y = size - 1;\n // two columns at time\n for (let xOffset = size - 1; xOffset > 0; xOffset -= 2) {\n if (xOffset == 6)\n xOffset = 5; // skip vertical timing pattern\n for (;; y += dir) {\n for (let j = 0; j < 2; j += 1) {\n const x = xOffset - j;\n if (tpl.data[y][x] !== undefined)\n continue; // skip already written elements\n fn(x, y, pattern(x, y));\n }\n if (y + dir < 0 || y + dir >= size)\n break;\n }\n dir = -dir; // change direction\n }\n}\n// NOTE: byte encoding is just representation, QR works with strings only. Most decoders will fail on raw byte array,\n// since they expect unicode or other text encoding inside bytes\nfunction detectType(str) {\n let type = 'numeric';\n for (let x of str) {\n if (info.alphabet.numeric.has(x))\n continue;\n type = 'alphanumeric';\n if (!info.alphabet.alphanumerc.has(x))\n return 'byte';\n }\n return type;\n}\n/**\n * @example utf8ToBytes('abc') // new Uint8Array([97, 98, 99])\n */\nexport function utf8ToBytes(str) {\n if (typeof str !== 'string')\n throw new Error(`utf8ToBytes expected string, got ${typeof str}`);\n return new Uint8Array(new TextEncoder().encode(str)); // https://bugzil.la/1681809\n}\nfunction encode(ver, ecc, data, type) {\n let encoded = '';\n let dataLen = data.length;\n if (type === 'numeric') {\n const t = info.alphabet.numeric.decode(data.split(''));\n const n = t.length;\n for (let i = 0; i < n - 2; i += 3)\n encoded += bin(t[i] * 100 + t[i + 1] * 10 + t[i + 2], 10);\n if (n % 3 === 1) {\n encoded += bin(t[n - 1], 4);\n }\n else if (n % 3 === 2) {\n encoded += bin(t[n - 2] * 10 + t[n - 1], 7);\n }\n }\n else if (type === 'alphanumeric') {\n const t = info.alphabet.alphanumerc.decode(data.split(''));\n const n = t.length;\n for (let i = 0; i < n - 1; i += 2)\n encoded += bin(t[i] * 45 + t[i + 1], 11);\n if (n % 2 == 1)\n encoded += bin(t[n - 1], 6); // pad if odd number of chars\n }\n else if (type === 'byte') {\n const utf8 = utf8ToBytes(data);\n dataLen = utf8.length;\n encoded = Array.from(utf8)\n .map((i) => bin(i, 8))\n .join('');\n }\n else {\n throw new Error('encode: unsupported type');\n }\n const { capacity } = info.capacity(ver, ecc);\n const len = bin(dataLen, info.lengthBits(ver, type));\n let bits = info.modeBits[type] + len + encoded;\n if (bits.length > capacity)\n throw new Error('Capacity overflow');\n // Terminator\n bits += '0'.repeat(Math.min(4, Math.max(0, capacity - bits.length)));\n // Pad bits string untill full byte\n if (bits.length % 8)\n bits += '0'.repeat(8 - (bits.length % 8));\n // Add padding until capacity is full\n const padding = '1110110000010001';\n for (let idx = 0; bits.length !== capacity; idx++)\n bits += padding[idx % padding.length];\n // Convert a bitstring to array of bytes\n const bytes = Uint8Array.from(bits.match(/(.{8})/g).map((i) => Number(`0b${i}`)));\n return interleave(ver, ecc).encode(bytes);\n}\n// DRAW\nfunction drawQR(ver, ecc, data, maskIdx, test = false) {\n const b = drawTemplate(ver, ecc, maskIdx, test);\n let i = 0;\n const need = 8 * data.length;\n zigzag(b, maskIdx, (x, y, mask) => {\n let value = false;\n if (i < need) {\n value = ((data[i >>> 3] >> ((7 - i) & 7)) & 1) !== 0;\n i++;\n }\n b.data[y][x] = value !== mask; // !== as xor\n });\n if (i !== need)\n throw new Error('QR: bytes left after draw');\n return b;\n}\nfunction penalty(bm) {\n const inverse = bm.inverse();\n // Adjacent modules in row/column in same | No. of modules = (5 + i) color\n const sameColor = (row) => {\n let res = 0;\n for (let i = 0, same = 1, last = undefined; i < row.length; i++) {\n if (last === row[i]) {\n same++;\n if (i !== row.length - 1)\n continue; // handle last element\n }\n if (same >= 5)\n res += 3 + (same - 5);\n last = row[i];\n same = 1;\n }\n return res;\n };\n let adjacent = 0;\n bm.data.forEach((row) => (adjacent += sameColor(row)));\n inverse.data.forEach((column) => (adjacent += sameColor(column)));\n // Block of modules in same color (Block size = 2x2)\n let box = 0;\n let b = bm.data;\n const lastW = bm.width - 1;\n const lastH = bm.height - 1;\n for (let x = 0; x < lastW; x++) {\n for (let y = 0; y < lastH; y++) {\n const x1 = x + 1;\n const y1 = y + 1;\n if (b[x][y] === b[x1][y] && b[x1][y] === b[x][y1] && b[x1][y] === b[x1][y1]) {\n box += 3;\n }\n }\n }\n // 1:1:3:1:1 ratio (dark:light:dark:light:dark) pattern in row/column, preceded or followed by light area 4 modules wide\n const finderPattern = (row) => {\n const finderPattern = [true, false, true, true, true, false, true]; // dark:light:dark:light:dark\n const lightPattern = [false, false, false, false]; // light area 4 modules wide\n const p1 = [...finderPattern, ...lightPattern];\n const p2 = [...lightPattern, ...finderPattern];\n let res = 0;\n for (let i = 0; i < row.length; i++) {\n if (includesAt(row, p1, i))\n res += 40;\n if (includesAt(row, p2, i))\n res += 40;\n }\n return res;\n };\n let finder = 0;\n for (const row of bm.data)\n finder += finderPattern(row);\n for (const column of inverse.data)\n finder += finderPattern(column);\n // Proportion of dark modules in entire symbol\n // Add 10 points to a deviation of 5% increment or decrement in the proportion\n // ratio of dark module from the referential 50%\n let darkPixels = 0;\n bm.rectRead(0, Infinity, (_c, val) => (darkPixels += val ? 1 : 0));\n const darkPercent = (darkPixels / (bm.height * bm.width)) * 100;\n const dark = 10 * Math.floor(Math.abs(darkPercent - 50) / 5);\n return adjacent + box + finder + dark;\n}\n// Selects best mask according to penalty, if no mask is provided\nfunction drawQRBest(ver, ecc, data, maskIdx) {\n if (maskIdx === undefined) {\n const bestMask = best();\n for (let mask = 0; mask < PATTERNS.length; mask++)\n bestMask.add(penalty(drawQR(ver, ecc, data, mask, true)), mask);\n maskIdx = bestMask.get();\n }\n if (maskIdx === undefined)\n throw new Error('Cannot find mask'); // Should never happen\n return drawQR(ver, ecc, data, maskIdx);\n}\nfunction validateECC(ec) {\n if (!ECMode.includes(ec))\n throw new Error(`Invalid error correction mode=${ec}. Expected: ${ECMode}`);\n}\nfunction validateEncoding(enc) {\n if (!Encoding.includes(enc))\n throw new Error(`Encoding: invalid mode=${enc}. Expected: ${Encoding}`);\n if (enc === 'kanji' || enc === 'eci')\n throw new Error(`Encoding: ${enc} is not supported (yet?).`);\n}\nfunction validateMask(mask) {\n if (![0, 1, 2, 3, 4, 5, 6, 7].includes(mask) || !PATTERNS[mask])\n throw new Error(`Invalid mask=${mask}. Expected number [0..7]`);\n}\nexport function encodeQR(text, output = 'raw', opts = {}) {\n const ecc = opts.ecc !== undefined ? opts.ecc : 'medium';\n validateECC(ecc);\n const encoding = opts.encoding !== undefined ? opts.encoding : detectType(text);\n validateEncoding(encoding);\n if (opts.mask !== undefined)\n validateMask(opts.mask);\n let ver = opts.version;\n let data, err = new Error('Unknown error');\n if (ver !== undefined) {\n validateVersion(ver);\n data = encode(ver, ecc, text, encoding);\n }\n else {\n // If no version is provided, try to find smallest one which fits\n // Currently just scans all version, can be significantly speedup if needed\n for (let i = 1; i <= 40; i++) {\n try {\n data = encode(i, ecc, text, encoding);\n ver = i;\n break;\n }\n catch (e) {\n err = e;\n }\n }\n }\n if (!ver || !data)\n throw err;\n let res = drawQRBest(ver, ecc, data, opts.mask);\n res.assertDrawn();\n const border = opts.border === undefined ? 2 : opts.border;\n if (!Number.isSafeInteger(border))\n throw new Error(`invalid border type=${typeof border}`);\n res = res.border(border, false); // Add border\n if (opts.scale !== undefined)\n res = res.scale(opts.scale); // Scale image\n if (output === 'raw')\n return res.data;\n else if (output === 'ascii')\n return res.toASCII();\n else if (output === 'svg')\n return res.toSVG(opts.optimize);\n else if (output === 'gif')\n return res.toGIF();\n else if (output === 'term')\n return res.toTerm();\n else\n throw new Error(`Unknown output: ${output}`);\n}\nexport default encodeQR;\nexport const utils = {\n best,\n bin,\n drawTemplate,\n fillArr,\n info,\n interleave,\n validateVersion,\n zigzag,\n};\n// Unsafe API utils, exported only for tests\nexport const _tests = {\n Bitmap,\n info,\n detectType,\n encode,\n drawQR,\n penalty,\n PATTERNS,\n};\n// Type tests\n// const o1 = qr('test', 'ascii');\n// const o2 = qr('test', 'raw');\n// const o3 = qr('test', 'gif');\n// const o4 = qr('test', 'svg');\n// const o5 = qr('test', 'term');\n//# sourceMappingURL=index.js.map","import { html, LitElement } from 'lit'\nimport { customElement, property, query } from 'lit/decorators.js'\nimport { styleMap } from 'lit/directives/style-map.js'\nimport encodeQR from 'qr'\nimport { observe } from '../common/decorators/observe.js'\nimport componentStyle from '../common/styles/Component.css'\nimport style from './Qrcode.css'\n\nconst correctionMap: Record<'L' | 'M' | 'Q' | 'H', 'low' | 'medium' | 'quartile' | 'high'> = {\n L: 'low',\n M: 'medium',\n Q: 'quartile',\n H: 'high',\n}\n\n/**\n * QR Code component is used for providing information or links\n * to users which they can quickly scan with their smartphone.\n *\n * @status ready\n * @category image\n * @displayName QR Code\n */\n@customElement('nord-qrcode')\nexport default class Qrcode extends LitElement {\n static styles = [componentStyle, style]\n\n @query('canvas', true) private canvas!: HTMLCanvasElement\n @query('.computed', true) private computed!: HTMLElement\n\n /**\n * The value of the QR Code, most commonly an URL.\n */\n @property({ reflect: true }) value = ''\n\n /**\n * Label used by assistive technology. If unspecified, the value will\n * be used instead.\n */\n @property({ reflect: true }) label = ''\n\n /**\n * The size of the rendered QR Code in pixels.\n */\n @property({ reflect: true, type: Number }) size = 128\n\n /**\n * The fill color of the QR Code.\n * Can accept any valid CSS color value, including custom properties.\n */\n @property({ reflect: true }) color = 'var(--n-color-text)'\n\n /**\n * The background color of the QR Code.\n * Can accept any valid CSS color value, including custom properties.\n */\n @property({ reflect: true }) background = 'var(--n-color-surface)'\n\n /**\n * Error correction level makes the QR Code bigger and helps users to\n * scan it without issues. L, M, Q and H values will use 7%, 15%, 25%\n * and 30% of the QR code for error correction respectively.\n */\n @property({ reflect: true }) correction: 'L' | 'M' | 'Q' | 'H' = 'H'\n\n firstUpdated() {\n this.generate()\n }\n\n @observe('correction')\n @observe('color')\n @observe('background')\n @observe('size')\n @observe('value')\n private generate() {\n /**\n * Lit’s built-in hasUpdated property returns true if the component\n * has updated at least once.\n */\n if (!this.hasUpdated) {\n return\n }\n\n const { backgroundColor, color } = getComputedStyle(this.computed)\n\n const qrArray = encodeQR(this.value, 'raw', {\n ecc: correctionMap[this.correction],\n border: 0,\n })\n\n // Draw the canvas 2x larger to avoid blurring on high DPI displays\n const size = this.size * 2\n const ctx = this.canvas.getContext('2d')\n const scale = size / qrArray.length\n\n this.canvas.width = size\n this.canvas.height = size\n\n if (ctx) {\n ctx.fillStyle = backgroundColor\n ctx.fillRect(0, 0, size, size)\n qrArray.forEach((row, y) => {\n row.forEach((cell, x) => {\n if (cell) {\n ctx.fillStyle = color\n ctx.fillRect(x * scale, y * scale, scale, scale)\n }\n })\n })\n }\n }\n\n render() {\n return html`\n <div\n class=\"n-qrcode\"\n style=${styleMap({\n 'inline-size': `${this.size}px`,\n 'block-size': `${this.size}px`,\n })}\n >\n <canvas role=\"img\" aria-label=${this.label.length > 0 ? this.label : this.value}></canvas>\n </div>\n <div\n class=\"computed\"\n hidden\n style=${styleMap({\n 'background-color': `${this.background}`,\n 'color': `${this.color}`,\n })}\n ></div>\n `\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'nord-qrcode': Qrcode\n }\n}\n"],"names":["chCodes","bin","dec","pad","toString","padStart","mod","a","b","result","fillArr","length","val","Array","fill","interleaveBytes","blocks","len","Math","max","res","i","push","Uint8Array","includesAt","lst","pattern","index","alphabet","has","char","includes","decode","input","isArray","Error","map","letter","indexOf","encode","digits","n","Number","isSafeInteger","assertNumber","Bitmap","size","limit","height","width","Infinity","undefined","min","fromString","s","lines","replace","split","String","fromCharCode","data","line","row","constructor","this","from","point","p","y","x","isInside","offset","xy","c","rect","value","yPos","xPos","rectRead","fn","cur","hLine","vLine","border","v","h","embed","bm","rectSlice","inverse","scale","factor","floor","clone","assertDrawn","_","j","join","toASCII","out","first","second","toTerm","cc","reset","whiteBG","darkBG","toSVG","optimize","prevPoint","pathData","m","relM","toGIF","u16le","dims","N","bytes","fullChunks","slice","toImage","isRGB","ECMode","Encoding","BYTES","WORDS_PER_BLOCK","low","medium","quartile","high","ECC_BLOCKS","info","ver","sizeType","alignmentPatterns","last","distance","count","ceil","interval","ECCode","formatMask","formatBits","ecc","maskIdx","d","versionBits","numeric","alphanumerc","lengthBits","type","alphanumeric","byte","kanji","eci","modeBits","capacity","words","numBlocks","blockLen","shortBlocks","total","PATTERNS","_x","_y","GF","tables","exp","log","mul","add","pow","e","inv","polynomial","poly","monomial","degree","coefficient","coefficients","mulPoly","mulPolyScalar","scalar","mulPolyMonomial","addPoly","smaller","larger","sumDiff","lengthDiff","remainderPoly","divisor","elm","divisorPoly","g","evalPoly","euclidian","R","rLast","r","tLast","t","rLastLast","tLastLast","q","dltInverse","degreeDiff","sigmaTildeAtZero","interleave","rs","eccWords","pol","to","syndrome","hasError","evl","errorLocator","errorEvaluator","locations","pos","xiInverse","denominator","eccBlocks","subarray","resBlocks","resECC","set","isShort","block","encoded","dataLen","utf8","str","TextEncoder","utf8ToBytes","bits","repeat","padding","idx","match","drawQR","test","finder","align","alignPos","getBit","bit","drawTemplate","need","tpl","dir","xOffset","zigzag","mask","penalty","sameColor","same","adjacent","forEach","column","box","lastW","lastH","x1","y1","finderPattern","lightPattern","p1","p2","darkPixels","_c","darkPercent","dark","abs","encodeQR","text","output","opts","ec","validateECC","encoding","detectType","enc","validateEncoding","validateMask","version","err","validateVersion","bestMask","best","bestScore","score","get","drawQRBest","correctionMap","L","M","Q","H","Qrcode","LitElement","label","color","background","correction","firstUpdated","generate","hasUpdated","backgroundColor","getComputedStyle","computed","qrArray","ctx","canvas","getContext","fillStyle","fillRect","cell","render","html","styleMap","styles","componentStyle","style","__decorate","query","prototype","property","reflect","observe","customElement"],"mappings":"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","x_google_ignoreList":[0]}
1
+ {"version":3,"file":"Qrcode.js","sources":["../../../node_modules/.pnpm/qr@0.4.2/node_modules/qr/esm/index.js","../src/qrcode/Qrcode.ts"],"sourcesContent":["/*!\nCopyright (c) 2023 Paul Miller (paulmillr.com)\nThe library paulmillr-qr is dual-licensed under the Apache 2.0 OR MIT license.\nYou can select a license of your choice.\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n/**\n * Methods for encoding (generating) QR code patterns.\n * Check out decode.ts for decoding (reading).\n * @module\n * @example\n```js\nimport encodeQR from '@paulmillr/qr';\nconst txt = 'Hello world';\nconst ascii = encodeQR(txt, 'ascii'); // Not all fonts are supported\nconst terminalFriendly = encodeQR(txt, 'term'); // 2x larger, all fonts are OK\nconst gifBytes = encodeQR(txt, 'gif'); // Uncompressed GIF\nconst svgElement = encodeQR(txt, 'svg'); // SVG vector image element\nconst array = encodeQR(txt, 'raw'); // 2d array for canvas or other libs\n// import decodeQR from '@paulmillr/qr/decode';\n```\n */\n// We do not use newline escape code directly in strings because it's not parser-friendly\nconst chCodes = { newline: 10, reset: 27 };\nfunction assertNumber(n) {\n if (!Number.isSafeInteger(n))\n throw new Error(`integer expected: ${n}`);\n}\nfunction validateVersion(ver) {\n if (!Number.isSafeInteger(ver) || ver < 1 || ver > 40)\n throw new Error(`Invalid version=${ver}. Expected number [1..40]`);\n}\nfunction bin(dec, pad) {\n return dec.toString(2).padStart(pad, '0');\n}\nfunction mod(a, b) {\n const result = a % b;\n return result >= 0 ? result : b + result;\n}\nfunction fillArr(length, val) {\n return new Array(length).fill(val);\n}\n/**\n * Interleaves byte blocks.\n * @param blocks [[1, 2, 3], [4, 5, 6]]\n * @returns [1, 4, 2, 5, 3, 6]\n */\nfunction interleaveBytes(...blocks) {\n let len = 0;\n for (const b of blocks)\n len = Math.max(len, b.length);\n const res = [];\n for (let i = 0; i < len; i++) {\n for (const b of blocks) {\n if (i >= b.length)\n continue; // outside of block, skip\n res.push(b[i]);\n }\n }\n return new Uint8Array(res);\n}\nfunction includesAt(lst, pattern, index) {\n if (index < 0 || index + pattern.length > lst.length)\n return false;\n for (let i = 0; i < pattern.length; i++)\n if (pattern[i] !== lst[index + i])\n return false;\n return true;\n}\n// Optimize for minimal score/penalty\nfunction best() {\n let best;\n let bestScore = Infinity;\n return {\n add(score, value) {\n if (score >= bestScore)\n return;\n best = value;\n bestScore = score;\n },\n get: () => best,\n score: () => bestScore,\n };\n}\n// Based on https://github.com/paulmillr/scure-base/blob/main/index.ts\nfunction alphabet(alphabet) {\n return {\n has: (char) => alphabet.includes(char),\n decode: (input) => {\n if (!Array.isArray(input) || (input.length && typeof input[0] !== 'string'))\n throw new Error('alphabet.decode input should be array of strings');\n return input.map((letter) => {\n if (typeof letter !== 'string')\n throw new Error(`alphabet.decode: not string element=${letter}`);\n const index = alphabet.indexOf(letter);\n if (index === -1)\n throw new Error(`Unknown letter: \"${letter}\". Allowed: ${alphabet}`);\n return index;\n });\n },\n encode: (digits) => {\n if (!Array.isArray(digits) || (digits.length && typeof digits[0] !== 'number'))\n throw new Error('alphabet.encode input should be an array of numbers');\n return digits.map((i) => {\n assertNumber(i);\n if (i < 0 || i >= alphabet.length)\n throw new Error(`Digit index outside alphabet: ${i} (alphabet: ${alphabet.length})`);\n return alphabet[i];\n });\n },\n };\n}\nexport class Bitmap {\n static size(size, limit) {\n if (typeof size === 'number')\n size = { height: size, width: size };\n if (!Number.isSafeInteger(size.height) && size.height !== Infinity)\n throw new Error(`Bitmap: invalid height=${size.height} (${typeof size.height})`);\n if (!Number.isSafeInteger(size.width) && size.width !== Infinity)\n throw new Error(`Bitmap: invalid width=${size.width} (${typeof size.width})`);\n if (limit !== undefined) {\n // Clamp length, so it won't overflow, also allows to use Infinity, so we draw until end\n size = {\n width: Math.min(size.width, limit.width),\n height: Math.min(size.height, limit.height),\n };\n }\n return size;\n }\n static fromString(s) {\n // Remove linebreaks on start and end, so we draw in `` section\n s = s.replace(/^\\n+/g, '').replace(/\\n+$/g, '');\n const lines = s.split(String.fromCharCode(chCodes.newline));\n const height = lines.length;\n const data = new Array(height);\n let width;\n for (const line of lines) {\n const row = line.split('').map((i) => {\n if (i === 'X')\n return true;\n if (i === ' ')\n return false;\n if (i === '?')\n return undefined;\n throw new Error(`Bitmap.fromString: unknown symbol=${i}`);\n });\n if (width && row.length !== width)\n throw new Error(`Bitmap.fromString different row sizes: width=${width} cur=${row.length}`);\n width = row.length;\n data.push(row);\n }\n if (!width)\n width = 0;\n return new Bitmap({ height, width }, data);\n }\n constructor(size, data) {\n const { height, width } = Bitmap.size(size);\n this.data = data || Array.from({ length: height }, () => fillArr(width, undefined));\n this.height = height;\n this.width = width;\n }\n point(p) {\n return this.data[p.y][p.x];\n }\n isInside(p) {\n return 0 <= p.x && p.x < this.width && 0 <= p.y && p.y < this.height;\n }\n size(offset) {\n if (!offset)\n return { height: this.height, width: this.width };\n const { x, y } = this.xy(offset);\n return { height: this.height - y, width: this.width - x };\n }\n xy(c) {\n if (typeof c === 'number')\n c = { x: c, y: c };\n if (!Number.isSafeInteger(c.x))\n throw new Error(`Bitmap: invalid x=${c.x}`);\n if (!Number.isSafeInteger(c.y))\n throw new Error(`Bitmap: invalid y=${c.y}`);\n // Do modulo, so we can use negative positions\n c.x = mod(c.x, this.width);\n c.y = mod(c.y, this.height);\n return c;\n }\n // Basically every operation can be represented as rect\n rect(c, size, value) {\n const { x, y } = this.xy(c);\n const { height, width } = Bitmap.size(size, this.size({ x, y }));\n for (let yPos = 0; yPos < height; yPos++) {\n for (let xPos = 0; xPos < width; xPos++) {\n // NOTE: we use give function relative coordinates inside box\n this.data[y + yPos][x + xPos] =\n typeof value === 'function'\n ? value({ x: xPos, y: yPos }, this.data[y + yPos][x + xPos])\n : value;\n }\n }\n return this;\n }\n // returns rectangular part of bitmap\n rectRead(c, size, fn) {\n return this.rect(c, size, (c, cur) => {\n fn(c, cur);\n return cur;\n });\n }\n // Horizontal & vertical lines\n hLine(c, len, value) {\n return this.rect(c, { width: len, height: 1 }, value);\n }\n vLine(c, len, value) {\n return this.rect(c, { width: 1, height: len }, value);\n }\n // add border\n border(border = 2, value) {\n const height = this.height + 2 * border;\n const width = this.width + 2 * border;\n const v = fillArr(border, value);\n const h = Array.from({ length: border }, () => fillArr(width, value));\n return new Bitmap({ height, width }, [...h, ...this.data.map((i) => [...v, ...i, ...v]), ...h]);\n }\n // Embed another bitmap on coordinates\n embed(c, bm) {\n return this.rect(c, bm.size(), ({ x, y }) => bm.data[y][x]);\n }\n // returns rectangular part of bitmap\n rectSlice(c, size = this.size()) {\n const rect = new Bitmap(Bitmap.size(size, this.size(this.xy(c))));\n this.rect(c, size, ({ x, y }, cur) => (rect.data[y][x] = cur));\n return rect;\n }\n // Change shape, replace rows with columns (data[y][x] -> data[x][y])\n inverse() {\n const { height, width } = this;\n const res = new Bitmap({ height: width, width: height });\n return res.rect({ x: 0, y: 0 }, Infinity, ({ x, y }) => this.data[x][y]);\n }\n // Each pixel size is multiplied by factor\n scale(factor) {\n if (!Number.isSafeInteger(factor) || factor > 1024)\n throw new Error(`invalid scale factor: ${factor}`);\n const { height, width } = this;\n const res = new Bitmap({ height: factor * height, width: factor * width });\n return res.rect({ x: 0, y: 0 }, Infinity, ({ x, y }) => this.data[Math.floor(y / factor)][Math.floor(x / factor)]);\n }\n clone() {\n const res = new Bitmap(this.size());\n return res.rect({ x: 0, y: 0 }, this.size(), ({ x, y }) => this.data[y][x]);\n }\n // Ensure that there is no undefined values left\n assertDrawn() {\n this.rectRead(0, Infinity, (_, cur) => {\n if (typeof cur !== 'boolean')\n throw new Error(`Invalid color type=${typeof cur}`);\n });\n }\n // Simple string representation for debugging\n toString() {\n return this.data\n .map((i) => i.map((j) => (j === undefined ? '?' : j ? 'X' : ' ')).join(''))\n .join(String.fromCharCode(chCodes.newline));\n }\n toASCII() {\n const { height, width, data } = this;\n let out = '';\n // Terminal character height is x2 of character width, so we process two rows of bitmap\n // to produce one row of ASCII\n for (let y = 0; y < height; y += 2) {\n for (let x = 0; x < width; x++) {\n const first = data[y][x];\n const second = y + 1 >= height ? true : data[y + 1][x]; // if last row outside bitmap, make it black\n if (!first && !second)\n out += '█'; // both rows white (empty)\n else if (!first && second)\n out += '▀'; // top row white\n else if (first && !second)\n out += '▄'; // down row white\n else if (first && second)\n out += ' '; // both rows black\n }\n out += String.fromCharCode(chCodes.newline);\n }\n return out;\n }\n toTerm() {\n const cc = String.fromCharCode(chCodes.reset);\n const reset = cc + '[0m';\n const whiteBG = cc + '[1;47m ' + reset;\n const darkBG = cc + `[40m ` + reset;\n return this.data\n .map((i) => i.map((j) => (j ? darkBG : whiteBG)).join(''))\n .join(String.fromCharCode(chCodes.newline));\n }\n toSVG(optimize = true) {\n let out = `<svg viewBox=\"0 0 ${this.width} ${this.height}\" xmlns=\"http://www.w3.org/2000/svg\">`;\n // Construct optimized SVG path data.\n let pathData = '';\n let prevPoint;\n this.rectRead(0, Infinity, (point, val) => {\n if (!val)\n return;\n const { x, y } = point;\n if (!optimize) {\n out += `<rect x=\"${x}\" y=\"${y}\" width=\"1\" height=\"1\" />`;\n return;\n }\n // https://developer.mozilla.org/en-US/docs/Web/SVG/Reference/Attribute/d#path_commands\n // Determine the shortest way to represent the initial cursor movement.\n // M - Move cursor (without drawing) to absolute coordinate pair.\n let m = `M${x} ${y}`;\n // Only allow using the relative cursor move command if previous points\n // were drawn.\n if (prevPoint) {\n // m - Move cursor (without drawing) to relative coordinate pair.\n const relM = `m${x - prevPoint.x} ${y - prevPoint.y}`;\n if (relM.length <= m.length)\n m = relM;\n }\n // Determine the shortest way to represent the cell's bottom line draw.\n // H - Draw line from cursor position to absolute x coordinate.\n // h - Draw line from cursor position to relative x coordinate.\n const bH = x < 10 ? `H${x}` : 'h-1';\n // v - Draw line from cursor position to relative y coordinate.\n // Z - Close path (draws line from cursor position to M coordinate).\n pathData += `${m}h1v1${bH}Z`;\n prevPoint = point;\n });\n if (optimize)\n out += `<path d=\"${pathData}\"/>`;\n out += `</svg>`;\n return out;\n }\n toGIF() {\n // NOTE: Small, but inefficient implementation.\n // Uses 1 byte per pixel.\n const u16le = (i) => [i & 0xff, (i >>> 8) & 0xff];\n const dims = [...u16le(this.width), ...u16le(this.height)];\n const data = [];\n this.rectRead(0, Infinity, (_, cur) => data.push(+(cur === true)));\n const N = 126; // Block size\n // prettier-ignore\n const bytes = [\n 0x47, 0x49, 0x46, 0x38, 0x37, 0x61, ...dims, 0xf6, 0x00, 0x00, 0xff, 0xff, 0xff,\n ...fillArr(3 * 127, 0x00), 0x2c, 0x00, 0x00, 0x00, 0x00, ...dims, 0x00, 0x07\n ];\n const fullChunks = Math.floor(data.length / N);\n // Full blocks\n for (let i = 0; i < fullChunks; i++)\n bytes.push(N + 1, 0x80, ...data.slice(N * i, N * (i + 1)).map((i) => +i));\n // Remaining bytes\n bytes.push((data.length % N) + 1, 0x80, ...data.slice(fullChunks * N).map((i) => +i));\n bytes.push(0x01, 0x81, 0x00, 0x3b);\n return new Uint8Array(bytes);\n }\n toImage(isRGB = false) {\n const { height, width } = this.size();\n const data = new Uint8Array(height * width * (isRGB ? 3 : 4));\n let i = 0;\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n const value = !!this.data[y][x] ? 0 : 255;\n data[i++] = value;\n data[i++] = value;\n data[i++] = value;\n if (!isRGB)\n data[i++] = 255; // alpha channel\n }\n }\n return { height, width, data };\n }\n}\n// End of utils\n// Runtime type-checking\n/** Error correction mode. low: 7%, medium: 15%, quartile: 25%, high: 30% */\nexport const ECMode = ['low', 'medium', 'quartile', 'high'];\n/** QR Code encoding */\nexport const Encoding = ['numeric', 'alphanumeric', 'byte', 'kanji', 'eci'];\n// Various constants & tables\n// prettier-ignore\nconst BYTES = [\n // 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,\n 26, 44, 70, 100, 134, 172, 196, 242, 292, 346, 404, 466, 532, 581, 655, 733, 815, 901, 991, 1085,\n // 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40\n 1156, 1258, 1364, 1474, 1588, 1706, 1828, 1921, 2051, 2185, 2323, 2465, 2611, 2761, 2876, 3034, 3196, 3362, 3532, 3706,\n];\n// prettier-ignore\nconst WORDS_PER_BLOCK = {\n // Version 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40\n low: [7, 10, 15, 20, 26, 18, 20, 24, 30, 18, 20, 24, 26, 30, 22, 24, 28, 30, 28, 28, 28, 28, 30, 30, 26, 28, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30],\n medium: [10, 16, 26, 18, 24, 16, 18, 22, 22, 26, 30, 22, 22, 24, 24, 28, 28, 26, 26, 26, 26, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28],\n quartile: [13, 22, 18, 26, 18, 24, 18, 22, 20, 24, 28, 26, 24, 20, 30, 24, 28, 28, 26, 30, 28, 30, 30, 30, 30, 28, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30],\n high: [17, 28, 22, 16, 22, 28, 26, 26, 24, 28, 24, 28, 22, 24, 24, 30, 28, 28, 26, 28, 30, 24, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30],\n};\n// prettier-ignore\nconst ECC_BLOCKS = {\n // Version 1, 2, 3, 4, 5, 6, 7, 8, 9,10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40\n low: [1, 1, 1, 1, 1, 2, 2, 2, 2, 4, 4, 4, 4, 4, 6, 6, 6, 6, 7, 8, 8, 9, 9, 10, 12, 12, 12, 13, 14, 15, 16, 17, 18, 19, 19, 20, 21, 22, 24, 25],\n medium: [1, 1, 1, 2, 2, 4, 4, 4, 5, 5, 5, 8, 9, 9, 10, 10, 11, 13, 14, 16, 17, 17, 18, 20, 21, 23, 25, 26, 28, 29, 31, 33, 35, 37, 38, 40, 43, 45, 47, 49],\n quartile: [1, 1, 2, 2, 4, 4, 6, 6, 8, 8, 8, 10, 12, 16, 12, 17, 16, 18, 21, 20, 23, 23, 25, 27, 29, 34, 34, 35, 38, 40, 43, 45, 48, 51, 53, 56, 59, 62, 65, 68],\n high: [1, 1, 2, 4, 4, 4, 5, 6, 8, 8, 11, 11, 16, 16, 18, 16, 19, 21, 25, 25, 25, 34, 30, 32, 35, 37, 40, 42, 45, 48, 51, 54, 57, 60, 63, 66, 70, 74, 77, 81],\n};\nconst info = {\n size: {\n encode: (ver) => 21 + 4 * (ver - 1), // ver1 = 21, ver40=177 blocks\n decode: (size) => (size - 17) / 4,\n },\n sizeType: (ver) => Math.floor((ver + 7) / 17),\n // Based on https://codereview.stackexchange.com/questions/74925/algorithm-to-generate-this-alignment-pattern-locations-table-for-qr-codes\n alignmentPatterns(ver) {\n if (ver === 1)\n return [];\n const first = 6;\n const last = info.size.encode(ver) - first - 1;\n const distance = last - first;\n const count = Math.ceil(distance / 28);\n let interval = Math.floor(distance / count);\n if (interval % 2)\n interval += 1;\n else if ((distance % count) * 2 >= count)\n interval += 2;\n const res = [first];\n for (let m = 1; m < count; m++)\n res.push(last - (count - m) * interval);\n res.push(last);\n return res;\n },\n ECCode: {\n low: 0b01,\n medium: 0b00,\n quartile: 0b11,\n high: 0b10,\n },\n formatMask: 0b101010000010010,\n formatBits(ecc, maskIdx) {\n const data = (info.ECCode[ecc] << 3) | maskIdx;\n let d = data;\n for (let i = 0; i < 10; i++)\n d = (d << 1) ^ ((d >> 9) * 0b10100110111);\n return ((data << 10) | d) ^ info.formatMask;\n },\n versionBits(ver) {\n let d = ver;\n for (let i = 0; i < 12; i++)\n d = (d << 1) ^ ((d >> 11) * 0b1111100100101);\n return (ver << 12) | d;\n },\n alphabet: {\n numeric: alphabet('0123456789'),\n alphanumerc: alphabet('0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:'),\n }, // as Record<EncodingType, ReturnType<typeof alphabet>>,\n lengthBits(ver, type) {\n const table = {\n numeric: [10, 12, 14],\n alphanumeric: [9, 11, 13],\n byte: [8, 16, 16],\n kanji: [8, 10, 12],\n eci: [0, 0, 0],\n };\n return table[type][info.sizeType(ver)];\n },\n modeBits: {\n numeric: '0001',\n alphanumeric: '0010',\n byte: '0100',\n kanji: '1000',\n eci: '0111',\n },\n capacity(ver, ecc) {\n const bytes = BYTES[ver - 1];\n const words = WORDS_PER_BLOCK[ecc][ver - 1];\n const numBlocks = ECC_BLOCKS[ecc][ver - 1];\n const blockLen = Math.floor(bytes / numBlocks) - words;\n const shortBlocks = numBlocks - (bytes % numBlocks);\n return {\n words,\n numBlocks,\n shortBlocks,\n blockLen,\n capacity: (bytes - words * numBlocks) * 8,\n total: (words + blockLen) * numBlocks + numBlocks - shortBlocks,\n };\n },\n};\nconst PATTERNS = [\n (x, y) => (x + y) % 2 == 0,\n (_x, y) => y % 2 == 0,\n (x, _y) => x % 3 == 0,\n (x, y) => (x + y) % 3 == 0,\n (x, y) => (Math.floor(y / 2) + Math.floor(x / 3)) % 2 == 0,\n (x, y) => ((x * y) % 2) + ((x * y) % 3) == 0,\n (x, y) => (((x * y) % 2) + ((x * y) % 3)) % 2 == 0,\n (x, y) => (((x + y) % 2) + ((x * y) % 3)) % 2 == 0,\n];\n// Galois field && reed-solomon encoding\nconst GF = {\n tables: ((p_poly) => {\n const exp = fillArr(256, 0);\n const log = fillArr(256, 0);\n for (let i = 0, x = 1; i < 256; i++) {\n exp[i] = x;\n log[x] = i;\n x <<= 1;\n if (x & 0x100)\n x ^= p_poly;\n }\n return { exp, log };\n })(0x11d),\n exp: (x) => GF.tables.exp[x],\n log(x) {\n if (x === 0)\n throw new Error(`GF.log: invalid arg=${x}`);\n return GF.tables.log[x] % 255;\n },\n mul(x, y) {\n if (x === 0 || y === 0)\n return 0;\n return GF.tables.exp[(GF.tables.log[x] + GF.tables.log[y]) % 255];\n },\n add: (x, y) => x ^ y,\n pow: (x, e) => GF.tables.exp[(GF.tables.log[x] * e) % 255],\n inv(x) {\n if (x === 0)\n throw new Error(`GF.inverse: invalid arg=${x}`);\n return GF.tables.exp[255 - GF.tables.log[x]];\n },\n polynomial(poly) {\n if (poly.length == 0)\n throw new Error('GF.polymomial: invalid length');\n if (poly[0] !== 0)\n return poly;\n // Strip leading zeros\n let i = 0;\n for (; i < poly.length - 1 && poly[i] == 0; i++)\n ;\n return poly.slice(i);\n },\n monomial(degree, coefficient) {\n if (degree < 0)\n throw new Error(`GF.monomial: invalid degree=${degree}`);\n if (coefficient == 0)\n return [0];\n let coefficients = fillArr(degree + 1, 0);\n coefficients[0] = coefficient;\n return GF.polynomial(coefficients);\n },\n degree: (a) => a.length - 1,\n coefficient: (a, degree) => a[GF.degree(a) - degree],\n mulPoly(a, b) {\n if (a[0] === 0 || b[0] === 0)\n return [0];\n const res = fillArr(a.length + b.length - 1, 0);\n for (let i = 0; i < a.length; i++) {\n for (let j = 0; j < b.length; j++) {\n res[i + j] = GF.add(res[i + j], GF.mul(a[i], b[j]));\n }\n }\n return GF.polynomial(res);\n },\n mulPolyScalar(a, scalar) {\n if (scalar == 0)\n return [0];\n if (scalar == 1)\n return a;\n const res = fillArr(a.length, 0);\n for (let i = 0; i < a.length; i++)\n res[i] = GF.mul(a[i], scalar);\n return GF.polynomial(res);\n },\n mulPolyMonomial(a, degree, coefficient) {\n if (degree < 0)\n throw new Error('GF.mulPolyMonomial: invalid degree');\n if (coefficient == 0)\n return [0];\n const res = fillArr(a.length + degree, 0);\n for (let i = 0; i < a.length; i++)\n res[i] = GF.mul(a[i], coefficient);\n return GF.polynomial(res);\n },\n addPoly(a, b) {\n if (a[0] === 0)\n return b;\n if (b[0] === 0)\n return a;\n let smaller = a;\n let larger = b;\n if (smaller.length > larger.length)\n [smaller, larger] = [larger, smaller];\n let sumDiff = fillArr(larger.length, 0);\n let lengthDiff = larger.length - smaller.length;\n let s = larger.slice(0, lengthDiff);\n for (let i = 0; i < s.length; i++)\n sumDiff[i] = s[i];\n for (let i = lengthDiff; i < larger.length; i++)\n sumDiff[i] = GF.add(smaller[i - lengthDiff], larger[i]);\n return GF.polynomial(sumDiff);\n },\n remainderPoly(data, divisor) {\n const out = Array.from(data);\n for (let i = 0; i < data.length - divisor.length + 1; i++) {\n const elm = out[i];\n if (elm === 0)\n continue;\n for (let j = 1; j < divisor.length; j++) {\n if (divisor[j] !== 0)\n out[i + j] = GF.add(out[i + j], GF.mul(divisor[j], elm));\n }\n }\n return out.slice(data.length - divisor.length + 1, out.length);\n },\n divisorPoly(degree) {\n let g = [1];\n for (let i = 0; i < degree; i++)\n g = GF.mulPoly(g, [1, GF.pow(2, i)]);\n return g;\n },\n evalPoly(poly, a) {\n if (a == 0)\n return GF.coefficient(poly, 0); // Just return the x^0 coefficient\n let res = poly[0];\n for (let i = 1; i < poly.length; i++)\n res = GF.add(GF.mul(a, res), poly[i]);\n return res;\n },\n // TODO: cleanup\n euclidian(a, b, R) {\n // Force degree(a) >= degree(b)\n if (GF.degree(a) < GF.degree(b))\n [a, b] = [b, a];\n let rLast = a;\n let r = b;\n let tLast = [0];\n let t = [1];\n // while degree of Ri ≥ t/2\n while (2 * GF.degree(r) >= R) {\n let rLastLast = rLast;\n let tLastLast = tLast;\n rLast = r;\n tLast = t;\n if (rLast[0] === 0)\n throw new Error('rLast[0] === 0');\n r = rLastLast;\n let q = [0];\n const dltInverse = GF.inv(rLast[0]);\n while (GF.degree(r) >= GF.degree(rLast) && r[0] !== 0) {\n const degreeDiff = GF.degree(r) - GF.degree(rLast);\n const scale = GF.mul(r[0], dltInverse);\n q = GF.addPoly(q, GF.monomial(degreeDiff, scale));\n r = GF.addPoly(r, GF.mulPolyMonomial(rLast, degreeDiff, scale));\n }\n q = GF.mulPoly(q, tLast);\n t = GF.addPoly(q, tLastLast);\n if (GF.degree(r) >= GF.degree(rLast))\n throw new Error(`Division failed r: ${r}, rLast: ${rLast}`);\n }\n const sigmaTildeAtZero = GF.coefficient(t, 0);\n if (sigmaTildeAtZero == 0)\n throw new Error('sigmaTilde(0) was zero');\n const inverse = GF.inv(sigmaTildeAtZero);\n return [GF.mulPolyScalar(t, inverse), GF.mulPolyScalar(r, inverse)];\n },\n};\nfunction RS(eccWords) {\n return {\n encode(from) {\n const d = GF.divisorPoly(eccWords);\n const pol = Array.from(from);\n pol.push(...d.slice(0, -1).fill(0));\n return Uint8Array.from(GF.remainderPoly(pol, d));\n },\n decode(to) {\n const res = to.slice();\n const poly = GF.polynomial(Array.from(to));\n // Find errors\n let syndrome = fillArr(eccWords, 0);\n let hasError = false;\n for (let i = 0; i < eccWords; i++) {\n const evl = GF.evalPoly(poly, GF.exp(i));\n syndrome[syndrome.length - 1 - i] = evl;\n if (evl !== 0)\n hasError = true;\n }\n if (!hasError)\n return res;\n syndrome = GF.polynomial(syndrome);\n const monomial = GF.monomial(eccWords, 1);\n const [errorLocator, errorEvaluator] = GF.euclidian(monomial, syndrome, eccWords);\n // Error locations\n const locations = fillArr(GF.degree(errorLocator), 0);\n let e = 0;\n for (let i = 1; i < 256 && e < locations.length; i++) {\n if (GF.evalPoly(errorLocator, i) === 0)\n locations[e++] = GF.inv(i);\n }\n if (e !== locations.length)\n throw new Error('RS.decode: invalid errors number');\n for (let i = 0; i < locations.length; i++) {\n const pos = res.length - 1 - GF.log(locations[i]);\n if (pos < 0)\n throw new Error('RS.decode: invalid error location');\n const xiInverse = GF.inv(locations[i]);\n let denominator = 1;\n for (let j = 0; j < locations.length; j++) {\n if (i === j)\n continue;\n denominator = GF.mul(denominator, GF.add(1, GF.mul(locations[j], xiInverse)));\n }\n res[pos] = GF.add(res[pos], GF.mul(GF.evalPoly(errorEvaluator, xiInverse), GF.inv(denominator)));\n }\n return res;\n },\n };\n}\n// Interleaves blocks\nfunction interleave(ver, ecc) {\n const { words, shortBlocks, numBlocks, blockLen, total } = info.capacity(ver, ecc);\n const rs = RS(words);\n return {\n encode(bytes) {\n // Add error correction to bytes\n const blocks = [];\n const eccBlocks = [];\n for (let i = 0; i < numBlocks; i++) {\n const isShort = i < shortBlocks;\n const len = blockLen + (isShort ? 0 : 1);\n blocks.push(bytes.subarray(0, len));\n eccBlocks.push(rs.encode(bytes.subarray(0, len)));\n bytes = bytes.subarray(len);\n }\n const resBlocks = interleaveBytes(...blocks);\n const resECC = interleaveBytes(...eccBlocks);\n const res = new Uint8Array(resBlocks.length + resECC.length);\n res.set(resBlocks);\n res.set(resECC, resBlocks.length);\n return res;\n },\n decode(data) {\n if (data.length !== total)\n throw new Error(`interleave.decode: len(data)=${data.length}, total=${total}`);\n const blocks = [];\n for (let i = 0; i < numBlocks; i++) {\n const isShort = i < shortBlocks;\n blocks.push(new Uint8Array(words + blockLen + (isShort ? 0 : 1)));\n }\n // Short blocks\n let pos = 0;\n for (let i = 0; i < blockLen; i++) {\n for (let j = 0; j < numBlocks; j++)\n blocks[j][i] = data[pos++];\n }\n // Long blocks\n for (let j = shortBlocks; j < numBlocks; j++)\n blocks[j][blockLen] = data[pos++];\n // ECC\n for (let i = blockLen; i < blockLen + words; i++) {\n for (let j = 0; j < numBlocks; j++) {\n const isShort = j < shortBlocks;\n blocks[j][i + (isShort ? 0 : 1)] = data[pos++];\n }\n }\n // Decode\n // Error-correct and copy data blocks together into a stream of bytes\n const res = [];\n for (const block of blocks)\n res.push(...Array.from(rs.decode(block)).slice(0, -words));\n return Uint8Array.from(res);\n },\n };\n}\n// Draw\n// Generic template per version+ecc+mask. Can be cached, to speedup calculations.\nfunction drawTemplate(ver, ecc, maskIdx, test = false) {\n const size = info.size.encode(ver);\n let b = new Bitmap(size + 2);\n // Finder patterns\n // We draw full pattern and later slice, since before addition of borders finder is truncated by one pixel on sides\n const finder = new Bitmap(3).rect(0, 3, true).border(1, false).border(1, true).border(1, false);\n b = b\n .embed(0, finder) // top left\n .embed({ x: -finder.width, y: 0 }, finder) // top right\n .embed({ x: 0, y: -finder.height }, finder); // bottom left\n b = b.rectSlice(1, size);\n // Alignment patterns\n const align = new Bitmap(1).rect(0, 1, true).border(1, false).border(1, true);\n const alignPos = info.alignmentPatterns(ver);\n for (const y of alignPos) {\n for (const x of alignPos) {\n if (b.data[y][x] !== undefined)\n continue;\n b.embed({ x: x - 2, y: y - 2 }, align); // center of pattern should be at position\n }\n }\n // Timing patterns\n b = b\n .hLine({ x: 0, y: 6 }, Infinity, ({ x }, cur) => (cur === undefined ? x % 2 == 0 : cur))\n .vLine({ x: 6, y: 0 }, Infinity, ({ y }, cur) => (cur === undefined ? y % 2 == 0 : cur));\n // Format information\n {\n const bits = info.formatBits(ecc, maskIdx);\n const getBit = (i) => !test && ((bits >> i) & 1) == 1;\n // vertical\n for (let i = 0; i < 6; i++)\n b.data[i][8] = getBit(i); // right of top-left finder\n // TODO: re-write as lines, like:\n // b.vLine({ x: 8, y: 0 }, 6, ({ x, y }) => getBit(y));\n for (let i = 6; i < 8; i++)\n b.data[i + 1][8] = getBit(i); // after timing pattern\n for (let i = 8; i < 15; i++)\n b.data[size - 15 + i][8] = getBit(i); // right of bottom-left finder\n // horizontal\n for (let i = 0; i < 8; i++)\n b.data[8][size - i - 1] = getBit(i); // under top-right finder\n for (let i = 8; i < 9; i++)\n b.data[8][15 - i - 1 + 1] = getBit(i); // VVV, after timing\n for (let i = 9; i < 15; i++)\n b.data[8][15 - i - 1] = getBit(i); // under top-left finder\n b.data[size - 8][8] = !test; // bottom-left finder, right\n }\n // Version information\n if (ver >= 7) {\n const bits = info.versionBits(ver);\n for (let i = 0; i < 18; i += 1) {\n const bit = !test && ((bits >> i) & 1) == 1;\n const x = Math.floor(i / 3);\n const y = (i % 3) + size - 8 - 3;\n // two copies\n b.data[x][y] = bit;\n b.data[y][x] = bit;\n }\n }\n return b;\n}\n// zigzag: bottom->top && top->bottom\nfunction zigzag(tpl, maskIdx, fn) {\n const size = tpl.height;\n const pattern = PATTERNS[maskIdx];\n // zig-zag pattern\n let dir = -1;\n let y = size - 1;\n // two columns at time\n for (let xOffset = size - 1; xOffset > 0; xOffset -= 2) {\n if (xOffset == 6)\n xOffset = 5; // skip vertical timing pattern\n for (;; y += dir) {\n for (let j = 0; j < 2; j += 1) {\n const x = xOffset - j;\n if (tpl.data[y][x] !== undefined)\n continue; // skip already written elements\n fn(x, y, pattern(x, y));\n }\n if (y + dir < 0 || y + dir >= size)\n break;\n }\n dir = -dir; // change direction\n }\n}\n// NOTE: byte encoding is just representation, QR works with strings only. Most decoders will fail on raw byte array,\n// since they expect unicode or other text encoding inside bytes\nfunction detectType(str) {\n let type = 'numeric';\n for (let x of str) {\n if (info.alphabet.numeric.has(x))\n continue;\n type = 'alphanumeric';\n if (!info.alphabet.alphanumerc.has(x))\n return 'byte';\n }\n return type;\n}\n/**\n * @example utf8ToBytes('abc') // new Uint8Array([97, 98, 99])\n */\nexport function utf8ToBytes(str) {\n if (typeof str !== 'string')\n throw new Error(`utf8ToBytes expected string, got ${typeof str}`);\n return new Uint8Array(new TextEncoder().encode(str)); // https://bugzil.la/1681809\n}\nfunction encode(ver, ecc, data, type) {\n let encoded = '';\n let dataLen = data.length;\n if (type === 'numeric') {\n const t = info.alphabet.numeric.decode(data.split(''));\n const n = t.length;\n for (let i = 0; i < n - 2; i += 3)\n encoded += bin(t[i] * 100 + t[i + 1] * 10 + t[i + 2], 10);\n if (n % 3 === 1) {\n encoded += bin(t[n - 1], 4);\n }\n else if (n % 3 === 2) {\n encoded += bin(t[n - 2] * 10 + t[n - 1], 7);\n }\n }\n else if (type === 'alphanumeric') {\n const t = info.alphabet.alphanumerc.decode(data.split(''));\n const n = t.length;\n for (let i = 0; i < n - 1; i += 2)\n encoded += bin(t[i] * 45 + t[i + 1], 11);\n if (n % 2 == 1)\n encoded += bin(t[n - 1], 6); // pad if odd number of chars\n }\n else if (type === 'byte') {\n const utf8 = utf8ToBytes(data);\n dataLen = utf8.length;\n encoded = Array.from(utf8)\n .map((i) => bin(i, 8))\n .join('');\n }\n else {\n throw new Error('encode: unsupported type');\n }\n const { capacity } = info.capacity(ver, ecc);\n const len = bin(dataLen, info.lengthBits(ver, type));\n let bits = info.modeBits[type] + len + encoded;\n if (bits.length > capacity)\n throw new Error('Capacity overflow');\n // Terminator\n bits += '0'.repeat(Math.min(4, Math.max(0, capacity - bits.length)));\n // Pad bits string untill full byte\n if (bits.length % 8)\n bits += '0'.repeat(8 - (bits.length % 8));\n // Add padding until capacity is full\n const padding = '1110110000010001';\n for (let idx = 0; bits.length !== capacity; idx++)\n bits += padding[idx % padding.length];\n // Convert a bitstring to array of bytes\n const bytes = Uint8Array.from(bits.match(/(.{8})/g).map((i) => Number(`0b${i}`)));\n return interleave(ver, ecc).encode(bytes);\n}\n// DRAW\nfunction drawQR(ver, ecc, data, maskIdx, test = false) {\n const b = drawTemplate(ver, ecc, maskIdx, test);\n let i = 0;\n const need = 8 * data.length;\n zigzag(b, maskIdx, (x, y, mask) => {\n let value = false;\n if (i < need) {\n value = ((data[i >>> 3] >> ((7 - i) & 7)) & 1) !== 0;\n i++;\n }\n b.data[y][x] = value !== mask; // !== as xor\n });\n if (i !== need)\n throw new Error('QR: bytes left after draw');\n return b;\n}\nfunction penalty(bm) {\n const inverse = bm.inverse();\n // Adjacent modules in row/column in same | No. of modules = (5 + i) color\n const sameColor = (row) => {\n let res = 0;\n for (let i = 0, same = 1, last = undefined; i < row.length; i++) {\n if (last === row[i]) {\n same++;\n if (i !== row.length - 1)\n continue; // handle last element\n }\n if (same >= 5)\n res += 3 + (same - 5);\n last = row[i];\n same = 1;\n }\n return res;\n };\n let adjacent = 0;\n bm.data.forEach((row) => (adjacent += sameColor(row)));\n inverse.data.forEach((column) => (adjacent += sameColor(column)));\n // Block of modules in same color (Block size = 2x2)\n let box = 0;\n let b = bm.data;\n const lastW = bm.width - 1;\n const lastH = bm.height - 1;\n for (let x = 0; x < lastW; x++) {\n for (let y = 0; y < lastH; y++) {\n const x1 = x + 1;\n const y1 = y + 1;\n if (b[x][y] === b[x1][y] && b[x1][y] === b[x][y1] && b[x1][y] === b[x1][y1]) {\n box += 3;\n }\n }\n }\n // 1:1:3:1:1 ratio (dark:light:dark:light:dark) pattern in row/column, preceded or followed by light area 4 modules wide\n const finderPattern = (row) => {\n const finderPattern = [true, false, true, true, true, false, true]; // dark:light:dark:light:dark\n const lightPattern = [false, false, false, false]; // light area 4 modules wide\n const p1 = [...finderPattern, ...lightPattern];\n const p2 = [...lightPattern, ...finderPattern];\n let res = 0;\n for (let i = 0; i < row.length; i++) {\n if (includesAt(row, p1, i))\n res += 40;\n if (includesAt(row, p2, i))\n res += 40;\n }\n return res;\n };\n let finder = 0;\n for (const row of bm.data)\n finder += finderPattern(row);\n for (const column of inverse.data)\n finder += finderPattern(column);\n // Proportion of dark modules in entire symbol\n // Add 10 points to a deviation of 5% increment or decrement in the proportion\n // ratio of dark module from the referential 50%\n let darkPixels = 0;\n bm.rectRead(0, Infinity, (_c, val) => (darkPixels += val ? 1 : 0));\n const darkPercent = (darkPixels / (bm.height * bm.width)) * 100;\n const dark = 10 * Math.floor(Math.abs(darkPercent - 50) / 5);\n return adjacent + box + finder + dark;\n}\n// Selects best mask according to penalty, if no mask is provided\nfunction drawQRBest(ver, ecc, data, maskIdx) {\n if (maskIdx === undefined) {\n const bestMask = best();\n for (let mask = 0; mask < PATTERNS.length; mask++)\n bestMask.add(penalty(drawQR(ver, ecc, data, mask, true)), mask);\n maskIdx = bestMask.get();\n }\n if (maskIdx === undefined)\n throw new Error('Cannot find mask'); // Should never happen\n return drawQR(ver, ecc, data, maskIdx);\n}\nfunction validateECC(ec) {\n if (!ECMode.includes(ec))\n throw new Error(`Invalid error correction mode=${ec}. Expected: ${ECMode}`);\n}\nfunction validateEncoding(enc) {\n if (!Encoding.includes(enc))\n throw new Error(`Encoding: invalid mode=${enc}. Expected: ${Encoding}`);\n if (enc === 'kanji' || enc === 'eci')\n throw new Error(`Encoding: ${enc} is not supported (yet?).`);\n}\nfunction validateMask(mask) {\n if (![0, 1, 2, 3, 4, 5, 6, 7].includes(mask) || !PATTERNS[mask])\n throw new Error(`Invalid mask=${mask}. Expected number [0..7]`);\n}\nexport function encodeQR(text, output = 'raw', opts = {}) {\n const ecc = opts.ecc !== undefined ? opts.ecc : 'medium';\n validateECC(ecc);\n const encoding = opts.encoding !== undefined ? opts.encoding : detectType(text);\n validateEncoding(encoding);\n if (opts.mask !== undefined)\n validateMask(opts.mask);\n let ver = opts.version;\n let data, err = new Error('Unknown error');\n if (ver !== undefined) {\n validateVersion(ver);\n data = encode(ver, ecc, text, encoding);\n }\n else {\n // If no version is provided, try to find smallest one which fits\n // Currently just scans all version, can be significantly speedup if needed\n for (let i = 1; i <= 40; i++) {\n try {\n data = encode(i, ecc, text, encoding);\n ver = i;\n break;\n }\n catch (e) {\n err = e;\n }\n }\n }\n if (!ver || !data)\n throw err;\n let res = drawQRBest(ver, ecc, data, opts.mask);\n res.assertDrawn();\n const border = opts.border === undefined ? 2 : opts.border;\n if (!Number.isSafeInteger(border))\n throw new Error(`invalid border type=${typeof border}`);\n res = res.border(border, false); // Add border\n if (opts.scale !== undefined)\n res = res.scale(opts.scale); // Scale image\n if (output === 'raw')\n return res.data;\n else if (output === 'ascii')\n return res.toASCII();\n else if (output === 'svg')\n return res.toSVG(opts.optimize);\n else if (output === 'gif')\n return res.toGIF();\n else if (output === 'term')\n return res.toTerm();\n else\n throw new Error(`Unknown output: ${output}`);\n}\nexport default encodeQR;\nexport const utils = {\n best,\n bin,\n drawTemplate,\n fillArr,\n info,\n interleave,\n validateVersion,\n zigzag,\n};\n// Unsafe API utils, exported only for tests\nexport const _tests = {\n Bitmap,\n info,\n detectType,\n encode,\n drawQR,\n penalty,\n PATTERNS,\n};\n// Type tests\n// const o1 = qr('test', 'ascii');\n// const o2 = qr('test', 'raw');\n// const o3 = qr('test', 'gif');\n// const o4 = qr('test', 'svg');\n// const o5 = qr('test', 'term');\n//# sourceMappingURL=index.js.map","import { html, LitElement } from 'lit'\nimport { customElement, property, query } from 'lit/decorators.js'\nimport { styleMap } from 'lit/directives/style-map.js'\nimport encodeQR from 'qr'\nimport { observe } from '../common/decorators/observe.js'\nimport componentStyle from '../common/styles/Component.css'\nimport style from './Qrcode.css'\n\nconst correctionMap: Record<'L' | 'M' | 'Q' | 'H', 'low' | 'medium' | 'quartile' | 'high'> = {\n L: 'low',\n M: 'medium',\n Q: 'quartile',\n H: 'high',\n}\n\n/**\n * QR Code component is used for providing information or links\n * to users which they can quickly scan with their smartphone.\n *\n * @status ready\n * @category content\n * @displayName QR Code\n */\n@customElement('nord-qrcode')\nexport default class Qrcode extends LitElement {\n static styles = [componentStyle, style]\n\n @query('canvas', true) private canvas!: HTMLCanvasElement\n @query('.computed', true) private computed!: HTMLElement\n\n /**\n * The value of the QR Code, most commonly an URL.\n */\n @property({ reflect: true }) value = ''\n\n /**\n * Label used by assistive technology. If unspecified, the value will\n * be used instead.\n */\n @property({ reflect: true }) label = ''\n\n /**\n * The size of the rendered QR Code in pixels.\n */\n @property({ reflect: true, type: Number }) size = 128\n\n /**\n * The fill color of the QR Code.\n * Can accept any valid CSS color value, including custom properties.\n */\n @property({ reflect: true }) color = 'var(--n-color-text)'\n\n /**\n * The background color of the QR Code.\n * Can accept any valid CSS color value, including custom properties.\n */\n @property({ reflect: true }) background = 'var(--n-color-surface)'\n\n /**\n * Error correction level makes the QR Code bigger and helps users to\n * scan it without issues. L, M, Q and H values will use 7%, 15%, 25%\n * and 30% of the QR code for error correction respectively.\n */\n @property({ reflect: true }) correction: 'L' | 'M' | 'Q' | 'H' = 'H'\n\n firstUpdated() {\n this.generate()\n }\n\n @observe('correction')\n @observe('color')\n @observe('background')\n @observe('size')\n @observe('value')\n private generate() {\n /**\n * Lit’s built-in hasUpdated property returns true if the component\n * has updated at least once.\n */\n if (!this.hasUpdated) {\n return\n }\n\n const { backgroundColor, color } = getComputedStyle(this.computed)\n\n const qrArray = encodeQR(this.value, 'raw', {\n ecc: correctionMap[this.correction],\n border: 0,\n })\n\n // Draw the canvas 2x larger to avoid blurring on high DPI displays\n const size = this.size * 2\n const ctx = this.canvas.getContext('2d')\n const scale = size / qrArray.length\n\n this.canvas.width = size\n this.canvas.height = size\n\n if (ctx) {\n ctx.fillStyle = backgroundColor\n ctx.fillRect(0, 0, size, size)\n qrArray.forEach((row, y) => {\n row.forEach((cell, x) => {\n if (cell) {\n ctx.fillStyle = color\n ctx.fillRect(x * scale, y * scale, scale, scale)\n }\n })\n })\n }\n }\n\n render() {\n return html`\n <div\n class=\"n-qrcode\"\n style=${styleMap({\n 'inline-size': `${this.size}px`,\n 'block-size': `${this.size}px`,\n })}\n >\n <canvas role=\"img\" aria-label=${this.label.length > 0 ? this.label : this.value}></canvas>\n </div>\n <div\n class=\"computed\"\n hidden\n style=${styleMap({\n 'background-color': `${this.background}`,\n 'color': `${this.color}`,\n })}\n ></div>\n `\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'nord-qrcode': Qrcode\n }\n}\n"],"names":["chCodes","bin","dec","pad","toString","padStart","mod","a","b","result","fillArr","length","val","Array","fill","interleaveBytes","blocks","len","Math","max","res","i","push","Uint8Array","includesAt","lst","pattern","index","alphabet","has","char","includes","decode","input","isArray","Error","map","letter","indexOf","encode","digits","n","Number","isSafeInteger","assertNumber","Bitmap","size","limit","height","width","Infinity","undefined","min","fromString","s","lines","replace","split","String","fromCharCode","data","line","row","constructor","this","from","point","p","y","x","isInside","offset","xy","c","rect","value","yPos","xPos","rectRead","fn","cur","hLine","vLine","border","v","h","embed","bm","rectSlice","inverse","scale","factor","floor","clone","assertDrawn","_","j","join","toASCII","out","first","second","toTerm","cc","reset","whiteBG","darkBG","toSVG","optimize","prevPoint","pathData","m","relM","toGIF","u16le","dims","N","bytes","fullChunks","slice","toImage","isRGB","ECMode","Encoding","BYTES","WORDS_PER_BLOCK","low","medium","quartile","high","ECC_BLOCKS","info","ver","sizeType","alignmentPatterns","last","distance","count","ceil","interval","ECCode","formatMask","formatBits","ecc","maskIdx","d","versionBits","numeric","alphanumerc","lengthBits","type","alphanumeric","byte","kanji","eci","modeBits","capacity","words","numBlocks","blockLen","shortBlocks","total","PATTERNS","_x","_y","GF","tables","exp","log","mul","add","pow","e","inv","polynomial","poly","monomial","degree","coefficient","coefficients","mulPoly","mulPolyScalar","scalar","mulPolyMonomial","addPoly","smaller","larger","sumDiff","lengthDiff","remainderPoly","divisor","elm","divisorPoly","g","evalPoly","euclidian","R","rLast","r","tLast","t","rLastLast","tLastLast","q","dltInverse","degreeDiff","sigmaTildeAtZero","interleave","rs","eccWords","pol","to","syndrome","hasError","evl","errorLocator","errorEvaluator","locations","pos","xiInverse","denominator","eccBlocks","subarray","resBlocks","resECC","set","isShort","block","encoded","dataLen","utf8","str","TextEncoder","utf8ToBytes","bits","repeat","padding","idx","match","drawQR","test","finder","align","alignPos","getBit","bit","drawTemplate","need","tpl","dir","xOffset","zigzag","mask","penalty","sameColor","same","adjacent","forEach","column","box","lastW","lastH","x1","y1","finderPattern","lightPattern","p1","p2","darkPixels","_c","darkPercent","dark","abs","encodeQR","text","output","opts","ec","validateECC","encoding","detectType","enc","validateEncoding","validateMask","version","err","validateVersion","bestMask","best","bestScore","score","get","drawQRBest","correctionMap","L","M","Q","H","Qrcode","LitElement","label","color","background","correction","firstUpdated","generate","hasUpdated","backgroundColor","getComputedStyle","computed","qrArray","ctx","canvas","getContext","fillStyle","fillRect","cell","render","html","styleMap","styles","componentStyle","style","__decorate","query","prototype","property","reflect","observe","customElement"],"mappings":"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","x_google_ignoreList":[0]}
@@ -1 +1 @@
1
- {"version":3,"file":"ScrollArea.js","sources":["../src/scroll-area/ScrollArea.ts"],"sourcesContent":["import { html, LitElement } from 'lit'\nimport { customElement, property, query, state } from 'lit/decorators.js'\n\nimport { DraftComponentMixin } from '../common/mixins/DraftComponentMixin.js'\nimport componentStyle from '../common/styles/Component.css'\nimport style from './ScrollArea.css'\n\n/** Time (ms) the `data-scrolling` state lingers after the last scroll. */\nconst SCROLL_TIMEOUT = 500\n/** Smallest the thumb is allowed to shrink to, in pixels. */\nconst MIN_THUMB_SIZE = 16\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max)\n}\n\n/** Computed margin/padding offset of an element along an axis, like Base UI's `getOffset`. */\nfunction getOffset(element: Element | null, prop: 'margin' | 'padding', axis: 'x' | 'y'): number {\n if (!element) {\n return 0\n }\n const styles = getComputedStyle(element)\n const side = axis === 'x' ? 'Inline' : 'Block'\n return Number.parseFloat(styles[`${prop}${side}Start` as never]) + Number.parseFloat(styles[`${prop}${side}End` as never])\n}\n\n/**\n * Scroll Area is a container that wraps overflowing content in a custom scroll\n * viewport with consistently-styled scrollbars. Native scrollbars are hidden and\n * replaced with a thin overlay thumb that appears on hover or while scrolling.\n *\n * It also exposes the distance from each edge as CSS custom properties\n * (`--scroll-area-overflow-*`), which can drive an edge-fade mask on\n * `::part(viewport)` — see the docs example.\n *\n * The scroll machinery lives in shadow DOM; slot your content directly inside.\n *\n * @status draft\n * @category structure\n *\n * @slot - The scrollable content.\n *\n * @csspart viewport - The scrolling container that holds the slotted content.\n * @csspart scrollbar-block - The scrollbar track for the block (vertical) axis.\n * @csspart scrollbar-inline - The scrollbar track for the inline (horizontal) axis.\n * @csspart thumb-block - The draggable thumb of the block-axis scrollbar.\n * @csspart thumb-inline - The draggable thumb of the inline-axis scrollbar.\n * @csspart corner - The square where the two scrollbars meet (when `axis=\"both\"`).\n *\n * @cssprop [--n-scroll-area-fade-size=24px] - Depth of the edge fade (when `fade` is set).\n * @cssprop [--n-scroll-area-scrollbar-size=10px] - Thickness of the scrollbar track and thumb.\n * @cssprop [--n-scroll-area-scrollbar-inset=2px] - Inset of the scrollbar from the viewport edge.\n * @cssprop [--n-scroll-area-thumb-color] - Thumb fill (defaults to the border token).\n * @cssprop [--n-scroll-area-thumb-color-hover] - Thumb fill on hover (defaults to the strong border token).\n * @cssprop [--scroll-area-overflow-y-start] - Read-only: pixels scrolled past the block start edge.\n * @cssprop [--scroll-area-overflow-y-end] - Read-only: pixels remaining to the block end edge.\n * @cssprop [--scroll-area-overflow-x-start] - Read-only: pixels scrolled past the inline start edge.\n * @cssprop [--scroll-area-overflow-x-end] - Read-only: pixels remaining to the inline end edge.\n */\n@customElement('nord-scroll-area')\nexport default class ScrollArea extends DraftComponentMixin(LitElement) {\n static styles = [componentStyle, style]\n\n /**\n * Which scrollbars to render. `block` is vertical, `inline` is horizontal.\n * @default \"block\"\n */\n @property({ reflect: true }) axis: 'block' | 'inline' | 'both' = 'block'\n\n /**\n * Distance in pixels past an edge before the matching `data-overflow-*` state\n * (and edge-fade variable) is considered active.\n * @default 0\n */\n @property({ type: Number, attribute: 'overflow-edge-threshold' }) overflowEdgeThreshold = 0\n\n /**\n * Fades the content in and out at the scroll edges with a mask, signalling\n * there is more content beyond the edge.\n * @default false\n */\n @property({ type: Boolean, reflect: true }) fade = false\n\n /** Always display the scrollbar instead of hiding it when idle. */\n @property({ type: Boolean, reflect: true, attribute: 'always-show-scrollbar' }) alwaysShowScrollbar = false\n\n @query('[part~=\"viewport\"]') private viewport!: HTMLDivElement\n @query('[part~=\"scrollbar-block\"]') private scrollbarBlock?: HTMLDivElement | null\n @query('[part~=\"thumb-block\"]') private thumbBlock?: HTMLDivElement | null\n @query('[part~=\"scrollbar-inline\"]') private scrollbarInline?: HTMLDivElement | null\n @query('[part~=\"thumb-inline\"]') private thumbInline?: HTMLDivElement | null\n\n @state() private hasBlockOverflow = false\n @state() private hasInlineOverflow = false\n\n private resizeObserver?: ResizeObserver\n private coarsePointer?: MediaQueryList\n private scrollTimeout?: ReturnType<typeof setTimeout>\n\n // Drag state\n private dragOrientation: 'block' | 'inline' | null = null\n private dragStart = 0\n private dragStartScroll = 0\n\n private get hasBlock(): boolean {\n return this.axis === 'block' || this.axis === 'both'\n }\n\n private get hasInline(): boolean {\n return this.axis === 'inline' || this.axis === 'both'\n }\n\n connectedCallback(): void {\n super.connectedCallback()\n this.addEventListener('pointerenter', this.handlePointerOver)\n this.addEventListener('pointermove', this.handlePointerOver)\n this.addEventListener('pointerleave', this.handlePointerLeave)\n this.coarsePointer = window.matchMedia('(pointer: coarse)')\n this.coarsePointer.addEventListener('change', this.handleCoarseChange)\n this.toggleAttribute('data-touch', this.coarsePointer.matches)\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback()\n this.removeEventListener('pointerenter', this.handlePointerOver)\n this.removeEventListener('pointermove', this.handlePointerOver)\n this.removeEventListener('pointerleave', this.handlePointerLeave)\n this.coarsePointer?.removeEventListener('change', this.handleCoarseChange)\n this.resizeObserver?.disconnect()\n if (this.scrollTimeout) {\n clearTimeout(this.scrollTimeout)\n }\n }\n\n firstUpdated(): void {\n this.resizeObserver = new ResizeObserver(() => this.measure())\n this.resizeObserver.observe(this.viewport)\n // Observe the slotted content too, so growth/shrink re-measures.\n const slot = this.viewport.querySelector('slot')\n slot?.assignedElements().forEach(el => this.resizeObserver?.observe(el))\n this.measure()\n }\n\n protected updated(): void {\n // Re-measure when `axis` changes (scrollbars added/removed).\n this.measure()\n }\n\n private handleSlotChange = (): void => {\n if (!this.resizeObserver) {\n return\n }\n const slot = this.viewport.querySelector('slot')\n slot?.assignedElements().forEach(el => this.resizeObserver?.observe(el))\n this.measure()\n }\n\n private handleCoarseChange = (event: MediaQueryListEvent): void => {\n this.toggleAttribute('data-touch', event.matches)\n }\n\n private handlePointerOver = (event: PointerEvent): void => {\n if (event.pointerType === 'touch') {\n this.toggleAttribute('data-touch', true)\n return\n }\n this.toggleAttribute('data-hovering', true)\n }\n\n private handlePointerLeave = (): void => {\n this.removeAttribute('data-hovering')\n }\n\n /** Marks the area as actively scrolling, clearing the flag after a quiet period. */\n private flagScrolling(): void {\n this.toggleAttribute('data-scrolling', true)\n if (this.scrollTimeout) {\n clearTimeout(this.scrollTimeout)\n }\n this.scrollTimeout = setTimeout(() => this.removeAttribute('data-scrolling'), SCROLL_TIMEOUT)\n }\n\n private handleScroll = (): void => {\n this.flagScrolling()\n this.measure()\n }\n\n /**\n * Measures overflow and positions/sizes the thumbs. Ported from Base UI's\n * `ScrollAreaViewport#computeThumbPosition`.\n */\n private measure(): void {\n const viewport = this.viewport\n if (!viewport) {\n return\n }\n\n const { scrollHeight, clientHeight, scrollTop, scrollWidth, clientWidth, scrollLeft } = viewport\n const hasBlockOverflow = scrollHeight > clientHeight\n const hasInlineOverflow = scrollWidth > clientWidth\n\n this.hasBlockOverflow = hasBlockOverflow\n this.hasInlineOverflow = hasInlineOverflow\n this.toggleAttribute('data-has-overflow-y', hasBlockOverflow)\n this.toggleAttribute('data-has-overflow-x', hasInlineOverflow)\n\n const maxScrollTop = Math.max(0, scrollHeight - clientHeight)\n const maxScrollLeft = Math.max(0, scrollWidth - clientWidth)\n const topFromStart = hasBlockOverflow ? clamp(scrollTop, 0, maxScrollTop) : 0\n const topFromEnd = hasBlockOverflow ? maxScrollTop - topFromStart : 0\n const leftFromStart = hasInlineOverflow ? clamp(scrollLeft, 0, maxScrollLeft) : 0\n const leftFromEnd = hasInlineOverflow ? maxScrollLeft - leftFromStart : 0\n\n // Read-only overflow distances (drive consumer edge-fade masks on ::part(viewport)).\n viewport.style.setProperty('--scroll-area-overflow-y-start', `${topFromStart}px`)\n viewport.style.setProperty('--scroll-area-overflow-y-end', `${topFromEnd}px`)\n viewport.style.setProperty('--scroll-area-overflow-x-start', `${leftFromStart}px`)\n viewport.style.setProperty('--scroll-area-overflow-x-end', `${leftFromEnd}px`)\n\n const t = this.overflowEdgeThreshold\n this.toggleAttribute('data-overflow-y-start', hasBlockOverflow && topFromStart > t)\n this.toggleAttribute('data-overflow-y-end', hasBlockOverflow && topFromEnd > t)\n this.toggleAttribute('data-overflow-x-start', hasInlineOverflow && leftFromStart > t)\n this.toggleAttribute('data-overflow-x-end', hasInlineOverflow && leftFromEnd > t)\n\n // Block (vertical) thumb sizing + position.\n if (this.hasBlock && this.scrollbarBlock && this.thumbBlock) {\n const trackOffset = getOffset(this.scrollbarBlock, 'padding', 'y')\n const thumbOffset = getOffset(this.thumbBlock, 'margin', 'y')\n const track = this.scrollbarBlock.offsetHeight - trackOffset - thumbOffset\n const thumbHeight = Math.max(MIN_THUMB_SIZE, track * (clientHeight / scrollHeight))\n this.scrollbarBlock.style.setProperty('--scroll-area-thumb-height', `${thumbHeight}px`)\n const maxThumbOffset = track - thumbHeight\n const ratio = maxScrollTop === 0 ? 0 : scrollTop / maxScrollTop\n const offset = clamp(ratio * maxThumbOffset, 0, maxThumbOffset)\n this.thumbBlock.style.transform = `translate3d(0, ${offset}px, 0)`\n }\n\n // Inline (horizontal) thumb sizing + position.\n if (this.hasInline && this.scrollbarInline && this.thumbInline) {\n const trackOffset = getOffset(this.scrollbarInline, 'padding', 'x')\n const thumbOffset = getOffset(this.thumbInline, 'margin', 'x')\n const track = this.scrollbarInline.offsetWidth - trackOffset - thumbOffset\n const thumbWidth = Math.max(MIN_THUMB_SIZE, track * (clientWidth / scrollWidth))\n this.scrollbarInline.style.setProperty('--scroll-area-thumb-width', `${thumbWidth}px`)\n const maxThumbOffset = track - thumbWidth\n const ratio = maxScrollLeft === 0 ? 0 : scrollLeft / maxScrollLeft\n const offset = clamp(ratio * maxThumbOffset, 0, maxThumbOffset)\n this.thumbInline.style.transform = `translate3d(${offset}px, 0, 0)`\n }\n }\n\n // --- Thumb dragging -------------------------------------------------------\n\n private handleThumbPointerDown(event: PointerEvent, orientation: 'block' | 'inline'): void {\n if (event.button !== 0) {\n return\n }\n event.preventDefault()\n event.stopPropagation()\n this.dragOrientation = orientation\n this.dragStart = orientation === 'block' ? event.clientY : event.clientX\n this.dragStartScroll = orientation === 'block' ? this.viewport.scrollTop : this.viewport.scrollLeft\n ;(event.target as HTMLElement).setPointerCapture(event.pointerId)\n window.addEventListener('pointermove', this.handleThumbPointerMove)\n window.addEventListener('pointerup', this.handleThumbPointerUp)\n }\n\n private handleThumbPointerMove = (event: PointerEvent): void => {\n if (!this.dragOrientation) {\n return\n }\n event.preventDefault()\n const viewport = this.viewport\n if (this.dragOrientation === 'block' && this.scrollbarBlock && this.thumbBlock) {\n const delta = event.clientY - this.dragStart\n const trackOffset = getOffset(this.scrollbarBlock, 'padding', 'y')\n const thumbOffset = getOffset(this.thumbBlock, 'margin', 'y')\n const maxThumbOffset = this.scrollbarBlock.offsetHeight - this.thumbBlock.offsetHeight - trackOffset - thumbOffset\n const ratio = maxThumbOffset === 0 ? 0 : delta / maxThumbOffset\n viewport.scrollTop = this.dragStartScroll + ratio * (viewport.scrollHeight - viewport.clientHeight)\n }\n else if (this.dragOrientation === 'inline' && this.scrollbarInline && this.thumbInline) {\n const delta = event.clientX - this.dragStart\n const trackOffset = getOffset(this.scrollbarInline, 'padding', 'x')\n const thumbOffset = getOffset(this.thumbInline, 'margin', 'x')\n const maxThumbOffset = this.scrollbarInline.offsetWidth - this.thumbInline.offsetWidth - trackOffset - thumbOffset\n const ratio = maxThumbOffset === 0 ? 0 : delta / maxThumbOffset\n viewport.scrollLeft = this.dragStartScroll + ratio * (viewport.scrollWidth - viewport.clientWidth)\n }\n this.flagScrolling()\n }\n\n private handleThumbPointerUp = (): void => {\n this.dragOrientation = null\n window.removeEventListener('pointermove', this.handleThumbPointerMove)\n window.removeEventListener('pointerup', this.handleThumbPointerUp)\n }\n\n // --- Track click (page jump) ---------------------------------------------\n\n private handleTrackPointerDown(event: PointerEvent, orientation: 'block' | 'inline'): void {\n if (event.button !== 0) {\n return\n }\n const viewport = this.viewport\n if (orientation === 'block' && this.scrollbarBlock && this.thumbBlock) {\n const trackOffset = getOffset(this.scrollbarBlock, 'padding', 'y')\n const thumbOffset = getOffset(this.thumbBlock, 'margin', 'y')\n const thumbHeight = this.thumbBlock.offsetHeight\n const rect = this.scrollbarBlock.getBoundingClientRect()\n const clickY = event.clientY - rect.top - thumbHeight / 2 - trackOffset + thumbOffset / 2\n const maxThumbOffset = this.scrollbarBlock.offsetHeight - thumbHeight - trackOffset - thumbOffset\n const ratio = maxThumbOffset === 0 ? 0 : clickY / maxThumbOffset\n viewport.scrollTop = clamp(ratio, 0, 1) * (viewport.scrollHeight - viewport.clientHeight)\n }\n else if (orientation === 'inline' && this.scrollbarInline && this.thumbInline) {\n const trackOffset = getOffset(this.scrollbarInline, 'padding', 'x')\n const thumbOffset = getOffset(this.thumbInline, 'margin', 'x')\n const thumbWidth = this.thumbInline.offsetWidth\n const rect = this.scrollbarInline.getBoundingClientRect()\n const clickX = event.clientX - rect.left - thumbWidth / 2 - trackOffset + thumbOffset / 2\n const maxThumbOffset = this.scrollbarInline.offsetWidth - thumbWidth - trackOffset - thumbOffset\n const ratio = maxThumbOffset === 0 ? 0 : clickX / maxThumbOffset\n viewport.scrollLeft = clamp(ratio, 0, 1) * (viewport.scrollWidth - viewport.clientWidth)\n }\n }\n\n /** Scrolling over a scrollbar track scrolls the viewport. */\n private handleScrollbarWheel(event: WheelEvent, orientation: 'block' | 'inline'): void {\n if (event.ctrlKey) {\n return\n }\n event.preventDefault()\n if (orientation === 'block') {\n this.viewport.scrollTop += event.deltaY\n }\n else {\n this.viewport.scrollLeft += event.deltaY || event.deltaX\n }\n }\n\n render() {\n return html`\n <div\n part=\"viewport\"\n tabindex=${this.hasBlockOverflow || this.hasInlineOverflow ? '0' : '-1'}\n @scroll=${this.handleScroll}\n >\n <slot @slotchange=${this.handleSlotChange}></slot>\n </div>\n ${this.hasBlock\n ? html`\n <div\n part=\"scrollbar-block\"\n data-orientation=\"vertical\"\n ?hidden=${!this.hasBlockOverflow}\n @pointerdown=${(e: PointerEvent) => this.handleTrackPointerDown(e, 'block')}\n @wheel=${(e: WheelEvent) => this.handleScrollbarWheel(e, 'block')}\n >\n <div\n part=\"thumb-block\"\n @pointerdown=${(e: PointerEvent) => this.handleThumbPointerDown(e, 'block')}\n ></div>\n </div>\n `\n : ''}\n ${this.hasInline\n ? html`\n <div\n part=\"scrollbar-inline\"\n data-orientation=\"horizontal\"\n ?hidden=${!this.hasInlineOverflow}\n @pointerdown=${(e: PointerEvent) => this.handleTrackPointerDown(e, 'inline')}\n @wheel=${(e: WheelEvent) => this.handleScrollbarWheel(e, 'inline')}\n >\n <div\n part=\"thumb-inline\"\n @pointerdown=${(e: PointerEvent) => this.handleThumbPointerDown(e, 'inline')}\n ></div>\n </div>\n `\n : ''}\n ${this.axis === 'both' ? html`<div part=\"corner\" ?hidden=${!(this.hasBlockOverflow && this.hasInlineOverflow)}></div>` : ''}\n `\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'nord-scroll-area': ScrollArea\n }\n}\n"],"names":["clamp","value","min","max","Math","getOffset","element","prop","axis","styles","getComputedStyle","side","Number","parseFloat","ScrollArea","DraftComponentMixin","LitElement","constructor","this","overflowEdgeThreshold","fade","alwaysShowScrollbar","hasBlockOverflow","hasInlineOverflow","dragOrientation","dragStart","dragStartScroll","handleSlotChange","resizeObserver","slot","viewport","querySelector","assignedElements","forEach","el","_a","observe","measure","handleCoarseChange","event","toggleAttribute","matches","handlePointerOver","pointerType","handlePointerLeave","removeAttribute","handleScroll","flagScrolling","handleThumbPointerMove","preventDefault","scrollbarBlock","thumbBlock","delta","clientY","trackOffset","thumbOffset","maxThumbOffset","offsetHeight","ratio","scrollTop","scrollHeight","clientHeight","scrollbarInline","thumbInline","clientX","offsetWidth","scrollLeft","scrollWidth","clientWidth","handleThumbPointerUp","window","removeEventListener","hasBlock","hasInline","connectedCallback","super","addEventListener","coarsePointer","matchMedia","disconnectedCallback","_b","disconnect","scrollTimeout","clearTimeout","firstUpdated","ResizeObserver","updated","setTimeout","maxScrollTop","maxScrollLeft","topFromStart","topFromEnd","leftFromStart","leftFromEnd","style","setProperty","t","track","thumbHeight","offset","transform","thumbWidth","handleThumbPointerDown","orientation","button","stopPropagation","target","setPointerCapture","pointerId","handleTrackPointerDown","rect","getBoundingClientRect","clickY","top","clickX","left","handleScrollbarWheel","ctrlKey","deltaY","deltaX","render","html","e","componentStyle","__decorate","property","reflect","prototype","type","attribute","Boolean","query","state","customElement"],"mappings":"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"}
1
+ {"version":3,"file":"ScrollArea.js","sources":["../src/scroll-area/ScrollArea.ts"],"sourcesContent":["import { html, LitElement } from 'lit'\nimport { customElement, property, query, state } from 'lit/decorators.js'\n\nimport { DraftComponentMixin } from '../common/mixins/DraftComponentMixin.js'\nimport componentStyle from '../common/styles/Component.css'\nimport style from './ScrollArea.css'\n\n/** Time (ms) the `data-scrolling` state lingers after the last scroll. */\nconst SCROLL_TIMEOUT = 500\n/** Smallest the thumb is allowed to shrink to, in pixels. */\nconst MIN_THUMB_SIZE = 16\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max)\n}\n\n/** Computed margin/padding offset of an element along an axis, like Base UI's `getOffset`. */\nfunction getOffset(element: Element | null, prop: 'margin' | 'padding', axis: 'x' | 'y'): number {\n if (!element) {\n return 0\n }\n const styles = getComputedStyle(element)\n const side = axis === 'x' ? 'Inline' : 'Block'\n return Number.parseFloat(styles[`${prop}${side}Start` as never]) + Number.parseFloat(styles[`${prop}${side}End` as never])\n}\n\n/**\n * Scroll Area is a container that wraps overflowing content in a custom scroll\n * viewport with consistently-styled scrollbars. Native scrollbars are hidden and\n * replaced with a thin overlay thumb that appears on hover or while scrolling.\n *\n * It also exposes the distance from each edge as CSS custom properties\n * (`--scroll-area-overflow-*`), which can drive an edge-fade mask on\n * `::part(viewport)` — see the docs example.\n *\n * The scroll machinery lives in shadow DOM; slot your content directly inside.\n *\n * @status draft\n * @category layout\n *\n * @slot - The scrollable content.\n *\n * @csspart viewport - The scrolling container that holds the slotted content.\n * @csspart scrollbar-block - The scrollbar track for the block (vertical) axis.\n * @csspart scrollbar-inline - The scrollbar track for the inline (horizontal) axis.\n * @csspart thumb-block - The draggable thumb of the block-axis scrollbar.\n * @csspart thumb-inline - The draggable thumb of the inline-axis scrollbar.\n * @csspart corner - The square where the two scrollbars meet (when `axis=\"both\"`).\n *\n * @cssprop [--n-scroll-area-fade-size=24px] - Depth of the edge fade (when `fade` is set).\n * @cssprop [--n-scroll-area-scrollbar-size=10px] - Thickness of the scrollbar track and thumb.\n * @cssprop [--n-scroll-area-scrollbar-inset=2px] - Inset of the scrollbar from the viewport edge.\n * @cssprop [--n-scroll-area-thumb-color] - Thumb fill (defaults to the border token).\n * @cssprop [--n-scroll-area-thumb-color-hover] - Thumb fill on hover (defaults to the strong border token).\n * @cssprop [--scroll-area-overflow-y-start] - Read-only: pixels scrolled past the block start edge.\n * @cssprop [--scroll-area-overflow-y-end] - Read-only: pixels remaining to the block end edge.\n * @cssprop [--scroll-area-overflow-x-start] - Read-only: pixels scrolled past the inline start edge.\n * @cssprop [--scroll-area-overflow-x-end] - Read-only: pixels remaining to the inline end edge.\n */\n@customElement('nord-scroll-area')\nexport default class ScrollArea extends DraftComponentMixin(LitElement) {\n static styles = [componentStyle, style]\n\n /**\n * Which scrollbars to render. `block` is vertical, `inline` is horizontal.\n * @default \"block\"\n */\n @property({ reflect: true }) axis: 'block' | 'inline' | 'both' = 'block'\n\n /**\n * Distance in pixels past an edge before the matching `data-overflow-*` state\n * (and edge-fade variable) is considered active.\n * @default 0\n */\n @property({ type: Number, attribute: 'overflow-edge-threshold' }) overflowEdgeThreshold = 0\n\n /**\n * Fades the content in and out at the scroll edges with a mask, signalling\n * there is more content beyond the edge.\n * @default false\n */\n @property({ type: Boolean, reflect: true }) fade = false\n\n /** Always display the scrollbar instead of hiding it when idle. */\n @property({ type: Boolean, reflect: true, attribute: 'always-show-scrollbar' }) alwaysShowScrollbar = false\n\n @query('[part~=\"viewport\"]') private viewport!: HTMLDivElement\n @query('[part~=\"scrollbar-block\"]') private scrollbarBlock?: HTMLDivElement | null\n @query('[part~=\"thumb-block\"]') private thumbBlock?: HTMLDivElement | null\n @query('[part~=\"scrollbar-inline\"]') private scrollbarInline?: HTMLDivElement | null\n @query('[part~=\"thumb-inline\"]') private thumbInline?: HTMLDivElement | null\n\n @state() private hasBlockOverflow = false\n @state() private hasInlineOverflow = false\n\n private resizeObserver?: ResizeObserver\n private coarsePointer?: MediaQueryList\n private scrollTimeout?: ReturnType<typeof setTimeout>\n\n // Drag state\n private dragOrientation: 'block' | 'inline' | null = null\n private dragStart = 0\n private dragStartScroll = 0\n\n private get hasBlock(): boolean {\n return this.axis === 'block' || this.axis === 'both'\n }\n\n private get hasInline(): boolean {\n return this.axis === 'inline' || this.axis === 'both'\n }\n\n connectedCallback(): void {\n super.connectedCallback()\n this.addEventListener('pointerenter', this.handlePointerOver)\n this.addEventListener('pointermove', this.handlePointerOver)\n this.addEventListener('pointerleave', this.handlePointerLeave)\n this.coarsePointer = window.matchMedia('(pointer: coarse)')\n this.coarsePointer.addEventListener('change', this.handleCoarseChange)\n this.toggleAttribute('data-touch', this.coarsePointer.matches)\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback()\n this.removeEventListener('pointerenter', this.handlePointerOver)\n this.removeEventListener('pointermove', this.handlePointerOver)\n this.removeEventListener('pointerleave', this.handlePointerLeave)\n this.coarsePointer?.removeEventListener('change', this.handleCoarseChange)\n this.resizeObserver?.disconnect()\n if (this.scrollTimeout) {\n clearTimeout(this.scrollTimeout)\n }\n }\n\n firstUpdated(): void {\n this.resizeObserver = new ResizeObserver(() => this.measure())\n this.resizeObserver.observe(this.viewport)\n // Observe the slotted content too, so growth/shrink re-measures.\n const slot = this.viewport.querySelector('slot')\n slot?.assignedElements().forEach(el => this.resizeObserver?.observe(el))\n this.measure()\n }\n\n protected updated(): void {\n // Re-measure when `axis` changes (scrollbars added/removed).\n this.measure()\n }\n\n private handleSlotChange = (): void => {\n if (!this.resizeObserver) {\n return\n }\n const slot = this.viewport.querySelector('slot')\n slot?.assignedElements().forEach(el => this.resizeObserver?.observe(el))\n this.measure()\n }\n\n private handleCoarseChange = (event: MediaQueryListEvent): void => {\n this.toggleAttribute('data-touch', event.matches)\n }\n\n private handlePointerOver = (event: PointerEvent): void => {\n if (event.pointerType === 'touch') {\n this.toggleAttribute('data-touch', true)\n return\n }\n this.toggleAttribute('data-hovering', true)\n }\n\n private handlePointerLeave = (): void => {\n this.removeAttribute('data-hovering')\n }\n\n /** Marks the area as actively scrolling, clearing the flag after a quiet period. */\n private flagScrolling(): void {\n this.toggleAttribute('data-scrolling', true)\n if (this.scrollTimeout) {\n clearTimeout(this.scrollTimeout)\n }\n this.scrollTimeout = setTimeout(() => this.removeAttribute('data-scrolling'), SCROLL_TIMEOUT)\n }\n\n private handleScroll = (): void => {\n this.flagScrolling()\n this.measure()\n }\n\n /**\n * Measures overflow and positions/sizes the thumbs. Ported from Base UI's\n * `ScrollAreaViewport#computeThumbPosition`.\n */\n private measure(): void {\n const viewport = this.viewport\n if (!viewport) {\n return\n }\n\n const { scrollHeight, clientHeight, scrollTop, scrollWidth, clientWidth, scrollLeft } = viewport\n const hasBlockOverflow = scrollHeight > clientHeight\n const hasInlineOverflow = scrollWidth > clientWidth\n\n this.hasBlockOverflow = hasBlockOverflow\n this.hasInlineOverflow = hasInlineOverflow\n this.toggleAttribute('data-has-overflow-y', hasBlockOverflow)\n this.toggleAttribute('data-has-overflow-x', hasInlineOverflow)\n\n const maxScrollTop = Math.max(0, scrollHeight - clientHeight)\n const maxScrollLeft = Math.max(0, scrollWidth - clientWidth)\n const topFromStart = hasBlockOverflow ? clamp(scrollTop, 0, maxScrollTop) : 0\n const topFromEnd = hasBlockOverflow ? maxScrollTop - topFromStart : 0\n const leftFromStart = hasInlineOverflow ? clamp(scrollLeft, 0, maxScrollLeft) : 0\n const leftFromEnd = hasInlineOverflow ? maxScrollLeft - leftFromStart : 0\n\n // Read-only overflow distances (drive consumer edge-fade masks on ::part(viewport)).\n viewport.style.setProperty('--scroll-area-overflow-y-start', `${topFromStart}px`)\n viewport.style.setProperty('--scroll-area-overflow-y-end', `${topFromEnd}px`)\n viewport.style.setProperty('--scroll-area-overflow-x-start', `${leftFromStart}px`)\n viewport.style.setProperty('--scroll-area-overflow-x-end', `${leftFromEnd}px`)\n\n const t = this.overflowEdgeThreshold\n this.toggleAttribute('data-overflow-y-start', hasBlockOverflow && topFromStart > t)\n this.toggleAttribute('data-overflow-y-end', hasBlockOverflow && topFromEnd > t)\n this.toggleAttribute('data-overflow-x-start', hasInlineOverflow && leftFromStart > t)\n this.toggleAttribute('data-overflow-x-end', hasInlineOverflow && leftFromEnd > t)\n\n // Block (vertical) thumb sizing + position.\n if (this.hasBlock && this.scrollbarBlock && this.thumbBlock) {\n const trackOffset = getOffset(this.scrollbarBlock, 'padding', 'y')\n const thumbOffset = getOffset(this.thumbBlock, 'margin', 'y')\n const track = this.scrollbarBlock.offsetHeight - trackOffset - thumbOffset\n const thumbHeight = Math.max(MIN_THUMB_SIZE, track * (clientHeight / scrollHeight))\n this.scrollbarBlock.style.setProperty('--scroll-area-thumb-height', `${thumbHeight}px`)\n const maxThumbOffset = track - thumbHeight\n const ratio = maxScrollTop === 0 ? 0 : scrollTop / maxScrollTop\n const offset = clamp(ratio * maxThumbOffset, 0, maxThumbOffset)\n this.thumbBlock.style.transform = `translate3d(0, ${offset}px, 0)`\n }\n\n // Inline (horizontal) thumb sizing + position.\n if (this.hasInline && this.scrollbarInline && this.thumbInline) {\n const trackOffset = getOffset(this.scrollbarInline, 'padding', 'x')\n const thumbOffset = getOffset(this.thumbInline, 'margin', 'x')\n const track = this.scrollbarInline.offsetWidth - trackOffset - thumbOffset\n const thumbWidth = Math.max(MIN_THUMB_SIZE, track * (clientWidth / scrollWidth))\n this.scrollbarInline.style.setProperty('--scroll-area-thumb-width', `${thumbWidth}px`)\n const maxThumbOffset = track - thumbWidth\n const ratio = maxScrollLeft === 0 ? 0 : scrollLeft / maxScrollLeft\n const offset = clamp(ratio * maxThumbOffset, 0, maxThumbOffset)\n this.thumbInline.style.transform = `translate3d(${offset}px, 0, 0)`\n }\n }\n\n // --- Thumb dragging -------------------------------------------------------\n\n private handleThumbPointerDown(event: PointerEvent, orientation: 'block' | 'inline'): void {\n if (event.button !== 0) {\n return\n }\n event.preventDefault()\n event.stopPropagation()\n this.dragOrientation = orientation\n this.dragStart = orientation === 'block' ? event.clientY : event.clientX\n this.dragStartScroll = orientation === 'block' ? this.viewport.scrollTop : this.viewport.scrollLeft\n ;(event.target as HTMLElement).setPointerCapture(event.pointerId)\n window.addEventListener('pointermove', this.handleThumbPointerMove)\n window.addEventListener('pointerup', this.handleThumbPointerUp)\n }\n\n private handleThumbPointerMove = (event: PointerEvent): void => {\n if (!this.dragOrientation) {\n return\n }\n event.preventDefault()\n const viewport = this.viewport\n if (this.dragOrientation === 'block' && this.scrollbarBlock && this.thumbBlock) {\n const delta = event.clientY - this.dragStart\n const trackOffset = getOffset(this.scrollbarBlock, 'padding', 'y')\n const thumbOffset = getOffset(this.thumbBlock, 'margin', 'y')\n const maxThumbOffset = this.scrollbarBlock.offsetHeight - this.thumbBlock.offsetHeight - trackOffset - thumbOffset\n const ratio = maxThumbOffset === 0 ? 0 : delta / maxThumbOffset\n viewport.scrollTop = this.dragStartScroll + ratio * (viewport.scrollHeight - viewport.clientHeight)\n }\n else if (this.dragOrientation === 'inline' && this.scrollbarInline && this.thumbInline) {\n const delta = event.clientX - this.dragStart\n const trackOffset = getOffset(this.scrollbarInline, 'padding', 'x')\n const thumbOffset = getOffset(this.thumbInline, 'margin', 'x')\n const maxThumbOffset = this.scrollbarInline.offsetWidth - this.thumbInline.offsetWidth - trackOffset - thumbOffset\n const ratio = maxThumbOffset === 0 ? 0 : delta / maxThumbOffset\n viewport.scrollLeft = this.dragStartScroll + ratio * (viewport.scrollWidth - viewport.clientWidth)\n }\n this.flagScrolling()\n }\n\n private handleThumbPointerUp = (): void => {\n this.dragOrientation = null\n window.removeEventListener('pointermove', this.handleThumbPointerMove)\n window.removeEventListener('pointerup', this.handleThumbPointerUp)\n }\n\n // --- Track click (page jump) ---------------------------------------------\n\n private handleTrackPointerDown(event: PointerEvent, orientation: 'block' | 'inline'): void {\n if (event.button !== 0) {\n return\n }\n const viewport = this.viewport\n if (orientation === 'block' && this.scrollbarBlock && this.thumbBlock) {\n const trackOffset = getOffset(this.scrollbarBlock, 'padding', 'y')\n const thumbOffset = getOffset(this.thumbBlock, 'margin', 'y')\n const thumbHeight = this.thumbBlock.offsetHeight\n const rect = this.scrollbarBlock.getBoundingClientRect()\n const clickY = event.clientY - rect.top - thumbHeight / 2 - trackOffset + thumbOffset / 2\n const maxThumbOffset = this.scrollbarBlock.offsetHeight - thumbHeight - trackOffset - thumbOffset\n const ratio = maxThumbOffset === 0 ? 0 : clickY / maxThumbOffset\n viewport.scrollTop = clamp(ratio, 0, 1) * (viewport.scrollHeight - viewport.clientHeight)\n }\n else if (orientation === 'inline' && this.scrollbarInline && this.thumbInline) {\n const trackOffset = getOffset(this.scrollbarInline, 'padding', 'x')\n const thumbOffset = getOffset(this.thumbInline, 'margin', 'x')\n const thumbWidth = this.thumbInline.offsetWidth\n const rect = this.scrollbarInline.getBoundingClientRect()\n const clickX = event.clientX - rect.left - thumbWidth / 2 - trackOffset + thumbOffset / 2\n const maxThumbOffset = this.scrollbarInline.offsetWidth - thumbWidth - trackOffset - thumbOffset\n const ratio = maxThumbOffset === 0 ? 0 : clickX / maxThumbOffset\n viewport.scrollLeft = clamp(ratio, 0, 1) * (viewport.scrollWidth - viewport.clientWidth)\n }\n }\n\n /** Scrolling over a scrollbar track scrolls the viewport. */\n private handleScrollbarWheel(event: WheelEvent, orientation: 'block' | 'inline'): void {\n if (event.ctrlKey) {\n return\n }\n event.preventDefault()\n if (orientation === 'block') {\n this.viewport.scrollTop += event.deltaY\n }\n else {\n this.viewport.scrollLeft += event.deltaY || event.deltaX\n }\n }\n\n render() {\n return html`\n <div\n part=\"viewport\"\n tabindex=${this.hasBlockOverflow || this.hasInlineOverflow ? '0' : '-1'}\n @scroll=${this.handleScroll}\n >\n <slot @slotchange=${this.handleSlotChange}></slot>\n </div>\n ${this.hasBlock\n ? html`\n <div\n part=\"scrollbar-block\"\n data-orientation=\"vertical\"\n ?hidden=${!this.hasBlockOverflow}\n @pointerdown=${(e: PointerEvent) => this.handleTrackPointerDown(e, 'block')}\n @wheel=${(e: WheelEvent) => this.handleScrollbarWheel(e, 'block')}\n >\n <div\n part=\"thumb-block\"\n @pointerdown=${(e: PointerEvent) => this.handleThumbPointerDown(e, 'block')}\n ></div>\n </div>\n `\n : ''}\n ${this.hasInline\n ? html`\n <div\n part=\"scrollbar-inline\"\n data-orientation=\"horizontal\"\n ?hidden=${!this.hasInlineOverflow}\n @pointerdown=${(e: PointerEvent) => this.handleTrackPointerDown(e, 'inline')}\n @wheel=${(e: WheelEvent) => this.handleScrollbarWheel(e, 'inline')}\n >\n <div\n part=\"thumb-inline\"\n @pointerdown=${(e: PointerEvent) => this.handleThumbPointerDown(e, 'inline')}\n ></div>\n </div>\n `\n : ''}\n ${this.axis === 'both' ? html`<div part=\"corner\" ?hidden=${!(this.hasBlockOverflow && this.hasInlineOverflow)}></div>` : ''}\n `\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'nord-scroll-area': ScrollArea\n }\n}\n"],"names":["clamp","value","min","max","Math","getOffset","element","prop","axis","styles","getComputedStyle","side","Number","parseFloat","ScrollArea","DraftComponentMixin","LitElement","constructor","this","overflowEdgeThreshold","fade","alwaysShowScrollbar","hasBlockOverflow","hasInlineOverflow","dragOrientation","dragStart","dragStartScroll","handleSlotChange","resizeObserver","slot","viewport","querySelector","assignedElements","forEach","el","_a","observe","measure","handleCoarseChange","event","toggleAttribute","matches","handlePointerOver","pointerType","handlePointerLeave","removeAttribute","handleScroll","flagScrolling","handleThumbPointerMove","preventDefault","scrollbarBlock","thumbBlock","delta","clientY","trackOffset","thumbOffset","maxThumbOffset","offsetHeight","ratio","scrollTop","scrollHeight","clientHeight","scrollbarInline","thumbInline","clientX","offsetWidth","scrollLeft","scrollWidth","clientWidth","handleThumbPointerUp","window","removeEventListener","hasBlock","hasInline","connectedCallback","super","addEventListener","coarsePointer","matchMedia","disconnectedCallback","_b","disconnect","scrollTimeout","clearTimeout","firstUpdated","ResizeObserver","updated","setTimeout","maxScrollTop","maxScrollLeft","topFromStart","topFromEnd","leftFromStart","leftFromEnd","style","setProperty","t","track","thumbHeight","offset","transform","thumbWidth","handleThumbPointerDown","orientation","button","stopPropagation","target","setPointerCapture","pointerId","handleTrackPointerDown","rect","getBoundingClientRect","clickY","top","clickX","left","handleScrollbarWheel","ctrlKey","deltaY","deltaX","render","html","e","componentStyle","__decorate","property","reflect","prototype","type","attribute","Boolean","query","state","customElement"],"mappings":"qnIAYA,SAASA,EAAMC,EAAeC,EAAaC,GACzC,OAAOC,KAAKF,IAAIE,KAAKD,IAAIF,EAAOC,GAAMC,EACxC,CAGA,SAASE,EAAUC,EAAyBC,EAA4BC,GACtE,IAAKF,EACH,OAAO,EAET,MAAMG,EAASC,iBAAiBJ,GAC1BK,EAAgB,MAATH,EAAe,SAAW,QACvC,OAAOI,OAAOC,WAAWJ,EAAO,GAAGF,IAAOI,WAAyBC,OAAOC,WAAWJ,EAAO,GAAGF,IAAOI,QACxG,CAoCe,IAAMG,EAAN,cAAyBC,EAAoBC,IAA7C,WAAAC,uBAOgBC,KAAIV,KAAgC,QAOCU,KAAqBC,sBAAG,EAO9CD,KAAIE,MAAG,EAG6BF,KAAmBG,qBAAG,EAQrFH,KAAgBI,kBAAG,EACnBJ,KAAiBK,mBAAG,EAO7BL,KAAeM,gBAA8B,KAC7CN,KAASO,UAAG,EACZP,KAAeQ,gBAAG,EA8ClBR,KAAgBS,iBAAG,KACzB,IAAKT,KAAKU,eACR,OAEF,MAAMC,EAAOX,KAAKY,SAASC,cAAc,QACzCF,SAAAA,EAAMG,mBAAmBC,SAAQC,IAAK,IAAAC,EAAC,OAAqB,QAArBA,EAAAjB,KAAKU,sBAAgB,IAAAO,OAAA,EAAAA,EAAAC,QAAQF,EAAG,IACvEhB,KAAKmB,SAAS,EAGRnB,KAAAoB,mBAAsBC,IAC5BrB,KAAKsB,gBAAgB,aAAcD,EAAME,QAAQ,EAG3CvB,KAAAwB,kBAAqBH,IACD,UAAtBA,EAAMI,YAIVzB,KAAKsB,gBAAgB,iBAAiB,GAHpCtB,KAAKsB,gBAAgB,cAAc,EAGM,EAGrCtB,KAAkB0B,mBAAG,KAC3B1B,KAAK2B,gBAAgB,gBAAgB,EAY/B3B,KAAY4B,aAAG,KACrB5B,KAAK6B,gBACL7B,KAAKmB,SAAS,EAoFRnB,KAAA8B,uBAA0BT,IAChC,IAAKrB,KAAKM,gBACR,OAEFe,EAAMU,iBACN,MAAMnB,EAAWZ,KAAKY,SACtB,GAA6B,UAAzBZ,KAAKM,iBAA+BN,KAAKgC,gBAAkBhC,KAAKiC,WAAY,CAC9E,MAAMC,EAAQb,EAAMc,QAAUnC,KAAKO,UAC7B6B,EAAcjD,EAAUa,KAAKgC,eAAgB,UAAW,KACxDK,EAAclD,EAAUa,KAAKiC,WAAY,SAAU,KACnDK,EAAiBtC,KAAKgC,eAAeO,aAAevC,KAAKiC,WAAWM,aAAeH,EAAcC,EACjGG,EAA2B,IAAnBF,EAAuB,EAAIJ,EAAQI,EACjD1B,EAAS6B,UAAYzC,KAAKQ,gBAAkBgC,GAAS5B,EAAS8B,aAAe9B,EAAS+B,aACvF,MACI,GAA6B,WAAzB3C,KAAKM,iBAAgCN,KAAK4C,iBAAmB5C,KAAK6C,YAAa,CACtF,MAAMX,EAAQb,EAAMyB,QAAU9C,KAAKO,UAC7B6B,EAAcjD,EAAUa,KAAK4C,gBAAiB,UAAW,KACzDP,EAAclD,EAAUa,KAAK6C,YAAa,SAAU,KACpDP,EAAiBtC,KAAK4C,gBAAgBG,YAAc/C,KAAK6C,YAAYE,YAAcX,EAAcC,EACjGG,EAA2B,IAAnBF,EAAuB,EAAIJ,EAAQI,EACjD1B,EAASoC,WAAahD,KAAKQ,gBAAkBgC,GAAS5B,EAASqC,YAAcrC,EAASsC,YACvF,CACDlD,KAAK6B,eAAe,EAGd7B,KAAoBmD,qBAAG,KAC7BnD,KAAKM,gBAAkB,KACvB8C,OAAOC,oBAAoB,cAAerD,KAAK8B,wBAC/CsB,OAAOC,oBAAoB,YAAarD,KAAKmD,qBAAqB,CA0FrE,CA1RC,YAAYG,GACV,MAAqB,UAAdtD,KAAKV,MAAkC,SAAdU,KAAKV,IACtC,CAED,aAAYiE,GACV,MAAqB,WAAdvD,KAAKV,MAAmC,SAAdU,KAAKV,IACvC,CAED,iBAAAkE,GACEC,MAAMD,oBACNxD,KAAK0D,iBAAiB,eAAgB1D,KAAKwB,mBAC3CxB,KAAK0D,iBAAiB,cAAe1D,KAAKwB,mBAC1CxB,KAAK0D,iBAAiB,eAAgB1D,KAAK0B,oBAC3C1B,KAAK2D,cAAgBP,OAAOQ,WAAW,qBACvC5D,KAAK2D,cAAcD,iBAAiB,SAAU1D,KAAKoB,oBACnDpB,KAAKsB,gBAAgB,aAActB,KAAK2D,cAAcpC,QACvD,CAED,oBAAAsC,WACEJ,MAAMI,uBACN7D,KAAKqD,oBAAoB,eAAgBrD,KAAKwB,mBAC9CxB,KAAKqD,oBAAoB,cAAerD,KAAKwB,mBAC7CxB,KAAKqD,oBAAoB,eAAgBrD,KAAK0B,oBAC5B,QAAlBT,EAAAjB,KAAK2D,qBAAa,IAAA1C,GAAAA,EAAEoC,oBAAoB,SAAUrD,KAAKoB,oBAClC,QAArB0C,EAAA9D,KAAKU,sBAAgB,IAAAoD,GAAAA,EAAAC,aACjB/D,KAAKgE,eACPC,aAAajE,KAAKgE,cAErB,CAED,YAAAE,GACElE,KAAKU,eAAiB,IAAIyD,gBAAe,IAAMnE,KAAKmB,YACpDnB,KAAKU,eAAeQ,QAAQlB,KAAKY,UAEjC,MAAMD,EAAOX,KAAKY,SAASC,cAAc,QACzCF,SAAAA,EAAMG,mBAAmBC,SAAQC,IAAK,IAAAC,EAAC,OAAqB,QAArBA,EAAAjB,KAAKU,sBAAgB,IAAAO,OAAA,EAAAA,EAAAC,QAAQF,EAAG,IACvEhB,KAAKmB,SACN,CAES,OAAAiD,GAERpE,KAAKmB,SACN,CA4BO,aAAAU,GACN7B,KAAKsB,gBAAgB,kBAAkB,GACnCtB,KAAKgE,eACPC,aAAajE,KAAKgE,eAEpBhE,KAAKgE,cAAgBK,YAAW,IAAMrE,KAAK2B,gBAAgB,mBA3KxC,IA4KpB,CAWO,OAAAR,GACN,MAAMP,EAAWZ,KAAKY,SACtB,IAAKA,EACH,OAGF,MAAM8B,aAAEA,EAAYC,aAAEA,EAAYF,UAAEA,EAASQ,YAAEA,EAAWC,YAAEA,EAAWF,WAAEA,GAAepC,EAClFR,EAAmBsC,EAAeC,EAClCtC,EAAoB4C,EAAcC,EAExClD,KAAKI,iBAAmBA,EACxBJ,KAAKK,kBAAoBA,EACzBL,KAAKsB,gBAAgB,sBAAuBlB,GAC5CJ,KAAKsB,gBAAgB,sBAAuBjB,GAE5C,MAAMiE,EAAepF,KAAKD,IAAI,EAAGyD,EAAeC,GAC1C4B,EAAgBrF,KAAKD,IAAI,EAAGgE,EAAcC,GAC1CsB,EAAepE,EAAmBtB,EAAM2D,EAAW,EAAG6B,GAAgB,EACtEG,EAAarE,EAAmBkE,EAAeE,EAAe,EAC9DE,EAAgBrE,EAAoBvB,EAAMkE,EAAY,EAAGuB,GAAiB,EAC1EI,EAActE,EAAoBkE,EAAgBG,EAAgB,EAGxE9D,EAASgE,MAAMC,YAAY,iCAAkC,GAAGL,OAChE5D,EAASgE,MAAMC,YAAY,+BAAgC,GAAGJ,OAC9D7D,EAASgE,MAAMC,YAAY,iCAAkC,GAAGH,OAChE9D,EAASgE,MAAMC,YAAY,+BAAgC,GAAGF,OAE9D,MAAMG,EAAI9E,KAAKC,sBAOf,GANAD,KAAKsB,gBAAgB,wBAAyBlB,GAAoBoE,EAAeM,GACjF9E,KAAKsB,gBAAgB,sBAAuBlB,GAAoBqE,EAAaK,GAC7E9E,KAAKsB,gBAAgB,wBAAyBjB,GAAqBqE,EAAgBI,GACnF9E,KAAKsB,gBAAgB,sBAAuBjB,GAAqBsE,EAAcG,GAG3E9E,KAAKsD,UAAYtD,KAAKgC,gBAAkBhC,KAAKiC,WAAY,CAC3D,MAAMG,EAAcjD,EAAUa,KAAKgC,eAAgB,UAAW,KACxDK,EAAclD,EAAUa,KAAKiC,WAAY,SAAU,KACnD8C,EAAQ/E,KAAKgC,eAAeO,aAAeH,EAAcC,EACzD2C,EAAc9F,KAAKD,IA5NR,GA4N4B8F,GAASpC,EAAeD,IACrE1C,KAAKgC,eAAe4C,MAAMC,YAAY,6BAA8B,GAAGG,OACvE,MAAM1C,EAAiByC,EAAQC,EAEzBC,EAASnG,GADgB,IAAjBwF,EAAqB,EAAI7B,EAAY6B,GACtBhC,EAAgB,EAAGA,GAChDtC,KAAKiC,WAAW2C,MAAMM,UAAY,kBAAkBD,SACrD,CAGD,GAAIjF,KAAKuD,WAAavD,KAAK4C,iBAAmB5C,KAAK6C,YAAa,CAC9D,MAAMT,EAAcjD,EAAUa,KAAK4C,gBAAiB,UAAW,KACzDP,EAAclD,EAAUa,KAAK6C,YAAa,SAAU,KACpDkC,EAAQ/E,KAAK4C,gBAAgBG,YAAcX,EAAcC,EACzD8C,EAAajG,KAAKD,IAzOP,GAyO2B8F,GAAS7B,EAAcD,IACnEjD,KAAK4C,gBAAgBgC,MAAMC,YAAY,4BAA6B,GAAGM,OACvE,MAAM7C,EAAiByC,EAAQI,EAEzBF,EAASnG,GADiB,IAAlByF,EAAsB,EAAIvB,EAAauB,GACxBjC,EAAgB,EAAGA,GAChDtC,KAAK6C,YAAY+B,MAAMM,UAAY,eAAeD,YACnD,CACF,CAIO,sBAAAG,CAAuB/D,EAAqBgE,GAC7B,IAAjBhE,EAAMiE,SAGVjE,EAAMU,iBACNV,EAAMkE,kBACNvF,KAAKM,gBAAkB+E,EACvBrF,KAAKO,UAA4B,UAAhB8E,EAA0BhE,EAAMc,QAAUd,EAAMyB,QACjE9C,KAAKQ,gBAAkC,UAAhB6E,EAA0BrF,KAAKY,SAAS6B,UAAYzC,KAAKY,SAASoC,WACvF3B,EAAMmE,OAAuBC,kBAAkBpE,EAAMqE,WACvDtC,OAAOM,iBAAiB,cAAe1D,KAAK8B,wBAC5CsB,OAAOM,iBAAiB,YAAa1D,KAAKmD,sBAC3C,CAmCO,sBAAAwC,CAAuBtE,EAAqBgE,GAClD,GAAqB,IAAjBhE,EAAMiE,OACR,OAEF,MAAM1E,EAAWZ,KAAKY,SACtB,GAAoB,UAAhByE,GAA2BrF,KAAKgC,gBAAkBhC,KAAKiC,WAAY,CACrE,MAAMG,EAAcjD,EAAUa,KAAKgC,eAAgB,UAAW,KACxDK,EAAclD,EAAUa,KAAKiC,WAAY,SAAU,KACnD+C,EAAchF,KAAKiC,WAAWM,aAC9BqD,EAAO5F,KAAKgC,eAAe6D,wBAC3BC,EAASzE,EAAMc,QAAUyD,EAAKG,IAAMf,EAAc,EAAI5C,EAAcC,EAAc,EAClFC,EAAiBtC,KAAKgC,eAAeO,aAAeyC,EAAc5C,EAAcC,EAChFG,EAA2B,IAAnBF,EAAuB,EAAIwD,EAASxD,EAClD1B,EAAS6B,UAAY3D,EAAM0D,EAAO,EAAG,IAAM5B,EAAS8B,aAAe9B,EAAS+B,aAC7E,MACI,GAAoB,WAAhB0C,GAA4BrF,KAAK4C,iBAAmB5C,KAAK6C,YAAa,CAC7E,MAAMT,EAAcjD,EAAUa,KAAK4C,gBAAiB,UAAW,KACzDP,EAAclD,EAAUa,KAAK6C,YAAa,SAAU,KACpDsC,EAAanF,KAAK6C,YAAYE,YAC9B6C,EAAO5F,KAAK4C,gBAAgBiD,wBAC5BG,EAAS3E,EAAMyB,QAAU8C,EAAKK,KAAOd,EAAa,EAAI/C,EAAcC,EAAc,EAClFC,EAAiBtC,KAAK4C,gBAAgBG,YAAcoC,EAAa/C,EAAcC,EAC/EG,EAA2B,IAAnBF,EAAuB,EAAI0D,EAAS1D,EAClD1B,EAASoC,WAAalE,EAAM0D,EAAO,EAAG,IAAM5B,EAASqC,YAAcrC,EAASsC,YAC7E,CACF,CAGO,oBAAAgD,CAAqB7E,EAAmBgE,GAC1ChE,EAAM8E,UAGV9E,EAAMU,iBACc,UAAhBsD,EACFrF,KAAKY,SAAS6B,WAAapB,EAAM+E,OAGjCpG,KAAKY,SAASoC,YAAc3B,EAAM+E,QAAU/E,EAAMgF,OAErD,CAED,MAAAC,GACE,OAAOC,CAAI,kCAGIvG,KAAKI,kBAAoBJ,KAAKK,kBAAoB,IAAM,kBACzDL,KAAK4B,oCAEK5B,KAAKS,kCAEzBT,KAAKsD,SACHiD,CAAI,qEAIWvG,KAAKI,mCACAoG,GAAoBxG,KAAK2F,uBAAuBa,EAAG,qBACzDA,GAAkBxG,KAAKkG,qBAAqBM,EAAG,mDAIvCA,GAAoBxG,KAAKoF,uBAAuBoB,EAAG,yBAIzE,MACFxG,KAAKuD,UACHgD,CAAI,wEAIWvG,KAAKK,oCACAmG,GAAoBxG,KAAK2F,uBAAuBa,EAAG,sBACzDA,GAAkBxG,KAAKkG,qBAAqBM,EAAG,qDAIvCA,GAAoBxG,KAAKoF,uBAAuBoB,EAAG,0BAIzE,MACY,SAAdxG,KAAKV,KAAkBiH,CAAI,iCAAgCvG,KAAKI,kBAAoBJ,KAAKK,6BAA8B,IAE5H,GApUMT,EAAAL,OAAS,CAACkH,EAAgB7B,GAMJ8B,EAAA,CAA5BC,EAAS,CAAEC,SAAS,KAAmDhH,EAAAiH,UAAA,YAAA,GAONH,EAAA,CAAjEC,EAAS,CAAEG,KAAMpH,OAAQqH,UAAW,6BAAsDnH,EAAAiH,UAAA,6BAAA,GAO/CH,EAAA,CAA3CC,EAAS,CAAEG,KAAME,QAASJ,SAAS,KAAoBhH,EAAAiH,UAAA,YAAA,GAGwBH,EAAA,CAA/EC,EAAS,CAAEG,KAAME,QAASJ,SAAS,EAAMG,UAAW,2BAAsDnH,EAAAiH,UAAA,2BAAA,GAEtEH,EAAA,CAApCO,EAAM,uBAAuDrH,EAAAiH,UAAA,gBAAA,GAClBH,EAAA,CAA3CO,EAAM,8BAA2ErH,EAAAiH,UAAA,sBAAA,GAC1CH,EAAA,CAAvCO,EAAM,0BAAmErH,EAAAiH,UAAA,kBAAA,GAC7BH,EAAA,CAA5CO,EAAM,+BAA6ErH,EAAAiH,UAAA,uBAAA,GAC3CH,EAAA,CAAxCO,EAAM,2BAAqErH,EAAAiH,UAAA,mBAAA,GAE3DH,EAAA,CAAhBQ,KAAwCtH,EAAAiH,UAAA,wBAAA,GACxBH,EAAA,CAAhBQ,KAAyCtH,EAAAiH,UAAA,yBAAA,GAjCvBjH,EAAU8G,EAAA,CAD9BS,EAAc,qBACMvH,SAAAA"}
@@ -0,0 +1,2 @@
1
+ import{t}from"./tinykeys-DwvDXsEb.js";const s=/Arrow(Up|Down|Left|Right)/g,i=/Escape/g;class n{constructor(t,s,i){this.shortcuts=s,this.target=i,t.addController(this)}hostConnected(){this.shortcuts&&this.bind(this.shortcuts)}hostDisconnected(){this.unbind()}unbind(){var t;null===(t=this.unregister)||void 0===t||t.call(this)}bind(n){var r;this.unbind(),this.shortcuts=n,this.unregister=t(null!==(r=this.target)&&void 0!==r?r:window,function(t){const n={};return Object.keys(t).forEach((r=>{if(n[r]=t[r],s.test(r)){const t=r.replace(s,((t,s)=>s));n[t]=n[r]}if(i.test(r)){const t=r.replace(i,(()=>"Esc"));n[t]=n[r]}})),n}(this.shortcuts),{ignore:()=>!1})}}export{n as S};
2
+ //# sourceMappingURL=ShortcutController-CV5b0BZl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ShortcutController-CV5b0BZl.js","sources":["../src/common/controllers/ShortcutController.ts"],"sourcesContent":["import type { ReactiveController, ReactiveControllerHost } from 'lit'\nimport type { KeybindingsMap } from 'tinykeys'\nimport { tinykeys } from 'tinykeys'\n\ntype ShortcutTarget = Parameters<typeof tinykeys>[0]\n\nconst ARROW_RE = /Arrow(Up|Down|Left|Right)/g\nconst ESC_RE = /Escape/g\n\nfunction normalise(shortcuts: KeybindingsMap) {\n const normalised: KeybindingsMap = {}\n\n Object.keys(shortcuts).forEach((keybinding) => {\n normalised[keybinding] = shortcuts[keybinding]\n\n // Arrow and Escape keys in IE/Edge have different names\n if (ARROW_RE.test(keybinding)) {\n const mapped = keybinding.replace(ARROW_RE, (_match, capture) => capture)\n normalised[mapped] = normalised[keybinding]\n }\n if (ESC_RE.test(keybinding)) {\n const mapped = keybinding.replace(ESC_RE, () => 'Esc')\n normalised[mapped] = normalised[keybinding]\n }\n })\n\n return normalised\n}\n\nexport class ShortcutController implements ReactiveController {\n private unregister?: ReturnType<typeof tinykeys>\n\n constructor(\n host: ReactiveControllerHost,\n private shortcuts?: KeybindingsMap,\n private target?: ShortcutTarget,\n ) {\n host.addController(this)\n }\n\n hostConnected() {\n if (this.shortcuts) {\n this.bind(this.shortcuts)\n }\n }\n\n hostDisconnected() {\n this.unbind()\n }\n\n unbind() {\n this.unregister?.()\n }\n\n bind(shortcuts: KeybindingsMap) {\n this.unbind()\n this.shortcuts = shortcuts\n // tinykeys v4 added a default `ignore` filter that drops key repeats and\n // events originating from form/contenteditable elements. Our components\n // bind shortcuts to `window`/host but rely on them firing while focus is in\n // an input (e.g. Escape to dismiss, `$mod+k`, command-menu arrow nav) and\n // on key repeat, so we opt out to preserve the pre-v4 behaviour.\n this.unregister = tinykeys(this.target ?? window, normalise(this.shortcuts), { ignore: () => false })\n }\n}\n\nexport type { KeybindingsMap as ShortcutMap }\n"],"names":["ARROW_RE","ESC_RE","ShortcutController","constructor","host","shortcuts","target","this","addController","hostConnected","bind","hostDisconnected","unbind","_a","unregister","call","tinykeys","window","normalised","Object","keys","forEach","keybinding","test","mapped","replace","_match","capture","normalise","ignore"],"mappings":"sCAMA,MAAMA,EAAW,6BACXC,EAAS,gBAsBFC,EAGX,WAAAC,CACEC,EACQC,EACAC,GADAC,KAASF,UAATA,EACAE,KAAMD,OAANA,EAERF,EAAKI,cAAcD,KACpB,CAED,aAAAE,GACMF,KAAKF,WACPE,KAAKG,KAAKH,KAAKF,UAElB,CAED,gBAAAM,GACEJ,KAAKK,QACN,CAED,MAAAA,SACiB,QAAfC,EAAAN,KAAKO,kBAAU,IAAAD,GAAAA,EAAAE,KAAAR,KAChB,CAED,IAAAG,CAAKL,SACHE,KAAKK,SACLL,KAAKF,UAAYA,EAMjBE,KAAKO,WAAaE,EAAoB,QAAXH,EAAAN,KAAKD,cAAM,IAAAO,EAAAA,EAAII,OArD9C,SAAmBZ,GACjB,MAAMa,EAA6B,CAAA,EAgBnC,OAdAC,OAAOC,KAAKf,GAAWgB,SAASC,IAI9B,GAHAJ,EAAWI,GAAcjB,EAAUiB,GAG/BtB,EAASuB,KAAKD,GAAa,CAC7B,MAAME,EAASF,EAAWG,QAAQzB,GAAU,CAAC0B,EAAQC,IAAYA,IACjET,EAAWM,GAAUN,EAAWI,EACjC,CACD,GAAIrB,EAAOsB,KAAKD,GAAa,CAC3B,MAAME,EAASF,EAAWG,QAAQxB,GAAQ,IAAM,QAChDiB,EAAWM,GAAUN,EAAWI,EACjC,KAGIJ,CACT,CAmCsDU,CAAUrB,KAAKF,WAAY,CAAEwB,OAAQ,KAAM,GAC9F"}
package/lib/Stack.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"Stack.js","sources":["../src/stack/Stack.ts"],"sourcesContent":["import { html, LitElement } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\nimport componentStyle from '../common/styles/Component.css'\nimport style from './Stack.css'\n\n/**\n * Stack component manages layout of immediate children along the\n * vertical or horizontal axis with optional spacing between each child.\n *\n * @status ready\n * @category structure\n * @slot - The stack content.\n *\n * @cssprop [--n-stack-gap=var(--n-space-m)] - Controls the spacing between items, using our [spacing tokens](/tokens/#space).\n */\n@customElement('nord-stack')\nexport default class Stack extends LitElement {\n static styles = [componentStyle, style]\n\n /**\n * The space injected between components.\n */\n @property({ reflect: true }) gap: 'none' | 'xs' | 's' | 'm' | 'l' | 'xl' | 'xxl' = 'm'\n\n /**\n * The direction of the stack.\n */\n @property({ reflect: true }) direction: 'vertical' | 'horizontal' = 'vertical'\n\n /**\n * How to align the child items inside the stack.\n */\n @property({ reflect: true, attribute: 'align-items' }) alignItems?:\n | 'center'\n | 'start'\n | 'end'\n | 'baseline'\n | 'stretch' = 'stretch'\n\n /**\n * Defines whether the Stack items are forced in a single line\n * or can be flowed into multiple lines.\n */\n @property({ reflect: true, type: Boolean }) wrap = false\n\n /**\n * How to justify the child items inside the stack.\n */\n @property({ reflect: true, attribute: 'justify-content' }) justifyContent?:\n | 'center'\n | 'start'\n | 'end'\n | 'space-between'\n | 'space-around'\n | 'space-evenly'\n\n render() {\n return html`<slot></slot>`\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'nord-stack': Stack\n }\n}\n"],"names":["Stack","LitElement","constructor","this","gap","direction","alignItems","wrap","render","html","styles","componentStyle","style","__decorate","property","reflect","prototype","attribute","type","Boolean","customElement"],"mappings":"ojDAgBe,IAAMA,EAAN,cAAoBC,EAApB,WAAAC,uBAMgBC,KAAGC,IAAmD,IAKtDD,KAASE,UAA8B,WAKbF,KAAUG,WAKjD,UAM4BH,KAAII,MAAG,CAgBpD,CAHC,MAAAC,GACE,OAAOC,CAAI,eACZ,GAzCMT,EAAAU,OAAS,CAACC,EAAgBC,GAKJC,EAAA,CAA5BC,EAAS,CAAEC,SAAS,KAAiEf,EAAAgB,UAAA,WAAA,GAKzDH,EAAA,CAA5BC,EAAS,CAAEC,SAAS,KAAyDf,EAAAgB,UAAA,iBAAA,GAKvBH,EAAA,CAAtDC,EAAS,CAAEC,SAAS,EAAME,UAAW,iBAKbjB,EAAAgB,UAAA,kBAAA,GAMmBH,EAAA,CAA3CC,EAAS,CAAEC,SAAS,EAAMG,KAAMC,WAAuBnB,EAAAgB,UAAA,YAAA,GAKGH,EAAA,CAA1DC,EAAS,CAAEC,SAAS,EAAME,UAAW,qBAMpBjB,EAAAgB,UAAA,sBAAA,GAtCChB,EAAKa,EAAA,CADzBO,EAAc,eACMpB,SAAAA"}
1
+ {"version":3,"file":"Stack.js","sources":["../src/stack/Stack.ts"],"sourcesContent":["import { html, LitElement } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\nimport componentStyle from '../common/styles/Component.css'\nimport style from './Stack.css'\n\n/**\n * Stack component manages layout of immediate children along the\n * vertical or horizontal axis with optional spacing between each child.\n *\n * @status ready\n * @category layout\n * @slot - The stack content.\n *\n * @cssprop [--n-stack-gap=var(--n-space-m)] - Controls the spacing between items, using our [spacing tokens](/tokens/#space).\n */\n@customElement('nord-stack')\nexport default class Stack extends LitElement {\n static styles = [componentStyle, style]\n\n /**\n * The space injected between components.\n */\n @property({ reflect: true }) gap: 'none' | 'xs' | 's' | 'm' | 'l' | 'xl' | 'xxl' = 'm'\n\n /**\n * The direction of the stack.\n */\n @property({ reflect: true }) direction: 'vertical' | 'horizontal' = 'vertical'\n\n /**\n * How to align the child items inside the stack.\n */\n @property({ reflect: true, attribute: 'align-items' }) alignItems?:\n | 'center'\n | 'start'\n | 'end'\n | 'baseline'\n | 'stretch' = 'stretch'\n\n /**\n * Defines whether the Stack items are forced in a single line\n * or can be flowed into multiple lines.\n */\n @property({ reflect: true, type: Boolean }) wrap = false\n\n /**\n * How to justify the child items inside the stack.\n */\n @property({ reflect: true, attribute: 'justify-content' }) justifyContent?:\n | 'center'\n | 'start'\n | 'end'\n | 'space-between'\n | 'space-around'\n | 'space-evenly'\n\n render() {\n return html`<slot></slot>`\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'nord-stack': Stack\n }\n}\n"],"names":["Stack","LitElement","constructor","this","gap","direction","alignItems","wrap","render","html","styles","componentStyle","style","__decorate","property","reflect","prototype","attribute","type","Boolean","customElement"],"mappings":"ojDAgBe,IAAMA,EAAN,cAAoBC,EAApB,WAAAC,uBAMgBC,KAAGC,IAAmD,IAKtDD,KAASE,UAA8B,WAKbF,KAAUG,WAKjD,UAM4BH,KAAII,MAAG,CAgBpD,CAHC,MAAAC,GACE,OAAOC,CAAI,eACZ,GAzCMT,EAAAU,OAAS,CAACC,EAAgBC,GAKJC,EAAA,CAA5BC,EAAS,CAAEC,SAAS,KAAiEf,EAAAgB,UAAA,WAAA,GAKzDH,EAAA,CAA5BC,EAAS,CAAEC,SAAS,KAAyDf,EAAAgB,UAAA,iBAAA,GAKvBH,EAAA,CAAtDC,EAAS,CAAEC,SAAS,EAAME,UAAW,iBAKbjB,EAAAgB,UAAA,kBAAA,GAMmBH,EAAA,CAA3CC,EAAS,CAAEC,SAAS,EAAMG,KAAMC,WAAuBnB,EAAAgB,UAAA,YAAA,GAKGH,EAAA,CAA1DC,EAAS,CAAEC,SAAS,EAAME,UAAW,qBAMpBjB,EAAAgB,UAAA,sBAAA,GAtCChB,EAAKa,EAAA,CADzBO,EAAc,eACMpB,SAAAA"}