@ramses1er/cbk-toolkit 2.4.0 → 2.6.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.
- package/dist/packages/ui/src/illustrations/topic-illustration.d.ts +9 -0
- package/dist/packages/ui/src/illustrations/topic-illustration.d.ts.map +1 -1
- package/dist/packages/ui/src/illustrations/topic-illustration.js +3 -65
- package/dist/packages/ui/src/illustrations/topic-illustration.js.map +1 -1
- package/dist/packages/ui/src/index.d.ts +12 -0
- package/dist/packages/ui/src/index.d.ts.map +1 -1
- package/dist/packages/ui/src/index.js +9 -0
- package/dist/packages/ui/src/index.js.map +1 -1
- package/dist/packages/ui/src/pages/about.d.ts +37 -0
- package/dist/packages/ui/src/pages/about.d.ts.map +1 -0
- package/dist/packages/ui/src/pages/about.js +10 -0
- package/dist/packages/ui/src/pages/about.js.map +1 -0
- package/dist/packages/ui/src/pwa/OfflineBanner.d.ts +14 -0
- package/dist/packages/ui/src/pwa/OfflineBanner.d.ts.map +1 -0
- package/dist/packages/ui/src/pwa/OfflineBanner.js +23 -0
- package/dist/packages/ui/src/pwa/OfflineBanner.js.map +1 -0
- package/dist/packages/ui/src/pwa/useOnline.d.ts +10 -0
- package/dist/packages/ui/src/pwa/useOnline.d.ts.map +1 -0
- package/dist/packages/ui/src/pwa/useOnline.js +29 -0
- package/dist/packages/ui/src/pwa/useOnline.js.map +1 -0
- package/dist/packages/ui/src/pwa/warmCache.d.ts +7 -0
- package/dist/packages/ui/src/pwa/warmCache.d.ts.map +1 -0
- package/dist/packages/ui/src/pwa/warmCache.js +20 -0
- package/dist/packages/ui/src/pwa/warmCache.js.map +1 -0
- package/dist/packages/ui/src/search/input-search.d.ts +6 -0
- package/dist/packages/ui/src/search/input-search.d.ts.map +1 -1
- package/dist/packages/ui/src/search/input-search.js +6 -43
- package/dist/packages/ui/src/search/input-search.js.map +1 -1
- package/dist/packages/ui/src/search/select-search.d.ts +13 -0
- package/dist/packages/ui/src/search/select-search.d.ts.map +1 -1
- package/dist/packages/ui/src/search/select-search.js +36 -96
- package/dist/packages/ui/src/search/select-search.js.map +1 -1
- package/dist/packages/utils/src/fetcher.d.ts.map +1 -1
- package/dist/packages/utils/src/fetcher.js +10 -0
- package/dist/packages/utils/src/fetcher.js.map +1 -1
- package/dist/packages/utils/src/formatCurrency.d.ts +24 -0
- package/dist/packages/utils/src/formatCurrency.d.ts.map +1 -1
- package/dist/packages/utils/src/formatCurrency.js +68 -1
- package/dist/packages/utils/src/formatCurrency.js.map +1 -1
- package/dist/packages/utils/src/formatDate.d.ts +26 -0
- package/dist/packages/utils/src/formatDate.d.ts.map +1 -1
- package/dist/packages/utils/src/formatDate.js +65 -1
- package/dist/packages/utils/src/formatDate.js.map +1 -1
- package/dist/packages/utils/src/index.d.ts +4 -0
- package/dist/packages/utils/src/index.d.ts.map +1 -1
- package/dist/packages/utils/src/index.js +2 -0
- package/dist/packages/utils/src/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1,10 @@
|
|
|
1
|
+
import type { LucideIcon } from "lucide-react";
|
|
2
|
+
export interface TopicIllustrationProps {
|
|
3
|
+
icon: LucideIcon;
|
|
4
|
+
title: string;
|
|
5
|
+
description: string;
|
|
6
|
+
href: string;
|
|
7
|
+
className?: string;
|
|
8
|
+
}
|
|
9
|
+
export declare function TopicIllustration({ icon: Icon, title, description, href, className }: TopicIllustrationProps): import("react").JSX.Element;
|
|
1
10
|
//# sourceMappingURL=topic-illustration.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"topic-illustration.d.ts","sourceRoot":"","sources":["../../../../../packages/ui/src/illustrations/topic-illustration.tsx"],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"topic-illustration.d.ts","sourceRoot":"","sources":["../../../../../packages/ui/src/illustrations/topic-illustration.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE/C,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,UAAU,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,iBAAiB,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,sBAAsB,+BA+B5G"}
|
|
@@ -1,69 +1,7 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/*
|
|
3
1
|
"use client";
|
|
4
|
-
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
5
3
|
import Link from "next/link";
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
interface TopicIllustrationProps {
|
|
9
|
-
icon: LucideIcon;
|
|
10
|
-
title: string;
|
|
11
|
-
description: string;
|
|
12
|
-
href: string;
|
|
4
|
+
export function TopicIllustration({ icon: Icon, title, description, href, className }) {
|
|
5
|
+
return (_jsxs(Link, { href: href, className: `group block relative w-64 bg-white rounded-2xl border border-gray-200 shadow-sm hover:shadow-xl hover:border-gray-300 transition-all duration-300 cursor-pointer overflow-hidden ${className || ""}`, children: [_jsxs("div", { className: "p-6 flex flex-col min-h-[200px]", children: [_jsx("div", { className: "flex-1" }), _jsx("div", { className: "opacity-0 group-hover:opacity-100 transition-opacity duration-300 absolute bottom-4 right-4", children: _jsx("div", { className: "w-8 h-8 rounded-full bg-gray-100 flex items-center justify-center", children: _jsx("svg", { className: "w-4 h-4 text-gray-700", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M9 5l7 7-7 7" }) }) }) }), _jsxs("div", { className: "mt-auto", children: [_jsx("div", { className: "w-14 h-14 rounded-2xl bg-gradient-to-br from-gray-100 to-gray-200 flex items-center justify-center mb-4 group-hover:from-gray-200 group-hover:to-gray-300 transition-colors", children: _jsx(Icon, { className: "w-7 h-7 text-gray-700", strokeWidth: 1.5 }) }), _jsx("h3", { className: "text-xl font-bold text-gray-900 mb-2", children: title }), _jsx("p", { className: "text-sm text-gray-500 group-hover:text-gray-600 transition-colors", children: description })] })] }), _jsx("div", { className: "absolute inset-0 rounded-2xl ring-1 ring-inset ring-gray-900/5 group-hover:ring-gray-300/50 transition-colors pointer-events-none" })] }));
|
|
13
6
|
}
|
|
14
|
-
|
|
15
|
-
export function TopicIllustration({
|
|
16
|
-
icon: Icon,
|
|
17
|
-
title,
|
|
18
|
-
description,
|
|
19
|
-
href,
|
|
20
|
-
}: TopicIllustrationProps) {
|
|
21
|
-
return (
|
|
22
|
-
<Link
|
|
23
|
-
href={href}
|
|
24
|
-
className="group block relative w-64 bg-white rounded-2xl border border-gray-200 shadow-sm hover:shadow-xl hover:border-gray-300 transition-all duration-300 cursor-pointer overflow-hidden"
|
|
25
|
-
>
|
|
26
|
-
<div className="p-6 flex flex-col min-h-[200px]">
|
|
27
|
-
<div className="flex-1"></div>
|
|
28
|
-
|
|
29
|
-
<div>
|
|
30
|
-
<div className="opacity-0 group-hover:opacity-100 transition-opacity duration-300 absolute bottom-4 right-4">
|
|
31
|
-
<div className="w-8 h-8 rounded-full bg-gray-100 flex items-center justify-center">
|
|
32
|
-
<svg
|
|
33
|
-
className="w-4 h-4 text-gray-700"
|
|
34
|
-
fill="none"
|
|
35
|
-
stroke="currentColor"
|
|
36
|
-
viewBox="0 0 24 24"
|
|
37
|
-
>
|
|
38
|
-
<path
|
|
39
|
-
strokeLinecap="round"
|
|
40
|
-
strokeLinejoin="round"
|
|
41
|
-
strokeWidth={2}
|
|
42
|
-
d="M9 5l7 7-7 7"
|
|
43
|
-
/>
|
|
44
|
-
</svg>
|
|
45
|
-
</div>
|
|
46
|
-
</div>
|
|
47
|
-
</div>
|
|
48
|
-
|
|
49
|
-
<div className="mt-auto">
|
|
50
|
-
<div className="w-14 h-14 rounded-2xl bg-gradient-to-br from-gray-100 to-gray-200 flex items-center justify-center mb-4 group-hover:from-gray-200 group-hover:to-gray-300 transition-colors">
|
|
51
|
-
<Icon className="w-7 h-7 text-gray-700" strokeWidth={1.5} />
|
|
52
|
-
</div>
|
|
53
|
-
|
|
54
|
-
<h3 className="text-xl font-bold text-gray-900 mb-2 group-hover:text-gray-900 transition-colors">
|
|
55
|
-
{title}
|
|
56
|
-
</h3>
|
|
57
|
-
|
|
58
|
-
<p className="text-sm text-gray-500 group-hover:text-gray-600 transition-colors">
|
|
59
|
-
{description}
|
|
60
|
-
</p>
|
|
61
|
-
</div>
|
|
62
|
-
</div>
|
|
63
|
-
|
|
64
|
-
<div className="absolute inset-0 rounded-2xl ring-1 ring-inset ring-gray-900/5 group-hover:ring-gray-300/50 transition-colors" />
|
|
65
|
-
</Link>
|
|
66
|
-
);
|
|
67
|
-
}
|
|
68
|
-
*/
|
|
69
7
|
//# sourceMappingURL=topic-illustration.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"topic-illustration.js","sourceRoot":"","sources":["../../../../../packages/ui/src/illustrations/topic-illustration.tsx"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"topic-illustration.js","sourceRoot":"","sources":["../../../../../packages/ui/src/illustrations/topic-illustration.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,IAAI,MAAM,WAAW,CAAC;AAW7B,MAAM,UAAU,iBAAiB,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAA0B;IAC3G,OAAO,CACL,MAAC,IAAI,IACH,IAAI,EAAE,IAAI,EACV,SAAS,EAAE,oLAAoL,SAAS,IAAI,EAAE,EAAE,aAEhN,eAAK,SAAS,EAAC,iCAAiC,aAC9C,cAAK,SAAS,EAAC,QAAQ,GAAG,EAE1B,cAAK,SAAS,EAAC,6FAA6F,YAC1G,cAAK,SAAS,EAAC,mEAAmE,YAChF,cAAK,SAAS,EAAC,uBAAuB,EAAC,IAAI,EAAC,MAAM,EAAC,MAAM,EAAC,cAAc,EAAC,OAAO,EAAC,WAAW,YAC1F,eAAM,aAAa,EAAC,OAAO,EAAC,cAAc,EAAC,OAAO,EAAC,WAAW,EAAE,CAAC,EAAE,CAAC,EAAC,cAAc,GAAG,GAClF,GACF,GACF,EAEN,eAAK,SAAS,EAAC,SAAS,aACtB,cAAK,SAAS,EAAC,6KAA6K,YAC1L,KAAC,IAAI,IAAC,SAAS,EAAC,uBAAuB,EAAC,WAAW,EAAE,GAAG,GAAI,GACxD,EAEN,aAAI,SAAS,EAAC,sCAAsC,YAAE,KAAK,GAAM,EAEjE,YAAG,SAAS,EAAC,mEAAmE,YAAE,WAAW,GAAK,IAC9F,IACF,EAEN,cAAK,SAAS,EAAC,mIAAmI,GAAG,IAChJ,CACR,CAAC;AACJ,CAAC"}
|
|
@@ -21,10 +21,22 @@ export { Loading } from "./loaders/loading";
|
|
|
21
21
|
export { LoaderSubmit } from "./loaders/loader-submit";
|
|
22
22
|
export { SessionExpired } from "./pages/session-expired";
|
|
23
23
|
export { AccessDenied } from "./pages/access-denied";
|
|
24
|
+
export { AboutPage } from "./pages/about";
|
|
25
|
+
export type { AboutPageProps, AboutFeature } from "./pages/about";
|
|
24
26
|
export { InstallPrompt } from "./pwa/InstallPrompt";
|
|
25
27
|
export type { InstallPromptProps } from "./pwa/InstallPrompt";
|
|
26
28
|
export { SwRegistration } from "./pwa/SwRegistration";
|
|
27
29
|
export type { SwRegistrationProps } from "./pwa/SwRegistration";
|
|
30
|
+
export { useOnline, isOnline } from "./pwa/useOnline";
|
|
31
|
+
export { OfflineBanner, OfflineToast } from "./pwa/OfflineBanner";
|
|
32
|
+
export type { OfflineBannerProps } from "./pwa/OfflineBanner";
|
|
33
|
+
export { warmApiCache } from "./pwa/warmCache";
|
|
34
|
+
export { InputSearch } from "./search/input-search";
|
|
35
|
+
export type { InputSearchProps } from "./search/input-search";
|
|
36
|
+
export { SelectSearch } from "./search/select-search";
|
|
37
|
+
export type { SelectSearchOption, SelectSearchProps } from "./search/select-search";
|
|
38
|
+
export { TopicIllustration } from "./illustrations/topic-illustration";
|
|
39
|
+
export type { TopicIllustrationProps } from "./illustrations/topic-illustration";
|
|
28
40
|
export { routeGuard, RouteGuardProvider, createRouteGuardConfig, } from "./route-guard/route-guard";
|
|
29
41
|
export type { UseCurrentUser, RouteGuardConfig } from "./route-guard/route-guard";
|
|
30
42
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../packages/ui/src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,YAAY,EACV,OAAO,EACP,YAAY,EACZ,mBAAmB,EACnB,UAAU,GACX,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAGzD,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,YAAY,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,YAAY,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAGxD,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAGvC,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,YAAY,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAGlE,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAGzD,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAGpC,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAGzD,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAGtC,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAGtC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAGhD,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAG5C,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAGjD,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAGvD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../packages/ui/src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,YAAY,EACV,OAAO,EACP,YAAY,EACZ,mBAAmB,EACnB,UAAU,GACX,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAGzD,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,YAAY,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,YAAY,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAGxD,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAGvC,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,YAAY,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAGlE,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAGzD,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAGpC,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAGzD,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAGtC,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAGtC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAGhD,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAG5C,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAGjD,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAGvD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAGlE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,YAAY,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,YAAY,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAClE,YAAY,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAG/C,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,YAAY,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,YAAY,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAGpF,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AACvE,YAAY,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAC;AAGjF,OAAO,EACL,UAAU,EACV,kBAAkB,EAClB,sBAAsB,GACvB,MAAM,2BAA2B,CAAC;AACnC,YAAY,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC"}
|
|
@@ -31,9 +31,18 @@ export { LoaderSubmit } from "./loaders/loader-submit";
|
|
|
31
31
|
// exports of pages
|
|
32
32
|
export { SessionExpired } from "./pages/session-expired";
|
|
33
33
|
export { AccessDenied } from "./pages/access-denied";
|
|
34
|
+
export { AboutPage } from "./pages/about";
|
|
34
35
|
// exports of pwa
|
|
35
36
|
export { InstallPrompt } from "./pwa/InstallPrompt";
|
|
36
37
|
export { SwRegistration } from "./pwa/SwRegistration";
|
|
38
|
+
export { useOnline, isOnline } from "./pwa/useOnline";
|
|
39
|
+
export { OfflineBanner, OfflineToast } from "./pwa/OfflineBanner";
|
|
40
|
+
export { warmApiCache } from "./pwa/warmCache";
|
|
41
|
+
// exports of search
|
|
42
|
+
export { InputSearch } from "./search/input-search";
|
|
43
|
+
export { SelectSearch } from "./search/select-search";
|
|
44
|
+
// exports of illustrations
|
|
45
|
+
export { TopicIllustration } from "./illustrations/topic-illustration";
|
|
37
46
|
// exports of route guard
|
|
38
47
|
export { routeGuard, RouteGuardProvider, createRouteGuardConfig, } from "./route-guard/route-guard";
|
|
39
48
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../packages/ui/src/index.ts"],"names":[],"mappings":"AAAA,qBAAqB;AACrB,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAO7C,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAEzD,8BAA8B;AAC9B,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAEtC,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAGnD,mBAAmB;AACnB,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAEvC,sBAAsB;AACtB,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAGxD,qBAAqB;AACrB,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAEzD,mBAAmB;AACnB,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEpC,6BAA6B;AAC7B,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAEzD,mBAAmB;AACnB,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAEtC,mBAAmB;AACnB,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAEtC,oBAAoB;AACpB,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAEhD,sBAAsB;AACtB,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,yBAAyB;AACzB,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD,qBAAqB;AACrB,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEvD,mBAAmB;AACnB,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../packages/ui/src/index.ts"],"names":[],"mappings":"AAAA,qBAAqB;AACrB,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAO7C,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAEzD,8BAA8B;AAC9B,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAEtC,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAGnD,mBAAmB;AACnB,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAEvC,sBAAsB;AACtB,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAGxD,qBAAqB;AACrB,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAEzD,mBAAmB;AACnB,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEpC,6BAA6B;AAC7B,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAEzD,mBAAmB;AACnB,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAEtC,mBAAmB;AACnB,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAEtC,oBAAoB;AACpB,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAEhD,sBAAsB;AACtB,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,yBAAyB;AACzB,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD,qBAAqB;AACrB,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEvD,mBAAmB;AACnB,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAG1C,iBAAiB;AACjB,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAElE,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,oBAAoB;AACpB,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEpD,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAGtD,2BAA2B;AAC3B,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AAGvE,yBAAyB;AACzB,OAAO,EACL,UAAU,EACV,kBAAkB,EAClB,sBAAsB,GACvB,MAAM,2BAA2B,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { LucideIcon } from "lucide-react";
|
|
2
|
+
export type AboutFeature = {
|
|
3
|
+
icon: LucideIcon;
|
|
4
|
+
title: string;
|
|
5
|
+
description: string;
|
|
6
|
+
};
|
|
7
|
+
export interface AboutPageProps {
|
|
8
|
+
/** Nom de l'application affiché en majuscules (ex: "LUMENFIDEI") */
|
|
9
|
+
appName: string;
|
|
10
|
+
/** Slogan sous le nom (ex: "Application de gestion communautaire") */
|
|
11
|
+
appTagline?: string;
|
|
12
|
+
/** Chemin du logo (ex: "/img/logo.png") */
|
|
13
|
+
logo: string;
|
|
14
|
+
/** Version affichée dans le badge (ex: "1.0.0") */
|
|
15
|
+
version?: string;
|
|
16
|
+
/** Titre du header (défaut: "À propos") */
|
|
17
|
+
headerTitle?: string;
|
|
18
|
+
/** Description du header (défaut: "Informations sur l'application {appName}") */
|
|
19
|
+
headerDescription?: string;
|
|
20
|
+
/** Nom du concepteur */
|
|
21
|
+
authorName?: string;
|
|
22
|
+
/** Lien WhatsApp complet (ex: "https://wa.me/23672232699") */
|
|
23
|
+
whatsappHref?: string;
|
|
24
|
+
/** Label du bouton WhatsApp (ex: "WhatsApp : +236 72 23 26 99") */
|
|
25
|
+
whatsappLabel?: string;
|
|
26
|
+
/** Lien email (ex: "mailto:cbk.exauce@gmail.com") */
|
|
27
|
+
emailHref?: string;
|
|
28
|
+
/** Label du bouton email (ex: "Email : cbk.exauce@gmail.com") */
|
|
29
|
+
emailLabel?: string;
|
|
30
|
+
/** Grille des fonctionnalités */
|
|
31
|
+
features: AboutFeature[];
|
|
32
|
+
/** Nom pour le footer copyright (défaut: appName) */
|
|
33
|
+
footerAppName?: string;
|
|
34
|
+
className?: string;
|
|
35
|
+
}
|
|
36
|
+
export declare function AboutPage({ appName, appTagline, logo, version, headerTitle, headerDescription, authorName, whatsappHref, whatsappLabel, emailHref, emailLabel, features, footerAppName, className, }: AboutPageProps): import("react").JSX.Element;
|
|
37
|
+
//# sourceMappingURL=about.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"about.d.ts","sourceRoot":"","sources":["../../../../../packages/ui/src/pages/about.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE/C,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,UAAU,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,WAAW,cAAc;IAC7B,oEAAoE;IACpE,OAAO,EAAE,MAAM,CAAC;IAChB,sEAAsE;IACtE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,2CAA2C;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,mDAAmD;IACnD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2CAA2C;IAC3C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iFAAiF;IACjF,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,wBAAwB;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,8DAA8D;IAC9D,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,mEAAmE;IACnE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,qDAAqD;IACrD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iEAAiE;IACjE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iCAAiC;IACjC,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,qDAAqD;IACrD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,SAAS,CAAC,EACxB,OAAO,EACP,UAAU,EACV,IAAI,EACJ,OAAO,EACP,WAAwB,EACxB,iBAAiB,EACjB,UAAU,EACV,YAAY,EACZ,aAAa,EACb,SAAS,EACT,UAAU,EACV,QAAQ,EACR,aAAa,EACb,SAAS,GACV,EAAE,cAAc,+BAwEhB"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { HeaderContent } from "../headers/header-content";
|
|
4
|
+
import Image from "next/image";
|
|
5
|
+
export function AboutPage({ appName, appTagline, logo, version, headerTitle = "À propos", headerDescription, authorName, whatsappHref, whatsappLabel, emailHref, emailLabel, features, footerAppName, className, }) {
|
|
6
|
+
const displayDescription = headerDescription ?? `Informations sur l'application ${appName}`;
|
|
7
|
+
const displayFooterName = footerAppName ?? appName;
|
|
8
|
+
return (_jsxs("div", { className: className, children: [_jsx(HeaderContent, { title: headerTitle, description: displayDescription }), _jsxs("div", { className: "space-y-6", children: [_jsxs("div", { className: "bg-white rounded-xl shadow p-8 flex flex-col items-center gap-4 text-center", children: [_jsx(Image, { src: logo, alt: `Logo ${appName}`, width: 96, height: 96, className: "rounded-full object-cover" }), _jsx("h1", { className: "text-3xl font-bold", children: appName.toUpperCase() }), appTagline && _jsx("p", { className: "text-gray-500", children: appTagline }), version && (_jsxs("span", { className: "inline-flex items-center rounded-full bg-gray-100 px-4 py-1.5 text-sm font-medium text-gray-700", children: ["Version ", version] }))] }), (authorName || whatsappHref || emailHref) && (_jsxs("div", { className: "bg-white rounded-xl shadow p-6", children: [_jsx("h2", { className: "font-semibold mb-4", children: "Concepteur" }), authorName && _jsx("p", { className: "text-gray-600 mb-4", children: authorName }), _jsxs("div", { className: "flex flex-col sm:flex-row gap-3", children: [whatsappHref && (_jsx("a", { href: whatsappHref, target: "_blank", rel: "noopener noreferrer", className: "inline-flex items-center rounded-full bg-gray-100 px-4 py-1.5 text-sm font-medium text-gray-700 hover:bg-gray-200 transition-colors", children: whatsappLabel ?? whatsappHref })), emailHref && (_jsx("a", { href: emailHref, className: "inline-flex items-center rounded-full bg-gray-100 px-4 py-1.5 text-sm font-medium text-gray-700 hover:bg-gray-200 transition-colors", children: emailLabel ?? emailHref }))] })] })), features.length > 0 && (_jsxs("div", { className: "bg-white rounded-xl shadow p-6", children: [_jsx("h2", { className: "font-semibold mb-4", children: "Fonctionnalit\u00E9s" }), _jsx("div", { className: "grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4", children: features.map(({ icon: Icon, title, description }) => (_jsxs("div", { className: "rounded-lg border border-gray-100 p-4 flex items-start gap-3", children: [_jsx("div", { className: "p-2.5 rounded-lg bg-gray-100 shrink-0", children: _jsx(Icon, { className: "w-5 h-5 text-gray-600" }) }), _jsxs("div", { children: [_jsx("p", { className: "font-medium", children: title }), _jsx("p", { className: "text-sm text-gray-500", children: description })] })] }, title))) })] })), _jsx("div", { className: "bg-white rounded-xl shadow p-6 text-center", children: _jsxs("p", { className: "text-sm text-gray-500", children: ["\u00A9 ", new Date().getFullYear(), " ", displayFooterName, " \u2014 Tous droits r\u00E9serv\u00E9s"] }) })] })] }));
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=about.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"about.js","sourceRoot":"","sources":["../../../../../packages/ui/src/pages/about.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,KAAK,MAAM,YAAY,CAAC;AAuC/B,MAAM,UAAU,SAAS,CAAC,EACxB,OAAO,EACP,UAAU,EACV,IAAI,EACJ,OAAO,EACP,WAAW,GAAG,UAAU,EACxB,iBAAiB,EACjB,UAAU,EACV,YAAY,EACZ,aAAa,EACb,SAAS,EACT,UAAU,EACV,QAAQ,EACR,aAAa,EACb,SAAS,GACM;IACf,MAAM,kBAAkB,GAAG,iBAAiB,IAAI,kCAAkC,OAAO,EAAE,CAAC;IAC5F,MAAM,iBAAiB,GAAG,aAAa,IAAI,OAAO,CAAC;IAEnD,OAAO,CACL,eAAK,SAAS,EAAE,SAAS,aACvB,KAAC,aAAa,IAAC,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,kBAAkB,GAAI,EAEtE,eAAK,SAAS,EAAC,WAAW,aACxB,eAAK,SAAS,EAAC,6EAA6E,aAC1F,KAAC,KAAK,IAAC,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,OAAO,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAC,2BAA2B,GAAG,EACzG,aAAI,SAAS,EAAC,oBAAoB,YAAE,OAAO,CAAC,WAAW,EAAE,GAAM,EAC9D,UAAU,IAAI,YAAG,SAAS,EAAC,eAAe,YAAE,UAAU,GAAK,EAC3D,OAAO,IAAI,CACV,gBAAM,SAAS,EAAC,iGAAiG,yBACtG,OAAO,IACX,CACR,IACG,EAEL,CAAC,UAAU,IAAI,YAAY,IAAI,SAAS,CAAC,IAAI,CAC5C,eAAK,SAAS,EAAC,gCAAgC,aAC7C,aAAI,SAAS,EAAC,oBAAoB,2BAAgB,EACjD,UAAU,IAAI,YAAG,SAAS,EAAC,oBAAoB,YAAE,UAAU,GAAK,EACjE,eAAK,SAAS,EAAC,iCAAiC,aAC7C,YAAY,IAAI,CACf,YACE,IAAI,EAAE,YAAY,EAClB,MAAM,EAAC,QAAQ,EACf,GAAG,EAAC,qBAAqB,EACzB,SAAS,EAAC,qIAAqI,YAE9I,aAAa,IAAI,YAAY,GAC5B,CACL,EACA,SAAS,IAAI,CACZ,YACE,IAAI,EAAE,SAAS,EACf,SAAS,EAAC,qIAAqI,YAE9I,UAAU,IAAI,SAAS,GACtB,CACL,IACG,IACF,CACP,EAEA,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,CACtB,eAAK,SAAS,EAAC,gCAAgC,aAC7C,aAAI,SAAS,EAAC,oBAAoB,qCAAqB,EACvD,cAAK,SAAS,EAAC,sDAAsD,YAClE,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,CACpD,eAAiB,SAAS,EAAC,8DAA8D,aACvF,cAAK,SAAS,EAAC,uCAAuC,YACpD,KAAC,IAAI,IAAC,SAAS,EAAC,uBAAuB,GAAG,GACtC,EACN,0BACE,YAAG,SAAS,EAAC,aAAa,YAAE,KAAK,GAAK,EACtC,YAAG,SAAS,EAAC,uBAAuB,YAAE,WAAW,GAAK,IAClD,KAPE,KAAK,CAQT,CACP,CAAC,GACE,IACF,CACP,EAED,cAAK,SAAS,EAAC,4CAA4C,YACzD,aAAG,SAAS,EAAC,uBAAuB,wBAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,OAAG,iBAAiB,8CAA4B,GAC5G,IACF,IACF,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export type OfflineBannerProps = {
|
|
2
|
+
message?: string;
|
|
3
|
+
className?: string;
|
|
4
|
+
};
|
|
5
|
+
/**
|
|
6
|
+
* Bannière affichée uniquement hors-ligne.
|
|
7
|
+
* À placer près du layout ou d'un formulaire pour prévenir les mutations.
|
|
8
|
+
*/
|
|
9
|
+
export declare function OfflineBanner({ message, className, }: OfflineBannerProps): import("react").JSX.Element | null;
|
|
10
|
+
/**
|
|
11
|
+
* Variante flottante fixe en bas d'écran (comme InstallPrompt).
|
|
12
|
+
*/
|
|
13
|
+
export declare function OfflineToast({ message, className, }: OfflineBannerProps): import("react").JSX.Element | null;
|
|
14
|
+
//# sourceMappingURL=OfflineBanner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OfflineBanner.d.ts","sourceRoot":"","sources":["../../../../../packages/ui/src/pwa/OfflineBanner.tsx"],"names":[],"mappings":"AAIA,MAAM,MAAM,kBAAkB,GAAG;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF;;;GAGG;AACH,wBAAgB,aAAa,CAAC,EAC5B,OAA0I,EAC1I,SAAS,GACV,EAAE,kBAAkB,sCAiBpB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,EAC3B,OAAgE,EAChE,SAAS,GACV,EAAE,kBAAkB,sCAUpB"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useOnline } from "./useOnline";
|
|
4
|
+
/**
|
|
5
|
+
* Bannière affichée uniquement hors-ligne.
|
|
6
|
+
* À placer près du layout ou d'un formulaire pour prévenir les mutations.
|
|
7
|
+
*/
|
|
8
|
+
export function OfflineBanner({ message = "Vous êtes hors ligne — les actions d'écriture sont indisponibles. Vous pouvez continuer à consulter les données déjà chargées.", className, }) {
|
|
9
|
+
const online = useOnline();
|
|
10
|
+
if (online)
|
|
11
|
+
return null;
|
|
12
|
+
return (_jsx("div", { role: "status", "aria-live": "polite", className: `w-full rounded-lg border border-amber-200 bg-amber-50 px-4 py-3 text-sm text-amber-800 ${className || ""}`, children: _jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "mt-0.5 shrink-0", children: "\u26A0\uFE0F" }), _jsx("p", { children: message })] }) }));
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Variante flottante fixe en bas d'écran (comme InstallPrompt).
|
|
16
|
+
*/
|
|
17
|
+
export function OfflineToast({ message = "Hors ligne — vous naviguez sur les données en cache.", className, }) {
|
|
18
|
+
const online = useOnline();
|
|
19
|
+
if (online)
|
|
20
|
+
return null;
|
|
21
|
+
return (_jsx("div", { className: `fixed bottom-4 left-1/2 z-40 -translate-x-1/2 ${className || ""}`, children: _jsx("div", { className: "rounded-full bg-gray-900 px-4 py-2 text-sm font-medium text-white shadow-lg", children: message }) }));
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=OfflineBanner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OfflineBanner.js","sourceRoot":"","sources":["../../../../../packages/ui/src/pwa/OfflineBanner.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAOxC;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,EAC5B,OAAO,GAAG,gIAAgI,EAC1I,SAAS,GACU;IACnB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAE3B,IAAI,MAAM;QAAE,OAAO,IAAI,CAAC;IAExB,OAAO,CACL,cACE,IAAI,EAAC,QAAQ,eACH,QAAQ,EAClB,SAAS,EAAE,0FAA0F,SAAS,IAAI,EAAE,EAAE,YAEtH,eAAK,SAAS,EAAC,wBAAwB,aACrC,eAAM,SAAS,EAAC,iBAAiB,6BAAU,EAC3C,sBAAI,OAAO,GAAK,IACZ,GACF,CACP,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,EAC3B,OAAO,GAAG,sDAAsD,EAChE,SAAS,GACU;IACnB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,IAAI,MAAM;QAAE,OAAO,IAAI,CAAC;IACxB,OAAO,CACL,cAAK,SAAS,EAAE,iDAAiD,SAAS,IAAI,EAAE,EAAE,YAChF,cAAK,SAAS,EAAC,6EAA6E,YACzF,OAAO,GACJ,GACF,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hook qui reflète l'état réseau (true = en ligne).
|
|
3
|
+
* Utilise useSyncExternalStore pour éviter les hydrations mismatch.
|
|
4
|
+
*/
|
|
5
|
+
export declare function useOnline(): boolean;
|
|
6
|
+
/**
|
|
7
|
+
* Helper non-hook pour usage hors React (ex: dans fetcher).
|
|
8
|
+
*/
|
|
9
|
+
export declare function isOnline(): boolean;
|
|
10
|
+
//# sourceMappingURL=useOnline.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useOnline.d.ts","sourceRoot":"","sources":["../../../../../packages/ui/src/pwa/useOnline.ts"],"names":[],"mappings":"AAiBA;;;GAGG;AACH,wBAAgB,SAAS,IAAI,OAAO,CAEnC;AAED;;GAEG;AACH,wBAAgB,QAAQ,IAAI,OAAO,CAGlC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useSyncExternalStore } from "react";
|
|
3
|
+
function getSnapshot() {
|
|
4
|
+
return typeof navigator !== "undefined" ? navigator.onLine : true;
|
|
5
|
+
}
|
|
6
|
+
function subscribe(callback) {
|
|
7
|
+
window.addEventListener("online", callback);
|
|
8
|
+
window.addEventListener("offline", callback);
|
|
9
|
+
return () => {
|
|
10
|
+
window.removeEventListener("online", callback);
|
|
11
|
+
window.removeEventListener("offline", callback);
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Hook qui reflète l'état réseau (true = en ligne).
|
|
16
|
+
* Utilise useSyncExternalStore pour éviter les hydrations mismatch.
|
|
17
|
+
*/
|
|
18
|
+
export function useOnline() {
|
|
19
|
+
return useSyncExternalStore(subscribe, getSnapshot, () => true);
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Helper non-hook pour usage hors React (ex: dans fetcher).
|
|
23
|
+
*/
|
|
24
|
+
export function isOnline() {
|
|
25
|
+
if (typeof navigator === "undefined")
|
|
26
|
+
return true;
|
|
27
|
+
return navigator.onLine;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=useOnline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useOnline.js","sourceRoot":"","sources":["../../../../../packages/ui/src/pwa/useOnline.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAC;AAE7C,SAAS,WAAW;IAClB,OAAO,OAAO,SAAS,KAAK,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;AACpE,CAAC;AAED,SAAS,SAAS,CAAC,QAAoB;IACrC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC5C,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAC7C,OAAO,GAAG,EAAE;QACV,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC/C,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAClD,CAAC,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,SAAS;IACvB,OAAO,oBAAoB,CAAC,SAAS,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;AAClE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,QAAQ;IACtB,IAAI,OAAO,SAAS,KAAK,WAAW;QAAE,OAAO,IAAI,CAAC;IAClD,OAAO,SAAS,CAAC,MAAM,CAAC;AAC1B,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Warm the SW cache for given GET URLs (e.g. /api/members).
|
|
3
|
+
* Call after login or when online to ensure offline availability without browsing.
|
|
4
|
+
* Requires the SW from playground/public/sw.js (handles WARM_API_CACHE message).
|
|
5
|
+
*/
|
|
6
|
+
export declare function warmApiCache(urls: string[]): void;
|
|
7
|
+
//# sourceMappingURL=warmCache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"warmCache.d.ts","sourceRoot":"","sources":["../../../../../packages/ui/src/pwa/warmCache.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,QAW1C"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
/**
|
|
3
|
+
* Warm the SW cache for given GET URLs (e.g. /api/members).
|
|
4
|
+
* Call after login or when online to ensure offline availability without browsing.
|
|
5
|
+
* Requires the SW from playground/public/sw.js (handles WARM_API_CACHE message).
|
|
6
|
+
*/
|
|
7
|
+
export function warmApiCache(urls) {
|
|
8
|
+
if (typeof navigator === "undefined" || !("serviceWorker" in navigator))
|
|
9
|
+
return;
|
|
10
|
+
const controller = navigator.serviceWorker.controller;
|
|
11
|
+
if (controller) {
|
|
12
|
+
controller.postMessage({ type: "WARM_API_CACHE", urls });
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
// Fallback: fetch and let fetch handler cache it (network-first)
|
|
16
|
+
urls.forEach((url) => {
|
|
17
|
+
fetch(url, { credentials: "include" }).catch(() => { });
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=warmCache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"warmCache.js","sourceRoot":"","sources":["../../../../../packages/ui/src/pwa/warmCache.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,IAAc;IACzC,IAAI,OAAO,SAAS,KAAK,WAAW,IAAI,CAAC,CAAC,eAAe,IAAI,SAAS,CAAC;QAAE,OAAO;IAChF,MAAM,UAAU,GAAG,SAAS,CAAC,aAAa,CAAC,UAAU,CAAC;IACtD,IAAI,UAAU,EAAE,CAAC;QACf,UAAU,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC,CAAC;QACzD,OAAO;IACT,CAAC;IACD,iEAAiE;IACjE,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;QACnB,KAAK,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -1 +1,7 @@
|
|
|
1
|
+
import { InputHTMLAttributes, Dispatch, SetStateAction } from "react";
|
|
2
|
+
export type InputSearchProps = Omit<InputHTMLAttributes<HTMLInputElement>, "onChange" | "value"> & {
|
|
3
|
+
value: string;
|
|
4
|
+
onChange: Dispatch<SetStateAction<string>> | ((value: string) => void);
|
|
5
|
+
};
|
|
6
|
+
export declare function InputSearch({ value, onChange, className, placeholder, ...props }: InputSearchProps): import("react").JSX.Element;
|
|
1
7
|
//# sourceMappingURL=input-search.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"input-search.d.ts","sourceRoot":"","sources":["../../../../../packages/ui/src/search/input-search.tsx"],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"input-search.d.ts","sourceRoot":"","sources":["../../../../../packages/ui/src/search/input-search.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAGtE,MAAM,MAAM,gBAAgB,GAAG,IAAI,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,GAAG;IACjG,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC,CAAC;CACxE,CAAC;AAEF,wBAAgB,WAAW,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,WAA6B,EAAE,GAAG,KAAK,EAAE,EAAE,gBAAgB,+BA2BpH"}
|
|
@@ -1,47 +1,10 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/*
|
|
3
1
|
"use client";
|
|
4
|
-
|
|
5
|
-
import { InputHTMLAttributes, useState, Dispatch, SetStateAction } from "react";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
6
3
|
import { X } from "lucide-react";
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
};
|
|
12
|
-
|
|
13
|
-
export function InputSearch({ value, onChange, ...props }: InputSearchProps) {
|
|
14
|
-
const [isFocused, setIsFocused] = useState(false);
|
|
15
|
-
|
|
16
|
-
return (
|
|
17
|
-
<div className="relative">
|
|
18
|
-
<input
|
|
19
|
-
{...props}
|
|
20
|
-
type="text"
|
|
21
|
-
value={value}
|
|
22
|
-
onChange={(e) => {
|
|
23
|
-
const newValue = e.target.value;
|
|
24
|
-
if (typeof onChange === "function") {
|
|
25
|
-
(onChange as (value: string) => void)(newValue);
|
|
26
|
-
}
|
|
27
|
-
}}
|
|
28
|
-
onFocus={() => setIsFocused(true)}
|
|
29
|
-
onBlur={() => setIsFocused(false)}
|
|
30
|
-
className={`w-full px-4 py-2 pr-10 border rounded-lg text-sm text-gray-700 bg-white placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-gray-500 focus:border-transparent ${
|
|
31
|
-
props.className || ""
|
|
32
|
-
}`}
|
|
33
|
-
/>
|
|
34
|
-
{value && (
|
|
35
|
-
<button
|
|
36
|
-
type="button"
|
|
37
|
-
onClick={() => onChange("")}
|
|
38
|
-
className="absolute right-2 top-1/2 -translate-y-1/2 p-1 text-gray-400 hover:text-gray-600 transition-colors"
|
|
39
|
-
>
|
|
40
|
-
<X className="w-4 h-4" />
|
|
41
|
-
</button>
|
|
42
|
-
)}
|
|
43
|
-
</div>
|
|
44
|
-
);
|
|
4
|
+
export function InputSearch({ value, onChange, className, placeholder = "Rechercher...", ...props }) {
|
|
5
|
+
const handleChange = (newValue) => {
|
|
6
|
+
onChange(newValue);
|
|
7
|
+
};
|
|
8
|
+
return (_jsxs("div", { className: "relative", children: [_jsx("input", { ...props, type: "text", value: value, placeholder: placeholder, onChange: (e) => handleChange(e.target.value), className: `w-full px-4 py-2 pr-10 border border-gray-300 rounded-lg text-sm text-gray-700 bg-white placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-gray-500 focus:border-transparent transition ${className || ""}` }), value && (_jsx("button", { type: "button", onClick: () => handleChange(""), "aria-label": "Effacer la recherche", className: "absolute right-2 top-1/2 -translate-y-1/2 p-1 text-gray-400 hover:text-gray-600 transition-colors cursor-pointer", children: _jsx(X, { className: "w-4 h-4" }) }))] }));
|
|
45
9
|
}
|
|
46
|
-
*/
|
|
47
10
|
//# sourceMappingURL=input-search.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"input-search.js","sourceRoot":"","sources":["../../../../../packages/ui/src/search/input-search.tsx"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"input-search.js","sourceRoot":"","sources":["../../../../../packages/ui/src/search/input-search.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAGb,OAAO,EAAE,CAAC,EAAE,MAAM,cAAc,CAAC;AAOjC,MAAM,UAAU,WAAW,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,GAAG,eAAe,EAAE,GAAG,KAAK,EAAoB;IACnH,MAAM,YAAY,GAAG,CAAC,QAAgB,EAAE,EAAE;QACvC,QAAoC,CAAC,QAAQ,CAAC,CAAC;IAClD,CAAC,CAAC;IAEF,OAAO,CACL,eAAK,SAAS,EAAC,UAAU,aACvB,mBACM,KAAK,EACT,IAAI,EAAC,MAAM,EACX,KAAK,EAAE,KAAK,EACZ,WAAW,EAAE,WAAW,EACxB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAC7C,SAAS,EAAE,wMAAwM,SAAS,IAAI,EAAE,EAAE,GACpO,EACD,KAAK,IAAI,CACR,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,EAAE,CAAC,gBACpB,sBAAsB,EACjC,SAAS,EAAC,kHAAkH,YAE5H,KAAC,CAAC,IAAC,SAAS,EAAC,SAAS,GAAG,GAClB,CACV,IACG,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1,14 @@
|
|
|
1
|
+
export type SelectSearchOption = {
|
|
2
|
+
id: string;
|
|
3
|
+
name: string;
|
|
4
|
+
};
|
|
5
|
+
export type SelectSearchProps = {
|
|
6
|
+
label: string;
|
|
7
|
+
placeholder?: string;
|
|
8
|
+
options: SelectSearchOption[];
|
|
9
|
+
onSelect: (option: SelectSearchOption | null) => void;
|
|
10
|
+
selectedOption?: SelectSearchOption | null;
|
|
11
|
+
className?: string;
|
|
12
|
+
};
|
|
13
|
+
export declare function SelectSearch({ label, placeholder, options, onSelect, selectedOption, className, }: SelectSearchProps): import("react").JSX.Element;
|
|
1
14
|
//# sourceMappingURL=select-search.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"select-search.d.ts","sourceRoot":"","sources":["../../../../../packages/ui/src/search/select-search.tsx"],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"select-search.d.ts","sourceRoot":"","sources":["../../../../../packages/ui/src/search/select-search.tsx"],"names":[],"mappings":"AAKA,MAAM,MAAM,kBAAkB,GAAG;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,kBAAkB,EAAE,CAAC;IAC9B,QAAQ,EAAE,CAAC,MAAM,EAAE,kBAAkB,GAAG,IAAI,KAAK,IAAI,CAAC;IACtD,cAAc,CAAC,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,wBAAgB,YAAY,CAAC,EAC3B,KAAK,EACL,WAAW,EACX,OAAO,EACP,QAAQ,EACR,cAAc,EACd,SAAS,GACV,EAAE,iBAAiB,+BA6FnB"}
|
|
@@ -1,100 +1,40 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/*
|
|
3
1
|
"use client";
|
|
4
|
-
|
|
5
|
-
import { useState } from "react";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useState, useRef, useEffect } from "react";
|
|
6
4
|
import { X, ChevronDown } from "lucide-react";
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
};
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
return (
|
|
42
|
-
<div className="relative">
|
|
43
|
-
<button
|
|
44
|
-
type="button"
|
|
45
|
-
onClick={() => setIsOpen(!isOpen)}
|
|
46
|
-
className="flex items-center justify-between w-full px-4 py-2 border rounded-lg text-sm text-gray-700 bg-white hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-gray-500"
|
|
47
|
-
>
|
|
48
|
-
<span className="truncate">
|
|
49
|
-
{selectedOption
|
|
50
|
-
? selectedOption.name
|
|
51
|
-
: placeholder || `Filtrer par ${label}`}
|
|
52
|
-
</span>
|
|
53
|
-
<ChevronDown
|
|
54
|
-
className={`w-4 h-4 text-gray-400 transition-transform ${isOpen ? "rotate-180" : ""}`}
|
|
55
|
-
/>
|
|
56
|
-
</button>
|
|
57
|
-
|
|
58
|
-
{isOpen && (
|
|
59
|
-
<div className="absolute z-10 w-full mt-1 bg-white border rounded-lg shadow-lg max-h-60 overflow-y-auto">
|
|
60
|
-
<button
|
|
61
|
-
type="button"
|
|
62
|
-
onClick={() => {
|
|
63
|
-
onSelect(null);
|
|
64
|
-
setIsOpen(false);
|
|
65
|
-
}}
|
|
66
|
-
className="w-full px-4 py-2 text-left text-sm text-gray-500 hover:bg-gray-100 border-b"
|
|
67
|
-
>
|
|
68
|
-
Toutes les {label}s
|
|
69
|
-
</button>
|
|
70
|
-
{options.map((option) => (
|
|
71
|
-
<button
|
|
72
|
-
key={option.id}
|
|
73
|
-
type="button"
|
|
74
|
-
onClick={() => handleSelect(option)}
|
|
75
|
-
className={`w-full px-4 py-2 text-left text-sm hover:bg-gray-100 ${
|
|
76
|
-
selectedOption?.id === option.id
|
|
77
|
-
? "bg-gray-200 text-gray-900"
|
|
78
|
-
: ""
|
|
79
|
-
}`}
|
|
80
|
-
>
|
|
81
|
-
{option.name}
|
|
82
|
-
</button>
|
|
83
|
-
))}
|
|
84
|
-
</div>
|
|
85
|
-
)}
|
|
86
|
-
|
|
87
|
-
{selectedOption && (
|
|
88
|
-
<button
|
|
89
|
-
type="button"
|
|
90
|
-
onClick={handleClear}
|
|
91
|
-
className="absolute right-8 top-1/2 -translate-y-1/2 p-1 text-gray-400 hover:text-gray-600"
|
|
92
|
-
>
|
|
93
|
-
<X className="w-4 h-4" />
|
|
94
|
-
</button>
|
|
95
|
-
)}
|
|
96
|
-
</div>
|
|
97
|
-
);
|
|
5
|
+
export function SelectSearch({ label, placeholder, options, onSelect, selectedOption, className, }) {
|
|
6
|
+
const [isOpen, setIsOpen] = useState(false);
|
|
7
|
+
const containerRef = useRef(null);
|
|
8
|
+
const handleSelect = (option) => {
|
|
9
|
+
const isSameOption = selectedOption?.id === option.id;
|
|
10
|
+
onSelect(isSameOption ? null : option);
|
|
11
|
+
setIsOpen(false);
|
|
12
|
+
};
|
|
13
|
+
const handleClear = (e) => {
|
|
14
|
+
e.stopPropagation();
|
|
15
|
+
onSelect(null);
|
|
16
|
+
setIsOpen(false);
|
|
17
|
+
};
|
|
18
|
+
useEffect(() => {
|
|
19
|
+
const handleClickOutside = (event) => {
|
|
20
|
+
if (containerRef.current && !containerRef.current.contains(event.target)) {
|
|
21
|
+
setIsOpen(false);
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
const handleEsc = (event) => {
|
|
25
|
+
if (event.key === "Escape")
|
|
26
|
+
setIsOpen(false);
|
|
27
|
+
};
|
|
28
|
+
document.addEventListener("mousedown", handleClickOutside);
|
|
29
|
+
document.addEventListener("keydown", handleEsc);
|
|
30
|
+
return () => {
|
|
31
|
+
document.removeEventListener("mousedown", handleClickOutside);
|
|
32
|
+
document.removeEventListener("keydown", handleEsc);
|
|
33
|
+
};
|
|
34
|
+
}, []);
|
|
35
|
+
return (_jsxs("div", { ref: containerRef, className: `relative ${className || ""}`, children: [_jsxs("button", { type: "button", onClick: () => setIsOpen(!isOpen), "aria-expanded": isOpen, "aria-haspopup": "listbox", className: "flex items-center justify-between w-full px-4 py-2 border border-gray-300 rounded-lg text-sm text-gray-700 bg-white hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-gray-500 focus:border-transparent transition", children: [_jsx("span", { className: `truncate ${selectedOption ? "pr-6" : ""}`, children: selectedOption ? selectedOption.name : placeholder || `Filtrer par ${label}` }), _jsx(ChevronDown, { className: `w-4 h-4 text-gray-400 transition-transform shrink-0 ml-2 ${isOpen ? "rotate-180" : ""}` })] }), isOpen && (_jsxs("div", { className: "absolute z-10 w-full mt-1 bg-white border border-gray-200 rounded-lg shadow-lg max-h-60 overflow-y-auto", children: [_jsxs("button", { type: "button", onClick: () => {
|
|
36
|
+
onSelect(null);
|
|
37
|
+
setIsOpen(false);
|
|
38
|
+
}, className: `w-full px-4 py-2 text-left text-sm hover:bg-gray-100 border-b border-gray-200 ${!selectedOption ? "bg-gray-100 text-gray-900 font-medium" : "text-gray-500"}`, children: ["Toutes les ", label, "s"] }), options.length === 0 ? (_jsx("p", { className: "px-4 py-3 text-sm text-gray-400 text-center", children: "Aucune option" })) : (options.map((option) => (_jsx("button", { type: "button", onClick: () => handleSelect(option), className: `w-full px-4 py-2 text-left text-sm hover:bg-gray-100 transition-colors ${selectedOption?.id === option.id ? "bg-gray-200 text-gray-900 font-medium" : "text-gray-700"}`, children: option.name }, option.id))))] })), selectedOption && (_jsx("button", { type: "button", onClick: handleClear, "aria-label": "Effacer la s\u00E9lection", className: "absolute right-8 top-1/2 -translate-y-1/2 p-1 text-gray-400 hover:text-gray-600 transition-colors cursor-pointer", children: _jsx(X, { className: "w-4 h-4" }) }))] }));
|
|
98
39
|
}
|
|
99
|
-
*/
|
|
100
40
|
//# sourceMappingURL=select-search.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"select-search.js","sourceRoot":"","sources":["../../../../../packages/ui/src/search/select-search.tsx"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"select-search.js","sourceRoot":"","sources":["../../../../../packages/ui/src/search/select-search.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetcher.d.ts","sourceRoot":"","sources":["../../../../packages/utils/src/fetcher.ts"],"names":[],"mappings":"AAAA,qBAAa,QAAS,SAAQ,KAAK;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;gBAEV,MAAM,EAAE;QAClB,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,OAAO,CAAC;KAChB;CAMF;AAQD,MAAM,MAAM,cAAc,GAAG,WAAW,GAAG;IACzC,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B,CAAC;AAEF,wBAAsB,OAAO,CAAC,CAAC,GAAG,OAAO,EACvC,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"fetcher.d.ts","sourceRoot":"","sources":["../../../../packages/utils/src/fetcher.ts"],"names":[],"mappings":"AAAA,qBAAa,QAAS,SAAQ,KAAK;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;gBAEV,MAAM,EAAE;QAClB,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,OAAO,CAAC;KAChB;CAMF;AAQD,MAAM,MAAM,cAAc,GAAG,WAAW,GAAG;IACzC,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B,CAAC;AAEF,wBAAsB,OAAO,CAAC,CAAC,GAAG,OAAO,EACvC,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,CAAC,CAAC,CA0CZ"}
|
|
@@ -11,6 +11,16 @@ export class ApiError extends Error {
|
|
|
11
11
|
}
|
|
12
12
|
export async function fetcher(url, options = {}) {
|
|
13
13
|
const { headers, skipJsonParsing = false, ...rest } = options;
|
|
14
|
+
const method = (rest.method ?? "GET").toString().toUpperCase();
|
|
15
|
+
const isMutation = method !== "GET" && method !== "HEAD";
|
|
16
|
+
if (isMutation && typeof navigator !== "undefined" && !navigator.onLine) {
|
|
17
|
+
throw new ApiError({
|
|
18
|
+
message: "Vous êtes hors ligne — cette action nécessite une connexion internet.",
|
|
19
|
+
status: 0,
|
|
20
|
+
code: "OFFLINE",
|
|
21
|
+
data: null,
|
|
22
|
+
});
|
|
23
|
+
}
|
|
14
24
|
const response = await fetch(url, {
|
|
15
25
|
credentials: "include",
|
|
16
26
|
headers: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetcher.js","sourceRoot":"","sources":["../../../../packages/utils/src/fetcher.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,QAAS,SAAQ,KAAK;IAC1B,MAAM,CAAS;IACf,IAAI,CAAU;IACd,IAAI,CAAW;IAEtB,YAAY,MAKX;QACC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACtB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC5B,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;IAC1B,CAAC;CACF;AAYD,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,GAAW,EACX,UAA0B,EAAE;IAE5B,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,KAAK,EAAE,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC;IAE9D,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAChC,WAAW,EAAE,SAAS;QACtB,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,GAAG,OAAO;SACX;QACD,GAAG,IAAI;KACR,CAAC,CAAC;IAEH,IAAI,YAAY,GAAY,IAAI,CAAC;IACjC,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAEzD,IAAI,CAAC,eAAe,IAAI,WAAW,EAAE,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;QAClE,YAAY,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IACvC,CAAC;IAED,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,YAAY,GAAG,YAAiC,CAAC;QAEvD,MAAM,IAAI,QAAQ,CAAC;YACjB,OAAO,EAAE,YAAY,EAAE,OAAO,IAAI,yBAAyB;YAC3D,MAAM,EAAE,YAAY,EAAE,MAAM,IAAI,QAAQ,CAAC,MAAM;YAC/C,IAAI,EAAE,YAAY,EAAE,IAAI;YACxB,IAAI,EAAE,YAAY;SACnB,CAAC,CAAC;IACL,CAAC;IAED,OAAO,YAAiB,CAAC;AAC3B,CAAC"}
|
|
1
|
+
{"version":3,"file":"fetcher.js","sourceRoot":"","sources":["../../../../packages/utils/src/fetcher.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,QAAS,SAAQ,KAAK;IAC1B,MAAM,CAAS;IACf,IAAI,CAAU;IACd,IAAI,CAAW;IAEtB,YAAY,MAKX;QACC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACtB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC5B,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;IAC1B,CAAC;CACF;AAYD,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,GAAW,EACX,UAA0B,EAAE;IAE5B,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,KAAK,EAAE,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC;IAE9D,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC,WAAW,EAAE,CAAC;IAC/D,MAAM,UAAU,GAAG,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,MAAM,CAAC;IACzD,IAAI,UAAU,IAAI,OAAO,SAAS,KAAK,WAAW,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;QACxE,MAAM,IAAI,QAAQ,CAAC;YACjB,OAAO,EAAE,uEAAuE;YAChF,MAAM,EAAE,CAAC;YACT,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,IAAI;SACX,CAAC,CAAC;IACL,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAChC,WAAW,EAAE,SAAS;QACtB,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,GAAG,OAAO;SACX;QACD,GAAG,IAAI;KACR,CAAC,CAAC;IAEH,IAAI,YAAY,GAAY,IAAI,CAAC;IACjC,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAEzD,IAAI,CAAC,eAAe,IAAI,WAAW,EAAE,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;QAClE,YAAY,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IACvC,CAAC;IAED,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,YAAY,GAAG,YAAiC,CAAC;QAEvD,MAAM,IAAI,QAAQ,CAAC;YACjB,OAAO,EAAE,YAAY,EAAE,OAAO,IAAI,yBAAyB;YAC3D,MAAM,EAAE,YAAY,EAAE,MAAM,IAAI,QAAQ,CAAC,MAAM;YAC/C,IAAI,EAAE,YAAY,EAAE,IAAI;YACxB,IAAI,EAAE,YAAY;SACnB,CAAC,CAAC;IACL,CAAC;IAED,OAAO,YAAiB,CAAC;AAC3B,CAAC"}
|
|
@@ -1 +1,25 @@
|
|
|
1
|
+
export type FormatCurrencyOptions = Intl.NumberFormatOptions & {
|
|
2
|
+
locale?: string;
|
|
3
|
+
fallback?: string;
|
|
4
|
+
};
|
|
5
|
+
/**
|
|
6
|
+
* Formate un montant en devise (EUR par défaut, fr-FR).
|
|
7
|
+
* - Accepte number | string | null | undefined
|
|
8
|
+
* - Retourne fallback ("-") si valeur nulle ou invalide
|
|
9
|
+
* - Sans options -> "1 234,50 €" (fr-FR, EUR, 2 décimales)
|
|
10
|
+
* - Alias FCFA -> XAF (Intl n'accepte pas "FCFA" comme code ISO, XAF s'affiche "FCFA" en fr-FR)
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* formatCurrency(1234.5) // "1 234,50 €"
|
|
14
|
+
* formatCurrency(5000, { currency: "XAF" }) // "5 000 FCFA" (fr-FR)
|
|
15
|
+
* formatCurrency(5000, { currency: "FCFA" }) // "5 000 FCFA" (alias -> XAF)
|
|
16
|
+
* formatCurrency("99.99", { currency: "USD", locale: "en-US" }) // "$99.99"
|
|
17
|
+
* formatCurrency(1000, { notation: "compact" }) // "1 k €" approximatif
|
|
18
|
+
* formatCurrency(null) // "-"
|
|
19
|
+
*/
|
|
20
|
+
export declare function formatCurrency(value: number | string | null | undefined, options?: FormatCurrencyOptions): string;
|
|
21
|
+
/**
|
|
22
|
+
* Raccourci sans devise — formatage décimal localisé (ex: "1 234,5")
|
|
23
|
+
*/
|
|
24
|
+
export declare function formatNumber(value: number | string | null | undefined, options?: FormatCurrencyOptions): string;
|
|
1
25
|
//# sourceMappingURL=formatCurrency.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formatCurrency.d.ts","sourceRoot":"","sources":["../../../../packages/utils/src/formatCurrency.ts"],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"formatCurrency.d.ts","sourceRoot":"","sources":["../../../../packages/utils/src/formatCurrency.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,qBAAqB,GAAG,IAAI,CAAC,mBAAmB,GAAG;IAC7D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AASF;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,EACzC,OAAO,GAAE,qBAA0B,GAClC,MAAM,CA+BR;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,EACzC,OAAO,GAAE,qBAA0B,GAClC,MAAM,CAUR"}
|
|
@@ -1,2 +1,69 @@
|
|
|
1
|
-
|
|
1
|
+
function normalizeCurrency(currency) {
|
|
2
|
+
if (!currency)
|
|
3
|
+
return currency;
|
|
4
|
+
const c = currency.trim().toUpperCase().replace(/\s/g, "");
|
|
5
|
+
if (c === "FCFA" || c === "CFA" || c === "F.CFA" || c === "FRANC")
|
|
6
|
+
return "XAF";
|
|
7
|
+
return c;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Formate un montant en devise (EUR par défaut, fr-FR).
|
|
11
|
+
* - Accepte number | string | null | undefined
|
|
12
|
+
* - Retourne fallback ("-") si valeur nulle ou invalide
|
|
13
|
+
* - Sans options -> "1 234,50 €" (fr-FR, EUR, 2 décimales)
|
|
14
|
+
* - Alias FCFA -> XAF (Intl n'accepte pas "FCFA" comme code ISO, XAF s'affiche "FCFA" en fr-FR)
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* formatCurrency(1234.5) // "1 234,50 €"
|
|
18
|
+
* formatCurrency(5000, { currency: "XAF" }) // "5 000 FCFA" (fr-FR)
|
|
19
|
+
* formatCurrency(5000, { currency: "FCFA" }) // "5 000 FCFA" (alias -> XAF)
|
|
20
|
+
* formatCurrency("99.99", { currency: "USD", locale: "en-US" }) // "$99.99"
|
|
21
|
+
* formatCurrency(1000, { notation: "compact" }) // "1 k €" approximatif
|
|
22
|
+
* formatCurrency(null) // "-"
|
|
23
|
+
*/
|
|
24
|
+
export function formatCurrency(value, options = {}) {
|
|
25
|
+
const { locale = "fr-FR", fallback = "-", ...intlOptions } = options;
|
|
26
|
+
if (value === null || value === undefined || value === "")
|
|
27
|
+
return fallback;
|
|
28
|
+
const num = typeof value === "number" ? value : Number(String(value).replace(",", ".").replace(/\s/g, ""));
|
|
29
|
+
if (Number.isNaN(num) || !Number.isFinite(num))
|
|
30
|
+
return fallback;
|
|
31
|
+
const resolvedOptions = {
|
|
32
|
+
style: "currency",
|
|
33
|
+
currency: "EUR",
|
|
34
|
+
minimumFractionDigits: 2,
|
|
35
|
+
maximumFractionDigits: 2,
|
|
36
|
+
...intlOptions,
|
|
37
|
+
};
|
|
38
|
+
// Normalise FCFA -> XAF (XAF s'affiche "FCFA" en fr-FR)
|
|
39
|
+
if (resolvedOptions.currency) {
|
|
40
|
+
resolvedOptions.currency = normalizeCurrency(resolvedOptions.currency);
|
|
41
|
+
}
|
|
42
|
+
if (resolvedOptions.style !== "currency") {
|
|
43
|
+
delete resolvedOptions.currency;
|
|
44
|
+
}
|
|
45
|
+
try {
|
|
46
|
+
return new Intl.NumberFormat(locale, resolvedOptions).format(num);
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
return fallback;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Raccourci sans devise — formatage décimal localisé (ex: "1 234,5")
|
|
54
|
+
*/
|
|
55
|
+
export function formatNumber(value, options = {}) {
|
|
56
|
+
const { locale = "fr-FR", fallback = "-", ...rest } = options;
|
|
57
|
+
if (value === null || value === undefined || value === "")
|
|
58
|
+
return fallback;
|
|
59
|
+
const num = typeof value === "number" ? value : Number(String(value).replace(",", ".").replace(/\s/g, ""));
|
|
60
|
+
if (Number.isNaN(num) || !Number.isFinite(num))
|
|
61
|
+
return fallback;
|
|
62
|
+
try {
|
|
63
|
+
return new Intl.NumberFormat(locale, { ...rest, style: "decimal" }).format(num);
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
return fallback;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
2
69
|
//# sourceMappingURL=formatCurrency.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formatCurrency.js","sourceRoot":"","sources":["../../../../packages/utils/src/formatCurrency.ts"],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"formatCurrency.js","sourceRoot":"","sources":["../../../../packages/utils/src/formatCurrency.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1,27 @@
|
|
|
1
|
+
export type FormatDateOptions = Intl.DateTimeFormatOptions & {
|
|
2
|
+
locale?: string;
|
|
3
|
+
fallback?: string;
|
|
4
|
+
};
|
|
5
|
+
/**
|
|
6
|
+
* Formate une date en français par défaut.
|
|
7
|
+
* - Accepte Date | string | number | null | undefined
|
|
8
|
+
* - Retourne fallback ("-") si valeur nulle ou invalide
|
|
9
|
+
* - Sans options -> "02/08/2026" (fr-FR court)
|
|
10
|
+
* - Avec options Intl -> passe directement à Intl.DateTimeFormat
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* formatDate("2026-07-20T14:30:00Z") // "20/07/2026"
|
|
14
|
+
* formatDate(date, { dateStyle: "long" }) // "20 juillet 2026"
|
|
15
|
+
* formatDate(date, { dateStyle: "short", timeStyle: "short" }) // "20/07/2026 14:30"
|
|
16
|
+
* formatDate(null) // "-"
|
|
17
|
+
*/
|
|
18
|
+
export declare function formatDate(value: Date | string | number | null | undefined, options?: FormatDateOptions): string;
|
|
19
|
+
/**
|
|
20
|
+
* Raccourci pour date + heure courte (ex: "20/07/2026 14:30")
|
|
21
|
+
*/
|
|
22
|
+
export declare function formatDateTime(value: Date | string | number | null | undefined, options?: FormatDateOptions): string;
|
|
23
|
+
/**
|
|
24
|
+
* Raccourci pour heure seule (ex: "14:30")
|
|
25
|
+
*/
|
|
26
|
+
export declare function formatTime(value: Date | string | number | null | undefined, options?: FormatDateOptions): string;
|
|
1
27
|
//# sourceMappingURL=formatDate.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formatDate.d.ts","sourceRoot":"","sources":["../../../../packages/utils/src/formatDate.ts"],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"formatDate.d.ts","sourceRoot":"","sources":["../../../../packages/utils/src/formatDate.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,iBAAiB,GAAG,IAAI,CAAC,qBAAqB,GAAG;IAC3D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,wBAAgB,UAAU,CACxB,KAAK,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,EAChD,OAAO,GAAE,iBAAsB,GAC9B,MAAM,CAmBR;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,EAChD,OAAO,GAAE,iBAAsB,GAC9B,MAAM,CAaR;AAED;;GAEG;AACH,wBAAgB,UAAU,CACxB,KAAK,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,EAChD,OAAO,GAAE,iBAAsB,GAC9B,MAAM,CAUR"}
|
|
@@ -1,2 +1,66 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Formate une date en français par défaut.
|
|
3
|
+
* - Accepte Date | string | number | null | undefined
|
|
4
|
+
* - Retourne fallback ("-") si valeur nulle ou invalide
|
|
5
|
+
* - Sans options -> "02/08/2026" (fr-FR court)
|
|
6
|
+
* - Avec options Intl -> passe directement à Intl.DateTimeFormat
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* formatDate("2026-07-20T14:30:00Z") // "20/07/2026"
|
|
10
|
+
* formatDate(date, { dateStyle: "long" }) // "20 juillet 2026"
|
|
11
|
+
* formatDate(date, { dateStyle: "short", timeStyle: "short" }) // "20/07/2026 14:30"
|
|
12
|
+
* formatDate(null) // "-"
|
|
13
|
+
*/
|
|
14
|
+
export function formatDate(value, options = {}) {
|
|
15
|
+
const { locale = "fr-FR", fallback = "-", ...intlOptions } = options;
|
|
16
|
+
if (value === null || value === undefined || value === "")
|
|
17
|
+
return fallback;
|
|
18
|
+
const date = value instanceof Date ? value : new Date(value);
|
|
19
|
+
if (Number.isNaN(date.getTime()))
|
|
20
|
+
return fallback;
|
|
21
|
+
// Default court fr-FR si aucune option Intl fournie
|
|
22
|
+
if (Object.keys(intlOptions).length === 0) {
|
|
23
|
+
return new Intl.DateTimeFormat(locale, {
|
|
24
|
+
day: "2-digit",
|
|
25
|
+
month: "2-digit",
|
|
26
|
+
year: "numeric",
|
|
27
|
+
}).format(date);
|
|
28
|
+
}
|
|
29
|
+
return new Intl.DateTimeFormat(locale, intlOptions).format(date);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Raccourci pour date + heure courte (ex: "20/07/2026 14:30")
|
|
33
|
+
*/
|
|
34
|
+
export function formatDateTime(value, options = {}) {
|
|
35
|
+
const { locale = "fr-FR", fallback = "-", ...rest } = options;
|
|
36
|
+
if (value === null || value === undefined || value === "")
|
|
37
|
+
return fallback;
|
|
38
|
+
const date = value instanceof Date ? value : new Date(value);
|
|
39
|
+
if (Number.isNaN(date.getTime()))
|
|
40
|
+
return fallback;
|
|
41
|
+
return new Intl.DateTimeFormat(locale, {
|
|
42
|
+
day: "2-digit",
|
|
43
|
+
month: "2-digit",
|
|
44
|
+
year: "numeric",
|
|
45
|
+
hour: "2-digit",
|
|
46
|
+
minute: "2-digit",
|
|
47
|
+
...rest,
|
|
48
|
+
}).format(date);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Raccourci pour heure seule (ex: "14:30")
|
|
52
|
+
*/
|
|
53
|
+
export function formatTime(value, options = {}) {
|
|
54
|
+
const { locale = "fr-FR", fallback = "-", ...rest } = options;
|
|
55
|
+
if (value === null || value === undefined || value === "")
|
|
56
|
+
return fallback;
|
|
57
|
+
const date = value instanceof Date ? value : new Date(value);
|
|
58
|
+
if (Number.isNaN(date.getTime()))
|
|
59
|
+
return fallback;
|
|
60
|
+
return new Intl.DateTimeFormat(locale, {
|
|
61
|
+
hour: "2-digit",
|
|
62
|
+
minute: "2-digit",
|
|
63
|
+
...rest,
|
|
64
|
+
}).format(date);
|
|
65
|
+
}
|
|
2
66
|
//# sourceMappingURL=formatDate.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formatDate.js","sourceRoot":"","sources":["../../../../packages/utils/src/formatDate.ts"],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"formatDate.js","sourceRoot":"","sources":["../../../../packages/utils/src/formatDate.ts"],"names":[],"mappings":"AAKA;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,UAAU,CACxB,KAAgD,EAChD,UAA6B,EAAE;IAE/B,MAAM,EAAE,MAAM,GAAG,OAAO,EAAE,QAAQ,GAAG,GAAG,EAAE,GAAG,WAAW,EAAE,GAAG,OAAO,CAAC;IAErE,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE;QAAE,OAAO,QAAQ,CAAC;IAE3E,MAAM,IAAI,GAAG,KAAK,YAAY,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC;IAE7D,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QAAE,OAAO,QAAQ,CAAC;IAElD,oDAAoD;IACpD,IAAI,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1C,OAAO,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE;YACrC,GAAG,EAAE,SAAS;YACd,KAAK,EAAE,SAAS;YAChB,IAAI,EAAE,SAAS;SAChB,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AACnE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAC5B,KAAgD,EAChD,UAA6B,EAAE;IAE/B,MAAM,EAAE,MAAM,GAAG,OAAO,EAAE,QAAQ,GAAG,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC;IAC9D,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE;QAAE,OAAO,QAAQ,CAAC;IAC3E,MAAM,IAAI,GAAG,KAAK,YAAY,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC;IAC7D,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QAAE,OAAO,QAAQ,CAAC;IAClD,OAAO,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE;QACrC,GAAG,EAAE,SAAS;QACd,KAAK,EAAE,SAAS;QAChB,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,SAAS;QACf,MAAM,EAAE,SAAS;QACjB,GAAG,IAAI;KACR,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CACxB,KAAgD,EAChD,UAA6B,EAAE;IAE/B,MAAM,EAAE,MAAM,GAAG,OAAO,EAAE,QAAQ,GAAG,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC;IAC9D,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE;QAAE,OAAO,QAAQ,CAAC;IAC3E,MAAM,IAAI,GAAG,KAAK,YAAY,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC;IAC7D,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QAAE,OAAO,QAAQ,CAAC;IAClD,OAAO,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE;QACrC,IAAI,EAAE,SAAS;QACf,MAAM,EAAE,SAAS;QACjB,GAAG,IAAI;KACR,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AAClB,CAAC"}
|
|
@@ -1,3 +1,7 @@
|
|
|
1
1
|
export { ApiError, fetcher } from "./fetcher";
|
|
2
2
|
export type { FetcherOptions } from "./fetcher";
|
|
3
|
+
export { formatDate, formatDateTime, formatTime } from "./formatDate";
|
|
4
|
+
export type { FormatDateOptions } from "./formatDate";
|
|
5
|
+
export { formatCurrency, formatNumber } from "./formatCurrency";
|
|
6
|
+
export type { FormatCurrencyOptions } from "./formatCurrency";
|
|
3
7
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../packages/utils/src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC9C,YAAY,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../packages/utils/src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC9C,YAAY,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAEhD,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AACtE,YAAY,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEtD,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChE,YAAY,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../packages/utils/src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../packages/utils/src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAG9C,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAGtE,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC"}
|