@hotmeshio/long-tail 0.30.5 → 0.31.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 (367) 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/services/labels/content.d.ts +13 -0
  28. package/build/services/labels/content.js +81 -0
  29. package/build/services/labels/errors.d.ts +5 -0
  30. package/build/services/labels/errors.js +12 -0
  31. package/build/services/labels/index.d.ts +11 -0
  32. package/build/services/labels/index.js +52 -0
  33. package/build/services/labels/issue.d.ts +38 -0
  34. package/build/services/labels/issue.js +181 -0
  35. package/build/services/labels/jobs.d.ts +37 -0
  36. package/build/services/labels/jobs.js +75 -0
  37. package/build/services/labels/media.d.ts +11 -0
  38. package/build/services/labels/media.js +44 -0
  39. package/build/services/labels/reissue.d.ts +13 -0
  40. package/build/services/labels/reissue.js +65 -0
  41. package/build/services/labels/render-pdf.d.ts +11 -0
  42. package/build/services/labels/render-pdf.js +138 -0
  43. package/build/services/labels/targets.d.ts +18 -0
  44. package/build/services/labels/targets.js +216 -0
  45. package/build/services/labels/templates/index.d.ts +3 -0
  46. package/build/services/labels/templates/index.js +18 -0
  47. package/build/services/labels/templates/read.d.ts +4 -0
  48. package/build/services/labels/templates/read.js +36 -0
  49. package/build/services/labels/templates/sql.d.ts +8 -0
  50. package/build/services/labels/templates/sql.js +50 -0
  51. package/build/services/labels/templates/validate.d.ts +19 -0
  52. package/build/services/labels/templates/validate.js +93 -0
  53. package/build/services/labels/templates/write.d.ts +16 -0
  54. package/build/services/labels/templates/write.js +75 -0
  55. package/build/services/labels/token.d.ts +9 -0
  56. package/build/services/labels/token.js +28 -0
  57. package/build/services/labels/verify.d.ts +4 -0
  58. package/build/services/labels/verify.js +38 -0
  59. package/build/services/scan-code/validate.d.ts +3 -0
  60. package/build/services/scan-code/validate.js +10 -0
  61. package/build/services/user/crud.d.ts +13 -1
  62. package/build/services/user/crud.js +42 -11
  63. package/build/services/user/index.d.ts +3 -2
  64. package/build/services/user/index.js +7 -1
  65. package/build/services/user/redact.d.ts +17 -0
  66. package/build/services/user/redact.js +32 -0
  67. package/build/services/user/sql.d.ts +8 -15
  68. package/build/services/user/sql.js +27 -3
  69. package/build/services/user/types.d.ts +21 -1
  70. package/build/shared/labels/compose.d.ts +12 -0
  71. package/build/shared/labels/compose.js +43 -0
  72. package/build/shared/labels/index.d.ts +9 -0
  73. package/build/shared/labels/index.js +54 -0
  74. package/build/shared/labels/label-content.d.ts +17 -0
  75. package/build/shared/labels/label-content.js +137 -0
  76. package/build/shared/labels/layout.d.ts +23 -0
  77. package/build/shared/labels/layout.js +81 -0
  78. package/build/shared/labels/media.d.ts +22 -0
  79. package/build/shared/labels/media.js +116 -0
  80. package/build/shared/labels/render-svg.d.ts +10 -0
  81. package/build/shared/labels/render-svg.js +58 -0
  82. package/build/shared/labels/render-zpl.d.ts +9 -0
  83. package/build/shared/labels/render-zpl.js +63 -0
  84. package/build/shared/labels/symbol.d.ts +18 -0
  85. package/build/shared/labels/symbol.js +74 -0
  86. package/build/shared/labels/tokens.d.ts +18 -0
  87. package/build/shared/labels/tokens.js +43 -0
  88. package/build/shared/labels/types.d.ts +105 -0
  89. package/build/shared/labels/types.js +11 -0
  90. package/build/start/adapters.js +16 -0
  91. package/build/start/workers.js +18 -2
  92. package/build/system/mcp-servers/admin/index.js +2 -0
  93. package/build/system/mcp-servers/admin/labels-schemas.d.ts +192 -0
  94. package/build/system/mcp-servers/admin/labels-schemas.js +46 -0
  95. package/build/system/mcp-servers/admin/labels.d.ts +9 -0
  96. package/build/system/mcp-servers/admin/labels.js +101 -0
  97. package/build/system/mcp-servers/admin/schemas.d.ts +30 -30
  98. package/build/system/mcp-servers/admin/users.js +1 -1
  99. package/build/system/seed/tool-manifests-admin.js +5 -0
  100. package/build/tsconfig.tsbuildinfo +1 -1
  101. package/build/types/capability.d.ts +2 -1
  102. package/build/types/index.d.ts +2 -1
  103. package/build/types/labels/index.d.ts +4 -0
  104. package/build/types/labels/index.js +2 -0
  105. package/build/types/labels/job.d.ts +51 -0
  106. package/build/types/labels/job.js +2 -0
  107. package/build/types/labels/source.d.ts +44 -0
  108. package/build/types/labels/source.js +2 -0
  109. package/build/types/labels/template.d.ts +46 -0
  110. package/build/types/labels/template.js +2 -0
  111. package/build/types/labels/transport.d.ts +24 -0
  112. package/build/types/labels/transport.js +2 -0
  113. package/build/types/scan-code/rule.d.ts +5 -0
  114. package/build/types/startup.d.ts +37 -0
  115. package/build/types/user.d.ts +2 -0
  116. package/dashboard/dist/assets/{AdminDashboard-D12QiMM5.js → AdminDashboard-BafKaq50.js} +2 -2
  117. package/dashboard/dist/assets/{AdminDashboard-D12QiMM5.js.map → AdminDashboard-BafKaq50.js.map} +1 -1
  118. package/dashboard/dist/assets/{AgentConfigPage-BKQd9b8m.js → AgentConfigPage-CFHf31DT.js} +6 -6
  119. package/dashboard/dist/assets/{AgentConfigPage-BKQd9b8m.js.map → AgentConfigPage-CFHf31DT.js.map} +1 -1
  120. package/dashboard/dist/assets/{AgentDetailPage-ie-DxsIj.js → AgentDetailPage-CEvz5rJr.js} +3 -3
  121. package/dashboard/dist/assets/{AgentDetailPage-ie-DxsIj.js.map → AgentDetailPage-CEvz5rJr.js.map} +1 -1
  122. package/dashboard/dist/assets/{AgentsPage-Nqm2DxCP.js → AgentsPage-DjQaio0O.js} +2 -2
  123. package/dashboard/dist/assets/{AgentsPage-Nqm2DxCP.js.map → AgentsPage-DjQaio0O.js.map} +1 -1
  124. package/dashboard/dist/assets/AvailableEscalationsPage-UB03VTJx.js +2 -0
  125. package/dashboard/dist/assets/AvailableEscalationsPage-UB03VTJx.js.map +1 -0
  126. package/dashboard/dist/assets/{BotPicker-BizdmeJp.js → BotPicker-C7MNWOF7.js} +2 -2
  127. package/dashboard/dist/assets/{BotPicker-BizdmeJp.js.map → BotPicker-C7MNWOF7.js.map} +1 -1
  128. package/dashboard/dist/assets/BulkAssignModal-h5fX-_cV.js +2 -0
  129. package/dashboard/dist/assets/{BulkAssignModal-BWfzPrRk.js.map → BulkAssignModal-h5fX-_cV.js.map} +1 -1
  130. package/dashboard/dist/assets/{CapabilitiesPage-DT8q7Zlh.js → CapabilitiesPage-BIzDl-ZT.js} +2 -2
  131. package/dashboard/dist/assets/{CapabilitiesPage-DT8q7Zlh.js.map → CapabilitiesPage-BIzDl-ZT.js.map} +1 -1
  132. package/dashboard/dist/assets/{CollapsibleSection-al5mqR4O.js → CollapsibleSection-B5TivtEg.js} +2 -2
  133. package/dashboard/dist/assets/{CollapsibleSection-al5mqR4O.js.map → CollapsibleSection-B5TivtEg.js.map} +1 -1
  134. package/dashboard/dist/assets/{ConfirmDeleteModal-BrlVktv2.js → ConfirmDeleteModal-CB4nKePb.js} +2 -2
  135. package/dashboard/dist/assets/{ConfirmDeleteModal-BrlVktv2.js.map → ConfirmDeleteModal-CB4nKePb.js.map} +1 -1
  136. package/dashboard/dist/assets/{ConnectedAppsPage-CLAsJ2yQ.js → ConnectedAppsPage-B3S5gVWw.js} +2 -2
  137. package/dashboard/dist/assets/{ConnectedAppsPage-CLAsJ2yQ.js.map → ConnectedAppsPage-B3S5gVWw.js.map} +1 -1
  138. package/dashboard/dist/assets/{CountdownTimer-D2D68exl.js → CountdownTimer-BHVIq3kA.js} +2 -2
  139. package/dashboard/dist/assets/{CountdownTimer-D2D68exl.js.map → CountdownTimer-BHVIq3kA.js.map} +1 -1
  140. package/dashboard/dist/assets/CredentialConfirmModal-w0AGmCIe.js +2 -0
  141. package/dashboard/dist/assets/CredentialConfirmModal-w0AGmCIe.js.map +1 -0
  142. package/dashboard/dist/assets/{CredentialsPage-DWrZbEI0.js → CredentialsPage-BtCGBJrT.js} +2 -2
  143. package/dashboard/dist/assets/{CredentialsPage-DWrZbEI0.js.map → CredentialsPage-BtCGBJrT.js.map} +1 -1
  144. package/dashboard/dist/assets/{CronLabel-DuXR8iWq.js → CronLabel-BG1rZK-5.js} +2 -2
  145. package/dashboard/dist/assets/{CronLabel-DuXR8iWq.js.map → CronLabel-BG1rZK-5.js.map} +1 -1
  146. package/dashboard/dist/assets/{DropZone-DefYTYQy.js → DropZone-D8ZVdEb5.js} +2 -2
  147. package/dashboard/dist/assets/{DropZone-DefYTYQy.js.map → DropZone-D8ZVdEb5.js.map} +1 -1
  148. package/dashboard/dist/assets/{ElapsedCell-ronqG5-E.js → ElapsedCell-l4m8Yvfv.js} +2 -2
  149. package/dashboard/dist/assets/{ElapsedCell-ronqG5-E.js.map → ElapsedCell-l4m8Yvfv.js.map} +1 -1
  150. package/dashboard/dist/assets/{EntityTimelinePanel-CKsktd84.js → EntityTimelinePanel-BOHlIaxF.js} +2 -2
  151. package/dashboard/dist/assets/{EntityTimelinePanel-CKsktd84.js.map → EntityTimelinePanel-BOHlIaxF.js.map} +1 -1
  152. package/dashboard/dist/assets/{EscalationListSchemaPage-C954ngy3.js → EscalationListSchemaPage-BotlwlX3.js} +3 -3
  153. package/dashboard/dist/assets/{EscalationListSchemaPage-C954ngy3.js.map → EscalationListSchemaPage-BotlwlX3.js.map} +1 -1
  154. package/dashboard/dist/assets/{EscalationSchemaPage-Dij9K0ON.js → EscalationSchemaPage-CfZSVOSD.js} +3 -3
  155. package/dashboard/dist/assets/{EscalationSchemaPage-Dij9K0ON.js.map → EscalationSchemaPage-CfZSVOSD.js.map} +1 -1
  156. package/dashboard/dist/assets/{EscalationTimeline-DT2Owdl0.js → EscalationTimeline-CCKpuRBU.js} +2 -2
  157. package/dashboard/dist/assets/{EscalationTimeline-DT2Owdl0.js.map → EscalationTimeline-CCKpuRBU.js.map} +1 -1
  158. package/dashboard/dist/assets/{EscalationTitleSelect-BdbfMA98.js → EscalationTitleSelect-cpTzPHiW.js} +2 -2
  159. package/dashboard/dist/assets/{EscalationTitleSelect-BdbfMA98.js.map → EscalationTitleSelect-cpTzPHiW.js.map} +1 -1
  160. package/dashboard/dist/assets/{EscalationsOverview-niahs84P.js → EscalationsOverview-DS-nK0qV.js} +2 -2
  161. package/dashboard/dist/assets/{EscalationsOverview-niahs84P.js.map → EscalationsOverview-DS-nK0qV.js.map} +1 -1
  162. package/dashboard/dist/assets/{EventTable-DuLMBrSx.js → EventTable-UfebhJf0.js} +2 -2
  163. package/dashboard/dist/assets/{EventTable-DuLMBrSx.js.map → EventTable-UfebhJf0.js.map} +1 -1
  164. package/dashboard/dist/assets/{FilterBar-jtY6KNpL.js → FilterBar-newA5l-X.js} +2 -2
  165. package/dashboard/dist/assets/{FilterBar-jtY6KNpL.js.map → FilterBar-newA5l-X.js.map} +1 -1
  166. package/dashboard/dist/assets/{GraphInvokePage-DSRAI0Zt.js → GraphInvokePage-6SCDyQcK.js} +2 -2
  167. package/dashboard/dist/assets/{GraphInvokePage-DSRAI0Zt.js.map → GraphInvokePage-6SCDyQcK.js.map} +1 -1
  168. package/dashboard/dist/assets/HomePage-BEc-XdKj.js +2 -0
  169. package/dashboard/dist/assets/{HomePage-BUlSnCg8.js.map → HomePage-BEc-XdKj.js.map} +1 -1
  170. package/dashboard/dist/assets/LabelJobsPage-BO50zXT5.js +2 -0
  171. package/dashboard/dist/assets/LabelJobsPage-BO50zXT5.js.map +1 -0
  172. package/dashboard/dist/assets/{LinePage-BJKhVM9Y.js → LinePage-NYxJQ-ex.js} +3 -3
  173. package/dashboard/dist/assets/{LinePage-BJKhVM9Y.js.map → LinePage-NYxJQ-ex.js.map} +1 -1
  174. package/dashboard/dist/assets/{LinesPage-CrpJua3_.js → LinesPage-RbWTaQRh.js} +3 -3
  175. package/dashboard/dist/assets/{LinesPage-CrpJua3_.js.map → LinesPage-RbWTaQRh.js.map} +1 -1
  176. package/dashboard/dist/assets/{ListToolbar-BN0UPt0L.js → ListToolbar-B-E9-toh.js} +2 -2
  177. package/dashboard/dist/assets/{ListToolbar-BN0UPt0L.js.map → ListToolbar-B-E9-toh.js.map} +1 -1
  178. package/dashboard/dist/assets/{McpOverview-BgbJXYPh.js → McpOverview-Shcf9QhZ.js} +2 -2
  179. package/dashboard/dist/assets/{McpOverview-BgbJXYPh.js.map → McpOverview-Shcf9QhZ.js.map} +1 -1
  180. package/dashboard/dist/assets/{McpQueryDetailPage-BNjm2nrc.js → McpQueryDetailPage-D8kmjy2v.js} +3 -3
  181. package/dashboard/dist/assets/{McpQueryDetailPage-BNjm2nrc.js.map → McpQueryDetailPage-D8kmjy2v.js.map} +1 -1
  182. package/dashboard/dist/assets/{McpQueryPage-DplR8wP9.js → McpQueryPage-ck-o5m8A.js} +2 -2
  183. package/dashboard/dist/assets/{McpQueryPage-DplR8wP9.js.map → McpQueryPage-ck-o5m8A.js.map} +1 -1
  184. package/dashboard/dist/assets/McpRunDetailPage-BJKkM9-3.js +2 -0
  185. package/dashboard/dist/assets/{McpRunDetailPage-BHVEcKV5.js.map → McpRunDetailPage-BJKkM9-3.js.map} +1 -1
  186. package/dashboard/dist/assets/{McpRunsPage-CtlLagcs.js → McpRunsPage-DqhHfD5G.js} +2 -2
  187. package/dashboard/dist/assets/{McpRunsPage-CtlLagcs.js.map → McpRunsPage-DqhHfD5G.js.map} +1 -1
  188. package/dashboard/dist/assets/{NamespacePill-CeSfHH-j.js → NamespacePill--uIaGtrN.js} +2 -2
  189. package/dashboard/dist/assets/{NamespacePill-CeSfHH-j.js.map → NamespacePill--uIaGtrN.js.map} +1 -1
  190. package/dashboard/dist/assets/{OperationsPage-DH67bcW9.js → OperationsPage-D6B9Vv__.js} +3 -3
  191. package/dashboard/dist/assets/{OperationsPage-DH67bcW9.js.map → OperationsPage-D6B9Vv__.js.map} +1 -1
  192. package/dashboard/dist/assets/OperatorDashboard-CIH1cxjQ.js +2 -0
  193. package/dashboard/dist/assets/{OperatorDashboard-CMkgMewd.js.map → OperatorDashboard-CIH1cxjQ.js.map} +1 -1
  194. package/dashboard/dist/assets/{PageHeader-DiGWAQlR.js → PageHeader-DClJ33fV.js} +2 -2
  195. package/dashboard/dist/assets/{PageHeader-DiGWAQlR.js.map → PageHeader-DClJ33fV.js.map} +1 -1
  196. package/dashboard/dist/assets/{PageHeaderWithStats-DwnKQ06j.js → PageHeaderWithStats-C-TrbKQL.js} +2 -2
  197. package/dashboard/dist/assets/{PageHeaderWithStats-DwnKQ06j.js.map → PageHeaderWithStats-C-TrbKQL.js.map} +1 -1
  198. package/dashboard/dist/assets/PersonaDetailPage-DjvfyIph.js +2 -0
  199. package/dashboard/dist/assets/{PersonaDetailPage-Cs1FFdNq.js.map → PersonaDetailPage-DjvfyIph.js.map} +1 -1
  200. package/dashboard/dist/assets/{PersonasPage-CHTRdneF.js → PersonasPage-D7ryA8Vc.js} +2 -2
  201. package/dashboard/dist/assets/{PersonasPage-CHTRdneF.js.map → PersonasPage-D7ryA8Vc.js.map} +1 -1
  202. package/dashboard/dist/assets/{PortalPage-ChB5pBTZ.js → PortalPage-D3ybr0mo.js} +2 -2
  203. package/dashboard/dist/assets/{PortalPage-ChB5pBTZ.js.map → PortalPage-D3ybr0mo.js.map} +1 -1
  204. package/dashboard/dist/assets/PrintLabelsPanel-D0HF5x8b.js +2 -0
  205. package/dashboard/dist/assets/PrintLabelsPanel-D0HF5x8b.js.map +1 -0
  206. package/dashboard/dist/assets/{ProcessDetailPage-CzyqSfal.js → ProcessDetailPage-0xS9EdHe.js} +2 -2
  207. package/dashboard/dist/assets/{ProcessDetailPage-CzyqSfal.js.map → ProcessDetailPage-0xS9EdHe.js.map} +1 -1
  208. package/dashboard/dist/assets/{ProcessesListPage-rOwNkaU9.js → ProcessesListPage-93SMj1Fd.js} +2 -2
  209. package/dashboard/dist/assets/{ProcessesListPage-rOwNkaU9.js.map → ProcessesListPage-93SMj1Fd.js.map} +1 -1
  210. package/dashboard/dist/assets/{ResolverForm-DibnlZ-A.js → ResolverForm-DfogHDzl.js} +5 -5
  211. package/dashboard/dist/assets/{ResolverForm-DibnlZ-A.js.map → ResolverForm-DfogHDzl.js.map} +1 -1
  212. package/dashboard/dist/assets/{RoleDetailPage-Bv9R7iQC.js → RoleDetailPage-DlUOJWSB.js} +3 -3
  213. package/dashboard/dist/assets/{RoleDetailPage-Bv9R7iQC.js.map → RoleDetailPage-DlUOJWSB.js.map} +1 -1
  214. package/dashboard/dist/assets/{RolePill-D3hkAdKf.js → RolePill-BjD1Qw5y.js} +2 -2
  215. package/dashboard/dist/assets/{RolePill-D3hkAdKf.js.map → RolePill-BjD1Qw5y.js.map} +1 -1
  216. package/dashboard/dist/assets/RolesPage-DqhHSvaw.js +2 -0
  217. package/dashboard/dist/assets/{RolesPage-CUP7EH5U.js.map → RolesPage-DqhHSvaw.js.map} +1 -1
  218. package/dashboard/dist/assets/{RosterWidget-DZtmQcjU.js → RosterWidget-BrIq61HR.js} +2 -2
  219. package/dashboard/dist/assets/{RosterWidget-DZtmQcjU.js.map → RosterWidget-BrIq61HR.js.map} +1 -1
  220. package/dashboard/dist/assets/RunAsSelector-D6zQrCNr.js +2 -0
  221. package/dashboard/dist/assets/{RunAsSelector-B9-1vgZr.js.map → RunAsSelector-D6zQrCNr.js.map} +1 -1
  222. package/dashboard/dist/assets/ScanCodesPage-B2S9DR2f.js +2 -0
  223. package/dashboard/dist/assets/{ScanCodesPage-KN_e2rJl.js.map → ScanCodesPage-B2S9DR2f.js.map} +1 -1
  224. package/dashboard/dist/assets/ScanSchemeDetailPage-gpxKN-pL.js +5 -0
  225. package/dashboard/dist/assets/ScanSchemeDetailPage-gpxKN-pL.js.map +1 -0
  226. package/dashboard/dist/assets/ScanStationPage-B-UTgXsG.js +2 -0
  227. package/dashboard/dist/assets/{ScanStationPage-B0qbUOwc.js.map → ScanStationPage-B-UTgXsG.js.map} +1 -1
  228. package/dashboard/dist/assets/{SchemeMatchFields-CL7TKnw3.js → SchemeMatchFields-BK24aa7K.js} +2 -2
  229. package/dashboard/dist/assets/{SchemeMatchFields-CL7TKnw3.js.map → SchemeMatchFields-BK24aa7K.js.map} +1 -1
  230. package/dashboard/dist/assets/{ScopeBadge-DGz79rmG.js → ScopeBadge-ofLQ6HW-.js} +2 -2
  231. package/dashboard/dist/assets/{ScopeBadge-DGz79rmG.js.map → ScopeBadge-ofLQ6HW-.js.map} +1 -1
  232. package/dashboard/dist/assets/{StickyPagination-CUwxfBQH.js → StickyPagination-CgVv7vc_.js} +2 -2
  233. package/dashboard/dist/assets/{StickyPagination-CUwxfBQH.js.map → StickyPagination-CgVv7vc_.js.map} +1 -1
  234. package/dashboard/dist/assets/{StreamMessageDetail-DOjcO7d2.js → StreamMessageDetail-B9sxDVw4.js} +2 -2
  235. package/dashboard/dist/assets/{StreamMessageDetail-DOjcO7d2.js.map → StreamMessageDetail-B9sxDVw4.js.map} +1 -1
  236. package/dashboard/dist/assets/{SwimlaneTimeline-SPMpoLHP.js → SwimlaneTimeline-DQc0CYSL.js} +2 -2
  237. package/dashboard/dist/assets/{SwimlaneTimeline-SPMpoLHP.js.map → SwimlaneTimeline-DQc0CYSL.js.map} +1 -1
  238. package/dashboard/dist/assets/{TagInput-DaIdhv3h.js → TagInput-47qVYzke.js} +2 -2
  239. package/dashboard/dist/assets/{TagInput-DaIdhv3h.js.map → TagInput-47qVYzke.js.map} +1 -1
  240. package/dashboard/dist/assets/{TaskDetailPage-DvfzR2IQ.js → TaskDetailPage-D6VOsA1f.js} +2 -2
  241. package/dashboard/dist/assets/{TaskDetailPage-DvfzR2IQ.js.map → TaskDetailPage-D6VOsA1f.js.map} +1 -1
  242. package/dashboard/dist/assets/{TaskQueuePill-sUA1nZe-.js → TaskQueuePill-C5KmdXAl.js} +2 -2
  243. package/dashboard/dist/assets/{TaskQueuePill-sUA1nZe-.js.map → TaskQueuePill-C5KmdXAl.js.map} +1 -1
  244. package/dashboard/dist/assets/{TasksListPage-Jp6wmL7t.js → TasksListPage-DG8hvO8G.js} +2 -2
  245. package/dashboard/dist/assets/{TasksListPage-Jp6wmL7t.js.map → TasksListPage-DG8hvO8G.js.map} +1 -1
  246. package/dashboard/dist/assets/{TimeAgo-BCQA0Gb_.js → TimeAgo-CL02EhFi.js} +2 -2
  247. package/dashboard/dist/assets/{TimeAgo-BCQA0Gb_.js.map → TimeAgo-CL02EhFi.js.map} +1 -1
  248. package/dashboard/dist/assets/{TimestampCell-xhdMHDQt.js → TimestampCell-BE7oKVJg.js} +2 -2
  249. package/dashboard/dist/assets/{TimestampCell-xhdMHDQt.js.map → TimestampCell-BE7oKVJg.js.map} +1 -1
  250. package/dashboard/dist/assets/{ToolPill-CpBAFdEX.js → ToolPill-Cp9Drk1s.js} +2 -2
  251. package/dashboard/dist/assets/{ToolPill-CpBAFdEX.js.map → ToolPill-Cp9Drk1s.js.map} +1 -1
  252. package/dashboard/dist/assets/{ToolTestPanel-D8M3ITrJ.js → ToolTestPanel-CRecLh6S.js} +2 -2
  253. package/dashboard/dist/assets/{ToolTestPanel-D8M3ITrJ.js.map → ToolTestPanel-CRecLh6S.js.map} +1 -1
  254. package/dashboard/dist/assets/{TopicDetailPage-DdBJQp31.js → TopicDetailPage-QzkinTfN.js} +3 -3
  255. package/dashboard/dist/assets/{TopicDetailPage-DdBJQp31.js.map → TopicDetailPage-QzkinTfN.js.map} +1 -1
  256. package/dashboard/dist/assets/{TopicsPage-vpvsynD9.js → TopicsPage-D8dW6J65.js} +2 -2
  257. package/dashboard/dist/assets/{TopicsPage-vpvsynD9.js.map → TopicsPage-D8dW6J65.js.map} +1 -1
  258. package/dashboard/dist/assets/{UserName-BK6Lzsdw.js → UserName-Dw3R_zrl.js} +2 -2
  259. package/dashboard/dist/assets/{UserName-BK6Lzsdw.js.map → UserName-Dw3R_zrl.js.map} +1 -1
  260. package/dashboard/dist/assets/WorkflowExecutionPage-BTocv8or.js +2 -0
  261. package/dashboard/dist/assets/{WorkflowExecutionPage-DkM1TS4I.js.map → WorkflowExecutionPage-BTocv8or.js.map} +1 -1
  262. package/dashboard/dist/assets/{WorkflowPill-CKHip3hH.js → WorkflowPill-BiLYq__w.js} +2 -2
  263. package/dashboard/dist/assets/{WorkflowPill-CKHip3hH.js.map → WorkflowPill-BiLYq__w.js.map} +1 -1
  264. package/dashboard/dist/assets/WorkflowsDashboard-CIPEt3et.js +2 -0
  265. package/dashboard/dist/assets/{WorkflowsDashboard-g_N4y3QS.js.map → WorkflowsDashboard-CIPEt3et.js.map} +1 -1
  266. package/dashboard/dist/assets/{WorkflowsOverview-Drjo-Lu-.js → WorkflowsOverview-Bj4MJIE-.js} +2 -2
  267. package/dashboard/dist/assets/{WorkflowsOverview-Drjo-Lu-.js.map → WorkflowsOverview-Bj4MJIE-.js.map} +1 -1
  268. package/dashboard/dist/assets/{YamlWorkflowDetailPage-CLltNHjZ.js → YamlWorkflowDetailPage-DMEk5k9-.js} +2 -2
  269. package/dashboard/dist/assets/{YamlWorkflowDetailPage-CLltNHjZ.js.map → YamlWorkflowDetailPage-DMEk5k9-.js.map} +1 -1
  270. package/dashboard/dist/assets/{YamlWorkflowsPage-CxQCB-Zi.js → YamlWorkflowsPage-F2yyyoiB.js} +2 -2
  271. package/dashboard/dist/assets/{YamlWorkflowsPage-CxQCB-Zi.js.map → YamlWorkflowsPage-F2yyyoiB.js.map} +1 -1
  272. package/dashboard/dist/assets/{agents-Dk25jjhj.js → agents-mSgxEPpI.js} +2 -2
  273. package/dashboard/dist/assets/{agents-Dk25jjhj.js.map → agents-mSgxEPpI.js.map} +1 -1
  274. package/dashboard/dist/assets/{bots-bRkCqhlq.js → bots-p4Hp0CV6.js} +2 -2
  275. package/dashboard/dist/assets/{bots-bRkCqhlq.js.map → bots-p4Hp0CV6.js.map} +1 -1
  276. package/dashboard/dist/assets/{capabilities-DARawLry.js → capabilities-D_-I_SXR.js} +2 -2
  277. package/dashboard/dist/assets/{capabilities-DARawLry.js.map → capabilities-D_-I_SXR.js.map} +1 -1
  278. package/dashboard/dist/assets/{controlplane-DKccxxs6.js → controlplane-DjdoQnRU.js} +2 -2
  279. package/dashboard/dist/assets/{controlplane-DKccxxs6.js.map → controlplane-DjdoQnRU.js.map} +1 -1
  280. package/dashboard/dist/assets/{escalation-columns-BaYuzMYf.js → escalation-columns-R_IEVQjQ.js} +2 -2
  281. package/dashboard/dist/assets/{escalation-columns-BaYuzMYf.js.map → escalation-columns-R_IEVQjQ.js.map} +1 -1
  282. package/dashboard/dist/assets/{escalation-items-CwbNFnsH.js → escalation-items-BGZlJMpk.js} +2 -2
  283. package/dashboard/dist/assets/{escalation-items-CwbNFnsH.js.map → escalation-items-BGZlJMpk.js.map} +1 -1
  284. package/dashboard/dist/assets/{index-Cf6qCgTf.js → index-BEMdD58x.js} +2 -2
  285. package/dashboard/dist/assets/{index-Cf6qCgTf.js.map → index-BEMdD58x.js.map} +1 -1
  286. package/dashboard/dist/assets/index-BUmz0NMg.css +1 -0
  287. package/dashboard/dist/assets/{index-hKOlahpE.js → index-BuCEhhnl.js} +2 -2
  288. package/dashboard/dist/assets/{index-hKOlahpE.js.map → index-BuCEhhnl.js.map} +1 -1
  289. package/dashboard/dist/assets/{index-D1uliPqS.js → index-BxbQmeqh.js} +2 -2
  290. package/dashboard/dist/assets/{index-D1uliPqS.js.map → index-BxbQmeqh.js.map} +1 -1
  291. package/dashboard/dist/assets/index-C5osluV3.js +2 -0
  292. package/dashboard/dist/assets/{index-CtrSYqmL.js.map → index-C5osluV3.js.map} +1 -1
  293. package/dashboard/dist/assets/{index-CU2UW2y6.js → index-C_dAJUzh.js} +25 -25
  294. package/dashboard/dist/assets/index-C_dAJUzh.js.map +1 -0
  295. package/dashboard/dist/assets/{index-Bx9HVzuT.js → index-D-FYj9jT.js} +2 -2
  296. package/dashboard/dist/assets/{index-Bx9HVzuT.js.map → index-D-FYj9jT.js.map} +1 -1
  297. package/dashboard/dist/assets/{index-BZgtzkkG.js → index-D6K_IgCz.js} +2 -2
  298. package/dashboard/dist/assets/{index-BZgtzkkG.js.map → index-D6K_IgCz.js.map} +1 -1
  299. package/dashboard/dist/assets/index-D7L_VoBD.js +2 -0
  300. package/dashboard/dist/assets/index-D7L_VoBD.js.map +1 -0
  301. package/dashboard/dist/assets/{index-DgpL_Lgc.js → index-D9RAN9sA.js} +2 -2
  302. package/dashboard/dist/assets/{index-DgpL_Lgc.js.map → index-D9RAN9sA.js.map} +1 -1
  303. package/dashboard/dist/assets/{index-dShcvdg3.js → index-DUYAGxwc.js} +2 -2
  304. package/dashboard/dist/assets/{index-dShcvdg3.js.map → index-DUYAGxwc.js.map} +1 -1
  305. package/dashboard/dist/assets/{index-E_hJ7vtX.js → index-Dk2KKo0z.js} +2 -2
  306. package/dashboard/dist/assets/{index-E_hJ7vtX.js.map → index-Dk2KKo0z.js.map} +1 -1
  307. package/dashboard/dist/assets/{index-DU2QCbgH.js → index-DlJkZ12b.js} +2 -2
  308. package/dashboard/dist/assets/{index-DU2QCbgH.js.map → index-DlJkZ12b.js.map} +1 -1
  309. package/dashboard/dist/assets/{index-kzifJWbM.js → index-FiNThtNU.js} +3 -3
  310. package/dashboard/dist/assets/{index-kzifJWbM.js.map → index-FiNThtNU.js.map} +1 -1
  311. package/dashboard/dist/assets/{knowledge-DOe5ks-E.js → knowledge-DSsPTqkK.js} +2 -2
  312. package/dashboard/dist/assets/{knowledge-DOe5ks-E.js.map → knowledge-DSsPTqkK.js.map} +1 -1
  313. package/dashboard/dist/assets/{machines-Zq_00v7k.js → machines-DSgGtqqr.js} +2 -2
  314. package/dashboard/dist/assets/{machines-Zq_00v7k.js.map → machines-DSgGtqqr.js.map} +1 -1
  315. package/dashboard/dist/assets/{mcp-BL8kD0oh.js → mcp-Cg-_uLw8.js} +2 -2
  316. package/dashboard/dist/assets/{mcp-BL8kD0oh.js.map → mcp-Cg-_uLw8.js.map} +1 -1
  317. package/dashboard/dist/assets/{mcp-query-BpokmJWi.js → mcp-query-DQombEK_.js} +2 -2
  318. package/dashboard/dist/assets/{mcp-query-BpokmJWi.js.map → mcp-query-DQombEK_.js.map} +1 -1
  319. package/dashboard/dist/assets/{personas-BubCnQZ8.js → personas-DYrcoVBu.js} +2 -2
  320. package/dashboard/dist/assets/{personas-BubCnQZ8.js.map → personas-DYrcoVBu.js.map} +1 -1
  321. package/dashboard/dist/assets/{pipelines--DUoMx7K.js → pipelines-wdb4xsey.js} +2 -2
  322. package/dashboard/dist/assets/{pipelines--DUoMx7K.js.map → pipelines-wdb4xsey.js.map} +1 -1
  323. package/dashboard/dist/assets/{tasks-CJXN4OB4.js → tasks-Bil7gvm9.js} +2 -2
  324. package/dashboard/dist/assets/{tasks-CJXN4OB4.js.map → tasks-Bil7gvm9.js.map} +1 -1
  325. package/dashboard/dist/assets/{topics-CAG08Ruo.js → topics-wBqaVhRR.js} +2 -2
  326. package/dashboard/dist/assets/{topics-CAG08Ruo.js.map → topics-wBqaVhRR.js.map} +1 -1
  327. package/dashboard/dist/assets/{useDebouncedValue-DQ2D8cm2.js → useDebouncedValue-CwrY8TpV.js} +2 -2
  328. package/dashboard/dist/assets/{useDebouncedValue-DQ2D8cm2.js.map → useDebouncedValue-CwrY8TpV.js.map} +1 -1
  329. package/dashboard/dist/assets/{useNamespace-DjEVAlJQ.js → useNamespace-Sod_xApz.js} +2 -2
  330. package/dashboard/dist/assets/{useNamespace-DjEVAlJQ.js.map → useNamespace-Sod_xApz.js.map} +1 -1
  331. package/dashboard/dist/assets/{useYamlActivityEvents-etcpfIwo.js → useYamlActivityEvents-CKLInV3C.js} +2 -2
  332. package/dashboard/dist/assets/{useYamlActivityEvents-etcpfIwo.js.map → useYamlActivityEvents-CKLInV3C.js.map} +1 -1
  333. package/dashboard/dist/assets/{validate-YJK_6a7m.js → validate-CYhW1xMJ.js} +2 -2
  334. package/dashboard/dist/assets/{validate-YJK_6a7m.js.map → validate-CYhW1xMJ.js.map} +1 -1
  335. package/dashboard/dist/assets/{vendor-icons-en0_uSRD.js → vendor-icons-ed7mYQw4.js} +2 -2
  336. package/dashboard/dist/assets/{vendor-icons-en0_uSRD.js.map → vendor-icons-ed7mYQw4.js.map} +1 -1
  337. package/dashboard/dist/assets/{yaml-workflows-D97Bz6li.js → yaml-workflows-C20qHo3L.js} +2 -2
  338. package/dashboard/dist/assets/{yaml-workflows-D97Bz6li.js.map → yaml-workflows-C20qHo3L.js.map} +1 -1
  339. package/dashboard/dist/index.html +3 -3
  340. package/docs/api/http/labels.md +115 -0
  341. package/docs/api/http/users.md +2 -0
  342. package/docs/api/mcp/admin.md +76 -1
  343. package/docs/code-owned-configuration.md +1 -1
  344. package/docs/iam.md +12 -0
  345. package/docs/label-sheets.md +267 -0
  346. package/docs/scan-codes.md +11 -5
  347. package/package.json +4 -1
  348. package/dashboard/dist/assets/AvailableEscalationsPage-BRKyG5qZ.js +0 -2
  349. package/dashboard/dist/assets/AvailableEscalationsPage-BRKyG5qZ.js.map +0 -1
  350. package/dashboard/dist/assets/BulkAssignModal-BWfzPrRk.js +0 -2
  351. package/dashboard/dist/assets/HomePage-BUlSnCg8.js +0 -2
  352. package/dashboard/dist/assets/McpRunDetailPage-BHVEcKV5.js +0 -2
  353. package/dashboard/dist/assets/OperatorDashboard-CMkgMewd.js +0 -2
  354. package/dashboard/dist/assets/PersonaDetailPage-Cs1FFdNq.js +0 -2
  355. package/dashboard/dist/assets/RolesPage-CUP7EH5U.js +0 -2
  356. package/dashboard/dist/assets/RunAsSelector-B9-1vgZr.js +0 -2
  357. package/dashboard/dist/assets/ScanCodesPage-KN_e2rJl.js +0 -2
  358. package/dashboard/dist/assets/ScanSchemeDetailPage-CqItQ67Y.js +0 -5
  359. package/dashboard/dist/assets/ScanSchemeDetailPage-CqItQ67Y.js.map +0 -1
  360. package/dashboard/dist/assets/ScanStationPage-B0qbUOwc.js +0 -2
  361. package/dashboard/dist/assets/WorkflowExecutionPage-DkM1TS4I.js +0 -2
  362. package/dashboard/dist/assets/WorkflowsDashboard-g_N4y3QS.js +0 -2
  363. package/dashboard/dist/assets/index-BmzscsXK.css +0 -1
  364. package/dashboard/dist/assets/index-CU2UW2y6.js.map +0 -1
  365. package/dashboard/dist/assets/index-CtrSYqmL.js +0 -2
  366. package/dashboard/dist/assets/index-DU-1gMks.js +0 -2
  367. package/dashboard/dist/assets/index-DU-1gMks.js.map +0 -1
@@ -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;
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ // Barcode encoding: the one module that knows bwip-js. Renderers draw the
3
+ // dark modules this returns; ZPL uses the printer's own encoder instead.
4
+ var __importDefault = (this && this.__importDefault) || function (mod) {
5
+ return (mod && mod.__esModule) ? mod : { "default": mod };
6
+ };
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.SymbolEncodeError = void 0;
9
+ exports.quietZoneModules = quietZoneModules;
10
+ exports.encodeSymbol = encodeSymbol;
11
+ const bwip_js_1 = __importDefault(require("bwip-js"));
12
+ /** Data the symbology cannot carry. The message never repeats the data. */
13
+ class SymbolEncodeError extends Error {
14
+ constructor(message) {
15
+ super(message);
16
+ this.name = 'SymbolEncodeError';
17
+ }
18
+ }
19
+ exports.SymbolEncodeError = SymbolEncodeError;
20
+ const BCID = { code128: 'code128', qrcode: 'qrcode', datamatrix: 'datamatrix' };
21
+ const QUIET_ZONE = { code128: 10, qrcode: 4, datamatrix: 1 };
22
+ const PRINTABLE_ASCII = /^[\x20-\x7e]+$/;
23
+ /** The blank margin, in modules, a scanner needs around the symbol. */
24
+ function quietZoneModules(symbology) {
25
+ return QUIET_ZONE[symbology];
26
+ }
27
+ function linearPath(sbs) {
28
+ let x = 0;
29
+ const bars = [];
30
+ sbs.forEach((run, i) => {
31
+ if (i % 2 === 0)
32
+ bars.push(`M${x} 0h${run}v1h-${run}z`);
33
+ x += run;
34
+ });
35
+ return { path: bars.join(''), width: x };
36
+ }
37
+ function matrixPath(raw) {
38
+ const rows = [];
39
+ for (let y = 0; y < raw.pixy; y++) {
40
+ let x = 0;
41
+ while (x < raw.pixx) {
42
+ if (!raw.pixs[y * raw.pixx + x]) {
43
+ x++;
44
+ continue;
45
+ }
46
+ const start = x;
47
+ while (x < raw.pixx && raw.pixs[y * raw.pixx + x])
48
+ x++;
49
+ rows.push(`M${start} ${y}h${x - start}v1h-${x - start}z`);
50
+ }
51
+ }
52
+ return rows.join('');
53
+ }
54
+ /** Encode `data` in `symbology`; throws SymbolEncodeError when it cannot be carried. */
55
+ function encodeSymbol(symbology, data) {
56
+ if (!data)
57
+ throw new SymbolEncodeError('a code is empty');
58
+ if (symbology === 'code128' && !PRINTABLE_ASCII.test(data)) {
59
+ throw new SymbolEncodeError('Code 128 carries printable ASCII only');
60
+ }
61
+ let raw;
62
+ try {
63
+ raw = bwip_js_1.default.raw(BCID[symbology], data, {});
64
+ }
65
+ catch {
66
+ throw new SymbolEncodeError(`a code cannot be encoded as ${symbology}`);
67
+ }
68
+ const first = raw[0];
69
+ if ('sbs' in first) {
70
+ const { path, width } = linearPath(first.sbs);
71
+ return { path, widthModules: width, heightModules: 1 };
72
+ }
73
+ return { path: matrixPath(first), widthModules: first.pixx, heightModules: first.pixy };
74
+ }
@@ -0,0 +1,18 @@
1
+ export interface LabelTokenContext {
2
+ target: string;
3
+ /** The row's metadata (action schemes) or a pasted list's columns. */
4
+ item?: Record<string, unknown>;
5
+ /** The identity scheme's user: name, display_name, email, roles, and metadata keys. */
6
+ user?: Record<string, unknown>;
7
+ scheme?: {
8
+ name: string;
9
+ };
10
+ }
11
+ /** Render one line of label text. */
12
+ export declare function renderLabelText(template: string, ctx: LabelTokenContext): string;
13
+ /** Every token a line uses, valid or not, without braces. */
14
+ export declare function listLabelTokens(template: string): string[];
15
+ /** Tokens in a line that renderLabelText does not know. */
16
+ export declare function unknownLabelTokens(template: string): string[];
17
+ /** `user.<key>` tokens a line uses, as keys. */
18
+ export declare function userTokenKeys(template: string): string[];
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ // Label text tokens: {target}, {item.<facet>}, {user.<key>}, {scheme.name}.
3
+ // A missing value renders empty; template validation names unknown tokens.
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.renderLabelText = renderLabelText;
6
+ exports.listLabelTokens = listLabelTokens;
7
+ exports.unknownLabelTokens = unknownLabelTokens;
8
+ exports.userTokenKeys = userTokenKeys;
9
+ const TOKEN = /\{(target|scheme\.name|(?:item|user)\.[a-zA-Z0-9_]+)\}/g;
10
+ const ANY_TOKEN = /\{([^{}]*)\}/g;
11
+ function display(value) {
12
+ if (value === null || value === undefined)
13
+ return '';
14
+ if (Array.isArray(value))
15
+ return value.map(display).filter(Boolean).join(', ');
16
+ if (typeof value === 'object')
17
+ return '';
18
+ return String(value);
19
+ }
20
+ function resolve(token, ctx) {
21
+ if (token === 'target')
22
+ return ctx.target;
23
+ if (token === 'scheme.name')
24
+ return ctx.scheme?.name;
25
+ const [bag, key] = token.split('.', 2);
26
+ return (bag === 'item' ? ctx.item : ctx.user)?.[key];
27
+ }
28
+ /** Render one line of label text. */
29
+ function renderLabelText(template, ctx) {
30
+ return template.replace(TOKEN, (_m, token) => display(resolve(token, ctx))).trim();
31
+ }
32
+ /** Every token a line uses, valid or not, without braces. */
33
+ function listLabelTokens(template) {
34
+ return [...template.matchAll(ANY_TOKEN)].map((m) => m[1]);
35
+ }
36
+ /** Tokens in a line that renderLabelText does not know. */
37
+ function unknownLabelTokens(template) {
38
+ return listLabelTokens(template).filter((t) => !new RegExp(`^${TOKEN.source}$`).test(`{${t}}`));
39
+ }
40
+ /** `user.<key>` tokens a line uses, as keys. */
41
+ function userTokenKeys(template) {
42
+ return listLabelTokens(template).filter((t) => t.startsWith('user.')).map((t) => t.slice(5));
43
+ }
@@ -0,0 +1,105 @@
1
+ export declare const LABEL_SYMBOLOGIES: readonly ["code128", "qrcode", "datamatrix"];
2
+ export type LabelSymbology = (typeof LABEL_SYMBOLOGIES)[number];
3
+ /** How a code's caption band prints on black-only stock: filled, outlined, or bare text. */
4
+ export declare const LABEL_TONES: readonly ["solid", "outline", "plain"];
5
+ export type LabelTone = (typeof LABEL_TONES)[number];
6
+ /** A sheet of labels (office printer) or a thermal roll (one label per page). */
7
+ export interface LabelMedia {
8
+ id: string;
9
+ name: string;
10
+ family: 'sheet' | 'thermal';
11
+ pageWidthMm: number;
12
+ pageHeightMm: number;
13
+ columns: number;
14
+ rows: number;
15
+ labelWidthMm: number;
16
+ labelHeightMm: number;
17
+ marginTopMm: number;
18
+ marginLeftMm: number;
19
+ gutterXMm: number;
20
+ gutterYMm: number;
21
+ cornerRadiusMm: number;
22
+ /** Thermal print resolution in dots per inch. */
23
+ dpi?: number;
24
+ /** The narrowest bar or module a scanner reads reliably from this stock. */
25
+ minModuleMm: number;
26
+ }
27
+ /** One code on a label: the payload, the act it names, and its band tone. */
28
+ export interface LabelCode {
29
+ code: string;
30
+ caption: string;
31
+ tone: LabelTone;
32
+ }
33
+ /** What one label says, before layout. A masked label draws placeholders instead of codes. */
34
+ export interface LabelContent {
35
+ title?: string;
36
+ lines: string[];
37
+ codes: LabelCode[];
38
+ masked?: boolean;
39
+ }
40
+ export interface LabelTextElement {
41
+ kind: 'text';
42
+ x: number;
43
+ y: number;
44
+ w: number;
45
+ /** Font size in millimetres (the em box). */
46
+ size: number;
47
+ text: string;
48
+ weight: 'regular' | 'bold';
49
+ align: 'left' | 'center';
50
+ /** White text, printed over a solid band. */
51
+ inverse?: boolean;
52
+ }
53
+ export interface LabelRectElement {
54
+ kind: 'rect';
55
+ x: number;
56
+ y: number;
57
+ w: number;
58
+ h: number;
59
+ /** Filled black when true; outlined with `stroke` mm otherwise. */
60
+ fill: boolean;
61
+ stroke?: number;
62
+ }
63
+ export interface LabelSymbolElement {
64
+ kind: 'symbol';
65
+ x: number;
66
+ y: number;
67
+ w: number;
68
+ h: number;
69
+ symbology: LabelSymbology;
70
+ /** The encoded payload; empty when masked. */
71
+ data: string;
72
+ moduleMm: number;
73
+ /** Dark modules as an SVG path in module units; empty when masked. */
74
+ path: string;
75
+ masked?: boolean;
76
+ }
77
+ export type LabelElement = LabelTextElement | LabelRectElement | LabelSymbolElement;
78
+ export interface PlacedLabel {
79
+ /** Position on the page, counted from 0, left to right then top to bottom. */
80
+ slot: number;
81
+ /** Index of the label in the job's input. */
82
+ index: number;
83
+ x: number;
84
+ y: number;
85
+ w: number;
86
+ h: number;
87
+ elements: LabelElement[];
88
+ }
89
+ export interface LabelPage {
90
+ labels: PlacedLabel[];
91
+ }
92
+ export declare const LABEL_WARNING_KINDS: readonly ["scale", "quiet_zone", "unencodable", "unparseable", "rule_disabled", "unresolved", "overflow", "missing_token"];
93
+ export type LabelWarningKind = (typeof LABEL_WARNING_KINDS)[number];
94
+ export interface LabelWarning {
95
+ /** Index of the label in the job's input. */
96
+ index: number;
97
+ kind: LabelWarningKind;
98
+ detail: string;
99
+ }
100
+ export interface LabelSheet {
101
+ media: LabelMedia;
102
+ pages: LabelPage[];
103
+ cutMarks: boolean;
104
+ warnings: LabelWarning[];
105
+ }