@leavepulse/ui 0.83.1 → 0.85.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 (323) hide show
  1. package/README.md +22 -0
  2. package/dist/assets/{LpDropzone-DNbh_NFJ.css → LpDropzone-CfL3Vrx4.css} +10 -10
  3. package/dist/assets/{LpImageEditor-Bgu20XLs.css → LpImageEditor-y3B-aW3H.css} +6 -6
  4. package/dist/assets/{LpKeys-C5VMcBOW.css → LpKeys-5ijsXX-M.css} +6 -6
  5. package/dist/assets/{LpShortcutsDialog-C6uzPeMf.css → LpShortcutsDialog-BBdVWxZq.css} +7 -7
  6. package/dist/assets/LpVideoTrim-CMoUw3dJ.css +8 -0
  7. package/dist/chunks/{ContextMenuItems-h-apPY2d.js → ContextMenuItems-D15cGEw9.js} +1 -1
  8. package/dist/chunks/{DropzoneLinkField-_Op8b_ee.js → DropzoneLinkField-Dz7fIaLh.js} +1 -1
  9. package/dist/chunks/{FieldLeading-mOMcwNqi.js → FieldLeading-DZZLK02U.js} +1 -1
  10. package/dist/chunks/{FieldWrapper-DtT-AIcn.js → FieldWrapper-BDDw1F9H.js} +1 -1
  11. package/dist/chunks/{IconCloseButton-YmisskyZ.js → IconCloseButton-Cn_w4aN3.js} +1 -1
  12. package/dist/chunks/{LayoutCanvas-BrISZEBr.js → LayoutCanvas-Dr5eSfAu.js} +1 -1
  13. package/dist/chunks/{LayoutNode-CwMQ8ACa.js → LayoutNode-CViJnx6q.js} +1 -1
  14. package/dist/chunks/{LpActionBar-CVVC6YbC.js → LpActionBar-C0LK-Aqs.js} +1 -1
  15. package/dist/chunks/{LpAddressInput-tiuJ-bru.js → LpAddressInput-B9sSvodU.js} +7 -7
  16. package/dist/chunks/{LpAlert-8-x4H_Nk.js → LpAlert-Bpd7122M.js} +1 -1
  17. package/dist/chunks/{LpAppShell-BW2YMq-A.js → LpAppShell-DW8JmY1o.js} +4 -4
  18. package/dist/chunks/{LpAutocomplete-BZODIops.js → LpAutocomplete-CQID7Zc-.js} +4 -4
  19. package/dist/chunks/{LpAvatar-BZq4nH53.js → LpAvatar-DLkiMGKx.js} +1 -1
  20. package/dist/chunks/{LpBadge-Cz0pSSUu.js → LpBadge-RFp8uHFt.js} +1 -1
  21. package/dist/chunks/{LpBottomNav-DVdR5Mry.js → LpBottomNav-BcJVkAhh.js} +1 -1
  22. package/dist/chunks/{LpBreadcrumbs-B2jphAel.js → LpBreadcrumbs-DJ_DB45r.js} +1 -1
  23. package/dist/chunks/{LpCalendar-C0_N5LVT.js → LpCalendar-D6tfCr2G.js} +1 -1
  24. package/dist/chunks/{LpCheckbox-CwqLNdw4.js → LpCheckbox-DcXC2qd5.js} +2 -2
  25. package/dist/chunks/{LpCodeBlock-Dcss6bnl.js → LpCodeBlock-Dx0J9xlm.js} +2 -2
  26. package/dist/chunks/{LpCodeDisplay-CLms1zDY.js → LpCodeDisplay-BlN7U8Z-.js} +4 -4
  27. package/dist/chunks/{LpColorPicker-CbIY450X.js → LpColorPicker-Cjna_Bio.js} +3 -3
  28. package/dist/chunks/{LpConfirmDialog-RmP4z6va.js → LpConfirmDialog-bfcX5F9d.js} +2 -2
  29. package/dist/chunks/{LpConfirmHost-DheBgRMB.js → LpConfirmHost-DIgloymi.js} +1 -1
  30. package/dist/chunks/{LpContextMenu-DIYhlap8.js → LpContextMenu-CUFZIQX2.js} +2 -2
  31. package/dist/chunks/{LpContextSwitcher-fDA6ERl-.js → LpContextSwitcher-CMweLbv2.js} +2 -2
  32. package/dist/chunks/{LpCopyButton-DSqKFGEb.js → LpCopyButton-BrbvIVMG.js} +1 -1
  33. package/dist/chunks/{LpDataList-f9UjSx9m.js → LpDataList-DhETPjzv.js} +2 -2
  34. package/dist/chunks/{LpDatePicker-3kDQLVbg.js → LpDatePicker-B5gzwI3T.js} +5 -5
  35. package/dist/chunks/{LpDateRangePicker-DUPiTt0_.js → LpDateRangePicker-CwNnpyoL.js} +3 -3
  36. package/dist/chunks/{LpDisclosure-C5WZjhbQ.js → LpDisclosure-CsJ7nnFz.js} +1 -1
  37. package/dist/chunks/{LpDrawer-CkYvIGIa.js → LpDrawer-C1q2bl1r.js} +1 -1
  38. package/dist/chunks/{LpDropdownMenu-zSsK2Xra.js → LpDropdownMenu-DRABI-Bl.js} +2 -2
  39. package/dist/chunks/{LpEditable-CP7Y_lKg.js → LpEditable-DCPdDDBb.js} +2 -2
  40. package/dist/chunks/{LpEmptyState-dsc5x-ya.js → LpEmptyState-DT8U4R8L.js} +1 -1
  41. package/dist/chunks/{LpFieldNotice-TOTbWvgv.js → LpFieldNotice-mcmO-O-J.js} +1 -1
  42. package/dist/chunks/{LpFileTree-BPjnOTln.js → LpFileTree-wiXExcZI.js} +4 -4
  43. package/dist/chunks/{LpFileTreeNode-_-MiWmie.js → LpFileTreeNode-DfvIGmSz.js} +4 -4
  44. package/dist/chunks/{LpFormField-BJwD1iEF.js → LpFormField-C5GOuOY-.js} +1 -1
  45. package/dist/chunks/{LpHintLayer-CmfGnxYu.js → LpHintLayer-B0choo1r.js} +1 -1
  46. package/dist/chunks/{LpHints-C2Xvc1Fd.js → LpHints-BEetUVTl.js} +3 -3
  47. package/dist/chunks/{LpIcon-CoOLz1oJ.js → LpIcon-DCGhNsCU.js} +1 -1
  48. package/dist/chunks/{LpInfraNode-CW3qsM-U.js → LpInfraNode-BsExhdPE.js} +2 -2
  49. package/dist/chunks/{LpInput-BVWhkPuN.js → LpInput-CKMblRtp.js} +3 -3
  50. package/dist/chunks/{LpInspector-REmoX_es.js → LpInspector-CqPgVXrm.js} +4 -4
  51. package/dist/chunks/{LpLightbox-C3FFTYP5.js → LpLightbox-D7iJqdmH.js} +4 -4
  52. package/dist/chunks/{LpLogInspector-Cs8Z_fM0.js → LpLogInspector-Yj310k4n.js} +2 -2
  53. package/dist/chunks/{LpLogViewer-DQRGe-ZK.js → LpLogViewer-Bki-IdNC.js} +6 -6
  54. package/dist/chunks/{LpMapPicker-CQnQPgKm.js → LpMapPicker-CnpJhiY0.js} +1 -1
  55. package/dist/chunks/{LpMediaGallery-DkKqTy9P.js → LpMediaGallery-D6DyJDvL.js} +4 -4
  56. package/dist/chunks/{LpModal-DwejR7VP.js → LpModal-B5y9_LgA.js} +1 -1
  57. package/dist/chunks/{LpModalNav-D1-dSe6f.js → LpModalNav-BLvDVl2-.js} +3 -3
  58. package/dist/chunks/{LpNotificationBell-EKLkN0sp.js → LpNotificationBell-Bf0u3t5q.js} +4 -4
  59. package/dist/chunks/{LpNotificationFeed-Dc-yQ4NH.js → LpNotificationFeed-BPZM3zkS.js} +4 -4
  60. package/dist/chunks/{LpNumberField-DvUjEMp-.js → LpNumberField-BeYT7zzt.js} +3 -3
  61. package/dist/chunks/{LpOtpInput-xvDO14f4.js → LpOtpInput-DqwY-U5R.js} +1 -1
  62. package/dist/chunks/{LpPagination-BFZY8dFn.js → LpPagination-V1wEhu1K.js} +1 -1
  63. package/dist/chunks/{LpPaletteTheme-EBJv0Bwz.js → LpPaletteTheme-Bi6pD1GL.js} +2 -2
  64. package/dist/chunks/{LpPasswordInput-DRJR3fF1.js → LpPasswordInput-LaOXNYuV.js} +2 -2
  65. package/dist/chunks/{LpPhoneInput-BGOOtUoW.js → LpPhoneInput-D7Tq2iaz.js} +3 -3
  66. package/dist/chunks/{LpPie-Deyn8h5J.js → LpPie-Bzv8mnVR.js} +2 -2
  67. package/dist/chunks/{LpPipeline-9ChjeNh5.js → LpPipeline-D-uPcbMN.js} +2 -2
  68. package/dist/chunks/{LpQuota-CNh5eF_p.js → LpQuota-BR8ck2a9.js} +1 -1
  69. package/dist/chunks/{LpRadioGroup-Br2Nl9Gr.js → LpRadioGroup-DSOCL9MD.js} +2 -2
  70. package/dist/chunks/{LpRangeCalendar-D66Y3U_w.js → LpRangeCalendar-QepHrmba.js} +1 -1
  71. package/dist/chunks/{LpRangeSlider-eX-fIlOw.js → LpRangeSlider-BaAM7XIs.js} +1 -1
  72. package/dist/chunks/{LpRepeater-0XvnlVd_.js → LpRepeater-BKq5XPh4.js} +3 -3
  73. package/dist/chunks/{LpSecretField-1RCooChq.js → LpSecretField-_B2qPfk8.js} +5 -5
  74. package/dist/chunks/{LpSection-B9gbJJcP.js → LpSection-BGzlKIWO.js} +1 -1
  75. package/dist/chunks/{LpSegmented-hIjGzGTo.js → LpSegmented-CiaF9DUK.js} +2 -2
  76. package/dist/chunks/{LpSelect-DugubwTc.js → LpSelect-CB6Xbnfk.js} +4 -4
  77. package/dist/chunks/{LpSidebar-DevSoN8W.js → LpSidebar-DnqbKULj.js} +4 -4
  78. package/dist/chunks/{LpSidebarNav-DwQQ3KXe.js → LpSidebarNav-B3Eo_VIS.js} +4 -4
  79. package/dist/chunks/{LpSidebarRow-CAGgtJCS.js → LpSidebarRow-CDBnvvd8.js} +3 -3
  80. package/dist/chunks/{LpSlider-1fHpVxpB.js → LpSlider-DTb_Ivkm.js} +1 -1
  81. package/dist/chunks/{LpStat-Cm9-FaWQ.js → LpStat-BtxSto7K.js} +2 -2
  82. package/dist/chunks/{LpStatus-CE8FSAT1.js → LpStatus-_fIwWXQV.js} +1 -1
  83. package/dist/chunks/{LpStepMark-BWSlV69R.js → LpStepMark-iDZw1DYf.js} +1 -1
  84. package/dist/chunks/{LpStepper-1D0ZA7Nx.js → LpStepper-CjC3cp1F.js} +1 -1
  85. package/dist/chunks/{LpSwitch-D_kvE0oQ.js → LpSwitch-BNHyYDhX.js} +1 -1
  86. package/dist/chunks/{LpTabFace-CpbFKi-N.js → LpTabFace-gATEe9pQ.js} +2 -2
  87. package/dist/chunks/{LpTableFilter-BYHyCu38.js → LpTableFilter-B_BFoBqS.js} +2 -2
  88. package/dist/chunks/{LpTagsInput-Cqm38t5N.js → LpTagsInput-By7LMb47.js} +5 -5
  89. package/dist/chunks/{LpTextarea-DaSKBkiV.js → LpTextarea-Ck6RAfzu.js} +1 -1
  90. package/dist/chunks/{LpThemeStudio-BNdfi-Ds.js → LpThemeStudio-C1xKiv8C.js} +5 -5
  91. package/dist/chunks/{LpThemeSwitcher-CbC1nqBP.js → LpThemeSwitcher-Dk4Bk6u1.js} +3 -3
  92. package/dist/chunks/{LpTimeField-CCfPCWPT.js → LpTimeField-BTKJVeNt.js} +2 -2
  93. package/dist/chunks/{LpToaster-BhlI7h-h.js → LpToaster-C_CFWSys.js} +2 -2
  94. package/dist/chunks/{LpTopologyCanvas-DlKbu7E5.js → LpTopologyCanvas-paC1Dup-.js} +4 -4
  95. package/dist/chunks/{LpTour-CSLerA1B.js → LpTour-D_AN_SsZ.js} +1 -1
  96. package/dist/chunks/{LpTruncate-Ct26BSYB.js → LpTruncate-CBUKnr36.js} +1 -1
  97. package/dist/chunks/LpVideoCompress-BfulQ8Rs.js +245 -0
  98. package/dist/chunks/{LpVideoPlayer-DcWd9DDW.js → LpVideoPlayer-koYKHKkC.js} +4 -4
  99. package/dist/chunks/{LpWindow-YnF_knSj.js → LpWindow-Bo5qQgVY.js} +2 -2
  100. package/dist/chunks/{LpWorkspaceSwitcher-B-5UU6o4.js → LpWorkspaceSwitcher-D50sHs9N.js} +3 -3
  101. package/dist/chunks/{MenuTitle-BnZbFSwq.js → MenuTitle-DCHcfyPH.js} +1 -1
  102. package/dist/chunks/{OptionContent-D5e_eklA.js → OptionContent-o58kS7Zh.js} +1 -1
  103. package/dist/chunks/{PickerField-KpHiowNI.js → PickerField-DNo1k89A.js} +1 -1
  104. package/dist/chunks/{RevealToggle-CE1hAIJB.js → RevealToggle-w7-BMcgC.js} +1 -1
  105. package/dist/chunks/{TourCard-t2csiTDS.js → TourCard-0yYxSdd4.js} +1 -1
  106. package/dist/chunks/{VideoThumb-Csf9bUz3.js → VideoThumb-DL_QkAJY.js} +1 -1
  107. package/dist/chunks/{VideoVolume-B4_DNmNi.js → VideoVolume-D-2TmsVj.js} +2 -2
  108. package/dist/chunks/{icons-CdSlCrle.js → icons-V0k93Puc.js} +3 -3
  109. package/dist/component-names.d.ts +1 -1
  110. package/dist/components/ContextMenuItems.vue.js +1 -1
  111. package/dist/components/DropzoneLinkField.vue.js +1 -1
  112. package/dist/components/FieldLeading.vue.js +1 -1
  113. package/dist/components/FieldWrapper.vue.js +1 -1
  114. package/dist/components/HintSampleTag.vue.d.ts +5 -3
  115. package/dist/components/IconCloseButton.vue.js +1 -1
  116. package/dist/components/LayoutCanvas.vue.js +1 -1
  117. package/dist/components/LayoutNode.vue.js +1 -1
  118. package/dist/components/LpActionBar.vue.d.ts +5 -3
  119. package/dist/components/LpActionBar.vue.js +1 -1
  120. package/dist/components/LpActivityLine.vue.d.ts +6 -6
  121. package/dist/components/LpAddressInput.vue.js +1 -1
  122. package/dist/components/LpAlert.vue.d.ts +1 -1
  123. package/dist/components/LpAlert.vue.js +1 -1
  124. package/dist/components/LpAppShell.vue.d.ts +10 -14
  125. package/dist/components/LpAppShell.vue.js +1 -1
  126. package/dist/components/LpAutocomplete.vue.js +1 -1
  127. package/dist/components/LpAvatar.vue.js +1 -1
  128. package/dist/components/LpBadge.vue.d.ts +4 -0
  129. package/dist/components/LpBadge.vue.js +1 -1
  130. package/dist/components/LpBottomNav.vue.d.ts +6 -4
  131. package/dist/components/LpBottomNav.vue.js +1 -1
  132. package/dist/components/LpBreadcrumbs.vue.d.ts +6 -6
  133. package/dist/components/LpBreadcrumbs.vue.js +1 -1
  134. package/dist/components/LpButton.vue.d.ts +6 -6
  135. package/dist/components/LpCalendar.vue.js +1 -1
  136. package/dist/components/LpChart.vue.js +2 -2
  137. package/dist/components/LpCheckbox.vue.js +1 -1
  138. package/dist/components/LpCodeBlock.vue.d.ts +12 -2
  139. package/dist/components/LpCodeBlock.vue.js +1 -1
  140. package/dist/components/LpCodeDisplay.vue.d.ts +1 -1
  141. package/dist/components/LpCodeDisplay.vue.js +1 -1
  142. package/dist/components/LpColorPicker.vue.js +1 -1
  143. package/dist/components/LpCommandPalette.vue.d.ts +1 -1
  144. package/dist/components/LpCommandPalette.vue.js +2 -2
  145. package/dist/components/LpConfirmDialog.vue.js +1 -1
  146. package/dist/components/LpConfirmHost.vue.js +1 -1
  147. package/dist/components/LpContextMenu.vue.js +1 -1
  148. package/dist/components/LpContextSwitcher.vue.d.ts +6 -4
  149. package/dist/components/LpContextSwitcher.vue.js +1 -1
  150. package/dist/components/LpCopyButton.vue.js +1 -1
  151. package/dist/components/LpDataList.vue.js +1 -1
  152. package/dist/components/LpDatePicker.vue.js +1 -1
  153. package/dist/components/LpDateRangePicker.vue.js +1 -1
  154. package/dist/components/LpDisclosure.vue.js +1 -1
  155. package/dist/components/LpDock.vue.js +1 -1
  156. package/dist/components/LpDrawer.vue.d.ts +6 -6
  157. package/dist/components/LpDrawer.vue.js +1 -1
  158. package/dist/components/LpDropdownMenu.vue.js +1 -1
  159. package/dist/components/LpDropzone.vue.d.ts +10 -14
  160. package/dist/components/LpDropzone.vue.js +4 -4
  161. package/dist/components/LpEditable.vue.js +1 -1
  162. package/dist/components/LpEmptyState.vue.js +1 -1
  163. package/dist/components/LpFieldNotice.vue.js +1 -1
  164. package/dist/components/LpFileTree.vue.js +1 -1
  165. package/dist/components/LpFileTreeNode.vue.js +1 -1
  166. package/dist/components/LpFormField.vue.js +1 -1
  167. package/dist/components/LpHintExample.vue.d.ts +2 -3
  168. package/dist/components/LpHintLayer.vue.d.ts +7 -8
  169. package/dist/components/LpHintLayer.vue.js +1 -1
  170. package/dist/components/LpHints.vue.d.ts +6 -5
  171. package/dist/components/LpHints.vue.js +1 -1
  172. package/dist/components/LpIcon.vue.js +1 -1
  173. package/dist/components/LpImageEditor.vue.d.ts +14 -3
  174. package/dist/components/LpImageEditor.vue.js +3 -3
  175. package/dist/components/LpInfraNode.vue.js +1 -1
  176. package/dist/components/LpInput.vue.d.ts +6 -6
  177. package/dist/components/LpInput.vue.js +1 -1
  178. package/dist/components/LpInspector.vue.d.ts +8 -6
  179. package/dist/components/LpInspector.vue.js +1 -1
  180. package/dist/components/LpKeys.vue.js +2 -2
  181. package/dist/components/LpLightbox.vue.js +1 -1
  182. package/dist/components/LpLogInspector.vue.js +1 -1
  183. package/dist/components/LpLogViewer.vue.js +1 -1
  184. package/dist/components/LpMapPicker.vue.d.ts +8 -0
  185. package/dist/components/LpMapPicker.vue.js +1 -1
  186. package/dist/components/LpMediaGallery.vue.d.ts +3 -7
  187. package/dist/components/LpMediaGallery.vue.js +1 -1
  188. package/dist/components/LpModal.vue.d.ts +5 -3
  189. package/dist/components/LpModal.vue.js +1 -1
  190. package/dist/components/LpModalNav.vue.d.ts +4 -0
  191. package/dist/components/LpModalNav.vue.js +1 -1
  192. package/dist/components/LpNotificationBell.vue.js +1 -1
  193. package/dist/components/LpNotificationFeed.vue.js +1 -1
  194. package/dist/components/LpNumberField.vue.js +1 -1
  195. package/dist/components/LpOtpInput.vue.js +1 -1
  196. package/dist/components/LpPagination.vue.d.ts +8 -2
  197. package/dist/components/LpPagination.vue.js +1 -1
  198. package/dist/components/LpPaletteFacts.vue.js +1 -1
  199. package/dist/components/LpPaletteHeader.vue.js +2 -2
  200. package/dist/components/LpPaletteTheme.vue.d.ts +12 -0
  201. package/dist/components/LpPaletteTheme.vue.js +1 -1
  202. package/dist/components/LpPasswordInput.vue.js +1 -1
  203. package/dist/components/LpPhoneInput.vue.js +1 -1
  204. package/dist/components/LpPie.vue.js +1 -1
  205. package/dist/components/LpPipeline.vue.js +1 -1
  206. package/dist/components/LpQuota.vue.js +1 -1
  207. package/dist/components/LpRadioGroup.vue.js +1 -1
  208. package/dist/components/LpRangeCalendar.vue.js +1 -1
  209. package/dist/components/LpRangeSlider.vue.js +1 -1
  210. package/dist/components/LpRepeater.vue.d.ts +9 -7
  211. package/dist/components/LpRepeater.vue.js +1 -1
  212. package/dist/components/LpSecretField.vue.js +1 -1
  213. package/dist/components/LpSection.vue.js +1 -1
  214. package/dist/components/LpSegmented.vue.js +1 -1
  215. package/dist/components/LpSelect.vue.js +1 -1
  216. package/dist/components/LpShortcutsDialog.vue.d.ts +11 -1
  217. package/dist/components/LpShortcutsDialog.vue.js +3 -3
  218. package/dist/components/LpSidebar.vue.d.ts +13 -11
  219. package/dist/components/LpSidebar.vue.js +1 -1
  220. package/dist/components/LpSidebarNav.vue.js +1 -1
  221. package/dist/components/LpSidebarRow.vue.js +1 -1
  222. package/dist/components/LpSlider.vue.js +1 -1
  223. package/dist/components/LpSparkline.vue.d.ts +10 -1
  224. package/dist/components/LpStat.vue.js +1 -1
  225. package/dist/components/LpStatus.vue.js +1 -1
  226. package/dist/components/LpStepMark.vue.js +1 -1
  227. package/dist/components/LpStepper.vue.js +1 -1
  228. package/dist/components/LpSwitch.vue.js +1 -1
  229. package/dist/components/LpTabFace.vue.js +1 -1
  230. package/dist/components/LpTable.vue.js +9 -9
  231. package/dist/components/LpTableFilter.vue.js +1 -1
  232. package/dist/components/LpTableOfContents.vue.d.ts +5 -3
  233. package/dist/components/LpTabs.vue.js +2 -2
  234. package/dist/components/LpTagsInput.vue.js +1 -1
  235. package/dist/components/LpTextarea.vue.js +1 -1
  236. package/dist/components/LpThemeStudio.vue.js +1 -1
  237. package/dist/components/LpThemeSwitcher.vue.d.ts +8 -6
  238. package/dist/components/LpThemeSwitcher.vue.js +1 -1
  239. package/dist/components/LpTimeField.vue.js +1 -1
  240. package/dist/components/LpToaster.vue.d.ts +7 -5
  241. package/dist/components/LpToaster.vue.js +1 -1
  242. package/dist/components/LpTopologyCanvas.vue.js +1 -1
  243. package/dist/components/LpTour.vue.d.ts +13 -20
  244. package/dist/components/LpTour.vue.js +1 -1
  245. package/dist/components/LpTruncate.vue.js +1 -1
  246. package/dist/components/LpTypewriter.vue.d.ts +1 -1
  247. package/dist/components/LpUptimeBar.vue.d.ts +4 -2
  248. package/dist/components/LpVideoCompress.vue.d.ts +63 -0
  249. package/dist/components/LpVideoCompress.vue.js +4 -0
  250. package/dist/components/LpVideoPlayer.vue.d.ts +33 -3
  251. package/dist/components/LpVideoPlayer.vue.js +1 -1
  252. package/dist/components/LpVideoTrim.vue.d.ts +40 -3
  253. package/dist/components/LpVideoTrim.vue.js +6 -6
  254. package/dist/components/LpWindow.vue.d.ts +7 -8
  255. package/dist/components/LpWindow.vue.js +1 -1
  256. package/dist/components/LpWorkspaceSwitcher.vue.d.ts +13 -11
  257. package/dist/components/LpWorkspaceSwitcher.vue.js +1 -1
  258. package/dist/components/MenuTitle.vue.js +1 -1
  259. package/dist/components/OptionContent.vue.js +1 -1
  260. package/dist/components/PickerField.vue.js +1 -1
  261. package/dist/components/RevealToggle.vue.js +1 -1
  262. package/dist/components/TourCard.vue.js +1 -1
  263. package/dist/components/VideoFlash.vue.js +1 -1
  264. package/dist/components/VideoThumb.vue.js +1 -1
  265. package/dist/components/VideoVolume.vue.js +1 -1
  266. package/dist/components/menuWhen.js +1 -1
  267. package/dist/components/status.d.ts +3 -1
  268. package/dist/composables/usePaletteCommands.d.ts +4 -0
  269. package/dist/composables/videoTranscode.d.ts +55 -0
  270. package/dist/composables/videoTranscode.js +134 -0
  271. package/dist/icons-all.js +1 -1
  272. package/dist/index.d.ts +44 -10
  273. package/dist/index.js +748 -170
  274. package/dist/locales/uk.d.ts +165 -0
  275. package/package.json +2 -1
  276. package/src/component-names.ts +1 -0
  277. package/src/components/HintSampleTag.vue +7 -2
  278. package/src/components/LpActionBar.vue +7 -2
  279. package/src/components/LpActivityLine.vue +7 -2
  280. package/src/components/LpAppShell.vue +11 -2
  281. package/src/components/LpBadge.vue +6 -1
  282. package/src/components/LpBottomNav.vue +8 -2
  283. package/src/components/LpBreadcrumbs.vue +7 -2
  284. package/src/components/LpButton.vue +7 -2
  285. package/src/components/LpCodeBlock.vue +13 -2
  286. package/src/components/LpContextSwitcher.vue +8 -2
  287. package/src/components/LpDrawer.vue +7 -2
  288. package/src/components/LpDropzone.vue +11 -2
  289. package/src/components/LpHintExample.vue +2 -2
  290. package/src/components/LpHintLayer.vue +9 -3
  291. package/src/components/LpHints.vue +17 -3
  292. package/src/components/LpImageEditor.vue +14 -7
  293. package/src/components/LpInput.vue +7 -2
  294. package/src/components/LpInspector.vue +10 -2
  295. package/src/components/LpKeys.vue +2 -1
  296. package/src/components/LpMapPicker.vue +10 -1
  297. package/src/components/LpMediaGallery.vue +12 -3
  298. package/src/components/LpModal.vue +7 -2
  299. package/src/components/LpModalNav.vue +6 -1
  300. package/src/components/LpPagination.vue +9 -2
  301. package/src/components/LpPaletteTheme.vue +14 -1
  302. package/src/components/LpRepeater.vue +11 -2
  303. package/src/components/LpShortcutsDialog.vue +12 -1
  304. package/src/components/LpSidebar.vue +15 -12
  305. package/src/components/LpSparkline.vue +12 -2
  306. package/src/components/LpTableOfContents.vue +7 -2
  307. package/src/components/LpThemeSwitcher.vue +10 -2
  308. package/src/components/LpToaster.vue +9 -2
  309. package/src/components/LpTour.vue +15 -3
  310. package/src/components/LpUptimeBar.vue +5 -2
  311. package/src/components/LpVideoCompress.vue +240 -0
  312. package/src/components/LpVideoPlayer.vue +33 -7
  313. package/src/components/LpVideoTrim.vue +40 -9
  314. package/src/components/LpWindow.vue +8 -2
  315. package/src/components/LpWorkspaceSwitcher.vue +15 -12
  316. package/src/components/status.ts +4 -1
  317. package/src/composables/usePaletteCommands.ts +6 -1
  318. package/src/composables/videoTranscode.ts +192 -0
  319. package/src/index.ts +51 -10
  320. package/src/locales/uk.ts +746 -0
  321. package/src/nuxt.ts +5 -1
  322. package/src/theme/palette.ts +2 -1
  323. package/dist/assets/LpVideoTrim-BcGs3Sh0.css +0 -8
@@ -50,6 +50,18 @@ import LpIcon from "./LpIcon.vue"
50
50
  import { useMergedAttrs } from "../composables/useMergedClass"
51
51
  import { useResizeObserver } from "../composables/useResizeObserver"
52
52
 
53
+ /** Wording of the image editor's controls and errors. */
54
+ export type ImageEditorLabels = {
55
+ rotateLeft: string
56
+ rotateRight: string
57
+ zoomIn: string
58
+ zoomOut: string
59
+ reset: string
60
+ canvas: string
61
+ failed: string
62
+ cors: string
63
+ }
64
+
53
65
  const props = withDefaults(
54
66
  defineProps<{
55
67
  /** The picture to work on: a file, or an http(s)/data address. */
@@ -86,12 +98,7 @@ const props = withDefaults(
86
98
  * kit cannot reach the consumer's translations. Apps with i18n pass their
87
99
  * own strings.
88
100
  */
89
- labels?: Partial<
90
- Record<
91
- "rotateLeft" | "rotateRight" | "zoomIn" | "zoomOut" | "reset" | "canvas" | "failed" | "cors",
92
- string
93
- >
94
- >
101
+ labels?: Partial<ImageEditorLabels>
95
102
  /** Fade the picture in when the editor first comes into view. */
96
103
  animate?: boolean
97
104
  }>(),
@@ -107,7 +114,7 @@ const emit = defineEmits<{
107
114
  // mount. An editor inside a dialog that opens a minute later still draws.
108
115
  const { el: revealAnchor, revealed } = useReveal({ immediate: () => !props.animate })
109
116
 
110
- const text = useLabels(
117
+ const text = useLabels<ImageEditorLabels>(
111
118
  "imageEditor",
112
119
  {
113
120
  rotateLeft: "Rotate left",
@@ -1,5 +1,10 @@
1
1
  <script lang="ts">
2
2
  export default { inheritAttrs: false }
3
+
4
+ /** Wording of the input's clear button. */
5
+ export type InputLabels = {
6
+ clear: string
7
+ }
3
8
  </script>
4
9
 
5
10
  <script setup lang="ts">
@@ -61,7 +66,7 @@ const props = withDefaults(
61
66
  icon?: string
62
67
  /** Show an accessible clear button, returning focus to the input. */
63
68
  clearable?: boolean
64
- labels?: Partial<{ clear: string }>
69
+ labels?: Partial<InputLabels>
65
70
  /**
66
71
  * Marks the label with the required indicator. The attribute still reaches
67
72
  * the underlying <input> for native validation; this only makes the field
@@ -148,7 +153,7 @@ const field = useFieldControl(() => ({
148
153
  required: props.required,
149
154
  disabled: props.disabled,
150
155
  }))
151
- const text = useLabels("input", { clear: "Clear" }, () => props.labels)
156
+ const text = useLabels<InputLabels>("input", { clear: "Clear" }, () => props.labels)
152
157
  const showClear = computed(() => props.clearable && !!props.modelValue && !field.value.disabled && !isAttrOn(attrs.readonly) && !isAttrOn(attrs.readOnly))
153
158
  const isInvalidState = computed(() => field.value.invalid)
154
159
  const shellClass = computed(() =>
@@ -16,6 +16,14 @@ export interface InspectorSection {
16
16
  }
17
17
 
18
18
  export default { inheritAttrs: false }
19
+
20
+ /** Wording of the inspector panel. */
21
+ export type InspectorLabels = {
22
+ close: string
23
+ empty: string
24
+ resize: string
25
+ region: string
26
+ }
19
27
  </script>
20
28
 
21
29
  <script setup lang="ts" generic="T">
@@ -71,14 +79,14 @@ const props = withDefaults(
71
79
  closable?: boolean
72
80
  /** Unsaved edits: `true` asks before closing, a function asks the app. */
73
81
  guard?: CloseGuard
74
- labels?: Partial<{ close: string; empty: string; resize: string; region: string }>
82
+ labels?: Partial<InspectorLabels>
75
83
  }>(),
76
84
  { side: "right", width: 320, minWidth: 240, maxWidth: 640, closable: true, subject: undefined },
77
85
  )
78
86
 
79
87
  const open = defineModel<boolean>("open", { default: true })
80
88
  const slots = useSlots()
81
- const text = useLabels(
89
+ const text = useLabels<InspectorLabels>(
82
90
  "inspector",
83
91
  { close: "Close", empty: "Nothing selected", resize: "Resize panel", region: "Details" },
84
92
  () => props.labels,
@@ -12,6 +12,7 @@ import { computed } from "vue"
12
12
  import { appleModifierLabel, useAppleKeyboard } from "../composables/useHotkeys"
13
13
  import { useLabels } from "../composables/useLpConfig"
14
14
  import { comboSteps } from "./keys"
15
+ import type { ShortcutsLabels } from "./LpShortcutsDialog.vue"
15
16
 
16
17
  const props = withDefaults(
17
18
  defineProps<{
@@ -24,7 +25,7 @@ const props = withDefaults(
24
25
  { size: "md" },
25
26
  )
26
27
 
27
- const text = useLabels("shortcuts", { then: "then" })
28
+ const text = useLabels<Pick<ShortcutsLabels, "then">>("shortcuts", { then: "then" })
28
29
  const apple = useAppleKeyboard()
29
30
 
30
31
  const steps = computed(() => (Array.isArray(props.combo) ? [props.combo] : comboSteps(props.combo)))
@@ -30,6 +30,15 @@ import { useMergedAttrs } from "../composables/useMergedClass"
30
30
  import { useLabels } from "../composables/useLpConfig"
31
31
  import { useResizeObserver } from "../composables/useResizeObserver"
32
32
 
33
+ /** Wording of the map picker's controls. */
34
+ export type MapPickerLabels = {
35
+ zoomIn: string
36
+ zoomOut: string
37
+ locate: string
38
+ recentre: string
39
+ map: string
40
+ }
41
+
33
42
  const props = withDefaults(
34
43
  defineProps<{
35
44
  /** Picked point. Bind with v-model; undefined leaves the map unpinned. */
@@ -63,7 +72,7 @@ const props = withDefaults(
63
72
 
64
73
  const emit = defineEmits<{ (e: "update:modelValue", value: LatLon): void }>()
65
74
 
66
- const labelSet = useLabels("mapPicker", {
75
+ const labelSet = useLabels<MapPickerLabels>("mapPicker", {
67
76
  zoomIn: "Zoom in",
68
77
  zoomOut: "Zoom out",
69
78
  locate: "Use my location",
@@ -33,7 +33,16 @@ import LpIcon from "./LpIcon.vue"
33
33
  import LpLightbox from "./LpLightbox.vue"
34
34
  import VideoThumb from "./VideoThumb.vue"
35
35
 
36
- const DEFAULT_LABELS = {
36
+ /** Wording of the media gallery. `{n}` and `{total}` are replaced. */
37
+ export type MediaGalleryLabels = {
38
+ gallery: string
39
+ image: string
40
+ spoiler: string
41
+ showSpoiler: string
42
+ showMore: string
43
+ }
44
+
45
+ const DEFAULT_LABELS: MediaGalleryLabels = {
37
46
  /** Accessible name of the grid. */
38
47
  gallery: "Media",
39
48
  /** Name of an image without a title; `{n}` and `{total}` are replaced. */
@@ -80,7 +89,7 @@ const props = withDefaults(
80
89
  * image without one; it keeps the browser's own menu.
81
90
  */
82
91
  itemMenu?: (item: LightboxItem, index: number) => ContextMenuItemDef[]
83
- labels?: Partial<typeof DEFAULT_LABELS>
92
+ labels?: Partial<MediaGalleryLabels>
84
93
  }>(),
85
94
  {
86
95
  columns: 3,
@@ -92,7 +101,7 @@ const props = withDefaults(
92
101
  },
93
102
  )
94
103
 
95
- const text = useLabels("mediaGallery", DEFAULT_LABELS, () => props.labels)
104
+ const text = useLabels<MediaGalleryLabels>("mediaGallery", DEFAULT_LABELS, () => props.labels)
96
105
 
97
106
  /** `{n}` is the image's position, `{total}` the size of the set. */
98
107
  function fill(template: string, n: number, total = 0): string {
@@ -41,6 +41,11 @@ import { useOutsideGuard, usePortalTarget } from "../composables/useView"
41
41
  const panelRef = ref<HTMLElement | null>(null)
42
42
  const { claim, release, layer } = useModalLayer({ element: () => panelRef.value?.parentElement })
43
43
 
44
+ /** Wording of the modal's close button. */
45
+ export type ModalLabels = {
46
+ close: string
47
+ }
48
+
44
49
  const props = withDefaults(
45
50
  defineProps<{
46
51
  open?: boolean
@@ -104,12 +109,12 @@ const props = withDefaults(
104
109
  * overlay the app already drives from its route.
105
110
  */
106
111
  history?: OverlayHistoryMode
107
- labels?: Partial<{ close: string }>
112
+ labels?: Partial<ModalLabels>
108
113
  }>(),
109
114
  { size: "md", autoFocus: "auto", glass: undefined, dismissible: true, guard: undefined, history: undefined },
110
115
  )
111
116
 
112
- const text = useLabels("modal", { close: "Close" }, () => props.labels)
117
+ const text = useLabels<ModalLabels>("modal", { close: "Close" }, () => props.labels)
113
118
 
114
119
  const frosted = useGlass(() => props.glass)
115
120
 
@@ -26,6 +26,11 @@ export type { SidebarItem, SidebarSection } from "./sidebar"
26
26
 
27
27
  type Breakpoint = "sm" | "md" | "lg" | "xl"
28
28
 
29
+ /** Wording of the modal's section navigation. */
30
+ export type ModalNavLabels = {
31
+ nav: string
32
+ }
33
+
29
34
  const props = withDefaults(
30
35
  defineProps<{
31
36
  open?: boolean
@@ -74,7 +79,7 @@ const emit = defineEmits<{
74
79
  (e: "update:modelValue", value: string): void
75
80
  }>()
76
81
 
77
- const text = useLabels("modalNav", { nav: "Sections" })
82
+ const text = useLabels<ModalNavLabels>("modalNav", { nav: "Sections" })
78
83
  const navName = computed(() => props.navLabel ?? text.value.nav)
79
84
 
80
85
  const navOpen = ref(false)
@@ -27,6 +27,13 @@ import { useMergedAttrs } from "../composables/useMergedClass"
27
27
  import { useLabels } from "../composables/useLpConfig"
28
28
  import { useResizeObserver } from "../composables/useResizeObserver"
29
29
 
30
+ /** Wording of the pagination controls. */
31
+ export type PaginationLabels = {
32
+ nav: string
33
+ previous: string
34
+ next: string
35
+ }
36
+
30
37
  const props = withDefaults(
31
38
  defineProps<{
32
39
  /** Current page, 1-based (v-model:page). */
@@ -39,12 +46,12 @@ const props = withDefaults(
39
46
  /** Pages shown on each side of the current one in the inner run. */
40
47
  siblings?: number
41
48
  disabled?: boolean
42
- labels?: Partial<Record<"nav" | "previous" | "next", string>>
49
+ labels?: Partial<PaginationLabels>
43
50
  }>(),
44
51
  { page: 1, pageSize: 10, siblings: 1 },
45
52
  )
46
53
 
47
- const text = useLabels(
54
+ const text = useLabels<PaginationLabels>(
48
55
  "pagination",
49
56
  { nav: "Pagination", previous: "Previous page", next: "Next page" },
50
57
  () => props.labels,
@@ -8,9 +8,22 @@ import LpThemeProvider from "./LpThemeProvider.vue"
8
8
  import LpButton from "./LpButton.vue"
9
9
  import LpInput from "./LpInput.vue"
10
10
 
11
+ /**
12
+ * Wording of the theme editor in the command palette. The scope is shared with
13
+ * `usePaletteTheme`, which names the command after `title`.
14
+ */
15
+ export type PaletteThemeLabels = {
16
+ title: string
17
+ apply: string
18
+ revert: string
19
+ sample: string
20
+ action: string
21
+ placeholder: string
22
+ }
23
+
11
24
  const props = defineProps<{ studio: PreviewableThemeStudio; hide?: ThemeStudioPart[] }>()
12
25
  suppressPaletteDiscovery()
13
- const text = useLabels("paletteTheme", { title: "Theme", apply: "Apply theme", revert: "Revert draft", sample: "Preview", action: "Continue", placeholder: "A field in this theme" })
26
+ const text = useLabels<PaletteThemeLabels>("paletteTheme", { title: "Theme", apply: "Apply theme", revert: "Revert draft", sample: "Preview", action: "Continue", placeholder: "A field in this theme" })
14
27
  const snapshot = ref({ ...props.studio.state.value })
15
28
  const state = ref<StudioState>({ ...snapshot.value })
16
29
  const preview = computed(() => props.studio.preview(state.value))
@@ -1,3 +1,12 @@
1
+ <script lang="ts">
2
+ /** Wording of the repeater. `{index}` in `remove` is the item's position. */
3
+ export type RepeaterLabels = {
4
+ add: string
5
+ remove: string
6
+ empty: string
7
+ }
8
+ </script>
9
+
1
10
  <script setup lang="ts" generic="T extends object">
2
11
  import FieldWrapper from "./FieldWrapper.vue"
3
12
  import { nextTick, ref } from "vue"
@@ -20,7 +29,7 @@ const props = defineProps<{
20
29
  disabled?: boolean
21
30
  /** A message under the control, as on LpInput: it marks it invalid and shows under it (what `form.field()` hands it). */
22
31
  error?: string
23
- labels?: Partial<{ add: string; remove: string; empty: string }>
32
+ labels?: Partial<RepeaterLabels>
24
33
  }>()
25
34
  const model = defineModel<T[]>({ default: () => [] })
26
35
  defineSlots<{
@@ -29,7 +38,7 @@ defineSlots<{
29
38
  }>()
30
39
 
31
40
  const { field, wrapper, ownAttrs } = useOwnField(() => ({ error: props.error, disabled: props.disabled }))
32
- const text = useLabels("repeater", { add: "Add item", remove: "Remove item {index}", empty: "No items" }, () => props.labels)
41
+ const text = useLabels<RepeaterLabels>("repeater", { add: "Add item", remove: "Remove item {index}", empty: "No items" }, () => props.labels)
33
42
  const list = useRepeater({
34
43
  value: () => model.value,
35
44
  set: (items) => { model.value = items },
@@ -27,6 +27,17 @@ import {
27
27
  } from "../composables/useHotkeys"
28
28
  import { useLabels } from "../composables/useLpConfig"
29
29
 
30
+ /**
31
+ * Wording of the shortcuts dialog. The scope is shared with LpKeys, which reads
32
+ * `then` (between the steps of a sequence such as "g then i").
33
+ */
34
+ export type ShortcutsLabels = {
35
+ title: string
36
+ conflict: string
37
+ group: string
38
+ then: string
39
+ }
40
+
30
41
  const props = withDefaults(
31
42
  defineProps<{
32
43
  open?: boolean
@@ -49,7 +60,7 @@ const props = withDefaults(
49
60
  { open: false, groups: () => [], live: false, title: undefined, glass: undefined, history: undefined },
50
61
  )
51
62
 
52
- const text = useLabels("shortcuts", {
63
+ const text = useLabels<Omit<ShortcutsLabels, "then">>("shortcuts", {
53
64
  title: "Keyboard shortcuts",
54
65
  conflict: "Also bound elsewhere: only one of them runs",
55
66
  group: "General",
@@ -28,6 +28,19 @@ import type { SidebarItem, SidebarSection } from "./sidebar"
28
28
 
29
29
  export type { SidebarItem, SidebarSection } from "./sidebar"
30
30
 
31
+ /** Wording of the sidebar's landmark and controls. */
32
+ export type SidebarLabels = {
33
+ nav: string
34
+ search: string
35
+ pinned: string
36
+ pin: string
37
+ unpin: string
38
+ expand: string
39
+ compact: string
40
+ expandRail: string
41
+ resize: string
42
+ }
43
+
31
44
  const props = withDefaults(
32
45
  defineProps<{
33
46
  /** Active item id (v-model). Ignored when `isActive` is provided. */
@@ -55,17 +68,7 @@ const props = withDefaults(
55
68
  /** Placeholder for that field (defaults to the `search` label). */
56
69
  searchPlaceholder?: string
57
70
  /** Text overrides: `nav` names the landmark, `search` the filter field. */
58
- labels?: Partial<{
59
- nav: string
60
- search: string
61
- pinned: string
62
- pin: string
63
- unpin: string
64
- expand: string
65
- compact: string
66
- expandRail: string
67
- resize: string
68
- }>
71
+ labels?: Partial<SidebarLabels>
69
72
  /** The query, when the app wants to own it (v-model:search). */
70
73
  search?: string
71
74
  /** Show a skeleton placeholder instead of the items. */
@@ -215,7 +218,7 @@ defineSlots<{
215
218
  item?: (props: { item: SidebarItem; active: boolean }) => unknown
216
219
  }>()
217
220
 
218
- const text = useLabels(
221
+ const text = useLabels<SidebarLabels>(
219
222
  "sidebar",
220
223
  {
221
224
  nav: "Sidebar",
@@ -24,6 +24,16 @@ import { useLabels } from "../composables/useLpConfig"
24
24
  import { areaPath, extent, linePath, normalise, type Box } from "./chart"
25
25
  import { toneLook, type ToneName } from "./tone"
26
26
 
27
+ /** Wording of the sparkline's states and trend. */
28
+ export type SparklineLabels = {
29
+ empty: string
30
+ up: string
31
+ down: string
32
+ flat: string
33
+ latest: string
34
+ loading: string
35
+ }
36
+
27
37
  const props = withDefaults(
28
38
  defineProps<{
29
39
  /** Oldest → newest. `null` breaks the line, as in LpChart. */
@@ -74,7 +84,7 @@ const props = withDefaults(
74
84
  * says it is an example). Off: the flat stub shows on the tour too.
75
85
  */
76
86
  sample?: boolean
77
- labels?: Partial<Record<"empty" | "up" | "down" | "flat" | "latest" | "loading", string>>
87
+ labels?: Partial<SparklineLabels>
78
88
  }>(),
79
89
  { width: 84, height: 24, tone: "brand", smooth: 0.9, animate: true, duration: 900, sample: true },
80
90
  )
@@ -184,7 +194,7 @@ const lastPoint = computed(() => {
184
194
  const hasData = computed(() => series.value[0].values.some((v) => v != null))
185
195
 
186
196
  /* A bare <svg> is invisible to a screen reader; say the shape out loud. */
187
- const text = useLabels(
197
+ const text = useLabels<SparklineLabels>(
188
198
  "sparkline",
189
199
  {
190
200
  empty: "No data",
@@ -23,6 +23,11 @@ export interface TocLink {
23
23
  children?: TocLink[]
24
24
  }
25
25
 
26
+ /** Wording of the table of contents. */
27
+ export type TableOfContentsLabels = {
28
+ title: string
29
+ }
30
+
26
31
  const props = withDefaults(
27
32
  defineProps<{
28
33
  links: TocLink[]
@@ -35,7 +40,7 @@ const props = withDefaults(
35
40
  * near the top kept the previous section lit under it.
36
41
  */
37
42
  offset?: number
38
- labels?: Partial<{ title: string }>
43
+ labels?: Partial<TableOfContentsLabels>
39
44
  /**
40
45
  * The bar glides under the hovered link and springs back on leave (the
41
46
  * default), as in LpTabs. False pins it to the section in view: calmer for
@@ -46,7 +51,7 @@ const props = withDefaults(
46
51
  { offset: 96, hoverFollow: true },
47
52
  )
48
53
 
49
- const text = useLabels("toc", { title: "On this page" }, () => props.labels)
54
+ const text = useLabels<TableOfContentsLabels>("toc", { title: "On this page" }, () => props.labels)
50
55
  const heading = computed(() => props.title ?? text.value.title)
51
56
 
52
57
  // Every level of the tree as one ordered list; depth drives the indent, so
@@ -27,6 +27,14 @@ import LpRollingText from "./LpRollingText.vue"
27
27
  import LpShift from "./LpShift.vue"
28
28
  import LpThemeStudio, { type ThemeStudioPart } from "./LpThemeStudio.vue"
29
29
 
30
+ /** Wording of the theme switcher. `{name}` in `trigger` is the current theme. */
31
+ export type ThemeSwitcherLabels = {
32
+ trigger: string
33
+ system: string
34
+ studio: string
35
+ openStudio: string
36
+ }
37
+
30
38
  const props = withDefaults(
31
39
  defineProps<{
32
40
  /** Active theme NAME (v-model). Falls back to the first theme. */
@@ -66,7 +74,7 @@ const props = withDefaults(
66
74
  */
67
75
  system?: { light: string | TokenSet; dark: string | TokenSet }
68
76
  /** Text overrides. `trigger` may contain `{name}`. */
69
- labels?: Partial<{ trigger: string; system: string; studio: string; openStudio: string }>
77
+ labels?: Partial<ThemeSwitcherLabels>
70
78
  /**
71
79
  * The right-click menu ends with "Theme studio…", set apart from the
72
80
  * themes, which opens LpThemeStudio by the trigger: the theme plus brand
@@ -125,7 +133,7 @@ function keepForTrigger(event: Event) {
125
133
  }
126
134
  }
127
135
 
128
- const text = useLabels(
136
+ const text = useLabels<ThemeSwitcherLabels>(
129
137
  "themeSwitcher",
130
138
  {
131
139
  trigger: "Theme: {name}. Click to switch, right-click to choose.",
@@ -21,8 +21,15 @@ import LpIcon from "./LpIcon.vue"
21
21
  import { toneLook } from "./tone"
22
22
  import { nodeWindow, usePortalTarget, useView, viewDocument, viewWindow } from "../composables/useView"
23
23
 
24
- const props = defineProps<{ labels?: Partial<{ dismiss: string; copy: string; copied: string }> }>()
25
- const text = useLabels("toast", { dismiss: "Dismiss", copy: "Copy message", copied: "Copied" }, () => props.labels)
24
+ /** Wording of a toast's controls. */
25
+ export type ToasterLabels = {
26
+ dismiss: string
27
+ copy: string
28
+ copied: string
29
+ }
30
+
31
+ const props = defineProps<{ labels?: Partial<ToasterLabels> }>()
32
+ const text = useLabels<ToasterLabels>("toast", { dismiss: "Dismiss", copy: "Copy message", copied: "Copied" }, () => props.labels)
26
33
 
27
34
  const { queue, dismiss } = useToast()
28
35
 
@@ -75,12 +75,24 @@ import type { Box } from "../composables/spatialNav"
75
75
  import { holeClip, holeOf, panelsAround } from "./tour"
76
76
  import { usePortalTarget } from "../composables/useView"
77
77
 
78
+ /** Wording of the tour. `{n}` and `{total}` in `progress` are replaced. */
79
+ export type TourLabels = {
80
+ next: string
81
+ back: string
82
+ done: string
83
+ close: string
84
+ progress: string
85
+ perform: string
86
+ tryIt: string
87
+ example: string
88
+ }
89
+
78
90
  const props = withDefaults(
79
91
  defineProps<{
80
92
  steps: TourStep[]
81
93
  /** Room around the target inside the lit hole, px. */
82
94
  padding?: number
83
- labels?: Partial<typeof DEFAULT_LABELS>
95
+ labels?: Partial<TourLabels>
84
96
  }>(),
85
97
  { padding: 6 },
86
98
  )
@@ -95,7 +107,7 @@ const emit = defineEmits<{
95
107
  const open = defineModel<boolean>("open", { default: false })
96
108
  const index = defineModel<number>("step", { default: 0 })
97
109
 
98
- const DEFAULT_LABELS = {
110
+ const DEFAULT_LABELS: TourLabels = {
99
111
  next: "Next",
100
112
  back: "Back",
101
113
  done: "Done",
@@ -105,7 +117,7 @@ const DEFAULT_LABELS = {
105
117
  tryIt: "Try it: press the highlighted control.",
106
118
  example: "This is an example: there are none right now.",
107
119
  }
108
- const labels = useLabels("tour", DEFAULT_LABELS, () => props.labels)
120
+ const labels = useLabels<TourLabels>("tour", DEFAULT_LABELS, () => props.labels)
109
121
 
110
122
  const WAIT_MS = 800
111
123
  const TRY_SETTLE_MS = 120
@@ -22,6 +22,9 @@ import { DEFAULT_UNIT_LABELS, formatTime, toEpoch, type TimeUnitLabels } from ".
22
22
  import { UPTIME_SEVERITY, uptimeFigure, uptimeRange, uptimeShare, type UptimeSegment, type UptimeStatus } from "./uptimeBar"
23
23
 
24
24
 
25
+ /** Wording of the uptime bar: one name per status, plus its own states. */
26
+ export type UptimeBarLabels = Record<UptimeStatus | "empty" | "loading" | "uptime", string>
27
+
25
28
  const props = withDefaults(
26
29
  defineProps<{
27
30
  /** Oldest → newest. Each entry is one slice of the timeline. */
@@ -48,7 +51,7 @@ const props = withDefaults(
48
51
  */
49
52
  colors?: Partial<Record<UptimeStatus, string>>
50
53
  /** Status names, for the tooltip and screen readers. */
51
- labels?: Partial<Record<UptimeStatus | "loading" | "uptime", string>>
54
+ labels?: Partial<UptimeBarLabels>
52
55
  /**
53
56
  * The history is on its way. The row of ticks pulses in place of the
54
57
  * slices (as many as `segments` already holds, else `skeletonSlices`) at
@@ -83,7 +86,7 @@ const opacityFor = (status: UptimeStatus): number =>
83
86
  const colorFor = (status: UptimeStatus): string =>
84
87
  props.colors?.[status] ?? defaultColor[status]
85
88
 
86
- const statusLabel = useLabels(
89
+ const statusLabel = useLabels<UptimeBarLabels>(
87
90
  "uptimeBar",
88
91
  {
89
92
  operational: "Operational",