@aquera/nile-elements 1.5.4 → 1.5.6

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 (297) hide show
  1. package/README.md +10 -0
  2. package/demo/index.css +9 -0
  3. package/dist/index.cjs.js +1 -1
  4. package/dist/index.esm.js +1 -1
  5. package/dist/index.js +871 -255
  6. package/dist/nile-auto-complete/nile-auto-complete.css.cjs.js +1 -1
  7. package/dist/nile-auto-complete/nile-auto-complete.css.cjs.js.map +1 -1
  8. package/dist/nile-auto-complete/nile-auto-complete.css.esm.js +13 -2
  9. package/dist/nile-button/nile-button.cjs.js +1 -1
  10. package/dist/nile-button/nile-button.cjs.js.map +1 -1
  11. package/dist/nile-button/nile-button.css.cjs.js +1 -1
  12. package/dist/nile-button/nile-button.css.cjs.js.map +1 -1
  13. package/dist/nile-button/nile-button.css.esm.js +89 -33
  14. package/dist/nile-button/nile-button.esm.js +2 -2
  15. package/dist/nile-calendar/nile-calendar.cjs.js +1 -1
  16. package/dist/nile-calendar/nile-calendar.cjs.js.map +1 -1
  17. package/dist/nile-calendar/nile-calendar.css.cjs.js +1 -1
  18. package/dist/nile-calendar/nile-calendar.css.cjs.js.map +1 -1
  19. package/dist/nile-calendar/nile-calendar.css.esm.js +59 -2
  20. package/dist/nile-calendar/nile-calendar.esm.js +16 -10
  21. package/dist/nile-checkbox/nile-checkbox.css.cjs.js +1 -1
  22. package/dist/nile-checkbox/nile-checkbox.css.cjs.js.map +1 -1
  23. package/dist/nile-checkbox/nile-checkbox.css.esm.js +4 -5
  24. package/dist/nile-chip/nile-chip.css.cjs.js +1 -1
  25. package/dist/nile-chip/nile-chip.css.cjs.js.map +1 -1
  26. package/dist/nile-chip/nile-chip.css.esm.js +37 -23
  27. package/dist/nile-code-editor/nile-code-editor.cjs.js +1 -1
  28. package/dist/nile-code-editor/nile-code-editor.cjs.js.map +1 -1
  29. package/dist/nile-code-editor/nile-code-editor.css.cjs.js +1 -1
  30. package/dist/nile-code-editor/nile-code-editor.css.cjs.js.map +1 -1
  31. package/dist/nile-code-editor/nile-code-editor.css.esm.js +7 -6
  32. package/dist/nile-code-editor/nile-code-editor.esm.js +1 -1
  33. package/dist/nile-date-picker/nile-date-picker.cjs.js +1 -1
  34. package/dist/nile-date-picker/nile-date-picker.cjs.js.map +1 -1
  35. package/dist/nile-date-picker/nile-date-picker.esm.js +4 -4
  36. package/dist/nile-detail/index.cjs.js +2 -0
  37. package/dist/nile-detail/index.cjs.js.map +1 -0
  38. package/dist/nile-detail/index.esm.js +1 -0
  39. package/dist/nile-detail/nile-detail.cjs.js +2 -0
  40. package/dist/nile-detail/nile-detail.cjs.js.map +1 -0
  41. package/dist/nile-detail/nile-detail.css.cjs.js +2 -0
  42. package/dist/nile-detail/nile-detail.css.cjs.js.map +1 -0
  43. package/dist/nile-detail/nile-detail.css.esm.js +149 -0
  44. package/dist/nile-detail/nile-detail.esm.js +45 -0
  45. package/dist/nile-detail/nile-detail.utils.cjs.js +2 -0
  46. package/dist/nile-detail/nile-detail.utils.cjs.js.map +1 -0
  47. package/dist/nile-detail/nile-detail.utils.esm.js +1 -0
  48. package/dist/nile-dropdown/nile-dropdown.cjs.js +1 -1
  49. package/dist/nile-dropdown/nile-dropdown.cjs.js.map +1 -1
  50. package/dist/nile-dropdown/nile-dropdown.esm.js +1 -1
  51. package/dist/nile-file-upload/utils/file-validation.util.cjs.js +2 -2
  52. package/dist/nile-file-upload/utils/file-validation.util.cjs.js.map +1 -1
  53. package/dist/nile-file-upload/utils/file-validation.util.esm.js +1 -1
  54. package/dist/nile-filter-chip/nile-filter-chip.cjs.js +1 -1
  55. package/dist/nile-filter-chip/nile-filter-chip.cjs.js.map +1 -1
  56. package/dist/nile-filter-chip/nile-filter-chip.css.cjs.js +1 -1
  57. package/dist/nile-filter-chip/nile-filter-chip.css.cjs.js.map +1 -1
  58. package/dist/nile-filter-chip/nile-filter-chip.css.esm.js +24 -2
  59. package/dist/nile-filter-chip/nile-filter-chip.esm.js +2 -2
  60. package/dist/nile-inline-edit/nile-inline-edit.cjs.js +1 -1
  61. package/dist/nile-inline-edit/nile-inline-edit.cjs.js.map +1 -1
  62. package/dist/nile-inline-edit/nile-inline-edit.css.cjs.js +1 -1
  63. package/dist/nile-inline-edit/nile-inline-edit.css.cjs.js.map +1 -1
  64. package/dist/nile-inline-edit/nile-inline-edit.css.esm.js +15 -6
  65. package/dist/nile-inline-edit/nile-inline-edit.esm.js +2 -2
  66. package/dist/nile-inline-sidebar/nile-inline-sidebar.cjs.js +1 -1
  67. package/dist/nile-inline-sidebar/nile-inline-sidebar.cjs.js.map +1 -1
  68. package/dist/nile-inline-sidebar/nile-inline-sidebar.css.cjs.js +1 -1
  69. package/dist/nile-inline-sidebar/nile-inline-sidebar.css.cjs.js.map +1 -1
  70. package/dist/nile-inline-sidebar/nile-inline-sidebar.css.esm.js +19 -0
  71. package/dist/nile-inline-sidebar/nile-inline-sidebar.esm.js +16 -14
  72. package/dist/nile-inline-sidebar-item/nile-inline-sidebar-item.cjs.js +1 -1
  73. package/dist/nile-inline-sidebar-item/nile-inline-sidebar-item.cjs.js.map +1 -1
  74. package/dist/nile-inline-sidebar-item/nile-inline-sidebar-item.esm.js +8 -3
  75. package/dist/nile-input/nile-input.css.cjs.js +1 -1
  76. package/dist/nile-input/nile-input.css.cjs.js.map +1 -1
  77. package/dist/nile-input/nile-input.css.esm.js +4 -4
  78. package/dist/nile-link/nile-link.cjs.js +1 -1
  79. package/dist/nile-link/nile-link.cjs.js.map +1 -1
  80. package/dist/nile-link/nile-link.css.cjs.js +1 -1
  81. package/dist/nile-link/nile-link.css.cjs.js.map +1 -1
  82. package/dist/nile-link/nile-link.css.esm.js +3 -4
  83. package/dist/nile-link/nile-link.esm.js +2 -2
  84. package/dist/nile-pagination/nile-pagination.cjs.js +1 -1
  85. package/dist/nile-pagination/nile-pagination.cjs.js.map +1 -1
  86. package/dist/nile-pagination/nile-pagination.css.cjs.js +1 -1
  87. package/dist/nile-pagination/nile-pagination.css.cjs.js.map +1 -1
  88. package/dist/nile-pagination/nile-pagination.css.esm.js +109 -5
  89. package/dist/nile-pagination/nile-pagination.esm.js +70 -3
  90. package/dist/nile-qr-code/index.cjs.js +2 -0
  91. package/dist/nile-qr-code/index.cjs.js.map +1 -0
  92. package/dist/nile-qr-code/index.esm.js +1 -0
  93. package/dist/nile-qr-code/nile-qr-code-utils.cjs.js +2 -0
  94. package/dist/nile-qr-code/nile-qr-code-utils.cjs.js.map +1 -0
  95. package/dist/nile-qr-code/nile-qr-code-utils.esm.js +1 -0
  96. package/dist/nile-qr-code/nile-qr-code.cjs.js +2 -0
  97. package/dist/nile-qr-code/nile-qr-code.cjs.js.map +1 -0
  98. package/dist/nile-qr-code/nile-qr-code.css.cjs.js +2 -0
  99. package/dist/nile-qr-code/nile-qr-code.css.cjs.js.map +1 -0
  100. package/dist/nile-qr-code/nile-qr-code.css.esm.js +12 -0
  101. package/dist/nile-qr-code/nile-qr-code.esm.js +9 -0
  102. package/dist/nile-radio/nile-radio.css.cjs.js +1 -1
  103. package/dist/nile-radio/nile-radio.css.cjs.js.map +1 -1
  104. package/dist/nile-radio/nile-radio.css.esm.js +1 -1
  105. package/dist/nile-rich-text-editor/nile-rich-text-editor.cjs.js +1 -1
  106. package/dist/nile-rich-text-editor/nile-rich-text-editor.cjs.js.map +1 -1
  107. package/dist/nile-rich-text-editor/nile-rich-text-editor.css.cjs.js +1 -1
  108. package/dist/nile-rich-text-editor/nile-rich-text-editor.css.cjs.js.map +1 -1
  109. package/dist/nile-rich-text-editor/nile-rich-text-editor.css.esm.js +25 -6
  110. package/dist/nile-rich-text-editor/nile-rich-text-editor.esm.js +1 -1
  111. package/dist/nile-rich-text-editor/nile-rte-select.cjs.js +1 -1
  112. package/dist/nile-rich-text-editor/nile-rte-select.cjs.js.map +1 -1
  113. package/dist/nile-rich-text-editor/nile-rte-select.esm.js +4 -3
  114. package/dist/nile-select/nile-select.css.cjs.js +1 -1
  115. package/dist/nile-select/nile-select.css.cjs.js.map +1 -1
  116. package/dist/nile-select/nile-select.css.esm.js +7 -4
  117. package/dist/nile-slide-toggle/nile-slide-toggle.css.cjs.js +1 -1
  118. package/dist/nile-slide-toggle/nile-slide-toggle.css.cjs.js.map +1 -1
  119. package/dist/nile-slide-toggle/nile-slide-toggle.css.esm.js +5 -1
  120. package/dist/nile-textarea/nile-textarea.css.cjs.js +1 -1
  121. package/dist/nile-textarea/nile-textarea.css.cjs.js.map +1 -1
  122. package/dist/nile-textarea/nile-textarea.css.esm.js +10 -5
  123. package/dist/nile-virtual-select/nile-virtual-select.css.cjs.js +1 -1
  124. package/dist/nile-virtual-select/nile-virtual-select.css.cjs.js.map +1 -1
  125. package/dist/nile-virtual-select/nile-virtual-select.css.esm.js +5 -3
  126. package/dist/src/index.d.ts +2 -0
  127. package/dist/src/index.js +2 -0
  128. package/dist/src/index.js.map +1 -1
  129. package/dist/src/nile-auto-complete/nile-auto-complete.css.js +11 -0
  130. package/dist/src/nile-auto-complete/nile-auto-complete.css.js.map +1 -1
  131. package/dist/src/nile-button/nile-button.css.js +89 -33
  132. package/dist/src/nile-button/nile-button.css.js.map +1 -1
  133. package/dist/src/nile-button/nile-button.js +5 -5
  134. package/dist/src/nile-button/nile-button.js.map +1 -1
  135. package/dist/src/nile-calendar/nile-calendar.css.js +57 -0
  136. package/dist/src/nile-calendar/nile-calendar.css.js.map +1 -1
  137. package/dist/src/nile-calendar/nile-calendar.d.ts +1 -0
  138. package/dist/src/nile-calendar/nile-calendar.js +24 -6
  139. package/dist/src/nile-calendar/nile-calendar.js.map +1 -1
  140. package/dist/src/nile-checkbox/nile-checkbox.css.js +4 -5
  141. package/dist/src/nile-checkbox/nile-checkbox.css.js.map +1 -1
  142. package/dist/src/nile-chip/nile-chip.css.js +35 -21
  143. package/dist/src/nile-chip/nile-chip.css.js.map +1 -1
  144. package/dist/src/nile-code-editor/nile-code-editor.css.js +7 -6
  145. package/dist/src/nile-code-editor/nile-code-editor.css.js.map +1 -1
  146. package/dist/src/nile-code-editor/nile-code-editor.d.ts +1 -1
  147. package/dist/src/nile-code-editor/nile-code-editor.js +7 -1
  148. package/dist/src/nile-code-editor/nile-code-editor.js.map +1 -1
  149. package/dist/src/nile-date-picker/nile-date-picker.d.ts +3 -0
  150. package/dist/src/nile-date-picker/nile-date-picker.js +22 -2
  151. package/dist/src/nile-date-picker/nile-date-picker.js.map +1 -1
  152. package/dist/src/nile-detail/index.d.ts +1 -0
  153. package/dist/src/nile-detail/index.js +2 -0
  154. package/dist/src/nile-detail/index.js.map +1 -0
  155. package/dist/src/nile-detail/nile-detail.css.d.ts +3 -0
  156. package/dist/src/nile-detail/nile-detail.css.js +152 -0
  157. package/dist/src/nile-detail/nile-detail.css.js.map +1 -0
  158. package/dist/src/nile-detail/nile-detail.d.ts +29 -0
  159. package/dist/src/nile-detail/nile-detail.js +143 -0
  160. package/dist/src/nile-detail/nile-detail.js.map +1 -0
  161. package/dist/src/nile-detail/nile-detail.test.d.ts +1 -0
  162. package/dist/src/nile-detail/nile-detail.test.js +168 -0
  163. package/dist/src/nile-detail/nile-detail.test.js.map +1 -0
  164. package/dist/src/nile-detail/nile-detail.utils.d.ts +8 -0
  165. package/dist/src/nile-detail/nile-detail.utils.js +117 -0
  166. package/dist/src/nile-detail/nile-detail.utils.js.map +1 -0
  167. package/dist/src/nile-dropdown/nile-dropdown.d.ts +1 -0
  168. package/dist/src/nile-dropdown/nile-dropdown.js +11 -0
  169. package/dist/src/nile-dropdown/nile-dropdown.js.map +1 -1
  170. package/dist/src/nile-file-upload/utils/file-validation.util.js +11 -6
  171. package/dist/src/nile-file-upload/utils/file-validation.util.js.map +1 -1
  172. package/dist/src/nile-filter-chip/nile-filter-chip.css.js +22 -0
  173. package/dist/src/nile-filter-chip/nile-filter-chip.css.js.map +1 -1
  174. package/dist/src/nile-filter-chip/nile-filter-chip.d.ts +1 -0
  175. package/dist/src/nile-filter-chip/nile-filter-chip.js +6 -0
  176. package/dist/src/nile-filter-chip/nile-filter-chip.js.map +1 -1
  177. package/dist/src/nile-inline-edit/nile-inline-edit.css.js +15 -6
  178. package/dist/src/nile-inline-edit/nile-inline-edit.css.js.map +1 -1
  179. package/dist/src/nile-inline-edit/nile-inline-edit.d.ts +2 -0
  180. package/dist/src/nile-inline-edit/nile-inline-edit.js +7 -0
  181. package/dist/src/nile-inline-edit/nile-inline-edit.js.map +1 -1
  182. package/dist/src/nile-inline-sidebar/nile-inline-sidebar.css.js +19 -0
  183. package/dist/src/nile-inline-sidebar/nile-inline-sidebar.css.js.map +1 -1
  184. package/dist/src/nile-inline-sidebar/nile-inline-sidebar.d.ts +6 -0
  185. package/dist/src/nile-inline-sidebar/nile-inline-sidebar.js +88 -4
  186. package/dist/src/nile-inline-sidebar/nile-inline-sidebar.js.map +1 -1
  187. package/dist/src/nile-inline-sidebar/nile-inline-sidebar.test.d.ts +3 -0
  188. package/dist/src/nile-inline-sidebar/nile-inline-sidebar.test.js +110 -0
  189. package/dist/src/nile-inline-sidebar/nile-inline-sidebar.test.js.map +1 -0
  190. package/dist/src/nile-inline-sidebar-group/nile-inline-sidebar-group.test.d.ts +2 -0
  191. package/dist/src/nile-inline-sidebar-group/nile-inline-sidebar-group.test.js +109 -0
  192. package/dist/src/nile-inline-sidebar-group/nile-inline-sidebar-group.test.js.map +1 -0
  193. package/dist/src/nile-inline-sidebar-item/nile-inline-sidebar-item.d.ts +4 -0
  194. package/dist/src/nile-inline-sidebar-item/nile-inline-sidebar-item.js +30 -2
  195. package/dist/src/nile-inline-sidebar-item/nile-inline-sidebar-item.js.map +1 -1
  196. package/dist/src/nile-inline-sidebar-item/nile-inline-sidebar-item.test.d.ts +2 -0
  197. package/dist/src/nile-inline-sidebar-item/nile-inline-sidebar-item.test.js +109 -0
  198. package/dist/src/nile-inline-sidebar-item/nile-inline-sidebar-item.test.js.map +1 -0
  199. package/dist/src/nile-input/nile-input.css.js +4 -4
  200. package/dist/src/nile-input/nile-input.css.js.map +1 -1
  201. package/dist/src/nile-link/nile-link.css.js +1 -2
  202. package/dist/src/nile-link/nile-link.css.js.map +1 -1
  203. package/dist/src/nile-link/nile-link.js +1 -0
  204. package/dist/src/nile-link/nile-link.js.map +1 -1
  205. package/dist/src/nile-pagination/nile-pagination.css.js +107 -3
  206. package/dist/src/nile-pagination/nile-pagination.css.js.map +1 -1
  207. package/dist/src/nile-pagination/nile-pagination.d.ts +5 -1
  208. package/dist/src/nile-pagination/nile-pagination.js +84 -1
  209. package/dist/src/nile-pagination/nile-pagination.js.map +1 -1
  210. package/dist/src/nile-pagination/nile-pagination.test.js +1187 -103
  211. package/dist/src/nile-pagination/nile-pagination.test.js.map +1 -1
  212. package/dist/src/nile-qr-code/index.d.ts +1 -0
  213. package/dist/src/nile-qr-code/index.js +2 -0
  214. package/dist/src/nile-qr-code/index.js.map +1 -0
  215. package/dist/src/nile-qr-code/nile-qr-code-utils.d.ts +15 -0
  216. package/dist/src/nile-qr-code/nile-qr-code-utils.js +678 -0
  217. package/dist/src/nile-qr-code/nile-qr-code-utils.js.map +1 -0
  218. package/dist/src/nile-qr-code/nile-qr-code.css.d.ts +12 -0
  219. package/dist/src/nile-qr-code/nile-qr-code.css.js +24 -0
  220. package/dist/src/nile-qr-code/nile-qr-code.css.js.map +1 -0
  221. package/dist/src/nile-qr-code/nile-qr-code.d.ts +127 -0
  222. package/dist/src/nile-qr-code/nile-qr-code.js +381 -0
  223. package/dist/src/nile-qr-code/nile-qr-code.js.map +1 -0
  224. package/dist/src/nile-qr-code/nile-qr-code.test.d.ts +1 -0
  225. package/dist/src/nile-qr-code/nile-qr-code.test.js +719 -0
  226. package/dist/src/nile-qr-code/nile-qr-code.test.js.map +1 -0
  227. package/dist/src/nile-radio/nile-radio.css.js +1 -1
  228. package/dist/src/nile-radio/nile-radio.css.js.map +1 -1
  229. package/dist/src/nile-rich-text-editor/nile-rich-text-editor.css.js +25 -6
  230. package/dist/src/nile-rich-text-editor/nile-rich-text-editor.css.js.map +1 -1
  231. package/dist/src/nile-rich-text-editor/nile-rich-text-editor.d.ts +1 -0
  232. package/dist/src/nile-rich-text-editor/nile-rich-text-editor.js +17 -6
  233. package/dist/src/nile-rich-text-editor/nile-rich-text-editor.js.map +1 -1
  234. package/dist/src/nile-rich-text-editor/nile-rte-select.d.ts +1 -0
  235. package/dist/src/nile-rich-text-editor/nile-rte-select.js +7 -2
  236. package/dist/src/nile-rich-text-editor/nile-rte-select.js.map +1 -1
  237. package/dist/src/nile-select/nile-select.css.js +7 -4
  238. package/dist/src/nile-select/nile-select.css.js.map +1 -1
  239. package/dist/src/nile-slide-toggle/nile-slide-toggle.css.js +5 -1
  240. package/dist/src/nile-slide-toggle/nile-slide-toggle.css.js.map +1 -1
  241. package/dist/src/nile-textarea/nile-textarea.css.js +10 -5
  242. package/dist/src/nile-textarea/nile-textarea.css.js.map +1 -1
  243. package/dist/src/nile-virtual-select/nile-virtual-select.css.js +5 -3
  244. package/dist/src/nile-virtual-select/nile-virtual-select.css.js.map +1 -1
  245. package/dist/src/version.js +1 -1
  246. package/dist/src/version.js.map +1 -1
  247. package/dist/tsconfig.tsbuildinfo +1 -1
  248. package/package.json +3 -2
  249. package/src/index.ts +3 -2
  250. package/src/nile-auto-complete/nile-auto-complete.css.ts +11 -0
  251. package/src/nile-button/nile-button.css.ts +89 -33
  252. package/src/nile-button/nile-button.ts +6 -5
  253. package/src/nile-calendar/nile-calendar.css.ts +57 -0
  254. package/src/nile-calendar/nile-calendar.ts +17 -6
  255. package/src/nile-checkbox/nile-checkbox.css.ts +4 -5
  256. package/src/nile-chip/nile-chip.css.ts +35 -21
  257. package/src/nile-code-editor/nile-code-editor.css.ts +7 -6
  258. package/src/nile-code-editor/nile-code-editor.ts +7 -1
  259. package/src/nile-date-picker/nile-date-picker.ts +22 -2
  260. package/src/nile-detail/index.ts +1 -0
  261. package/src/nile-detail/nile-detail.css.ts +153 -0
  262. package/src/nile-detail/nile-detail.test.ts +215 -0
  263. package/src/nile-detail/nile-detail.ts +140 -0
  264. package/src/nile-detail/nile-detail.utils.ts +133 -0
  265. package/src/nile-dropdown/nile-dropdown.ts +11 -0
  266. package/src/nile-file-upload/utils/file-validation.util.ts +10 -5
  267. package/src/nile-filter-chip/nile-filter-chip.css.ts +22 -0
  268. package/src/nile-filter-chip/nile-filter-chip.ts +2 -0
  269. package/src/nile-inline-edit/nile-inline-edit.css.ts +15 -6
  270. package/src/nile-inline-edit/nile-inline-edit.ts +4 -0
  271. package/src/nile-inline-sidebar/nile-inline-sidebar.css.ts +19 -0
  272. package/src/nile-inline-sidebar/nile-inline-sidebar.test.ts +108 -0
  273. package/src/nile-inline-sidebar/nile-inline-sidebar.ts +108 -5
  274. package/src/nile-inline-sidebar-group/nile-inline-sidebar-group.test.ts +107 -0
  275. package/src/nile-inline-sidebar-item/nile-inline-sidebar-item.test.ts +107 -0
  276. package/src/nile-inline-sidebar-item/nile-inline-sidebar-item.ts +34 -3
  277. package/src/nile-input/nile-input.css.ts +4 -4
  278. package/src/nile-link/nile-link.css.ts +1 -2
  279. package/src/nile-link/nile-link.ts +1 -0
  280. package/src/nile-pagination/nile-pagination.css.ts +107 -3
  281. package/src/nile-pagination/nile-pagination.test.ts +1388 -101
  282. package/src/nile-pagination/nile-pagination.ts +87 -2
  283. package/src/nile-qr-code/index.ts +1 -0
  284. package/src/nile-qr-code/nile-qr-code-utils.ts +733 -0
  285. package/src/nile-qr-code/nile-qr-code.css.ts +26 -0
  286. package/src/nile-qr-code/nile-qr-code.test.ts +879 -0
  287. package/src/nile-qr-code/nile-qr-code.ts +431 -0
  288. package/src/nile-radio/nile-radio.css.ts +1 -1
  289. package/src/nile-rich-text-editor/nile-rich-text-editor.css.ts +25 -6
  290. package/src/nile-rich-text-editor/nile-rich-text-editor.ts +14 -6
  291. package/src/nile-rich-text-editor/nile-rte-select.ts +5 -2
  292. package/src/nile-select/nile-select.css.ts +7 -4
  293. package/src/nile-slide-toggle/nile-slide-toggle.css.ts +5 -1
  294. package/src/nile-textarea/nile-textarea.css.ts +10 -5
  295. package/src/nile-virtual-select/nile-virtual-select.css.ts +5 -3
  296. package/vscode-html-custom-data.json +163 -10
  297. package/web-test-runner.config.mjs +1 -1
@@ -0,0 +1,381 @@
1
+ /**
2
+ * Copyright Aquera Inc 2023
3
+ *
4
+ * This source code is licensed under the BSD-3-Clause license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+ import { __decorate } from "tslib";
8
+ import { html } from 'lit';
9
+ import { customElement, property, query } from 'lit/decorators.js';
10
+ import { styles } from './nile-qr-code.css.js';
11
+ import { generateQR } from './nile-qr-code-utils.js';
12
+ import NileElement from '../internal/nile-element.js';
13
+ /**
14
+ * Nile QR Code component.
15
+ *
16
+
17
+ * @tag nile-qr-code
18
+ *
19
+ * @csspart base - The canvas element used to draw the QR code.
20
+ *
21
+ * @fires nile-qr-image-error - Emitted when the center image fails to load.
22
+ *
23
+ * @example
24
+
25
+ *
26
+
27
+ */
28
+ let NileQrCode = class NileQrCode extends NileElement {
29
+ constructor() {
30
+ super(...arguments);
31
+ // -------------------------------------------------------------------------
32
+ // Properties
33
+ // -------------------------------------------------------------------------
34
+ /**
35
+ * The QR code's value — the text or URL to encode.
36
+ */
37
+ this.value = '';
38
+ /**
39
+ * The size of the QR code, in pixels.
40
+ */
41
+ this.size = 128;
42
+ /**
43
+ * The fill color. This can be any valid CSS color, but not a CSS custom property.
44
+ */
45
+ this.fill = 'black';
46
+ /**
47
+ * The background color. This can be any valid CSS color or `'transparent'`.
48
+ * It cannot be a CSS custom property.
49
+ */
50
+ this.background = 'white';
51
+ /**
52
+ * The edge radius of each module. Must be between 0 and 0.5.
53
+ * Use this to create a rounded effect.
54
+ */
55
+ this.radius = 0;
56
+ /**
57
+ * The level of error correction to use.
58
+ * - `'L'` — Low (~7%)
59
+ * - `'M'` — Medium (~15%)
60
+ * - `'Q'` — Quartile (~25%)
61
+ * - `'H'` — High (~30%)
62
+ *
63
+ * When using an image overlay, `'H'` is recommended so the QR remains scannable.
64
+ */
65
+ this.errorCorrection = 'H';
66
+ /**
67
+ * The label for assistive devices to announce.
68
+ * If unspecified, the `value` will be used instead.
69
+ */
70
+ this.label = '';
71
+ /**
72
+ * URL of an image to overlay in the center of the QR code (e.g. a logo).
73
+ * The image is drawn on top of the QR modules, so use `error-correction="H"`
74
+ * to ensure the code remains scannable.
75
+ */
76
+ this.image = '';
77
+ /**
78
+ * Size of the center image as a fraction of the overall QR code size
79
+ * (0.1 – 0.4). Defaults to 0.25 (25% of the QR code).
80
+ */
81
+ this.imageSize = 0.25;
82
+ /**
83
+ * Padding around the center image in pixels. Creates a clear area
84
+ * between the image and the surrounding QR modules.
85
+ */
86
+ this.imagePadding = 4;
87
+ /**
88
+ * Optional border radius for the center image in pixels.
89
+ * Set to a high value for a circular mask.
90
+ */
91
+ this.imageRadius = 4;
92
+ /**
93
+ * Apply a linear gradient to the QR modules instead of a flat color.
94
+ * Format: `"direction, color1, color2[, ...]"` where direction is an
95
+ * angle in degrees (e.g. `"135, #6366f1, #ec4899"`).
96
+ * When set, this overrides the `fill` property for module rendering.
97
+ */
98
+ this.fillGradient = '';
99
+ // -------------------------------------------------------------------------
100
+ // Internal state
101
+ // -------------------------------------------------------------------------
102
+ this._loadedImage = null;
103
+ this._imageLoadPromise = null;
104
+ }
105
+ /**
106
+ * The styles for QR Code.
107
+ * @remarks If you are extending this class you can extend the base styles with super. Eg `return [super(), myCustomStyles]`
108
+ */
109
+ static get styles() {
110
+ return [styles];
111
+ }
112
+ // -------------------------------------------------------------------------
113
+ // Lifecycle
114
+ // -------------------------------------------------------------------------
115
+ updated(changedProperties) {
116
+ super.updated(changedProperties);
117
+ if (changedProperties.has('image')) {
118
+ this._loadedImage = null;
119
+ this._imageLoadPromise = null;
120
+ if (this.image) {
121
+ this.loadImage(this.image);
122
+ return;
123
+ }
124
+ }
125
+ const relevantProps = [
126
+ 'value', 'size', 'fill', 'background', 'radius', 'errorCorrection',
127
+ 'imageSize', 'imagePadding', 'imageRadius', 'fillGradient',
128
+ ];
129
+ const needsRedraw = relevantProps.some(p => changedProperties.has(p));
130
+ if (needsRedraw) {
131
+ this.drawQrCode();
132
+ }
133
+ }
134
+ // -------------------------------------------------------------------------
135
+ // Rendering
136
+ // -------------------------------------------------------------------------
137
+ render() {
138
+ const ariaLabel = this.label || this.value || 'QR Code';
139
+ return html `
140
+ <canvas
141
+ part="base"
142
+ role="img"
143
+ aria-label=${ariaLabel}
144
+ width=${this.size}
145
+ height=${this.size}
146
+ ></canvas>
147
+ `;
148
+ }
149
+ // -------------------------------------------------------------------------
150
+ // Public methods
151
+ // -------------------------------------------------------------------------
152
+ /**
153
+ * Downloads the QR code as a PNG image.
154
+ * @param filename - The name of the downloaded file (defaults to `'qr-code.png'`).
155
+ */
156
+ download(filename = 'qr-code.png') {
157
+ if (!this.canvas)
158
+ return;
159
+ const link = document.createElement('a');
160
+ link.download = filename;
161
+ link.href = this.canvas.toDataURL('image/png');
162
+ link.click();
163
+ }
164
+ /**
165
+ * Returns the QR code canvas content as a data URL.
166
+ * @param type - MIME type (defaults to `'image/png'`).
167
+ */
168
+ toDataURL(type = 'image/png') {
169
+ if (!this.canvas)
170
+ return '';
171
+ return this.canvas.toDataURL(type);
172
+ }
173
+ // -------------------------------------------------------------------------
174
+ // Private methods
175
+ // -------------------------------------------------------------------------
176
+ loadImage(src) {
177
+ const img = new Image();
178
+ img.crossOrigin = 'anonymous';
179
+ this._imageLoadPromise = new Promise((resolve) => {
180
+ img.onload = () => {
181
+ this._loadedImage = img;
182
+ this._imageLoadPromise = null;
183
+ this.drawQrCode();
184
+ resolve();
185
+ };
186
+ img.onerror = () => {
187
+ this._loadedImage = null;
188
+ this._imageLoadPromise = null;
189
+ this.emit('nile-qr-image-error', { src });
190
+ this.drawQrCode();
191
+ resolve();
192
+ };
193
+ });
194
+ img.src = src;
195
+ }
196
+ drawQrCode() {
197
+ if (!this.canvas)
198
+ return;
199
+ const ctx = this.canvas.getContext('2d');
200
+ if (!ctx)
201
+ return;
202
+ const { size, fill, background, radius: rawRadius, errorCorrection, value } = this;
203
+ const clampedRadius = Math.max(0, Math.min(0.5, rawRadius));
204
+ const matrix = generateQR(value, errorCorrection);
205
+ const moduleCount = matrix.length;
206
+ const moduleSize = size / moduleCount;
207
+ ctx.clearRect(0, 0, size, size);
208
+ if (background && background !== 'transparent') {
209
+ ctx.fillStyle = background;
210
+ ctx.fillRect(0, 0, size, size);
211
+ }
212
+ const imgFraction = Math.max(0.1, Math.min(0.4, this.imageSize));
213
+ const imgPixelSize = this._loadedImage ? size * imgFraction : 0;
214
+ const padTotal = this._loadedImage ? this.imagePadding * 2 : 0;
215
+ const exclusionSize = imgPixelSize + padTotal;
216
+ const exclusionStart = (size - exclusionSize) / 2;
217
+ const exclusionEnd = exclusionStart + exclusionSize;
218
+ const useFill = this.resolveModuleFill(ctx, size);
219
+ ctx.fillStyle = useFill;
220
+ for (let row = 0; row < moduleCount; row++) {
221
+ for (let col = 0; col < moduleCount; col++) {
222
+ if (matrix[row][col] !== 1)
223
+ continue;
224
+ const x = col * moduleSize;
225
+ const y = row * moduleSize;
226
+ if (this._loadedImage) {
227
+ const modRight = x + moduleSize;
228
+ const modBottom = y + moduleSize;
229
+ if (x >= exclusionStart && modRight <= exclusionEnd &&
230
+ y >= exclusionStart && modBottom <= exclusionEnd) {
231
+ continue;
232
+ }
233
+ }
234
+ if (clampedRadius > 0) {
235
+ this.drawRoundedModule(ctx, x, y, moduleSize, moduleSize, clampedRadius * moduleSize);
236
+ }
237
+ else {
238
+ ctx.fillRect(x, y, moduleSize, moduleSize);
239
+ }
240
+ }
241
+ }
242
+ if (this._loadedImage) {
243
+ this.drawCenterImage(ctx, size, imgPixelSize);
244
+ }
245
+ }
246
+ /**
247
+ * Returns the fill style for QR modules — either a gradient or the flat fill color.
248
+ */
249
+ resolveModuleFill(ctx, size) {
250
+ if (!this.fillGradient)
251
+ return this.fill;
252
+ const parts = this.fillGradient.split(',').map(s => s.trim());
253
+ if (parts.length < 3)
254
+ return this.fill;
255
+ const angleDeg = parseFloat(parts[0]);
256
+ if (Number.isNaN(angleDeg))
257
+ return this.fill;
258
+ const angleRad = (angleDeg * Math.PI) / 180;
259
+ const cx = size / 2;
260
+ const cy = size / 2;
261
+ const len = size / 2;
262
+ const x0 = cx - Math.cos(angleRad) * len;
263
+ const y0 = cy - Math.sin(angleRad) * len;
264
+ const x1 = cx + Math.cos(angleRad) * len;
265
+ const y1 = cy + Math.sin(angleRad) * len;
266
+ const gradient = ctx.createLinearGradient(x0, y0, x1, y1);
267
+ const colors = parts.slice(1);
268
+ for (let i = 0; i < colors.length; i++) {
269
+ gradient.addColorStop(i / (colors.length - 1), colors[i]);
270
+ }
271
+ return gradient;
272
+ }
273
+ drawCenterImage(ctx, size, imgPixelSize) {
274
+ if (!this._loadedImage)
275
+ return;
276
+ const x = (size - imgPixelSize) / 2;
277
+ const y = (size - imgPixelSize) / 2;
278
+ const r = Math.min(this.imageRadius, imgPixelSize / 2);
279
+ const pad = this.imagePadding;
280
+ if (pad > 0 && this.background && this.background !== 'transparent') {
281
+ ctx.fillStyle = this.background;
282
+ const bx = x - pad;
283
+ const by = y - pad;
284
+ const bw = imgPixelSize + pad * 2;
285
+ const bh = imgPixelSize + pad * 2;
286
+ const br = r + pad * 0.5;
287
+ this.drawRoundedRect(ctx, bx, by, bw, bh, br);
288
+ ctx.fill();
289
+ }
290
+ ctx.save();
291
+ this.clipRoundedRect(ctx, x, y, imgPixelSize, imgPixelSize, r);
292
+ ctx.drawImage(this._loadedImage, x, y, imgPixelSize, imgPixelSize);
293
+ ctx.restore();
294
+ }
295
+ drawRoundedModule(ctx, x, y, w, h, r) {
296
+ ctx.beginPath();
297
+ ctx.moveTo(x + r, y);
298
+ ctx.lineTo(x + w - r, y);
299
+ ctx.arcTo(x + w, y, x + w, y + r, r);
300
+ ctx.lineTo(x + w, y + h - r);
301
+ ctx.arcTo(x + w, y + h, x + w - r, y + h, r);
302
+ ctx.lineTo(x + r, y + h);
303
+ ctx.arcTo(x, y + h, x, y + h - r, r);
304
+ ctx.lineTo(x, y + r);
305
+ ctx.arcTo(x, y, x + r, y, r);
306
+ ctx.closePath();
307
+ ctx.fill();
308
+ }
309
+ drawRoundedRect(ctx, x, y, w, h, r) {
310
+ ctx.beginPath();
311
+ ctx.moveTo(x + r, y);
312
+ ctx.lineTo(x + w - r, y);
313
+ ctx.arcTo(x + w, y, x + w, y + r, r);
314
+ ctx.lineTo(x + w, y + h - r);
315
+ ctx.arcTo(x + w, y + h, x + w - r, y + h, r);
316
+ ctx.lineTo(x + r, y + h);
317
+ ctx.arcTo(x, y + h, x, y + h - r, r);
318
+ ctx.lineTo(x, y + r);
319
+ ctx.arcTo(x, y, x + r, y, r);
320
+ ctx.closePath();
321
+ }
322
+ clipRoundedRect(ctx, x, y, w, h, r) {
323
+ ctx.beginPath();
324
+ ctx.moveTo(x + r, y);
325
+ ctx.lineTo(x + w - r, y);
326
+ ctx.arcTo(x + w, y, x + w, y + r, r);
327
+ ctx.lineTo(x + w, y + h - r);
328
+ ctx.arcTo(x + w, y + h, x + w - r, y + h, r);
329
+ ctx.lineTo(x + r, y + h);
330
+ ctx.arcTo(x, y + h, x, y + h - r, r);
331
+ ctx.lineTo(x, y + r);
332
+ ctx.arcTo(x, y, x + r, y, r);
333
+ ctx.closePath();
334
+ ctx.clip();
335
+ }
336
+ };
337
+ __decorate([
338
+ property({ type: String, reflect: true })
339
+ ], NileQrCode.prototype, "value", void 0);
340
+ __decorate([
341
+ property({ type: Number, reflect: true })
342
+ ], NileQrCode.prototype, "size", void 0);
343
+ __decorate([
344
+ property({ type: String, reflect: true })
345
+ ], NileQrCode.prototype, "fill", void 0);
346
+ __decorate([
347
+ property({ type: String, reflect: true })
348
+ ], NileQrCode.prototype, "background", void 0);
349
+ __decorate([
350
+ property({ type: Number, reflect: true })
351
+ ], NileQrCode.prototype, "radius", void 0);
352
+ __decorate([
353
+ property({ attribute: 'error-correction', reflect: true })
354
+ ], NileQrCode.prototype, "errorCorrection", void 0);
355
+ __decorate([
356
+ property({ type: String, reflect: true })
357
+ ], NileQrCode.prototype, "label", void 0);
358
+ __decorate([
359
+ property({ type: String, reflect: true })
360
+ ], NileQrCode.prototype, "image", void 0);
361
+ __decorate([
362
+ property({ attribute: 'image-size', type: Number, reflect: true })
363
+ ], NileQrCode.prototype, "imageSize", void 0);
364
+ __decorate([
365
+ property({ attribute: 'image-padding', type: Number, reflect: true })
366
+ ], NileQrCode.prototype, "imagePadding", void 0);
367
+ __decorate([
368
+ property({ attribute: 'image-radius', type: Number, reflect: true })
369
+ ], NileQrCode.prototype, "imageRadius", void 0);
370
+ __decorate([
371
+ property({ attribute: 'fill-gradient', type: String, reflect: true })
372
+ ], NileQrCode.prototype, "fillGradient", void 0);
373
+ __decorate([
374
+ query('canvas')
375
+ ], NileQrCode.prototype, "canvas", void 0);
376
+ NileQrCode = __decorate([
377
+ customElement('nile-qr-code')
378
+ ], NileQrCode);
379
+ export { NileQrCode };
380
+ export default NileQrCode;
381
+ //# sourceMappingURL=nile-qr-code.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nile-qr-code.js","sourceRoot":"","sources":["../../../src/nile-qr-code/nile-qr-code.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Copyright Aquera Inc 2023\n *\n * This source code is licensed under the BSD-3-Clause license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport { html, CSSResultArray, TemplateResult, PropertyValues } from 'lit';\nimport { customElement, property, query } from 'lit/decorators.js';\nimport { styles } from './nile-qr-code.css.js';\nimport { generateQR, ErrorCorrectionLevel } from './nile-qr-code-utils.js';\nimport NileElement from '../internal/nile-element.js';\n\n/**\n * Nile QR Code component.\n *\n \n * @tag nile-qr-code\n *\n * @csspart base - The canvas element used to draw the QR code.\n *\n * @fires nile-qr-image-error - Emitted when the center image fails to load.\n *\n * @example\n \n *\n \n */\n@customElement('nile-qr-code')\nexport class NileQrCode extends NileElement {\n\n /**\n * The styles for QR Code.\n * @remarks If you are extending this class you can extend the base styles with super. Eg `return [super(), myCustomStyles]`\n */\n public static get styles(): CSSResultArray {\n return [styles];\n }\n\n // -------------------------------------------------------------------------\n // Properties\n // -------------------------------------------------------------------------\n\n /**\n * The QR code's value — the text or URL to encode.\n */\n @property({ type: String, reflect: true })\n value = '';\n\n /**\n * The size of the QR code, in pixels.\n */\n @property({ type: Number, reflect: true })\n size = 128;\n\n /**\n * The fill color. This can be any valid CSS color, but not a CSS custom property.\n */\n @property({ type: String, reflect: true })\n fill = 'black';\n\n /**\n * The background color. This can be any valid CSS color or `'transparent'`.\n * It cannot be a CSS custom property.\n */\n @property({ type: String, reflect: true })\n background = 'white';\n\n /**\n * The edge radius of each module. Must be between 0 and 0.5.\n * Use this to create a rounded effect.\n */\n @property({ type: Number, reflect: true })\n radius = 0;\n\n /**\n * The level of error correction to use.\n * - `'L'` — Low (~7%)\n * - `'M'` — Medium (~15%)\n * - `'Q'` — Quartile (~25%)\n * - `'H'` — High (~30%)\n *\n * When using an image overlay, `'H'` is recommended so the QR remains scannable.\n */\n @property({ attribute: 'error-correction', reflect: true })\n errorCorrection: ErrorCorrectionLevel = 'H';\n\n /**\n * The label for assistive devices to announce.\n * If unspecified, the `value` will be used instead.\n */\n @property({ type: String, reflect: true })\n label = '';\n\n /**\n * URL of an image to overlay in the center of the QR code (e.g. a logo).\n * The image is drawn on top of the QR modules, so use `error-correction=\"H\"`\n * to ensure the code remains scannable.\n */\n @property({ type: String, reflect: true })\n image = '';\n\n /**\n * Size of the center image as a fraction of the overall QR code size\n * (0.1 – 0.4). Defaults to 0.25 (25% of the QR code).\n */\n @property({ attribute: 'image-size', type: Number, reflect: true })\n imageSize = 0.25;\n\n /**\n * Padding around the center image in pixels. Creates a clear area\n * between the image and the surrounding QR modules.\n */\n @property({ attribute: 'image-padding', type: Number, reflect: true })\n imagePadding = 4;\n\n /**\n * Optional border radius for the center image in pixels.\n * Set to a high value for a circular mask.\n */\n @property({ attribute: 'image-radius', type: Number, reflect: true })\n imageRadius = 4;\n\n /**\n * Apply a linear gradient to the QR modules instead of a flat color.\n * Format: `\"direction, color1, color2[, ...]\"` where direction is an\n * angle in degrees (e.g. `\"135, #6366f1, #ec4899\"`).\n * When set, this overrides the `fill` property for module rendering.\n */\n @property({ attribute: 'fill-gradient', type: String, reflect: true })\n fillGradient = '';\n\n // -------------------------------------------------------------------------\n // Internal state\n // -------------------------------------------------------------------------\n\n private _loadedImage: HTMLImageElement | null = null;\n\n private _imageLoadPromise: Promise<void> | null = null;\n\n // -------------------------------------------------------------------------\n // Refs\n // -------------------------------------------------------------------------\n\n @query('canvas')\n private canvas!: HTMLCanvasElement;\n\n // -------------------------------------------------------------------------\n // Lifecycle\n // -------------------------------------------------------------------------\n\n protected override updated(changedProperties: PropertyValues): void {\n super.updated(changedProperties);\n\n if (changedProperties.has('image')) {\n this._loadedImage = null;\n this._imageLoadPromise = null;\n if (this.image) {\n this.loadImage(this.image);\n return;\n }\n }\n\n const relevantProps: (keyof NileQrCode)[] = [\n 'value', 'size', 'fill', 'background', 'radius', 'errorCorrection',\n 'imageSize', 'imagePadding', 'imageRadius', 'fillGradient',\n ];\n\n const needsRedraw = relevantProps.some(p => changedProperties.has(p));\n if (needsRedraw) {\n this.drawQrCode();\n }\n }\n\n // -------------------------------------------------------------------------\n // Rendering\n // -------------------------------------------------------------------------\n\n public render(): TemplateResult {\n const ariaLabel = this.label || this.value || 'QR Code';\n\n return html`\n <canvas\n part=\"base\"\n role=\"img\"\n aria-label=${ariaLabel}\n width=${this.size}\n height=${this.size}\n ></canvas>\n `;\n }\n\n // -------------------------------------------------------------------------\n // Public methods\n // -------------------------------------------------------------------------\n\n /**\n * Downloads the QR code as a PNG image.\n * @param filename - The name of the downloaded file (defaults to `'qr-code.png'`).\n */\n public download(filename = 'qr-code.png'): void {\n if (!this.canvas) return;\n const link = document.createElement('a');\n link.download = filename;\n link.href = this.canvas.toDataURL('image/png');\n link.click();\n }\n\n /**\n * Returns the QR code canvas content as a data URL.\n * @param type - MIME type (defaults to `'image/png'`).\n */\n public toDataURL(type = 'image/png'): string {\n if (!this.canvas) return '';\n return this.canvas.toDataURL(type);\n }\n\n // -------------------------------------------------------------------------\n // Private methods\n // -------------------------------------------------------------------------\n\n private loadImage(src: string): void {\n const img = new Image();\n img.crossOrigin = 'anonymous';\n\n this._imageLoadPromise = new Promise<void>((resolve) => {\n img.onload = () => {\n this._loadedImage = img;\n this._imageLoadPromise = null;\n this.drawQrCode();\n resolve();\n };\n img.onerror = () => {\n this._loadedImage = null;\n this._imageLoadPromise = null;\n this.emit('nile-qr-image-error', { src });\n this.drawQrCode();\n resolve();\n };\n });\n\n img.src = src;\n }\n\n private drawQrCode(): void {\n if (!this.canvas) return;\n\n const ctx = this.canvas.getContext('2d');\n if (!ctx) return;\n\n const { size, fill, background, radius: rawRadius, errorCorrection, value } = this;\n\n const clampedRadius = Math.max(0, Math.min(0.5, rawRadius));\n\n const matrix = generateQR(value, errorCorrection);\n const moduleCount = matrix.length;\n const moduleSize = size / moduleCount;\n\n ctx.clearRect(0, 0, size, size);\n\n if (background && background !== 'transparent') {\n ctx.fillStyle = background;\n ctx.fillRect(0, 0, size, size);\n }\n\n const imgFraction = Math.max(0.1, Math.min(0.4, this.imageSize));\n const imgPixelSize = this._loadedImage ? size * imgFraction : 0;\n const padTotal = this._loadedImage ? this.imagePadding * 2 : 0;\n const exclusionSize = imgPixelSize + padTotal;\n const exclusionStart = (size - exclusionSize) / 2;\n const exclusionEnd = exclusionStart + exclusionSize;\n\n const useFill = this.resolveModuleFill(ctx, size);\n ctx.fillStyle = useFill;\n\n for (let row = 0; row < moduleCount; row++) {\n for (let col = 0; col < moduleCount; col++) {\n if (matrix[row][col] !== 1) continue;\n\n const x = col * moduleSize;\n const y = row * moduleSize;\n\n if (this._loadedImage) {\n const modRight = x + moduleSize;\n const modBottom = y + moduleSize;\n if (x >= exclusionStart && modRight <= exclusionEnd &&\n y >= exclusionStart && modBottom <= exclusionEnd) {\n continue;\n }\n }\n\n if (clampedRadius > 0) {\n this.drawRoundedModule(ctx, x, y, moduleSize, moduleSize, clampedRadius * moduleSize);\n } else {\n ctx.fillRect(x, y, moduleSize, moduleSize);\n }\n }\n }\n\n if (this._loadedImage) {\n this.drawCenterImage(ctx, size, imgPixelSize);\n }\n }\n\n /**\n * Returns the fill style for QR modules — either a gradient or the flat fill color.\n */\n private resolveModuleFill(ctx: CanvasRenderingContext2D, size: number): string | CanvasGradient {\n if (!this.fillGradient) return this.fill;\n\n const parts = this.fillGradient.split(',').map(s => s.trim());\n if (parts.length < 3) return this.fill;\n\n const angleDeg = parseFloat(parts[0]);\n if (Number.isNaN(angleDeg)) return this.fill;\n\n const angleRad = (angleDeg * Math.PI) / 180;\n const cx = size / 2;\n const cy = size / 2;\n const len = size / 2;\n const x0 = cx - Math.cos(angleRad) * len;\n const y0 = cy - Math.sin(angleRad) * len;\n const x1 = cx + Math.cos(angleRad) * len;\n const y1 = cy + Math.sin(angleRad) * len;\n\n const gradient = ctx.createLinearGradient(x0, y0, x1, y1);\n const colors = parts.slice(1);\n for (let i = 0; i < colors.length; i++) {\n gradient.addColorStop(i / (colors.length - 1), colors[i]);\n }\n return gradient;\n }\n\n private drawCenterImage(ctx: CanvasRenderingContext2D, size: number, imgPixelSize: number): void {\n if (!this._loadedImage) return;\n\n const x = (size - imgPixelSize) / 2;\n const y = (size - imgPixelSize) / 2;\n const r = Math.min(this.imageRadius, imgPixelSize / 2);\n\n const pad = this.imagePadding;\n if (pad > 0 && this.background && this.background !== 'transparent') {\n ctx.fillStyle = this.background;\n const bx = x - pad;\n const by = y - pad;\n const bw = imgPixelSize + pad * 2;\n const bh = imgPixelSize + pad * 2;\n const br = r + pad * 0.5;\n this.drawRoundedRect(ctx, bx, by, bw, bh, br);\n ctx.fill();\n }\n\n ctx.save();\n this.clipRoundedRect(ctx, x, y, imgPixelSize, imgPixelSize, r);\n ctx.drawImage(this._loadedImage, x, y, imgPixelSize, imgPixelSize);\n ctx.restore();\n }\n\n private drawRoundedModule(\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n w: number,\n h: number,\n r: number\n ): void {\n ctx.beginPath();\n ctx.moveTo(x + r, y);\n ctx.lineTo(x + w - r, y);\n ctx.arcTo(x + w, y, x + w, y + r, r);\n ctx.lineTo(x + w, y + h - r);\n ctx.arcTo(x + w, y + h, x + w - r, y + h, r);\n ctx.lineTo(x + r, y + h);\n ctx.arcTo(x, y + h, x, y + h - r, r);\n ctx.lineTo(x, y + r);\n ctx.arcTo(x, y, x + r, y, r);\n ctx.closePath();\n ctx.fill();\n }\n\n private drawRoundedRect(\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n w: number,\n h: number,\n r: number\n ): void {\n ctx.beginPath();\n ctx.moveTo(x + r, y);\n ctx.lineTo(x + w - r, y);\n ctx.arcTo(x + w, y, x + w, y + r, r);\n ctx.lineTo(x + w, y + h - r);\n ctx.arcTo(x + w, y + h, x + w - r, y + h, r);\n ctx.lineTo(x + r, y + h);\n ctx.arcTo(x, y + h, x, y + h - r, r);\n ctx.lineTo(x, y + r);\n ctx.arcTo(x, y, x + r, y, r);\n ctx.closePath();\n }\n\n private clipRoundedRect(\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n w: number,\n h: number,\n r: number\n ): void {\n ctx.beginPath();\n ctx.moveTo(x + r, y);\n ctx.lineTo(x + w - r, y);\n ctx.arcTo(x + w, y, x + w, y + r, r);\n ctx.lineTo(x + w, y + h - r);\n ctx.arcTo(x + w, y + h, x + w - r, y + h, r);\n ctx.lineTo(x + r, y + h);\n ctx.arcTo(x, y + h, x, y + h - r, r);\n ctx.lineTo(x, y + r);\n ctx.arcTo(x, y, x + r, y, r);\n ctx.closePath();\n ctx.clip();\n }\n}\n\nexport default NileQrCode;\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'nile-qr-code': NileQrCode;\n }\n}\n"]}
@@ -0,0 +1 @@
1
+ import './nile-qr-code';