phx-react 1.3.1837 → 1.3.1838

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 (67) hide show
  1. package/dist/cjs/components/Onboarding/contexts/onboarding-context.d.ts +63 -0
  2. package/dist/cjs/components/Onboarding/contexts/onboarding-context.js +282 -0
  3. package/dist/cjs/components/Onboarding/contexts/onboarding-context.js.map +1 -0
  4. package/dist/cjs/components/Onboarding/contexts/style.d.ts +1 -0
  5. package/dist/cjs/components/Onboarding/contexts/style.js +77 -0
  6. package/dist/cjs/components/Onboarding/contexts/style.js.map +1 -0
  7. package/dist/cjs/components/Onboarding/hooks/use-onboarding-init.d.ts +7 -0
  8. package/dist/cjs/components/Onboarding/hooks/use-onboarding-init.js +19 -0
  9. package/dist/cjs/components/Onboarding/hooks/use-onboarding-init.js.map +1 -0
  10. package/dist/cjs/components/Onboarding/index.d.ts +3 -0
  11. package/dist/cjs/components/Onboarding/index.js +7 -0
  12. package/dist/cjs/components/Onboarding/index.js.map +1 -0
  13. package/dist/cjs/components/Onboarding/modal-slides/modal-slides.d.ts +10 -0
  14. package/dist/cjs/components/Onboarding/modal-slides/modal-slides.js +59 -0
  15. package/dist/cjs/components/Onboarding/modal-slides/modal-slides.js.map +1 -0
  16. package/dist/cjs/components/Onboarding/onbroading-demo.d.ts +9 -0
  17. package/dist/cjs/components/Onboarding/onbroading-demo.js +208 -0
  18. package/dist/cjs/components/Onboarding/onbroading-demo.js.map +1 -0
  19. package/dist/cjs/components/Slider/index.d.ts +2 -0
  20. package/dist/cjs/components/Slider/index.js +6 -0
  21. package/dist/cjs/components/Slider/index.js.map +1 -0
  22. package/dist/cjs/components/Slider/phx-slider-item.d.ts +6 -0
  23. package/dist/cjs/components/Slider/phx-slider-item.js +38 -0
  24. package/dist/cjs/components/Slider/phx-slider-item.js.map +1 -0
  25. package/dist/cjs/components/Slider/phx-slider.d.ts +18 -0
  26. package/dist/cjs/components/Slider/phx-slider.js +168 -0
  27. package/dist/cjs/components/Slider/phx-slider.js.map +1 -0
  28. package/dist/cjs/components/Slider/ultis/create-animate.d.ts +17 -0
  29. package/dist/cjs/components/Slider/ultis/create-animate.js +38 -0
  30. package/dist/cjs/components/Slider/ultis/create-animate.js.map +1 -0
  31. package/dist/cjs/index.d.ts +2 -0
  32. package/dist/cjs/index.js +2 -0
  33. package/dist/cjs/index.js.map +1 -1
  34. package/dist/esm/components/Onboarding/contexts/onboarding-context.d.ts +63 -0
  35. package/dist/esm/components/Onboarding/contexts/onboarding-context.js +276 -0
  36. package/dist/esm/components/Onboarding/contexts/onboarding-context.js.map +1 -0
  37. package/dist/esm/components/Onboarding/contexts/style.d.ts +1 -0
  38. package/dist/esm/components/Onboarding/contexts/style.js +74 -0
  39. package/dist/esm/components/Onboarding/contexts/style.js.map +1 -0
  40. package/dist/esm/components/Onboarding/hooks/use-onboarding-init.d.ts +7 -0
  41. package/dist/esm/components/Onboarding/hooks/use-onboarding-init.js +15 -0
  42. package/dist/esm/components/Onboarding/hooks/use-onboarding-init.js.map +1 -0
  43. package/dist/esm/components/Onboarding/index.d.ts +3 -0
  44. package/dist/esm/components/Onboarding/index.js +4 -0
  45. package/dist/esm/components/Onboarding/index.js.map +1 -0
  46. package/dist/esm/components/Onboarding/modal-slides/modal-slides.d.ts +10 -0
  47. package/dist/esm/components/Onboarding/modal-slides/modal-slides.js +54 -0
  48. package/dist/esm/components/Onboarding/modal-slides/modal-slides.js.map +1 -0
  49. package/dist/esm/components/Onboarding/onbroading-demo.d.ts +9 -0
  50. package/dist/esm/components/Onboarding/onbroading-demo.js +203 -0
  51. package/dist/esm/components/Onboarding/onbroading-demo.js.map +1 -0
  52. package/dist/esm/components/Slider/index.d.ts +2 -0
  53. package/dist/esm/components/Slider/index.js +2 -0
  54. package/dist/esm/components/Slider/index.js.map +1 -0
  55. package/dist/esm/components/Slider/phx-slider-item.d.ts +6 -0
  56. package/dist/esm/components/Slider/phx-slider-item.js +33 -0
  57. package/dist/esm/components/Slider/phx-slider-item.js.map +1 -0
  58. package/dist/esm/components/Slider/phx-slider.d.ts +18 -0
  59. package/dist/esm/components/Slider/phx-slider.js +164 -0
  60. package/dist/esm/components/Slider/phx-slider.js.map +1 -0
  61. package/dist/esm/components/Slider/ultis/create-animate.d.ts +17 -0
  62. package/dist/esm/components/Slider/ultis/create-animate.js +34 -0
  63. package/dist/esm/components/Slider/ultis/create-animate.js.map +1 -0
  64. package/dist/esm/index.d.ts +2 -0
  65. package/dist/esm/index.js +2 -0
  66. package/dist/esm/index.js.map +1 -1
  67. package/package.json +2 -1
@@ -0,0 +1,63 @@
1
+ import 'driver.js/dist/driver.css';
2
+ import React from 'react';
3
+ export interface IPHXOnboardingStep {
4
+ element: string;
5
+ popover: {
6
+ title: string;
7
+ description: string;
8
+ side?: 'left' | 'right' | 'top' | 'bottom';
9
+ align?: 'start' | 'center' | 'end';
10
+ };
11
+ }
12
+ export interface IPHXOnboardingSlideStep {
13
+ id: number;
14
+ title?: string;
15
+ description?: string;
16
+ content?: string;
17
+ image: string;
18
+ }
19
+ /**
20
+ * Một flow onboarding có thể có slides, tour steps, hoặc cả hai.
21
+ * - Chỉ slides: hiện modal slides, không có tour
22
+ * - Chỉ tour: chạy driver.js tour trực tiếp
23
+ * - Cả hai: hiện modal slides → nút "Bắt đầu Tour" → chạy tour
24
+ */
25
+ export interface IPHXOnboardingFlow {
26
+ name: string;
27
+ slides?: Array<IPHXOnboardingSlideStep>;
28
+ steps?: Array<IPHXOnboardingStep>;
29
+ }
30
+ export interface IPHXOnboardingStatus {
31
+ slidesCompleted: boolean;
32
+ toursCompleted: boolean;
33
+ }
34
+ export interface IPHXOnboardingContextType {
35
+ currentFlow: string | null;
36
+ isRunning: boolean;
37
+ registerFlow(flow: IPHXOnboardingFlow): void;
38
+ startFlow(flowName: string): void;
39
+ endFlow(): void;
40
+ nextStep(): void;
41
+ previousStep(): void;
42
+ skipFlow(): void;
43
+ resetStatusOnboarding(flowName: string): void;
44
+ isSlidesOpen: boolean;
45
+ closeSlides(): void;
46
+ /**
47
+ * Lưu trạng thái hoàn thành của flow vào localStorage.
48
+ * Mặc định trạng thái chỉ được giữ trong bộ nhớ (in-memory).
49
+ * Gọi hàm này khi muốn persist để không hiện lại lần sau.
50
+ */
51
+ persistFlowStatus(flowName: string): void;
52
+ /**
53
+ * Đọc trạng thái hiện tại của flow từ bộ nhớ.
54
+ */
55
+ getFlowStatus(flowName: string): IPHXOnboardingStatus;
56
+ }
57
+ export declare const PHXOnboardingProvider: React.FC<{
58
+ children: React.ReactNode;
59
+ }>;
60
+ /**
61
+ * Hook để sử dụng context
62
+ */
63
+ export declare const usePHXOnboarding: () => IPHXOnboardingContextType;
@@ -0,0 +1,276 @@
1
+ 'use client';
2
+ import { driver } from 'driver.js';
3
+ import 'driver.js/dist/driver.css';
4
+ import React, { createContext, useContext, useEffect, useState } from 'react';
5
+ import { PHXOnboardingModal } from '../modal-slides/modal-slides';
6
+ import { styleOnboarding } from './style';
7
+ const ONBOARDING_STATUS_KEY = 'phx-onboarding-status';
8
+ const PHXOnboardingContext = createContext(undefined);
9
+ export const PHXOnboardingProvider = ({ children }) => {
10
+ const [currentFlow, setCurrentFlow] = useState(null);
11
+ const [isRunning, setIsRunning] = useState(false);
12
+ const [flows, setFlows] = useState(new Map());
13
+ const [driverInstance, setDriverInstance] = useState(null);
14
+ // Modal slides state
15
+ const [isSlidesOpen, setIsSlidesOpen] = useState(false);
16
+ const [activeSlides, setActiveSlides] = useState([]);
17
+ const [hasTours, setHasTours] = useState(false);
18
+ const [pendingTourFlowName, setPendingTourFlowName] = useState(null);
19
+ // In-memory status only — không tự động ghi localStorage
20
+ const [onboardingStatus, setOnboardingStatus] = useState({});
21
+ // Đọc trạng thái đã persist từ localStorage khi khởi động
22
+ useEffect(() => {
23
+ const saved = localStorage.getItem(ONBOARDING_STATUS_KEY);
24
+ if (saved) {
25
+ try {
26
+ setOnboardingStatus(JSON.parse(saved));
27
+ }
28
+ catch (_a) {
29
+ // ignore parse error
30
+ }
31
+ }
32
+ }, []);
33
+ /**
34
+ * Cập nhật trạng thái trong bộ nhớ (KHÔNG ghi localStorage)
35
+ * @param flowName Tên flow
36
+ * @param patch Trạng thái muốn cập nhật
37
+ */
38
+ const updateStatus = (flowName, patch) => {
39
+ setOnboardingStatus((prev) => {
40
+ var _a;
41
+ const current = (_a = prev[flowName]) !== null && _a !== void 0 ? _a : {
42
+ slidesCompleted: false,
43
+ toursCompleted: false,
44
+ };
45
+ return {
46
+ ...prev,
47
+ [flowName]: { ...current, ...patch },
48
+ };
49
+ });
50
+ };
51
+ /** Lưu trạng thái của flow vào localStorage
52
+ * @param flowName Tên flow
53
+ */
54
+ const persistFlowStatus = (flowName) => {
55
+ setOnboardingStatus((prev) => {
56
+ var _a;
57
+ const status = (_a = prev[flowName]) !== null && _a !== void 0 ? _a : {
58
+ slidesCompleted: false,
59
+ toursCompleted: false,
60
+ };
61
+ const updated = { ...prev, [flowName]: status };
62
+ localStorage.setItem(ONBOARDING_STATUS_KEY, JSON.stringify(updated));
63
+ return updated;
64
+ });
65
+ };
66
+ /**
67
+ * Lấy trạng thái của flow
68
+ * @param flowName Tên flow
69
+ */
70
+ const getFlowStatus = (flowName) => {
71
+ var _a;
72
+ return (_a = onboardingStatus[flowName]) !== null && _a !== void 0 ? _a : {
73
+ slidesCompleted: false,
74
+ toursCompleted: false,
75
+ };
76
+ };
77
+ /**
78
+ * Đăng ký flow
79
+ * @param flow Flow cần đăng ký
80
+ */
81
+ const registerFlow = (flow) => {
82
+ setFlows((prev) => new Map(prev).set(flow.name, flow));
83
+ };
84
+ /**
85
+ * Chạy tour
86
+ * @param flowName Tên flow
87
+ * @param flow Flow cần chạy tour
88
+ */
89
+ const runTour = (flowName, flow) => {
90
+ var _a;
91
+ if (!((_a = flow.steps) === null || _a === void 0 ? void 0 : _a.length))
92
+ return;
93
+ if (driverInstance) {
94
+ driverInstance.destroy();
95
+ }
96
+ /**
97
+ * Tạo driver instance
98
+ */
99
+ const newDriver = driver({
100
+ showProgress: true,
101
+ showButtons: ['next', 'previous', 'close'],
102
+ nextBtnText: 'Tiếp theo',
103
+ prevBtnText: 'Quay lại',
104
+ doneBtnText: 'Hoàn tất',
105
+ stageRadius: 12,
106
+ allowClose: true,
107
+ onDestroyed: () => {
108
+ setDriverInstance(null);
109
+ setCurrentFlow(null);
110
+ setIsRunning(false);
111
+ // Chỉ cập nhật in-memory, không tự động persist
112
+ updateStatus(flowName, { toursCompleted: true });
113
+ },
114
+ });
115
+ newDriver.setSteps(flow.steps.map((step) => {
116
+ var _a, _b;
117
+ return ({
118
+ element: step.element,
119
+ popover: {
120
+ title: step.popover.title,
121
+ description: step.popover.description,
122
+ side: (_a = step.popover.side) !== null && _a !== void 0 ? _a : 'bottom',
123
+ align: (_b = step.popover.align) !== null && _b !== void 0 ? _b : 'center',
124
+ },
125
+ });
126
+ }));
127
+ setDriverInstance(newDriver);
128
+ setCurrentFlow(flowName);
129
+ setIsRunning(true);
130
+ newDriver.drive();
131
+ };
132
+ /**
133
+ * Bắt đầu flow
134
+ * @param flowName Tên flow
135
+ */
136
+ const startFlow = (flowName) => {
137
+ var _a, _b;
138
+ const flow = flows.get(flowName);
139
+ if (!flow) {
140
+ console.warn(`[Onboarding] Flow "${flowName}" not registered`);
141
+ return;
142
+ }
143
+ const hasSlides = Boolean((_a = flow.slides) === null || _a === void 0 ? void 0 : _a.length);
144
+ const hasTourSteps = Boolean((_b = flow.steps) === null || _b === void 0 ? void 0 : _b.length);
145
+ const status = getFlowStatus(flowName);
146
+ // Case 1: chỉ có tour (không có slides)
147
+ if (!hasSlides && hasTourSteps) {
148
+ runTour(flowName, flow);
149
+ return;
150
+ }
151
+ // Case 2: chỉ có slides (không có tour)
152
+ if (hasSlides && !hasTourSteps) {
153
+ if (!status.slidesCompleted) {
154
+ setActiveSlides(flow.slides);
155
+ setHasTours(false);
156
+ setPendingTourFlowName(null);
157
+ setCurrentFlow(flowName);
158
+ setIsSlidesOpen(true);
159
+ }
160
+ return;
161
+ }
162
+ // Case 3: cả slides lẫn tour
163
+ if (hasSlides && hasTourSteps) {
164
+ if (!status.slidesCompleted) {
165
+ setActiveSlides(flow.slides);
166
+ setHasTours(true);
167
+ setPendingTourFlowName(flowName);
168
+ setCurrentFlow(flowName);
169
+ setIsSlidesOpen(true);
170
+ }
171
+ else if (!status.toursCompleted) {
172
+ runTour(flowName, flow);
173
+ }
174
+ return;
175
+ }
176
+ console.warn(`[Onboarding] Flow "${flowName}" has no slides or steps`);
177
+ };
178
+ /**
179
+ * Cập nhật trạng thái của flow
180
+ */
181
+ const updateStatusFlow = () => {
182
+ if (currentFlow) {
183
+ // Chỉ cập nhật in-memory, không tự động persist
184
+ updateStatus(currentFlow, { slidesCompleted: true });
185
+ }
186
+ };
187
+ /**
188
+ * Đóng slides
189
+ */
190
+ const closeSlides = () => {
191
+ setIsSlidesOpen(false);
192
+ updateStatusFlow();
193
+ };
194
+ /**
195
+ * Bắt đầu tour từ slides
196
+ */
197
+ const startTourFromSlides = () => {
198
+ setIsSlidesOpen(false);
199
+ updateStatusFlow();
200
+ if (pendingTourFlowName) {
201
+ const flow = flows.get(pendingTourFlowName);
202
+ if (flow) {
203
+ runTour(pendingTourFlowName, flow);
204
+ }
205
+ }
206
+ };
207
+ /**
208
+ * Kết thúc flow
209
+ */
210
+ const endFlow = () => {
211
+ if (driverInstance) {
212
+ driverInstance.destroy();
213
+ setDriverInstance(null);
214
+ }
215
+ setIsRunning(false);
216
+ setCurrentFlow(null);
217
+ };
218
+ /**
219
+ * Chuyển đến bước tiếp theo
220
+ */
221
+ const nextStep = () => {
222
+ driverInstance === null || driverInstance === void 0 ? void 0 : driverInstance.moveNext();
223
+ };
224
+ /**
225
+ * Chuyển đến bước trước đó
226
+ */
227
+ const previousStep = () => {
228
+ driverInstance === null || driverInstance === void 0 ? void 0 : driverInstance.movePrevious();
229
+ };
230
+ /**
231
+ * Bỏ qua flow
232
+ */
233
+ const skipFlow = () => {
234
+ endFlow();
235
+ };
236
+ /**
237
+ * Reset trạng thái của flow
238
+ * @param flowName Tên flow
239
+ */
240
+ const resetStatusOnboarding = (flowName) => {
241
+ updateStatus(flowName, {
242
+ slidesCompleted: false,
243
+ toursCompleted: false,
244
+ });
245
+ };
246
+ const value = {
247
+ currentFlow,
248
+ isRunning,
249
+ registerFlow,
250
+ startFlow,
251
+ endFlow,
252
+ nextStep,
253
+ previousStep,
254
+ skipFlow,
255
+ isSlidesOpen,
256
+ closeSlides,
257
+ persistFlowStatus,
258
+ getFlowStatus,
259
+ resetStatusOnboarding,
260
+ };
261
+ return (React.createElement(PHXOnboardingContext.Provider, { value: value },
262
+ React.createElement("style", { dangerouslySetInnerHTML: { __html: styleOnboarding } }),
263
+ children,
264
+ React.createElement(PHXOnboardingModal, { hasTours: hasTours, onHide: closeSlides, onStartTour: startTourFromSlides, show: isSlidesOpen, slides: activeSlides })));
265
+ };
266
+ /**
267
+ * Hook để sử dụng context
268
+ */
269
+ export const usePHXOnboarding = () => {
270
+ const context = useContext(PHXOnboardingContext);
271
+ if (!context) {
272
+ throw new Error('useOnboarding must be used within OnboardingProvider');
273
+ }
274
+ return context;
275
+ };
276
+ //# sourceMappingURL=onboarding-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"onboarding-context.js","sourceRoot":"","sources":["../../../../../src/components/Onboarding/contexts/onboarding-context.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare const styleOnboarding = "\n.driver-popover-footer button {\n all: unset;\n display: flex;\n justify-content: center;\n align-items: center;\n box-sizing: border-box;\n padding: 6px 12px;\n font-weight: 400 !important;\n text-decoration: none;\n text-shadow: 1px 1px 0 #fff;\n background-color: #fff;\n color: rgb(3 7 18 / 1);\n font-size: 14px;\n line-height: normal;\n font-family: Inter, -apple-system, BlinkMacSystemFont, San Francisco, Segoe UI,\n Roboto, Helvetica Neue, sans-serif;\n cursor: pointer;\n outline: 0;\n border: 1px solid rgb(209 213 219 / 1);\n border-radius: 8px;\n transition-duration: 0.3s;\n transition-property: color, background-color, border-color,\n text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter,\n backdrop-filter;\n --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);\n --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000),\n var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n}\n\n.driver-popover-footer button:active {\n --tw-shadow: 0rem 0.125rem 0.1rem 0rem #0004 inset;\n --tw-shadow-colored: inset 0rem 0.125rem 0.1rem 0rem var(--tw-shadow-color);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000),\n var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n padding-top: 0.3rem;\n padding-bottom: 0.2rem;\n background-color: rgb(229 231 235 / 1);\n border-bottom-color: rgb(209 213 219 / 1);\n transition-timing-function: cubic-bezier(0.4, 0.36, 0, 1);\n}\n.driver-popover {\n font-weight: 400 !important;\n font-size: 14px;\n line-height: normal;\n font-family: Inter, -apple-system, BlinkMacSystemFont, San Francisco, Segoe UI,\n Roboto, Helvetica Neue, sans-serif;\n border-radius: 12px;\n color: #fff;\n background-color: rgb(0 0 0 / 1);\n}\n\n.driver-popover-title {\n font-family: Inter, -apple-system, BlinkMacSystemFont, San Francisco, Segoe UI,\n Roboto, Helvetica Neue, sans-serif;\n}\n.driver-popover .driver-popover-arrow-side-left.driver-popover-arrow {\n border-left-color: rgb(0 0 0 / 1);\n}\n\n.driver-popover .driver-popover-arrow-side-right.driver-popover-arrow {\n border-right-color: rgb(0 0 0 / 1);\n}\n\n.driver-popover .driver-popover-arrow-side-top.driver-popover-arrow {\n border-top-color: rgb(0 0 0 / 1);\n}\n\n.driver-popover .driver-popover-arrow-side-bottom.driver-popover-arrow {\n border-bottom-color: rgb(0 0 0 / 1);\n}\n";
@@ -0,0 +1,74 @@
1
+ export const styleOnboarding = `
2
+ .driver-popover-footer button {
3
+ all: unset;
4
+ display: flex;
5
+ justify-content: center;
6
+ align-items: center;
7
+ box-sizing: border-box;
8
+ padding: 6px 12px;
9
+ font-weight: 400 !important;
10
+ text-decoration: none;
11
+ text-shadow: 1px 1px 0 #fff;
12
+ background-color: #fff;
13
+ color: rgb(3 7 18 / 1);
14
+ font-size: 14px;
15
+ line-height: normal;
16
+ font-family: Inter, -apple-system, BlinkMacSystemFont, San Francisco, Segoe UI,
17
+ Roboto, Helvetica Neue, sans-serif;
18
+ cursor: pointer;
19
+ outline: 0;
20
+ border: 1px solid rgb(209 213 219 / 1);
21
+ border-radius: 8px;
22
+ transition-duration: 0.3s;
23
+ transition-property: color, background-color, border-color,
24
+ text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter,
25
+ backdrop-filter;
26
+ --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);
27
+ --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);
28
+ box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000),
29
+ var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
30
+ }
31
+
32
+ .driver-popover-footer button:active {
33
+ --tw-shadow: 0rem 0.125rem 0.1rem 0rem #0004 inset;
34
+ --tw-shadow-colored: inset 0rem 0.125rem 0.1rem 0rem var(--tw-shadow-color);
35
+ box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000),
36
+ var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
37
+ padding-top: 0.3rem;
38
+ padding-bottom: 0.2rem;
39
+ background-color: rgb(229 231 235 / 1);
40
+ border-bottom-color: rgb(209 213 219 / 1);
41
+ transition-timing-function: cubic-bezier(0.4, 0.36, 0, 1);
42
+ }
43
+ .driver-popover {
44
+ font-weight: 400 !important;
45
+ font-size: 14px;
46
+ line-height: normal;
47
+ font-family: Inter, -apple-system, BlinkMacSystemFont, San Francisco, Segoe UI,
48
+ Roboto, Helvetica Neue, sans-serif;
49
+ border-radius: 12px;
50
+ color: #fff;
51
+ background-color: rgb(0 0 0 / 1);
52
+ }
53
+
54
+ .driver-popover-title {
55
+ font-family: Inter, -apple-system, BlinkMacSystemFont, San Francisco, Segoe UI,
56
+ Roboto, Helvetica Neue, sans-serif;
57
+ }
58
+ .driver-popover .driver-popover-arrow-side-left.driver-popover-arrow {
59
+ border-left-color: rgb(0 0 0 / 1);
60
+ }
61
+
62
+ .driver-popover .driver-popover-arrow-side-right.driver-popover-arrow {
63
+ border-right-color: rgb(0 0 0 / 1);
64
+ }
65
+
66
+ .driver-popover .driver-popover-arrow-side-top.driver-popover-arrow {
67
+ border-top-color: rgb(0 0 0 / 1);
68
+ }
69
+
70
+ .driver-popover .driver-popover-arrow-side-bottom.driver-popover-arrow {
71
+ border-bottom-color: rgb(0 0 0 / 1);
72
+ }
73
+ `;
74
+ //# sourceMappingURL=style.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"style.js","sourceRoot":"","sources":["../../../../../src/components/Onboarding/contexts/style.tsx"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,eAAe,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwE9B,CAAA"}
@@ -0,0 +1,7 @@
1
+ import { IPHXOnboardingFlow } from '../contexts/onboarding-context';
2
+ /**
3
+ * Đăng ký danh sách flows vào OnboardingProvider.
4
+ * Gọi hook này một lần trong component gốc của mỗi module.
5
+ * @param flows Danh sách flows cần đăng ký
6
+ */
7
+ export declare const usePHXOnboardingInit: (flows: Array<IPHXOnboardingFlow>) => void;
@@ -0,0 +1,15 @@
1
+ 'use client';
2
+ import { useEffect } from 'react';
3
+ import { usePHXOnboarding } from '../contexts/onboarding-context';
4
+ /**
5
+ * Đăng ký danh sách flows vào OnboardingProvider.
6
+ * Gọi hook này một lần trong component gốc của mỗi module.
7
+ * @param flows Danh sách flows cần đăng ký
8
+ */
9
+ export const usePHXOnboardingInit = (flows) => {
10
+ const { registerFlow } = usePHXOnboarding();
11
+ useEffect(() => {
12
+ flows.map((flow) => registerFlow(flow));
13
+ }, [registerFlow]);
14
+ };
15
+ //# sourceMappingURL=use-onboarding-init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-onboarding-init.js","sourceRoot":"","sources":["../../../../../src/components/Onboarding/hooks/use-onboarding-init.ts"],"names":[],"mappings":"AAAA,YAAY,CAAA;AAEZ,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACjC,OAAO,EAAsB,gBAAgB,EAAE,MAAM,gCAAgC,CAAA;AAErF;;;;GAIG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,KAAgC,EAAE,EAAE;IACvE,MAAM,EAAE,YAAY,EAAE,GAAG,gBAAgB,EAAE,CAAA;IAE3C,SAAS,CAAC,GAAG,EAAE;QACb,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAA;IACzC,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAA;AACpB,CAAC,CAAA"}
@@ -0,0 +1,3 @@
1
+ export * from './contexts/onboarding-context';
2
+ export * from './hooks/use-onboarding-init';
3
+ export * from './modal-slides/modal-slides';
@@ -0,0 +1,4 @@
1
+ export * from './contexts/onboarding-context';
2
+ export * from './hooks/use-onboarding-init';
3
+ export * from './modal-slides/modal-slides';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/components/Onboarding/index.ts"],"names":[],"mappings":"AAAA,cAAc,+BAA+B,CAAA;AAC7C,cAAc,6BAA6B,CAAA;AAC3C,cAAc,6BAA6B,CAAA"}
@@ -0,0 +1,10 @@
1
+ import React from 'react';
2
+ import { IPHXOnboardingSlideStep } from '../contexts/onboarding-context';
3
+ export interface PHXOnboardingModalProps {
4
+ show: boolean;
5
+ slides: Array<IPHXOnboardingSlideStep>;
6
+ hasTours: boolean;
7
+ onHide(): void;
8
+ onStartTour(): void;
9
+ }
10
+ export declare const PHXOnboardingModal: React.FC<PHXOnboardingModalProps>;
@@ -0,0 +1,54 @@
1
+ 'use client';
2
+ import React, { useEffect, useRef, useState } from 'react';
3
+ import { PHXSlider } from '../../Slider';
4
+ import { PHXBox } from '../../Box';
5
+ import { PHXHorizontalStack } from '../../HorizontalStack';
6
+ import { PHXButton } from '../../Button';
7
+ import { PHXModal } from '../../Modal';
8
+ export const PHXOnboardingModal = ({ hasTours, onHide, onStartTour, show, slides, }) => {
9
+ const sliderRef = useRef(null);
10
+ const [currentIndex, setCurrentIndex] = useState(0);
11
+ // Derive from state — triggers re-render when index changes
12
+ const isFirstSlide = currentIndex === 0;
13
+ const isLastSlide = currentIndex === slides.length - 1;
14
+ /**
15
+ * Goes to previous slide
16
+ * @returns
17
+ */
18
+ const goToPrevious = () => {
19
+ var _a;
20
+ if (isFirstSlide)
21
+ return;
22
+ (_a = sliderRef.current) === null || _a === void 0 ? void 0 : _a.prev();
23
+ };
24
+ /**
25
+ * Goes to next slide
26
+ * @returns
27
+ */
28
+ const goToNext = () => {
29
+ var _a;
30
+ if (isLastSlide)
31
+ return;
32
+ (_a = sliderRef.current) === null || _a === void 0 ? void 0 : _a.next();
33
+ };
34
+ /**
35
+ * Reset slider to first slide when modal opens
36
+ * @returns
37
+ */
38
+ useEffect(() => {
39
+ var _a;
40
+ if (show) {
41
+ (_a = sliderRef.current) === null || _a === void 0 ? void 0 : _a.goTo(0);
42
+ setCurrentIndex(0);
43
+ }
44
+ }, [show]);
45
+ const customFooterComponent = (React.createElement(PHXBox, { fullWidth: true, p: 'snappy' },
46
+ React.createElement(PHXHorizontalStack, { fullWidth: true, items: 'center', justify: 'between' },
47
+ isFirstSlide ? (React.createElement("span", null)) : (React.createElement(PHXButton, { onClick: goToPrevious, secondary: true }, "Quay l\u1EA1i")),
48
+ React.createElement(PHXHorizontalStack, { gapX: 'tight', items: 'center' },
49
+ React.createElement(PHXButton, { onClick: onHide, secondary: true }, "B\u1ECF qua"),
50
+ isLastSlide ? (hasTours ? (React.createElement(PHXButton, { onClick: onStartTour, primary: true }, "B\u1EAFt \u0111\u1EA7u Tour")) : (React.createElement(PHXButton, { onClick: onHide, primary: true }, "Ho\u00E0n t\u1EA5t"))) : (React.createElement(PHXButton, { onClick: goToNext, primary: true }, "Ti\u1EBFp theo"))))));
51
+ return (React.createElement(PHXModal, { customFooter: customFooterComponent, inCard: false, onHide: onHide, show: show, size: 'large-plus', title: 'H\u01B0\u1EDBng d\u1EABn s\u1EED d\u1EE5ng' },
52
+ React.createElement(PHXSlider, { ref: sliderRef, enableNavigate: false, gap: 0, onIndexChange: setCurrentIndex, perView: 1 }, slides.map((slideItem) => (React.createElement("img", { key: slideItem.id, alt: slideItem.title, src: slideItem.image }))))));
53
+ };
54
+ //# sourceMappingURL=modal-slides.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modal-slides.js","sourceRoot":"","sources":["../../../../../src/components/Onboarding/modal-slides/modal-slides.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import React from 'react';
2
+ import { IPHXOnboardingFlow } from './contexts/onboarding-context';
3
+ export declare const slidesOnlyFlow: IPHXOnboardingFlow;
4
+ export declare const tourOnlyFlow: IPHXOnboardingFlow;
5
+ export declare const slidesAndTourFlow: IPHXOnboardingFlow;
6
+ /**
7
+ * Demo cách sử dụng Onboarding
8
+ */
9
+ export default function OnboardingDemo(): React.JSX.Element;