@hotmeshio/long-tail 0.30.5 → 0.31.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (373) hide show
  1. package/build/api/labels/errors.d.ts +3 -0
  2. package/build/api/labels/errors.js +15 -0
  3. package/build/api/labels/index.d.ts +2 -0
  4. package/build/api/labels/index.js +17 -0
  5. package/build/api/labels/issue.d.ts +54 -0
  6. package/build/api/labels/issue.js +144 -0
  7. package/build/api/labels/templates.d.ts +29 -0
  8. package/build/api/labels/templates.js +98 -0
  9. package/build/api/users.d.ts +8 -4
  10. package/build/api/users.js +51 -13
  11. package/build/index.d.ts +1 -0
  12. package/build/index.js +4 -2
  13. package/build/lib/db/schemas/044_label_sheets.sql +65 -0
  14. package/build/lib/db/schemas/045_label_job_delivery.sql +14 -0
  15. package/build/lib/labels/transports.d.ts +23 -0
  16. package/build/lib/labels/transports.js +39 -0
  17. package/build/modules/auth.d.ts +2 -0
  18. package/build/modules/auth.js +3 -1
  19. package/build/modules/capabilities.d.ts +5 -1
  20. package/build/modules/capabilities.js +38 -8
  21. package/build/modules/config.d.ts +10 -0
  22. package/build/modules/config.js +10 -0
  23. package/build/routes/index.js +2 -0
  24. package/build/routes/labels.d.ts +2 -0
  25. package/build/routes/labels.js +135 -0
  26. package/build/routes/users.js +1 -1
  27. package/build/scripts/bambu-boat.d.ts +4 -2
  28. package/build/scripts/bambu-boat.js +4 -2
  29. package/build/scripts/bambu-print.d.ts +2 -1
  30. package/build/scripts/bambu-print.js +7 -3
  31. package/build/scripts/machine-line.js +2 -1
  32. package/build/services/labels/content.d.ts +13 -0
  33. package/build/services/labels/content.js +81 -0
  34. package/build/services/labels/errors.d.ts +5 -0
  35. package/build/services/labels/errors.js +12 -0
  36. package/build/services/labels/index.d.ts +11 -0
  37. package/build/services/labels/index.js +52 -0
  38. package/build/services/labels/issue.d.ts +38 -0
  39. package/build/services/labels/issue.js +181 -0
  40. package/build/services/labels/jobs.d.ts +37 -0
  41. package/build/services/labels/jobs.js +75 -0
  42. package/build/services/labels/media.d.ts +11 -0
  43. package/build/services/labels/media.js +44 -0
  44. package/build/services/labels/reissue.d.ts +13 -0
  45. package/build/services/labels/reissue.js +65 -0
  46. package/build/services/labels/render-pdf.d.ts +11 -0
  47. package/build/services/labels/render-pdf.js +138 -0
  48. package/build/services/labels/targets.d.ts +18 -0
  49. package/build/services/labels/targets.js +216 -0
  50. package/build/services/labels/templates/index.d.ts +3 -0
  51. package/build/services/labels/templates/index.js +18 -0
  52. package/build/services/labels/templates/read.d.ts +4 -0
  53. package/build/services/labels/templates/read.js +36 -0
  54. package/build/services/labels/templates/sql.d.ts +8 -0
  55. package/build/services/labels/templates/sql.js +50 -0
  56. package/build/services/labels/templates/validate.d.ts +19 -0
  57. package/build/services/labels/templates/validate.js +93 -0
  58. package/build/services/labels/templates/write.d.ts +16 -0
  59. package/build/services/labels/templates/write.js +75 -0
  60. package/build/services/labels/token.d.ts +9 -0
  61. package/build/services/labels/token.js +28 -0
  62. package/build/services/labels/verify.d.ts +4 -0
  63. package/build/services/labels/verify.js +38 -0
  64. package/build/services/scan-code/validate.d.ts +3 -0
  65. package/build/services/scan-code/validate.js +10 -0
  66. package/build/services/user/crud.d.ts +13 -1
  67. package/build/services/user/crud.js +42 -11
  68. package/build/services/user/index.d.ts +3 -2
  69. package/build/services/user/index.js +7 -1
  70. package/build/services/user/redact.d.ts +17 -0
  71. package/build/services/user/redact.js +32 -0
  72. package/build/services/user/sql.d.ts +8 -15
  73. package/build/services/user/sql.js +27 -3
  74. package/build/services/user/types.d.ts +21 -1
  75. package/build/shared/labels/compose.d.ts +12 -0
  76. package/build/shared/labels/compose.js +43 -0
  77. package/build/shared/labels/index.d.ts +9 -0
  78. package/build/shared/labels/index.js +54 -0
  79. package/build/shared/labels/label-content.d.ts +17 -0
  80. package/build/shared/labels/label-content.js +137 -0
  81. package/build/shared/labels/layout.d.ts +23 -0
  82. package/build/shared/labels/layout.js +81 -0
  83. package/build/shared/labels/media.d.ts +22 -0
  84. package/build/shared/labels/media.js +116 -0
  85. package/build/shared/labels/render-svg.d.ts +10 -0
  86. package/build/shared/labels/render-svg.js +58 -0
  87. package/build/shared/labels/render-zpl.d.ts +9 -0
  88. package/build/shared/labels/render-zpl.js +63 -0
  89. package/build/shared/labels/symbol.d.ts +18 -0
  90. package/build/shared/labels/symbol.js +74 -0
  91. package/build/shared/labels/tokens.d.ts +18 -0
  92. package/build/shared/labels/tokens.js +43 -0
  93. package/build/shared/labels/types.d.ts +105 -0
  94. package/build/shared/labels/types.js +11 -0
  95. package/build/start/adapters.js +16 -0
  96. package/build/start/workers.js +18 -2
  97. package/build/system/mcp-servers/admin/index.js +2 -0
  98. package/build/system/mcp-servers/admin/labels-schemas.d.ts +192 -0
  99. package/build/system/mcp-servers/admin/labels-schemas.js +46 -0
  100. package/build/system/mcp-servers/admin/labels.d.ts +9 -0
  101. package/build/system/mcp-servers/admin/labels.js +101 -0
  102. package/build/system/mcp-servers/admin/schemas.d.ts +30 -30
  103. package/build/system/mcp-servers/admin/users.js +1 -1
  104. package/build/system/seed/tool-manifests-admin.js +5 -0
  105. package/build/tsconfig.tsbuildinfo +1 -1
  106. package/build/types/capability.d.ts +2 -1
  107. package/build/types/index.d.ts +2 -1
  108. package/build/types/labels/index.d.ts +4 -0
  109. package/build/types/labels/index.js +2 -0
  110. package/build/types/labels/job.d.ts +51 -0
  111. package/build/types/labels/job.js +2 -0
  112. package/build/types/labels/source.d.ts +44 -0
  113. package/build/types/labels/source.js +2 -0
  114. package/build/types/labels/template.d.ts +46 -0
  115. package/build/types/labels/template.js +2 -0
  116. package/build/types/labels/transport.d.ts +24 -0
  117. package/build/types/labels/transport.js +2 -0
  118. package/build/types/scan-code/rule.d.ts +5 -0
  119. package/build/types/startup.d.ts +37 -0
  120. package/build/types/user.d.ts +2 -0
  121. package/dashboard/dist/assets/{AdminDashboard-D12QiMM5.js → AdminDashboard-BafKaq50.js} +2 -2
  122. package/dashboard/dist/assets/{AdminDashboard-D12QiMM5.js.map → AdminDashboard-BafKaq50.js.map} +1 -1
  123. package/dashboard/dist/assets/{AgentConfigPage-BKQd9b8m.js → AgentConfigPage-CFHf31DT.js} +6 -6
  124. package/dashboard/dist/assets/{AgentConfigPage-BKQd9b8m.js.map → AgentConfigPage-CFHf31DT.js.map} +1 -1
  125. package/dashboard/dist/assets/{AgentDetailPage-ie-DxsIj.js → AgentDetailPage-CEvz5rJr.js} +3 -3
  126. package/dashboard/dist/assets/{AgentDetailPage-ie-DxsIj.js.map → AgentDetailPage-CEvz5rJr.js.map} +1 -1
  127. package/dashboard/dist/assets/{AgentsPage-Nqm2DxCP.js → AgentsPage-DjQaio0O.js} +2 -2
  128. package/dashboard/dist/assets/{AgentsPage-Nqm2DxCP.js.map → AgentsPage-DjQaio0O.js.map} +1 -1
  129. package/dashboard/dist/assets/AvailableEscalationsPage-UB03VTJx.js +2 -0
  130. package/dashboard/dist/assets/AvailableEscalationsPage-UB03VTJx.js.map +1 -0
  131. package/dashboard/dist/assets/{BotPicker-BizdmeJp.js → BotPicker-C7MNWOF7.js} +2 -2
  132. package/dashboard/dist/assets/{BotPicker-BizdmeJp.js.map → BotPicker-C7MNWOF7.js.map} +1 -1
  133. package/dashboard/dist/assets/BulkAssignModal-h5fX-_cV.js +2 -0
  134. package/dashboard/dist/assets/{BulkAssignModal-BWfzPrRk.js.map → BulkAssignModal-h5fX-_cV.js.map} +1 -1
  135. package/dashboard/dist/assets/{CapabilitiesPage-DT8q7Zlh.js → CapabilitiesPage-BIzDl-ZT.js} +2 -2
  136. package/dashboard/dist/assets/{CapabilitiesPage-DT8q7Zlh.js.map → CapabilitiesPage-BIzDl-ZT.js.map} +1 -1
  137. package/dashboard/dist/assets/{CollapsibleSection-al5mqR4O.js → CollapsibleSection-B5TivtEg.js} +2 -2
  138. package/dashboard/dist/assets/{CollapsibleSection-al5mqR4O.js.map → CollapsibleSection-B5TivtEg.js.map} +1 -1
  139. package/dashboard/dist/assets/{ConfirmDeleteModal-BrlVktv2.js → ConfirmDeleteModal-CB4nKePb.js} +2 -2
  140. package/dashboard/dist/assets/{ConfirmDeleteModal-BrlVktv2.js.map → ConfirmDeleteModal-CB4nKePb.js.map} +1 -1
  141. package/dashboard/dist/assets/{ConnectedAppsPage-CLAsJ2yQ.js → ConnectedAppsPage-B3S5gVWw.js} +2 -2
  142. package/dashboard/dist/assets/{ConnectedAppsPage-CLAsJ2yQ.js.map → ConnectedAppsPage-B3S5gVWw.js.map} +1 -1
  143. package/dashboard/dist/assets/{CountdownTimer-D2D68exl.js → CountdownTimer-BHVIq3kA.js} +2 -2
  144. package/dashboard/dist/assets/{CountdownTimer-D2D68exl.js.map → CountdownTimer-BHVIq3kA.js.map} +1 -1
  145. package/dashboard/dist/assets/CredentialConfirmModal-w0AGmCIe.js +2 -0
  146. package/dashboard/dist/assets/CredentialConfirmModal-w0AGmCIe.js.map +1 -0
  147. package/dashboard/dist/assets/{CredentialsPage-DWrZbEI0.js → CredentialsPage-BtCGBJrT.js} +2 -2
  148. package/dashboard/dist/assets/{CredentialsPage-DWrZbEI0.js.map → CredentialsPage-BtCGBJrT.js.map} +1 -1
  149. package/dashboard/dist/assets/{CronLabel-DuXR8iWq.js → CronLabel-BG1rZK-5.js} +2 -2
  150. package/dashboard/dist/assets/{CronLabel-DuXR8iWq.js.map → CronLabel-BG1rZK-5.js.map} +1 -1
  151. package/dashboard/dist/assets/{DropZone-DefYTYQy.js → DropZone-D8ZVdEb5.js} +2 -2
  152. package/dashboard/dist/assets/{DropZone-DefYTYQy.js.map → DropZone-D8ZVdEb5.js.map} +1 -1
  153. package/dashboard/dist/assets/{ElapsedCell-ronqG5-E.js → ElapsedCell-l4m8Yvfv.js} +2 -2
  154. package/dashboard/dist/assets/{ElapsedCell-ronqG5-E.js.map → ElapsedCell-l4m8Yvfv.js.map} +1 -1
  155. package/dashboard/dist/assets/{EntityTimelinePanel-CKsktd84.js → EntityTimelinePanel-BOHlIaxF.js} +2 -2
  156. package/dashboard/dist/assets/{EntityTimelinePanel-CKsktd84.js.map → EntityTimelinePanel-BOHlIaxF.js.map} +1 -1
  157. package/dashboard/dist/assets/{EscalationListSchemaPage-C954ngy3.js → EscalationListSchemaPage-BotlwlX3.js} +3 -3
  158. package/dashboard/dist/assets/{EscalationListSchemaPage-C954ngy3.js.map → EscalationListSchemaPage-BotlwlX3.js.map} +1 -1
  159. package/dashboard/dist/assets/{EscalationSchemaPage-Dij9K0ON.js → EscalationSchemaPage-CfZSVOSD.js} +3 -3
  160. package/dashboard/dist/assets/{EscalationSchemaPage-Dij9K0ON.js.map → EscalationSchemaPage-CfZSVOSD.js.map} +1 -1
  161. package/dashboard/dist/assets/{EscalationTimeline-DT2Owdl0.js → EscalationTimeline-CCKpuRBU.js} +2 -2
  162. package/dashboard/dist/assets/{EscalationTimeline-DT2Owdl0.js.map → EscalationTimeline-CCKpuRBU.js.map} +1 -1
  163. package/dashboard/dist/assets/{EscalationTitleSelect-BdbfMA98.js → EscalationTitleSelect-cpTzPHiW.js} +2 -2
  164. package/dashboard/dist/assets/{EscalationTitleSelect-BdbfMA98.js.map → EscalationTitleSelect-cpTzPHiW.js.map} +1 -1
  165. package/dashboard/dist/assets/{EscalationsOverview-niahs84P.js → EscalationsOverview-DS-nK0qV.js} +2 -2
  166. package/dashboard/dist/assets/{EscalationsOverview-niahs84P.js.map → EscalationsOverview-DS-nK0qV.js.map} +1 -1
  167. package/dashboard/dist/assets/{EventTable-DuLMBrSx.js → EventTable-UfebhJf0.js} +2 -2
  168. package/dashboard/dist/assets/{EventTable-DuLMBrSx.js.map → EventTable-UfebhJf0.js.map} +1 -1
  169. package/dashboard/dist/assets/{FilterBar-jtY6KNpL.js → FilterBar-newA5l-X.js} +2 -2
  170. package/dashboard/dist/assets/{FilterBar-jtY6KNpL.js.map → FilterBar-newA5l-X.js.map} +1 -1
  171. package/dashboard/dist/assets/{GraphInvokePage-DSRAI0Zt.js → GraphInvokePage-6SCDyQcK.js} +2 -2
  172. package/dashboard/dist/assets/{GraphInvokePage-DSRAI0Zt.js.map → GraphInvokePage-6SCDyQcK.js.map} +1 -1
  173. package/dashboard/dist/assets/HomePage-BEc-XdKj.js +2 -0
  174. package/dashboard/dist/assets/{HomePage-BUlSnCg8.js.map → HomePage-BEc-XdKj.js.map} +1 -1
  175. package/dashboard/dist/assets/LabelJobsPage-BO50zXT5.js +2 -0
  176. package/dashboard/dist/assets/LabelJobsPage-BO50zXT5.js.map +1 -0
  177. package/dashboard/dist/assets/{LinePage-BJKhVM9Y.js → LinePage-NYxJQ-ex.js} +3 -3
  178. package/dashboard/dist/assets/{LinePage-BJKhVM9Y.js.map → LinePage-NYxJQ-ex.js.map} +1 -1
  179. package/dashboard/dist/assets/{LinesPage-CrpJua3_.js → LinesPage-RbWTaQRh.js} +3 -3
  180. package/dashboard/dist/assets/{LinesPage-CrpJua3_.js.map → LinesPage-RbWTaQRh.js.map} +1 -1
  181. package/dashboard/dist/assets/{ListToolbar-BN0UPt0L.js → ListToolbar-B-E9-toh.js} +2 -2
  182. package/dashboard/dist/assets/{ListToolbar-BN0UPt0L.js.map → ListToolbar-B-E9-toh.js.map} +1 -1
  183. package/dashboard/dist/assets/{McpOverview-BgbJXYPh.js → McpOverview-Shcf9QhZ.js} +2 -2
  184. package/dashboard/dist/assets/{McpOverview-BgbJXYPh.js.map → McpOverview-Shcf9QhZ.js.map} +1 -1
  185. package/dashboard/dist/assets/{McpQueryDetailPage-BNjm2nrc.js → McpQueryDetailPage-D8kmjy2v.js} +3 -3
  186. package/dashboard/dist/assets/{McpQueryDetailPage-BNjm2nrc.js.map → McpQueryDetailPage-D8kmjy2v.js.map} +1 -1
  187. package/dashboard/dist/assets/{McpQueryPage-DplR8wP9.js → McpQueryPage-ck-o5m8A.js} +2 -2
  188. package/dashboard/dist/assets/{McpQueryPage-DplR8wP9.js.map → McpQueryPage-ck-o5m8A.js.map} +1 -1
  189. package/dashboard/dist/assets/McpRunDetailPage-BJKkM9-3.js +2 -0
  190. package/dashboard/dist/assets/{McpRunDetailPage-BHVEcKV5.js.map → McpRunDetailPage-BJKkM9-3.js.map} +1 -1
  191. package/dashboard/dist/assets/{McpRunsPage-CtlLagcs.js → McpRunsPage-DqhHfD5G.js} +2 -2
  192. package/dashboard/dist/assets/{McpRunsPage-CtlLagcs.js.map → McpRunsPage-DqhHfD5G.js.map} +1 -1
  193. package/dashboard/dist/assets/{NamespacePill-CeSfHH-j.js → NamespacePill--uIaGtrN.js} +2 -2
  194. package/dashboard/dist/assets/{NamespacePill-CeSfHH-j.js.map → NamespacePill--uIaGtrN.js.map} +1 -1
  195. package/dashboard/dist/assets/{OperationsPage-DH67bcW9.js → OperationsPage-D6B9Vv__.js} +3 -3
  196. package/dashboard/dist/assets/{OperationsPage-DH67bcW9.js.map → OperationsPage-D6B9Vv__.js.map} +1 -1
  197. package/dashboard/dist/assets/OperatorDashboard-CIH1cxjQ.js +2 -0
  198. package/dashboard/dist/assets/{OperatorDashboard-CMkgMewd.js.map → OperatorDashboard-CIH1cxjQ.js.map} +1 -1
  199. package/dashboard/dist/assets/{PageHeader-DiGWAQlR.js → PageHeader-DClJ33fV.js} +2 -2
  200. package/dashboard/dist/assets/{PageHeader-DiGWAQlR.js.map → PageHeader-DClJ33fV.js.map} +1 -1
  201. package/dashboard/dist/assets/{PageHeaderWithStats-DwnKQ06j.js → PageHeaderWithStats-C-TrbKQL.js} +2 -2
  202. package/dashboard/dist/assets/{PageHeaderWithStats-DwnKQ06j.js.map → PageHeaderWithStats-C-TrbKQL.js.map} +1 -1
  203. package/dashboard/dist/assets/PersonaDetailPage-DjvfyIph.js +2 -0
  204. package/dashboard/dist/assets/{PersonaDetailPage-Cs1FFdNq.js.map → PersonaDetailPage-DjvfyIph.js.map} +1 -1
  205. package/dashboard/dist/assets/{PersonasPage-CHTRdneF.js → PersonasPage-D7ryA8Vc.js} +2 -2
  206. package/dashboard/dist/assets/{PersonasPage-CHTRdneF.js.map → PersonasPage-D7ryA8Vc.js.map} +1 -1
  207. package/dashboard/dist/assets/{PortalPage-ChB5pBTZ.js → PortalPage-D3ybr0mo.js} +2 -2
  208. package/dashboard/dist/assets/{PortalPage-ChB5pBTZ.js.map → PortalPage-D3ybr0mo.js.map} +1 -1
  209. package/dashboard/dist/assets/PrintLabelsPanel-D0HF5x8b.js +2 -0
  210. package/dashboard/dist/assets/PrintLabelsPanel-D0HF5x8b.js.map +1 -0
  211. package/dashboard/dist/assets/{ProcessDetailPage-CzyqSfal.js → ProcessDetailPage-0xS9EdHe.js} +2 -2
  212. package/dashboard/dist/assets/{ProcessDetailPage-CzyqSfal.js.map → ProcessDetailPage-0xS9EdHe.js.map} +1 -1
  213. package/dashboard/dist/assets/{ProcessesListPage-rOwNkaU9.js → ProcessesListPage-93SMj1Fd.js} +2 -2
  214. package/dashboard/dist/assets/{ProcessesListPage-rOwNkaU9.js.map → ProcessesListPage-93SMj1Fd.js.map} +1 -1
  215. package/dashboard/dist/assets/{ResolverForm-DibnlZ-A.js → ResolverForm-DfogHDzl.js} +5 -5
  216. package/dashboard/dist/assets/{ResolverForm-DibnlZ-A.js.map → ResolverForm-DfogHDzl.js.map} +1 -1
  217. package/dashboard/dist/assets/{RoleDetailPage-Bv9R7iQC.js → RoleDetailPage-DlUOJWSB.js} +3 -3
  218. package/dashboard/dist/assets/{RoleDetailPage-Bv9R7iQC.js.map → RoleDetailPage-DlUOJWSB.js.map} +1 -1
  219. package/dashboard/dist/assets/{RolePill-D3hkAdKf.js → RolePill-BjD1Qw5y.js} +2 -2
  220. package/dashboard/dist/assets/{RolePill-D3hkAdKf.js.map → RolePill-BjD1Qw5y.js.map} +1 -1
  221. package/dashboard/dist/assets/RolesPage-DqhHSvaw.js +2 -0
  222. package/dashboard/dist/assets/{RolesPage-CUP7EH5U.js.map → RolesPage-DqhHSvaw.js.map} +1 -1
  223. package/dashboard/dist/assets/{RosterWidget-DZtmQcjU.js → RosterWidget-BrIq61HR.js} +2 -2
  224. package/dashboard/dist/assets/{RosterWidget-DZtmQcjU.js.map → RosterWidget-BrIq61HR.js.map} +1 -1
  225. package/dashboard/dist/assets/RunAsSelector-D6zQrCNr.js +2 -0
  226. package/dashboard/dist/assets/{RunAsSelector-B9-1vgZr.js.map → RunAsSelector-D6zQrCNr.js.map} +1 -1
  227. package/dashboard/dist/assets/ScanCodesPage-B2S9DR2f.js +2 -0
  228. package/dashboard/dist/assets/{ScanCodesPage-KN_e2rJl.js.map → ScanCodesPage-B2S9DR2f.js.map} +1 -1
  229. package/dashboard/dist/assets/ScanSchemeDetailPage-gpxKN-pL.js +5 -0
  230. package/dashboard/dist/assets/ScanSchemeDetailPage-gpxKN-pL.js.map +1 -0
  231. package/dashboard/dist/assets/ScanStationPage-B-UTgXsG.js +2 -0
  232. package/dashboard/dist/assets/{ScanStationPage-B0qbUOwc.js.map → ScanStationPage-B-UTgXsG.js.map} +1 -1
  233. package/dashboard/dist/assets/{SchemeMatchFields-CL7TKnw3.js → SchemeMatchFields-BK24aa7K.js} +2 -2
  234. package/dashboard/dist/assets/{SchemeMatchFields-CL7TKnw3.js.map → SchemeMatchFields-BK24aa7K.js.map} +1 -1
  235. package/dashboard/dist/assets/{ScopeBadge-DGz79rmG.js → ScopeBadge-ofLQ6HW-.js} +2 -2
  236. package/dashboard/dist/assets/{ScopeBadge-DGz79rmG.js.map → ScopeBadge-ofLQ6HW-.js.map} +1 -1
  237. package/dashboard/dist/assets/{StickyPagination-CUwxfBQH.js → StickyPagination-CgVv7vc_.js} +2 -2
  238. package/dashboard/dist/assets/{StickyPagination-CUwxfBQH.js.map → StickyPagination-CgVv7vc_.js.map} +1 -1
  239. package/dashboard/dist/assets/{StreamMessageDetail-DOjcO7d2.js → StreamMessageDetail-B9sxDVw4.js} +2 -2
  240. package/dashboard/dist/assets/{StreamMessageDetail-DOjcO7d2.js.map → StreamMessageDetail-B9sxDVw4.js.map} +1 -1
  241. package/dashboard/dist/assets/{SwimlaneTimeline-SPMpoLHP.js → SwimlaneTimeline-DQc0CYSL.js} +2 -2
  242. package/dashboard/dist/assets/{SwimlaneTimeline-SPMpoLHP.js.map → SwimlaneTimeline-DQc0CYSL.js.map} +1 -1
  243. package/dashboard/dist/assets/{TagInput-DaIdhv3h.js → TagInput-47qVYzke.js} +2 -2
  244. package/dashboard/dist/assets/{TagInput-DaIdhv3h.js.map → TagInput-47qVYzke.js.map} +1 -1
  245. package/dashboard/dist/assets/{TaskDetailPage-DvfzR2IQ.js → TaskDetailPage-D6VOsA1f.js} +2 -2
  246. package/dashboard/dist/assets/{TaskDetailPage-DvfzR2IQ.js.map → TaskDetailPage-D6VOsA1f.js.map} +1 -1
  247. package/dashboard/dist/assets/{TaskQueuePill-sUA1nZe-.js → TaskQueuePill-C5KmdXAl.js} +2 -2
  248. package/dashboard/dist/assets/{TaskQueuePill-sUA1nZe-.js.map → TaskQueuePill-C5KmdXAl.js.map} +1 -1
  249. package/dashboard/dist/assets/{TasksListPage-Jp6wmL7t.js → TasksListPage-DG8hvO8G.js} +2 -2
  250. package/dashboard/dist/assets/{TasksListPage-Jp6wmL7t.js.map → TasksListPage-DG8hvO8G.js.map} +1 -1
  251. package/dashboard/dist/assets/{TimeAgo-BCQA0Gb_.js → TimeAgo-CL02EhFi.js} +2 -2
  252. package/dashboard/dist/assets/{TimeAgo-BCQA0Gb_.js.map → TimeAgo-CL02EhFi.js.map} +1 -1
  253. package/dashboard/dist/assets/{TimestampCell-xhdMHDQt.js → TimestampCell-BE7oKVJg.js} +2 -2
  254. package/dashboard/dist/assets/{TimestampCell-xhdMHDQt.js.map → TimestampCell-BE7oKVJg.js.map} +1 -1
  255. package/dashboard/dist/assets/{ToolPill-CpBAFdEX.js → ToolPill-Cp9Drk1s.js} +2 -2
  256. package/dashboard/dist/assets/{ToolPill-CpBAFdEX.js.map → ToolPill-Cp9Drk1s.js.map} +1 -1
  257. package/dashboard/dist/assets/{ToolTestPanel-D8M3ITrJ.js → ToolTestPanel-CRecLh6S.js} +2 -2
  258. package/dashboard/dist/assets/{ToolTestPanel-D8M3ITrJ.js.map → ToolTestPanel-CRecLh6S.js.map} +1 -1
  259. package/dashboard/dist/assets/{TopicDetailPage-DdBJQp31.js → TopicDetailPage-QzkinTfN.js} +3 -3
  260. package/dashboard/dist/assets/{TopicDetailPage-DdBJQp31.js.map → TopicDetailPage-QzkinTfN.js.map} +1 -1
  261. package/dashboard/dist/assets/{TopicsPage-vpvsynD9.js → TopicsPage-D8dW6J65.js} +2 -2
  262. package/dashboard/dist/assets/{TopicsPage-vpvsynD9.js.map → TopicsPage-D8dW6J65.js.map} +1 -1
  263. package/dashboard/dist/assets/{UserName-BK6Lzsdw.js → UserName-Dw3R_zrl.js} +2 -2
  264. package/dashboard/dist/assets/{UserName-BK6Lzsdw.js.map → UserName-Dw3R_zrl.js.map} +1 -1
  265. package/dashboard/dist/assets/WorkflowExecutionPage-BTocv8or.js +2 -0
  266. package/dashboard/dist/assets/{WorkflowExecutionPage-DkM1TS4I.js.map → WorkflowExecutionPage-BTocv8or.js.map} +1 -1
  267. package/dashboard/dist/assets/{WorkflowPill-CKHip3hH.js → WorkflowPill-BiLYq__w.js} +2 -2
  268. package/dashboard/dist/assets/{WorkflowPill-CKHip3hH.js.map → WorkflowPill-BiLYq__w.js.map} +1 -1
  269. package/dashboard/dist/assets/WorkflowsDashboard-CIPEt3et.js +2 -0
  270. package/dashboard/dist/assets/{WorkflowsDashboard-g_N4y3QS.js.map → WorkflowsDashboard-CIPEt3et.js.map} +1 -1
  271. package/dashboard/dist/assets/{WorkflowsOverview-Drjo-Lu-.js → WorkflowsOverview-Bj4MJIE-.js} +2 -2
  272. package/dashboard/dist/assets/{WorkflowsOverview-Drjo-Lu-.js.map → WorkflowsOverview-Bj4MJIE-.js.map} +1 -1
  273. package/dashboard/dist/assets/{YamlWorkflowDetailPage-CLltNHjZ.js → YamlWorkflowDetailPage-DMEk5k9-.js} +2 -2
  274. package/dashboard/dist/assets/{YamlWorkflowDetailPage-CLltNHjZ.js.map → YamlWorkflowDetailPage-DMEk5k9-.js.map} +1 -1
  275. package/dashboard/dist/assets/{YamlWorkflowsPage-CxQCB-Zi.js → YamlWorkflowsPage-F2yyyoiB.js} +2 -2
  276. package/dashboard/dist/assets/{YamlWorkflowsPage-CxQCB-Zi.js.map → YamlWorkflowsPage-F2yyyoiB.js.map} +1 -1
  277. package/dashboard/dist/assets/{agents-Dk25jjhj.js → agents-mSgxEPpI.js} +2 -2
  278. package/dashboard/dist/assets/{agents-Dk25jjhj.js.map → agents-mSgxEPpI.js.map} +1 -1
  279. package/dashboard/dist/assets/{bots-bRkCqhlq.js → bots-p4Hp0CV6.js} +2 -2
  280. package/dashboard/dist/assets/{bots-bRkCqhlq.js.map → bots-p4Hp0CV6.js.map} +1 -1
  281. package/dashboard/dist/assets/{capabilities-DARawLry.js → capabilities-D_-I_SXR.js} +2 -2
  282. package/dashboard/dist/assets/{capabilities-DARawLry.js.map → capabilities-D_-I_SXR.js.map} +1 -1
  283. package/dashboard/dist/assets/{controlplane-DKccxxs6.js → controlplane-DjdoQnRU.js} +2 -2
  284. package/dashboard/dist/assets/{controlplane-DKccxxs6.js.map → controlplane-DjdoQnRU.js.map} +1 -1
  285. package/dashboard/dist/assets/{escalation-columns-BaYuzMYf.js → escalation-columns-R_IEVQjQ.js} +2 -2
  286. package/dashboard/dist/assets/{escalation-columns-BaYuzMYf.js.map → escalation-columns-R_IEVQjQ.js.map} +1 -1
  287. package/dashboard/dist/assets/{escalation-items-CwbNFnsH.js → escalation-items-BGZlJMpk.js} +2 -2
  288. package/dashboard/dist/assets/{escalation-items-CwbNFnsH.js.map → escalation-items-BGZlJMpk.js.map} +1 -1
  289. package/dashboard/dist/assets/{index-Cf6qCgTf.js → index-BEMdD58x.js} +2 -2
  290. package/dashboard/dist/assets/{index-Cf6qCgTf.js.map → index-BEMdD58x.js.map} +1 -1
  291. package/dashboard/dist/assets/index-BUmz0NMg.css +1 -0
  292. package/dashboard/dist/assets/{index-hKOlahpE.js → index-BuCEhhnl.js} +2 -2
  293. package/dashboard/dist/assets/{index-hKOlahpE.js.map → index-BuCEhhnl.js.map} +1 -1
  294. package/dashboard/dist/assets/{index-D1uliPqS.js → index-BxbQmeqh.js} +2 -2
  295. package/dashboard/dist/assets/{index-D1uliPqS.js.map → index-BxbQmeqh.js.map} +1 -1
  296. package/dashboard/dist/assets/index-C5osluV3.js +2 -0
  297. package/dashboard/dist/assets/{index-CtrSYqmL.js.map → index-C5osluV3.js.map} +1 -1
  298. package/dashboard/dist/assets/{index-CU2UW2y6.js → index-C_dAJUzh.js} +25 -25
  299. package/dashboard/dist/assets/index-C_dAJUzh.js.map +1 -0
  300. package/dashboard/dist/assets/{index-Bx9HVzuT.js → index-D-FYj9jT.js} +2 -2
  301. package/dashboard/dist/assets/{index-Bx9HVzuT.js.map → index-D-FYj9jT.js.map} +1 -1
  302. package/dashboard/dist/assets/{index-BZgtzkkG.js → index-D6K_IgCz.js} +2 -2
  303. package/dashboard/dist/assets/{index-BZgtzkkG.js.map → index-D6K_IgCz.js.map} +1 -1
  304. package/dashboard/dist/assets/index-D7L_VoBD.js +2 -0
  305. package/dashboard/dist/assets/index-D7L_VoBD.js.map +1 -0
  306. package/dashboard/dist/assets/{index-DgpL_Lgc.js → index-D9RAN9sA.js} +2 -2
  307. package/dashboard/dist/assets/{index-DgpL_Lgc.js.map → index-D9RAN9sA.js.map} +1 -1
  308. package/dashboard/dist/assets/{index-dShcvdg3.js → index-DUYAGxwc.js} +2 -2
  309. package/dashboard/dist/assets/{index-dShcvdg3.js.map → index-DUYAGxwc.js.map} +1 -1
  310. package/dashboard/dist/assets/{index-E_hJ7vtX.js → index-Dk2KKo0z.js} +2 -2
  311. package/dashboard/dist/assets/{index-E_hJ7vtX.js.map → index-Dk2KKo0z.js.map} +1 -1
  312. package/dashboard/dist/assets/{index-DU2QCbgH.js → index-DlJkZ12b.js} +2 -2
  313. package/dashboard/dist/assets/{index-DU2QCbgH.js.map → index-DlJkZ12b.js.map} +1 -1
  314. package/dashboard/dist/assets/{index-kzifJWbM.js → index-FiNThtNU.js} +3 -3
  315. package/dashboard/dist/assets/{index-kzifJWbM.js.map → index-FiNThtNU.js.map} +1 -1
  316. package/dashboard/dist/assets/{knowledge-DOe5ks-E.js → knowledge-DSsPTqkK.js} +2 -2
  317. package/dashboard/dist/assets/{knowledge-DOe5ks-E.js.map → knowledge-DSsPTqkK.js.map} +1 -1
  318. package/dashboard/dist/assets/{machines-Zq_00v7k.js → machines-DSgGtqqr.js} +2 -2
  319. package/dashboard/dist/assets/{machines-Zq_00v7k.js.map → machines-DSgGtqqr.js.map} +1 -1
  320. package/dashboard/dist/assets/{mcp-BL8kD0oh.js → mcp-Cg-_uLw8.js} +2 -2
  321. package/dashboard/dist/assets/{mcp-BL8kD0oh.js.map → mcp-Cg-_uLw8.js.map} +1 -1
  322. package/dashboard/dist/assets/{mcp-query-BpokmJWi.js → mcp-query-DQombEK_.js} +2 -2
  323. package/dashboard/dist/assets/{mcp-query-BpokmJWi.js.map → mcp-query-DQombEK_.js.map} +1 -1
  324. package/dashboard/dist/assets/{personas-BubCnQZ8.js → personas-DYrcoVBu.js} +2 -2
  325. package/dashboard/dist/assets/{personas-BubCnQZ8.js.map → personas-DYrcoVBu.js.map} +1 -1
  326. package/dashboard/dist/assets/{pipelines--DUoMx7K.js → pipelines-wdb4xsey.js} +2 -2
  327. package/dashboard/dist/assets/{pipelines--DUoMx7K.js.map → pipelines-wdb4xsey.js.map} +1 -1
  328. package/dashboard/dist/assets/{tasks-CJXN4OB4.js → tasks-Bil7gvm9.js} +2 -2
  329. package/dashboard/dist/assets/{tasks-CJXN4OB4.js.map → tasks-Bil7gvm9.js.map} +1 -1
  330. package/dashboard/dist/assets/{topics-CAG08Ruo.js → topics-wBqaVhRR.js} +2 -2
  331. package/dashboard/dist/assets/{topics-CAG08Ruo.js.map → topics-wBqaVhRR.js.map} +1 -1
  332. package/dashboard/dist/assets/{useDebouncedValue-DQ2D8cm2.js → useDebouncedValue-CwrY8TpV.js} +2 -2
  333. package/dashboard/dist/assets/{useDebouncedValue-DQ2D8cm2.js.map → useDebouncedValue-CwrY8TpV.js.map} +1 -1
  334. package/dashboard/dist/assets/{useNamespace-DjEVAlJQ.js → useNamespace-Sod_xApz.js} +2 -2
  335. package/dashboard/dist/assets/{useNamespace-DjEVAlJQ.js.map → useNamespace-Sod_xApz.js.map} +1 -1
  336. package/dashboard/dist/assets/{useYamlActivityEvents-etcpfIwo.js → useYamlActivityEvents-CKLInV3C.js} +2 -2
  337. package/dashboard/dist/assets/{useYamlActivityEvents-etcpfIwo.js.map → useYamlActivityEvents-CKLInV3C.js.map} +1 -1
  338. package/dashboard/dist/assets/{validate-YJK_6a7m.js → validate-CYhW1xMJ.js} +2 -2
  339. package/dashboard/dist/assets/{validate-YJK_6a7m.js.map → validate-CYhW1xMJ.js.map} +1 -1
  340. package/dashboard/dist/assets/{vendor-icons-en0_uSRD.js → vendor-icons-ed7mYQw4.js} +2 -2
  341. package/dashboard/dist/assets/{vendor-icons-en0_uSRD.js.map → vendor-icons-ed7mYQw4.js.map} +1 -1
  342. package/dashboard/dist/assets/{yaml-workflows-D97Bz6li.js → yaml-workflows-C20qHo3L.js} +2 -2
  343. package/dashboard/dist/assets/{yaml-workflows-D97Bz6li.js.map → yaml-workflows-C20qHo3L.js.map} +1 -1
  344. package/dashboard/dist/index.html +3 -3
  345. package/docs/api/http/labels.md +115 -0
  346. package/docs/api/http/users.md +2 -0
  347. package/docs/api/mcp/admin.md +76 -1
  348. package/docs/code-owned-configuration.md +1 -1
  349. package/docs/iam.md +12 -0
  350. package/docs/label-sheets.md +267 -0
  351. package/docs/machines.md +2 -2
  352. package/docs/scan-codes.md +11 -5
  353. package/package.json +4 -1
  354. package/dashboard/dist/assets/AvailableEscalationsPage-BRKyG5qZ.js +0 -2
  355. package/dashboard/dist/assets/AvailableEscalationsPage-BRKyG5qZ.js.map +0 -1
  356. package/dashboard/dist/assets/BulkAssignModal-BWfzPrRk.js +0 -2
  357. package/dashboard/dist/assets/HomePage-BUlSnCg8.js +0 -2
  358. package/dashboard/dist/assets/McpRunDetailPage-BHVEcKV5.js +0 -2
  359. package/dashboard/dist/assets/OperatorDashboard-CMkgMewd.js +0 -2
  360. package/dashboard/dist/assets/PersonaDetailPage-Cs1FFdNq.js +0 -2
  361. package/dashboard/dist/assets/RolesPage-CUP7EH5U.js +0 -2
  362. package/dashboard/dist/assets/RunAsSelector-B9-1vgZr.js +0 -2
  363. package/dashboard/dist/assets/ScanCodesPage-KN_e2rJl.js +0 -2
  364. package/dashboard/dist/assets/ScanSchemeDetailPage-CqItQ67Y.js +0 -5
  365. package/dashboard/dist/assets/ScanSchemeDetailPage-CqItQ67Y.js.map +0 -1
  366. package/dashboard/dist/assets/ScanStationPage-B0qbUOwc.js +0 -2
  367. package/dashboard/dist/assets/WorkflowExecutionPage-DkM1TS4I.js +0 -2
  368. package/dashboard/dist/assets/WorkflowsDashboard-g_N4y3QS.js +0 -2
  369. package/dashboard/dist/assets/index-BmzscsXK.css +0 -1
  370. package/dashboard/dist/assets/index-CU2UW2y6.js.map +0 -1
  371. package/dashboard/dist/assets/index-CtrSYqmL.js +0 -2
  372. package/dashboard/dist/assets/index-DU-1gMks.js +0 -2
  373. package/dashboard/dist/assets/index-DU-1gMks.js.map +0 -1
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.ZplRenderError = exports.zplField = exports.renderSheetZpl = exports.escapeXml = exports.renderSheetSvg = exports.MAX_COPIES = exports.LabelLayoutError = exports.cutMarkSegments = exports.buildLabelSheet = exports.GLYPH_ADVANCE = exports.layoutLabelContent = exports.SymbolEncodeError = exports.quietZoneModules = exports.encodeSymbol = exports.slotsPerPage = exports.slotOrigin = exports.resolveMedia = exports.assertValidMedia = exports.LabelMediaError = exports.DEFAULT_LABEL_MEDIA_ID = exports.LABEL_MEDIA = exports.userTokenKeys = exports.unknownLabelTokens = exports.listLabelTokens = exports.renderLabelText = exports.ScanComposeError = exports.isMintableScheme = exports.composeScanCode = void 0;
18
+ __exportStar(require("./types"), exports);
19
+ var compose_1 = require("./compose");
20
+ Object.defineProperty(exports, "composeScanCode", { enumerable: true, get: function () { return compose_1.composeScanCode; } });
21
+ Object.defineProperty(exports, "isMintableScheme", { enumerable: true, get: function () { return compose_1.isMintableScheme; } });
22
+ Object.defineProperty(exports, "ScanComposeError", { enumerable: true, get: function () { return compose_1.ScanComposeError; } });
23
+ var tokens_1 = require("./tokens");
24
+ Object.defineProperty(exports, "renderLabelText", { enumerable: true, get: function () { return tokens_1.renderLabelText; } });
25
+ Object.defineProperty(exports, "listLabelTokens", { enumerable: true, get: function () { return tokens_1.listLabelTokens; } });
26
+ Object.defineProperty(exports, "unknownLabelTokens", { enumerable: true, get: function () { return tokens_1.unknownLabelTokens; } });
27
+ Object.defineProperty(exports, "userTokenKeys", { enumerable: true, get: function () { return tokens_1.userTokenKeys; } });
28
+ var media_1 = require("./media");
29
+ Object.defineProperty(exports, "LABEL_MEDIA", { enumerable: true, get: function () { return media_1.LABEL_MEDIA; } });
30
+ Object.defineProperty(exports, "DEFAULT_LABEL_MEDIA_ID", { enumerable: true, get: function () { return media_1.DEFAULT_LABEL_MEDIA_ID; } });
31
+ Object.defineProperty(exports, "LabelMediaError", { enumerable: true, get: function () { return media_1.LabelMediaError; } });
32
+ Object.defineProperty(exports, "assertValidMedia", { enumerable: true, get: function () { return media_1.assertValidMedia; } });
33
+ Object.defineProperty(exports, "resolveMedia", { enumerable: true, get: function () { return media_1.resolveMedia; } });
34
+ Object.defineProperty(exports, "slotOrigin", { enumerable: true, get: function () { return media_1.slotOrigin; } });
35
+ Object.defineProperty(exports, "slotsPerPage", { enumerable: true, get: function () { return media_1.slotsPerPage; } });
36
+ var symbol_1 = require("./symbol");
37
+ Object.defineProperty(exports, "encodeSymbol", { enumerable: true, get: function () { return symbol_1.encodeSymbol; } });
38
+ Object.defineProperty(exports, "quietZoneModules", { enumerable: true, get: function () { return symbol_1.quietZoneModules; } });
39
+ Object.defineProperty(exports, "SymbolEncodeError", { enumerable: true, get: function () { return symbol_1.SymbolEncodeError; } });
40
+ var label_content_1 = require("./label-content");
41
+ Object.defineProperty(exports, "layoutLabelContent", { enumerable: true, get: function () { return label_content_1.layoutLabelContent; } });
42
+ Object.defineProperty(exports, "GLYPH_ADVANCE", { enumerable: true, get: function () { return label_content_1.GLYPH_ADVANCE; } });
43
+ var layout_1 = require("./layout");
44
+ Object.defineProperty(exports, "buildLabelSheet", { enumerable: true, get: function () { return layout_1.buildLabelSheet; } });
45
+ Object.defineProperty(exports, "cutMarkSegments", { enumerable: true, get: function () { return layout_1.cutMarkSegments; } });
46
+ Object.defineProperty(exports, "LabelLayoutError", { enumerable: true, get: function () { return layout_1.LabelLayoutError; } });
47
+ Object.defineProperty(exports, "MAX_COPIES", { enumerable: true, get: function () { return layout_1.MAX_COPIES; } });
48
+ var render_svg_1 = require("./render-svg");
49
+ Object.defineProperty(exports, "renderSheetSvg", { enumerable: true, get: function () { return render_svg_1.renderSheetSvg; } });
50
+ Object.defineProperty(exports, "escapeXml", { enumerable: true, get: function () { return render_svg_1.escapeXml; } });
51
+ var render_zpl_1 = require("./render-zpl");
52
+ Object.defineProperty(exports, "renderSheetZpl", { enumerable: true, get: function () { return render_zpl_1.renderSheetZpl; } });
53
+ Object.defineProperty(exports, "zplField", { enumerable: true, get: function () { return render_zpl_1.zplField; } });
54
+ Object.defineProperty(exports, "ZplRenderError", { enumerable: true, get: function () { return render_zpl_1.ZplRenderError; } });
@@ -0,0 +1,17 @@
1
+ import type { LabelContent, LabelElement, LabelSymbology, LabelWarningKind } from './types';
2
+ export interface LabelContentOptions {
3
+ symbology: LabelSymbology;
4
+ humanReadable: boolean;
5
+ minModuleMm: number;
6
+ }
7
+ export interface LabelContentResult {
8
+ elements: LabelElement[];
9
+ warnings: {
10
+ kind: LabelWarningKind;
11
+ detail: string;
12
+ }[];
13
+ }
14
+ /** Average glyph advance as a fraction of the font size, for fitting text without font metrics. */
15
+ export declare const GLYPH_ADVANCE = 0.56;
16
+ /** Lay out one label's content inside a `width` × `height` box. */
17
+ export declare function layoutLabelContent(content: LabelContent, width: number, height: number, opts: LabelContentOptions): LabelContentResult;
@@ -0,0 +1,137 @@
1
+ "use strict";
2
+ // Lays out one label: title, lines, then one panel per code (caption band,
3
+ // symbol, readable code). Coordinates are millimetres from the label's corner.
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.GLYPH_ADVANCE = void 0;
6
+ exports.layoutLabelContent = layoutLabelContent;
7
+ const symbol_1 = require("./symbol");
8
+ /** Average glyph advance as a fraction of the font size, for fitting text without font metrics. */
9
+ exports.GLYPH_ADVANCE = 0.56;
10
+ const MIN_TEXT_MM = 1.6;
11
+ const MAX_LINEAR_MODULE_MM = 0.6;
12
+ const MAX_MATRIX_MODULE_MM = 1.4;
13
+ const MAX_BAR_HEIGHT_MM = 30;
14
+ const clamp = (n, lo, hi) => Math.min(hi, Math.max(lo, n));
15
+ /** The largest font size up to `size` at which `text` fits `width`, or null below the floor. */
16
+ function fitText(text, width, size) {
17
+ const fitted = Math.min(size, width / Math.max(1, text.length * exports.GLYPH_ADVANCE));
18
+ return fitted >= MIN_TEXT_MM ? fitted : null;
19
+ }
20
+ /** Text that fits `width` at the floor size, cut with an ellipsis. */
21
+ function truncateTo(text, width) {
22
+ const max = Math.max(1, Math.floor(width / (MIN_TEXT_MM * exports.GLYPH_ADVANCE)));
23
+ return text.length <= max ? text : `${text.slice(0, Math.max(1, max - 1))}…`;
24
+ }
25
+ function textRow(text, box, size, weight, out) {
26
+ let fitted = fitText(text, box.w, size);
27
+ let shown = text;
28
+ if (fitted === null) {
29
+ shown = truncateTo(text, box.w);
30
+ fitted = MIN_TEXT_MM;
31
+ out.warnings.push({ kind: 'overflow', detail: `"${text}" is too long for the label and was shortened` });
32
+ }
33
+ out.elements.push({ kind: 'text', x: box.x, y: box.y, w: box.w, size: fitted, text: shown, weight, align: 'center' });
34
+ return size * 1.2;
35
+ }
36
+ function planPanel(code, box, opts) {
37
+ const elements = [];
38
+ const gap = clamp(box.h * 0.04, 0.4, 1.5);
39
+ let y = box.y;
40
+ if (code.caption) {
41
+ const band = clamp(box.h * 0.2, 2.2, 7);
42
+ const size = Math.min(band * 0.62, box.w / Math.max(1, code.caption.length * exports.GLYPH_ADVANCE));
43
+ if (code.tone === 'solid')
44
+ elements.push({ kind: 'rect', x: box.x, y, w: box.w, h: band, fill: true });
45
+ if (code.tone === 'outline')
46
+ elements.push({ kind: 'rect', x: box.x, y, w: box.w, h: band, fill: false, stroke: clamp(band * 0.08, 0.2, 0.5) });
47
+ elements.push({
48
+ kind: 'text', x: box.x, y: y + (band - size) / 2, w: box.w, size: Math.max(size, MIN_TEXT_MM),
49
+ text: code.caption, weight: 'bold', align: 'center', inverse: code.tone === 'solid',
50
+ });
51
+ y += band + gap;
52
+ }
53
+ const readable = opts.humanReadable ? clamp(box.h * 0.1, 1.6, 3.2) : 0;
54
+ const symbolH = box.y + box.h - y - (readable ? readable + gap : 0);
55
+ const encoded = (0, symbol_1.encodeSymbol)(opts.symbology, code.code);
56
+ const quiet = (0, symbol_1.quietZoneModules)(opts.symbology);
57
+ const linear = opts.symbology === 'code128';
58
+ const moduleMm = linear
59
+ ? Math.min(MAX_LINEAR_MODULE_MM, box.w / (encoded.widthModules + 2 * quiet))
60
+ : Math.min(MAX_MATRIX_MODULE_MM, Math.min(box.w, symbolH) / (encoded.widthModules + 2 * quiet));
61
+ const w = encoded.widthModules * moduleMm;
62
+ const h = linear ? Math.min(symbolH, MAX_BAR_HEIGHT_MM) : encoded.heightModules * moduleMm;
63
+ elements.push({
64
+ kind: 'symbol', x: box.x + (box.w - w) / 2, y, w, h,
65
+ symbology: opts.symbology, data: code.code, moduleMm, path: encoded.path,
66
+ });
67
+ if (readable) {
68
+ elements.push({
69
+ kind: 'text', x: box.x, y: y + h + gap, w: box.w,
70
+ size: Math.max(MIN_TEXT_MM, Math.min(readable * 0.85, box.w / Math.max(1, code.code.length * exports.GLYPH_ADVANCE))),
71
+ text: code.code, weight: 'regular', align: 'center',
72
+ });
73
+ }
74
+ return { moduleMm, elements, quietOk: symbolH > 0 && w + 2 * quiet * moduleMm <= box.w + 1e-6 };
75
+ }
76
+ function planPanels(codes, area, across, opts) {
77
+ const n = codes.length;
78
+ const gap = clamp(Math.min(area.w, area.h) * 0.05, 0.8, 4);
79
+ return codes.map((code, i) => {
80
+ const box = across
81
+ ? { x: area.x + i * ((area.w - gap * (n - 1)) / n + gap), y: area.y, w: (area.w - gap * (n - 1)) / n, h: area.h }
82
+ : { x: area.x, y: area.y + i * ((area.h - gap * (n - 1)) / n + gap), w: area.w, h: (area.h - gap * (n - 1)) / n };
83
+ return planPanel(code, box, opts);
84
+ });
85
+ }
86
+ const smallest = (plans) => Math.min(...plans.map((p) => p.moduleMm));
87
+ /** Lay out one label's content inside a `width` × `height` box. */
88
+ function layoutLabelContent(content, width, height, opts) {
89
+ const out = { elements: [], warnings: [] };
90
+ const pad = clamp(Math.min(width, height) * 0.05, 1, 4);
91
+ const inner = { x: pad, y: pad, w: width - 2 * pad, h: height - 2 * pad };
92
+ let y = inner.y;
93
+ if (content.title) {
94
+ y += textRow(content.title, { ...inner, y }, clamp(inner.h * 0.15, 2.2, 10), 'bold', out);
95
+ }
96
+ const lineSize = clamp(inner.h * 0.09, 1.8, 6);
97
+ for (const line of content.lines.filter(Boolean)) {
98
+ y += textRow(line, { ...inner, y }, lineSize, 'regular', out);
99
+ }
100
+ if (content.codes.length === 0)
101
+ return out;
102
+ const area = { x: inner.x, y: y + (y > inner.y ? pad / 2 : 0), w: inner.w, h: 0 };
103
+ area.h = inner.y + inner.h - area.y;
104
+ let plans;
105
+ try {
106
+ const stacked = planPanels(content.codes, area, false, opts);
107
+ const across = content.codes.length > 1 ? planPanels(content.codes, area, true, opts) : stacked;
108
+ plans = smallest(across) > smallest(stacked) ? across : stacked;
109
+ }
110
+ catch (err) {
111
+ if (!(err instanceof symbol_1.SymbolEncodeError))
112
+ throw err;
113
+ out.warnings.push({ kind: 'unencodable', detail: err.message });
114
+ return out;
115
+ }
116
+ for (const plan of plans)
117
+ out.elements.push(...plan.elements);
118
+ const module = smallest(plans);
119
+ if (module < opts.minModuleMm) {
120
+ out.warnings.push({
121
+ kind: 'scale',
122
+ detail: `bars print at ${module.toFixed(2)} mm, below the ${opts.minModuleMm} mm a scanner reads reliably; use larger labels or fewer codes`,
123
+ });
124
+ }
125
+ if (plans.some((p) => !p.quietOk)) {
126
+ out.warnings.push({ kind: 'quiet_zone', detail: 'a code has too little blank margin around it to scan reliably' });
127
+ }
128
+ if (content.masked) {
129
+ for (const el of out.elements) {
130
+ if (el.kind === 'symbol')
131
+ Object.assign(el, { data: '', path: '', masked: true });
132
+ if (el.kind === 'text' && content.codes.some((c) => c.code === el.text))
133
+ el.text = '•'.repeat(8);
134
+ }
135
+ }
136
+ return out;
137
+ }
@@ -0,0 +1,23 @@
1
+ import type { LabelContent, LabelMedia, LabelSheet, LabelSymbology } from './types';
2
+ export interface LabelSheetInput {
3
+ media: LabelMedia;
4
+ labels: LabelContent[];
5
+ symbology: LabelSymbology;
6
+ humanReadable: boolean;
7
+ /** The first slot to print on page one, counted from 1, so used labels are skipped. */
8
+ startPosition?: number;
9
+ /** Copies of each label, printed together. */
10
+ copies?: number;
11
+ /** One label per page, in the start slot (placards). */
12
+ onePerPage?: boolean;
13
+ cutMarks?: boolean;
14
+ }
15
+ /** A sheet request that cannot be laid out. */
16
+ export declare class LabelLayoutError extends Error {
17
+ constructor(message: string);
18
+ }
19
+ export declare const MAX_COPIES = 50;
20
+ /** Lay out every label of a job onto pages. */
21
+ export declare function buildLabelSheet(input: LabelSheetInput): LabelSheet;
22
+ /** Short tick marks at every label corner, outside the label, for cutting card stock. */
23
+ export declare function cutMarkSegments(media: LabelMedia, length?: number): Array<[number, number, number, number]>;
@@ -0,0 +1,81 @@
1
+ "use strict";
2
+ // Places labels on pages: start position on a partly used sheet, copies per
3
+ // label, one label per page, and cut marks for card stock.
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.MAX_COPIES = exports.LabelLayoutError = void 0;
6
+ exports.buildLabelSheet = buildLabelSheet;
7
+ exports.cutMarkSegments = cutMarkSegments;
8
+ const label_content_1 = require("./label-content");
9
+ const media_1 = require("./media");
10
+ /** A sheet request that cannot be laid out. */
11
+ class LabelLayoutError extends Error {
12
+ constructor(message) {
13
+ super(message);
14
+ this.name = 'LabelLayoutError';
15
+ }
16
+ }
17
+ exports.LabelLayoutError = LabelLayoutError;
18
+ exports.MAX_COPIES = 50;
19
+ /** Lay out every label of a job onto pages. */
20
+ function buildLabelSheet(input) {
21
+ const { media } = input;
22
+ const perPage = (0, media_1.slotsPerPage)(media);
23
+ const start = input.startPosition ?? 1;
24
+ const copies = input.copies ?? 1;
25
+ if (!Number.isInteger(start) || start < 1 || start > perPage) {
26
+ throw new LabelLayoutError(`start position must be between 1 and ${perPage}`);
27
+ }
28
+ if (!Number.isInteger(copies) || copies < 1 || copies > exports.MAX_COPIES) {
29
+ throw new LabelLayoutError(`copies must be between 1 and ${exports.MAX_COPIES}`);
30
+ }
31
+ const warnings = [];
32
+ const laidOut = input.labels.map((content, index) => {
33
+ const result = (0, label_content_1.layoutLabelContent)(content, media.labelWidthMm, media.labelHeightMm, {
34
+ symbology: input.symbology,
35
+ humanReadable: input.humanReadable,
36
+ minModuleMm: media.minModuleMm,
37
+ });
38
+ for (const w of result.warnings)
39
+ warnings.push({ index, ...w });
40
+ return result.elements;
41
+ });
42
+ const pages = [];
43
+ let slot = start - 1;
44
+ let page = null;
45
+ laidOut.forEach((elements, index) => {
46
+ for (let copy = 0; copy < copies; copy++) {
47
+ if (!page || slot >= perPage || input.onePerPage) {
48
+ if (page)
49
+ slot = input.onePerPage ? start - 1 : 0;
50
+ page = { labels: [] };
51
+ pages.push(page);
52
+ }
53
+ const origin = (0, media_1.slotOrigin)(media, slot);
54
+ page.labels.push({ slot, index, x: origin.x, y: origin.y, w: media.labelWidthMm, h: media.labelHeightMm, elements });
55
+ slot += 1;
56
+ }
57
+ });
58
+ return { media, pages, cutMarks: !!input.cutMarks, warnings };
59
+ }
60
+ /** Short tick marks at every label corner, outside the label, for cutting card stock. */
61
+ function cutMarkSegments(media, length = 3) {
62
+ const xs = new Set();
63
+ const ys = new Set();
64
+ for (let s = 0; s < (0, media_1.slotsPerPage)(media); s++) {
65
+ const o = (0, media_1.slotOrigin)(media, s);
66
+ xs.add(o.x).add(o.x + media.labelWidthMm);
67
+ ys.add(o.y).add(o.y + media.labelHeightMm);
68
+ }
69
+ const top = Math.min(...ys);
70
+ const bottom = Math.max(...ys);
71
+ const left = Math.min(...xs);
72
+ const right = Math.max(...xs);
73
+ const segments = [];
74
+ for (const x of xs) {
75
+ segments.push([x, Math.max(0, top - length - 1), x, top - 1], [x, bottom + 1, x, Math.min(media.pageHeightMm, bottom + length + 1)]);
76
+ }
77
+ for (const y of ys) {
78
+ segments.push([Math.max(0, left - length - 1), y, left - 1, y], [right + 1, y, Math.min(media.pageWidthMm, right + length + 1), y]);
79
+ }
80
+ return segments.filter(([x1, y1, x2, y2]) => x1 !== x2 || y1 !== y2);
81
+ }
@@ -0,0 +1,22 @@
1
+ import type { LabelMedia } from './types';
2
+ export declare const LABEL_MEDIA: readonly LabelMedia[];
3
+ /** The default media when neither the job nor the template names one. */
4
+ export declare const DEFAULT_LABEL_MEDIA_ID = "a4-l7160";
5
+ /** A media definition that cannot hold its labels. */
6
+ export declare class LabelMediaError extends Error {
7
+ constructor(message: string);
8
+ }
9
+ /** Throws LabelMediaError unless every label sits inside the page. */
10
+ export declare function assertValidMedia(media: LabelMedia): void;
11
+ /**
12
+ * The media a job prints on: a preset id (from `presets`, which hosts may
13
+ * extend) or a custom definition, validated either way.
14
+ */
15
+ export declare function resolveMedia(media: string | LabelMedia, presets?: readonly LabelMedia[]): LabelMedia;
16
+ /** Labels per page. */
17
+ export declare function slotsPerPage(media: LabelMedia): number;
18
+ /** The top-left corner of a slot on the page. */
19
+ export declare function slotOrigin(media: LabelMedia, slot: number): {
20
+ x: number;
21
+ y: number;
22
+ };
@@ -0,0 +1,116 @@
1
+ "use strict";
2
+ // Label media: sheet stock for office printers and thermal rolls. Geometry is
3
+ // in millimetres, from the stock manufacturers' published templates.
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.LabelMediaError = exports.DEFAULT_LABEL_MEDIA_ID = exports.LABEL_MEDIA = void 0;
6
+ exports.assertValidMedia = assertValidMedia;
7
+ exports.resolveMedia = resolveMedia;
8
+ exports.slotsPerPage = slotsPerPage;
9
+ exports.slotOrigin = slotOrigin;
10
+ const A4 = { pageWidthMm: 210, pageHeightMm: 297 };
11
+ const LETTER = { pageWidthMm: 215.9, pageHeightMm: 279.4 };
12
+ const IN = 25.4;
13
+ const SHEET_MIN_MODULE_MM = 0.25;
14
+ const THERMAL_MIN_MODULE_MM = 0.25;
15
+ const THERMAL_DPI = 203;
16
+ const CR80_W = 85.6;
17
+ const CR80_H = 53.98;
18
+ const CARD_GUTTER = 6;
19
+ function sheet(m, page) {
20
+ return { family: 'sheet', minModuleMm: SHEET_MIN_MODULE_MM, ...page, ...m };
21
+ }
22
+ /** Cards centred on the page with cut gutters between them. */
23
+ function cards(id, name, page, columns, rows) {
24
+ const marginLeftMm = (page.pageWidthMm - columns * CR80_W - (columns - 1) * CARD_GUTTER) / 2;
25
+ const marginTopMm = (page.pageHeightMm - rows * CR80_H - (rows - 1) * CARD_GUTTER) / 2;
26
+ return sheet({
27
+ id, name, columns, rows, labelWidthMm: CR80_W, labelHeightMm: CR80_H,
28
+ marginTopMm, marginLeftMm, gutterXMm: CARD_GUTTER, gutterYMm: CARD_GUTTER, cornerRadiusMm: 3.18,
29
+ }, page);
30
+ }
31
+ function thermal(id, name, widthIn, heightIn) {
32
+ return {
33
+ id, name, family: 'thermal', pageWidthMm: widthIn * IN, pageHeightMm: heightIn * IN,
34
+ columns: 1, rows: 1, labelWidthMm: widthIn * IN, labelHeightMm: heightIn * IN,
35
+ marginTopMm: 0, marginLeftMm: 0, gutterXMm: 0, gutterYMm: 0, cornerRadiusMm: 0,
36
+ dpi: THERMAL_DPI, minModuleMm: THERMAL_MIN_MODULE_MM,
37
+ };
38
+ }
39
+ exports.LABEL_MEDIA = [
40
+ sheet({ id: 'a4-l7160', name: 'A4 · L7160 · 21 per sheet (63.5 × 38.1 mm)', columns: 3, rows: 7, labelWidthMm: 63.5, labelHeightMm: 38.1, marginTopMm: 15.15, marginLeftMm: 7.25, gutterXMm: 2.54, gutterYMm: 0, cornerRadiusMm: 1.5 }, A4),
41
+ sheet({ id: 'a4-l7163', name: 'A4 · L7163 · 14 per sheet (99.1 × 38.1 mm)', columns: 2, rows: 7, labelWidthMm: 99.1, labelHeightMm: 38.1, marginTopMm: 15.15, marginLeftMm: 4.65, gutterXMm: 2.5, gutterYMm: 0, cornerRadiusMm: 1.5 }, A4),
42
+ sheet({ id: 'a4-l7165', name: 'A4 · L7165 · 8 per sheet (99.1 × 67.7 mm)', columns: 2, rows: 4, labelWidthMm: 99.1, labelHeightMm: 67.7, marginTopMm: 13.1, marginLeftMm: 4.65, gutterXMm: 2.5, gutterYMm: 0, cornerRadiusMm: 1.5 }, A4),
43
+ sheet({ id: 'a4-l7173', name: 'A4 · L7173 · 10 per sheet (99.1 × 57 mm)', columns: 2, rows: 5, labelWidthMm: 99.1, labelHeightMm: 57, marginTopMm: 6, marginLeftMm: 4.65, gutterXMm: 2.5, gutterYMm: 0, cornerRadiusMm: 1.5 }, A4),
44
+ sheet({ id: 'a4-l7651', name: 'A4 · L7651 · 65 per sheet (38.1 × 21.2 mm)', columns: 5, rows: 13, labelWidthMm: 38.1, labelHeightMm: 21.2, marginTopMm: 10.7, marginLeftMm: 4.7, gutterXMm: 2.5, gutterYMm: 0, cornerRadiusMm: 1 }, A4),
45
+ sheet({ id: 'a4-a6', name: 'A4 · 4 per sheet (A6, 105 × 148.5 mm)', columns: 2, rows: 2, labelWidthMm: 105, labelHeightMm: 148.5, marginTopMm: 0, marginLeftMm: 0, gutterXMm: 0, gutterYMm: 0, cornerRadiusMm: 0 }, A4),
46
+ sheet({ id: 'a4-placard', name: 'A4 · placard, 1 per page', columns: 1, rows: 1, labelWidthMm: 190, labelHeightMm: 277, marginTopMm: 10, marginLeftMm: 10, gutterXMm: 0, gutterYMm: 0, cornerRadiusMm: 0 }, A4),
47
+ cards('a4-cr80', 'A4 · ID cards (CR80), 10 per sheet', A4, 2, 5),
48
+ sheet({ id: 'letter-5160', name: 'Letter · 5160 · 30 per sheet (2.625 × 1 in)', columns: 3, rows: 10, labelWidthMm: 2.625 * IN, labelHeightMm: 1 * IN, marginTopMm: 0.5 * IN, marginLeftMm: 0.1875 * IN, gutterXMm: 0.125 * IN, gutterYMm: 0, cornerRadiusMm: 1.5 }, LETTER),
49
+ sheet({ id: 'letter-5163', name: 'Letter · 5163 · 10 per sheet (4 × 2 in)', columns: 2, rows: 5, labelWidthMm: 4 * IN, labelHeightMm: 2 * IN, marginTopMm: 0.5 * IN, marginLeftMm: 0.15625 * IN, gutterXMm: 0.1875 * IN, gutterYMm: 0, cornerRadiusMm: 1.5 }, LETTER),
50
+ sheet({ id: 'letter-22805', name: 'Letter · 22805 · 24 per sheet (1.5 in square)', columns: 4, rows: 6, labelWidthMm: 1.5 * IN, labelHeightMm: 1.5 * IN, marginTopMm: 0.625 * IN, marginLeftMm: 0.625 * IN, gutterXMm: 0.3125 * IN, gutterYMm: 0.2 * IN, cornerRadiusMm: 1.5 }, LETTER),
51
+ sheet({ id: 'letter-placard', name: 'Letter · placard, 1 per page', columns: 1, rows: 1, labelWidthMm: LETTER.pageWidthMm - 2 * 12.7, labelHeightMm: LETTER.pageHeightMm - 2 * 12.7, marginTopMm: 12.7, marginLeftMm: 12.7, gutterXMm: 0, gutterYMm: 0, cornerRadiusMm: 0 }, LETTER),
52
+ cards('letter-cr80', 'Letter · ID cards (CR80), 8 per sheet', LETTER, 2, 4),
53
+ thermal('thermal-4x6', 'Thermal roll · 4 × 6 in', 4, 6),
54
+ thermal('thermal-4x2', 'Thermal roll · 4 × 2 in', 4, 2),
55
+ thermal('thermal-2x1', 'Thermal roll · 2 × 1 in', 2, 1),
56
+ ];
57
+ /** The default media when neither the job nor the template names one. */
58
+ exports.DEFAULT_LABEL_MEDIA_ID = 'a4-l7160';
59
+ /** A media definition that cannot hold its labels. */
60
+ class LabelMediaError extends Error {
61
+ constructor(message) {
62
+ super(message);
63
+ this.name = 'LabelMediaError';
64
+ }
65
+ }
66
+ exports.LabelMediaError = LabelMediaError;
67
+ const EPSILON_MM = 0.05;
68
+ /** Throws LabelMediaError unless every label sits inside the page. */
69
+ function assertValidMedia(media) {
70
+ const sizes = [media.pageWidthMm, media.pageHeightMm, media.labelWidthMm, media.labelHeightMm];
71
+ if (sizes.some((n) => !Number.isFinite(n) || n <= 0)) {
72
+ throw new LabelMediaError(`media "${media.id}": page and label sizes must be positive`);
73
+ }
74
+ if (!Number.isInteger(media.columns) || !Number.isInteger(media.rows) || media.columns < 1 || media.rows < 1) {
75
+ throw new LabelMediaError(`media "${media.id}": columns and rows must be positive integers`);
76
+ }
77
+ const offsets = [media.marginTopMm, media.marginLeftMm, media.gutterXMm, media.gutterYMm, media.cornerRadiusMm];
78
+ if (offsets.some((n) => !Number.isFinite(n) || n < 0)) {
79
+ throw new LabelMediaError(`media "${media.id}": margins, gutters and radius must not be negative`);
80
+ }
81
+ const right = media.marginLeftMm + media.columns * media.labelWidthMm + (media.columns - 1) * media.gutterXMm;
82
+ const bottom = media.marginTopMm + media.rows * media.labelHeightMm + (media.rows - 1) * media.gutterYMm;
83
+ if (right > media.pageWidthMm + EPSILON_MM || bottom > media.pageHeightMm + EPSILON_MM) {
84
+ throw new LabelMediaError(`media "${media.id}": labels run past the page edge`);
85
+ }
86
+ if (!(media.minModuleMm > 0)) {
87
+ throw new LabelMediaError(`media "${media.id}": minModuleMm must be positive`);
88
+ }
89
+ if (media.family === 'thermal' && !(media.dpi && media.dpi > 0)) {
90
+ throw new LabelMediaError(`media "${media.id}": thermal media need a dpi`);
91
+ }
92
+ }
93
+ /**
94
+ * The media a job prints on: a preset id (from `presets`, which hosts may
95
+ * extend) or a custom definition, validated either way.
96
+ */
97
+ function resolveMedia(media, presets = exports.LABEL_MEDIA) {
98
+ const found = typeof media === 'string' ? presets.find((m) => m.id === media) : media;
99
+ if (!found)
100
+ throw new LabelMediaError(`unknown media "${String(media)}"`);
101
+ assertValidMedia(found);
102
+ return found;
103
+ }
104
+ /** Labels per page. */
105
+ function slotsPerPage(media) {
106
+ return media.columns * media.rows;
107
+ }
108
+ /** The top-left corner of a slot on the page. */
109
+ function slotOrigin(media, slot) {
110
+ const column = slot % media.columns;
111
+ const row = Math.floor(slot / media.columns);
112
+ return {
113
+ x: media.marginLeftMm + column * (media.labelWidthMm + media.gutterXMm),
114
+ y: media.marginTopMm + row * (media.labelHeightMm + media.gutterYMm),
115
+ };
116
+ }
@@ -0,0 +1,10 @@
1
+ import type { LabelSheet } from './types';
2
+ export interface SvgRenderOptions {
3
+ /** Draw each label's outline (screen preview only; never printed). */
4
+ outlines?: boolean;
5
+ fontFamily?: string;
6
+ }
7
+ /** Escape text for XML content and attributes. */
8
+ export declare function escapeXml(text: string): string;
9
+ /** Render every page of a sheet as a standalone SVG document string. */
10
+ export declare function renderSheetSvg(sheet: LabelSheet, opts?: SvgRenderOptions): string[];
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ // LabelSheet → one SVG per page, sized in millimetres for print. A barcode is
3
+ // a document: black on white, whatever the screen theme.
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.escapeXml = escapeXml;
6
+ exports.renderSheetSvg = renderSheetSvg;
7
+ const layout_1 = require("./layout");
8
+ const DEFAULT_FONT = 'Helvetica, Arial, sans-serif';
9
+ const r = (n) => Math.round(n * 1000) / 1000;
10
+ /** Escape text for XML content and attributes. */
11
+ function escapeXml(text) {
12
+ return text
13
+ .replace(/&/g, '&amp;')
14
+ .replace(/</g, '&lt;')
15
+ .replace(/>/g, '&gt;')
16
+ .replace(/"/g, '&quot;')
17
+ .replace(/'/g, '&apos;');
18
+ }
19
+ function element(el, font) {
20
+ if (el.kind === 'rect') {
21
+ return el.fill
22
+ ? `<rect x="${r(el.x)}" y="${r(el.y)}" width="${r(el.w)}" height="${r(el.h)}" fill="#000"/>`
23
+ : `<rect x="${r(el.x)}" y="${r(el.y)}" width="${r(el.w)}" height="${r(el.h)}" fill="none" stroke="#000" stroke-width="${r(el.stroke ?? 0.3)}"/>`;
24
+ }
25
+ if (el.kind === 'text') {
26
+ const x = el.align === 'center' ? el.x + el.w / 2 : el.x;
27
+ return `<text x="${r(x)}" y="${r(el.y + el.size * 0.8)}" font-family="${escapeXml(font)}" font-size="${r(el.size)}" ` +
28
+ `font-weight="${el.weight === 'bold' ? 700 : 400}" text-anchor="${el.align === 'center' ? 'middle' : 'start'}" ` +
29
+ `fill="${el.inverse ? '#fff' : '#000'}">${escapeXml(el.text)}</text>`;
30
+ }
31
+ if (el.masked) {
32
+ const size = Math.min(el.h * 0.3, 3);
33
+ return `<rect x="${r(el.x)}" y="${r(el.y)}" width="${r(el.w)}" height="${r(el.h)}" fill="#ddd" stroke="#888" stroke-width="0.2" stroke-dasharray="1 1"/>` +
34
+ `<text x="${r(el.x + el.w / 2)}" y="${r(el.y + el.h / 2 + size * 0.35)}" font-family="${escapeXml(font)}" font-size="${r(size)}" text-anchor="middle" fill="#555">Code prints on confirm</text>`;
35
+ }
36
+ return `<path class="lt-label-symbol" data-code="${escapeXml(el.data)}" d="${el.path}" fill="#000" ` +
37
+ `transform="translate(${r(el.x)} ${r(el.y)}) scale(${r(el.moduleMm)} ${el.symbology === 'code128' ? r(el.h) : r(el.moduleMm)})"/>`;
38
+ }
39
+ function label(placed, font, outline, radius) {
40
+ const body = placed.elements.map((el) => element(el, font)).join('');
41
+ const frame = outline
42
+ ? `<rect x="0" y="0" width="${r(placed.w)}" height="${r(placed.h)}" rx="${r(radius)}" fill="none" stroke="#bbb" stroke-width="0.2" stroke-dasharray="1 1"/>`
43
+ : '';
44
+ return `<g class="lt-label" data-index="${placed.index}" data-slot="${placed.slot}" transform="translate(${r(placed.x)} ${r(placed.y)})">${frame}${body}</g>`;
45
+ }
46
+ /** Render every page of a sheet as a standalone SVG document string. */
47
+ function renderSheetSvg(sheet, opts = {}) {
48
+ const { media } = sheet;
49
+ const font = opts.fontFamily ?? DEFAULT_FONT;
50
+ const marks = sheet.cutMarks
51
+ ? (0, layout_1.cutMarkSegments)(media).map(([x1, y1, x2, y2]) => `<line x1="${r(x1)}" y1="${r(y1)}" x2="${r(x2)}" y2="${r(y2)}" stroke="#000" stroke-width="0.15"/>`).join('')
52
+ : '';
53
+ return sheet.pages.map((page) => `<svg xmlns="http://www.w3.org/2000/svg" class="lt-print-page" width="${r(media.pageWidthMm)}mm" height="${r(media.pageHeightMm)}mm" ` +
54
+ `viewBox="0 0 ${r(media.pageWidthMm)} ${r(media.pageHeightMm)}">` +
55
+ `<rect width="100%" height="100%" fill="#fff"/>${marks}` +
56
+ page.labels.map((placed) => label(placed, font, !!opts.outlines, media.cornerRadiusMm)).join('') +
57
+ '</svg>');
58
+ }
@@ -0,0 +1,9 @@
1
+ import type { LabelSheet } from './types';
2
+ /** A sheet that cannot be rendered as ZPL. */
3
+ export declare class ZplRenderError extends Error {
4
+ constructor(message: string);
5
+ }
6
+ /** Field data with ^FH escaping: the ZPL command characters and the escape itself become hex. */
7
+ export declare function zplField(text: string): string;
8
+ /** Render a thermal sheet as one ZPL document, one label format per printed label. */
9
+ export declare function renderSheetZpl(sheet: LabelSheet): string;
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ // LabelSheet → ZPL for thermal printers: one ^XA…^XZ per printed label, with
3
+ // the printer's own barcode commands so bars land on whole dots.
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.ZplRenderError = void 0;
6
+ exports.zplField = zplField;
7
+ exports.renderSheetZpl = renderSheetZpl;
8
+ /** A sheet that cannot be rendered as ZPL. */
9
+ class ZplRenderError extends Error {
10
+ constructor(message) {
11
+ super(message);
12
+ this.name = 'ZplRenderError';
13
+ }
14
+ }
15
+ exports.ZplRenderError = ZplRenderError;
16
+ const MM_PER_INCH = 25.4;
17
+ /** Field data with ^FH escaping: the ZPL command characters and the escape itself become hex. */
18
+ function zplField(text) {
19
+ return text.replace(/[\^~_\\]/g, (c) => `_${c.charCodeAt(0).toString(16).toUpperCase().padStart(2, '0')}`);
20
+ }
21
+ function element(el, dots) {
22
+ if (el.kind === 'rect') {
23
+ const w = Math.max(1, dots(el.w));
24
+ const h = Math.max(1, dots(el.h));
25
+ const thickness = el.fill ? Math.min(w, h) : Math.max(1, dots(el.stroke ?? 0.3));
26
+ return `^FO${dots(el.x)},${dots(el.y)}^GB${w},${h},${thickness}^FS`;
27
+ }
28
+ if (el.kind === 'text') {
29
+ const size = Math.max(10, dots(el.size));
30
+ const justify = el.align === 'center' ? 'C' : 'L';
31
+ return `^FO${dots(el.x)},${dots(el.y)}^A0N,${size},${size}^FB${Math.max(1, dots(el.w))},1,0,${justify}` +
32
+ `${el.inverse ? '^FR' : ''}^FH^FD${zplField(el.text)}^FS`;
33
+ }
34
+ if (el.masked) {
35
+ throw new ZplRenderError('a masked label cannot be sent to a printer');
36
+ }
37
+ const module = Math.max(1, dots(el.moduleMm));
38
+ const at = `^FO${dots(el.x)},${dots(el.y)}`;
39
+ if (el.symbology === 'code128') {
40
+ return `^BY${module},3,${Math.max(1, dots(el.h))}${at}^BCN,${Math.max(1, dots(el.h))},N,N,N,A^FH^FD${zplField(el.data)}^FS`;
41
+ }
42
+ if (el.symbology === 'qrcode') {
43
+ return `${at}^BQN,2,${Math.min(10, module)}^FH^FDMA,${zplField(el.data)}^FS`;
44
+ }
45
+ return `${at}^BXN,${module},200^FH^FD${zplField(el.data)}^FS`;
46
+ }
47
+ /** Render a thermal sheet as one ZPL document, one label format per printed label. */
48
+ function renderSheetZpl(sheet) {
49
+ const { media } = sheet;
50
+ if (media.family !== 'thermal' || !media.dpi) {
51
+ throw new ZplRenderError(`media "${media.id}" is not thermal stock; ZPL renders thermal media only`);
52
+ }
53
+ const dpmm = media.dpi / MM_PER_INCH;
54
+ const dots = (mm) => Math.round(mm * dpmm);
55
+ const formats = [];
56
+ for (const page of sheet.pages) {
57
+ for (const placed of page.labels) {
58
+ const body = placed.elements.map((el) => element(el, dots)).join('\n');
59
+ formats.push(`^XA\n^CI28\n^LH0,0\n^PW${dots(media.labelWidthMm)}\n^LL${dots(media.labelHeightMm)}\n${body}\n^XZ`);
60
+ }
61
+ }
62
+ return formats.join('\n');
63
+ }
@@ -0,0 +1,18 @@
1
+ import type { LabelSymbology } from './types';
2
+ export interface EncodedSymbol {
3
+ /**
4
+ * Dark modules as an SVG path. Code 128: x in modules, y from 0 to 1
5
+ * (bars span the full height). Matrix codes: x and y in modules.
6
+ */
7
+ path: string;
8
+ widthModules: number;
9
+ heightModules: number;
10
+ }
11
+ /** Data the symbology cannot carry. The message never repeats the data. */
12
+ export declare class SymbolEncodeError extends Error {
13
+ constructor(message: string);
14
+ }
15
+ /** The blank margin, in modules, a scanner needs around the symbol. */
16
+ export declare function quietZoneModules(symbology: LabelSymbology): number;
17
+ /** Encode `data` in `symbology`; throws SymbolEncodeError when it cannot be carried. */
18
+ export declare function encodeSymbol(symbology: LabelSymbology, data: string): EncodedSymbol;