@eintrek/erp-shell 0.1.61 → 0.1.63
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/README.md +32 -0
- package/dist/guide/dom.d.ts +37 -0
- package/dist/guide/events.d.ts +24 -0
- package/dist/guide/guide-host.d.ts +7 -0
- package/dist/guide/guide-store.d.ts +16 -0
- package/dist/guide/guide-styles.d.ts +7 -0
- package/dist/guide/guide-ui.d.ts +158 -0
- package/dist/guide/machine.d.ts +237 -0
- package/dist/guide/patterns.d.ts +28 -0
- package/dist/guide/progress-client.d.ts +11 -0
- package/dist/guide/progress.d.ts +74 -0
- package/dist/guide/types.d.ts +288 -0
- package/dist/help/help-button.d.ts +4 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.esm.js +3103 -154
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +3109 -149
- package/dist/index.js.map +1 -1
- package/dist/navigation/app-layout-shell.d.ts +8 -1
- package/dist/navigation/nav-user.d.ts +4 -1
- package/dist/navigation/platform-url.d.ts +23 -0
- package/dist/version.d.ts +1 -1
- package/package.json +4 -1
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A tour's progress as platform-api stores it (one row per user, org and
|
|
3
|
+
* suite: GET/PUT /organizations/:id/guides/me), and the rules for reading,
|
|
4
|
+
* writing and merging it. See _claude-work/peoplx-guide/API.md.
|
|
5
|
+
*
|
|
6
|
+
* No runtime imports: the tests run this file in Node as it is.
|
|
7
|
+
*/
|
|
8
|
+
export type GuideMode = "off" | "invite" | "forced";
|
|
9
|
+
export type GuideAudience = "forced" | "optional" | "none";
|
|
10
|
+
export type GuideRowStatus = "in_progress" | "completed" | "skipped" | "aborted";
|
|
11
|
+
export type MissionStatus = "todo" | "active" | "done" | "skipped";
|
|
12
|
+
export type WelcomeState = "not_seen" | "started" | "skipped";
|
|
13
|
+
export interface MissionEntry {
|
|
14
|
+
status: MissionStatus;
|
|
15
|
+
step_key?: string | null;
|
|
16
|
+
skipped_step?: string | null;
|
|
17
|
+
/** Server-written. */
|
|
18
|
+
completed_at?: string | null;
|
|
19
|
+
/** Server-written. */
|
|
20
|
+
skipped_at?: string | null;
|
|
21
|
+
}
|
|
22
|
+
/** The row, as the client keeps it. */
|
|
23
|
+
export interface GuideProgress {
|
|
24
|
+
guide_version: number;
|
|
25
|
+
/** The rev of the row last read; 0 when there is none. */
|
|
26
|
+
rev: number;
|
|
27
|
+
status: GuideRowStatus;
|
|
28
|
+
mission_key: string | null;
|
|
29
|
+
step_key: string | null;
|
|
30
|
+
step_index: number;
|
|
31
|
+
checkpoint_key: string | null;
|
|
32
|
+
missions: Record<string, MissionEntry>;
|
|
33
|
+
context: Record<string, string>;
|
|
34
|
+
welcome: WelcomeState;
|
|
35
|
+
chip_hidden: boolean;
|
|
36
|
+
last_error: string | null;
|
|
37
|
+
skipped_step: string | null;
|
|
38
|
+
/** The status the server holds (to know when a PUT needs restart: true). */
|
|
39
|
+
server_status: GuideRowStatus | null;
|
|
40
|
+
}
|
|
41
|
+
export interface GuidesAnswer {
|
|
42
|
+
mode: GuideMode;
|
|
43
|
+
audience: GuideAudience;
|
|
44
|
+
/** The suite's row; a fresh one when the user has none or an older version. */
|
|
45
|
+
progress: GuideProgress;
|
|
46
|
+
/** The server holds a newer version than this app's tour: do not run. */
|
|
47
|
+
newerOnServer: boolean;
|
|
48
|
+
}
|
|
49
|
+
export declare function freshProgress(version: number, rev?: number): GuideProgress;
|
|
50
|
+
/** One row (a GET `guides[]` entry, a PUT answer, a 409's `current`). Null when off-shape. */
|
|
51
|
+
export declare function parseRow(raw: unknown): GuideProgress | null;
|
|
52
|
+
/**
|
|
53
|
+
* The GET answer for one suite. Null — show nothing — for anything that is
|
|
54
|
+
* not the expected shape (an older API, a proxy's page, another app's answer).
|
|
55
|
+
*/
|
|
56
|
+
export declare function parseGuidesAnswer(payload: unknown, suite: {
|
|
57
|
+
key: string;
|
|
58
|
+
version: number;
|
|
59
|
+
app: string;
|
|
60
|
+
}): GuidesAnswer | null;
|
|
61
|
+
/** The PUT body for the client's state. Drops keys the server would refuse. */
|
|
62
|
+
export declare function putBody(p: GuideProgress, app: string): Record<string, unknown>;
|
|
63
|
+
/**
|
|
64
|
+
* After a 409: this tab's state laid over the server's, keeping whatever is
|
|
65
|
+
* further along — a mission done anywhere stays done, the welcome once seen
|
|
66
|
+
* stays seen, a hidden chip stays hidden. Otherwise this tab's own choice
|
|
67
|
+
* wins. The rev is the server's.
|
|
68
|
+
*/
|
|
69
|
+
export declare function mergeProgress(local: GuideProgress, remote: GuideProgress): GuideProgress;
|
|
70
|
+
/**
|
|
71
|
+
* Which of two copies (sessionStorage after F5, the server) to resume from:
|
|
72
|
+
* the one further along for the same version; the server's on a tie.
|
|
73
|
+
*/
|
|
74
|
+
export declare function furtherProgress(a: GuideProgress, b: GuideProgress): GuideProgress;
|
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The guided tour ("ไกด์เริ่มต้น"): what an app writes to describe its tour.
|
|
3
|
+
*
|
|
4
|
+
* A tour is data. The app hands a GuideSuite to AppLayoutShell's `guides`
|
|
5
|
+
* prop; the shell's engine runs it — the spotlight, the bubble, the quest
|
|
6
|
+
* chip — and saves progress on platform-api. Functions in here are small
|
|
7
|
+
* predicates and text builders, never engine code.
|
|
8
|
+
*
|
|
9
|
+
* No runtime imports: the tests run this file in Node as it is.
|
|
10
|
+
* The full guide for tour authors is _claude-work/peoplx-guide/ENGINE-API.md.
|
|
11
|
+
*/
|
|
12
|
+
/** Which app a tour belongs to (the same ids as the help channel). */
|
|
13
|
+
export type GuideAppId = "platform" | "accounx" | "invenx" | "plannex" | "peoplx" | "sellx" | "carex";
|
|
14
|
+
/**
|
|
15
|
+
* A `data-guide` key, "<app>.<area>.<element>" — "peoplx.shift.edit".
|
|
16
|
+
* The shell's own: "nav.<menu item id>", "shell.menu-toggle", "shell.help".
|
|
17
|
+
*/
|
|
18
|
+
export type GuideAnchorKey = string;
|
|
19
|
+
/** Values the app passes in (`guides.facts`) for predicates to read. */
|
|
20
|
+
export type GuideFacts = Readonly<Record<string, unknown>>;
|
|
21
|
+
/** What every predicate and text builder gets. */
|
|
22
|
+
export interface GuideContext {
|
|
23
|
+
/** The organisation code in the URL ("O26000021"). */
|
|
24
|
+
code: string;
|
|
25
|
+
/** The current path, without the query. */
|
|
26
|
+
pathname: string;
|
|
27
|
+
/** The current query. */
|
|
28
|
+
search: URLSearchParams;
|
|
29
|
+
/**
|
|
30
|
+
* Route params from the step's `route` pattern (`/[code]/employee/[id]` →
|
|
31
|
+
* `{ code, id }`), when the page matches it.
|
|
32
|
+
*/
|
|
33
|
+
params: Readonly<Record<string, string>>;
|
|
34
|
+
/** Ids captured by earlier steps of this mission (`capture`). */
|
|
35
|
+
data: Readonly<Record<string, string>>;
|
|
36
|
+
/** The app's facts (counts, flags), as passed to the shell. */
|
|
37
|
+
facts: GuideFacts;
|
|
38
|
+
/** The app's permission check (`guides.can`); true when none was given. */
|
|
39
|
+
can: (policyKey: string) => boolean;
|
|
40
|
+
/** Whether an anchor is on screen now. */
|
|
41
|
+
visible: (anchor: GuideAnchorKey) => boolean;
|
|
42
|
+
}
|
|
43
|
+
/** Text that may depend on the context. */
|
|
44
|
+
export type GuideText = string | ((ctx: GuideContext) => string);
|
|
45
|
+
/**
|
|
46
|
+
* What moves a step on. A step lists one or several (any of them advances).
|
|
47
|
+
* Prefer outcomes over clicks: a route reached, a dialog shown, a 2xx.
|
|
48
|
+
*/
|
|
49
|
+
export type GuideTrigger =
|
|
50
|
+
/** The page is this route. Next-style pattern; an optional `?k=v` must be
|
|
51
|
+
* in the query. `/[code]/setting?tab=department` */
|
|
52
|
+
{
|
|
53
|
+
route: string;
|
|
54
|
+
}
|
|
55
|
+
/** The anchor appeared (a dialog, a select's list, a tab panel). */
|
|
56
|
+
| {
|
|
57
|
+
visible: GuideAnchorKey;
|
|
58
|
+
}
|
|
59
|
+
/** The anchor went away (a dialog closed). */
|
|
60
|
+
| {
|
|
61
|
+
hidden: GuideAnchorKey;
|
|
62
|
+
}
|
|
63
|
+
/** A call through the shell's axios (or reportApiEvent) answered. */
|
|
64
|
+
| {
|
|
65
|
+
api: GuideApiMatch;
|
|
66
|
+
}
|
|
67
|
+
/** `emitGuideEvent(name)` was called (window event `erp:guide:<name>`). */
|
|
68
|
+
| {
|
|
69
|
+
event: string;
|
|
70
|
+
}
|
|
71
|
+
/** The target was pressed (pointer, Enter or Space). Last resort. */
|
|
72
|
+
| {
|
|
73
|
+
activate: true;
|
|
74
|
+
}
|
|
75
|
+
/** The value of the target's input/select/textarea now passes. */
|
|
76
|
+
| {
|
|
77
|
+
value: (value: string, ctx: GuideContext) => boolean;
|
|
78
|
+
};
|
|
79
|
+
export interface GuideApiMatch {
|
|
80
|
+
/** GET, POST, PUT, PATCH, DELETE. Any method when omitted. */
|
|
81
|
+
method?: string;
|
|
82
|
+
/**
|
|
83
|
+
* The path, matched against the END of the request's path (any base URL
|
|
84
|
+
* and query removed): "/shifts/[id]", "/departments". `[x]` and `:x` match
|
|
85
|
+
* one segment, `*` any number. A RegExp is tested against the whole path.
|
|
86
|
+
*/
|
|
87
|
+
path: string | RegExp;
|
|
88
|
+
/** Default "2xx". */
|
|
89
|
+
status?: "2xx" | number;
|
|
90
|
+
}
|
|
91
|
+
/** How a step is shown and what its bubble offers. */
|
|
92
|
+
export type GuideStepKind =
|
|
93
|
+
/** Press the target; moves on when what follows happens. Hand shown. */
|
|
94
|
+
"click"
|
|
95
|
+
/** Type into the target; moves on with Enter / ถัดไป / Tab when `validate`
|
|
96
|
+
* passes. No hand. */
|
|
97
|
+
| "input"
|
|
98
|
+
/** Choose a value; moves on as soon as `advanceOn` fires. Hand shown. */
|
|
99
|
+
| "select"
|
|
100
|
+
/** Save; moves on only on the API's 2xx. In a replay the bubble offers
|
|
101
|
+
* "จบโดยไม่บันทึก". Hand shown. */
|
|
102
|
+
| "commit"
|
|
103
|
+
/** Read; moves on with ถัดไป. No hand. `target` optional. */
|
|
104
|
+
| "view";
|
|
105
|
+
export type GuideOnMissing = "retry" | "skip" | "rewind" | "abort";
|
|
106
|
+
export interface GuideApiFailure {
|
|
107
|
+
status: number;
|
|
108
|
+
/** The server's message, when it sent one. */
|
|
109
|
+
message?: string;
|
|
110
|
+
}
|
|
111
|
+
export interface GuideStep {
|
|
112
|
+
/** Stable id, saved on the server. Never reuse a key for another step. */
|
|
113
|
+
key: string;
|
|
114
|
+
kind?: GuideStepKind;
|
|
115
|
+
/**
|
|
116
|
+
* The anchor to spotlight. For a field, anchor the wrapper (label, input,
|
|
117
|
+
* error line); the engine types into the first input inside it.
|
|
118
|
+
*/
|
|
119
|
+
target?: GuideAnchorKey;
|
|
120
|
+
/** Pick the target with this `data-guide-id` among repeated rows. */
|
|
121
|
+
targetId?: string | ((ctx: GuideContext) => string | undefined);
|
|
122
|
+
/**
|
|
123
|
+
* The instruction, one line (≈30 characters). A word in [brackets] is
|
|
124
|
+
* drawn as a chip in the brand colour: "กด [ตั้งค่า HR]".
|
|
125
|
+
*/
|
|
126
|
+
title: GuideText;
|
|
127
|
+
/** One short line on why (≈45 characters). Optional. */
|
|
128
|
+
why?: GuideText;
|
|
129
|
+
/**
|
|
130
|
+
* Where the step happens (pattern as in `{ route }`). Used to resume after
|
|
131
|
+
* a refresh and to send the user back when they are elsewhere.
|
|
132
|
+
*/
|
|
133
|
+
route?: string;
|
|
134
|
+
/** Where to send the user to resume at this step; `route` with the
|
|
135
|
+
* context's params filled in when omitted. */
|
|
136
|
+
resumeUrl?: (ctx: GuideContext) => string | undefined;
|
|
137
|
+
/**
|
|
138
|
+
* A step the tour can restart from: on a stable page, not inside a dialog
|
|
139
|
+
* or a menu. A refresh, a closed dialog or a lost target goes back to the
|
|
140
|
+
* last checkpoint. A mission's first step always is one.
|
|
141
|
+
*/
|
|
142
|
+
checkpoint?: boolean;
|
|
143
|
+
/** What moves the step on. "view" and "input" steps need none. */
|
|
144
|
+
advanceOn?: GuideTrigger | GuideTrigger[];
|
|
145
|
+
/**
|
|
146
|
+
* When the step is entered, a `route` or `visible` trigger that already
|
|
147
|
+
* holds passes it at once (the user is already on the page). Default true;
|
|
148
|
+
* false keeps the step.
|
|
149
|
+
*/
|
|
150
|
+
autoPass?: boolean;
|
|
151
|
+
/**
|
|
152
|
+
* "input" steps: null when the value is fine, otherwise the line to show
|
|
153
|
+
* ("ยังไม่ได้พิมพ์ชื่อแผนก"). Default: not blank.
|
|
154
|
+
*/
|
|
155
|
+
validate?: (value: string, ctx: GuideContext) => string | null;
|
|
156
|
+
/**
|
|
157
|
+
* Ids to remember for later steps (privacy: ids only, never typed values).
|
|
158
|
+
* `api.id` is the saved record's id (data.id or data.data.id).
|
|
159
|
+
*/
|
|
160
|
+
capture?: (e: GuideCaptureEvent, ctx: GuideContext) => Record<string, string> | void;
|
|
161
|
+
/** Skip the step (silently) when true. Runs every time it is entered. */
|
|
162
|
+
skipIf?: (ctx: GuideContext) => boolean;
|
|
163
|
+
/** A policy key the step needs (checked with `guides.can`); skipped when
|
|
164
|
+
* the user lacks it. */
|
|
165
|
+
requires?: string;
|
|
166
|
+
/** When the target never shows. Default "retry" (then back to the last
|
|
167
|
+
* checkpoint on a second miss). */
|
|
168
|
+
onMissing?: GuideOnMissing;
|
|
169
|
+
/** How long to wait for the target, while nothing is loading. 8000 ms. */
|
|
170
|
+
timeoutMs?: number;
|
|
171
|
+
/** More anchors the user may use during this step. */
|
|
172
|
+
allow?: GuideAnchorKey[];
|
|
173
|
+
/**
|
|
174
|
+
* "commit" steps: what a refused save means. Return the key of the step to
|
|
175
|
+
* go back to (a field) and/or the line to show. Default: stay, show the
|
|
176
|
+
* server's message.
|
|
177
|
+
*/
|
|
178
|
+
onApiError?: (failure: GuideApiFailure, ctx: GuideContext) => {
|
|
179
|
+
step?: string;
|
|
180
|
+
message?: string;
|
|
181
|
+
} | void;
|
|
182
|
+
}
|
|
183
|
+
/** What `capture` sees: the trigger that advanced the step. */
|
|
184
|
+
export interface GuideCaptureEvent {
|
|
185
|
+
route?: {
|
|
186
|
+
pathname: string;
|
|
187
|
+
params: Readonly<Record<string, string>>;
|
|
188
|
+
};
|
|
189
|
+
api?: {
|
|
190
|
+
method: string;
|
|
191
|
+
path: string;
|
|
192
|
+
status: number;
|
|
193
|
+
id?: string;
|
|
194
|
+
};
|
|
195
|
+
event?: {
|
|
196
|
+
name: string;
|
|
197
|
+
detail?: Readonly<Record<string, string>>;
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
export interface GuideMission {
|
|
201
|
+
/** Stable id within the suite, saved on the server: "work-hours". */
|
|
202
|
+
key: string;
|
|
203
|
+
/** What it achieves, ≈20 characters: "ตั้งเวลาทำงาน". */
|
|
204
|
+
title: string;
|
|
205
|
+
/** Rough minutes, for "ประมาณ 2 นาที". */
|
|
206
|
+
minutes: number;
|
|
207
|
+
/** Missions that must be done first ("ทำ <ชื่อ> ก่อน"). */
|
|
208
|
+
after?: string[];
|
|
209
|
+
/** The user may set it aside for good ("ไม่ใช้ภารกิจนี้"); it then counts
|
|
210
|
+
* as settled for completion. */
|
|
211
|
+
optional?: boolean;
|
|
212
|
+
/**
|
|
213
|
+
* The org already has what this mission makes: shown as "ทำไว้แล้ว" with
|
|
214
|
+
* "ดูวิธีทำ" (a replay). undefined = not known yet.
|
|
215
|
+
*/
|
|
216
|
+
alreadyDone?: (ctx: GuideContext) => boolean | undefined;
|
|
217
|
+
/** The celebration. Title defaults to "<title>แล้ว". */
|
|
218
|
+
done?: {
|
|
219
|
+
title?: GuideText;
|
|
220
|
+
subtitle?: GuideText;
|
|
221
|
+
};
|
|
222
|
+
steps: GuideStep[];
|
|
223
|
+
}
|
|
224
|
+
/** Shown in place of the welcome while the org is not ready for the tour. */
|
|
225
|
+
export interface GuideGate {
|
|
226
|
+
/** true: go on; false: show the gate; undefined: still loading. */
|
|
227
|
+
ready: (ctx: GuideContext) => boolean | undefined;
|
|
228
|
+
title: string;
|
|
229
|
+
subtitle?: string;
|
|
230
|
+
/** The one button, and where it goes (absolute URLs leave the app). */
|
|
231
|
+
action: {
|
|
232
|
+
label: string;
|
|
233
|
+
href: GuideText;
|
|
234
|
+
};
|
|
235
|
+
/** The line on each mission in the panel while waiting: "ต้องมีพนักงาน 2 คน". */
|
|
236
|
+
pending: string;
|
|
237
|
+
}
|
|
238
|
+
/** One app's whole tour: the welcome, the missions, the finish. */
|
|
239
|
+
export interface GuideSuite {
|
|
240
|
+
/** Progress key on the server, "<app>.<name>": "peoplx.first-run". */
|
|
241
|
+
key: string;
|
|
242
|
+
/** Raise it to show the tour again to everyone (resets progress). */
|
|
243
|
+
version: number;
|
|
244
|
+
app: GuideAppId;
|
|
245
|
+
/** The app's name for the phone's menu step: "Peoplx". */
|
|
246
|
+
appName: string;
|
|
247
|
+
welcome: {
|
|
248
|
+
/** "ยินดีต้อนรับ ผู้จัดการ HR" */
|
|
249
|
+
title: GuideText;
|
|
250
|
+
/** Default "มาตั้งค่าบริษัทให้พร้อมใน N ภารกิจ". */
|
|
251
|
+
subtitle?: GuideText;
|
|
252
|
+
};
|
|
253
|
+
/**
|
|
254
|
+
* Pages where the welcome may open by itself (a direct link to an approval
|
|
255
|
+
* is never interrupted). Default ["/[code]"], the app's home.
|
|
256
|
+
*/
|
|
257
|
+
welcomeRoutes?: string[];
|
|
258
|
+
gate?: GuideGate;
|
|
259
|
+
complete: {
|
|
260
|
+
/** Default "บริษัทพร้อมใช้งานแล้ว". */
|
|
261
|
+
title?: GuideText;
|
|
262
|
+
subtitle?: GuideText;
|
|
263
|
+
/** "ไปที่ภาพรวม HR" → "/[code]" */
|
|
264
|
+
action: {
|
|
265
|
+
label: string;
|
|
266
|
+
href: GuideText;
|
|
267
|
+
};
|
|
268
|
+
/** e.g. "ชวนทีมเข้าใช้งาน" for admins; omitted when it returns no href. */
|
|
269
|
+
secondary?: {
|
|
270
|
+
label: string;
|
|
271
|
+
href: GuideText | ((ctx: GuideContext) => string | undefined);
|
|
272
|
+
};
|
|
273
|
+
};
|
|
274
|
+
missions: GuideMission[];
|
|
275
|
+
}
|
|
276
|
+
/** AppLayoutShell's `guides` prop. */
|
|
277
|
+
export interface GuideConfig {
|
|
278
|
+
suite: GuideSuite;
|
|
279
|
+
/** Counts and flags the predicates read. Re-pass when they change. */
|
|
280
|
+
facts?: GuideFacts;
|
|
281
|
+
/** Permission check for `requires` (the app's useApiPolicyAccess). */
|
|
282
|
+
can?: (policyKey: string) => boolean;
|
|
283
|
+
/**
|
|
284
|
+
* False holds the tour (e.g. while the plan or the profile loads).
|
|
285
|
+
* Default true.
|
|
286
|
+
*/
|
|
287
|
+
ready?: boolean;
|
|
288
|
+
}
|
|
@@ -4,5 +4,9 @@ export interface HelpButtonProps {
|
|
|
4
4
|
/**
|
|
5
5
|
* The ช่วยเหลือ button in the top bar. Drawn in the header's ink (the
|
|
6
6
|
* --header-* variables of the workspace chrome, white on the brand chrome).
|
|
7
|
+
*
|
|
8
|
+
* When this user has a guided tour in this app, it opens a small menu:
|
|
9
|
+
* "ไกด์เริ่มต้น n/N" (the quest panel) and "ติดต่อทีมช่วยเหลือ" (the help
|
|
10
|
+
* dialog). Otherwise one press opens the help dialog, as before.
|
|
7
11
|
*/
|
|
8
12
|
export declare function HelpButton({ className }: HelpButtonProps): import("react/jsx-runtime").JSX.Element;
|
package/dist/index.d.ts
CHANGED
|
@@ -17,6 +17,7 @@ export { NavUser, type NavUserProps, type NavUserSystemLink } from "./navigation
|
|
|
17
17
|
export { useMyRoles, myRolesQueryKey } from "./navigation/use-my-roles";
|
|
18
18
|
export { parseMyRoles, roleSummary, OWNER_CHIP, type MyRole, type MyRoles, } from "./navigation/my-roles";
|
|
19
19
|
export { buildSystemLinks, type BuildSystemLinksOptions, type ErpAppId, } from "./navigation/app-registry";
|
|
20
|
+
export { accountSettingsHref, platformBaseUrl, type AccountSettingsHrefOptions, } from "./navigation/platform-url";
|
|
20
21
|
export { PLAN_FEATURES, hasPlanFeature, type PlanFeatureKey, } from "./lib/plan-features";
|
|
21
22
|
export { NavMain, type NavMainProps } from "./navigation/nav-main";
|
|
22
23
|
export { OrganizationSwitcher, type OrganizationSwitcherProps, type OrganizationLike, } from "./navigation/organization-switcher";
|
|
@@ -32,6 +33,10 @@ export { HelpDialogHost, type HelpDialogHostProps } from "./help/help-dialog";
|
|
|
32
33
|
export { openHelp, closeHelp, type HelpAppId } from "./help/help-store";
|
|
33
34
|
export { describeBrowser, describeAttached, detectHelpApp, type HelpContext, } from "./help/help-context";
|
|
34
35
|
export { SHELL_VERSION } from "./version";
|
|
36
|
+
export type { GuideAnchorKey, GuideApiFailure, GuideApiMatch, GuideAppId, GuideCaptureEvent, GuideConfig, GuideContext, GuideFacts, GuideGate, GuideMission, GuideOnMissing, GuideStep, GuideStepKind, GuideSuite, GuideText, GuideTrigger, } from "./guide/types";
|
|
37
|
+
export { API_EVENT as GUIDE_API_EVENT, GUIDE_EVENT_PREFIX, GUIDE_LAYER_ATTRIBUTE, emitGuideEvent, guideAnchor, reportApiEvent, type ApiEventDetail, type GuideAnchorProps, } from "./guide/events";
|
|
38
|
+
export { openGuidePanel, useGuideEntry, type GuideEntry } from "./guide/guide-store";
|
|
39
|
+
export { GuideHost, type GuideHostProps } from "./guide/guide-host";
|
|
35
40
|
export { AccessDenied, type AccessDeniedProps } from "./auth/access-denied";
|
|
36
41
|
export { EmployeeRequiredGate, EMPLOYEE_RECORD_REQUIRED, EMPLOYEE_RECORD_REQUIRED_EVENT, EMPLOYEE_RECORD_OK_EVENT, } from "./auth/employee-required-gate";
|
|
37
42
|
export { PermissionGateShell, type PermissionGateShellProps, type PermissionGateSkeletonVariant, } from "./auth/permission-gate-shell";
|