@dododog/ui 0.10.0 → 0.11.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.
@@ -0,0 +1,134 @@
1
+ import { cn } from './chunk-IMKLN273.mjs';
2
+ import * as React from 'react';
3
+ import { jsxs, jsx } from 'react/jsx-runtime';
4
+
5
+ function MapPinIcon({ className }) {
6
+ return /* @__PURE__ */ jsxs("svg", { xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", className, "aria-hidden": "true", children: [
7
+ /* @__PURE__ */ jsx("path", { d: "M20 10c0 6-8 12-8 12s-8-6-8-12a8 8 0 0 1 16 0Z" }),
8
+ /* @__PURE__ */ jsx("circle", { cx: "12", cy: "10", r: "3" })
9
+ ] });
10
+ }
11
+ function CalendarIcon({ className }) {
12
+ return /* @__PURE__ */ jsxs("svg", { xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", className, "aria-hidden": "true", children: [
13
+ /* @__PURE__ */ jsx("path", { d: "M8 2v4M16 2v4M3 10h18" }),
14
+ /* @__PURE__ */ jsx("rect", { x: "3", y: "4", width: "18", height: "18", rx: "2" })
15
+ ] });
16
+ }
17
+ function DogIcon({ className }) {
18
+ return /* @__PURE__ */ jsxs("svg", { xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", className, "aria-hidden": "true", children: [
19
+ /* @__PURE__ */ jsx("path", { d: "M10 5.172C10 3.782 8.423 2.679 6.5 3c-2.823.47-4.113 6.006-4 7 .08.703 1.725 1.722 3.656 1 1.261-.472 1.96-1.45 2.344-2.5" }),
20
+ /* @__PURE__ */ jsx("path", { d: "M14.267 5.172c0-1.39 1.577-2.493 3.5-2.172 2.823.47 4.113 6.006 4 7-.08.703-1.725 1.722-3.656 1-1.261-.472-1.855-1.45-2.239-2.5" }),
21
+ /* @__PURE__ */ jsx("path", { d: "M8 14v.5M16 14v.5M11.25 16.25h1.5L12 17l-.75-.75Z" }),
22
+ /* @__PURE__ */ jsx("path", { d: "M4.42 11.247A13.152 13.152 0 0 0 4 14.556C4 18.728 7.582 21 12 21s8-2.272 8-6.444c0-1.061-.162-2.2-.493-3.309m-9.243-6.082A8.801 8.801 0 0 1 12 5c.78 0 1.5.108 2.161.306" })
23
+ ] });
24
+ }
25
+ var STATUS_STYLES = {
26
+ confirmed: "bg-accent/15 text-accent",
27
+ pending: "bg-amber-100 text-amber-700",
28
+ processing: "bg-sky-100 text-sky-700"
29
+ };
30
+ var TripHeroCard = React.forwardRef(
31
+ ({ trip, actions, renderImage, className, ...props }, ref) => {
32
+ const {
33
+ hotelName,
34
+ hotelImage,
35
+ city,
36
+ address,
37
+ checkinLabel,
38
+ checkoutLabel,
39
+ nights,
40
+ countdownLabel,
41
+ isSoon,
42
+ statusLabel,
43
+ statusTone = "confirmed",
44
+ priceLabel,
45
+ dogName
46
+ } = trip;
47
+ const media = /* @__PURE__ */ jsxs("div", { className: "relative aspect-[16/10] w-full overflow-hidden bg-gradient-to-br from-sand-dark to-sand md:aspect-auto md:h-full md:min-h-[15rem]", children: [
48
+ hotelImage ? renderImage ? renderImage({
49
+ src: hotelImage,
50
+ alt: hotelName,
51
+ className: "h-full w-full object-cover"
52
+ }) : /* @__PURE__ */ jsx("img", { src: hotelImage, alt: hotelName, className: "h-full w-full object-cover" }) : /* @__PURE__ */ jsx("div", { className: "flex h-full w-full items-center justify-center text-text-muted", children: /* @__PURE__ */ jsx(CalendarIcon, { className: "h-10 w-10" }) }),
53
+ /* @__PURE__ */ jsx("div", { className: "pointer-events-none absolute inset-x-0 bottom-0 h-24 bg-gradient-to-t from-black/55 to-transparent" }),
54
+ /* @__PURE__ */ jsxs(
55
+ "span",
56
+ {
57
+ className: cn(
58
+ "absolute bottom-3 left-3 inline-flex items-center gap-1.5 rounded-full px-3 py-1.5 text-sm font-semibold shadow-sm backdrop-blur-sm",
59
+ isSoon ? "bg-secondary text-white" : "bg-white/90 text-primary"
60
+ ),
61
+ children: [
62
+ /* @__PURE__ */ jsx(CalendarIcon, { className: "h-3.5 w-3.5" }),
63
+ countdownLabel
64
+ ]
65
+ }
66
+ )
67
+ ] });
68
+ return /* @__PURE__ */ jsx(
69
+ "section",
70
+ {
71
+ ref,
72
+ "aria-label": "Prochain s\xE9jour",
73
+ className: cn(
74
+ "overflow-hidden rounded-2xl border border-sand-dark bg-white shadow-card",
75
+ className
76
+ ),
77
+ ...props,
78
+ children: /* @__PURE__ */ jsxs("div", { className: "flex flex-col md:flex-row", children: [
79
+ /* @__PURE__ */ jsx("div", { className: "md:w-2/5 md:shrink-0", children: media }),
80
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-1 flex-col gap-4 p-5", children: [
81
+ /* @__PURE__ */ jsxs("div", { children: [
82
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [
83
+ /* @__PURE__ */ jsx("p", { className: "text-xs font-semibold uppercase tracking-wide text-secondary", children: "Prochain s\xE9jour" }),
84
+ statusLabel && /* @__PURE__ */ jsx(
85
+ "span",
86
+ {
87
+ className: cn(
88
+ "inline-flex items-center rounded-full px-2 py-0.5 text-xs font-semibold",
89
+ STATUS_STYLES[statusTone]
90
+ ),
91
+ children: statusLabel
92
+ }
93
+ )
94
+ ] }),
95
+ /* @__PURE__ */ jsx("h2", { className: "mt-1 font-heading text-2xl font-bold text-primary", children: hotelName }),
96
+ (city || address) && /* @__PURE__ */ jsxs("p", { className: "mt-1 inline-flex items-center gap-1.5 text-sm text-text-secondary", children: [
97
+ /* @__PURE__ */ jsx(MapPinIcon, { className: "h-4 w-4 shrink-0 text-text-muted" }),
98
+ /* @__PURE__ */ jsx("span", { className: "truncate", children: [city, address].filter(Boolean).join(" \xB7 ") })
99
+ ] })
100
+ ] }),
101
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-x-4 gap-y-2 text-sm", children: [
102
+ /* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-1.5 text-primary", children: [
103
+ /* @__PURE__ */ jsx(CalendarIcon, { className: "h-4 w-4 text-text-muted" }),
104
+ /* @__PURE__ */ jsxs("span", { className: "font-medium", children: [
105
+ checkinLabel,
106
+ " \u2192 ",
107
+ checkoutLabel
108
+ ] }),
109
+ /* @__PURE__ */ jsxs("span", { className: "text-text-muted", children: [
110
+ "\xB7 ",
111
+ nights,
112
+ " nuit",
113
+ nights > 1 ? "s" : ""
114
+ ] })
115
+ ] }),
116
+ dogName && /* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-1.5 text-text-secondary", children: [
117
+ /* @__PURE__ */ jsx(DogIcon, { className: "h-4 w-4 text-secondary" }),
118
+ dogName
119
+ ] })
120
+ ] }),
121
+ priceLabel && /* @__PURE__ */ jsxs("div", { className: "flex items-baseline gap-1.5", children: [
122
+ /* @__PURE__ */ jsx("span", { className: "text-sm text-text-muted", children: "Total" }),
123
+ /* @__PURE__ */ jsx("span", { className: "font-heading text-xl font-bold text-primary tabular-nums", children: priceLabel })
124
+ ] }),
125
+ actions && /* @__PURE__ */ jsx("div", { className: "mt-auto flex flex-wrap gap-2 pt-1", children: actions })
126
+ ] })
127
+ ] })
128
+ }
129
+ );
130
+ }
131
+ );
132
+ TripHeroCard.displayName = "TripHeroCard";
133
+
134
+ export { TripHeroCard };
@@ -0,0 +1,89 @@
1
+ 'use strict';
2
+
3
+ var chunkADIDI7AJ_js = require('./chunk-ADIDI7AJ.js');
4
+ var React = require('react');
5
+ var jsxRuntime = require('react/jsx-runtime');
6
+
7
+ function _interopNamespace(e) {
8
+ if (e && e.__esModule) return e;
9
+ var n = Object.create(null);
10
+ if (e) {
11
+ Object.keys(e).forEach(function (k) {
12
+ if (k !== 'default') {
13
+ var d = Object.getOwnPropertyDescriptor(e, k);
14
+ Object.defineProperty(n, k, d.get ? d : {
15
+ enumerable: true,
16
+ get: function () { return e[k]; }
17
+ });
18
+ }
19
+ });
20
+ }
21
+ n.default = e;
22
+ return Object.freeze(n);
23
+ }
24
+
25
+ var React__namespace = /*#__PURE__*/_interopNamespace(React);
26
+
27
+ function ChevronRightIcon({ className }) {
28
+ return /* @__PURE__ */ jsxRuntime.jsx(
29
+ "svg",
30
+ {
31
+ xmlns: "http://www.w3.org/2000/svg",
32
+ width: "16",
33
+ height: "16",
34
+ viewBox: "0 0 24 24",
35
+ fill: "none",
36
+ stroke: "currentColor",
37
+ strokeWidth: "2",
38
+ strokeLinecap: "round",
39
+ strokeLinejoin: "round",
40
+ className,
41
+ "aria-hidden": "true",
42
+ children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "m9 18 6-6-6-6" })
43
+ }
44
+ );
45
+ }
46
+ var SectionHeader = React__namespace.forwardRef(
47
+ ({
48
+ title,
49
+ subtitle,
50
+ icon,
51
+ actionLabel,
52
+ actionHref,
53
+ renderLink,
54
+ as: Heading = "h2",
55
+ className,
56
+ ...props
57
+ }, ref) => {
58
+ const linkClassName = "inline-flex items-center gap-1 rounded text-sm font-medium text-secondary transition-colors hover:text-secondary/80 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary focus-visible:ring-offset-2";
59
+ const linkChildren = /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
60
+ actionLabel,
61
+ /* @__PURE__ */ jsxRuntime.jsx(ChevronRightIcon, { className: "h-4 w-4" })
62
+ ] });
63
+ return /* @__PURE__ */ jsxRuntime.jsxs(
64
+ "div",
65
+ {
66
+ ref,
67
+ className: chunkADIDI7AJ_js.cn("flex items-end justify-between gap-3", className),
68
+ ...props,
69
+ children: [
70
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex min-w-0 items-start gap-2", children: [
71
+ icon && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "mt-0.5 shrink-0 text-secondary", children: icon }),
72
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "min-w-0", children: [
73
+ /* @__PURE__ */ jsxRuntime.jsx(Heading, { className: "font-heading text-xl font-semibold text-primary", children: title }),
74
+ subtitle && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-0.5 text-sm text-text-secondary", children: subtitle })
75
+ ] })
76
+ ] }),
77
+ actionLabel && actionHref && (renderLink ? renderLink({
78
+ href: actionHref,
79
+ className: linkClassName,
80
+ children: linkChildren
81
+ }) : /* @__PURE__ */ jsxRuntime.jsx("a", { href: actionHref, className: linkClassName, children: linkChildren }))
82
+ ]
83
+ }
84
+ );
85
+ }
86
+ );
87
+ SectionHeader.displayName = "SectionHeader";
88
+
89
+ exports.SectionHeader = SectionHeader;
@@ -0,0 +1,57 @@
1
+ import { cn } from './chunk-IMKLN273.mjs';
2
+ import * as React from 'react';
3
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
4
+
5
+ function ChevronRightIcon({ className }) {
6
+ return /* @__PURE__ */ jsx(
7
+ "svg",
8
+ {
9
+ xmlns: "http://www.w3.org/2000/svg",
10
+ width: "16",
11
+ height: "16",
12
+ viewBox: "0 0 24 24",
13
+ fill: "none",
14
+ stroke: "currentColor",
15
+ strokeWidth: "2",
16
+ strokeLinecap: "round",
17
+ strokeLinejoin: "round",
18
+ className,
19
+ "aria-hidden": "true",
20
+ children: /* @__PURE__ */ jsx("path", { d: "m9 18 6-6-6-6" })
21
+ }
22
+ );
23
+ }
24
+ var StatTile = React.forwardRef(
25
+ ({ label, value, icon, href, hint, renderLink, className, ...props }, ref) => {
26
+ const body = /* @__PURE__ */ jsxs(Fragment, { children: [
27
+ /* @__PURE__ */ jsx("span", { className: "flex h-10 w-10 shrink-0 items-center justify-center rounded-xl bg-sand text-secondary", children: icon }),
28
+ /* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1", children: [
29
+ /* @__PURE__ */ jsx("div", { className: "flex items-baseline gap-1.5", children: /* @__PURE__ */ jsx("span", { className: "font-heading text-2xl font-bold leading-none text-primary tabular-nums", children: value }) }),
30
+ /* @__PURE__ */ jsx("p", { className: "mt-1 truncate text-sm font-medium text-text-secondary", children: label }),
31
+ hint && /* @__PURE__ */ jsx("p", { className: "truncate text-xs text-text-muted", children: hint })
32
+ ] }),
33
+ href && /* @__PURE__ */ jsx(ChevronRightIcon, { className: "h-4 w-4 shrink-0 self-center text-text-muted" })
34
+ ] });
35
+ const baseClassName = cn(
36
+ "flex items-center gap-3 rounded-2xl border border-sand-dark bg-white p-4",
37
+ className
38
+ );
39
+ if (href) {
40
+ const linkClassName = cn(
41
+ baseClassName,
42
+ "min-h-[44px] transition-shadow hover:shadow-md focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary focus-visible:ring-offset-2"
43
+ );
44
+ const ariaLabel = `${label} : ${typeof value === "string" || typeof value === "number" ? value : ""}`.trim();
45
+ return /* @__PURE__ */ jsx("div", { ref, ...props, children: renderLink ? renderLink({
46
+ href,
47
+ className: linkClassName,
48
+ "aria-label": ariaLabel,
49
+ children: body
50
+ }) : /* @__PURE__ */ jsx("a", { href, className: linkClassName, "aria-label": ariaLabel, children: body }) });
51
+ }
52
+ return /* @__PURE__ */ jsx("div", { ref, className: baseClassName, ...props, children: body });
53
+ }
54
+ );
55
+ StatTile.displayName = "StatTile";
56
+
57
+ export { StatTile };
@@ -0,0 +1,44 @@
1
+ import * as React from 'react';
2
+
3
+ interface DogCardData {
4
+ name: string;
5
+ /** Photo personnelle du chien (prioritaire). */
6
+ photoUrl?: string | null;
7
+ /** Image de la race, utilisée en repli quand `photoUrl` est absente. */
8
+ breedImageUrl?: string | null;
9
+ /** Libellé de taille déjà traduit ("Petit", "Grand"…). */
10
+ sizeLabel?: string | null;
11
+ /** Libellé de sexe déjà traduit ("Mâle", "Femelle"). */
12
+ sexLabel?: string | null;
13
+ /** Nom de la race. */
14
+ breed?: string | null;
15
+ /** Âge déjà formaté ("6 ans", "8 mois"). */
16
+ ageLabel?: string | null;
17
+ /** Poids déjà formaté ("32 kg"). */
18
+ weightLabel?: string | null;
19
+ /** Chien principal du foyer. */
20
+ isPrimary?: boolean;
21
+ /** Lien vers le passeport du chien. */
22
+ href?: string;
23
+ }
24
+ interface DogCardProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "children"> {
25
+ dog: DogCardData;
26
+ /** Actions (éditer / supprimer) rendues par le consommateur en pied de carte. */
27
+ actions?: React.ReactNode;
28
+ /** Render personnalisé de l'image (ex : next/image). */
29
+ renderImage?: (props: {
30
+ src: string;
31
+ alt: string;
32
+ className: string;
33
+ }) => React.ReactNode;
34
+ /** Render personnalisé du lien (ex : next/link). */
35
+ renderLink?: (props: {
36
+ href: string;
37
+ className: string;
38
+ children: React.ReactNode;
39
+ "aria-label"?: string;
40
+ }) => React.ReactNode;
41
+ }
42
+ declare const DogCard: React.ForwardRefExoticComponent<DogCardProps & React.RefAttributes<HTMLDivElement>>;
43
+
44
+ export { DogCard, type DogCardData, type DogCardProps };
@@ -0,0 +1,44 @@
1
+ import * as React from 'react';
2
+
3
+ interface DogCardData {
4
+ name: string;
5
+ /** Photo personnelle du chien (prioritaire). */
6
+ photoUrl?: string | null;
7
+ /** Image de la race, utilisée en repli quand `photoUrl` est absente. */
8
+ breedImageUrl?: string | null;
9
+ /** Libellé de taille déjà traduit ("Petit", "Grand"…). */
10
+ sizeLabel?: string | null;
11
+ /** Libellé de sexe déjà traduit ("Mâle", "Femelle"). */
12
+ sexLabel?: string | null;
13
+ /** Nom de la race. */
14
+ breed?: string | null;
15
+ /** Âge déjà formaté ("6 ans", "8 mois"). */
16
+ ageLabel?: string | null;
17
+ /** Poids déjà formaté ("32 kg"). */
18
+ weightLabel?: string | null;
19
+ /** Chien principal du foyer. */
20
+ isPrimary?: boolean;
21
+ /** Lien vers le passeport du chien. */
22
+ href?: string;
23
+ }
24
+ interface DogCardProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "children"> {
25
+ dog: DogCardData;
26
+ /** Actions (éditer / supprimer) rendues par le consommateur en pied de carte. */
27
+ actions?: React.ReactNode;
28
+ /** Render personnalisé de l'image (ex : next/image). */
29
+ renderImage?: (props: {
30
+ src: string;
31
+ alt: string;
32
+ className: string;
33
+ }) => React.ReactNode;
34
+ /** Render personnalisé du lien (ex : next/link). */
35
+ renderLink?: (props: {
36
+ href: string;
37
+ className: string;
38
+ children: React.ReactNode;
39
+ "aria-label"?: string;
40
+ }) => React.ReactNode;
41
+ }
42
+ declare const DogCard: React.ForwardRefExoticComponent<DogCardProps & React.RefAttributes<HTMLDivElement>>;
43
+
44
+ export { DogCard, type DogCardData, type DogCardProps };
@@ -0,0 +1,11 @@
1
+ 'use strict';
2
+
3
+ var chunkBS7R7VDS_js = require('../../chunk-BS7R7VDS.js');
4
+ require('../../chunk-ADIDI7AJ.js');
5
+
6
+
7
+
8
+ Object.defineProperty(exports, "DogCard", {
9
+ enumerable: true,
10
+ get: function () { return chunkBS7R7VDS_js.DogCard; }
11
+ });
@@ -0,0 +1,2 @@
1
+ export { DogCard } from '../../chunk-4A3AQ66D.mjs';
2
+ import '../../chunk-IMKLN273.mjs';
@@ -0,0 +1,30 @@
1
+ import * as React from 'react';
2
+
3
+ interface SectionHeaderProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "title"> {
4
+ /** Titre de la section. */
5
+ title: React.ReactNode;
6
+ /** Sous-titre optionnel affiché sous le titre. */
7
+ subtitle?: React.ReactNode;
8
+ /** Icône décorative optionnelle rendue avant le titre. */
9
+ icon?: React.ReactNode;
10
+ /** Libellé du lien d'action (ex : "Voir tout"). */
11
+ actionLabel?: string;
12
+ /** Cible du lien d'action. */
13
+ actionHref?: string;
14
+ /** Render personnalisé du lien (ex : next/link). */
15
+ renderLink?: (props: {
16
+ href: string;
17
+ className: string;
18
+ children: React.ReactNode;
19
+ }) => React.ReactNode;
20
+ /** Niveau de titre sémantique (défaut : h2). */
21
+ as?: "h2" | "h3";
22
+ }
23
+ /**
24
+ * En-tête de section standard : titre (+ sous-titre / icône) à gauche,
25
+ * lien « Voir tout » optionnel à droite. Aligne toutes les sections du
26
+ * dashboard sur le même rythme visuel.
27
+ */
28
+ declare const SectionHeader: React.ForwardRefExoticComponent<SectionHeaderProps & React.RefAttributes<HTMLDivElement>>;
29
+
30
+ export { SectionHeader, type SectionHeaderProps };
@@ -0,0 +1,30 @@
1
+ import * as React from 'react';
2
+
3
+ interface SectionHeaderProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "title"> {
4
+ /** Titre de la section. */
5
+ title: React.ReactNode;
6
+ /** Sous-titre optionnel affiché sous le titre. */
7
+ subtitle?: React.ReactNode;
8
+ /** Icône décorative optionnelle rendue avant le titre. */
9
+ icon?: React.ReactNode;
10
+ /** Libellé du lien d'action (ex : "Voir tout"). */
11
+ actionLabel?: string;
12
+ /** Cible du lien d'action. */
13
+ actionHref?: string;
14
+ /** Render personnalisé du lien (ex : next/link). */
15
+ renderLink?: (props: {
16
+ href: string;
17
+ className: string;
18
+ children: React.ReactNode;
19
+ }) => React.ReactNode;
20
+ /** Niveau de titre sémantique (défaut : h2). */
21
+ as?: "h2" | "h3";
22
+ }
23
+ /**
24
+ * En-tête de section standard : titre (+ sous-titre / icône) à gauche,
25
+ * lien « Voir tout » optionnel à droite. Aligne toutes les sections du
26
+ * dashboard sur le même rythme visuel.
27
+ */
28
+ declare const SectionHeader: React.ForwardRefExoticComponent<SectionHeaderProps & React.RefAttributes<HTMLDivElement>>;
29
+
30
+ export { SectionHeader, type SectionHeaderProps };
@@ -0,0 +1,11 @@
1
+ 'use strict';
2
+
3
+ var chunkOGB5LIXN_js = require('../../chunk-OGB5LIXN.js');
4
+ require('../../chunk-ADIDI7AJ.js');
5
+
6
+
7
+
8
+ Object.defineProperty(exports, "SectionHeader", {
9
+ enumerable: true,
10
+ get: function () { return chunkOGB5LIXN_js.SectionHeader; }
11
+ });
@@ -0,0 +1,2 @@
1
+ export { SectionHeader } from '../../chunk-DM76AK4A.mjs';
2
+ import '../../chunk-IMKLN273.mjs';
@@ -0,0 +1,28 @@
1
+ import * as React from 'react';
2
+
3
+ interface StatTileProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "children"> {
4
+ /** Libellé de la tuile (ex : "Réservations à venir"). */
5
+ label: string;
6
+ /** Valeur mise en avant (ex : "3", "80 %"). */
7
+ value: React.ReactNode;
8
+ /** Icône (ReactNode, ex : lucide) rendue dans la pastille. */
9
+ icon: React.ReactNode;
10
+ /** Cible du lien — rend toute la tuile cliquable. */
11
+ href?: string;
12
+ /** Texte d'aide secondaire sous la valeur. */
13
+ hint?: string;
14
+ /** Render personnalisé du lien (ex : next/link). */
15
+ renderLink?: (props: {
16
+ href: string;
17
+ className: string;
18
+ "aria-label"?: string;
19
+ children: React.ReactNode;
20
+ }) => React.ReactNode;
21
+ }
22
+ /**
23
+ * Tuile compacte « at-a-glance » du dashboard : pastille d'icône, valeur
24
+ * proéminente, libellé. Toute la tuile est cliquable si `href` est fourni.
25
+ */
26
+ declare const StatTile: React.ForwardRefExoticComponent<StatTileProps & React.RefAttributes<HTMLDivElement>>;
27
+
28
+ export { StatTile, type StatTileProps };
@@ -0,0 +1,28 @@
1
+ import * as React from 'react';
2
+
3
+ interface StatTileProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "children"> {
4
+ /** Libellé de la tuile (ex : "Réservations à venir"). */
5
+ label: string;
6
+ /** Valeur mise en avant (ex : "3", "80 %"). */
7
+ value: React.ReactNode;
8
+ /** Icône (ReactNode, ex : lucide) rendue dans la pastille. */
9
+ icon: React.ReactNode;
10
+ /** Cible du lien — rend toute la tuile cliquable. */
11
+ href?: string;
12
+ /** Texte d'aide secondaire sous la valeur. */
13
+ hint?: string;
14
+ /** Render personnalisé du lien (ex : next/link). */
15
+ renderLink?: (props: {
16
+ href: string;
17
+ className: string;
18
+ "aria-label"?: string;
19
+ children: React.ReactNode;
20
+ }) => React.ReactNode;
21
+ }
22
+ /**
23
+ * Tuile compacte « at-a-glance » du dashboard : pastille d'icône, valeur
24
+ * proéminente, libellé. Toute la tuile est cliquable si `href` est fourni.
25
+ */
26
+ declare const StatTile: React.ForwardRefExoticComponent<StatTileProps & React.RefAttributes<HTMLDivElement>>;
27
+
28
+ export { StatTile, type StatTileProps };
@@ -0,0 +1,11 @@
1
+ 'use strict';
2
+
3
+ var chunkCWXP2ZI2_js = require('../../chunk-CWXP2ZI2.js');
4
+ require('../../chunk-ADIDI7AJ.js');
5
+
6
+
7
+
8
+ Object.defineProperty(exports, "StatTile", {
9
+ enumerable: true,
10
+ get: function () { return chunkCWXP2ZI2_js.StatTile; }
11
+ });
@@ -0,0 +1,2 @@
1
+ export { StatTile } from '../../chunk-ZEPXWD6U.mjs';
2
+ import '../../chunk-IMKLN273.mjs';
@@ -0,0 +1,38 @@
1
+ import * as React from 'react';
2
+
3
+ type TripStatusTone = "confirmed" | "pending" | "processing";
4
+ interface TripHeroData {
5
+ hotelName: string;
6
+ /** Photo de l'hôtel. Fallback dégradé si absente. */
7
+ hotelImage?: string | null;
8
+ city?: string | null;
9
+ address?: string | null;
10
+ /** Dates déjà formatées (ex : "12 juil."). */
11
+ checkinLabel: string;
12
+ checkoutLabel: string;
13
+ nights: number;
14
+ /** Compte à rebours déjà formaté (ex : "Dans 5 jours", "Aujourd'hui"). */
15
+ countdownLabel: string;
16
+ /** Met le compte à rebours en avant (séjour proche). */
17
+ isSoon?: boolean;
18
+ /** Libellé du statut (ex : "Confirmée"). */
19
+ statusLabel?: string | null;
20
+ statusTone?: TripStatusTone;
21
+ /** Prix total déjà formaté (ex : "1 234,00 €"). */
22
+ priceLabel?: string | null;
23
+ dogName?: string | null;
24
+ }
25
+ interface TripHeroCardProps extends Omit<React.HTMLAttributes<HTMLElement>, "children"> {
26
+ trip: TripHeroData;
27
+ /** Actions rapides (bon, itinéraire, annuler…) rendues sous les détails. */
28
+ actions?: React.ReactNode;
29
+ /** Render personnalisé de l'image (ex : next/image). */
30
+ renderImage?: (props: {
31
+ src: string;
32
+ alt: string;
33
+ className: string;
34
+ }) => React.ReactNode;
35
+ }
36
+ declare const TripHeroCard: React.ForwardRefExoticComponent<TripHeroCardProps & React.RefAttributes<HTMLElement>>;
37
+
38
+ export { TripHeroCard, type TripHeroCardProps, type TripHeroData, type TripStatusTone };
@@ -0,0 +1,38 @@
1
+ import * as React from 'react';
2
+
3
+ type TripStatusTone = "confirmed" | "pending" | "processing";
4
+ interface TripHeroData {
5
+ hotelName: string;
6
+ /** Photo de l'hôtel. Fallback dégradé si absente. */
7
+ hotelImage?: string | null;
8
+ city?: string | null;
9
+ address?: string | null;
10
+ /** Dates déjà formatées (ex : "12 juil."). */
11
+ checkinLabel: string;
12
+ checkoutLabel: string;
13
+ nights: number;
14
+ /** Compte à rebours déjà formaté (ex : "Dans 5 jours", "Aujourd'hui"). */
15
+ countdownLabel: string;
16
+ /** Met le compte à rebours en avant (séjour proche). */
17
+ isSoon?: boolean;
18
+ /** Libellé du statut (ex : "Confirmée"). */
19
+ statusLabel?: string | null;
20
+ statusTone?: TripStatusTone;
21
+ /** Prix total déjà formaté (ex : "1 234,00 €"). */
22
+ priceLabel?: string | null;
23
+ dogName?: string | null;
24
+ }
25
+ interface TripHeroCardProps extends Omit<React.HTMLAttributes<HTMLElement>, "children"> {
26
+ trip: TripHeroData;
27
+ /** Actions rapides (bon, itinéraire, annuler…) rendues sous les détails. */
28
+ actions?: React.ReactNode;
29
+ /** Render personnalisé de l'image (ex : next/image). */
30
+ renderImage?: (props: {
31
+ src: string;
32
+ alt: string;
33
+ className: string;
34
+ }) => React.ReactNode;
35
+ }
36
+ declare const TripHeroCard: React.ForwardRefExoticComponent<TripHeroCardProps & React.RefAttributes<HTMLElement>>;
37
+
38
+ export { TripHeroCard, type TripHeroCardProps, type TripHeroData, type TripStatusTone };
@@ -0,0 +1,11 @@
1
+ 'use strict';
2
+
3
+ var chunkBXFU7V2X_js = require('../../chunk-BXFU7V2X.js');
4
+ require('../../chunk-ADIDI7AJ.js');
5
+
6
+
7
+
8
+ Object.defineProperty(exports, "TripHeroCard", {
9
+ enumerable: true,
10
+ get: function () { return chunkBXFU7V2X_js.TripHeroCard; }
11
+ });
@@ -0,0 +1,2 @@
1
+ export { TripHeroCard } from '../../chunk-LO2XNMZO.mjs';
2
+ import '../../chunk-IMKLN273.mjs';
package/dist/index.d.mts CHANGED
@@ -8,6 +8,7 @@ export { Select, SelectOption, SelectProps, selectVariants } from './components/
8
8
  export { Breadcrumb, BreadcrumbItem, BreadcrumbProps, breadcrumbVariants } from './components/Breadcrumb/index.mjs';
9
9
  export { ImageWithFallback, ImageWithFallbackProps } from './components/ImageWithFallback/index.mjs';
10
10
  export { HotelCard, HotelCardData, HotelCardProps } from './components/HotelCard/index.mjs';
11
+ export { DogCard, DogCardData, DogCardProps } from './components/DogCard/index.mjs';
11
12
  export { RadioGroup, RadioGroupItemOption, RadioGroupProps } from './components/RadioGroup/index.mjs';
12
13
  export { Checkbox, CheckboxProps } from './components/Checkbox/index.mjs';
13
14
  export { Toggle, ToggleProps } from './components/Toggle/index.mjs';
@@ -68,6 +69,9 @@ export { FilterAccordion, FilterAccordionItemData, FilterAccordionProps } from '
68
69
  export { RoomRate, RoomRateCancellation, RoomRateCancellationKind, RoomRateDetail, RoomTypeCard, RoomTypeCardProps, RoomTypeCardSkeleton, RoomTypeCardSkeletonProps, RoomTypeData } from './components/RoomTypeCard/index.mjs';
69
70
  import * as react_jsx_runtime from 'react/jsx-runtime';
70
71
  export { SignInCallout, SignInCalloutProps, signInCalloutVariants } from './components/SignInCallout/index.mjs';
72
+ export { SectionHeader, SectionHeaderProps } from './components/SectionHeader/index.mjs';
73
+ export { StatTile, StatTileProps } from './components/StatTile/index.mjs';
74
+ export { TripHeroCard, TripHeroCardProps, TripHeroData, TripStatusTone } from './components/TripHeroCard/index.mjs';
71
75
  export { cn } from './utils/index.mjs';
72
76
  import 'clsx';
73
77