@leavepulse/ui 0.57.0 → 0.58.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.
- package/dist/chunks/{ContextMenuItems-BtKU7074.js → ContextMenuItems-BY5sTVQF.js} +1 -1
- package/dist/chunks/{LayoutCanvas-BkaGXTjx.js → LayoutCanvas-BcGLJVBq.js} +1 -1
- package/dist/chunks/{LayoutNode-B3_9E1Xa.js → LayoutNode-BkBn6dvM.js} +1 -1
- package/dist/chunks/{LpActionBar-C3hkVsFz.js → LpActionBar-DCN-_pZP.js} +2 -2
- package/dist/chunks/{LpAddressInput-NUHmplCd.js → LpAddressInput-Dio6Sqed.js} +7 -7
- package/dist/chunks/{LpAlert-B6ilrM7T.js → LpAlert-CXMn1GYE.js} +1 -1
- package/dist/chunks/{LpAppShell-Bl1Ch68N.js → LpAppShell-Be6T96td.js} +3 -3
- package/dist/chunks/{LpAutocomplete-C8IgSMsi.js → LpAutocomplete-hJ_6CHlh.js} +1 -1
- package/dist/chunks/{LpAvatar-LTvy0OkE.js → LpAvatar-BxNs23Xu.js} +2 -2
- package/dist/chunks/{LpBreadcrumbs-D4TsoFju.js → LpBreadcrumbs-BLzOEgAF.js} +1 -1
- package/dist/chunks/{LpButton-BdfZFNqi.js → LpButton-vhlwmpBy.js} +1 -1
- package/dist/chunks/{LpCalendar-DrA2McTU.js → LpCalendar-BLoE8Qm7.js} +1 -1
- package/dist/chunks/{LpCard-DbjO5yaF.js → LpCard-DhR7u0d8.js} +1 -1
- package/dist/chunks/{LpCheckbox-DvVYeOD-.js → LpCheckbox-B_C8sOoT.js} +1 -1
- package/dist/chunks/{LpCodeBlock-ca7ANFyW.js → LpCodeBlock-CXsqJwDy.js} +1 -1
- package/dist/chunks/{LpColorPicker-D1sQqtXS.js → LpColorPicker-DQ88niXq.js} +2 -2
- package/dist/chunks/{LpConfirmDialog-CrbUZgJE.js → LpConfirmDialog-DxlSdjmk.js} +3 -3
- package/dist/chunks/{LpConfirmHost-BgMIV8r9.js → LpConfirmHost-BcrmTNu_.js} +1 -1
- package/dist/chunks/{LpContextMenu-EF_90u3g.js → LpContextMenu-B1NGfpp1.js} +2 -2
- package/dist/chunks/{LpDatePicker-BrdFtSTy.js → LpDatePicker-B-VMHMgy.js} +3 -3
- package/dist/chunks/{LpDateRangePicker-CxV5jW7p.js → LpDateRangePicker-B68KPKPl.js} +2 -2
- package/dist/chunks/{LpDisclosure-Cc23-JOT.js → LpDisclosure-Ct-VBHxt.js} +1 -1
- package/dist/chunks/{LpDrawer-D9lLOC0C.js → LpDrawer-DSknigxH.js} +1 -1
- package/dist/chunks/{LpDropdownMenu-DrpJJBp0.js → LpDropdownMenu-C7oHVlKY.js} +2 -2
- package/dist/chunks/{LpEmptyState-BJbZXC8D.js → LpEmptyState-CBwwkkdA.js} +1 -1
- package/dist/chunks/{LpFieldNotice-wtieLUTj.js → LpFieldNotice-9hH4ITZa.js} +1 -1
- package/dist/chunks/{LpFileTree-3E4w4Rjr.js → LpFileTree-CMA0_rsB.js} +2 -2
- package/dist/chunks/{LpFileTreeNode-B4uB8Ks_.js → LpFileTreeNode-B4T258hF.js} +3 -3
- package/dist/chunks/{LpFormField-CtVYj6tO.js → LpFormField-BpQ6WJPe.js} +1 -1
- package/dist/chunks/{LpHintLayer-CI1oZ9Pd.js → LpHintLayer-B5-6FyEf.js} +1 -1
- package/dist/chunks/LpHints-BqoZXHZk.js +109 -0
- package/dist/chunks/{LpIcon-DYtaid0K.js → LpIcon-B5guGKrW.js} +1 -1
- package/dist/chunks/{LpInput-D-YGQbEv.js → LpInput-WvyP02ID.js} +2 -2
- package/dist/chunks/{LpLightbox-EVXzAq62.js → LpLightbox-Dq-e36uT.js} +1 -1
- package/dist/chunks/{LpLogViewer-BfgtXVKm.js → LpLogViewer-DwiYE32z.js} +2 -2
- package/dist/chunks/{LpMapPicker-Cc84LaM3.js → LpMapPicker-BH5csaBt.js} +1 -1
- package/dist/chunks/{LpMediaGallery-BnlkN_1f.js → LpMediaGallery-B1kDypJ-.js} +2 -2
- package/dist/chunks/{LpModal-JNa3B_Lr.js → LpModal-BxYssnXg.js} +1 -1
- package/dist/chunks/{LpModalNav-DXyAyhQl.js → LpModalNav-Bn2ws64b.js} +4 -4
- package/dist/chunks/{LpNotificationBell-DEL-RoHS.js → LpNotificationBell-DJfs4JjQ.js} +4 -4
- package/dist/chunks/{LpNumberField-B77O-z28.js → LpNumberField-CJPjmoDz.js} +1 -1
- package/dist/chunks/{LpPagination-BcDlo3r_.js → LpPagination-DehAaJLY.js} +1 -1
- package/dist/chunks/{LpPasswordInput-eKzQhbQP.js → LpPasswordInput-Bg5uTZbx.js} +2 -2
- package/dist/chunks/{LpPhoneInput-BCbrrhgE.js → LpPhoneInput-DStwcbnQ.js} +2 -2
- package/dist/chunks/{LpPie-CXka8Jvx.js → LpPie-DeTkbbOK.js} +2 -2
- package/dist/chunks/{LpRangeCalendar-DZuaRV0W.js → LpRangeCalendar-D5sDID9W.js} +1 -1
- package/dist/chunks/{LpSection-tKEH0jYf.js → LpSection-B19VPYmr.js} +1 -1
- package/dist/chunks/{LpSegmented-C09EEam2.js → LpSegmented-D3Eam8sa.js} +1 -1
- package/dist/chunks/{LpSelect-DNIL6MB9.js → LpSelect-DynjWK1A.js} +1 -1
- package/dist/chunks/{LpSidebar-hZ8D1cVr.js → LpSidebar-CshW0fqC.js} +3 -3
- package/dist/chunks/{LpSidebarNav-C9dHu-2b.js → LpSidebarNav-C9b3i9G2.js} +2 -2
- package/dist/chunks/{LpStat-B-7udBRP.js → LpStat-BS2TEXYK.js} +1 -1
- package/dist/chunks/{LpStepper-C7XiVKZj.js → LpStepper-BSglWF45.js} +1 -1
- package/dist/chunks/{LpTableFilter-CrW7_Rj4.js → LpTableFilter-CwHXVxJt.js} +2 -2
- package/dist/chunks/{LpTabs-BMSBB78h.js → LpTabs-BBGRHY38.js} +1 -1
- package/dist/chunks/{LpTagsInput-D1SuqbhB.js → LpTagsInput-CHbQoAAA.js} +3 -3
- package/dist/chunks/{LpTextarea-uuScWo6-.js → LpTextarea-Bz2IWhTH.js} +1 -1
- package/dist/chunks/{LpThemeSwitcher-Fz85BCRS.js → LpThemeSwitcher-B_qhSl7q.js} +2 -2
- package/dist/chunks/{LpTimeField-Cqe7fXnh.js → LpTimeField-DvGXgdES.js} +1 -1
- package/dist/chunks/{LpToaster-DTtWuKvq.js → LpToaster-Bo9Q4QBP.js} +1 -1
- package/dist/chunks/{LpTour-C1TC2GyY.js → LpTour-D7m9ZxNk.js} +26 -7
- package/dist/chunks/{MenuTitle-J3ZDYjpV.js → MenuTitle-DQP6hc2N.js} +1 -1
- package/dist/chunks/{TourCard-BQS3ztqj.js → TourCard-DCHOjr6e.js} +2 -2
- package/dist/chunks/icons-QqBscG5I.js +43 -0
- package/dist/component-names.d.ts +1 -1
- package/dist/components/ContextMenuItems.vue.js +1 -1
- package/dist/components/LayoutCanvas.vue.js +1 -1
- package/dist/components/LayoutNode.vue.js +1 -1
- package/dist/components/LpActionBar.vue.js +1 -1
- package/dist/components/LpAddressInput.vue.js +1 -1
- package/dist/components/LpAlert.vue.js +1 -1
- package/dist/components/LpAppShell.vue.js +1 -1
- package/dist/components/LpAutocomplete.vue.js +1 -1
- package/dist/components/LpAvatar.vue.js +1 -1
- package/dist/components/LpBreadcrumbs.vue.js +1 -1
- package/dist/components/LpButton.vue.js +1 -1
- package/dist/components/LpCalendar.vue.js +1 -1
- package/dist/components/LpCard.vue.js +1 -1
- package/dist/components/LpChart.vue.js +2 -2
- package/dist/components/LpCheckbox.vue.js +1 -1
- package/dist/components/LpCodeBlock.vue.js +1 -1
- package/dist/components/LpColorPicker.vue.js +1 -1
- package/dist/components/LpCommandPalette.vue.js +2 -2
- package/dist/components/LpConfirmDialog.vue.js +1 -1
- package/dist/components/LpConfirmHost.vue.js +1 -1
- package/dist/components/LpContextMenu.vue.js +1 -1
- package/dist/components/LpDatePicker.vue.js +1 -1
- package/dist/components/LpDateRangePicker.vue.js +1 -1
- package/dist/components/LpDisclosure.vue.js +1 -1
- package/dist/components/LpDrawer.vue.js +1 -1
- package/dist/components/LpDropdownMenu.vue.js +1 -1
- package/dist/components/LpDropzone.vue.js +1 -1
- package/dist/components/LpEmptyState.vue.js +1 -1
- package/dist/components/LpFieldNotice.vue.js +1 -1
- package/dist/components/LpFileTree.vue.js +1 -1
- package/dist/components/LpFileTreeNode.vue.js +1 -1
- package/dist/components/LpFormField.vue.js +1 -1
- package/dist/components/LpHintLayer.vue.js +1 -1
- package/dist/components/LpHints.vue.d.ts +20 -0
- package/dist/components/LpHints.vue.js +4 -0
- package/dist/components/LpIcon.vue.js +1 -1
- package/dist/components/LpImageEditor.vue.js +2 -2
- package/dist/components/LpInput.vue.js +1 -1
- package/dist/components/LpLightbox.vue.js +1 -1
- package/dist/components/LpLogViewer.vue.js +1 -1
- package/dist/components/LpMapPicker.vue.js +1 -1
- package/dist/components/LpMediaGallery.vue.js +1 -1
- package/dist/components/LpModal.vue.js +1 -1
- package/dist/components/LpModalNav.vue.js +1 -1
- package/dist/components/LpNotificationBell.vue.js +1 -1
- package/dist/components/LpNumberField.vue.js +1 -1
- package/dist/components/LpPagination.vue.js +1 -1
- package/dist/components/LpPaletteFacts.vue.js +1 -1
- package/dist/components/LpPaletteHeader.vue.js +2 -2
- package/dist/components/LpPasswordInput.vue.js +1 -1
- package/dist/components/LpPhoneInput.vue.js +1 -1
- package/dist/components/LpPie.vue.js +1 -1
- package/dist/components/LpRangeCalendar.vue.js +1 -1
- package/dist/components/LpSection.vue.js +1 -1
- package/dist/components/LpSegmented.vue.js +1 -1
- package/dist/components/LpSelect.vue.js +1 -1
- package/dist/components/LpShortcutsDialog.vue.js +1 -1
- package/dist/components/LpSidebar.vue.js +1 -1
- package/dist/components/LpSidebarNav.vue.js +1 -1
- package/dist/components/LpStat.vue.js +1 -1
- package/dist/components/LpStepper.vue.js +1 -1
- package/dist/components/LpTable.vue.js +6 -6
- package/dist/components/LpTableFilter.vue.js +1 -1
- package/dist/components/LpTabs.vue.js +1 -1
- package/dist/components/LpTagsInput.vue.js +1 -1
- package/dist/components/LpTextarea.vue.js +1 -1
- package/dist/components/LpThemeSwitcher.vue.js +1 -1
- package/dist/components/LpTimeField.vue.js +1 -1
- package/dist/components/LpToaster.vue.js +1 -1
- package/dist/components/LpTour.vue.js +1 -1
- package/dist/components/MenuTitle.vue.js +1 -1
- package/dist/components/TourCard.vue.js +1 -1
- package/dist/composables/useHintSystem.d.ts +195 -0
- package/dist/composables/useHintSystem.js +334 -0
- package/dist/icons-all.js +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.js +73 -64
- package/package.json +1 -1
- package/src/component-names.ts +1 -0
- package/src/components/LpHints.vue +116 -0
- package/src/components/LpTour.vue +26 -6
- package/src/composables/useHintSystem.ts +512 -0
- package/src/index.ts +17 -0
- package/src/kit-icons.ts +1 -1
- package/dist/chunks/icons-CkA0njzm.js +0 -43
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { type HintSystem } from "../composables/useHintSystem";
|
|
2
|
+
type __VLS_Props = {
|
|
3
|
+
system: HintSystem;
|
|
4
|
+
labels?: Partial<typeof DEFAULT_LABELS>;
|
|
5
|
+
};
|
|
6
|
+
declare const DEFAULT_LABELS: {
|
|
7
|
+
tourTitle: string;
|
|
8
|
+
tourText: string;
|
|
9
|
+
assignedTitle: string;
|
|
10
|
+
assignedText: string;
|
|
11
|
+
newsTitle: string;
|
|
12
|
+
show: string;
|
|
13
|
+
notNow: string;
|
|
14
|
+
never: string;
|
|
15
|
+
gotIt: string;
|
|
16
|
+
noThanks: string;
|
|
17
|
+
};
|
|
18
|
+
declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
19
|
+
declare const _default: typeof __VLS_export;
|
|
20
|
+
export default _default;
|
|
@@ -4,9 +4,9 @@ import { isSideways, coverScale, cropGeometry } from "./imageCrop.js";
|
|
|
4
4
|
import { useHotkeys } from "../composables/useHotkeys.js";
|
|
5
5
|
import { useReveal } from "../composables/useReveal.js";
|
|
6
6
|
import { useZoomPan } from "../composables/useZoomPan.js";
|
|
7
|
-
import { _ as _sfc_main$1 } from "../chunks/LpButton-
|
|
7
|
+
import { _ as _sfc_main$1 } from "../chunks/LpButton-vhlwmpBy.js";
|
|
8
8
|
import "reka-ui";
|
|
9
|
-
import { _ as _sfc_main$2 } from "../chunks/LpIcon-
|
|
9
|
+
import { _ as _sfc_main$2 } from "../chunks/LpIcon-B5guGKrW.js";
|
|
10
10
|
import { useMergedAttrs } from "../composables/useMergedClass.js";
|
|
11
11
|
import { _ as _export_sfc } from "../chunks/_plugin-vue_export-helper-1tPrXgE0.js";
|
|
12
12
|
import '../assets/LpImageEditor-CbMA82g8.css';const _hoisted_1 = ["aria-label"];
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { defineComponent, openBlock, createElementBlock, normalizeClass, toDisplayString, createCommentVNode, createElementVNode, Fragment, renderList, normalizeStyle, createBlock, createVNode, renderSlot } from "vue";
|
|
2
2
|
import { _ as _sfc_main$2 } from "../chunks/HighlightText-BvnYZkhi.js";
|
|
3
|
-
import { _ as _sfc_main$1 } from "../chunks/LpIcon-
|
|
3
|
+
import { _ as _sfc_main$1 } from "../chunks/LpIcon-B5guGKrW.js";
|
|
4
4
|
import { _ as _sfc_main$3 } from "../chunks/LpRollingText-DB7upf-5.js";
|
|
5
5
|
import { _ as _export_sfc } from "../chunks/_plugin-vue_export-helper-1tPrXgE0.js";
|
|
6
6
|
import '../assets/LpPaletteFacts-B9FdVmIO.css';const _hoisted_1 = {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { defineComponent, computed, openBlock, createElementBlock, createElementVNode, renderSlot, createBlock, createVNode, createCommentVNode, toDisplayString } from "vue";
|
|
2
|
-
import { _ as _sfc_main$1 } from "../chunks/LpAvatar-
|
|
3
|
-
import { _ as _sfc_main$2 } from "../chunks/LpIcon-
|
|
2
|
+
import { _ as _sfc_main$1 } from "../chunks/LpAvatar-BxNs23Xu.js";
|
|
3
|
+
import { _ as _sfc_main$2 } from "../chunks/LpIcon-B5guGKrW.js";
|
|
4
4
|
import { _ as _sfc_main$3 } from "../chunks/HighlightText-BvnYZkhi.js";
|
|
5
5
|
import { _ as _export_sfc } from "../chunks/_plugin-vue_export-helper-1tPrXgE0.js";
|
|
6
6
|
import '../assets/LpPaletteHeader-BVOu1UX5.css';const _hoisted_1 = { class: "lp-palette-header" };
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { defineComponent, computed, openBlock, createBlock, unref, withCtx, createElementVNode, createElementBlock, Fragment, renderList, toDisplayString, createTextVNode, createCommentVNode, createVNode } from "vue";
|
|
2
2
|
import LpKeys from "./LpKeys.vue.js";
|
|
3
|
-
import { _ as _sfc_main$1 } from "../chunks/LpModal-
|
|
3
|
+
import { _ as _sfc_main$1 } from "../chunks/LpModal-BxYssnXg.js";
|
|
4
4
|
import { mergeShortcutGroups, activeShortcuts, useHotkeys } from "../composables/useHotkeys.js";
|
|
5
5
|
import { useLabels } from "../composables/useLpConfig.js";
|
|
6
6
|
import { _ as _export_sfc } from "../chunks/_plugin-vue_export-helper-1tPrXgE0.js";
|
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
import { defineComponent, computed, useAttrs, ref, shallowRef, watch, onMounted, onBeforeUnmount, openBlock, createElementBlock, normalizeClass, createVNode, withCtx, createTextVNode, toDisplayString, createCommentVNode, Fragment, renderList, createElementVNode, Transition, renderSlot, mergeProps, normalizeStyle, createBlock, TransitionGroup, unref, withModifiers, nextTick } from "vue";
|
|
2
|
-
import { _ as _sfc_main$7 } from "../chunks/LpCheckbox-
|
|
3
|
-
import { _ as _sfc_main$6 } from "../chunks/LpContextMenu-
|
|
4
|
-
import { _ as _sfc_main$2 } from "../chunks/LpIcon-
|
|
5
|
-
import { _ as _sfc_main$a } from "../chunks/LpPagination-
|
|
2
|
+
import { _ as _sfc_main$7 } from "../chunks/LpCheckbox-B_C8sOoT.js";
|
|
3
|
+
import { _ as _sfc_main$6 } from "../chunks/LpContextMenu-B1NGfpp1.js";
|
|
4
|
+
import { _ as _sfc_main$2 } from "../chunks/LpIcon-B5guGKrW.js";
|
|
5
|
+
import { _ as _sfc_main$a } from "../chunks/LpPagination-DehAaJLY.js";
|
|
6
6
|
import { _ as _sfc_main$8 } from "../chunks/LpPopover-DCKeqiVn.js";
|
|
7
7
|
import { _ as _sfc_main$5 } from "../chunks/LpScrollArea-Hz3-JWUG.js";
|
|
8
8
|
import { _ as _sfc_main$4 } from "../chunks/LpRollingText-DB7upf-5.js";
|
|
9
9
|
import { _ as _sfc_main$3 } from "../chunks/LpShift-DXNsauQZ.js";
|
|
10
|
-
import { _ as _sfc_main$9 } from "../chunks/LpTableFilter-
|
|
10
|
+
import { _ as _sfc_main$9 } from "../chunks/LpTableFilter-CwHXVxJt.js";
|
|
11
11
|
import { useAsyncTask } from "../composables/useAsyncTask.js";
|
|
12
12
|
import { useHotkeys } from "../composables/useHotkeys.js";
|
|
13
13
|
import { usePaintSelect } from "../composables/usePaintSelect.js";
|
|
14
14
|
import { useRovingFocus } from "../composables/useRovingFocus.js";
|
|
15
15
|
import { useLabels } from "../composables/useLpConfig.js";
|
|
16
16
|
import { compareValues } from "./tableSort.js";
|
|
17
|
-
import { _ as _sfc_main$1 } from "../chunks/LpButton-
|
|
17
|
+
import { _ as _sfc_main$1 } from "../chunks/LpButton-vhlwmpBy.js";
|
|
18
18
|
import { toCsv, downloadFile, fileStem } from "./exportData.js";
|
|
19
19
|
import { summarizeShown, parseTableState, serializeTableState, countValues } from "./tableFilter.js";
|
|
20
20
|
import { _ as _export_sfc } from "../chunks/_plugin-vue_export-helper-1tPrXgE0.js";
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
import { type ComputedRef } from "vue";
|
|
2
|
+
import type { HintNote } from "../components/LpHintLayer.vue";
|
|
3
|
+
import type { TourContext, TourStep } from "../components/LpTour.vue";
|
|
4
|
+
export interface HintFeature {
|
|
5
|
+
page: string;
|
|
6
|
+
title: string;
|
|
7
|
+
text: string;
|
|
8
|
+
order?: number;
|
|
9
|
+
keys?: string;
|
|
10
|
+
try?: boolean;
|
|
11
|
+
side?: TourStep["side"];
|
|
12
|
+
/** Bump to announce a changed feature again: it reads as new to everyone. */
|
|
13
|
+
rev?: number;
|
|
14
|
+
/** Keeps its dot until explained, even after "not now". */
|
|
15
|
+
required?: boolean;
|
|
16
|
+
/**
|
|
17
|
+
* Rendered only in some states (data-dependent, behind a filter). Its first
|
|
18
|
+
* appearance is not news, so it is never marked new for merely showing up;
|
|
19
|
+
* a `rev` bump still announces it.
|
|
20
|
+
*/
|
|
21
|
+
conditional?: boolean;
|
|
22
|
+
/** When the `v-hint` id is not the element to light (a column header, an opened menu). */
|
|
23
|
+
target?: () => Element | null;
|
|
24
|
+
enter?: (context: TourContext) => void | Promise<void>;
|
|
25
|
+
}
|
|
26
|
+
export interface HintPage {
|
|
27
|
+
title: string;
|
|
28
|
+
/**
|
|
29
|
+
* A localStorage key prefix that proves the user worked on this page before
|
|
30
|
+
* the system existed (a remembered table layout). Such a page is treated as
|
|
31
|
+
* known on first sight: no tour offer, no dots for what was always there.
|
|
32
|
+
*/
|
|
33
|
+
known?: string;
|
|
34
|
+
}
|
|
35
|
+
export interface HintNews {
|
|
36
|
+
id: string;
|
|
37
|
+
date: string;
|
|
38
|
+
page: string;
|
|
39
|
+
text: string;
|
|
40
|
+
feature?: string;
|
|
41
|
+
}
|
|
42
|
+
export interface HintNudge {
|
|
43
|
+
id: string;
|
|
44
|
+
feature: string;
|
|
45
|
+
text: string;
|
|
46
|
+
}
|
|
47
|
+
export type HintLevel = "seen" | "explained" | "used";
|
|
48
|
+
export interface HintRecord {
|
|
49
|
+
state: HintLevel;
|
|
50
|
+
dismissed: boolean;
|
|
51
|
+
count: number;
|
|
52
|
+
assigned?: boolean;
|
|
53
|
+
updatedAt: string;
|
|
54
|
+
}
|
|
55
|
+
export interface HintDelta {
|
|
56
|
+
key: string;
|
|
57
|
+
state?: HintLevel;
|
|
58
|
+
dismissed?: boolean;
|
|
59
|
+
add?: number;
|
|
60
|
+
}
|
|
61
|
+
export interface HintStorage {
|
|
62
|
+
load(): Promise<Record<string, HintRecord>> | Record<string, HintRecord>;
|
|
63
|
+
save(deltas: HintDelta[]): Promise<void> | void;
|
|
64
|
+
/** Last chance on page hide (sendBeacon); falls back to `save`. */
|
|
65
|
+
saveOnLeave?(deltas: HintDelta[]): void;
|
|
66
|
+
}
|
|
67
|
+
export interface HintTiming {
|
|
68
|
+
settle: number;
|
|
69
|
+
offerAgain: number;
|
|
70
|
+
offersMax: number;
|
|
71
|
+
freshLimit: number;
|
|
72
|
+
nudgeAgain: number;
|
|
73
|
+
flush: number;
|
|
74
|
+
}
|
|
75
|
+
export interface HintSystemOptions {
|
|
76
|
+
features: Record<string, HintFeature>;
|
|
77
|
+
pages?: Record<string, HintPage>;
|
|
78
|
+
news?: HintNews[];
|
|
79
|
+
storage?: HintStorage;
|
|
80
|
+
/** The current page id, read reactively (map your route to it). */
|
|
81
|
+
page: () => string;
|
|
82
|
+
sessionKey?: string;
|
|
83
|
+
timing?: Partial<HintTiming>;
|
|
84
|
+
}
|
|
85
|
+
export type HintOffer = {
|
|
86
|
+
kind: "tour" | "assigned";
|
|
87
|
+
page: string;
|
|
88
|
+
} | {
|
|
89
|
+
kind: "news";
|
|
90
|
+
page: string;
|
|
91
|
+
items: HintNews[];
|
|
92
|
+
} | {
|
|
93
|
+
kind: "nudge";
|
|
94
|
+
page: string;
|
|
95
|
+
nudge: HintNudge;
|
|
96
|
+
};
|
|
97
|
+
/** Records in localStorage: for anonymous sessions and apps without a server. */
|
|
98
|
+
export declare function localHintStorage(key?: string): HintStorage;
|
|
99
|
+
/** Record keys, for apps that read or assign records directly (a "who knows what" view). */
|
|
100
|
+
export declare const hintKey: {
|
|
101
|
+
feature: (id: string, rev?: number) => string;
|
|
102
|
+
page: (page: string) => string;
|
|
103
|
+
news: (id: string) => string;
|
|
104
|
+
nudge: (id: string) => string;
|
|
105
|
+
};
|
|
106
|
+
export interface HintSummary {
|
|
107
|
+
tour: "done" | "assigned" | "declined" | "offered" | "never";
|
|
108
|
+
offers: number;
|
|
109
|
+
known: number;
|
|
110
|
+
total: number;
|
|
111
|
+
/** Titles of `required` features this person has not been shown. */
|
|
112
|
+
missing: string[];
|
|
113
|
+
}
|
|
114
|
+
/** What one person knows of a page, from their records: for a manager's view. */
|
|
115
|
+
export declare function hintSummary(records: Map<string, Pick<HintRecord, "state" | "dismissed" | "count" | "assigned">>, features: Record<string, HintFeature>, page: string): HintSummary;
|
|
116
|
+
export declare function createHintSystem(options: HintSystemOptions): {
|
|
117
|
+
state: {
|
|
118
|
+
records: Map<string, {
|
|
119
|
+
state: HintLevel;
|
|
120
|
+
dismissed: boolean;
|
|
121
|
+
count: number;
|
|
122
|
+
assigned?: boolean | undefined;
|
|
123
|
+
updatedAt: string;
|
|
124
|
+
}> & Omit<Map<string, HintRecord>, keyof Map<any, any>>;
|
|
125
|
+
loaded: boolean;
|
|
126
|
+
page: string;
|
|
127
|
+
tour: {
|
|
128
|
+
open: boolean;
|
|
129
|
+
step: number;
|
|
130
|
+
steps: {
|
|
131
|
+
target?: (string | Element | (() => Element | null)) | undefined;
|
|
132
|
+
title: string;
|
|
133
|
+
text?: string | undefined;
|
|
134
|
+
keys?: string | undefined;
|
|
135
|
+
side?: "top" | "right" | "bottom" | "left" | undefined;
|
|
136
|
+
try?: boolean | undefined;
|
|
137
|
+
perform?: (() => void | Promise<void>) | undefined;
|
|
138
|
+
enter?: ((context: TourContext) => void | Promise<void>) | undefined;
|
|
139
|
+
}[];
|
|
140
|
+
ids: string[];
|
|
141
|
+
page: string;
|
|
142
|
+
};
|
|
143
|
+
offer: {
|
|
144
|
+
kind: "tour" | "assigned";
|
|
145
|
+
page: string;
|
|
146
|
+
} | {
|
|
147
|
+
kind: "news";
|
|
148
|
+
page: string;
|
|
149
|
+
items: {
|
|
150
|
+
id: string;
|
|
151
|
+
date: string;
|
|
152
|
+
page: string;
|
|
153
|
+
text: string;
|
|
154
|
+
feature?: string | undefined;
|
|
155
|
+
}[];
|
|
156
|
+
} | {
|
|
157
|
+
kind: "nudge";
|
|
158
|
+
page: string;
|
|
159
|
+
nudge: {
|
|
160
|
+
id: string;
|
|
161
|
+
feature: string;
|
|
162
|
+
text: string;
|
|
163
|
+
};
|
|
164
|
+
} | null;
|
|
165
|
+
candidate: {
|
|
166
|
+
id: string;
|
|
167
|
+
feature: string;
|
|
168
|
+
text: string;
|
|
169
|
+
page: string;
|
|
170
|
+
} | null;
|
|
171
|
+
settledAt: number;
|
|
172
|
+
intent: boolean;
|
|
173
|
+
};
|
|
174
|
+
fresh: ComputedRef<string[]>;
|
|
175
|
+
notes: ComputedRef<Record<string, HintNote>>;
|
|
176
|
+
start: () => void;
|
|
177
|
+
stop: () => void;
|
|
178
|
+
hasTour: (page?: string) => boolean;
|
|
179
|
+
startTour: (page?: string, only?: string[]) => void;
|
|
180
|
+
load(): Promise<void>;
|
|
181
|
+
/** Ask for a nudge; it shows when the budget and the page allow. */
|
|
182
|
+
nudge(n: HintNudge): void;
|
|
183
|
+
/** The user navigated on purpose (palette, notification): do not interrupt this arrival. */
|
|
184
|
+
markIntent(): void;
|
|
185
|
+
unreadNews: (page?: string) => HintNews[];
|
|
186
|
+
readNews: (page: string) => void;
|
|
187
|
+
pageTitle: (page: string) => string;
|
|
188
|
+
readFresh(id: string): void;
|
|
189
|
+
tourShown(index: number): void;
|
|
190
|
+
tourEnded(finished: boolean): void;
|
|
191
|
+
answer(choice: "show" | "later" | "never"): void;
|
|
192
|
+
};
|
|
193
|
+
export type HintSystem = ReturnType<typeof createHintSystem>;
|
|
194
|
+
export declare function provideHintSystem(system: HintSystem): void;
|
|
195
|
+
export declare function useHintSystem(): HintSystem | null;
|