@leavepulse/ui 0.78.3 → 0.79.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 (223) hide show
  1. package/dist/chunks/{ContextMenuItems-DmaKSJVv.js → ContextMenuItems-DLK4q-mm.js} +1 -1
  2. package/dist/chunks/{DropzoneLinkField-CyE7TJ5f.js → DropzoneLinkField-CcJu8De3.js} +1 -1
  3. package/dist/chunks/{FieldLeading-mr81aEAP.js → FieldLeading-CldGLINn.js} +1 -1
  4. package/dist/chunks/{FieldWrapper-DnuMTrqW.js → FieldWrapper-Cj8ZgoKp.js} +1 -1
  5. package/dist/chunks/{IconCloseButton-COZEsa9u.js → IconCloseButton-CV4iHRpy.js} +1 -1
  6. package/dist/chunks/{LayoutCanvas-CZKOltfA.js → LayoutCanvas-BQbq7Ekw.js} +1 -1
  7. package/dist/chunks/{LayoutNode-D2f7v683.js → LayoutNode-BMedRk3g.js} +1 -1
  8. package/dist/chunks/{LpActionBar-BGMk5KoG.js → LpActionBar-C7g52Cyo.js} +1 -1
  9. package/dist/chunks/{LpAddressInput-ft8fQOGx.js → LpAddressInput-1uakhQk5.js} +7 -7
  10. package/dist/chunks/{LpAlert-CjvTZIKF.js → LpAlert-DWFeR82L.js} +1 -1
  11. package/dist/chunks/{LpAppShell-DRHoQtr-.js → LpAppShell-InIK01Nn.js} +4 -4
  12. package/dist/chunks/{LpAutocomplete-CrZbd0uv.js → LpAutocomplete-DY3LvpB9.js} +4 -4
  13. package/dist/chunks/{LpAvatar-cQVsNk6F.js → LpAvatar-CEZmMcGh.js} +1 -1
  14. package/dist/chunks/{LpBadge-D5QQdDQ_.js → LpBadge-C_VqLHtg.js} +1 -1
  15. package/dist/chunks/{LpBottomNav-zxLGGbjm.js → LpBottomNav-4I89sPDZ.js} +1 -1
  16. package/dist/chunks/{LpBreadcrumbs-CIIBsygI.js → LpBreadcrumbs-1BBzrfxG.js} +1 -1
  17. package/dist/chunks/{LpCalendar-D4-LVjfF.js → LpCalendar-D2dcXjUK.js} +1 -1
  18. package/dist/chunks/{LpCheckbox-CCWCwD0y.js → LpCheckbox-CN-MEnbX.js} +2 -2
  19. package/dist/chunks/{LpCodeBlock-DBqy4RLd.js → LpCodeBlock-Cj7zk4QE.js} +2 -2
  20. package/dist/chunks/{LpCodeDisplay-D59uPwRb.js → LpCodeDisplay-COzosm77.js} +4 -4
  21. package/dist/chunks/{LpColorPicker-BONURBFN.js → LpColorPicker-BezW6DX1.js} +3 -3
  22. package/dist/chunks/{LpConfirmDialog-CnrmzkuN.js → LpConfirmDialog-D9GkDMYr.js} +2 -2
  23. package/dist/chunks/{LpConfirmHost-CwbObVGH.js → LpConfirmHost-BH7kf0dm.js} +1 -1
  24. package/dist/chunks/{LpContextMenu-Bx_IhQDS.js → LpContextMenu-bn5bc9t7.js} +2 -2
  25. package/dist/chunks/{LpContextSwitcher-1C1tExdl.js → LpContextSwitcher-CGr6ZAuq.js} +2 -2
  26. package/dist/chunks/{LpCopyButton-sAMvWeLP.js → LpCopyButton-BSr6YaFR.js} +1 -1
  27. package/dist/chunks/{LpDataList-CaVfsozH.js → LpDataList-Cv7ZUlyy.js} +2 -2
  28. package/dist/chunks/{LpDatePicker-C2AOtxgF.js → LpDatePicker-CR7vsb5M.js} +5 -5
  29. package/dist/chunks/{LpDateRangePicker-CiXdIAyh.js → LpDateRangePicker-B9fRO3G6.js} +3 -3
  30. package/dist/chunks/{LpDisclosure-DG7JCo-d.js → LpDisclosure-CE4mneaE.js} +1 -1
  31. package/dist/chunks/{LpDrawer-DXNQFpAA.js → LpDrawer-DU_5MqBz.js} +1 -1
  32. package/dist/chunks/{LpDropdownMenu-CLzxIOgM.js → LpDropdownMenu-_u6GPWhp.js} +2 -2
  33. package/dist/chunks/{LpEditable-DVT0Rh8F.js → LpEditable-DYoMayjt.js} +2 -2
  34. package/dist/chunks/{LpEmptyState-DurPF001.js → LpEmptyState-DpdHeSfz.js} +1 -1
  35. package/dist/chunks/{LpFieldNotice-DJ10cYIo.js → LpFieldNotice-DONFCWV7.js} +1 -1
  36. package/dist/chunks/{LpFileTree-CpNurwZp.js → LpFileTree-f5ktGqsN.js} +4 -4
  37. package/dist/chunks/{LpFileTreeNode-DdF8Cq-s.js → LpFileTreeNode-nbp-JwV9.js} +4 -4
  38. package/dist/chunks/{LpFormField-BKYn9dyP.js → LpFormField-Bz50_LZW.js} +1 -1
  39. package/dist/chunks/{LpHintLayer-BeKRsRon.js → LpHintLayer-B6bA5Cb_.js} +1 -1
  40. package/dist/chunks/{LpHints-qf3xYsza.js → LpHints-DyJ5hVcr.js} +3 -3
  41. package/dist/chunks/{LpIcon-C6JpQ5td.js → LpIcon-BCQLuHSP.js} +1 -1
  42. package/dist/chunks/{LpInfraNode-Bb5nbuFY.js → LpInfraNode-BS1RXYAs.js} +2 -2
  43. package/dist/chunks/{LpInput-CbI7z5fQ.js → LpInput-BjbXdjcW.js} +3 -3
  44. package/dist/chunks/{LpInspector-DO3fTCQ1.js → LpInspector-BIyJyM6r.js} +4 -4
  45. package/dist/chunks/{LpLightbox-CtDTQV01.js → LpLightbox-CSAJuUaJ.js} +2 -2
  46. package/dist/chunks/{LpLogInspector-CcSJSGan.js → LpLogInspector-OJEz1vod.js} +2 -2
  47. package/dist/chunks/{LpLogViewer-CWu49Dko.js → LpLogViewer-CRLwQpk0.js} +6 -6
  48. package/dist/chunks/{LpMapPicker-D5_YLLBC.js → LpMapPicker-DW2EnrCJ.js} +1 -1
  49. package/dist/chunks/{LpMediaGallery-BYEwySoF.js → LpMediaGallery-BNEYctDP.js} +3 -3
  50. package/dist/chunks/{LpModal-DDvrSAnf.js → LpModal-DdTqdf4x.js} +1 -1
  51. package/dist/chunks/{LpModalNav-DI3BW5ff.js → LpModalNav-BL7Dp0om.js} +3 -3
  52. package/dist/chunks/LpNotificationBell-d0F6MWxD.js +163 -0
  53. package/dist/chunks/LpNotificationFeed-BIe5lapb.js +470 -0
  54. package/dist/chunks/{LpNumberField-C8LfUz_R.js → LpNumberField-D5Dx-hzD.js} +3 -3
  55. package/dist/chunks/{LpOtpInput-B1X9l9no.js → LpOtpInput-BVl74Lfl.js} +1 -1
  56. package/dist/chunks/{LpPagination-snQ020xQ.js → LpPagination-D0wb-Uru.js} +1 -1
  57. package/dist/chunks/{LpPaletteTheme-B-xuZiKK.js → LpPaletteTheme-DdilCBXA.js} +2 -2
  58. package/dist/chunks/{LpPasswordInput-Duc_3wPv.js → LpPasswordInput-DUtqWMkA.js} +2 -2
  59. package/dist/chunks/{LpPhoneInput-CctcRK9K.js → LpPhoneInput-CalRjkqc.js} +3 -3
  60. package/dist/chunks/{LpPie-oVNHjsKD.js → LpPie-BVAEmVBT.js} +2 -2
  61. package/dist/chunks/{LpPipeline-BSXT6oUJ.js → LpPipeline-Dk7_sRP1.js} +2 -2
  62. package/dist/chunks/{LpQuota-CgWPgdVt.js → LpQuota-DKx0IZYA.js} +1 -1
  63. package/dist/chunks/{LpRadioGroup-DTM0nd9G.js → LpRadioGroup-E3SP6j9h.js} +2 -2
  64. package/dist/chunks/{LpRangeCalendar-BrqlGZzE.js → LpRangeCalendar-BFJFaen4.js} +1 -1
  65. package/dist/chunks/{LpRangeSlider-DJsEZXad.js → LpRangeSlider-b6ipywRB.js} +1 -1
  66. package/dist/chunks/{LpRepeater-Czib3rmv.js → LpRepeater-BLrw62Bh.js} +2 -2
  67. package/dist/chunks/{LpSecretField-BtlCk3IH.js → LpSecretField-BV8BNjKc.js} +5 -5
  68. package/dist/chunks/{LpSection-BfteipxU.js → LpSection-CghNNxIv.js} +1 -1
  69. package/dist/chunks/{LpSegmented-sskrJKJJ.js → LpSegmented-DjvrHL_G.js} +2 -2
  70. package/dist/chunks/{LpSelect-JFZehOkd.js → LpSelect-DYPimzAZ.js} +4 -4
  71. package/dist/chunks/{LpSidebar-CvRvVBTt.js → LpSidebar-D3S8rYFf.js} +4 -4
  72. package/dist/chunks/{LpSidebarNav-CE0jQS8i.js → LpSidebarNav-Dlse8vxT.js} +3 -3
  73. package/dist/chunks/{LpSidebarRow-DOTg1txp.js → LpSidebarRow-Cqd_6tGG.js} +3 -3
  74. package/dist/chunks/{LpSlider-C4ilCtZX.js → LpSlider-B9XIC75O.js} +1 -1
  75. package/dist/chunks/{LpStat-DPjc6_fX.js → LpStat-kyLRmX-m.js} +2 -2
  76. package/dist/chunks/{LpStatus-DGJFwk5F.js → LpStatus-szB2dWzM.js} +1 -1
  77. package/dist/chunks/{LpStepMark-Dw2MRTrt.js → LpStepMark-DP3CDSm9.js} +1 -1
  78. package/dist/chunks/{LpStepper-DNnh7lCu.js → LpStepper-BS3iaJIz.js} +1 -1
  79. package/dist/chunks/{LpSwitch-DyAYTchz.js → LpSwitch-DRFy8RNr.js} +1 -1
  80. package/dist/chunks/{LpTabFace-DQoV8mQG.js → LpTabFace-C9-OperL.js} +2 -2
  81. package/dist/chunks/{LpTableFilter-CJg5eIcV.js → LpTableFilter-CEIwLupk.js} +2 -2
  82. package/dist/chunks/{LpTagsInput-CkNxpNYa.js → LpTagsInput-ClDeF_aU.js} +5 -5
  83. package/dist/chunks/{LpTextarea-CFK_5QB8.js → LpTextarea-DEY6pUBy.js} +1 -1
  84. package/dist/chunks/{LpThemeStudio-R-wohbCY.js → LpThemeStudio-WY72Z1Db.js} +5 -5
  85. package/dist/chunks/{LpThemeSwitcher-Bzy15MCP.js → LpThemeSwitcher-9uCH9c-K.js} +3 -3
  86. package/dist/chunks/{LpTimeField-B5n0m8m0.js → LpTimeField-BmgxCzQO.js} +2 -2
  87. package/dist/chunks/{LpToaster-Ct_ZOhCh.js → LpToaster-DLKO-efn.js} +2 -2
  88. package/dist/chunks/{LpTopologyCanvas-BNgw9RyZ.js → LpTopologyCanvas-B-PhPa7k.js} +4 -4
  89. package/dist/chunks/{LpTour-ClKYhx4h.js → LpTour-ODlBcat2.js} +1 -1
  90. package/dist/chunks/{LpTruncate-ellq9RYM.js → LpTruncate--nhT0iUo.js} +1 -1
  91. package/dist/chunks/{LpWindow-B8YSRVTH.js → LpWindow-DJxE8Zl-.js} +2 -2
  92. package/dist/chunks/{LpWorkspaceSwitcher-ugv-fyig.js → LpWorkspaceSwitcher-Bpf41Bw5.js} +3 -3
  93. package/dist/chunks/{MenuTitle-Bh5dAdV1.js → MenuTitle-CMjvLsvC.js} +1 -1
  94. package/dist/chunks/{OptionContent-CGb8QlHA.js → OptionContent-DY8NaG8s.js} +1 -1
  95. package/dist/chunks/{PickerField-BM1dyafh.js → PickerField-CgfkaBgg.js} +1 -1
  96. package/dist/chunks/{RevealToggle-D_iyrB8d.js → RevealToggle-CPMXxaKv.js} +1 -1
  97. package/dist/chunks/{TourCard-DAzTYfav.js → TourCard-D4b3lMHi.js} +1 -1
  98. package/dist/chunks/icons-C1vppR4f.js +59 -0
  99. package/dist/component-names.d.ts +1 -1
  100. package/dist/components/ContextMenuItems.vue.js +1 -1
  101. package/dist/components/DropzoneLinkField.vue.js +1 -1
  102. package/dist/components/FieldLeading.vue.js +1 -1
  103. package/dist/components/FieldWrapper.vue.js +1 -1
  104. package/dist/components/IconCloseButton.vue.js +1 -1
  105. package/dist/components/LayoutCanvas.vue.js +1 -1
  106. package/dist/components/LayoutNode.vue.js +1 -1
  107. package/dist/components/LpActionBar.vue.js +1 -1
  108. package/dist/components/LpAddressInput.vue.js +1 -1
  109. package/dist/components/LpAlert.vue.js +1 -1
  110. package/dist/components/LpAppShell.vue.js +1 -1
  111. package/dist/components/LpAutocomplete.vue.js +1 -1
  112. package/dist/components/LpAvatar.vue.js +1 -1
  113. package/dist/components/LpBadge.vue.js +1 -1
  114. package/dist/components/LpBottomNav.vue.js +1 -1
  115. package/dist/components/LpBreadcrumbs.vue.js +1 -1
  116. package/dist/components/LpCalendar.vue.js +1 -1
  117. package/dist/components/LpChart.vue.js +2 -2
  118. package/dist/components/LpCheckbox.vue.js +1 -1
  119. package/dist/components/LpCodeBlock.vue.js +1 -1
  120. package/dist/components/LpCodeDisplay.vue.js +1 -1
  121. package/dist/components/LpColorPicker.vue.js +1 -1
  122. package/dist/components/LpCommandPalette.vue.js +2 -2
  123. package/dist/components/LpConfirmDialog.vue.js +1 -1
  124. package/dist/components/LpConfirmHost.vue.js +1 -1
  125. package/dist/components/LpContextMenu.vue.js +1 -1
  126. package/dist/components/LpContextSwitcher.vue.js +1 -1
  127. package/dist/components/LpCopyButton.vue.js +1 -1
  128. package/dist/components/LpDataList.vue.js +1 -1
  129. package/dist/components/LpDatePicker.vue.js +1 -1
  130. package/dist/components/LpDateRangePicker.vue.js +1 -1
  131. package/dist/components/LpDisclosure.vue.js +1 -1
  132. package/dist/components/LpDock.vue.js +1 -1
  133. package/dist/components/LpDrawer.vue.js +1 -1
  134. package/dist/components/LpDropdownMenu.vue.js +1 -1
  135. package/dist/components/LpDropzone.vue.js +2 -2
  136. package/dist/components/LpEditable.vue.js +1 -1
  137. package/dist/components/LpEmptyState.vue.js +1 -1
  138. package/dist/components/LpFieldNotice.vue.js +1 -1
  139. package/dist/components/LpFileTree.vue.js +1 -1
  140. package/dist/components/LpFileTreeNode.vue.js +1 -1
  141. package/dist/components/LpFormField.vue.js +1 -1
  142. package/dist/components/LpHintLayer.vue.js +1 -1
  143. package/dist/components/LpHints.vue.js +1 -1
  144. package/dist/components/LpIcon.vue.js +1 -1
  145. package/dist/components/LpImageEditor.vue.js +1 -1
  146. package/dist/components/LpInfraNode.vue.js +1 -1
  147. package/dist/components/LpInput.vue.js +1 -1
  148. package/dist/components/LpInspector.vue.js +1 -1
  149. package/dist/components/LpLightbox.vue.js +1 -1
  150. package/dist/components/LpLogInspector.vue.js +1 -1
  151. package/dist/components/LpLogViewer.vue.js +1 -1
  152. package/dist/components/LpMapPicker.vue.js +1 -1
  153. package/dist/components/LpMediaGallery.vue.js +1 -1
  154. package/dist/components/LpModal.vue.js +1 -1
  155. package/dist/components/LpModalNav.vue.js +1 -1
  156. package/dist/components/LpNotificationBell.vue.d.ts +28 -64
  157. package/dist/components/LpNotificationBell.vue.js +1 -1
  158. package/dist/components/LpNotificationFeed.vue.d.ts +78 -0
  159. package/dist/components/LpNotificationFeed.vue.js +4 -0
  160. package/dist/components/LpNumberField.vue.js +1 -1
  161. package/dist/components/LpOtpInput.vue.js +1 -1
  162. package/dist/components/LpPagination.vue.js +1 -1
  163. package/dist/components/LpPaletteFacts.vue.js +1 -1
  164. package/dist/components/LpPaletteHeader.vue.js +2 -2
  165. package/dist/components/LpPaletteTheme.vue.js +1 -1
  166. package/dist/components/LpPasswordInput.vue.js +1 -1
  167. package/dist/components/LpPhoneInput.vue.js +1 -1
  168. package/dist/components/LpPie.vue.js +1 -1
  169. package/dist/components/LpPipeline.vue.js +1 -1
  170. package/dist/components/LpQuota.vue.js +1 -1
  171. package/dist/components/LpRadioGroup.vue.js +1 -1
  172. package/dist/components/LpRangeCalendar.vue.js +1 -1
  173. package/dist/components/LpRangeSlider.vue.js +1 -1
  174. package/dist/components/LpRepeater.vue.js +1 -1
  175. package/dist/components/LpSecretField.vue.js +1 -1
  176. package/dist/components/LpSection.vue.js +1 -1
  177. package/dist/components/LpSegmented.vue.js +1 -1
  178. package/dist/components/LpSelect.vue.js +1 -1
  179. package/dist/components/LpShortcutsDialog.vue.js +1 -1
  180. package/dist/components/LpSidebar.vue.js +1 -1
  181. package/dist/components/LpSidebarNav.vue.js +1 -1
  182. package/dist/components/LpSidebarRow.vue.js +1 -1
  183. package/dist/components/LpSlider.vue.js +1 -1
  184. package/dist/components/LpStat.vue.js +1 -1
  185. package/dist/components/LpStatus.vue.js +1 -1
  186. package/dist/components/LpStepMark.vue.js +1 -1
  187. package/dist/components/LpStepper.vue.js +1 -1
  188. package/dist/components/LpSwitch.vue.js +1 -1
  189. package/dist/components/LpTabFace.vue.js +1 -1
  190. package/dist/components/LpTable.vue.js +9 -9
  191. package/dist/components/LpTableFilter.vue.js +1 -1
  192. package/dist/components/LpTabs.vue.js +2 -2
  193. package/dist/components/LpTagsInput.vue.js +1 -1
  194. package/dist/components/LpTextarea.vue.js +1 -1
  195. package/dist/components/LpThemeStudio.vue.js +1 -1
  196. package/dist/components/LpThemeSwitcher.vue.js +1 -1
  197. package/dist/components/LpTimeField.vue.js +1 -1
  198. package/dist/components/LpToaster.vue.js +1 -1
  199. package/dist/components/LpTopologyCanvas.vue.js +1 -1
  200. package/dist/components/LpTour.vue.js +1 -1
  201. package/dist/components/LpTruncate.vue.js +1 -1
  202. package/dist/components/LpWindow.vue.js +1 -1
  203. package/dist/components/LpWorkspaceSwitcher.vue.js +1 -1
  204. package/dist/components/MenuTitle.vue.js +1 -1
  205. package/dist/components/OptionContent.vue.js +1 -1
  206. package/dist/components/PickerField.vue.js +1 -1
  207. package/dist/components/RevealToggle.vue.js +1 -1
  208. package/dist/components/TourCard.vue.js +1 -1
  209. package/dist/components/menuWhen.js +1 -1
  210. package/dist/components/notifications.d.ts +156 -0
  211. package/dist/components/notifications.js +59 -0
  212. package/dist/icons-all.js +1 -1
  213. package/dist/index.d.ts +2 -1
  214. package/dist/index.js +208 -206
  215. package/package.json +1 -1
  216. package/src/component-names.ts +1 -0
  217. package/src/components/LpNotificationBell.vue +105 -279
  218. package/src/components/LpNotificationFeed.vue +404 -0
  219. package/src/components/notifications.ts +197 -0
  220. package/src/index.ts +6 -1
  221. package/src/kit-icons.ts +1 -1
  222. package/dist/chunks/LpNotificationBell-DUbVyK6R.js +0 -311
  223. package/dist/chunks/icons-CYfcpSDS.js +0 -59
@@ -0,0 +1,156 @@
1
+ import type { ContextMenuItemDef } from "./LpContextMenu.vue";
2
+ import type { ToneName } from "./tone";
3
+ /**
4
+ * A button on a notification itself: "Approve", "Reply", "View invoice". The
5
+ * thing the notification asks for, done where it is read instead of a page away.
6
+ */
7
+ export interface NotificationAction {
8
+ label: string;
9
+ /**
10
+ * `primary` is the one answer the notification is waiting for; `danger` a
11
+ * destructive one ("Decline", "Revoke"). Unset is a quiet secondary button.
12
+ */
13
+ variant?: "primary" | "secondary" | "danger";
14
+ icon?: string;
15
+ /** A destination instead of a handler: the button is a link. */
16
+ href?: string;
17
+ /**
18
+ * Runs on press. A returned promise shows the button busy, and holds the
19
+ * row's other actions, until it settles; a rejection is left to the caller
20
+ * (toast it), and the row stays as it was.
21
+ */
22
+ onSelect?: (item: NotificationItem) => unknown;
23
+ }
24
+ /** Who a notification is from, drawn as their avatar in place of the icon. */
25
+ export interface NotificationActor {
26
+ name: string;
27
+ /** Picture URL; the initials of `name` show without one. */
28
+ avatar?: string;
29
+ }
30
+ export interface NotificationItem {
31
+ id: string;
32
+ title: string;
33
+ body?: string;
34
+ /** Optional icon name (e.g. "lucide:check-circle"). With an `actor`, it is a small badge on the avatar. */
35
+ icon?: string;
36
+ /**
37
+ * Colours the row's icon by what KIND of notification it is — a billing
38
+ * notice and a security one should not look alike at a glance.
39
+ *
40
+ * A named tone rather than a class, so the categories stay themeable:
41
+ * consumers were mapping their own types onto raw palette classes, which is
42
+ * the one place a theme cannot follow them.
43
+ */
44
+ tone?: ToneName;
45
+ /** Who it is from; the row leads with their avatar. */
46
+ actor?: NotificationActor;
47
+ /** Optional deep link; the row becomes a link when set. */
48
+ link?: string;
49
+ /** ISO-8601 creation time; rendered as a relative label and used for the day groups. */
50
+ createdAt?: string;
51
+ /** Whether the notification has been read. */
52
+ read?: boolean;
53
+ /** Buttons on the notification itself. See `NotificationAction`. */
54
+ actions?: NotificationAction[];
55
+ /**
56
+ * What became of it, once acted on ("Approved", "Declined by Anna"). Shown
57
+ * in place of the actions, so a handled request reads as handled.
58
+ */
59
+ outcome?: string;
60
+ /** Which of the feed's `categories` tabs it belongs to. */
61
+ category?: string;
62
+ }
63
+ /** A tab of the feed beside All and Unread, keyed by `NotificationItem.category`. */
64
+ export interface NotificationCategory {
65
+ value: string;
66
+ label: string;
67
+ icon?: string;
68
+ }
69
+ /**
70
+ * Every user-facing string the feed and the bell render on their own. Apps
71
+ * with i18n pass their translations in (or set the `notifications` scope in
72
+ * the kit config); the English defaults keep the components usable bare.
73
+ */
74
+ export interface NotificationLabels {
75
+ title?: string;
76
+ markAllRead?: string;
77
+ clear?: string;
78
+ markAsRead?: string;
79
+ markAsUnread?: string;
80
+ open?: string;
81
+ dismiss?: string;
82
+ empty?: string;
83
+ /** The Unread tab's empty state. */
84
+ emptyUnread?: string;
85
+ ariaLabel?: string;
86
+ /** Appended to the button's name while there is unread news; `{count}` is filled in. */
87
+ unread?: string;
88
+ /** Screen-reader marker on an unread row. */
89
+ unreadItem?: string;
90
+ /** Tabs. */
91
+ all?: string;
92
+ unreadTab?: string;
93
+ /** Day groups. */
94
+ today?: string;
95
+ yesterday?: string;
96
+ earlier?: string;
97
+ /** The header's settings button. */
98
+ settings?: string;
99
+ /** The footer link (`allLink`). */
100
+ viewAll?: string;
101
+ loadMore?: string;
102
+ /** Actions of a row, as a group. */
103
+ actions?: string;
104
+ /**
105
+ * No longer read: times are worded by Intl in the app's locale. Still
106
+ * accepted so existing label objects keep type-checking.
107
+ * @deprecated
108
+ */
109
+ justNow?: string;
110
+ /** @deprecated See `justNow`. */
111
+ minutes?: string;
112
+ /** @deprecated See `justNow`. */
113
+ hours?: string;
114
+ /** @deprecated See `justNow`. */
115
+ days?: string;
116
+ }
117
+ export declare const NOTIFICATION_LABELS: {
118
+ title: string;
119
+ markAllRead: string;
120
+ clear: string;
121
+ markAsRead: string;
122
+ markAsUnread: string;
123
+ open: string;
124
+ dismiss: string;
125
+ empty: string;
126
+ emptyUnread: string;
127
+ ariaLabel: string;
128
+ unread: string;
129
+ unreadItem: string;
130
+ all: string;
131
+ unreadTab: string;
132
+ today: string;
133
+ yesterday: string;
134
+ earlier: string;
135
+ settings: string;
136
+ viewAll: string;
137
+ loadMore: string;
138
+ actions: string;
139
+ };
140
+ /** Extra right-click entries for a row, after the built-in ones. */
141
+ export type NotificationMenu = (item: NotificationItem) => ContextMenuItemDef[];
142
+ /** today | yesterday | earlier, in the viewer's own calendar. */
143
+ export declare function dayOf(iso: string | undefined, now: number): "today" | "yesterday" | "earlier";
144
+ export interface NotificationGroup {
145
+ key: string;
146
+ day: "today" | "yesterday" | "earlier" | null;
147
+ items: NotificationItem[];
148
+ }
149
+ /**
150
+ * Runs of consecutive items from the same day. Consecutive, not sorted: the
151
+ * feed keeps the caller's order, and an out-of-order item opens a new run
152
+ * rather than being moved away from where the caller put it.
153
+ */
154
+ export declare function groupByDay(items: NotificationItem[], now: number, grouped: boolean): NotificationGroup[];
155
+ /** The milliseconds until the next local midnight, when the day groups move. */
156
+ export declare function untilMidnight(now: number): number;
@@ -0,0 +1,59 @@
1
+ const NOTIFICATION_LABELS = {
2
+ title: "Notifications",
3
+ markAllRead: "Mark all read",
4
+ clear: "Clear",
5
+ markAsRead: "Mark as read",
6
+ markAsUnread: "Mark as unread",
7
+ open: "Open",
8
+ dismiss: "Dismiss",
9
+ empty: "No notifications",
10
+ emptyUnread: "You're all caught up",
11
+ ariaLabel: "",
12
+ unread: "{count} unread",
13
+ unreadItem: "Unread",
14
+ all: "All",
15
+ unreadTab: "Unread",
16
+ today: "Today",
17
+ yesterday: "Yesterday",
18
+ earlier: "Earlier",
19
+ settings: "Notification settings",
20
+ viewAll: "View all notifications",
21
+ loadMore: "Load more",
22
+ actions: "Actions"
23
+ };
24
+ const DAY_MS = 864e5;
25
+ function dayStart(time) {
26
+ const d = new Date(time);
27
+ d.setHours(0, 0, 0, 0);
28
+ return d.getTime();
29
+ }
30
+ function dayOf(iso, now) {
31
+ const time = iso ? Date.parse(iso) : Number.NaN;
32
+ if (Number.isNaN(time)) return "earlier";
33
+ const today = dayStart(now);
34
+ if (time >= today) return "today";
35
+ if (time >= dayStart(today - DAY_MS / 2)) return "yesterday";
36
+ return "earlier";
37
+ }
38
+ function groupByDay(items, now, grouped) {
39
+ if (!grouped || !items.some((item) => item.createdAt)) return [{ key: "all", day: null, items }];
40
+ const groups = [];
41
+ for (const item of items) {
42
+ const day = dayOf(item.createdAt, now);
43
+ const last = groups.at(-1);
44
+ if (last?.day === day) last.items.push(item);
45
+ else groups.push({ key: `${day}-${groups.length}`, day, items: [item] });
46
+ }
47
+ return groups;
48
+ }
49
+ function untilMidnight(now) {
50
+ const next = new Date(now);
51
+ next.setHours(24, 0, 0, 0);
52
+ return Math.max(1e3, next.getTime() - now);
53
+ }
54
+ export {
55
+ NOTIFICATION_LABELS,
56
+ dayOf,
57
+ groupByDay,
58
+ untilMidnight
59
+ };
package/dist/icons-all.js CHANGED
@@ -1,3 +1,3 @@
1
1
  import lucide from "@iconify-json/lucide/icons.json";
2
- import { a as registerIconCollection } from "./chunks/icons-CYfcpSDS.js";
2
+ import { a as registerIconCollection } from "./chunks/icons-C1vppR4f.js";
3
3
  registerIconCollection(lucide);
package/dist/index.d.ts CHANGED
@@ -108,7 +108,8 @@ export { default as LpMediaGallery } from "./components/LpMediaGallery.vue";
108
108
  export { default as LpModal } from "./components/LpModal.vue";
109
109
  export { default as LpModalNav } from "./components/LpModalNav.vue";
110
110
  export { default as LpNotificationBell } from "./components/LpNotificationBell.vue";
111
- export type { NotificationItem, NotificationLabels, } from "./components/LpNotificationBell.vue";
111
+ export { default as LpNotificationFeed } from "./components/LpNotificationFeed.vue";
112
+ export type { NotificationAction, NotificationActor, NotificationCategory, NotificationItem, NotificationLabels, NotificationMenu, } from "./components/notifications";
112
113
  export { default as LpNumberField } from "./components/LpNumberField.vue";
113
114
  export type { NumberFieldLabels } from "./components/LpNumberField.vue";
114
115
  export { default as LpTimeField } from "./components/LpTimeField.vue";