minerva-design 1.8.0 → 1.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (213) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/README.md +2 -0
  3. package/dist/icons/_virtual/_rolldown/runtime.cjs +1 -0
  4. package/dist/icons/_virtual/_rolldown/runtime.js +11 -0
  5. package/dist/icons/core.cjs +1 -0
  6. package/dist/icons/core.d.cts +12 -0
  7. package/dist/icons/core.d.ts +12 -0
  8. package/dist/icons/core.js +21 -0
  9. package/dist/icons/engine/canvas2d.cjs +2 -0
  10. package/dist/icons/engine/canvas2d.cjs.map +1 -0
  11. package/dist/icons/engine/canvas2d.d.cts +10 -0
  12. package/dist/icons/engine/canvas2d.d.ts +10 -0
  13. package/dist/icons/engine/canvas2d.js +47 -0
  14. package/dist/icons/engine/canvas2d.js.map +1 -0
  15. package/dist/icons/engine/color.cjs +2 -0
  16. package/dist/icons/engine/color.cjs.map +1 -0
  17. package/dist/icons/engine/color.d.cts +9 -0
  18. package/dist/icons/engine/color.d.ts +9 -0
  19. package/dist/icons/engine/color.js +115 -0
  20. package/dist/icons/engine/color.js.map +1 -0
  21. package/dist/icons/engine/defaults.cjs +2 -0
  22. package/dist/icons/engine/defaults.cjs.map +1 -0
  23. package/dist/icons/engine/defaults.d.cts +17 -0
  24. package/dist/icons/engine/defaults.d.ts +17 -0
  25. package/dist/icons/engine/defaults.js +39 -0
  26. package/dist/icons/engine/defaults.js.map +1 -0
  27. package/dist/icons/engine/define.cjs +2 -0
  28. package/dist/icons/engine/define.cjs.map +1 -0
  29. package/dist/icons/engine/define.d.cts +8 -0
  30. package/dist/icons/engine/define.d.ts +8 -0
  31. package/dist/icons/engine/define.js +19 -0
  32. package/dist/icons/engine/define.js.map +1 -0
  33. package/dist/icons/engine/icon-canvas.cjs +2 -0
  34. package/dist/icons/engine/icon-canvas.cjs.map +1 -0
  35. package/dist/icons/engine/icon-canvas.d.cts +13 -0
  36. package/dist/icons/engine/icon-canvas.d.ts +13 -0
  37. package/dist/icons/engine/icon-canvas.js +117 -0
  38. package/dist/icons/engine/icon-canvas.js.map +1 -0
  39. package/dist/icons/engine/icons/actions.cjs +2 -0
  40. package/dist/icons/engine/icons/actions.cjs.map +1 -0
  41. package/dist/icons/engine/icons/actions.d.cts +67 -0
  42. package/dist/icons/engine/icons/actions.d.ts +67 -0
  43. package/dist/icons/engine/icons/actions.js +447 -0
  44. package/dist/icons/engine/icons/actions.js.map +1 -0
  45. package/dist/icons/engine/icons/arrows.cjs +2 -0
  46. package/dist/icons/engine/icons/arrows.cjs.map +1 -0
  47. package/dist/icons/engine/icons/arrows.d.cts +69 -0
  48. package/dist/icons/engine/icons/arrows.d.ts +69 -0
  49. package/dist/icons/engine/icons/arrows.js +417 -0
  50. package/dist/icons/engine/icons/arrows.js.map +1 -0
  51. package/dist/icons/engine/icons/communication.cjs +2 -0
  52. package/dist/icons/engine/icons/communication.cjs.map +1 -0
  53. package/dist/icons/engine/icons/communication.d.cts +21 -0
  54. package/dist/icons/engine/icons/communication.d.ts +21 -0
  55. package/dist/icons/engine/icons/communication.js +142 -0
  56. package/dist/icons/engine/icons/communication.js.map +1 -0
  57. package/dist/icons/engine/icons/data.cjs +2 -0
  58. package/dist/icons/engine/icons/data.cjs.map +1 -0
  59. package/dist/icons/engine/icons/data.d.cts +29 -0
  60. package/dist/icons/engine/icons/data.d.ts +29 -0
  61. package/dist/icons/engine/icons/data.js +203 -0
  62. package/dist/icons/engine/icons/data.js.map +1 -0
  63. package/dist/icons/engine/icons/devices.cjs +2 -0
  64. package/dist/icons/engine/icons/devices.cjs.map +1 -0
  65. package/dist/icons/engine/icons/devices.d.cts +25 -0
  66. package/dist/icons/engine/icons/devices.d.ts +25 -0
  67. package/dist/icons/engine/icons/devices.js +188 -0
  68. package/dist/icons/engine/icons/devices.js.map +1 -0
  69. package/dist/icons/engine/icons/files.cjs +2 -0
  70. package/dist/icons/engine/icons/files.cjs.map +1 -0
  71. package/dist/icons/engine/icons/files.d.cts +33 -0
  72. package/dist/icons/engine/icons/files.d.ts +33 -0
  73. package/dist/icons/engine/icons/files.js +218 -0
  74. package/dist/icons/engine/icons/files.js.map +1 -0
  75. package/dist/icons/engine/icons/finance.cjs +2 -0
  76. package/dist/icons/engine/icons/finance.cjs.map +1 -0
  77. package/dist/icons/engine/icons/finance.d.cts +29 -0
  78. package/dist/icons/engine/icons/finance.d.ts +29 -0
  79. package/dist/icons/engine/icons/finance.js +229 -0
  80. package/dist/icons/engine/icons/finance.js.map +1 -0
  81. package/dist/icons/engine/icons/index.d.cts +10 -0
  82. package/dist/icons/engine/icons/index.d.ts +10 -0
  83. package/dist/icons/engine/icons/interface.cjs +2 -0
  84. package/dist/icons/engine/icons/interface.cjs.map +1 -0
  85. package/dist/icons/engine/icons/interface.d.cts +69 -0
  86. package/dist/icons/engine/icons/interface.d.ts +69 -0
  87. package/dist/icons/engine/icons/interface.js +471 -0
  88. package/dist/icons/engine/icons/interface.js.map +1 -0
  89. package/dist/icons/engine/icons/media.cjs +2 -0
  90. package/dist/icons/engine/icons/media.cjs.map +1 -0
  91. package/dist/icons/engine/icons/media.d.cts +41 -0
  92. package/dist/icons/engine/icons/media.d.ts +41 -0
  93. package/dist/icons/engine/icons/media.js +266 -0
  94. package/dist/icons/engine/icons/media.js.map +1 -0
  95. package/dist/icons/engine/icons/status.cjs +2 -0
  96. package/dist/icons/engine/icons/status.cjs.map +1 -0
  97. package/dist/icons/engine/icons/status.d.cts +31 -0
  98. package/dist/icons/engine/icons/status.d.ts +31 -0
  99. package/dist/icons/engine/icons/status.js +197 -0
  100. package/dist/icons/engine/icons/status.js.map +1 -0
  101. package/dist/icons/engine/path.cjs +3 -0
  102. package/dist/icons/engine/path.cjs.map +1 -0
  103. package/dist/icons/engine/path.d.cts +45 -0
  104. package/dist/icons/engine/path.d.ts +45 -0
  105. package/dist/icons/engine/path.js +215 -0
  106. package/dist/icons/engine/path.js.map +1 -0
  107. package/dist/icons/engine/registry.cjs +2 -0
  108. package/dist/icons/engine/registry.cjs.map +1 -0
  109. package/dist/icons/engine/registry.d.cts +13 -0
  110. package/dist/icons/engine/registry.d.ts +13 -0
  111. package/dist/icons/engine/registry.js +37 -0
  112. package/dist/icons/engine/registry.js.map +1 -0
  113. package/dist/icons/engine/renderers/batch.cjs +2 -0
  114. package/dist/icons/engine/renderers/batch.cjs.map +1 -0
  115. package/dist/icons/engine/renderers/batch.d.cts +32 -0
  116. package/dist/icons/engine/renderers/batch.d.ts +32 -0
  117. package/dist/icons/engine/renderers/batch.js +51 -0
  118. package/dist/icons/engine/renderers/batch.js.map +1 -0
  119. package/dist/icons/engine/renderers/canvas2d.cjs +2 -0
  120. package/dist/icons/engine/renderers/canvas2d.cjs.map +1 -0
  121. package/dist/icons/engine/renderers/canvas2d.d.cts +4 -0
  122. package/dist/icons/engine/renderers/canvas2d.d.ts +4 -0
  123. package/dist/icons/engine/renderers/canvas2d.js +30 -0
  124. package/dist/icons/engine/renderers/canvas2d.js.map +1 -0
  125. package/dist/icons/engine/renderers/detect.cjs +2 -0
  126. package/dist/icons/engine/renderers/detect.cjs.map +1 -0
  127. package/dist/icons/engine/renderers/detect.d.cts +13 -0
  128. package/dist/icons/engine/renderers/detect.d.ts +13 -0
  129. package/dist/icons/engine/renderers/detect.js +38 -0
  130. package/dist/icons/engine/renderers/detect.js.map +1 -0
  131. package/dist/icons/engine/renderers/gl.cjs +2 -0
  132. package/dist/icons/engine/renderers/gl.cjs.map +1 -0
  133. package/dist/icons/engine/renderers/gl.d.cts +9 -0
  134. package/dist/icons/engine/renderers/gl.d.ts +9 -0
  135. package/dist/icons/engine/renderers/gl.js +79 -0
  136. package/dist/icons/engine/renderers/gl.js.map +1 -0
  137. package/dist/icons/engine/renderers/shaders.cjs +58 -0
  138. package/dist/icons/engine/renderers/shaders.cjs.map +1 -0
  139. package/dist/icons/engine/renderers/shaders.d.cts +5 -0
  140. package/dist/icons/engine/renderers/shaders.d.ts +5 -0
  141. package/dist/icons/engine/renderers/shaders.js +6 -0
  142. package/dist/icons/engine/renderers/shaders.js.map +1 -0
  143. package/dist/icons/engine/renderers/types.d.cts +35 -0
  144. package/dist/icons/engine/renderers/types.d.ts +35 -0
  145. package/dist/icons/engine/renderers/webgpu.cjs +2 -0
  146. package/dist/icons/engine/renderers/webgpu.cjs.map +1 -0
  147. package/dist/icons/engine/renderers/webgpu.d.cts +4 -0
  148. package/dist/icons/engine/renderers/webgpu.d.ts +4 -0
  149. package/dist/icons/engine/renderers/webgpu.js +172 -0
  150. package/dist/icons/engine/renderers/webgpu.js.map +1 -0
  151. package/dist/icons/engine/surface.cjs +2 -0
  152. package/dist/icons/engine/surface.cjs.map +1 -0
  153. package/dist/icons/engine/surface.d.cts +7 -0
  154. package/dist/icons/engine/surface.d.ts +7 -0
  155. package/dist/icons/engine/surface.js +150 -0
  156. package/dist/icons/engine/surface.js.map +1 -0
  157. package/dist/icons/engine/svg.cjs +2 -0
  158. package/dist/icons/engine/svg.cjs.map +1 -0
  159. package/dist/icons/engine/svg.d.cts +13 -0
  160. package/dist/icons/engine/svg.d.ts +13 -0
  161. package/dist/icons/engine/svg.js +29 -0
  162. package/dist/icons/engine/svg.js.map +1 -0
  163. package/dist/icons/engine/tessellate.cjs +2 -0
  164. package/dist/icons/engine/tessellate.cjs.map +1 -0
  165. package/dist/icons/engine/tessellate.d.cts +20 -0
  166. package/dist/icons/engine/tessellate.d.ts +20 -0
  167. package/dist/icons/engine/tessellate.js +73 -0
  168. package/dist/icons/engine/tessellate.js.map +1 -0
  169. package/dist/icons/engine/theme.cjs +2 -0
  170. package/dist/icons/engine/theme.cjs.map +1 -0
  171. package/dist/icons/engine/theme.d.cts +2 -0
  172. package/dist/icons/engine/theme.d.ts +2 -0
  173. package/dist/icons/engine/theme.js +22 -0
  174. package/dist/icons/engine/theme.js.map +1 -0
  175. package/dist/icons/engine/types.d.cts +120 -0
  176. package/dist/icons/engine/types.d.ts +120 -0
  177. package/dist/icons/index.cjs +1 -0
  178. package/dist/icons/index.d.cts +7 -0
  179. package/dist/icons/index.d.ts +7 -0
  180. package/dist/icons/index.js +27 -0
  181. package/dist/icons/react/DynamicIcon.cjs +2 -0
  182. package/dist/icons/react/DynamicIcon.cjs.map +1 -0
  183. package/dist/icons/react/DynamicIcon.d.cts +7 -0
  184. package/dist/icons/react/DynamicIcon.d.ts +7 -0
  185. package/dist/icons/react/DynamicIcon.js +16 -0
  186. package/dist/icons/react/DynamicIcon.js.map +1 -0
  187. package/dist/icons/react/Icon.cjs +2 -0
  188. package/dist/icons/react/Icon.cjs.map +1 -0
  189. package/dist/icons/react/Icon.d.cts +7 -0
  190. package/dist/icons/react/Icon.d.ts +7 -0
  191. package/dist/icons/react/Icon.js +101 -0
  192. package/dist/icons/react/Icon.js.map +1 -0
  193. package/dist/icons/react/IconCanvas.cjs +2 -0
  194. package/dist/icons/react/IconCanvas.cjs.map +1 -0
  195. package/dist/icons/react/IconCanvas.d.cts +9 -0
  196. package/dist/icons/react/IconCanvas.d.ts +9 -0
  197. package/dist/icons/react/IconCanvas.js +64 -0
  198. package/dist/icons/react/IconCanvas.js.map +1 -0
  199. package/dist/icons/react/createIcon.cjs +2 -0
  200. package/dist/icons/react/createIcon.cjs.map +1 -0
  201. package/dist/icons/react/createIcon.d.cts +10 -0
  202. package/dist/icons/react/createIcon.d.ts +10 -0
  203. package/dist/icons/react/createIcon.js +18 -0
  204. package/dist/icons/react/createIcon.js.map +1 -0
  205. package/dist/icons/react/icons.cjs +2 -0
  206. package/dist/icons/react/icons.cjs.map +1 -0
  207. package/dist/icons/react/icons.d.cts +808 -0
  208. package/dist/icons/react/icons.d.ts +808 -0
  209. package/dist/icons/react/icons.js +18 -0
  210. package/dist/icons/react/icons.js.map +1 -0
  211. package/dist/icons/react/types.d.cts +62 -0
  212. package/dist/icons/react/types.d.ts +62 -0
  213. package/package.json +28 -2
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # minerva-design
2
2
 
3
+ ## 1.9.0
4
+
5
+ ### Minor Changes
6
+
7
+ - b1e8e8f: New icon set: `minerva-design/icons` and `minerva-design/icons/core`. 202 original icons drawn for Minerva on a 24×24 grid (2px strokes, round caps and joins) in 10 categories. Each icon is a tree-shakeable constant (`searchIcon`) and a React component (`SearchIcon`). `Icon` renders inline SVG by default, server-rendered and colored by `currentColor`; with `renderer="auto" | "webgpu" | "webgl2" | "webgl" | "canvas2d"` it draws on a canvas through a backend shared by the page. `IconCanvas` draws thousands of icons in a few instanced GPU draws (4× MSAA, one blend per icon), falling back WebGPU -> WebGL2 -> WebGL -> Canvas2D like the charts. `createIcon`, `defineIcon` and `DynamicIcon` cover custom icons and icons chosen by name. The framework-free core adds `toSvg`, `toSvgDataUri`, `drawIcon`, `createIconCanvas`, `createIconSurface`, `setDefaultIconRenderer` and the geometry helpers (`parseIconPath`, `flattenIconPath`, `tessellateIcon`).
8
+
3
9
  ## 1.8.0
4
10
 
5
11
  ### Minor Changes
package/README.md CHANGED
@@ -300,6 +300,8 @@ helpers are published as `minerva-design/styling-hooks`.
300
300
  | `minerva-design/monaco` | `MonacoCodeEditor` (optional peers `@monaco-editor/react` and `monaco-editor`) |
301
301
  | `minerva-design/charts` | GPU charts (WebGPU → WebGL2 → WebGL → Canvas2D): 2D, statistics, hierarchies and flows, relationship graphs (networks, DAGs, trees, chords), trading with 21 indicators, order books and 3D (`"use client"`) |
302
302
  | `minerva-design/charts/core` | The framework-free chart engines: `createChart`, `createShapeChart`, `createTradingChart`, `createDepthChart` / `createOrderBook` / `createOrderBookHeatmap` / `createTimeAndSales`, `createChart3D`, `createGraphChart`, plus `setDefaultChartRenderer` and `formatCompact` (server-safe import, no dependencies) |
303
+ | `minerva-design/icons` | 202 original icons: one component per icon (`SearchIcon`…), `Icon` (inline SVG, or a canvas with `renderer`), `IconCanvas` (thousands of icons in a few GPU draws), `createIcon`, `DynamicIcon` (`"use client"`) |
304
+ | `minerva-design/icons/core` | The framework-free icon set: icon data (`searchIcon`…), `toSvg`, `drawIcon`, `createIconCanvas`, `defineIcon`, `setDefaultIconRenderer` (server-safe import, no dependencies) |
303
305
  | `minerva-design/web-components` | Registers every custom element; exports the element classes, their types and the authoring utilities (ESM) |
304
306
  | `minerva-design/web-components/<name>` | Registers one element (and its parts / dependencies), e.g. `/button`, `/select`, `/modal`, `/config` |
305
307
  | `minerva-design/web-components/code-editor` | Optional: `<minerva-code-editor>` (Monaco), needs the optional peer `monaco-editor`; not in the all-in-one / CDN |
@@ -0,0 +1 @@
1
+ var e=Object.defineProperty,t=(t,n)=>{let r={};for(var i in t)e(r,i,{get:t[i],enumerable:!0});return n||e(r,Symbol.toStringTag,{value:`Module`}),r};exports.__exportAll=t;
@@ -0,0 +1,11 @@
1
+ //#region \0rolldown/runtime.js
2
+ var e = Object.defineProperty, t = (t, n) => {
3
+ let r = {};
4
+ for (var i in t) e(r, i, {
5
+ get: t[i],
6
+ enumerable: !0
7
+ });
8
+ return n || e(r, Symbol.toStringTag, { value: "Module" }), r;
9
+ };
10
+ //#endregion
11
+ export { t as __exportAll };
@@ -0,0 +1 @@
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./engine/defaults.cjs"),t=require("./engine/path.cjs"),n=require("./engine/svg.cjs"),r=require("./engine/canvas2d.cjs"),i=require("./engine/tessellate.cjs"),a=require("./engine/renderers/detect.cjs"),o=require("./engine/icon-canvas.cjs"),s=require("./engine/icons/actions.cjs"),c=require("./engine/icons/arrows.cjs"),l=require("./engine/icons/communication.cjs"),u=require("./engine/icons/data.cjs"),d=require("./engine/icons/devices.cjs"),f=require("./engine/icons/files.cjs"),p=require("./engine/icons/finance.cjs"),m=require("./engine/icons/interface.cjs"),h=require("./engine/icons/media.cjs"),g=require("./engine/icons/status.cjs"),_=require("./engine/registry.cjs"),v=require("./engine/define.cjs"),y=require("./engine/surface.cjs");exports.ICON_RENDERER_ORDER=a.ICON_RENDERER_ORDER,exports.ICON_RENDERER_PREFERENCES=e.ICON_RENDERER_PREFERENCES,exports.activityIcon=u.activityIcon,exports.alertCircleIcon=m.alertCircleIcon,exports.alertTriangleIcon=m.alertTriangleIcon,exports.archiveIcon=m.archiveIcon,exports.areaChartIcon=u.areaChartIcon,exports.arrowDownIcon=c.arrowDownIcon,exports.arrowDownLeftIcon=c.arrowDownLeftIcon,exports.arrowDownRightIcon=c.arrowDownRightIcon,exports.arrowLeftIcon=c.arrowLeftIcon,exports.arrowRightIcon=c.arrowRightIcon,exports.arrowUpIcon=c.arrowUpIcon,exports.arrowUpLeftIcon=c.arrowUpLeftIcon,exports.arrowUpRightIcon=c.arrowUpRightIcon,exports.atSignIcon=l.atSignIcon,exports.awardIcon=g.awardIcon,exports.banknoteIcon=p.banknoteIcon,exports.barChartIcon=u.barChartIcon,exports.batteryChargingIcon=g.batteryChargingIcon,exports.batteryIcon=g.batteryIcon,exports.bellIcon=m.bellIcon,exports.bellOffIcon=m.bellOffIcon,exports.bookIcon=f.bookIcon,exports.bookOpenIcon=f.bookOpenIcon,exports.bookmarkIcon=m.bookmarkIcon,exports.briefcaseIcon=p.briefcaseIcon,exports.bugIcon=g.bugIcon,exports.calculatorIcon=p.calculatorIcon,exports.calendarIcon=m.calendarIcon,exports.cameraIcon=h.cameraIcon,exports.candlestickIcon=u.candlestickIcon,exports.checkCircleIcon=m.checkCircleIcon,exports.checkIcon=s.checkIcon,exports.checkSquareIcon=g.checkSquareIcon,exports.chevronDownIcon=c.chevronDownIcon,exports.chevronLeftIcon=c.chevronLeftIcon,exports.chevronRightIcon=c.chevronRightIcon,exports.chevronUpDownIcon=c.chevronUpDownIcon,exports.chevronUpIcon=c.chevronUpIcon,exports.chevronsDownIcon=c.chevronsDownIcon,exports.chevronsLeftIcon=c.chevronsLeftIcon,exports.chevronsRightIcon=c.chevronsRightIcon,exports.chevronsUpIcon=c.chevronsUpIcon,exports.circleIcon=g.circleIcon,exports.clipboardIcon=s.clipboardIcon,exports.clockIcon=m.clockIcon,exports.closeIcon=s.closeIcon,exports.cloudDownloadIcon=f.cloudDownloadIcon,exports.cloudIcon=f.cloudIcon,exports.cloudUploadIcon=f.cloudUploadIcon,exports.codeIcon=f.codeIcon,exports.coinsIcon=p.coinsIcon,exports.columnsIcon=m.columnsIcon,exports.compassIcon=m.compassIcon,exports.copyIcon=s.copyIcon,exports.cornerDownRightIcon=c.cornerDownRightIcon,exports.cornerUpLeftIcon=c.cornerUpLeftIcon,exports.cpuIcon=d.cpuIcon,exports.createIconCanvas=o.createIconCanvas,exports.createIconSurface=y.createIconSurface,exports.creditCardIcon=p.creditCardIcon,exports.cropIcon=s.cropIcon,exports.databaseIcon=f.databaseIcon,exports.defineIcon=v.defineIcon,exports.dollarIcon=p.dollarIcon,exports.donutChartIcon=u.donutChartIcon,exports.downloadIcon=s.downloadIcon,exports.drawIcon=r.drawIcon,exports.editIcon=s.editIcon,exports.euroIcon=p.euroIcon,exports.externalLinkIcon=c.externalLinkIcon,exports.eyeIcon=s.eyeIcon,exports.eyeOffIcon=s.eyeOffIcon,exports.fastForwardIcon=h.fastForwardIcon,exports.fileIcon=f.fileIcon,exports.filePlusIcon=f.filePlusIcon,exports.fileTextIcon=f.fileTextIcon,exports.filmIcon=h.filmIcon,exports.filterIcon=s.filterIcon,exports.flagIcon=m.flagIcon,exports.flameIcon=g.flameIcon,exports.flattenIconPath=t.flattenIconPath,exports.folderIcon=f.folderIcon,exports.folderOpenIcon=f.folderOpenIcon,exports.folderPlusIcon=f.folderPlusIcon,exports.gamepadIcon=d.gamepadIcon,exports.gaugeIcon=u.gaugeIcon,exports.getDefaultIconRenderer=e.getDefaultIconRenderer,exports.getIcon=_.getIcon,exports.giftIcon=p.giftIcon,exports.gitBranchIcon=f.gitBranchIcon,exports.globeIcon=m.globeIcon,exports.gripVerticalIcon=c.gripVerticalIcon,exports.hardDriveIcon=d.hardDriveIcon,exports.hashIcon=l.hashIcon,exports.headphonesIcon=h.headphonesIcon,exports.heartIcon=m.heartIcon,exports.helpCircleIcon=m.helpCircleIcon,exports.homeIcon=c.homeIcon,exports.iconCategories=_.iconCategories,exports.iconPathData=n.iconPathData,exports.iconRendererCandidates=a.iconRendererCandidates,exports.icons=_.icons,exports.imageIcon=h.imageIcon,exports.inboxIcon=m.inboxIcon,exports.infoIcon=m.infoIcon,exports.keyIcon=s.keyIcon,exports.keyboardIcon=d.keyboardIcon,exports.landmarkIcon=p.landmarkIcon,exports.laptopIcon=d.laptopIcon,exports.layersIcon=m.layersIcon,exports.layoutGridIcon=m.layoutGridIcon,exports.lineChartIcon=u.lineChartIcon,exports.linkIcon=s.linkIcon,exports.listIcon=m.listIcon,exports.loaderIcon=m.loaderIcon,exports.lockIcon=s.lockIcon,exports.logInIcon=c.logInIcon,exports.logOutIcon=c.logOutIcon,exports.mailIcon=l.mailIcon,exports.mapPinIcon=m.mapPinIcon,exports.maximizeIcon=c.maximizeIcon,exports.megaphoneIcon=l.megaphoneIcon,exports.menuIcon=c.menuIcon,exports.messageCircleIcon=l.messageCircleIcon,exports.messageSquareIcon=l.messageSquareIcon,exports.micIcon=h.micIcon,exports.micOffIcon=h.micOffIcon,exports.minimizeIcon=c.minimizeIcon,exports.minusCircleIcon=s.minusCircleIcon,exports.minusIcon=s.minusIcon,exports.monitorIcon=d.monitorIcon,exports.moonIcon=m.moonIcon,exports.moreHorizontalIcon=c.moreHorizontalIcon,exports.moreVerticalIcon=c.moreVerticalIcon,exports.mouseIcon=d.mouseIcon,exports.moveIcon=c.moveIcon,exports.musicIcon=h.musicIcon,exports.packageIcon=m.packageIcon,exports.paperclipIcon=f.paperclipIcon,exports.parseIconPath=t.parseIconPath,exports.pauseIcon=h.pauseIcon,exports.percentIcon=u.percentIcon,exports.phoneIcon=l.phoneIcon,exports.pieChartIcon=u.pieChartIcon,exports.pinIcon=s.pinIcon,exports.playIcon=h.playIcon,exports.plusCircleIcon=s.plusCircleIcon,exports.plusIcon=s.plusIcon,exports.powerIcon=g.powerIcon,exports.printIcon=s.printIcon,exports.receiptIcon=p.receiptIcon,exports.redoIcon=c.redoIcon,exports.refreshIcon=c.refreshIcon,exports.repeatIcon=h.repeatIcon,exports.rewindIcon=h.rewindIcon,exports.rotateCcwIcon=c.rotateCcwIcon,exports.rssIcon=l.rssIcon,exports.saveIcon=s.saveIcon,exports.scatterChartIcon=u.scatterChartIcon,exports.scissorsIcon=s.scissorsIcon,exports.searchIcon=s.searchIcon,exports.searchIcons=_.searchIcons,exports.sendIcon=s.sendIcon,exports.serverIcon=d.serverIcon,exports.setDefaultIconRenderer=e.setDefaultIconRenderer,exports.settingsIcon=s.settingsIcon,exports.shareIcon=s.shareIcon,exports.shareNetworkIcon=l.shareNetworkIcon,exports.shieldCheckIcon=g.shieldCheckIcon,exports.shieldIcon=g.shieldIcon,exports.shoppingBagIcon=p.shoppingBagIcon,exports.shoppingCartIcon=p.shoppingCartIcon,exports.shuffleIcon=h.shuffleIcon,exports.sidebarIcon=m.sidebarIcon,exports.sigmaIcon=u.sigmaIcon,exports.signalIcon=g.signalIcon,exports.skipBackIcon=h.skipBackIcon,exports.skipForwardIcon=h.skipForwardIcon,exports.slidersIcon=s.slidersIcon,exports.smartphoneIcon=d.smartphoneIcon,exports.smileIcon=m.smileIcon,exports.sortAscendingIcon=s.sortAscendingIcon,exports.sortDescendingIcon=s.sortDescendingIcon,exports.squareIcon=g.squareIcon,exports.starIcon=m.starIcon,exports.stopIcon=h.stopIcon,exports.subscribeDefaultIconRenderer=e.subscribeDefaultIconRenderer,exports.sunIcon=m.sunIcon,exports.tableIcon=u.tableIcon,exports.tabletIcon=d.tabletIcon,exports.tagIcon=m.tagIcon,exports.terminalIcon=f.terminalIcon,exports.tessellateIcon=i.tessellateIcon,exports.thumbsUpIcon=m.thumbsUpIcon,exports.toSvg=n.toSvg,exports.toSvgDataUri=n.toSvgDataUri,exports.toggleLeftIcon=g.toggleLeftIcon,exports.toggleRightIcon=g.toggleRightIcon,exports.trashIcon=s.trashIcon,exports.trendingDownIcon=u.trendingDownIcon,exports.trendingUpIcon=u.trendingUpIcon,exports.trophyIcon=p.trophyIcon,exports.tvIcon=d.tvIcon,exports.undoIcon=c.undoIcon,exports.unlockIcon=s.unlockIcon,exports.uploadIcon=s.uploadIcon,exports.userIcon=m.userIcon,exports.userPlusIcon=m.userPlusIcon,exports.usersIcon=m.usersIcon,exports.videoIcon=h.videoIcon,exports.volume1Icon=h.volume1Icon,exports.volumeIcon=h.volumeIcon,exports.volumeOffIcon=h.volumeOffIcon,exports.walletIcon=p.walletIcon,exports.watchIcon=d.watchIcon,exports.wifiIcon=l.wifiIcon,exports.xCircleIcon=m.xCircleIcon,exports.zapIcon=g.zapIcon,exports.zoomInIcon=s.zoomInIcon,exports.zoomOutIcon=s.zoomOutIcon;
@@ -0,0 +1,12 @@
1
+ export * from './engine/icons/index.cjs';
2
+ export { getIcon, iconCategories, icons, searchIcons } from './engine/registry.cjs';
3
+ export { defineIcon } from './engine/define.cjs';
4
+ export { iconPathData, toSvg, toSvgDataUri } from './engine/svg.cjs';
5
+ export { drawIcon, type IconDrawingContext } from './engine/canvas2d.cjs';
6
+ export { flattenIconPath, parseIconPath, type IconPathCommand, type IconPolyline, } from './engine/path.cjs';
7
+ export { tessellateIcon, type IconMeshOptions } from './engine/tessellate.cjs';
8
+ export { createIconCanvas } from './engine/icon-canvas.cjs';
9
+ export { createIconSurface } from './engine/surface.cjs';
10
+ export { ICON_RENDERER_PREFERENCES, getDefaultIconRenderer, setDefaultIconRenderer, subscribeDefaultIconRenderer, } from './engine/defaults.cjs';
11
+ export { ICON_RENDERER_ORDER, iconRendererCandidates, } from './engine/renderers/detect.cjs';
12
+ export type { DrawIconOptions, IconCanvasController, IconCanvasItem, IconCanvasOptions, IconCategory, IconDefinition, IconRendererKind, IconRendererPreference, IconStyle, IconSurface, IconSurfaceOptions, IconSvgOptions, } from './engine/types.cjs';
@@ -0,0 +1,12 @@
1
+ export * from './engine/icons/index.js';
2
+ export { getIcon, iconCategories, icons, searchIcons } from './engine/registry.js';
3
+ export { defineIcon } from './engine/define.js';
4
+ export { iconPathData, toSvg, toSvgDataUri } from './engine/svg.js';
5
+ export { drawIcon, type IconDrawingContext } from './engine/canvas2d.js';
6
+ export { flattenIconPath, parseIconPath, type IconPathCommand, type IconPolyline, } from './engine/path.js';
7
+ export { tessellateIcon, type IconMeshOptions } from './engine/tessellate.js';
8
+ export { createIconCanvas } from './engine/icon-canvas.js';
9
+ export { createIconSurface } from './engine/surface.js';
10
+ export { ICON_RENDERER_PREFERENCES, getDefaultIconRenderer, setDefaultIconRenderer, subscribeDefaultIconRenderer, } from './engine/defaults.js';
11
+ export { ICON_RENDERER_ORDER, iconRendererCandidates, } from './engine/renderers/detect.js';
12
+ export type { DrawIconOptions, IconCanvasController, IconCanvasItem, IconCanvasOptions, IconCategory, IconDefinition, IconRendererKind, IconRendererPreference, IconStyle, IconSurface, IconSurfaceOptions, IconSvgOptions, } from './engine/types.js';
@@ -0,0 +1,21 @@
1
+ import { ICON_RENDERER_PREFERENCES as e, getDefaultIconRenderer as t, setDefaultIconRenderer as n, subscribeDefaultIconRenderer as r } from "./engine/defaults.js";
2
+ import { flattenIconPath as i, parseIconPath as a } from "./engine/path.js";
3
+ import { iconPathData as o, toSvg as s, toSvgDataUri as c } from "./engine/svg.js";
4
+ import { drawIcon as l } from "./engine/canvas2d.js";
5
+ import { tessellateIcon as u } from "./engine/tessellate.js";
6
+ import { ICON_RENDERER_ORDER as d, iconRendererCandidates as f } from "./engine/renderers/detect.js";
7
+ import { createIconCanvas as p } from "./engine/icon-canvas.js";
8
+ import { checkIcon as m, clipboardIcon as h, closeIcon as g, copyIcon as _, cropIcon as v, downloadIcon as y, editIcon as b, eyeIcon as x, eyeOffIcon as S, filterIcon as C, keyIcon as w, linkIcon as T, lockIcon as E, minusCircleIcon as D, minusIcon as O, pinIcon as k, plusCircleIcon as A, plusIcon as j, printIcon as M, saveIcon as N, scissorsIcon as P, searchIcon as F, sendIcon as I, settingsIcon as L, shareIcon as R, slidersIcon as z, sortAscendingIcon as B, sortDescendingIcon as V, trashIcon as H, unlockIcon as U, uploadIcon as W, zoomInIcon as G, zoomOutIcon as K } from "./engine/icons/actions.js";
9
+ import { arrowDownIcon as q, arrowDownLeftIcon as J, arrowDownRightIcon as Y, arrowLeftIcon as X, arrowRightIcon as Z, arrowUpIcon as Q, arrowUpLeftIcon as $, arrowUpRightIcon as ee, chevronDownIcon as te, chevronLeftIcon as ne, chevronRightIcon as re, chevronUpDownIcon as ie, chevronUpIcon as ae, chevronsDownIcon as oe, chevronsLeftIcon as se, chevronsRightIcon as ce, chevronsUpIcon as le, cornerDownRightIcon as ue, cornerUpLeftIcon as de, externalLinkIcon as fe, gripVerticalIcon as pe, homeIcon as me, logInIcon as he, logOutIcon as ge, maximizeIcon as _e, menuIcon as ve, minimizeIcon as ye, moreHorizontalIcon as be, moreVerticalIcon as xe, moveIcon as Se, redoIcon as Ce, refreshIcon as we, rotateCcwIcon as Te, undoIcon as Ee } from "./engine/icons/arrows.js";
10
+ import { atSignIcon as De, hashIcon as Oe, mailIcon as ke, megaphoneIcon as Ae, messageCircleIcon as je, messageSquareIcon as Me, phoneIcon as Ne, rssIcon as Pe, shareNetworkIcon as Fe, wifiIcon as Ie } from "./engine/icons/communication.js";
11
+ import { activityIcon as Le, areaChartIcon as Re, barChartIcon as ze, candlestickIcon as Be, donutChartIcon as Ve, gaugeIcon as He, lineChartIcon as Ue, percentIcon as We, pieChartIcon as Ge, scatterChartIcon as Ke, sigmaIcon as qe, tableIcon as Je, trendingDownIcon as Ye, trendingUpIcon as Xe } from "./engine/icons/data.js";
12
+ import { cpuIcon as Ze, gamepadIcon as Qe, hardDriveIcon as $e, keyboardIcon as et, laptopIcon as tt, monitorIcon as nt, mouseIcon as rt, serverIcon as it, smartphoneIcon as at, tabletIcon as ot, tvIcon as st, watchIcon as ct } from "./engine/icons/devices.js";
13
+ import { bookIcon as lt, bookOpenIcon as ut, cloudDownloadIcon as dt, cloudIcon as ft, cloudUploadIcon as pt, codeIcon as mt, databaseIcon as ht, fileIcon as gt, filePlusIcon as _t, fileTextIcon as vt, folderIcon as yt, folderOpenIcon as bt, folderPlusIcon as xt, gitBranchIcon as St, paperclipIcon as Ct, terminalIcon as wt } from "./engine/icons/files.js";
14
+ import { banknoteIcon as Tt, briefcaseIcon as Et, calculatorIcon as Dt, coinsIcon as Ot, creditCardIcon as kt, dollarIcon as At, euroIcon as jt, giftIcon as Mt, landmarkIcon as Nt, receiptIcon as Pt, shoppingBagIcon as Ft, shoppingCartIcon as It, trophyIcon as Lt, walletIcon as Rt } from "./engine/icons/finance.js";
15
+ import { alertCircleIcon as zt, alertTriangleIcon as Bt, archiveIcon as Vt, bellIcon as Ht, bellOffIcon as Ut, bookmarkIcon as Wt, calendarIcon as Gt, checkCircleIcon as Kt, clockIcon as qt, columnsIcon as Jt, compassIcon as Yt, flagIcon as Xt, globeIcon as Zt, heartIcon as Qt, helpCircleIcon as $t, inboxIcon as en, infoIcon as tn, layersIcon as nn, layoutGridIcon as rn, listIcon as an, loaderIcon as on, mapPinIcon as sn, moonIcon as cn, packageIcon as ln, sidebarIcon as un, smileIcon as dn, starIcon as fn, sunIcon as pn, tagIcon as mn, thumbsUpIcon as hn, userIcon as gn, userPlusIcon as _n, usersIcon as vn, xCircleIcon as yn } from "./engine/icons/interface.js";
16
+ import { cameraIcon as bn, fastForwardIcon as xn, filmIcon as Sn, headphonesIcon as Cn, imageIcon as wn, micIcon as Tn, micOffIcon as En, musicIcon as Dn, pauseIcon as On, playIcon as kn, repeatIcon as An, rewindIcon as jn, shuffleIcon as Mn, skipBackIcon as Nn, skipForwardIcon as Pn, stopIcon as Fn, videoIcon as In, volume1Icon as Ln, volumeIcon as Rn, volumeOffIcon as zn } from "./engine/icons/media.js";
17
+ import { awardIcon as Bn, batteryChargingIcon as Vn, batteryIcon as Hn, bugIcon as Un, checkSquareIcon as Wn, circleIcon as Gn, flameIcon as Kn, powerIcon as qn, shieldCheckIcon as Jn, shieldIcon as Yn, signalIcon as Xn, squareIcon as Zn, toggleLeftIcon as Qn, toggleRightIcon as $n, zapIcon as er } from "./engine/icons/status.js";
18
+ import { getIcon as tr, iconCategories as nr, icons as rr, searchIcons as ir } from "./engine/registry.js";
19
+ import { defineIcon as ar } from "./engine/define.js";
20
+ import { createIconSurface as or } from "./engine/surface.js";
21
+ export { d as ICON_RENDERER_ORDER, e as ICON_RENDERER_PREFERENCES, Le as activityIcon, zt as alertCircleIcon, Bt as alertTriangleIcon, Vt as archiveIcon, Re as areaChartIcon, q as arrowDownIcon, J as arrowDownLeftIcon, Y as arrowDownRightIcon, X as arrowLeftIcon, Z as arrowRightIcon, Q as arrowUpIcon, $ as arrowUpLeftIcon, ee as arrowUpRightIcon, De as atSignIcon, Bn as awardIcon, Tt as banknoteIcon, ze as barChartIcon, Vn as batteryChargingIcon, Hn as batteryIcon, Ht as bellIcon, Ut as bellOffIcon, lt as bookIcon, ut as bookOpenIcon, Wt as bookmarkIcon, Et as briefcaseIcon, Un as bugIcon, Dt as calculatorIcon, Gt as calendarIcon, bn as cameraIcon, Be as candlestickIcon, Kt as checkCircleIcon, m as checkIcon, Wn as checkSquareIcon, te as chevronDownIcon, ne as chevronLeftIcon, re as chevronRightIcon, ie as chevronUpDownIcon, ae as chevronUpIcon, oe as chevronsDownIcon, se as chevronsLeftIcon, ce as chevronsRightIcon, le as chevronsUpIcon, Gn as circleIcon, h as clipboardIcon, qt as clockIcon, g as closeIcon, dt as cloudDownloadIcon, ft as cloudIcon, pt as cloudUploadIcon, mt as codeIcon, Ot as coinsIcon, Jt as columnsIcon, Yt as compassIcon, _ as copyIcon, ue as cornerDownRightIcon, de as cornerUpLeftIcon, Ze as cpuIcon, p as createIconCanvas, or as createIconSurface, kt as creditCardIcon, v as cropIcon, ht as databaseIcon, ar as defineIcon, At as dollarIcon, Ve as donutChartIcon, y as downloadIcon, l as drawIcon, b as editIcon, jt as euroIcon, fe as externalLinkIcon, x as eyeIcon, S as eyeOffIcon, xn as fastForwardIcon, gt as fileIcon, _t as filePlusIcon, vt as fileTextIcon, Sn as filmIcon, C as filterIcon, Xt as flagIcon, Kn as flameIcon, i as flattenIconPath, yt as folderIcon, bt as folderOpenIcon, xt as folderPlusIcon, Qe as gamepadIcon, He as gaugeIcon, t as getDefaultIconRenderer, tr as getIcon, Mt as giftIcon, St as gitBranchIcon, Zt as globeIcon, pe as gripVerticalIcon, $e as hardDriveIcon, Oe as hashIcon, Cn as headphonesIcon, Qt as heartIcon, $t as helpCircleIcon, me as homeIcon, nr as iconCategories, o as iconPathData, f as iconRendererCandidates, rr as icons, wn as imageIcon, en as inboxIcon, tn as infoIcon, w as keyIcon, et as keyboardIcon, Nt as landmarkIcon, tt as laptopIcon, nn as layersIcon, rn as layoutGridIcon, Ue as lineChartIcon, T as linkIcon, an as listIcon, on as loaderIcon, E as lockIcon, he as logInIcon, ge as logOutIcon, ke as mailIcon, sn as mapPinIcon, _e as maximizeIcon, Ae as megaphoneIcon, ve as menuIcon, je as messageCircleIcon, Me as messageSquareIcon, Tn as micIcon, En as micOffIcon, ye as minimizeIcon, D as minusCircleIcon, O as minusIcon, nt as monitorIcon, cn as moonIcon, be as moreHorizontalIcon, xe as moreVerticalIcon, rt as mouseIcon, Se as moveIcon, Dn as musicIcon, ln as packageIcon, Ct as paperclipIcon, a as parseIconPath, On as pauseIcon, We as percentIcon, Ne as phoneIcon, Ge as pieChartIcon, k as pinIcon, kn as playIcon, A as plusCircleIcon, j as plusIcon, qn as powerIcon, M as printIcon, Pt as receiptIcon, Ce as redoIcon, we as refreshIcon, An as repeatIcon, jn as rewindIcon, Te as rotateCcwIcon, Pe as rssIcon, N as saveIcon, Ke as scatterChartIcon, P as scissorsIcon, F as searchIcon, ir as searchIcons, I as sendIcon, it as serverIcon, n as setDefaultIconRenderer, L as settingsIcon, R as shareIcon, Fe as shareNetworkIcon, Jn as shieldCheckIcon, Yn as shieldIcon, Ft as shoppingBagIcon, It as shoppingCartIcon, Mn as shuffleIcon, un as sidebarIcon, qe as sigmaIcon, Xn as signalIcon, Nn as skipBackIcon, Pn as skipForwardIcon, z as slidersIcon, at as smartphoneIcon, dn as smileIcon, B as sortAscendingIcon, V as sortDescendingIcon, Zn as squareIcon, fn as starIcon, Fn as stopIcon, r as subscribeDefaultIconRenderer, pn as sunIcon, Je as tableIcon, ot as tabletIcon, mn as tagIcon, wt as terminalIcon, u as tessellateIcon, hn as thumbsUpIcon, s as toSvg, c as toSvgDataUri, Qn as toggleLeftIcon, $n as toggleRightIcon, H as trashIcon, Ye as trendingDownIcon, Xe as trendingUpIcon, Lt as trophyIcon, st as tvIcon, Ee as undoIcon, U as unlockIcon, W as uploadIcon, gn as userIcon, _n as userPlusIcon, vn as usersIcon, In as videoIcon, Ln as volume1Icon, Rn as volumeIcon, zn as volumeOffIcon, Rt as walletIcon, ct as watchIcon, Ie as wifiIcon, yn as xCircleIcon, er as zapIcon, G as zoomInIcon, K as zoomOutIcon };
@@ -0,0 +1,2 @@
1
+ const e=require("./path.cjs"),t=require("./svg.cjs");var n=new WeakMap,r=()=>typeof Path2D==`function`&&(()=>{try{return new Path2D(`M0 0L1 1`),!0}catch{return!1}})(),i,a=e=>{if(i??(i=r()),!i)return null;let a=n.get(e);if(a===void 0){try{a=new Path2D(t.iconPathData(e))}catch{a=null}n.set(e,a)}return a};function o(t,n,r={}){let{x:i=0,y:o=0,size:s=24,color:c,strokeWidth:l=2,rotation:u=0,opacity:d=1}=r;if(s<=0||l<=0||d<=0)return;t.save(),t.translate(i+s/2,o+s/2),u&&t.rotate(u*Math.PI/180);let f=s/24;t.scale(f,f),t.translate(-12,-12),t.globalAlpha*=Math.min(1,d),t.strokeStyle=!c||c.toLowerCase()===`currentcolor`?`#000`:c,t.lineWidth=l,t.lineCap=`round`,t.lineJoin=`round`;let p=a(n);if(p)t.stroke(p);else{let r=Math.min(.1,.2/Math.max(f,.01));t.beginPath();for(let i of n.paths)for(let n of e.flattenIconPath(i,r)){let e=n.points;t.moveTo(e[0],e[1]);for(let n=2;n<e.length;n+=2)t.lineTo(e[n],e[n+1]);n.closed&&t.closePath()}t.stroke()}t.restore()}exports.drawIcon=o;
2
+ //# sourceMappingURL=canvas2d.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canvas2d.cjs","names":["iconPathData","flattenIconPath","require_path","require_svg","paths","hasPath2D","path2dSupport","path2d","path","icon","drawIcon","options","size","strokeWidth","opacity","ctx","x","y","rotation","scale","color","tolerance","d","line","p","i"],"sources":["../../../../icons/src/engine/canvas2d.ts"],"sourcesContent":["// Canvas2D drawing of a single icon: native strokes, same result as the SVG.\n\nimport { flattenIconPath } from \"./path\";\nimport { iconPathData } from \"./svg\";\nimport type { DrawIconOptions, IconDefinition } from \"./types\";\n\nconst paths = new WeakMap<IconDefinition, Path2D | null>();\n\nconst hasPath2D = () =>\n typeof Path2D === \"function\" &&\n (() => {\n try {\n // some environments (old WebViews, mini-programs) lack the SVG constructor\n new Path2D(\"M0 0L1 1\");\n return true;\n } catch {\n return false;\n }\n })();\n\nlet path2dSupport: boolean | undefined;\n\nconst path2d = (icon: IconDefinition): Path2D | null => {\n path2dSupport ??= hasPath2D();\n if (!path2dSupport) return null;\n let path = paths.get(icon);\n if (path === undefined) {\n try {\n path = new Path2D(iconPathData(icon));\n } catch {\n path = null;\n }\n paths.set(icon, path);\n }\n return path;\n};\n\n/** Minimal 2D context drawIcon needs (DOM, OffscreenCanvas, mini-program canvases) */\nexport type IconDrawingContext = Pick<\n CanvasRenderingContext2D,\n | \"save\"\n | \"restore\"\n | \"translate\"\n | \"rotate\"\n | \"scale\"\n | \"beginPath\"\n | \"moveTo\"\n | \"lineTo\"\n | \"closePath\"\n | \"stroke\"\n | \"strokeStyle\"\n | \"lineWidth\"\n | \"lineCap\"\n | \"lineJoin\"\n | \"globalAlpha\"\n>;\n\n/**\n * Draws an icon on a 2D context, `size` units wide from (`x`, `y`), in the\n * context's current transform. One stroke for the whole icon, so translucent\n * colors don't darken where parts overlap. `currentColor` is not known to a\n * canvas: pass a color (black by default).\n */\nexport function drawIcon(\n ctx: IconDrawingContext,\n icon: IconDefinition,\n options: DrawIconOptions = {},\n): void {\n const {\n x = 0,\n y = 0,\n size = 24,\n color,\n strokeWidth = 2,\n rotation = 0,\n opacity = 1,\n } = options;\n if (size <= 0 || strokeWidth <= 0 || opacity <= 0) return;\n ctx.save();\n ctx.translate(x + size / 2, y + size / 2);\n if (rotation) ctx.rotate((rotation * Math.PI) / 180);\n const scale = size / 24;\n ctx.scale(scale, scale);\n ctx.translate(-12, -12);\n ctx.globalAlpha *= Math.min(1, opacity);\n ctx.strokeStyle =\n !color || color.toLowerCase() === \"currentcolor\" ? \"#000\" : color;\n ctx.lineWidth = strokeWidth;\n ctx.lineCap = \"round\";\n ctx.lineJoin = \"round\";\n const path = path2d(icon);\n if (path) {\n (ctx as CanvasRenderingContext2D).stroke(path);\n } else {\n // flattened finely enough for the drawn size\n const tolerance = Math.min(0.1, 0.2 / Math.max(scale, 0.01));\n ctx.beginPath();\n for (const d of icon.paths) {\n for (const line of flattenIconPath(d, tolerance)) {\n const p = line.points;\n ctx.moveTo(p[0]!, p[1]!);\n for (let i = 2; i < p.length; i += 2) ctx.lineTo(p[i]!, p[i + 1]!);\n if (line.closed) ctx.closePath();\n }\n }\n ctx.stroke();\n }\n ctx.restore();\n}\n"],"mappings":"qDAMA,IAAMI,EAAQ,IAAI,QAEZC,MACJ,OAAO,QAAW,iBACX,CACL,GAAI,CAGF,OADA,IAAI,OAAO,UAAU,EACd,EACT,MAAQ,CACN,MAAO,EACT,CACF,EAAA,CAAG,EAEDC,EAEEC,EAAU,GAAwC,CAEtD,GADAD,IAAA,EAAkBD,EAAU,GACxB,CAACC,EAAe,OAAO,KAC3B,IAAIE,EAAOJ,EAAM,IAAIK,CAAI,EACzB,GAAID,IAAS,IAAA,GAAW,CACtB,GAAI,CACF,EAAO,IAAI,OAAOR,EAAAA,aAAaS,CAAI,CAAC,CACtC,MAAQ,CACN,EAAO,IACT,CACAL,EAAM,IAAIK,EAAMD,CAAI,CACtB,CACA,OAAOA,CACT,EA4BA,SAAgBE,EACd,EACA,EACA,EAA2B,CAAC,EACtB,CACN,GAAM,CACJ,IAAI,EACJ,IAAI,EACJ,OAAO,GACP,QACA,cAAc,EACd,WAAW,EACX,UAAU,GACRC,EACJ,GAAIC,GAAQ,GAAKC,GAAe,GAAKC,GAAW,EAAG,OACnDC,EAAI,KAAK,EACTA,EAAI,UAAUC,EAAIJ,EAAO,EAAGK,EAAIL,EAAO,CAAC,EACpCM,GAAUH,EAAI,OAAQG,EAAW,KAAK,GAAM,GAAG,EACnD,IAAMC,EAAQP,EAAO,GACrBG,EAAI,MAAMI,EAAOA,CAAK,EACtBJ,EAAI,UAAU,IAAK,GAAG,EACtB,EAAI,aAAe,KAAK,IAAI,EAAGD,CAAO,EACtC,EAAI,YACF,CAACM,GAASA,EAAM,YAAY,IAAM,eAAiB,OAASA,EAC9D,EAAI,UAAYP,EAChB,EAAI,QAAU,QACd,EAAI,SAAW,QACf,IAAML,EAAOD,EAAOE,CAAI,EACxB,GAAID,EACFO,EAAkC,OAAOP,CAAI,MACxC,CAEL,IAAMa,EAAY,KAAK,IAAI,GAAK,GAAM,KAAK,IAAIF,EAAO,GAAI,CAAC,EAC3DJ,EAAI,UAAU,EACd,IAAK,IAAMO,KAAKb,EAAK,MACnB,IAAK,IAAMc,KAAQtB,EAAAA,gBAAgBqB,EAAGD,CAAS,EAAG,CAChD,IAAMG,EAAID,EAAK,OACfR,EAAI,OAAOS,EAAE,GAAKA,EAAE,EAAG,EACvB,IAAK,IAAIC,EAAI,EAAGA,EAAID,EAAE,OAAQ,GAAK,EAAGT,EAAI,OAAOS,EAAEC,GAAKD,EAAEC,EAAI,EAAG,EAC7DF,EAAK,QAAQR,EAAI,UAAU,CACjC,CAEFA,EAAI,OAAO,CACb,CACAA,EAAI,QAAQ,CACd"}
@@ -0,0 +1,10 @@
1
+ import { DrawIconOptions, IconDefinition } from './types.cjs';
2
+ /** Minimal 2D context drawIcon needs (DOM, OffscreenCanvas, mini-program canvases) */
3
+ export type IconDrawingContext = Pick<CanvasRenderingContext2D, "save" | "restore" | "translate" | "rotate" | "scale" | "beginPath" | "moveTo" | "lineTo" | "closePath" | "stroke" | "strokeStyle" | "lineWidth" | "lineCap" | "lineJoin" | "globalAlpha">;
4
+ /**
5
+ * Draws an icon on a 2D context, `size` units wide from (`x`, `y`), in the
6
+ * context's current transform. One stroke for the whole icon, so translucent
7
+ * colors don't darken where parts overlap. `currentColor` is not known to a
8
+ * canvas: pass a color (black by default).
9
+ */
10
+ export declare function drawIcon(ctx: IconDrawingContext, icon: IconDefinition, options?: DrawIconOptions): void;
@@ -0,0 +1,10 @@
1
+ import { DrawIconOptions, IconDefinition } from './types.js';
2
+ /** Minimal 2D context drawIcon needs (DOM, OffscreenCanvas, mini-program canvases) */
3
+ export type IconDrawingContext = Pick<CanvasRenderingContext2D, "save" | "restore" | "translate" | "rotate" | "scale" | "beginPath" | "moveTo" | "lineTo" | "closePath" | "stroke" | "strokeStyle" | "lineWidth" | "lineCap" | "lineJoin" | "globalAlpha">;
4
+ /**
5
+ * Draws an icon on a 2D context, `size` units wide from (`x`, `y`), in the
6
+ * context's current transform. One stroke for the whole icon, so translucent
7
+ * colors don't darken where parts overlap. `currentColor` is not known to a
8
+ * canvas: pass a color (black by default).
9
+ */
10
+ export declare function drawIcon(ctx: IconDrawingContext, icon: IconDefinition, options?: DrawIconOptions): void;
@@ -0,0 +1,47 @@
1
+ import { flattenIconPath as e } from "./path.js";
2
+ import { iconPathData as t } from "./svg.js";
3
+ //#region src/engine/canvas2d.ts
4
+ var n = /* @__PURE__ */ new WeakMap(), r = () => typeof Path2D == "function" && (() => {
5
+ try {
6
+ return new Path2D("M0 0L1 1"), !0;
7
+ } catch {
8
+ return !1;
9
+ }
10
+ })(), i, a = (e) => {
11
+ if (i ?? (i = r()), !i) return null;
12
+ let a = n.get(e);
13
+ if (a === void 0) {
14
+ try {
15
+ a = new Path2D(t(e));
16
+ } catch {
17
+ a = null;
18
+ }
19
+ n.set(e, a);
20
+ }
21
+ return a;
22
+ };
23
+ function o(t, n, r = {}) {
24
+ let { x: i = 0, y: o = 0, size: s = 24, color: c, strokeWidth: l = 2, rotation: u = 0, opacity: d = 1 } = r;
25
+ if (s <= 0 || l <= 0 || d <= 0) return;
26
+ t.save(), t.translate(i + s / 2, o + s / 2), u && t.rotate(u * Math.PI / 180);
27
+ let f = s / 24;
28
+ t.scale(f, f), t.translate(-12, -12), t.globalAlpha *= Math.min(1, d), t.strokeStyle = !c || c.toLowerCase() === "currentcolor" ? "#000" : c, t.lineWidth = l, t.lineCap = "round", t.lineJoin = "round";
29
+ let p = a(n);
30
+ if (p) t.stroke(p);
31
+ else {
32
+ let r = Math.min(.1, .2 / Math.max(f, .01));
33
+ t.beginPath();
34
+ for (let i of n.paths) for (let n of e(i, r)) {
35
+ let e = n.points;
36
+ t.moveTo(e[0], e[1]);
37
+ for (let n = 2; n < e.length; n += 2) t.lineTo(e[n], e[n + 1]);
38
+ n.closed && t.closePath();
39
+ }
40
+ t.stroke();
41
+ }
42
+ t.restore();
43
+ }
44
+ //#endregion
45
+ export { o as drawIcon };
46
+
47
+ //# sourceMappingURL=canvas2d.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canvas2d.js","names":["paths","hasPath2D","path2dSupport","path2d","path","icon","iconPathData","drawIcon","options","size","strokeWidth","opacity","ctx","x","y","rotation","scale","color","tolerance","d","line","flattenIconPath","p","i"],"sources":["../../../../icons/src/engine/canvas2d.ts"],"sourcesContent":["// Canvas2D drawing of a single icon: native strokes, same result as the SVG.\n\nimport { flattenIconPath } from \"./path\";\nimport { iconPathData } from \"./svg\";\nimport type { DrawIconOptions, IconDefinition } from \"./types\";\n\nconst paths = new WeakMap<IconDefinition, Path2D | null>();\n\nconst hasPath2D = () =>\n typeof Path2D === \"function\" &&\n (() => {\n try {\n // some environments (old WebViews, mini-programs) lack the SVG constructor\n new Path2D(\"M0 0L1 1\");\n return true;\n } catch {\n return false;\n }\n })();\n\nlet path2dSupport: boolean | undefined;\n\nconst path2d = (icon: IconDefinition): Path2D | null => {\n path2dSupport ??= hasPath2D();\n if (!path2dSupport) return null;\n let path = paths.get(icon);\n if (path === undefined) {\n try {\n path = new Path2D(iconPathData(icon));\n } catch {\n path = null;\n }\n paths.set(icon, path);\n }\n return path;\n};\n\n/** Minimal 2D context drawIcon needs (DOM, OffscreenCanvas, mini-program canvases) */\nexport type IconDrawingContext = Pick<\n CanvasRenderingContext2D,\n | \"save\"\n | \"restore\"\n | \"translate\"\n | \"rotate\"\n | \"scale\"\n | \"beginPath\"\n | \"moveTo\"\n | \"lineTo\"\n | \"closePath\"\n | \"stroke\"\n | \"strokeStyle\"\n | \"lineWidth\"\n | \"lineCap\"\n | \"lineJoin\"\n | \"globalAlpha\"\n>;\n\n/**\n * Draws an icon on a 2D context, `size` units wide from (`x`, `y`), in the\n * context's current transform. One stroke for the whole icon, so translucent\n * colors don't darken where parts overlap. `currentColor` is not known to a\n * canvas: pass a color (black by default).\n */\nexport function drawIcon(\n ctx: IconDrawingContext,\n icon: IconDefinition,\n options: DrawIconOptions = {},\n): void {\n const {\n x = 0,\n y = 0,\n size = 24,\n color,\n strokeWidth = 2,\n rotation = 0,\n opacity = 1,\n } = options;\n if (size <= 0 || strokeWidth <= 0 || opacity <= 0) return;\n ctx.save();\n ctx.translate(x + size / 2, y + size / 2);\n if (rotation) ctx.rotate((rotation * Math.PI) / 180);\n const scale = size / 24;\n ctx.scale(scale, scale);\n ctx.translate(-12, -12);\n ctx.globalAlpha *= Math.min(1, opacity);\n ctx.strokeStyle =\n !color || color.toLowerCase() === \"currentcolor\" ? \"#000\" : color;\n ctx.lineWidth = strokeWidth;\n ctx.lineCap = \"round\";\n ctx.lineJoin = \"round\";\n const path = path2d(icon);\n if (path) {\n (ctx as CanvasRenderingContext2D).stroke(path);\n } else {\n // flattened finely enough for the drawn size\n const tolerance = Math.min(0.1, 0.2 / Math.max(scale, 0.01));\n ctx.beginPath();\n for (const d of icon.paths) {\n for (const line of flattenIconPath(d, tolerance)) {\n const p = line.points;\n ctx.moveTo(p[0]!, p[1]!);\n for (let i = 2; i < p.length; i += 2) ctx.lineTo(p[i]!, p[i + 1]!);\n if (line.closed) ctx.closePath();\n }\n }\n ctx.stroke();\n }\n ctx.restore();\n}\n"],"mappings":";;;AAMA,IAAMA,oBAAQ,IAAI,QAAuC,GAEnDC,UACJ,OAAO,UAAW,qBACX;CACL,IAAI;EAGF,OADA,IAAI,OAAO,UAAU,GACd;CACT,QAAQ;EACN,OAAO;CACT;AACF,EAAA,CAAG,GAEDC,GAEEC,KAAU,MAAwC;CAEtD,IADAD,MAAA,IAAkBD,EAAU,IACxB,CAACC,GAAe,OAAO;CAC3B,IAAIE,IAAOJ,EAAM,IAAIK,CAAI;CACzB,IAAID,MAAS,KAAA,GAAW;EACtB,IAAI;GACF,IAAO,IAAI,OAAOE,EAAaD,CAAI,CAAC;EACtC,QAAQ;GACN,IAAO;EACT;EACA,EAAM,IAAIA,GAAMD,CAAI;CACtB;CACA,OAAOA;AACT;AA4BA,SAAgBG,EACd,GACA,GACA,IAA2B,CAAC,GACtB;CACN,IAAM,EACJ,OAAI,GACJ,OAAI,GACJ,UAAO,IACP,UACA,iBAAc,GACd,cAAW,GACX,aAAU,MACRC;CACJ,IAAIC,KAAQ,KAAKC,KAAe,KAAKC,KAAW,GAAG;CAGnD,AAFAC,EAAI,KAAK,GACTA,EAAI,UAAUC,IAAIJ,IAAO,GAAGK,IAAIL,IAAO,CAAC,GACpCM,KAAUH,EAAI,OAAQG,IAAW,KAAK,KAAM,GAAG;CACnD,IAAMC,IAAQP,IAAO;CAQrB,AAPAG,EAAI,MAAMI,GAAOA,CAAK,GACtBJ,EAAI,UAAU,KAAK,GAAG,GACtB,EAAI,eAAe,KAAK,IAAI,GAAGD,CAAO,GACtC,EAAI,cACF,CAACM,KAASA,EAAM,YAAY,MAAM,iBAAiB,SAASA,GAC9D,EAAI,YAAYP,GAChB,EAAI,UAAU,SACd,EAAI,WAAW;CACf,IAAMN,IAAOD,EAAOE,CAAI;CACxB,IAAID,GACF,EAAkC,OAAOA,CAAI;MACxC;EAEL,IAAMc,IAAY,KAAK,IAAI,IAAK,KAAM,KAAK,IAAIF,GAAO,GAAI,CAAC;EAC3D,EAAI,UAAU;EACd,KAAK,IAAMG,KAAKd,EAAK,OACnB,KAAK,IAAMe,KAAQC,EAAgBF,GAAGD,CAAS,GAAG;GAChD,IAAMI,IAAIF,EAAK;GACf,EAAI,OAAOE,EAAE,IAAKA,EAAE,EAAG;GACvB,KAAK,IAAIC,IAAI,GAAGA,IAAID,EAAE,QAAQ,KAAK,GAAG,EAAI,OAAOA,EAAEC,IAAKD,EAAEC,IAAI,EAAG;GACjE,AAAIH,EAAK,UAAQR,EAAI,UAAU;EACjC;EAEF,EAAI,OAAO;CACb;CACA,EAAI,QAAQ;AACd"}
@@ -0,0 +1,2 @@
1
+ var e=[0,0,0,1],t=e=>e<0?0:e>1?1:e,n=(e,t)=>e.endsWith(`%`)?parseFloat(e)/100:parseFloat(e)/t,r=e=>{let t=parseFloat(e);return e.endsWith(`turn`)?t*360:e.endsWith(`rad`)?t*180/Math.PI:e.endsWith(`grad`)?t*.9:t},i=(e,t,n)=>{let r=t=>(t+e/30)%12,i=t*Math.min(n,1-n),a=e=>n-i*Math.max(-1,Math.min(r(e)-3,Math.min(9-r(e),1)));return[a(0),a(8),a(4)]};function a(e){let a=e.trim().toLowerCase();if(a===`transparent`)return[0,0,0,0];if(a.startsWith(`#`)){let e=a.slice(1);if(!/^[0-9a-f]+$/.test(e))return null;if(e.length===3||e.length===4){let t=[...e].map(e=>parseInt(e+e,16)/255);return[t[0],t[1],t[2],t[3]??1]}if(e.length===6||e.length===8){let t=[0,2,4,6].map(t=>t<e.length?parseInt(e.slice(t,t+2),16)/255:1);return[t[0],t[1],t[2],t[3]]}return null}let o=/^(rgba?|hsla?)\((.*)\)$/.exec(a);if(!o)return null;let s=o[2].replace(/\s*\/\s*/,` / `).split(/[\s,]+/).filter(e=>e&&e!==`/`);if(s.length<3||s.length>4||s.some(e=>Number.isNaN(parseFloat(e))))return null;let c=s[3]===void 0?1:t(n(s[3],1));if(o[1].startsWith(`rgb`))return[t(n(s[0],255)),t(n(s[1],255)),t(n(s[2],255)),c];let[l,u,d]=i((r(s[0])%360+360)%360,t(parseFloat(s[1])/100),t(parseFloat(s[2])/100));return[l,u,d,c]}var o,s=e=>{if(o===void 0&&(o=typeof document>`u`?null:(()=>{try{let e=document.createElement(`canvas`);return e.width=e.height=1,e.getContext(`2d`,{willReadFrequently:!0})}catch{return null}})()),!o)return null;o.fillStyle=`#000`,o.fillStyle=e;let n=a(String(o.fillStyle));if(n)return n;try{o.clearRect(0,0,1,1),o.fillRect(0,0,1,1);let[e,n,r,i]=o.getImageData(0,0,1,1).data;return i?[e/255/(i/255),n/255/(i/255),r/255/(i/255),i/255].map(t):[0,0,0,0]}catch{return null}},c=new Map,l=/var\(\s*(--[\w-]+)\s*(?:,\s*([^()]*(?:\([^()]*\))?[^()]*))?\)/;function u(t,n){let r=(t??`currentColor`).trim(),i=n&&typeof getComputedStyle==`function`?getComputedStyle(n):null;for(let e=0;e<8&&r.includes(`var(`);e++)r=r.replace(l,(e,t,n)=>i?.getPropertyValue(t).trim()||n?.trim()||`currentColor`);r.toLowerCase()===`currentcolor`&&(r=i?.color||`#000`);let o=c.get(r);if(o)return o;let u=a(r)??s(r)??e;return c.size>512&&c.clear(),c.set(r,u),u}exports.parseColor=a,exports.resolveColor=u;
2
+ //# sourceMappingURL=color.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"color.cjs","names":["BLACK","clamp01","v","channel","part","max","hue","value","hslToRgb","k","n","h","a","s","l","f","parseColor","input","hex","c","i","fn","parts","alpha","r","g","b","probe","browserColor","canvas","parsed","cache","VARIABLE","resolveColor","color","style","element","depth","name","fallback","cached","rgba"],"sources":["../../../../icons/src/engine/color.ts"],"sourcesContent":["// CSS colors for the GPU backends (Canvas2D takes CSS colors as is).\n\n/** Red, green, blue, alpha between 0 and 1 (not premultiplied) */\nexport type Rgba = [number, number, number, number];\n\nconst BLACK: Rgba = [0, 0, 0, 1];\n\nconst clamp01 = (v: number) => (v < 0 ? 0 : v > 1 ? 1 : v);\n\nconst channel = (part: string, max: number) =>\n part.endsWith(\"%\") ? parseFloat(part) / 100 : parseFloat(part) / max;\n\nconst hue = (part: string) => {\n const value = parseFloat(part);\n if (part.endsWith(\"turn\")) return value * 360;\n if (part.endsWith(\"rad\")) return (value * 180) / Math.PI;\n if (part.endsWith(\"grad\")) return value * 0.9;\n return value;\n};\n\nconst hslToRgb = (\n h: number,\n s: number,\n l: number,\n): [number, number, number] => {\n const k = (n: number) => (n + h / 30) % 12;\n const a = s * Math.min(l, 1 - l);\n const f = (n: number) =>\n l - a * Math.max(-1, Math.min(k(n) - 3, Math.min(9 - k(n), 1)));\n return [f(0), f(8), f(4)];\n};\n\n/** Parses hex, rgb(a), hsl(a) and `transparent`; null for anything else */\nexport function parseColor(input: string): Rgba | null {\n const value = input.trim().toLowerCase();\n if (value === \"transparent\") return [0, 0, 0, 0];\n if (value.startsWith(\"#\")) {\n const hex = value.slice(1);\n if (!/^[0-9a-f]+$/.test(hex)) return null;\n if (hex.length === 3 || hex.length === 4) {\n const v = [...hex].map((c) => parseInt(c + c, 16) / 255);\n return [v[0]!, v[1]!, v[2]!, v[3] ?? 1];\n }\n if (hex.length === 6 || hex.length === 8) {\n const v = [0, 2, 4, 6].map((i) =>\n i < hex.length ? parseInt(hex.slice(i, i + 2), 16) / 255 : 1,\n );\n return [v[0]!, v[1]!, v[2]!, v[3]!];\n }\n return null;\n }\n const fn = /^(rgba?|hsla?)\\((.*)\\)$/.exec(value);\n if (!fn) return null;\n const parts = fn[2]!\n .replace(/\\s*\\/\\s*/, \" / \")\n .split(/[\\s,]+/)\n .filter((part) => part && part !== \"/\");\n if (parts.length < 3 || parts.length > 4) return null;\n if (parts.some((part) => Number.isNaN(parseFloat(part)))) return null;\n const alpha = parts[3] === undefined ? 1 : clamp01(channel(parts[3], 1));\n if (fn[1]!.startsWith(\"rgb\")) {\n return [\n clamp01(channel(parts[0]!, 255)),\n clamp01(channel(parts[1]!, 255)),\n clamp01(channel(parts[2]!, 255)),\n alpha,\n ];\n }\n const [r, g, b] = hslToRgb(\n ((hue(parts[0]!) % 360) + 360) % 360,\n clamp01(parseFloat(parts[1]!) / 100),\n clamp01(parseFloat(parts[2]!) / 100),\n );\n return [r, g, b, alpha];\n}\n\nlet probe: CanvasRenderingContext2D | null | undefined;\n\n/** Named colors, oklch(), color()…: let the browser convert them */\nconst browserColor = (value: string): Rgba | null => {\n if (probe === undefined) {\n probe =\n typeof document === \"undefined\"\n ? null\n : (() => {\n try {\n const canvas = document.createElement(\"canvas\");\n canvas.width = canvas.height = 1;\n return canvas.getContext(\"2d\", { willReadFrequently: true });\n } catch {\n return null;\n }\n })();\n }\n if (!probe) return null;\n probe.fillStyle = \"#000\";\n probe.fillStyle = value;\n const normalized = String(probe.fillStyle);\n const parsed = parseColor(normalized);\n if (parsed) return parsed;\n try {\n probe.clearRect(0, 0, 1, 1);\n probe.fillRect(0, 0, 1, 1);\n const [r, g, b, a] = probe.getImageData(0, 0, 1, 1).data;\n if (!a) return [0, 0, 0, 0];\n return [\n r! / 255 / (a / 255),\n g! / 255 / (a / 255),\n b! / 255 / (a / 255),\n a / 255,\n ].map(clamp01) as Rgba;\n } catch {\n return null;\n }\n};\n\nconst cache = new Map<string, Rgba>();\n\nconst VARIABLE =\n /var\\(\\s*(--[\\w-]+)\\s*(?:,\\s*([^()]*(?:\\([^()]*\\))?[^()]*))?\\)/;\n\n/**\n * Any CSS color as RGBA. `currentColor` and `var(--x)` are read on `element`\n * (its computed style); unknown colors give opaque black.\n */\nexport function resolveColor(\n value: string | undefined,\n element?: Element | null,\n): Rgba {\n let color = (value ?? \"currentColor\").trim();\n const style =\n element && typeof getComputedStyle === \"function\"\n ? getComputedStyle(element)\n : null;\n for (let depth = 0; depth < 8 && color.includes(\"var(\"); depth++) {\n color = color.replace(VARIABLE, (_, name: string, fallback?: string) => {\n const resolved = style?.getPropertyValue(name).trim();\n return resolved || fallback?.trim() || \"currentColor\";\n });\n }\n if (color.toLowerCase() === \"currentcolor\") {\n color = style?.color || \"#000\";\n }\n const cached = cache.get(color);\n if (cached) return cached;\n const rgba = parseColor(color) ?? browserColor(color) ?? BLACK;\n if (cache.size > 512) cache.clear();\n cache.set(color, rgba);\n return rgba;\n}\n"],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /** Red, green, blue, alpha between 0 and 1 (not premultiplied) */
2
+ export type Rgba = [number, number, number, number];
3
+ /** Parses hex, rgb(a), hsl(a) and `transparent`; null for anything else */
4
+ export declare function parseColor(input: string): Rgba | null;
5
+ /**
6
+ * Any CSS color as RGBA. `currentColor` and `var(--x)` are read on `element`
7
+ * (its computed style); unknown colors give opaque black.
8
+ */
9
+ export declare function resolveColor(value: string | undefined, element?: Element | null): Rgba;
@@ -0,0 +1,9 @@
1
+ /** Red, green, blue, alpha between 0 and 1 (not premultiplied) */
2
+ export type Rgba = [number, number, number, number];
3
+ /** Parses hex, rgb(a), hsl(a) and `transparent`; null for anything else */
4
+ export declare function parseColor(input: string): Rgba | null;
5
+ /**
6
+ * Any CSS color as RGBA. `currentColor` and `var(--x)` are read on `element`
7
+ * (its computed style); unknown colors give opaque black.
8
+ */
9
+ export declare function resolveColor(value: string | undefined, element?: Element | null): Rgba;
@@ -0,0 +1,115 @@
1
+ //#region src/engine/color.ts
2
+ var e = [
3
+ 0,
4
+ 0,
5
+ 0,
6
+ 1
7
+ ], t = (e) => e < 0 ? 0 : e > 1 ? 1 : e, n = (e, t) => e.endsWith("%") ? parseFloat(e) / 100 : parseFloat(e) / t, r = (e) => {
8
+ let t = parseFloat(e);
9
+ return e.endsWith("turn") ? t * 360 : e.endsWith("rad") ? t * 180 / Math.PI : e.endsWith("grad") ? t * .9 : t;
10
+ }, i = (e, t, n) => {
11
+ let r = (t) => (t + e / 30) % 12, i = t * Math.min(n, 1 - n), a = (e) => n - i * Math.max(-1, Math.min(r(e) - 3, Math.min(9 - r(e), 1)));
12
+ return [
13
+ a(0),
14
+ a(8),
15
+ a(4)
16
+ ];
17
+ };
18
+ function a(e) {
19
+ let a = e.trim().toLowerCase();
20
+ if (a === "transparent") return [
21
+ 0,
22
+ 0,
23
+ 0,
24
+ 0
25
+ ];
26
+ if (a.startsWith("#")) {
27
+ let e = a.slice(1);
28
+ if (!/^[0-9a-f]+$/.test(e)) return null;
29
+ if (e.length === 3 || e.length === 4) {
30
+ let t = [...e].map((e) => parseInt(e + e, 16) / 255);
31
+ return [
32
+ t[0],
33
+ t[1],
34
+ t[2],
35
+ t[3] ?? 1
36
+ ];
37
+ }
38
+ if (e.length === 6 || e.length === 8) {
39
+ let t = [
40
+ 0,
41
+ 2,
42
+ 4,
43
+ 6
44
+ ].map((t) => t < e.length ? parseInt(e.slice(t, t + 2), 16) / 255 : 1);
45
+ return [
46
+ t[0],
47
+ t[1],
48
+ t[2],
49
+ t[3]
50
+ ];
51
+ }
52
+ return null;
53
+ }
54
+ let o = /^(rgba?|hsla?)\((.*)\)$/.exec(a);
55
+ if (!o) return null;
56
+ let s = o[2].replace(/\s*\/\s*/, " / ").split(/[\s,]+/).filter((e) => e && e !== "/");
57
+ if (s.length < 3 || s.length > 4 || s.some((e) => Number.isNaN(parseFloat(e)))) return null;
58
+ let c = s[3] === void 0 ? 1 : t(n(s[3], 1));
59
+ if (o[1].startsWith("rgb")) return [
60
+ t(n(s[0], 255)),
61
+ t(n(s[1], 255)),
62
+ t(n(s[2], 255)),
63
+ c
64
+ ];
65
+ let [l, u, d] = i((r(s[0]) % 360 + 360) % 360, t(parseFloat(s[1]) / 100), t(parseFloat(s[2]) / 100));
66
+ return [
67
+ l,
68
+ u,
69
+ d,
70
+ c
71
+ ];
72
+ }
73
+ var o, s = (e) => {
74
+ if (o === void 0 && (o = typeof document > "u" ? null : (() => {
75
+ try {
76
+ let e = document.createElement("canvas");
77
+ return e.width = e.height = 1, e.getContext("2d", { willReadFrequently: !0 });
78
+ } catch {
79
+ return null;
80
+ }
81
+ })()), !o) return null;
82
+ o.fillStyle = "#000", o.fillStyle = e;
83
+ let n = a(String(o.fillStyle));
84
+ if (n) return n;
85
+ try {
86
+ o.clearRect(0, 0, 1, 1), o.fillRect(0, 0, 1, 1);
87
+ let [e, n, r, i] = o.getImageData(0, 0, 1, 1).data;
88
+ return i ? [
89
+ e / 255 / (i / 255),
90
+ n / 255 / (i / 255),
91
+ r / 255 / (i / 255),
92
+ i / 255
93
+ ].map(t) : [
94
+ 0,
95
+ 0,
96
+ 0,
97
+ 0
98
+ ];
99
+ } catch {
100
+ return null;
101
+ }
102
+ }, c = /* @__PURE__ */ new Map(), l = /var\(\s*(--[\w-]+)\s*(?:,\s*([^()]*(?:\([^()]*\))?[^()]*))?\)/;
103
+ function u(t, n) {
104
+ let r = (t ?? "currentColor").trim(), i = n && typeof getComputedStyle == "function" ? getComputedStyle(n) : null;
105
+ for (let e = 0; e < 8 && r.includes("var("); e++) r = r.replace(l, (e, t, n) => i?.getPropertyValue(t).trim() || n?.trim() || "currentColor");
106
+ r.toLowerCase() === "currentcolor" && (r = i?.color || "#000");
107
+ let o = c.get(r);
108
+ if (o) return o;
109
+ let u = a(r) ?? s(r) ?? e;
110
+ return c.size > 512 && c.clear(), c.set(r, u), u;
111
+ }
112
+ //#endregion
113
+ export { a as parseColor, u as resolveColor };
114
+
115
+ //# sourceMappingURL=color.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"color.js","names":["BLACK","clamp01","v","channel","part","max","hue","value","hslToRgb","k","n","h","a","s","l","f","parseColor","input","hex","c","i","fn","parts","alpha","r","g","b","probe","browserColor","canvas","parsed","cache","VARIABLE","resolveColor","color","style","element","depth","name","fallback","cached","rgba"],"sources":["../../../../icons/src/engine/color.ts"],"sourcesContent":["// CSS colors for the GPU backends (Canvas2D takes CSS colors as is).\n\n/** Red, green, blue, alpha between 0 and 1 (not premultiplied) */\nexport type Rgba = [number, number, number, number];\n\nconst BLACK: Rgba = [0, 0, 0, 1];\n\nconst clamp01 = (v: number) => (v < 0 ? 0 : v > 1 ? 1 : v);\n\nconst channel = (part: string, max: number) =>\n part.endsWith(\"%\") ? parseFloat(part) / 100 : parseFloat(part) / max;\n\nconst hue = (part: string) => {\n const value = parseFloat(part);\n if (part.endsWith(\"turn\")) return value * 360;\n if (part.endsWith(\"rad\")) return (value * 180) / Math.PI;\n if (part.endsWith(\"grad\")) return value * 0.9;\n return value;\n};\n\nconst hslToRgb = (\n h: number,\n s: number,\n l: number,\n): [number, number, number] => {\n const k = (n: number) => (n + h / 30) % 12;\n const a = s * Math.min(l, 1 - l);\n const f = (n: number) =>\n l - a * Math.max(-1, Math.min(k(n) - 3, Math.min(9 - k(n), 1)));\n return [f(0), f(8), f(4)];\n};\n\n/** Parses hex, rgb(a), hsl(a) and `transparent`; null for anything else */\nexport function parseColor(input: string): Rgba | null {\n const value = input.trim().toLowerCase();\n if (value === \"transparent\") return [0, 0, 0, 0];\n if (value.startsWith(\"#\")) {\n const hex = value.slice(1);\n if (!/^[0-9a-f]+$/.test(hex)) return null;\n if (hex.length === 3 || hex.length === 4) {\n const v = [...hex].map((c) => parseInt(c + c, 16) / 255);\n return [v[0]!, v[1]!, v[2]!, v[3] ?? 1];\n }\n if (hex.length === 6 || hex.length === 8) {\n const v = [0, 2, 4, 6].map((i) =>\n i < hex.length ? parseInt(hex.slice(i, i + 2), 16) / 255 : 1,\n );\n return [v[0]!, v[1]!, v[2]!, v[3]!];\n }\n return null;\n }\n const fn = /^(rgba?|hsla?)\\((.*)\\)$/.exec(value);\n if (!fn) return null;\n const parts = fn[2]!\n .replace(/\\s*\\/\\s*/, \" / \")\n .split(/[\\s,]+/)\n .filter((part) => part && part !== \"/\");\n if (parts.length < 3 || parts.length > 4) return null;\n if (parts.some((part) => Number.isNaN(parseFloat(part)))) return null;\n const alpha = parts[3] === undefined ? 1 : clamp01(channel(parts[3], 1));\n if (fn[1]!.startsWith(\"rgb\")) {\n return [\n clamp01(channel(parts[0]!, 255)),\n clamp01(channel(parts[1]!, 255)),\n clamp01(channel(parts[2]!, 255)),\n alpha,\n ];\n }\n const [r, g, b] = hslToRgb(\n ((hue(parts[0]!) % 360) + 360) % 360,\n clamp01(parseFloat(parts[1]!) / 100),\n clamp01(parseFloat(parts[2]!) / 100),\n );\n return [r, g, b, alpha];\n}\n\nlet probe: CanvasRenderingContext2D | null | undefined;\n\n/** Named colors, oklch(), color()…: let the browser convert them */\nconst browserColor = (value: string): Rgba | null => {\n if (probe === undefined) {\n probe =\n typeof document === \"undefined\"\n ? null\n : (() => {\n try {\n const canvas = document.createElement(\"canvas\");\n canvas.width = canvas.height = 1;\n return canvas.getContext(\"2d\", { willReadFrequently: true });\n } catch {\n return null;\n }\n })();\n }\n if (!probe) return null;\n probe.fillStyle = \"#000\";\n probe.fillStyle = value;\n const normalized = String(probe.fillStyle);\n const parsed = parseColor(normalized);\n if (parsed) return parsed;\n try {\n probe.clearRect(0, 0, 1, 1);\n probe.fillRect(0, 0, 1, 1);\n const [r, g, b, a] = probe.getImageData(0, 0, 1, 1).data;\n if (!a) return [0, 0, 0, 0];\n return [\n r! / 255 / (a / 255),\n g! / 255 / (a / 255),\n b! / 255 / (a / 255),\n a / 255,\n ].map(clamp01) as Rgba;\n } catch {\n return null;\n }\n};\n\nconst cache = new Map<string, Rgba>();\n\nconst VARIABLE =\n /var\\(\\s*(--[\\w-]+)\\s*(?:,\\s*([^()]*(?:\\([^()]*\\))?[^()]*))?\\)/;\n\n/**\n * Any CSS color as RGBA. `currentColor` and `var(--x)` are read on `element`\n * (its computed style); unknown colors give opaque black.\n */\nexport function resolveColor(\n value: string | undefined,\n element?: Element | null,\n): Rgba {\n let color = (value ?? \"currentColor\").trim();\n const style =\n element && typeof getComputedStyle === \"function\"\n ? getComputedStyle(element)\n : null;\n for (let depth = 0; depth < 8 && color.includes(\"var(\"); depth++) {\n color = color.replace(VARIABLE, (_, name: string, fallback?: string) => {\n const resolved = style?.getPropertyValue(name).trim();\n return resolved || fallback?.trim() || \"currentColor\";\n });\n }\n if (color.toLowerCase() === \"currentcolor\") {\n color = style?.color || \"#000\";\n }\n const cached = cache.get(color);\n if (cached) return cached;\n const rgba = parseColor(color) ?? browserColor(color) ?? BLACK;\n if (cache.size > 512) cache.clear();\n cache.set(color, rgba);\n return rgba;\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ var e=Symbol.for(`minerva-design.icons.defaults`),t=Symbol.for(`minerva-design.icons.defaultRenderer`),n=[`auto`,`webgpu`,`webgl2`,`webgl`,`canvas2d`],r=()=>{let r=globalThis,i=r[e];if(!i){let a=r[t];i={renderer:n.find(e=>e===a)??`auto`,listeners:new Set},r[e]=i}return i},i=e=>{let t=n.includes(e)?e:`auto`,i=r();if(i.renderer!==t){i.renderer=t;for(let e of[...i.listeners])try{e(t)}catch(e){queueMicrotask(()=>{throw e})}}},a=()=>r().renderer,o=e=>{let{listeners:t}=r();return t.add(e),()=>{t.delete(e)}},s=e=>!e||e===`auto`?a():e;exports.ICON_RENDERER_PREFERENCES=n,exports.getDefaultIconRenderer=a,exports.resolveIconRenderer=s,exports.setDefaultIconRenderer=i,exports.subscribeDefaultIconRenderer=o;
2
+ //# sourceMappingURL=defaults.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults.cjs","names":["KEY","SEED","ICON_RENDERER_PREFERENCES","state","host","current","seed","option","setDefaultIconRenderer","next","preference","listener","error","getDefaultIconRenderer","subscribeDefaultIconRenderer","listeners","resolveIconRenderer"],"sources":["../../../../icons/src/engine/defaults.ts"],"sourcesContent":["// Process-wide icon defaults: icon canvases and canvas icons whose renderer\n// is unset or \"auto\" use the backend preference set here, so an app can\n// switch them all between WebGPU, WebGL2, WebGL and Canvas2D in one place.\n\nimport type { IconRendererPreference } from \"./types\";\n\ntype RendererListener = (preference: IconRendererPreference) => void;\n\ninterface DefaultsState {\n renderer: IconRendererPreference;\n listeners: Set<RendererListener>;\n}\n\n// on globalThis so every copy of the package on a page shares the default\nconst KEY = Symbol.for(\"minerva-design.icons.defaults\");\n\n/**\n * Lets a page choose the default before the package loads:\n * `globalThis[Symbol.for(\"minerva-design.icons.defaultRenderer\")] = \"webgl2\"`.\n * Read once, when the first copy creates the shared state; afterwards use\n * `setDefaultIconRenderer`. Invalid values mean \"auto\".\n */\nconst SEED = Symbol.for(\"minerva-design.icons.defaultRenderer\");\n\n/** Every renderer preference, \"auto\" first */\nexport const ICON_RENDERER_PREFERENCES: readonly IconRendererPreference[] = [\n \"auto\",\n \"webgpu\",\n \"webgl2\",\n \"webgl\",\n \"canvas2d\",\n];\n\nconst state = (): DefaultsState => {\n const host = globalThis as unknown as Record<symbol, unknown>;\n let current = host[KEY] as DefaultsState | undefined;\n if (!current) {\n const seed = host[SEED];\n current = {\n renderer:\n ICON_RENDERER_PREFERENCES.find((option) => option === seed) ?? \"auto\",\n listeners: new Set(),\n };\n host[KEY] = current;\n }\n return current;\n};\n\n/**\n * Sets the backend of icon canvases with `renderer` unset or \"auto\"; mounted\n * ones switch live. \"auto\" restores the WebGPU -> WebGL2 -> WebGL -> Canvas2D\n * detection. SVG icons are not affected.\n */\nexport const setDefaultIconRenderer = (\n preference: IconRendererPreference,\n): void => {\n const next = ICON_RENDERER_PREFERENCES.includes(preference)\n ? preference\n : \"auto\";\n const current = state();\n if (current.renderer === next) return;\n current.renderer = next;\n for (const listener of [...current.listeners]) {\n try {\n listener(next);\n } catch (error) {\n queueMicrotask(() => {\n throw error;\n });\n }\n }\n};\n\n/** The backend preference canvases with `renderer: \"auto\"` start from */\nexport const getDefaultIconRenderer = (): IconRendererPreference =>\n state().renderer;\n\n/** Calls `listener` whenever the default renderer changes; returns an unsubscribe function */\nexport const subscribeDefaultIconRenderer = (\n listener: RendererListener,\n): (() => void) => {\n const { listeners } = state();\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n};\n\n/** The preference actually used: the canvas' own, else the global default */\nexport const resolveIconRenderer = (\n preference: IconRendererPreference | undefined,\n): IconRendererPreference =>\n !preference || preference === \"auto\" ? getDefaultIconRenderer() : preference;\n"],"mappings":"AAcA,IAAMA,EAAM,OAAO,IAAI,+BAA+B,EAQhDC,EAAO,OAAO,IAAI,sCAAsC,EAGjDC,EAA+D,CAC1E,OACA,SACA,SACA,QACA,UACF,EAEMC,MAA6B,CACjC,IAAMC,EAAO,WACTC,EAAUD,EAAKJ,GACnB,GAAI,CAACK,EAAS,CACZ,IAAMC,EAAOF,EAAKH,GAClB,EAAU,CACR,SACEC,EAA0B,KAAM,GAAWK,IAAWD,CAAI,GAAK,OACjE,UAAW,IAAI,GACjB,EACA,EAAKN,GAAOK,CACd,CACA,OAAOA,CACT,EAOaG,EACX,GACS,CACT,IAAMC,EAAOP,EAA0B,SAASQ,CAAU,EACtDA,EACA,OACEL,EAAUF,EAAM,EACtB,GAAIE,EAAQ,WAAaI,EACzB,GAAQ,SAAWA,EACnB,IAAK,IAAME,IAAY,CAAC,GAAGN,EAAQ,SAAS,EAC1C,GAAI,CACFM,EAASF,CAAI,CACf,OAASG,EAAO,CACd,mBAAqB,CACnB,MAAMA,CACR,CAAC,CACH,CARiB,CAUrB,EAGaC,MACXV,EAAM,CAAC,CAAC,SAGGW,EACX,GACiB,CACjB,GAAM,CAAE,aAAcX,EAAM,EAE5B,OADAY,EAAU,IAAIJ,CAAQ,MACT,CACXI,EAAU,OAAOJ,CAAQ,CAC3B,CACF,EAGaK,EACX,GAEA,CAACN,GAAcA,IAAe,OAASG,EAAuB,EAAIH"}
@@ -0,0 +1,17 @@
1
+ import { IconRendererPreference } from './types.cjs';
2
+ type RendererListener = (preference: IconRendererPreference) => void;
3
+ /** Every renderer preference, "auto" first */
4
+ export declare const ICON_RENDERER_PREFERENCES: readonly IconRendererPreference[];
5
+ /**
6
+ * Sets the backend of icon canvases with `renderer` unset or "auto"; mounted
7
+ * ones switch live. "auto" restores the WebGPU -> WebGL2 -> WebGL -> Canvas2D
8
+ * detection. SVG icons are not affected.
9
+ */
10
+ export declare const setDefaultIconRenderer: (preference: IconRendererPreference) => void;
11
+ /** The backend preference canvases with `renderer: "auto"` start from */
12
+ export declare const getDefaultIconRenderer: () => IconRendererPreference;
13
+ /** Calls `listener` whenever the default renderer changes; returns an unsubscribe function */
14
+ export declare const subscribeDefaultIconRenderer: (listener: RendererListener) => (() => void);
15
+ /** The preference actually used: the canvas' own, else the global default */
16
+ export declare const resolveIconRenderer: (preference: IconRendererPreference | undefined) => IconRendererPreference;
17
+ export {};
@@ -0,0 +1,17 @@
1
+ import { IconRendererPreference } from './types.js';
2
+ type RendererListener = (preference: IconRendererPreference) => void;
3
+ /** Every renderer preference, "auto" first */
4
+ export declare const ICON_RENDERER_PREFERENCES: readonly IconRendererPreference[];
5
+ /**
6
+ * Sets the backend of icon canvases with `renderer` unset or "auto"; mounted
7
+ * ones switch live. "auto" restores the WebGPU -> WebGL2 -> WebGL -> Canvas2D
8
+ * detection. SVG icons are not affected.
9
+ */
10
+ export declare const setDefaultIconRenderer: (preference: IconRendererPreference) => void;
11
+ /** The backend preference canvases with `renderer: "auto"` start from */
12
+ export declare const getDefaultIconRenderer: () => IconRendererPreference;
13
+ /** Calls `listener` whenever the default renderer changes; returns an unsubscribe function */
14
+ export declare const subscribeDefaultIconRenderer: (listener: RendererListener) => (() => void);
15
+ /** The preference actually used: the canvas' own, else the global default */
16
+ export declare const resolveIconRenderer: (preference: IconRendererPreference | undefined) => IconRendererPreference;
17
+ export {};
@@ -0,0 +1,39 @@
1
+ //#region src/engine/defaults.ts
2
+ var e = Symbol.for("minerva-design.icons.defaults"), t = Symbol.for("minerva-design.icons.defaultRenderer"), n = [
3
+ "auto",
4
+ "webgpu",
5
+ "webgl2",
6
+ "webgl",
7
+ "canvas2d"
8
+ ], r = () => {
9
+ let r = globalThis, i = r[e];
10
+ if (!i) {
11
+ let a = r[t];
12
+ i = {
13
+ renderer: n.find((e) => e === a) ?? "auto",
14
+ listeners: /* @__PURE__ */ new Set()
15
+ }, r[e] = i;
16
+ }
17
+ return i;
18
+ }, i = (e) => {
19
+ let t = n.includes(e) ? e : "auto", i = r();
20
+ if (i.renderer !== t) {
21
+ i.renderer = t;
22
+ for (let e of [...i.listeners]) try {
23
+ e(t);
24
+ } catch (e) {
25
+ queueMicrotask(() => {
26
+ throw e;
27
+ });
28
+ }
29
+ }
30
+ }, a = () => r().renderer, o = (e) => {
31
+ let { listeners: t } = r();
32
+ return t.add(e), () => {
33
+ t.delete(e);
34
+ };
35
+ }, s = (e) => !e || e === "auto" ? a() : e;
36
+ //#endregion
37
+ export { n as ICON_RENDERER_PREFERENCES, a as getDefaultIconRenderer, s as resolveIconRenderer, i as setDefaultIconRenderer, o as subscribeDefaultIconRenderer };
38
+
39
+ //# sourceMappingURL=defaults.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults.js","names":["KEY","SEED","ICON_RENDERER_PREFERENCES","state","host","current","seed","option","setDefaultIconRenderer","next","preference","listener","error","getDefaultIconRenderer","subscribeDefaultIconRenderer","listeners","resolveIconRenderer"],"sources":["../../../../icons/src/engine/defaults.ts"],"sourcesContent":["// Process-wide icon defaults: icon canvases and canvas icons whose renderer\n// is unset or \"auto\" use the backend preference set here, so an app can\n// switch them all between WebGPU, WebGL2, WebGL and Canvas2D in one place.\n\nimport type { IconRendererPreference } from \"./types\";\n\ntype RendererListener = (preference: IconRendererPreference) => void;\n\ninterface DefaultsState {\n renderer: IconRendererPreference;\n listeners: Set<RendererListener>;\n}\n\n// on globalThis so every copy of the package on a page shares the default\nconst KEY = Symbol.for(\"minerva-design.icons.defaults\");\n\n/**\n * Lets a page choose the default before the package loads:\n * `globalThis[Symbol.for(\"minerva-design.icons.defaultRenderer\")] = \"webgl2\"`.\n * Read once, when the first copy creates the shared state; afterwards use\n * `setDefaultIconRenderer`. Invalid values mean \"auto\".\n */\nconst SEED = Symbol.for(\"minerva-design.icons.defaultRenderer\");\n\n/** Every renderer preference, \"auto\" first */\nexport const ICON_RENDERER_PREFERENCES: readonly IconRendererPreference[] = [\n \"auto\",\n \"webgpu\",\n \"webgl2\",\n \"webgl\",\n \"canvas2d\",\n];\n\nconst state = (): DefaultsState => {\n const host = globalThis as unknown as Record<symbol, unknown>;\n let current = host[KEY] as DefaultsState | undefined;\n if (!current) {\n const seed = host[SEED];\n current = {\n renderer:\n ICON_RENDERER_PREFERENCES.find((option) => option === seed) ?? \"auto\",\n listeners: new Set(),\n };\n host[KEY] = current;\n }\n return current;\n};\n\n/**\n * Sets the backend of icon canvases with `renderer` unset or \"auto\"; mounted\n * ones switch live. \"auto\" restores the WebGPU -> WebGL2 -> WebGL -> Canvas2D\n * detection. SVG icons are not affected.\n */\nexport const setDefaultIconRenderer = (\n preference: IconRendererPreference,\n): void => {\n const next = ICON_RENDERER_PREFERENCES.includes(preference)\n ? preference\n : \"auto\";\n const current = state();\n if (current.renderer === next) return;\n current.renderer = next;\n for (const listener of [...current.listeners]) {\n try {\n listener(next);\n } catch (error) {\n queueMicrotask(() => {\n throw error;\n });\n }\n }\n};\n\n/** The backend preference canvases with `renderer: \"auto\"` start from */\nexport const getDefaultIconRenderer = (): IconRendererPreference =>\n state().renderer;\n\n/** Calls `listener` whenever the default renderer changes; returns an unsubscribe function */\nexport const subscribeDefaultIconRenderer = (\n listener: RendererListener,\n): (() => void) => {\n const { listeners } = state();\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n};\n\n/** The preference actually used: the canvas' own, else the global default */\nexport const resolveIconRenderer = (\n preference: IconRendererPreference | undefined,\n): IconRendererPreference =>\n !preference || preference === \"auto\" ? getDefaultIconRenderer() : preference;\n"],"mappings":";AAcA,IAAMA,IAAM,OAAO,IAAI,+BAA+B,GAQhDC,IAAO,OAAO,IAAI,sCAAsC,GAGjDC,IAA+D;CAC1E;CACA;CACA;CACA;CACA;AACF,GAEMC,UAA6B;CACjC,IAAMC,IAAO,YACTC,IAAUD,EAAKJ;CACnB,IAAI,CAACK,GAAS;EACZ,IAAMC,IAAOF,EAAKH;EAMlB,AALA,IAAU;GACR,UACEC,EAA0B,MAAM,MAAWK,MAAWD,CAAI,KAAK;GACjE,2BAAW,IAAI,IAAI;EACrB,GACA,EAAKN,KAAOK;CACd;CACA,OAAOA;AACT,GAOaG,KACX,MACS;CACT,IAAMC,IAAOP,EAA0B,SAASQ,CAAU,IACtDA,IACA,QACEL,IAAUF,EAAM;CACtB,IAAIE,EAAQ,aAAaI,GACzB;IAAQ,WAAWA;EACnB,KAAK,IAAME,KAAY,CAAC,GAAGN,EAAQ,SAAS,GAC1C,IAAI;GACF,EAASI,CAAI;EACf,SAASG,GAAO;GACd,qBAAqB;IACnB,MAAMA;GACR,CAAC;EACH;CARiB;AAUrB,GAGaC,UACXV,EAAM,CAAC,CAAC,UAGGW,KACX,MACiB;CACjB,IAAM,EAAE,iBAAcX,EAAM;CAE5B,OADAY,EAAU,IAAIJ,CAAQ,SACT;EACX,EAAU,OAAOA,CAAQ;CAC3B;AACF,GAGaK,KACX,MAEA,CAACN,KAAcA,MAAe,SAASG,EAAuB,IAAIH"}
@@ -0,0 +1,2 @@
1
+ const e=require("./path.cjs");var t=/^[a-z0-9]+(?:-[a-z0-9]+)*$/;function n(n){let{name:r,paths:i,category:a,tags:o}=n;if(!t.test(r))throw TypeError(`Invalid icon name "${r}": use kebab-case (e.g. "my-icon")`);if(!i.length)throw TypeError(`Icon "${r}" has no paths`);for(let t of i)e.parseIconPath(t);return Object.freeze({name:r,paths:Object.freeze([...i]),...a!==void 0&&{category:a},...o!==void 0&&{tags:Object.freeze([...o])}})}exports.defineIcon=n;
2
+ //# sourceMappingURL=define.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"define.cjs","names":["require_path","NAME","defineIcon","definition","name","paths","d","category","tags"],"sources":["../../../../icons/src/engine/define.ts"],"sourcesContent":["// Custom icons: same shape as the built-in ones, validated once.\n\nimport { parseIconPath } from \"./path\";\nimport type { IconDefinition } from \"./types\";\n\nconst NAME = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;\n\n/**\n * Declares a custom icon (24×24 grid, stroked with round caps and joins, like\n * the built-in set). Throws on a malformed name or path data, so mistakes\n * show up where the icon is declared rather than when it is drawn. The\n * result is frozen and works with every renderer.\n */\nexport function defineIcon(definition: IconDefinition): IconDefinition {\n const { name, paths, category, tags } = definition;\n if (!NAME.test(name)) {\n throw new TypeError(\n `Invalid icon name \"${name}\": use kebab-case (e.g. \"my-icon\")`,\n );\n }\n if (!paths.length) {\n throw new TypeError(`Icon \"${name}\" has no paths`);\n }\n for (const d of paths) parseIconPath(d);\n return Object.freeze({\n name,\n paths: Object.freeze([...paths]),\n ...(category !== undefined && { category }),\n ...(tags !== undefined && { tags: Object.freeze([...tags]) }),\n });\n}\n"],"mappings":"8BAKA,IAAMC,EAAO,6BAQb,SAAgBC,EAAW,EAA4C,CACrE,GAAM,CAAE,OAAM,QAAO,WAAU,QAASC,EACxC,GAAI,CAACF,EAAK,KAAKG,CAAI,EACjB,MAAU,UACR,sBAAsBA,EAAK,mCAC7B,EAEF,GAAI,CAACC,EAAM,OACT,MAAU,UAAU,SAASD,EAAK,eAAe,EAEnD,IAAK,IAAME,KAAKD,EAAOL,EAAA,cAAcM,CAAC,EACtC,OAAO,OAAO,OAAO,CACnB,OACA,MAAO,OAAO,OAAO,CAAC,GAAGD,CAAK,CAAC,EAC/B,GAAIE,IAAa,IAAA,IAAa,CAAE,UAAS,EACzC,GAAIC,IAAS,IAAA,IAAa,CAAE,KAAM,OAAO,OAAO,CAAC,GAAGA,CAAI,CAAC,CAAE,CAC7D,CAAC,CACH"}
@@ -0,0 +1,8 @@
1
+ import { IconDefinition } from './types.cjs';
2
+ /**
3
+ * Declares a custom icon (24×24 grid, stroked with round caps and joins, like
4
+ * the built-in set). Throws on a malformed name or path data, so mistakes
5
+ * show up where the icon is declared rather than when it is drawn. The
6
+ * result is frozen and works with every renderer.
7
+ */
8
+ export declare function defineIcon(definition: IconDefinition): IconDefinition;
@@ -0,0 +1,8 @@
1
+ import { IconDefinition } from './types.js';
2
+ /**
3
+ * Declares a custom icon (24×24 grid, stroked with round caps and joins, like
4
+ * the built-in set). Throws on a malformed name or path data, so mistakes
5
+ * show up where the icon is declared rather than when it is drawn. The
6
+ * result is frozen and works with every renderer.
7
+ */
8
+ export declare function defineIcon(definition: IconDefinition): IconDefinition;
@@ -0,0 +1,19 @@
1
+ import { parseIconPath as e } from "./path.js";
2
+ //#region src/engine/define.ts
3
+ var t = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
4
+ function n(n) {
5
+ let { name: r, paths: i, category: a, tags: o } = n;
6
+ if (!t.test(r)) throw TypeError(`Invalid icon name "${r}": use kebab-case (e.g. "my-icon")`);
7
+ if (!i.length) throw TypeError(`Icon "${r}" has no paths`);
8
+ for (let t of i) e(t);
9
+ return Object.freeze({
10
+ name: r,
11
+ paths: Object.freeze([...i]),
12
+ ...a !== void 0 && { category: a },
13
+ ...o !== void 0 && { tags: Object.freeze([...o]) }
14
+ });
15
+ }
16
+ //#endregion
17
+ export { n as defineIcon };
18
+
19
+ //# sourceMappingURL=define.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"define.js","names":["NAME","defineIcon","definition","name","paths","d","category","tags"],"sources":["../../../../icons/src/engine/define.ts"],"sourcesContent":["// Custom icons: same shape as the built-in ones, validated once.\n\nimport { parseIconPath } from \"./path\";\nimport type { IconDefinition } from \"./types\";\n\nconst NAME = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;\n\n/**\n * Declares a custom icon (24×24 grid, stroked with round caps and joins, like\n * the built-in set). Throws on a malformed name or path data, so mistakes\n * show up where the icon is declared rather than when it is drawn. The\n * result is frozen and works with every renderer.\n */\nexport function defineIcon(definition: IconDefinition): IconDefinition {\n const { name, paths, category, tags } = definition;\n if (!NAME.test(name)) {\n throw new TypeError(\n `Invalid icon name \"${name}\": use kebab-case (e.g. \"my-icon\")`,\n );\n }\n if (!paths.length) {\n throw new TypeError(`Icon \"${name}\" has no paths`);\n }\n for (const d of paths) parseIconPath(d);\n return Object.freeze({\n name,\n paths: Object.freeze([...paths]),\n ...(category !== undefined && { category }),\n ...(tags !== undefined && { tags: Object.freeze([...tags]) }),\n });\n}\n"],"mappings":";;AAKA,IAAMA,IAAO;AAQb,SAAgBC,EAAW,GAA4C;CACrE,IAAM,EAAE,SAAM,UAAO,aAAU,YAASC;CACxC,IAAI,CAACF,EAAK,KAAKG,CAAI,GACjB,MAAU,UACR,sBAAsBA,EAAK,mCAC7B;CAEF,IAAI,CAACC,EAAM,QACT,MAAU,UAAU,SAASD,EAAK,eAAe;CAEnD,KAAK,IAAME,KAAKD,GAAO,EAAcC,CAAC;CACtC,OAAO,OAAO,OAAO;EACnB;EACA,OAAO,OAAO,OAAO,CAAC,GAAGD,CAAK,CAAC;EAC/B,GAAIE,MAAa,KAAA,KAAa,EAAE,YAAS;EACzC,GAAIC,MAAS,KAAA,KAAa,EAAE,MAAM,OAAO,OAAO,CAAC,GAAGA,CAAI,CAAC,EAAE;CAC7D,CAAC;AACH"}
@@ -0,0 +1,2 @@
1
+ const e=require("./color.cjs"),t=require("./defaults.cjs"),n=require("./renderers/detect.cjs"),r=require("./theme.cjs");var i=e=>{if(typeof requestAnimationFrame==`function`){let t=requestAnimationFrame(e);return()=>cancelAnimationFrame(t)}let t=setTimeout(e,16);return()=>clearTimeout(t)},a=(t,n)=>{let r=new Map;return t.map(t=>{let i=r.get(t.color);i||(i=e.resolveColor(t.color,n),r.set(t.color,i));let a=Math.min(1,Math.max(0,t.opacity??1));return{icon:t.icon,x:t.x,y:t.y,size:t.size??24,rotation:(t.rotation??0)*Math.PI/180,strokeWidth:t.strokeWidth??2,color:[i[0],i[1],i[2],i[3]*a]}})};function o(e,o={}){let{items:s=[],...c}=o,l=null,u=0,d=!1,f=null,p=null,m=[],h=new Set,g=new Map,_=()=>{let e=document.createElement(`canvas`);return e.setAttribute(`aria-hidden`,`true`),e.style.display=`block`,v(e),e},v=e=>{e.style.width=c.width===void 0?`100%`:`${c.width}px`,e.style.height=c.height===void 0?`100%`:`${c.height}px`},y=_(),b=y;e.appendChild(y);let x=()=>{if(p?.(),p=null,d||!l)return;let t=c.width??e.clientWidth,n=c.height??e.clientHeight;t>0&&n>0&&l.render({width:t,height:n,dpr:c.pixelRatio??(typeof devicePixelRatio==`number`?devicePixelRatio:1),items:a(s,e)});let r=l.kind,i=m;m=[],i.forEach(({resolve:e})=>e(r))},S=()=>{d||p||(p=i(x))},C=()=>{let t=++u;n.createIconBackend(c.renderer,()=>{if(b){let e=b;return b=null,e}return _()},e=>{if(d||l?.kind!==e)return;let t=(g.get(e)??0)+1;g.set(e,t),t>=2&&h.add(e),C()},h).then(n=>{if(d||t!==u){n?.destroy();return}if(l?.destroy(),l=n,!n){let e=m;m=[],e.forEach(({reject:e})=>e(Error(`No icon renderer could start`)));return}n.canvas!==y&&(v(n.canvas),y.parentNode===e?e.replaceChild(n.canvas,y):e.appendChild(n.canvas),y=n.canvas),e.dataset.renderer=n.kind,f!==n.kind&&(f=n.kind,c.onRendererChange?.(n.kind)),x()})},w=t.subscribeDefaultIconRenderer(()=>{(!c.renderer||c.renderer===`auto`)&&C()}),T=r.observeTheme(S),E=typeof ResizeObserver==`function`?new ResizeObserver(S):null;return E?.observe(e),C(),{get renderer(){return l?.kind??null},get canvas(){return y},setItems(e){s=e,S()},setOptions(e){let t=`renderer`in e&&(e.renderer??`auto`)!==(c.renderer??`auto`);c={...c,...e},v(y),t?C():S()},render:x,ready(){return d?Promise.reject(Error(`Icon canvas destroyed`)):new Promise((e,t)=>{m.push({resolve:e,reject:t}),l&&S()})},destroy(){d||(d=!0,p?.(),w(),T(),E?.disconnect(),l?.destroy(),l=null,y.remove(),delete e.dataset.renderer)}}}exports.createIconCanvas=o,exports.frameItems=a;
2
+ //# sourceMappingURL=icon-canvas.cjs.map