@houssemdi2000/design-system 1.0.0 → 1.2.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.
Files changed (53) hide show
  1. package/dist/__tests__/Button.test.d.ts +1 -0
  2. package/dist/components/Bloc/Bloc.d.ts +10 -0
  3. package/dist/components/Bloc/Bloc.stories.d.ts +10 -0
  4. package/dist/components/Bloc/index.d.ts +1 -0
  5. package/dist/components/Button/Button.d.ts +6 -1
  6. package/dist/components/Button/Button.stories.d.ts +16 -0
  7. package/dist/components/Card/Card.d.ts +8 -2
  8. package/dist/components/Card/Card.stories.d.ts +11 -0
  9. package/dist/components/Center/Center.d.ts +7 -0
  10. package/dist/components/Center/Center.stories.d.ts +7 -0
  11. package/dist/components/Center/index.d.ts +1 -0
  12. package/dist/components/Checkbox/Checkbox.d.ts +15 -0
  13. package/dist/components/Checkbox/Checkbox.stories.d.ts +6 -0
  14. package/dist/components/Checkbox/index.d.ts +1 -0
  15. package/dist/components/Column/Column.d.ts +8 -0
  16. package/dist/components/Column/index.d.ts +1 -0
  17. package/dist/components/Container/Container.d.ts +9 -0
  18. package/dist/components/Container/Container.stories.d.ts +7 -0
  19. package/dist/components/Container/index.d.ts +1 -0
  20. package/dist/components/Divider/Divider.d.ts +8 -0
  21. package/dist/components/Divider/Divider.stories.d.ts +7 -0
  22. package/dist/components/Divider/index.d.ts +1 -0
  23. package/dist/components/Grid/Grid.d.ts +10 -0
  24. package/dist/components/Grid/Grid.stories.d.ts +6 -0
  25. package/dist/components/Grid/index.d.ts +1 -0
  26. package/dist/components/Radio/Radio.d.ts +18 -0
  27. package/dist/components/Radio/Radio.stories.d.ts +6 -0
  28. package/dist/components/Radio/index.d.ts +1 -0
  29. package/dist/components/Row/Row.d.ts +8 -0
  30. package/dist/components/Row/index.d.ts +1 -0
  31. package/dist/components/Select/Select.d.ts +22 -0
  32. package/dist/components/Select/Select.stories.d.ts +7 -0
  33. package/dist/components/Select/index.d.ts +1 -0
  34. package/dist/components/Spacer/Spacer.d.ts +6 -0
  35. package/dist/components/Spacer/Spacer.stories.d.ts +7 -0
  36. package/dist/components/Spacer/index.d.ts +1 -0
  37. package/dist/components/TextField/TextField.d.ts +14 -0
  38. package/dist/components/TextField/TextField.stories.d.ts +9 -0
  39. package/dist/components/TextField/index.d.ts +1 -0
  40. package/dist/components/Toast/ToastContext.d.ts +17 -0
  41. package/dist/components/Toast/index.d.ts +1 -0
  42. package/dist/components/index.d.ts +14 -0
  43. package/dist/index.esm.js +165 -6
  44. package/dist/index.esm.js.map +1 -1
  45. package/dist/index.js +178 -4
  46. package/dist/index.js.map +1 -1
  47. package/dist/stories/Button.d.ts +15 -0
  48. package/dist/stories/Button.stories.d.ts +8 -0
  49. package/dist/stories/Header.d.ts +12 -0
  50. package/dist/stories/Header.stories.d.ts +6 -0
  51. package/dist/stories/Page.d.ts +3 -0
  52. package/dist/stories/Page.stories.d.ts +6 -0
  53. package/package.json +21 -2
@@ -0,0 +1 @@
1
+ import '@testing-library/jest-dom';
@@ -0,0 +1,10 @@
1
+ import React from "react";
2
+ import "./Bloc.css";
3
+ export type BlocLayout = "default" | "center" | "row" | "row-between" | "column" | "sidebar" | "navbar";
4
+ export interface BlocProps {
5
+ children?: React.ReactNode;
6
+ className?: string;
7
+ style?: React.CSSProperties;
8
+ layout?: BlocLayout;
9
+ }
10
+ export declare const Bloc: React.FC<BlocProps>;
@@ -0,0 +1,10 @@
1
+ declare const _default: {
2
+ title: string;
3
+ component: import("react").FC<import("./Bloc").BlocProps>;
4
+ };
5
+ export default _default;
6
+ export declare const Default: () => import("react/jsx-runtime").JSX.Element;
7
+ export declare const CustomColors: () => import("react/jsx-runtime").JSX.Element;
8
+ export declare const Navbar: () => import("react/jsx-runtime").JSX.Element;
9
+ export declare const Sidebar: () => import("react/jsx-runtime").JSX.Element;
10
+ export declare const Center: () => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1 @@
1
+ export * from './Bloc';
@@ -3,8 +3,13 @@ import React from "react";
3
3
  export interface ButtonProps {
4
4
  label: string;
5
5
  onClick?: () => void;
6
- variant?: "primary" | "secondary" | "danger";
6
+ variant?: "primary" | "secondary" | "danger" | "dark" | "light";
7
7
  size?: "small" | "medium" | "large";
8
8
  disabled?: boolean;
9
+ icon?: React.ReactNode;
10
+ iconPosition?: "left" | "right";
11
+ backgroundColor?: string;
12
+ color?: string;
13
+ isLoading?: boolean;
9
14
  }
10
15
  export declare const Button: React.FC<ButtonProps>;
@@ -0,0 +1,16 @@
1
+ declare const _default: {
2
+ title: string;
3
+ component: import("react").FC<import("./Button").ButtonProps>;
4
+ };
5
+ export default _default;
6
+ export declare const Primary: () => import("react/jsx-runtime").JSX.Element;
7
+ export declare const Secondary: () => import("react/jsx-runtime").JSX.Element;
8
+ export declare const Large: () => import("react/jsx-runtime").JSX.Element;
9
+ export declare const Disabled: () => import("react/jsx-runtime").JSX.Element;
10
+ export declare const Dark: () => import("react/jsx-runtime").JSX.Element;
11
+ export declare const Light: () => import("react/jsx-runtime").JSX.Element;
12
+ export declare const Click: () => import("react/jsx-runtime").JSX.Element;
13
+ export declare const WithIcon: () => import("react/jsx-runtime").JSX.Element;
14
+ export declare const WithIconRight: () => import("react/jsx-runtime").JSX.Element;
15
+ export declare const CustomColors: () => import("react/jsx-runtime").JSX.Element;
16
+ export declare const Loading: () => import("react/jsx-runtime").JSX.Element;
@@ -1,6 +1,12 @@
1
1
  import React from "react";
2
+ import "./Card.css";
2
3
  export interface CardProps {
3
- title: string;
4
- content: string;
4
+ title?: string;
5
+ children: React.ReactNode;
6
+ backgroundColor?: string;
7
+ color?: string;
8
+ variant?: "elevated" | "outlined" | "flat";
9
+ padding?: "sm" | "md" | "lg";
10
+ footer?: React.ReactNode;
5
11
  }
6
12
  export declare const Card: React.FC<CardProps>;
@@ -0,0 +1,11 @@
1
+ declare const _default: {
2
+ title: string;
3
+ component: import("react").FC<import("./Card").CardProps>;
4
+ };
5
+ export default _default;
6
+ export declare const DefaultCard: () => import("react/jsx-runtime").JSX.Element;
7
+ export declare const CardWithTitle: () => import("react/jsx-runtime").JSX.Element;
8
+ export declare const GreenCard: () => import("react/jsx-runtime").JSX.Element;
9
+ export declare const WithCustomContent: () => import("react/jsx-runtime").JSX.Element;
10
+ export declare const LargePaddingCard: () => import("react/jsx-runtime").JSX.Element;
11
+ export declare const DarkCard: () => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,7 @@
1
+ import "./Center.css";
2
+ export interface CenterProps {
3
+ children: React.ReactNode;
4
+ backgroundColor?: string;
5
+ color?: string;
6
+ }
7
+ export declare const Center: React.FC<CenterProps>;
@@ -0,0 +1,7 @@
1
+ declare const _default: {
2
+ title: string;
3
+ component: import("react").FC<import("./Center").CenterProps>;
4
+ };
5
+ export default _default;
6
+ export declare const DefaultCenter: () => import("react/jsx-runtime").JSX.Element;
7
+ export declare const DarkCenter: () => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1 @@
1
+ export * from "./Center";
@@ -0,0 +1,15 @@
1
+ import React from "react";
2
+ import "./Checkbox.css";
3
+ export interface CheckboxProps {
4
+ label?: string;
5
+ checked: boolean;
6
+ onChange: (value: boolean) => void;
7
+ disabled?: boolean;
8
+ error?: boolean;
9
+ boxColor?: string;
10
+ checkColor?: string;
11
+ checkedBackground?: string;
12
+ focusShadow?: string;
13
+ style?: React.CSSProperties;
14
+ }
15
+ export declare const Checkbox: React.FC<CheckboxProps>;
@@ -0,0 +1,6 @@
1
+ declare const _default: {
2
+ title: string;
3
+ component: import("react").FC<import("./Checkbox").CheckboxProps>;
4
+ };
5
+ export default _default;
6
+ export declare const Default: () => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1 @@
1
+ export * from "./Checkbox";
@@ -0,0 +1,8 @@
1
+ import React from "react";
2
+ import "./Column.css";
3
+ export interface ColumnProps {
4
+ children?: React.ReactNode;
5
+ className?: "small" | "medium" | "large";
6
+ style?: React.CSSProperties;
7
+ }
8
+ export declare const Column: React.FC<ColumnProps>;
@@ -0,0 +1 @@
1
+ export * from "./Column";
@@ -0,0 +1,9 @@
1
+ import React from "react";
2
+ import "./Container.css";
3
+ export interface ContainerProps {
4
+ children?: React.ReactNode;
5
+ className?: string;
6
+ style?: React.CSSProperties;
7
+ fluid?: boolean;
8
+ }
9
+ export declare const Container: React.FC<ContainerProps>;
@@ -0,0 +1,7 @@
1
+ declare const _default: {
2
+ title: string;
3
+ component: import("react").FC<import("./Container").ContainerProps>;
4
+ };
5
+ export default _default;
6
+ export declare const Default: () => import("react/jsx-runtime").JSX.Element;
7
+ export declare const Custom: () => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1 @@
1
+ export * from "./Container";
@@ -0,0 +1,8 @@
1
+ import React from "react";
2
+ export interface DividerProps {
3
+ color?: string;
4
+ thickness?: number;
5
+ orientation?: "horizontal" | "vertical";
6
+ margin?: number;
7
+ }
8
+ export declare const Divider: React.FC<DividerProps>;
@@ -0,0 +1,7 @@
1
+ declare const _default: {
2
+ title: string;
3
+ component: import("react").FC<import("./Divider").DividerProps>;
4
+ };
5
+ export default _default;
6
+ export declare const Horizontal: () => import("react/jsx-runtime").JSX.Element;
7
+ export declare const Vertical: () => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1 @@
1
+ export * from "./Divider";
@@ -0,0 +1,10 @@
1
+ export interface GridColumn {
2
+ children?: React.ReactNode;
3
+ span?: number;
4
+ style?: React.CSSProperties;
5
+ className?: "small" | "medium" | "large";
6
+ }
7
+ export interface GridProps {
8
+ items: GridColumn[];
9
+ }
10
+ export declare const Grid: React.FC<GridProps>;
@@ -0,0 +1,6 @@
1
+ declare const _default: {
2
+ title: string;
3
+ component: import("react").FC<import("./Grid").GridProps>;
4
+ };
5
+ export default _default;
6
+ export declare const Default: () => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1 @@
1
+ export * from "./Grid";
@@ -0,0 +1,18 @@
1
+ import React from "react";
2
+ import "./Radio.css";
3
+ export interface RadioProps {
4
+ label?: string;
5
+ name: string;
6
+ value: string;
7
+ selectedValue: string;
8
+ onChange: (value: string) => void;
9
+ disabled?: boolean;
10
+ error?: boolean;
11
+ borderColor?: string;
12
+ dotColor?: string;
13
+ checkedBorderColor?: string;
14
+ checkedBackground?: string;
15
+ focusShadow?: string;
16
+ style?: React.CSSProperties;
17
+ }
18
+ export declare const Radio: React.FC<RadioProps>;
@@ -0,0 +1,6 @@
1
+ declare const _default: {
2
+ title: string;
3
+ component: import("react").FC<import("./Radio").RadioProps>;
4
+ };
5
+ export default _default;
6
+ export declare const Default: () => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1 @@
1
+ export * from "./Radio";
@@ -0,0 +1,8 @@
1
+ import React from "react";
2
+ import "./Row.css";
3
+ export interface RowProps {
4
+ children?: React.ReactNode;
5
+ className?: string;
6
+ style?: React.CSSProperties;
7
+ }
8
+ export declare const Row: React.FC<RowProps>;
@@ -0,0 +1 @@
1
+ export * from "./Row";
@@ -0,0 +1,22 @@
1
+ import React from "react";
2
+ import "./Select.css";
3
+ export interface SelectOption {
4
+ value: string | number;
5
+ label: string;
6
+ bgColor?: string;
7
+ textColor?: string;
8
+ }
9
+ export interface SelectProps {
10
+ label?: string;
11
+ value: string | number;
12
+ onChange: (value: string | number) => void;
13
+ options: SelectOption[];
14
+ disabled?: boolean;
15
+ error?: boolean;
16
+ borderColor?: string;
17
+ focusBorder?: string;
18
+ focusShadow?: string;
19
+ errorColor?: string;
20
+ style?: React.CSSProperties;
21
+ }
22
+ export declare const Select: React.FC<SelectProps>;
@@ -0,0 +1,7 @@
1
+ declare const _default: {
2
+ title: string;
3
+ component: import("react").FC<import("./Select").SelectProps>;
4
+ };
5
+ export default _default;
6
+ export declare const Custom: () => import("react/jsx-runtime").JSX.Element;
7
+ export declare const Default: () => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1 @@
1
+ export * from "./Select";
@@ -0,0 +1,6 @@
1
+ import React from "react";
2
+ export interface SpacerProps {
3
+ size?: number;
4
+ direction?: "vertical" | "horizontal";
5
+ }
6
+ export declare const Spacer: React.FC<SpacerProps>;
@@ -0,0 +1,7 @@
1
+ declare const _default: {
2
+ title: string;
3
+ component: import("react").FC<import("./Spacer").SpacerProps>;
4
+ };
5
+ export default _default;
6
+ export declare const Vertical: () => import("react/jsx-runtime").JSX.Element;
7
+ export declare const Horizontal: () => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1 @@
1
+ export * from "./Spacer";
@@ -0,0 +1,14 @@
1
+ import React from "react";
2
+ import "./TextField.css";
3
+ export interface TextFieldProps {
4
+ label?: string;
5
+ value?: string;
6
+ placeholder?: string;
7
+ onChange?: (value: string) => void;
8
+ error?: string;
9
+ disabled?: boolean;
10
+ type?: string;
11
+ fullWidth?: boolean;
12
+ icon?: React.ReactNode;
13
+ }
14
+ export declare const TextField: React.FC<TextFieldProps>;
@@ -0,0 +1,9 @@
1
+ declare const _default: {
2
+ title: string;
3
+ component: import("react").FC<import("./TextField").TextFieldProps>;
4
+ };
5
+ export default _default;
6
+ export declare const Default: () => import("react/jsx-runtime").JSX.Element;
7
+ export declare const WithError: () => import("react/jsx-runtime").JSX.Element;
8
+ export declare const Disabled: () => import("react/jsx-runtime").JSX.Element;
9
+ export declare const WithIcon: () => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1 @@
1
+ export * from "./TextField";
@@ -0,0 +1,17 @@
1
+ import React from "react";
2
+ import "./Toast.css";
3
+ export type ToastVariant = "success" | "error" | "warning" | "info";
4
+ export interface Toast {
5
+ id: string;
6
+ message: string;
7
+ variant?: ToastVariant;
8
+ duration?: number;
9
+ }
10
+ interface ToastContextType {
11
+ addToast: (msg: string, variant?: ToastVariant, duration?: number) => void;
12
+ }
13
+ export declare const useToast: () => ToastContextType;
14
+ export declare const ToastProvider: React.FC<{
15
+ children: React.ReactNode;
16
+ }>;
17
+ export {};
@@ -0,0 +1 @@
1
+ export * from "./ToastContext";
@@ -1 +1,15 @@
1
1
  export * from './Button';
2
+ export * from './Center';
3
+ export * from './Card';
4
+ export * from './Bloc';
5
+ export * from './Container';
6
+ export * from './Row';
7
+ export * from './Column';
8
+ export * from './Grid';
9
+ export * from './Spacer';
10
+ export * from './Divider';
11
+ export * from './Checkbox';
12
+ export * from './TextField';
13
+ export * from './Radio';
14
+ export * from './Select';
15
+ export * from './Toast';
package/dist/index.esm.js CHANGED
@@ -1,10 +1,11 @@
1
- import { jsx, Fragment } from 'react/jsx-runtime';
1
+ import { jsx, Fragment, jsxs } from 'react/jsx-runtime';
2
+ import { createContext, useContext, useState } from 'react';
2
3
 
3
4
  function styleInject(css, ref) {
4
5
  if ( ref === void 0 ) ref = {};
5
6
  var insertAt = ref.insertAt;
6
7
 
7
- if (typeof document === 'undefined') { return; }
8
+ if (!css || typeof document === 'undefined') { return; }
8
9
 
9
10
  var head = document.head || document.getElementsByTagName('head')[0];
10
11
  var style = document.createElement('style');
@@ -27,12 +28,170 @@ function styleInject(css, ref) {
27
28
  }
28
29
  }
29
30
 
30
- var css_248z = ".btn{border:none;border-radius:4px;cursor:pointer;font-size:16px;font-weight:500;padding:10px 20px;transition:all .3s ease}.btn-primary{background-color:#007bff;color:#fff}.btn-primary:hover{background-color:#0056b3}.btn-secondary{background-color:#6c757d;color:#fff}.btn-danger{background-color:#dc3545;color:#fff}.btn-small{font-size:14px;padding:5px 10px}.btn-medium{font-size:16px;padding:10px 20px}.btn-large{font-size:18px;padding:15px 30px}.btn:disabled{cursor:not-allowed;opacity:.5}";
31
+ var css_248z$b = ".btn{align-items:center;border:none;border-radius:4px;cursor:pointer;display:inline-flex;font-size:16px;font-weight:500;justify-content:center;padding:10px 20px;transition:all .3s ease}.btn-primary{background-color:#007bff;color:#fff}.btn-primary:hover{background-color:#0056b3}.btn-secondary{background-color:#6c757d;color:#fff}.btn-danger{background-color:#dc3545;color:#fff}.btn-dark{background-color:#141617;color:#fff}.btn-light{background-color:#f8f9fa;color:#000}.btn-small{font-size:14px;padding:5px 10px}.btn-medium{font-size:16px;padding:10px 20px}.btn-large{font-size:18px;padding:15px 30px}.btn:disabled{cursor:not-allowed;opacity:.5}.btn-left-icon{margin-right:8px}.btn-left-icon,.btn-right-icon{align-items:center;display:inline-flex}.btn-right-icon{margin-left:8px}.btn-spinner{animation:spin .7s linear infinite;border:3px solid hsla(0,0%,100%,.4);border-radius:50%;border-top-color:#fff;display:inline-block;height:12px;margin-left:5px;width:12px}@keyframes spin{to{transform:rotate(1turn)}}.btn-loading{cursor:not-allowed;position:relative}.btn-loading span,.btn-loading svg{opacity:0}.btn-loading>:not(.btn-spinner){visibility:hidden}";
32
+ styleInject(css_248z$b);
33
+
34
+ const Button = ({ label, onClick, variant = "primary", size = "medium", disabled = false, icon, iconPosition = "left", backgroundColor, color, isLoading = false, }) => {
35
+ return (jsx(Fragment, { children: jsxs("button", { className: `btn btn-${variant} btn-${size}`, onClick: onClick, disabled: disabled || isLoading, style: { backgroundColor, color }, children: [icon && iconPosition === "left" && jsx("span", { className: "btn-left-icon", children: icon }), label, icon && iconPosition === "right" && jsx("span", { className: "btn-right-icon", children: icon }), isLoading && jsx("span", { className: "btn-spinner" })] }) }));
36
+ };
37
+
38
+ var css_248z$a = ".center{align-items:center;display:flex;justify-content:center}";
39
+ styleInject(css_248z$a);
40
+
41
+ const Center = ({ children, backgroundColor = 'white', color = 'black' }) => {
42
+ return jsx("div", { className: "center", style: { backgroundColor, color }, children: children });
43
+ };
44
+
45
+ var css_248z$9 = ".card{background:#fff;border-radius:12px;display:flex;flex-direction:column;gap:12px;transition:box-shadow .2s ease,transform .2s ease}.card-elevated{box-shadow:0 2px 4px rgba(0,0,0,.08),0 8px 16px rgba(0,0,0,.06)}.card-elevated:hover{box-shadow:0 4px 8px rgba(0,0,0,.1),0 12px 24px rgba(0,0,0,.08);transform:translateY(-2px)}.card-outlined{border:1px solid #e5e7eb}.card-flat{background:transparent;border:none}.card-padding-sm{padding:8px}.card-padding-md{padding:16px}.card-padding-lg{padding:24px}.card-header{font-size:1.25rem;font-weight:600;margin-bottom:4px}.card-body{font-size:.95rem;line-height:1.5}.card-footer{border-top:1px solid #ececec;color:#555;font-size:.9rem;margin-top:8px;padding-top:8px}";
46
+ styleInject(css_248z$9);
47
+
48
+ const Card = ({ title, children, footer, backgroundColor, color, variant = "elevated", padding = "md", }) => {
49
+ return (jsxs("div", { className: `card card-${variant} card-padding-${padding}`, style: { backgroundColor, color }, children: [title && jsx("div", { className: "card-header", children: title }), jsx("div", { className: "card-body", children: children }), footer && jsx("div", { className: "card-footer", children: footer })] }));
50
+ };
51
+
52
+ var css_248z$8 = ".bloc{box-sizing:border-box;max-width:100%;padding:16px;width:100%}@media (max-width:600px){.bloc{border-radius:6px;padding:12px}}@media (max-width:900px){.bloc{padding:14px}}";
53
+ styleInject(css_248z$8);
54
+
55
+ const Bloc = ({ children, className = "", style = {}, layout = "default", }) => {
56
+ const layoutStyles = (() => {
57
+ switch (layout) {
58
+ case "center":
59
+ return { display: "flex", justifyContent: "center", alignItems: "center" };
60
+ case "row":
61
+ return { display: "flex", flexDirection: "row", alignItems: "center" };
62
+ case "row-between":
63
+ return { display: "flex", flexDirection: "row", justifyContent: "space-between", alignItems: "center" };
64
+ case "column":
65
+ return { display: "flex", flexDirection: "column", alignItems: "flex-start" };
66
+ case "sidebar":
67
+ return { display: "flex", flexDirection: "column", alignItems: "flex-start", gap: "12px" };
68
+ case "navbar":
69
+ return { display: "flex", flexDirection: "row", justifyContent: "space-between", alignItems: "center", padding: "12px 20px" };
70
+ default:
71
+ return {};
72
+ }
73
+ })();
74
+ return (jsx("div", { className: `bloc ${className}`, style: Object.assign(Object.assign({}, layoutStyles), style), children: children }));
75
+ };
76
+
77
+ var css_248z$7 = ".container{margin:0 auto;padding:0 16px;width:100%}@media (min-width:576px){.container{max-width:540px}}@media (min-width:768px){.container{max-width:720px}}@media (min-width:992px){.container{max-width:960px}}@media (min-width:1200px){.container{max-width:1200px}}.container-fluid{max-width:100%}";
78
+ styleInject(css_248z$7);
79
+
80
+ const Container = ({ children, className = "", style = {}, fluid = false }) => {
81
+ return (jsx("div", { className: `container ${fluid ? "container-fluid" : ""} ${className}`, style: style, children: children }));
82
+ };
83
+
84
+ var css_248z$6 = ".row{align-items:stretch;box-sizing:border-box;display:flex;flex-direction:row;gap:16px}@media (max-width:768px){.row{flex-direction:column}}";
85
+ styleInject(css_248z$6);
86
+
87
+ const Row = ({ children, className = "", style = {} }) => {
88
+ return jsx("div", { className: `row ${className}`, style: Object.assign({}, style), children: children });
89
+ };
90
+
91
+ var css_248z$5 = ".col,.column{box-sizing:border-box;flex:1 1 0;min-width:0;padding:8px}.col.small{max-width:20%}.col.medium{max-width:50%}.col.large{max-width:100%}.col>*,.column>*{box-sizing:border-box;max-width:100%;overflow-wrap:anywhere;word-break:break-word}.col img,.column img{display:block;height:auto;max-width:100%}@media (max-width:768px){.col,.col.large,.col.medium,.col.small,.column{flex:none;max-width:100%;width:100%}}";
92
+ styleInject(css_248z$5);
93
+
94
+ const Column = ({ children, className = "", style = {} }) => {
95
+ return (jsx("div", { className: `col ${className}`, style: Object.assign({}, style), children: children }));
96
+ };
97
+
98
+ const Grid = ({ items }) => {
99
+ return (jsx(Row, { children: items.map((item, index) => (jsx(Column, { className: item.className, style: Object.assign({}, item.style), children: item.children }, index))) }));
100
+ };
101
+
102
+ const Spacer = ({ size = 16, direction = "vertical" }) => {
103
+ const style = direction === "vertical"
104
+ ? { height: size }
105
+ : { width: size, display: "inline-block" };
106
+ return jsx("div", { style: style });
107
+ };
108
+
109
+ const Divider = ({ color = "#e0e0e0", thickness = 1, orientation = "horizontal", margin = 8, }) => {
110
+ const styles = orientation === "horizontal"
111
+ ? {
112
+ width: "100%",
113
+ height: thickness,
114
+ backgroundColor: color,
115
+ margin: `${margin}px 0`,
116
+ }
117
+ : {
118
+ width: thickness,
119
+ height: "100%",
120
+ backgroundColor: color,
121
+ margin: `0 ${margin}px`,
122
+ };
123
+ return jsx("div", { style: styles });
124
+ };
125
+
126
+ var css_248z$4 = ".checkbox-container{align-items:center;cursor:pointer;display:flex;font-family:sans-serif;gap:8px;user-select:none}.checkbox-container.disabled{cursor:not-allowed;opacity:.5}.checkbox-container input{appearance:none;-webkit-appearance:none;height:0;position:absolute;width:0}.checkbox-box{border:2px solid var(--cb-box-color,#777);border-radius:4px;display:inline-block;height:18px;position:relative;transition:.2s ease;width:18px}.checkbox-container input:checked+.checkbox-box{background-color:var(--cb-checked-bg,#007bff);border-color:var(--cb-checked-bg,#007bff)}.checkbox-container input:checked+.checkbox-box:after{border-width:medium;border-bottom:2px solid var(--cb-check-color,#fff);border-left:0 solid var(--cb-check-color,#fff);border-right:2px solid var(--cb-check-color,#fff);border-top:0 solid var(--cb-check-color,#fff);content:\"\";height:10px;left:5px;position:absolute;top:1px;transform:rotate(45deg);width:5px}.checkbox-container input:focus+.checkbox-box{box-shadow:0 0 4px var(--cb-focus-shadow,rgba(0,123,255,.4))}.checkbox-box.error{border-color:#d93025!important}.checkbox-label{font-size:14px}";
127
+ styleInject(css_248z$4);
128
+
129
+ const Checkbox = ({ label, checked, onChange, disabled = false, error = false, boxColor = "#777", checkColor = "#fff", checkedBackground = "#007bff", focusShadow = "rgba(0, 123, 255, 0.4)", style, }) => {
130
+ return (jsxs("label", { className: `checkbox-container ${disabled ? "disabled" : ""}`, style: {
131
+ ["--cb-box-color"]: boxColor,
132
+ ["--cb-check-color"]: checkColor,
133
+ ["--cb-checked-bg"]: checkedBackground,
134
+ ["--cb-focus-shadow"]: focusShadow,
135
+ }, children: [jsx("input", { type: "checkbox", checked: checked, disabled: disabled, onChange: (e) => onChange(e.target.checked) }), jsx("span", { className: `checkbox-box ${error ? "error" : ""}` }), label && jsx("span", { className: "checkbox-label", children: label })] }));
136
+ };
137
+
138
+ var css_248z$3 = ".textfield{display:flex;flex-direction:column;font-family:sans-serif;gap:6px}.fullWidth{width:100%}.textfield-label{color:#333;font-size:14px;font-weight:600}.textfield-input{border:1px solid #ccc;border-radius:6px;font-size:14px;padding:10px 12px;transition:.2s ease}.textfield-input:focus{border-color:#4c00ff;box-shadow:0 0 2px #007bff;outline:none}.textfield-input.error{background-color:#fff5f5;border-color:#d93025}.textfield-error{background-color:#f44343;color:#ece6e6;font-size:12px;padding:8px}.textfield-icon{position:absolute;right:45px;top:45px;width:2px}";
139
+ styleInject(css_248z$3);
140
+
141
+ const TextField = ({ label, value = "", placeholder, onChange, error, disabled = false, type = "text", fullWidth = true, icon, }) => {
142
+ return (jsxs("div", { className: `textfield ${fullWidth ? "fullWidth" : ""}`, children: [label && jsx("label", { className: "textfield-label", children: label }), jsx("input", { type: type, className: `textfield-input ${error ? "error" : ""}`, value: value, placeholder: placeholder, disabled: disabled, onChange: (e) => onChange && onChange(e.target.value) }), icon && jsx("div", { className: "textfield-icon", children: icon }), error && jsx("p", { className: "textfield-error", children: error })] }));
143
+ };
144
+
145
+ var css_248z$2 = ".radio-container{align-items:center;cursor:pointer;display:flex;font-family:sans-serif;gap:8px}.radio-container input{display:none}.radio-circle{align-items:center;border:2px solid var(--rd-border-color,#777);border-radius:50%;display:flex;height:18px;justify-content:center;position:relative;transition:.2s ease;width:18px}.radio-circle:after{background-color:var(--rd-dot-color,#fff);border-radius:50%;content:\"\";height:10px;opacity:0;transform:scale(.4);transition:.2s ease;width:10px}.radio-container input:checked+.radio-circle{background-color:var(--rd-checked-bg,#007bff);border-color:var(--rd-checked-border,#007bff)}.radio-container input:checked+.radio-circle:after{opacity:1;transform:scale(1)}.radio-circle.error{border-color:#d93025!important}.radio-label{font-size:14px}.disabled{cursor:not-allowed;opacity:.6}";
146
+ styleInject(css_248z$2);
147
+
148
+ const Radio = ({ label, name, value, selectedValue, onChange, disabled = false, error = false, borderColor = "#777", dotColor = "#fff", checkedBorderColor = "#007bff", checkedBackground = error ? "#d93025" : "#007bff", focusShadow = "rgba(0, 123, 255, 0.4)", style, }) => {
149
+ const checked = selectedValue === value;
150
+ return (jsxs("label", { className: `radio-container ${disabled ? "disabled" : ""}`, style: Object.assign(Object.assign({}, style), { ["--rd-border-color"]: borderColor, ["--rd-dot-color"]: dotColor, ["--rd-checked-border"]: checkedBorderColor, ["--rd-checked-bg"]: checkedBackground, ["--rd-focus-shadow"]: focusShadow }), children: [jsx("input", { type: "radio", name: name, value: value, disabled: disabled, checked: checked, onChange: () => onChange(value) }), jsx("span", { className: `radio-circle ${error ? "error" : ""}` }), label && jsx("span", { className: "radio-label", children: label })] }));
151
+ };
152
+
153
+ var css_248z$1 = ".select-wrapper{display:flex;flex-direction:column;font-family:sans-serif;gap:4px}.select-label{font-size:14px;font-weight:500}.select-container{position:relative;width:100%}.select-container select{background:#fff;border:1px solid var(--sel-border,#ccc);border-radius:6px;cursor:pointer;font-size:15px;padding:10px 12px;transition:all .2s ease;width:100%}.select-container select:focus{border-color:var(--sel-focus-border,#007bff);box-shadow:0 0 0 2px var(--sel-focus-shadow,rgba(0,123,255,.4));outline:none}.select-container.disabled select{background:#f2f2f2;cursor:not-allowed;opacity:.6}.select-container.error select{border-color:var(--sel-error,red)}.select-container.error select:focus{border-color:var(--sel-error,red);box-shadow:0 0 0 2px rgba(230,57,70,.35)}";
154
+ styleInject(css_248z$1);
155
+
156
+ const Select = ({ label, value, onChange, options, disabled = false, error = false, borderColor = "#ccc", focusBorder = "#007bff", focusShadow = "rgba(0, 123, 255, 0.4)", errorColor = "#e63946", style, }) => {
157
+ return (jsxs("div", { className: "select-wrapper", style: style, children: [label && jsx("label", { className: "select-label", children: label }), jsx("div", { className: `select-container ${disabled ? "disabled" : ""} ${error ? "error" : ""}`, children: jsx("select", { value: value, disabled: disabled, onChange: (e) => onChange(e.target.value), style: {
158
+ ["--sel-border"]: borderColor,
159
+ ["--sel-focus-border"]: focusBorder,
160
+ ["--sel-focus-shadow"]: focusShadow,
161
+ ["--sel-error"]: errorColor,
162
+ }, children: options.map((opt) => (jsx("option", { value: opt.value, style: {
163
+ backgroundColor: opt.bgColor,
164
+ color: opt.textColor,
165
+ }, children: opt.label }, opt.value))) }) })] }));
166
+ };
167
+
168
+ var css_248z = ".toast-container{display:flex;flex-direction:column;gap:10px;position:fixed;right:20px;top:20px;z-index:9999}.toast{align-items:center;animation:toast-slide .3s ease,toast-fadeout .3s ease forwards;animation-delay:0s,2.8s;border-radius:8px;box-shadow:0 4px 8px rgba(0,0,0,.2);color:#fff;display:flex;font-size:14px;justify-content:space-between;max-width:320px;min-width:260px;padding:12px 16px;position:relative}.toast-success{background-color:#2ecc71}.toast-error{background-color:#e74c3c}.toast-warning{background-color:#f1c40f;color:#333}.toast-info{background-color:#3498db}.toast-close{background:none;border:none;color:inherit;cursor:pointer;font-size:16px}@keyframes toast-slide{0%{opacity:0;transform:translateX(40px)}to{opacity:1;transform:translateX(0)}}@keyframes toast-fadeout{0%{opacity:1}to{opacity:0}}";
31
169
  styleInject(css_248z);
32
170
 
33
- const Button = ({ label, onClick, variant = "primary", size = "medium", disabled = false, }) => {
34
- return (jsx(Fragment, { children: jsx("button", { className: `btn btn-${variant} btn-${size}`, onClick: onClick, disabled: disabled, children: label }) }));
171
+ const ToastContext = createContext(undefined);
172
+ const useToast = () => {
173
+ const ctx = useContext(ToastContext);
174
+ if (!ctx)
175
+ throw new Error("useToast must be used inside <ToastProvider>");
176
+ return ctx;
177
+ };
178
+ const ToastProvider = ({ children }) => {
179
+ const [toasts, setToasts] = useState([]);
180
+ function addToast(message, variant = "info", duration = 3000) {
181
+ const toast = {
182
+ id: Date.now().toString(),
183
+ message,
184
+ variant,
185
+ duration,
186
+ };
187
+ setToasts((prev) => [...prev, toast]);
188
+ // auto-remove
189
+ setTimeout(() => {
190
+ setToasts((prev) => prev.filter((t) => t.id !== toast.id));
191
+ }, duration);
192
+ }
193
+ return (jsxs(ToastContext.Provider, { value: { addToast }, children: [children, jsx("div", { className: "toast-container", children: toasts.map((t) => (jsxs("div", { className: `toast toast-${t.variant}`, children: [jsx("span", { children: t.message }), jsx("button", { className: "toast-close", onClick: () => setToasts((prev) => prev.filter((x) => x.id !== t.id)), children: "\u2715" })] }, t.id))) })] }));
35
194
  };
36
195
 
37
- export { Button };
196
+ export { Bloc, Button, Card, Center, Checkbox, Column, Container, Divider, Grid, Radio, Row, Select, Spacer, TextField, ToastProvider, useToast };
38
197
  //# sourceMappingURL=index.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.esm.js","sources":["../node_modules/style-inject/dist/style-inject.es.js","../src/components/Button/Button.tsx"],"sourcesContent":["function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n","import \"./Button.css\";\r\nimport React from \"react\";\r\n\r\n\r\nexport interface ButtonProps {\r\n label: string;\r\n onClick?: () => void;\r\n variant?: \"primary\" | \"secondary\" | \"danger\";\r\n size?: \"small\" | \"medium\" | \"large\";\r\n disabled?: boolean;\r\n}\r\n\r\nexport const Button: React.FC<ButtonProps> = ({\r\n label,\r\n onClick,\r\n variant = \"primary\",\r\n size = \"medium\",\r\n disabled = false,\r\n}) => {\r\n return (\r\n <>\r\n <button\r\n className={`btn btn-${variant} btn-${size}`}\r\n onClick={onClick}\r\n disabled={disabled}\r\n >\r\n {label}\r\n </button>\r\n </>\r\n );\r\n};\r\n"],"names":["_jsx"],"mappings":";;AAAA,SAAS,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE;AAC/B,EAAE,KAAK,GAAG,KAAK,MAAM,GAAG,GAAG,GAAG,EAAE;AAChC,EAAE,IAAI,QAAQ,GAAG,GAAG,CAAC,QAAQ;;AAE7B,EAAE,IAAY,OAAO,QAAQ,KAAK,WAAW,EAAE,EAAE,OAAO,CAAC;;AAEzD,EAAE,IAAI,IAAI,GAAG,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AACtE,EAAE,IAAI,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC;AAC7C,EAAE,KAAK,CAAC,IAAI,GAAG,UAAU;;AAEzB,EAAE,IAAI,QAAQ,KAAK,KAAK,EAAE;AAC1B,IAAI,IAAI,IAAI,CAAC,UAAU,EAAE;AACzB,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC;AAC/C,IAAI,CAAC,MAAM;AACX,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;AAC7B,IAAI;AACJ,EAAE,CAAC,MAAM;AACT,IAAI,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;AAC3B,EAAE;;AAEF,EAAE,IAAI,KAAK,CAAC,UAAU,EAAE;AACxB,IAAI,KAAK,CAAC,UAAU,CAAC,OAAO,GAAG,GAAG;AAClC,EAAE,CAAC,MAAM;AACT,IAAI,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;AACnD,EAAE;AACF;;;;;MCba,MAAM,GAA0B,CAAC,EAC5C,KAAK,EACL,OAAO,EACP,OAAO,GAAG,SAAS,EACnB,IAAI,GAAG,QAAQ,EACf,QAAQ,GAAG,KAAK,GACjB,KAAI;IACH,QACEA,0BACEA,GAAA,CAAA,QAAA,EAAA,EACE,SAAS,EAAE,CAAA,QAAA,EAAW,OAAO,CAAA,KAAA,EAAQ,IAAI,CAAA,CAAE,EAC3C,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,QAAQ,YAEjB,KAAK,EAAA,CACC,EAAA,CACR;AAEP;;;;","x_google_ignoreList":[0]}
1
+ {"version":3,"file":"index.esm.js","sources":["../node_modules/style-inject/dist/style-inject.es.js","../src/components/Button/Button.tsx","../src/components/Center/Center.tsx","../src/components/Card/Card.tsx","../src/components/Bloc/Bloc.tsx","../src/components/Container/Container.tsx","../src/components/Row/Row.tsx","../src/components/Column/Column.tsx","../src/components/Grid/Grid.tsx","../src/components/Spacer/Spacer.tsx","../src/components/Divider/Divider.tsx","../src/components/Checkbox/Checkbox.tsx","../src/components/TextField/TextField.tsx","../src/components/Radio/Radio.tsx","../src/components/Select/Select.tsx","../src/components/Toast/ToastContext.tsx"],"sourcesContent":["function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n","import \"./Button.css\";\r\nimport React from \"react\";\r\n\r\n\r\nexport interface ButtonProps {\r\n label: string;\r\n onClick?: () => void;\r\n variant?: \"primary\" | \"secondary\" | \"danger\" | \"dark\" | \"light\";\r\n size?: \"small\" | \"medium\" | \"large\";\r\n disabled?: boolean;\r\n icon?: React.ReactNode;\r\n iconPosition?: \"left\" | \"right\";\r\n backgroundColor?: string;\r\n color?: string;\r\n isLoading?: boolean;\r\n}\r\n\r\nexport const Button: React.FC<ButtonProps> = ({\r\n label,\r\n onClick,\r\n variant = \"primary\",\r\n size = \"medium\",\r\n disabled = false,\r\n icon,\r\n iconPosition = \"left\",\r\n backgroundColor,\r\n color,\r\n isLoading = false,\r\n}) => {\r\n return (\r\n <>\r\n <button\r\n className={`btn btn-${variant} btn-${size}`}\r\n onClick={onClick}\r\n disabled={disabled || isLoading}\r\n style={{ backgroundColor, color }}\r\n >\r\n {icon && iconPosition === \"left\" && <span className=\"btn-left-icon\">{icon}</span>}\r\n {label}\r\n {icon && iconPosition === \"right\" && <span className=\"btn-right-icon\">{icon}</span>}\r\n {isLoading && <span className=\"btn-spinner\"></span>}\r\n </button>\r\n </>\r\n );\r\n};\r\n","import \"./Center.css\"\r\n\r\nexport interface CenterProps {\r\n children: React.ReactNode;\r\n backgroundColor?: string;\r\n color?: string;\r\n}\r\n\r\nexport const Center: React.FC<CenterProps> = ({ children, backgroundColor = 'white', color = 'black' }) => {\r\n return <div className=\"center\" style={{ backgroundColor, color}}>{children}</div>;\r\n};\r\n","import React from \"react\";\r\nimport \"./Card.css\";\r\n\r\nexport interface CardProps {\r\n title?: string;\r\n children: React.ReactNode;\r\n backgroundColor?: string;\r\n color?: string;\r\n variant?: \"elevated\" | \"outlined\" | \"flat\";\r\n padding?: \"sm\" | \"md\" | \"lg\";\r\n footer?: React.ReactNode;\r\n}\r\n\r\nexport const Card: React.FC<CardProps> = ({\r\n title,\r\n children,\r\n footer,\r\n backgroundColor,\r\n color,\r\n variant = \"elevated\",\r\n padding = \"md\",\r\n}) => {\r\n return (\r\n <div\r\n className={`card card-${variant} card-padding-${padding}`}\r\n style={{ backgroundColor, color }}\r\n >\r\n {title && <div className=\"card-header\">{title}</div>}\r\n <div className=\"card-body\">{children}</div>\r\n {footer && <div className=\"card-footer\">{footer}</div>}\r\n </div>\r\n );\r\n};\r\n","import React from \"react\";\r\nimport \"./Bloc.css\";\r\n\r\nexport type BlocLayout =\r\n | \"default\"\r\n | \"center\"\r\n | \"row\"\r\n | \"row-between\"\r\n | \"column\"\r\n | \"sidebar\"\r\n | \"navbar\";\r\n\r\nexport interface BlocProps {\r\n children?: React.ReactNode;\r\n className?: string;\r\n style?: React.CSSProperties;\r\n layout?: BlocLayout;\r\n}\r\n\r\nexport const Bloc: React.FC<BlocProps> = ({\r\n children,\r\n className = \"\",\r\n style = {},\r\n layout = \"default\",\r\n}) => {\r\n const layoutStyles: React.CSSProperties = (() => {\r\n switch (layout) {\r\n case \"center\":\r\n return { display: \"flex\", justifyContent: \"center\", alignItems: \"center\" };\r\n case \"row\":\r\n return { display: \"flex\", flexDirection: \"row\", alignItems: \"center\" };\r\n case \"row-between\":\r\n return { display: \"flex\", flexDirection: \"row\", justifyContent: \"space-between\", alignItems: \"center\" };\r\n case \"column\":\r\n return { display: \"flex\", flexDirection: \"column\", alignItems: \"flex-start\" };\r\n case \"sidebar\":\r\n return { display: \"flex\", flexDirection: \"column\", alignItems: \"flex-start\", gap: \"12px\" };\r\n case \"navbar\":\r\n return { display: \"flex\", flexDirection: \"row\", justifyContent: \"space-between\", alignItems: \"center\", padding: \"12px 20px\" };\r\n default:\r\n return {};\r\n }\r\n })();\r\n\r\n return (\r\n <div className={`bloc ${className}`} style={{ ...layoutStyles, ...style }}>\r\n {children}\r\n </div>\r\n );\r\n};\r\n","import React from \"react\";\r\nimport \"./Container.css\";\r\n\r\nexport interface ContainerProps {\r\n children?: React.ReactNode;\r\n className?: string;\r\n style?: React.CSSProperties;\r\n fluid?: boolean;\r\n}\r\n\r\nexport const Container: React.FC<ContainerProps> = ({ children, className = \"\", style = {}, fluid = false }) => {\r\n return (\r\n <div className={`container ${fluid ? \"container-fluid\" : \"\"} ${className}`} style={style}>\r\n {children}\r\n </div>\r\n );\r\n};\r\n","import React from \"react\";\r\nimport \"./Row.css\";\r\n\r\nexport interface RowProps {\r\n children?: React.ReactNode;\r\n className?: string;\r\n style?: React.CSSProperties;\r\n}\r\n\r\nexport const Row: React.FC<RowProps> = ({\r\n children,\r\n className = \"\",\r\n style = {}\r\n}) => {\r\n return <div className={`row ${className}`} style={{...style}}>{children}</div>;\r\n};\r\n","import React from \"react\";\r\nimport \"./Column.css\";\r\n\r\nexport interface ColumnProps {\r\n children?: React.ReactNode;\r\n className?: \"small\" | \"medium\" | \"large\";\r\n style?: React.CSSProperties;\r\n}\r\n\r\nexport const Column: React.FC<ColumnProps> = ({ children, className = \"\", style = {}}) => {\r\n return (\r\n <div className={`col ${className}`} style={{...style}}>\r\n {children}\r\n </div>\r\n );\r\n};\r\n","import { Column } from \"../Column\";\r\nimport { Row } from \"../Row\";\r\n\r\nexport interface GridColumn {\r\n children?: React.ReactNode;\r\n span?: number;\r\n style?: React.CSSProperties;\r\n className?: \"small\" | \"medium\" | \"large\";\r\n}\r\n\r\nexport interface GridProps {\r\n items: GridColumn[];\r\n}\r\n\r\nexport const Grid: React.FC<GridProps> = ({ items }) => {\r\n\r\n return (\r\n <Row>\r\n {items.map((item: GridColumn, index: number) => (\r\n <Column\r\n key={index}\r\n className={item.className}\r\n style={{ ...item.style }}\r\n >\r\n {item.children}\r\n </Column>\r\n ))}\r\n </Row>\r\n );\r\n};\r\n","import React from \"react\";\r\n\r\nexport interface SpacerProps {\r\n size?: number;\r\n direction?: \"vertical\" | \"horizontal\";\r\n}\r\n\r\nexport const Spacer: React.FC<SpacerProps> = ({\r\n size = 16,\r\n direction = \"vertical\"\r\n}) => {\r\n const style: React.CSSProperties =\r\n direction === \"vertical\"\r\n ? { height: size }\r\n : { width: size, display: \"inline-block\" };\r\n\r\n return <div style={style} />;\r\n};\r\n","import React from \"react\";\r\n\r\nexport interface DividerProps {\r\n color?: string;\r\n thickness?: number;\r\n orientation?: \"horizontal\" | \"vertical\";\r\n margin?: number;\r\n}\r\n\r\nexport const Divider: React.FC<DividerProps> = ({\r\n color = \"#e0e0e0\",\r\n thickness = 1,\r\n orientation = \"horizontal\",\r\n margin = 8,\r\n}) => {\r\n const styles: React.CSSProperties =\r\n orientation === \"horizontal\"\r\n ? {\r\n width: \"100%\",\r\n height: thickness,\r\n backgroundColor: color,\r\n margin: `${margin}px 0`,\r\n }\r\n : {\r\n width: thickness,\r\n height: \"100%\",\r\n backgroundColor: color,\r\n margin: `0 ${margin}px`,\r\n };\r\n\r\n return <div style={styles} />;\r\n};\r\n","import React from \"react\";\r\nimport \"./Checkbox.css\";\r\n\r\nexport interface CheckboxProps {\r\n label?: string;\r\n checked: boolean;\r\n onChange: (value: boolean) => void;\r\n disabled?: boolean;\r\n error?: boolean;\r\n\r\n // Custom colors\r\n boxColor?: string;\r\n checkColor?: string;\r\n checkedBackground?: string;\r\n focusShadow?: string;\r\n\r\n style?: React.CSSProperties;\r\n}\r\n\r\nexport const Checkbox: React.FC<CheckboxProps> = ({\r\n label,\r\n checked,\r\n onChange,\r\n disabled = false,\r\n error = false,\r\n\r\n boxColor = \"#777\",\r\n checkColor = \"#fff\",\r\n checkedBackground = \"#007bff\",\r\n focusShadow = \"rgba(0, 123, 255, 0.4)\",\r\n\r\n style,\r\n}) => {\r\n return (\r\n <label\r\n className={`checkbox-container ${disabled ? \"disabled\" : \"\"}`}\r\n style={{\r\n [\"--cb-box-color\" as any]: boxColor,\r\n [\"--cb-check-color\" as any]: checkColor,\r\n [\"--cb-checked-bg\" as any]: checkedBackground,\r\n [\"--cb-focus-shadow\" as any]: focusShadow,\r\n }}\r\n >\r\n <input\r\n type=\"checkbox\"\r\n checked={checked}\r\n disabled={disabled}\r\n onChange={(e) => onChange(e.target.checked)}\r\n />\r\n\r\n <span className={`checkbox-box ${error ? \"error\" : \"\"}`} />\r\n\r\n {label && <span className=\"checkbox-label\">{label}</span>}\r\n </label>\r\n );\r\n};\r\n","import React from \"react\";\r\nimport \"./TextField.css\";\r\n\r\nexport interface TextFieldProps {\r\n label?: string;\r\n value?: string;\r\n placeholder?: string;\r\n onChange?: (value: string) => void;\r\n error?: string;\r\n disabled?: boolean;\r\n type?: string;\r\n fullWidth?: boolean;\r\n icon?: React.ReactNode;\r\n}\r\n\r\nexport const TextField: React.FC<TextFieldProps> = ({\r\n label,\r\n value = \"\",\r\n placeholder,\r\n onChange,\r\n error,\r\n disabled = false,\r\n type = \"text\",\r\n fullWidth = true,\r\n icon,\r\n}) => {\r\n return (\r\n <div className={`textfield ${fullWidth ? \"fullWidth\" : \"\"}`}>\r\n {label && <label className=\"textfield-label\">{label}</label>}\r\n\r\n <input\r\n type={type}\r\n className={`textfield-input ${error ? \"error\" : \"\"}`}\r\n value={value}\r\n placeholder={placeholder}\r\n disabled={disabled}\r\n onChange={(e) => onChange && onChange(e.target.value)}\r\n />\r\n {icon && <div className=\"textfield-icon\">{icon}</div>}\r\n\r\n {error && <p className=\"textfield-error\">{error}</p>}\r\n </div>\r\n );\r\n};\r\n","import React from \"react\";\r\nimport \"./Radio.css\";\r\n\r\nexport interface RadioProps {\r\n label?: string;\r\n name: string; // obligatoire pour grouper les radios\r\n value: string;\r\n selectedValue: string;\r\n onChange: (value: string) => void;\r\n\r\n disabled?: boolean;\r\n error?: boolean;\r\n\r\n // Thème custom\r\n borderColor?: string;\r\n dotColor?: string;\r\n checkedBorderColor?: string;\r\n checkedBackground?: string;\r\n focusShadow?: string;\r\n\r\n style?: React.CSSProperties;\r\n}\r\n\r\nexport const Radio: React.FC<RadioProps> = ({\r\n label,\r\n name,\r\n value,\r\n selectedValue,\r\n onChange,\r\n disabled = false,\r\n error = false,\r\n\r\n borderColor = \"#777\",\r\n dotColor = \"#fff\",\r\n checkedBorderColor = \"#007bff\",\r\n checkedBackground = error ? \"#d93025\" : \"#007bff\",\r\n focusShadow = \"rgba(0, 123, 255, 0.4)\",\r\n\r\n style,\r\n}) => {\r\n const checked = selectedValue === value;\r\n\r\n return (\r\n <label\r\n className={`radio-container ${disabled ? \"disabled\" : \"\"}`}\r\n style={{\r\n ...style,\r\n [\"--rd-border-color\" as any]: borderColor,\r\n [\"--rd-dot-color\" as any]: dotColor,\r\n [\"--rd-checked-border\" as any]: checkedBorderColor,\r\n [\"--rd-checked-bg\" as any]: checkedBackground,\r\n [\"--rd-focus-shadow\" as any]: focusShadow,\r\n }}\r\n >\r\n <input\r\n type=\"radio\"\r\n name={name}\r\n value={value}\r\n disabled={disabled}\r\n checked={checked}\r\n onChange={() => onChange(value)}\r\n />\r\n\r\n <span className={`radio-circle ${error ? \"error\" : \"\"}`} />\r\n\r\n {label && <span className=\"radio-label\">{label}</span>}\r\n </label>\r\n );\r\n};\r\n","import React from \"react\";\r\nimport \"./Select.css\";\r\n\r\nexport interface SelectOption {\r\n value: string | number;\r\n label: string;\r\n\r\n bgColor?: string;\r\n textColor?: string;\r\n}\r\n\r\nexport interface SelectProps {\r\n label?: string;\r\n value: string | number;\r\n onChange: (value: string | number) => void;\r\n options: SelectOption[];\r\n disabled?: boolean;\r\n error?: boolean;\r\n\r\n // Custom colors\r\n borderColor?: string;\r\n focusBorder?: string;\r\n focusShadow?: string;\r\n errorColor?: string;\r\n\r\n style?: React.CSSProperties;\r\n}\r\n\r\nexport const Select: React.FC<SelectProps> = ({\r\n label,\r\n value,\r\n onChange,\r\n options,\r\n disabled = false,\r\n error = false,\r\n\r\n borderColor = \"#ccc\",\r\n focusBorder = \"#007bff\",\r\n focusShadow = \"rgba(0, 123, 255, 0.4)\",\r\n errorColor = \"#e63946\",\r\n\r\n style,\r\n}) => {\r\n return (\r\n <div className=\"select-wrapper\" style={style}>\r\n {label && <label className=\"select-label\">{label}</label>}\r\n\r\n <div\r\n className={`select-container ${disabled ? \"disabled\" : \"\"} ${\r\n error ? \"error\" : \"\"\r\n }`}\r\n >\r\n <select\r\n value={value}\r\n disabled={disabled}\r\n onChange={(e) => onChange(e.target.value)}\r\n style={{\r\n [\"--sel-border\" as any]: borderColor,\r\n [\"--sel-focus-border\" as any]: focusBorder,\r\n [\"--sel-focus-shadow\" as any]: focusShadow,\r\n [\"--sel-error\" as any]: errorColor,\r\n }}\r\n >\r\n {options.map((opt) => (\r\n <option\r\n key={opt.value}\r\n value={opt.value}\r\n style={{\r\n backgroundColor: opt.bgColor,\r\n color: opt.textColor,\r\n }}\r\n >\r\n {opt.label}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n </div>\r\n );\r\n};\r\n","import React, { createContext, useContext, useState } from \"react\";\r\nimport \"./Toast.css\";\r\n\r\nexport type ToastVariant = \"success\" | \"error\" | \"warning\" | \"info\";\r\n\r\nexport interface Toast {\r\n id: string;\r\n message: string;\r\n variant?: ToastVariant;\r\n duration?: number;\r\n}\r\n\r\ninterface ToastContextType {\r\n addToast: (msg: string, variant?: ToastVariant, duration?: number) => void;\r\n}\r\n\r\nconst ToastContext = createContext<ToastContextType | undefined>(undefined);\r\n\r\nexport const useToast = () => {\r\n const ctx = useContext(ToastContext);\r\n if (!ctx) throw new Error(\"useToast must be used inside <ToastProvider>\");\r\n return ctx;\r\n};\r\n\r\nexport const ToastProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => {\r\n const [toasts, setToasts] = useState<Toast[]>([]);\r\n\r\n function addToast(\r\n message: string,\r\n variant: ToastVariant = \"info\",\r\n duration = 3000\r\n ) {\r\n const toast: Toast = {\r\n id: Date.now().toString(),\r\n message,\r\n variant,\r\n duration,\r\n };\r\n\r\n setToasts((prev) => [...prev, toast]);\r\n\r\n // auto-remove\r\n setTimeout(() => {\r\n setToasts((prev) => prev.filter((t) => t.id !== toast.id));\r\n }, duration);\r\n }\r\n\r\n return (\r\n <ToastContext.Provider value={{ addToast }}>\r\n {children}\r\n\r\n {/* Toast container */}\r\n <div className=\"toast-container\">\r\n {toasts.map((t) => (\r\n <div key={t.id} className={`toast toast-${t.variant}`}>\r\n <span>{t.message}</span>\r\n <button className=\"toast-close\" onClick={() =>\r\n setToasts((prev) => prev.filter((x) => x.id !== t.id))\r\n }>\r\n ✕\r\n </button>\r\n </div>\r\n ))}\r\n </div>\r\n </ToastContext.Provider>\r\n );\r\n};\r\n"],"names":["_jsx","_Fragment","_jsxs"],"mappings":"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","x_google_ignoreList":[0]}
package/dist/index.js CHANGED
@@ -1,12 +1,13 @@
1
1
  'use strict';
2
2
 
3
3
  var jsxRuntime = require('react/jsx-runtime');
4
+ var react = require('react');
4
5
 
5
6
  function styleInject(css, ref) {
6
7
  if ( ref === void 0 ) ref = {};
7
8
  var insertAt = ref.insertAt;
8
9
 
9
- if (typeof document === 'undefined') { return; }
10
+ if (!css || typeof document === 'undefined') { return; }
10
11
 
11
12
  var head = document.head || document.getElementsByTagName('head')[0];
12
13
  var style = document.createElement('style');
@@ -29,12 +30,185 @@ function styleInject(css, ref) {
29
30
  }
30
31
  }
31
32
 
32
- var css_248z = ".btn{border:none;border-radius:4px;cursor:pointer;font-size:16px;font-weight:500;padding:10px 20px;transition:all .3s ease}.btn-primary{background-color:#007bff;color:#fff}.btn-primary:hover{background-color:#0056b3}.btn-secondary{background-color:#6c757d;color:#fff}.btn-danger{background-color:#dc3545;color:#fff}.btn-small{font-size:14px;padding:5px 10px}.btn-medium{font-size:16px;padding:10px 20px}.btn-large{font-size:18px;padding:15px 30px}.btn:disabled{cursor:not-allowed;opacity:.5}";
33
+ var css_248z$b = ".btn{align-items:center;border:none;border-radius:4px;cursor:pointer;display:inline-flex;font-size:16px;font-weight:500;justify-content:center;padding:10px 20px;transition:all .3s ease}.btn-primary{background-color:#007bff;color:#fff}.btn-primary:hover{background-color:#0056b3}.btn-secondary{background-color:#6c757d;color:#fff}.btn-danger{background-color:#dc3545;color:#fff}.btn-dark{background-color:#141617;color:#fff}.btn-light{background-color:#f8f9fa;color:#000}.btn-small{font-size:14px;padding:5px 10px}.btn-medium{font-size:16px;padding:10px 20px}.btn-large{font-size:18px;padding:15px 30px}.btn:disabled{cursor:not-allowed;opacity:.5}.btn-left-icon{margin-right:8px}.btn-left-icon,.btn-right-icon{align-items:center;display:inline-flex}.btn-right-icon{margin-left:8px}.btn-spinner{animation:spin .7s linear infinite;border:3px solid hsla(0,0%,100%,.4);border-radius:50%;border-top-color:#fff;display:inline-block;height:12px;margin-left:5px;width:12px}@keyframes spin{to{transform:rotate(1turn)}}.btn-loading{cursor:not-allowed;position:relative}.btn-loading span,.btn-loading svg{opacity:0}.btn-loading>:not(.btn-spinner){visibility:hidden}";
34
+ styleInject(css_248z$b);
35
+
36
+ const Button = ({ label, onClick, variant = "primary", size = "medium", disabled = false, icon, iconPosition = "left", backgroundColor, color, isLoading = false, }) => {
37
+ return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: jsxRuntime.jsxs("button", { className: `btn btn-${variant} btn-${size}`, onClick: onClick, disabled: disabled || isLoading, style: { backgroundColor, color }, children: [icon && iconPosition === "left" && jsxRuntime.jsx("span", { className: "btn-left-icon", children: icon }), label, icon && iconPosition === "right" && jsxRuntime.jsx("span", { className: "btn-right-icon", children: icon }), isLoading && jsxRuntime.jsx("span", { className: "btn-spinner" })] }) }));
38
+ };
39
+
40
+ var css_248z$a = ".center{align-items:center;display:flex;justify-content:center}";
41
+ styleInject(css_248z$a);
42
+
43
+ const Center = ({ children, backgroundColor = 'white', color = 'black' }) => {
44
+ return jsxRuntime.jsx("div", { className: "center", style: { backgroundColor, color }, children: children });
45
+ };
46
+
47
+ var css_248z$9 = ".card{background:#fff;border-radius:12px;display:flex;flex-direction:column;gap:12px;transition:box-shadow .2s ease,transform .2s ease}.card-elevated{box-shadow:0 2px 4px rgba(0,0,0,.08),0 8px 16px rgba(0,0,0,.06)}.card-elevated:hover{box-shadow:0 4px 8px rgba(0,0,0,.1),0 12px 24px rgba(0,0,0,.08);transform:translateY(-2px)}.card-outlined{border:1px solid #e5e7eb}.card-flat{background:transparent;border:none}.card-padding-sm{padding:8px}.card-padding-md{padding:16px}.card-padding-lg{padding:24px}.card-header{font-size:1.25rem;font-weight:600;margin-bottom:4px}.card-body{font-size:.95rem;line-height:1.5}.card-footer{border-top:1px solid #ececec;color:#555;font-size:.9rem;margin-top:8px;padding-top:8px}";
48
+ styleInject(css_248z$9);
49
+
50
+ const Card = ({ title, children, footer, backgroundColor, color, variant = "elevated", padding = "md", }) => {
51
+ return (jsxRuntime.jsxs("div", { className: `card card-${variant} card-padding-${padding}`, style: { backgroundColor, color }, children: [title && jsxRuntime.jsx("div", { className: "card-header", children: title }), jsxRuntime.jsx("div", { className: "card-body", children: children }), footer && jsxRuntime.jsx("div", { className: "card-footer", children: footer })] }));
52
+ };
53
+
54
+ var css_248z$8 = ".bloc{box-sizing:border-box;max-width:100%;padding:16px;width:100%}@media (max-width:600px){.bloc{border-radius:6px;padding:12px}}@media (max-width:900px){.bloc{padding:14px}}";
55
+ styleInject(css_248z$8);
56
+
57
+ const Bloc = ({ children, className = "", style = {}, layout = "default", }) => {
58
+ const layoutStyles = (() => {
59
+ switch (layout) {
60
+ case "center":
61
+ return { display: "flex", justifyContent: "center", alignItems: "center" };
62
+ case "row":
63
+ return { display: "flex", flexDirection: "row", alignItems: "center" };
64
+ case "row-between":
65
+ return { display: "flex", flexDirection: "row", justifyContent: "space-between", alignItems: "center" };
66
+ case "column":
67
+ return { display: "flex", flexDirection: "column", alignItems: "flex-start" };
68
+ case "sidebar":
69
+ return { display: "flex", flexDirection: "column", alignItems: "flex-start", gap: "12px" };
70
+ case "navbar":
71
+ return { display: "flex", flexDirection: "row", justifyContent: "space-between", alignItems: "center", padding: "12px 20px" };
72
+ default:
73
+ return {};
74
+ }
75
+ })();
76
+ return (jsxRuntime.jsx("div", { className: `bloc ${className}`, style: Object.assign(Object.assign({}, layoutStyles), style), children: children }));
77
+ };
78
+
79
+ var css_248z$7 = ".container{margin:0 auto;padding:0 16px;width:100%}@media (min-width:576px){.container{max-width:540px}}@media (min-width:768px){.container{max-width:720px}}@media (min-width:992px){.container{max-width:960px}}@media (min-width:1200px){.container{max-width:1200px}}.container-fluid{max-width:100%}";
80
+ styleInject(css_248z$7);
81
+
82
+ const Container = ({ children, className = "", style = {}, fluid = false }) => {
83
+ return (jsxRuntime.jsx("div", { className: `container ${fluid ? "container-fluid" : ""} ${className}`, style: style, children: children }));
84
+ };
85
+
86
+ var css_248z$6 = ".row{align-items:stretch;box-sizing:border-box;display:flex;flex-direction:row;gap:16px}@media (max-width:768px){.row{flex-direction:column}}";
87
+ styleInject(css_248z$6);
88
+
89
+ const Row = ({ children, className = "", style = {} }) => {
90
+ return jsxRuntime.jsx("div", { className: `row ${className}`, style: Object.assign({}, style), children: children });
91
+ };
92
+
93
+ var css_248z$5 = ".col,.column{box-sizing:border-box;flex:1 1 0;min-width:0;padding:8px}.col.small{max-width:20%}.col.medium{max-width:50%}.col.large{max-width:100%}.col>*,.column>*{box-sizing:border-box;max-width:100%;overflow-wrap:anywhere;word-break:break-word}.col img,.column img{display:block;height:auto;max-width:100%}@media (max-width:768px){.col,.col.large,.col.medium,.col.small,.column{flex:none;max-width:100%;width:100%}}";
94
+ styleInject(css_248z$5);
95
+
96
+ const Column = ({ children, className = "", style = {} }) => {
97
+ return (jsxRuntime.jsx("div", { className: `col ${className}`, style: Object.assign({}, style), children: children }));
98
+ };
99
+
100
+ const Grid = ({ items }) => {
101
+ return (jsxRuntime.jsx(Row, { children: items.map((item, index) => (jsxRuntime.jsx(Column, { className: item.className, style: Object.assign({}, item.style), children: item.children }, index))) }));
102
+ };
103
+
104
+ const Spacer = ({ size = 16, direction = "vertical" }) => {
105
+ const style = direction === "vertical"
106
+ ? { height: size }
107
+ : { width: size, display: "inline-block" };
108
+ return jsxRuntime.jsx("div", { style: style });
109
+ };
110
+
111
+ const Divider = ({ color = "#e0e0e0", thickness = 1, orientation = "horizontal", margin = 8, }) => {
112
+ const styles = orientation === "horizontal"
113
+ ? {
114
+ width: "100%",
115
+ height: thickness,
116
+ backgroundColor: color,
117
+ margin: `${margin}px 0`,
118
+ }
119
+ : {
120
+ width: thickness,
121
+ height: "100%",
122
+ backgroundColor: color,
123
+ margin: `0 ${margin}px`,
124
+ };
125
+ return jsxRuntime.jsx("div", { style: styles });
126
+ };
127
+
128
+ var css_248z$4 = ".checkbox-container{align-items:center;cursor:pointer;display:flex;font-family:sans-serif;gap:8px;user-select:none}.checkbox-container.disabled{cursor:not-allowed;opacity:.5}.checkbox-container input{appearance:none;-webkit-appearance:none;height:0;position:absolute;width:0}.checkbox-box{border:2px solid var(--cb-box-color,#777);border-radius:4px;display:inline-block;height:18px;position:relative;transition:.2s ease;width:18px}.checkbox-container input:checked+.checkbox-box{background-color:var(--cb-checked-bg,#007bff);border-color:var(--cb-checked-bg,#007bff)}.checkbox-container input:checked+.checkbox-box:after{border-width:medium;border-bottom:2px solid var(--cb-check-color,#fff);border-left:0 solid var(--cb-check-color,#fff);border-right:2px solid var(--cb-check-color,#fff);border-top:0 solid var(--cb-check-color,#fff);content:\"\";height:10px;left:5px;position:absolute;top:1px;transform:rotate(45deg);width:5px}.checkbox-container input:focus+.checkbox-box{box-shadow:0 0 4px var(--cb-focus-shadow,rgba(0,123,255,.4))}.checkbox-box.error{border-color:#d93025!important}.checkbox-label{font-size:14px}";
129
+ styleInject(css_248z$4);
130
+
131
+ const Checkbox = ({ label, checked, onChange, disabled = false, error = false, boxColor = "#777", checkColor = "#fff", checkedBackground = "#007bff", focusShadow = "rgba(0, 123, 255, 0.4)", style, }) => {
132
+ return (jsxRuntime.jsxs("label", { className: `checkbox-container ${disabled ? "disabled" : ""}`, style: {
133
+ ["--cb-box-color"]: boxColor,
134
+ ["--cb-check-color"]: checkColor,
135
+ ["--cb-checked-bg"]: checkedBackground,
136
+ ["--cb-focus-shadow"]: focusShadow,
137
+ }, children: [jsxRuntime.jsx("input", { type: "checkbox", checked: checked, disabled: disabled, onChange: (e) => onChange(e.target.checked) }), jsxRuntime.jsx("span", { className: `checkbox-box ${error ? "error" : ""}` }), label && jsxRuntime.jsx("span", { className: "checkbox-label", children: label })] }));
138
+ };
139
+
140
+ var css_248z$3 = ".textfield{display:flex;flex-direction:column;font-family:sans-serif;gap:6px}.fullWidth{width:100%}.textfield-label{color:#333;font-size:14px;font-weight:600}.textfield-input{border:1px solid #ccc;border-radius:6px;font-size:14px;padding:10px 12px;transition:.2s ease}.textfield-input:focus{border-color:#4c00ff;box-shadow:0 0 2px #007bff;outline:none}.textfield-input.error{background-color:#fff5f5;border-color:#d93025}.textfield-error{background-color:#f44343;color:#ece6e6;font-size:12px;padding:8px}.textfield-icon{position:absolute;right:45px;top:45px;width:2px}";
141
+ styleInject(css_248z$3);
142
+
143
+ const TextField = ({ label, value = "", placeholder, onChange, error, disabled = false, type = "text", fullWidth = true, icon, }) => {
144
+ return (jsxRuntime.jsxs("div", { className: `textfield ${fullWidth ? "fullWidth" : ""}`, children: [label && jsxRuntime.jsx("label", { className: "textfield-label", children: label }), jsxRuntime.jsx("input", { type: type, className: `textfield-input ${error ? "error" : ""}`, value: value, placeholder: placeholder, disabled: disabled, onChange: (e) => onChange && onChange(e.target.value) }), icon && jsxRuntime.jsx("div", { className: "textfield-icon", children: icon }), error && jsxRuntime.jsx("p", { className: "textfield-error", children: error })] }));
145
+ };
146
+
147
+ var css_248z$2 = ".radio-container{align-items:center;cursor:pointer;display:flex;font-family:sans-serif;gap:8px}.radio-container input{display:none}.radio-circle{align-items:center;border:2px solid var(--rd-border-color,#777);border-radius:50%;display:flex;height:18px;justify-content:center;position:relative;transition:.2s ease;width:18px}.radio-circle:after{background-color:var(--rd-dot-color,#fff);border-radius:50%;content:\"\";height:10px;opacity:0;transform:scale(.4);transition:.2s ease;width:10px}.radio-container input:checked+.radio-circle{background-color:var(--rd-checked-bg,#007bff);border-color:var(--rd-checked-border,#007bff)}.radio-container input:checked+.radio-circle:after{opacity:1;transform:scale(1)}.radio-circle.error{border-color:#d93025!important}.radio-label{font-size:14px}.disabled{cursor:not-allowed;opacity:.6}";
148
+ styleInject(css_248z$2);
149
+
150
+ const Radio = ({ label, name, value, selectedValue, onChange, disabled = false, error = false, borderColor = "#777", dotColor = "#fff", checkedBorderColor = "#007bff", checkedBackground = error ? "#d93025" : "#007bff", focusShadow = "rgba(0, 123, 255, 0.4)", style, }) => {
151
+ const checked = selectedValue === value;
152
+ return (jsxRuntime.jsxs("label", { className: `radio-container ${disabled ? "disabled" : ""}`, style: Object.assign(Object.assign({}, style), { ["--rd-border-color"]: borderColor, ["--rd-dot-color"]: dotColor, ["--rd-checked-border"]: checkedBorderColor, ["--rd-checked-bg"]: checkedBackground, ["--rd-focus-shadow"]: focusShadow }), children: [jsxRuntime.jsx("input", { type: "radio", name: name, value: value, disabled: disabled, checked: checked, onChange: () => onChange(value) }), jsxRuntime.jsx("span", { className: `radio-circle ${error ? "error" : ""}` }), label && jsxRuntime.jsx("span", { className: "radio-label", children: label })] }));
153
+ };
154
+
155
+ var css_248z$1 = ".select-wrapper{display:flex;flex-direction:column;font-family:sans-serif;gap:4px}.select-label{font-size:14px;font-weight:500}.select-container{position:relative;width:100%}.select-container select{background:#fff;border:1px solid var(--sel-border,#ccc);border-radius:6px;cursor:pointer;font-size:15px;padding:10px 12px;transition:all .2s ease;width:100%}.select-container select:focus{border-color:var(--sel-focus-border,#007bff);box-shadow:0 0 0 2px var(--sel-focus-shadow,rgba(0,123,255,.4));outline:none}.select-container.disabled select{background:#f2f2f2;cursor:not-allowed;opacity:.6}.select-container.error select{border-color:var(--sel-error,red)}.select-container.error select:focus{border-color:var(--sel-error,red);box-shadow:0 0 0 2px rgba(230,57,70,.35)}";
156
+ styleInject(css_248z$1);
157
+
158
+ const Select = ({ label, value, onChange, options, disabled = false, error = false, borderColor = "#ccc", focusBorder = "#007bff", focusShadow = "rgba(0, 123, 255, 0.4)", errorColor = "#e63946", style, }) => {
159
+ return (jsxRuntime.jsxs("div", { className: "select-wrapper", style: style, children: [label && jsxRuntime.jsx("label", { className: "select-label", children: label }), jsxRuntime.jsx("div", { className: `select-container ${disabled ? "disabled" : ""} ${error ? "error" : ""}`, children: jsxRuntime.jsx("select", { value: value, disabled: disabled, onChange: (e) => onChange(e.target.value), style: {
160
+ ["--sel-border"]: borderColor,
161
+ ["--sel-focus-border"]: focusBorder,
162
+ ["--sel-focus-shadow"]: focusShadow,
163
+ ["--sel-error"]: errorColor,
164
+ }, children: options.map((opt) => (jsxRuntime.jsx("option", { value: opt.value, style: {
165
+ backgroundColor: opt.bgColor,
166
+ color: opt.textColor,
167
+ }, children: opt.label }, opt.value))) }) })] }));
168
+ };
169
+
170
+ var css_248z = ".toast-container{display:flex;flex-direction:column;gap:10px;position:fixed;right:20px;top:20px;z-index:9999}.toast{align-items:center;animation:toast-slide .3s ease,toast-fadeout .3s ease forwards;animation-delay:0s,2.8s;border-radius:8px;box-shadow:0 4px 8px rgba(0,0,0,.2);color:#fff;display:flex;font-size:14px;justify-content:space-between;max-width:320px;min-width:260px;padding:12px 16px;position:relative}.toast-success{background-color:#2ecc71}.toast-error{background-color:#e74c3c}.toast-warning{background-color:#f1c40f;color:#333}.toast-info{background-color:#3498db}.toast-close{background:none;border:none;color:inherit;cursor:pointer;font-size:16px}@keyframes toast-slide{0%{opacity:0;transform:translateX(40px)}to{opacity:1;transform:translateX(0)}}@keyframes toast-fadeout{0%{opacity:1}to{opacity:0}}";
33
171
  styleInject(css_248z);
34
172
 
35
- const Button = ({ label, onClick, variant = "primary", size = "medium", disabled = false, }) => {
36
- return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: jsxRuntime.jsx("button", { className: `btn btn-${variant} btn-${size}`, onClick: onClick, disabled: disabled, children: label }) }));
173
+ const ToastContext = react.createContext(undefined);
174
+ const useToast = () => {
175
+ const ctx = react.useContext(ToastContext);
176
+ if (!ctx)
177
+ throw new Error("useToast must be used inside <ToastProvider>");
178
+ return ctx;
179
+ };
180
+ const ToastProvider = ({ children }) => {
181
+ const [toasts, setToasts] = react.useState([]);
182
+ function addToast(message, variant = "info", duration = 3000) {
183
+ const toast = {
184
+ id: Date.now().toString(),
185
+ message,
186
+ variant,
187
+ duration,
188
+ };
189
+ setToasts((prev) => [...prev, toast]);
190
+ // auto-remove
191
+ setTimeout(() => {
192
+ setToasts((prev) => prev.filter((t) => t.id !== toast.id));
193
+ }, duration);
194
+ }
195
+ return (jsxRuntime.jsxs(ToastContext.Provider, { value: { addToast }, children: [children, jsxRuntime.jsx("div", { className: "toast-container", children: toasts.map((t) => (jsxRuntime.jsxs("div", { className: `toast toast-${t.variant}`, children: [jsxRuntime.jsx("span", { children: t.message }), jsxRuntime.jsx("button", { className: "toast-close", onClick: () => setToasts((prev) => prev.filter((x) => x.id !== t.id)), children: "\u2715" })] }, t.id))) })] }));
37
196
  };
38
197
 
198
+ exports.Bloc = Bloc;
39
199
  exports.Button = Button;
200
+ exports.Card = Card;
201
+ exports.Center = Center;
202
+ exports.Checkbox = Checkbox;
203
+ exports.Column = Column;
204
+ exports.Container = Container;
205
+ exports.Divider = Divider;
206
+ exports.Grid = Grid;
207
+ exports.Radio = Radio;
208
+ exports.Row = Row;
209
+ exports.Select = Select;
210
+ exports.Spacer = Spacer;
211
+ exports.TextField = TextField;
212
+ exports.ToastProvider = ToastProvider;
213
+ exports.useToast = useToast;
40
214
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../node_modules/style-inject/dist/style-inject.es.js","../src/components/Button/Button.tsx"],"sourcesContent":["function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n","import \"./Button.css\";\r\nimport React from \"react\";\r\n\r\n\r\nexport interface ButtonProps {\r\n label: string;\r\n onClick?: () => void;\r\n variant?: \"primary\" | \"secondary\" | \"danger\";\r\n size?: \"small\" | \"medium\" | \"large\";\r\n disabled?: boolean;\r\n}\r\n\r\nexport const Button: React.FC<ButtonProps> = ({\r\n label,\r\n onClick,\r\n variant = \"primary\",\r\n size = \"medium\",\r\n disabled = false,\r\n}) => {\r\n return (\r\n <>\r\n <button\r\n className={`btn btn-${variant} btn-${size}`}\r\n onClick={onClick}\r\n disabled={disabled}\r\n >\r\n {label}\r\n </button>\r\n </>\r\n );\r\n};\r\n"],"names":["_jsx"],"mappings":";;;;AAAA,SAAS,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE;AAC/B,EAAE,KAAK,GAAG,KAAK,MAAM,GAAG,GAAG,GAAG,EAAE;AAChC,EAAE,IAAI,QAAQ,GAAG,GAAG,CAAC,QAAQ;;AAE7B,EAAE,IAAY,OAAO,QAAQ,KAAK,WAAW,EAAE,EAAE,OAAO,CAAC;;AAEzD,EAAE,IAAI,IAAI,GAAG,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AACtE,EAAE,IAAI,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC;AAC7C,EAAE,KAAK,CAAC,IAAI,GAAG,UAAU;;AAEzB,EAAE,IAAI,QAAQ,KAAK,KAAK,EAAE;AAC1B,IAAI,IAAI,IAAI,CAAC,UAAU,EAAE;AACzB,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC;AAC/C,IAAI,CAAC,MAAM;AACX,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;AAC7B,IAAI;AACJ,EAAE,CAAC,MAAM;AACT,IAAI,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;AAC3B,EAAE;;AAEF,EAAE,IAAI,KAAK,CAAC,UAAU,EAAE;AACxB,IAAI,KAAK,CAAC,UAAU,CAAC,OAAO,GAAG,GAAG;AAClC,EAAE,CAAC,MAAM;AACT,IAAI,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;AACnD,EAAE;AACF;;;;;MCba,MAAM,GAA0B,CAAC,EAC5C,KAAK,EACL,OAAO,EACP,OAAO,GAAG,SAAS,EACnB,IAAI,GAAG,QAAQ,EACf,QAAQ,GAAG,KAAK,GACjB,KAAI;IACH,QACEA,gDACEA,cAAA,CAAA,QAAA,EAAA,EACE,SAAS,EAAE,CAAA,QAAA,EAAW,OAAO,CAAA,KAAA,EAAQ,IAAI,CAAA,CAAE,EAC3C,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,QAAQ,YAEjB,KAAK,EAAA,CACC,EAAA,CACR;AAEP;;;;","x_google_ignoreList":[0]}
1
+ {"version":3,"file":"index.js","sources":["../node_modules/style-inject/dist/style-inject.es.js","../src/components/Button/Button.tsx","../src/components/Center/Center.tsx","../src/components/Card/Card.tsx","../src/components/Bloc/Bloc.tsx","../src/components/Container/Container.tsx","../src/components/Row/Row.tsx","../src/components/Column/Column.tsx","../src/components/Grid/Grid.tsx","../src/components/Spacer/Spacer.tsx","../src/components/Divider/Divider.tsx","../src/components/Checkbox/Checkbox.tsx","../src/components/TextField/TextField.tsx","../src/components/Radio/Radio.tsx","../src/components/Select/Select.tsx","../src/components/Toast/ToastContext.tsx"],"sourcesContent":["function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n","import \"./Button.css\";\r\nimport React from \"react\";\r\n\r\n\r\nexport interface ButtonProps {\r\n label: string;\r\n onClick?: () => void;\r\n variant?: \"primary\" | \"secondary\" | \"danger\" | \"dark\" | \"light\";\r\n size?: \"small\" | \"medium\" | \"large\";\r\n disabled?: boolean;\r\n icon?: React.ReactNode;\r\n iconPosition?: \"left\" | \"right\";\r\n backgroundColor?: string;\r\n color?: string;\r\n isLoading?: boolean;\r\n}\r\n\r\nexport const Button: React.FC<ButtonProps> = ({\r\n label,\r\n onClick,\r\n variant = \"primary\",\r\n size = \"medium\",\r\n disabled = false,\r\n icon,\r\n iconPosition = \"left\",\r\n backgroundColor,\r\n color,\r\n isLoading = false,\r\n}) => {\r\n return (\r\n <>\r\n <button\r\n className={`btn btn-${variant} btn-${size}`}\r\n onClick={onClick}\r\n disabled={disabled || isLoading}\r\n style={{ backgroundColor, color }}\r\n >\r\n {icon && iconPosition === \"left\" && <span className=\"btn-left-icon\">{icon}</span>}\r\n {label}\r\n {icon && iconPosition === \"right\" && <span className=\"btn-right-icon\">{icon}</span>}\r\n {isLoading && <span className=\"btn-spinner\"></span>}\r\n </button>\r\n </>\r\n );\r\n};\r\n","import \"./Center.css\"\r\n\r\nexport interface CenterProps {\r\n children: React.ReactNode;\r\n backgroundColor?: string;\r\n color?: string;\r\n}\r\n\r\nexport const Center: React.FC<CenterProps> = ({ children, backgroundColor = 'white', color = 'black' }) => {\r\n return <div className=\"center\" style={{ backgroundColor, color}}>{children}</div>;\r\n};\r\n","import React from \"react\";\r\nimport \"./Card.css\";\r\n\r\nexport interface CardProps {\r\n title?: string;\r\n children: React.ReactNode;\r\n backgroundColor?: string;\r\n color?: string;\r\n variant?: \"elevated\" | \"outlined\" | \"flat\";\r\n padding?: \"sm\" | \"md\" | \"lg\";\r\n footer?: React.ReactNode;\r\n}\r\n\r\nexport const Card: React.FC<CardProps> = ({\r\n title,\r\n children,\r\n footer,\r\n backgroundColor,\r\n color,\r\n variant = \"elevated\",\r\n padding = \"md\",\r\n}) => {\r\n return (\r\n <div\r\n className={`card card-${variant} card-padding-${padding}`}\r\n style={{ backgroundColor, color }}\r\n >\r\n {title && <div className=\"card-header\">{title}</div>}\r\n <div className=\"card-body\">{children}</div>\r\n {footer && <div className=\"card-footer\">{footer}</div>}\r\n </div>\r\n );\r\n};\r\n","import React from \"react\";\r\nimport \"./Bloc.css\";\r\n\r\nexport type BlocLayout =\r\n | \"default\"\r\n | \"center\"\r\n | \"row\"\r\n | \"row-between\"\r\n | \"column\"\r\n | \"sidebar\"\r\n | \"navbar\";\r\n\r\nexport interface BlocProps {\r\n children?: React.ReactNode;\r\n className?: string;\r\n style?: React.CSSProperties;\r\n layout?: BlocLayout;\r\n}\r\n\r\nexport const Bloc: React.FC<BlocProps> = ({\r\n children,\r\n className = \"\",\r\n style = {},\r\n layout = \"default\",\r\n}) => {\r\n const layoutStyles: React.CSSProperties = (() => {\r\n switch (layout) {\r\n case \"center\":\r\n return { display: \"flex\", justifyContent: \"center\", alignItems: \"center\" };\r\n case \"row\":\r\n return { display: \"flex\", flexDirection: \"row\", alignItems: \"center\" };\r\n case \"row-between\":\r\n return { display: \"flex\", flexDirection: \"row\", justifyContent: \"space-between\", alignItems: \"center\" };\r\n case \"column\":\r\n return { display: \"flex\", flexDirection: \"column\", alignItems: \"flex-start\" };\r\n case \"sidebar\":\r\n return { display: \"flex\", flexDirection: \"column\", alignItems: \"flex-start\", gap: \"12px\" };\r\n case \"navbar\":\r\n return { display: \"flex\", flexDirection: \"row\", justifyContent: \"space-between\", alignItems: \"center\", padding: \"12px 20px\" };\r\n default:\r\n return {};\r\n }\r\n })();\r\n\r\n return (\r\n <div className={`bloc ${className}`} style={{ ...layoutStyles, ...style }}>\r\n {children}\r\n </div>\r\n );\r\n};\r\n","import React from \"react\";\r\nimport \"./Container.css\";\r\n\r\nexport interface ContainerProps {\r\n children?: React.ReactNode;\r\n className?: string;\r\n style?: React.CSSProperties;\r\n fluid?: boolean;\r\n}\r\n\r\nexport const Container: React.FC<ContainerProps> = ({ children, className = \"\", style = {}, fluid = false }) => {\r\n return (\r\n <div className={`container ${fluid ? \"container-fluid\" : \"\"} ${className}`} style={style}>\r\n {children}\r\n </div>\r\n );\r\n};\r\n","import React from \"react\";\r\nimport \"./Row.css\";\r\n\r\nexport interface RowProps {\r\n children?: React.ReactNode;\r\n className?: string;\r\n style?: React.CSSProperties;\r\n}\r\n\r\nexport const Row: React.FC<RowProps> = ({\r\n children,\r\n className = \"\",\r\n style = {}\r\n}) => {\r\n return <div className={`row ${className}`} style={{...style}}>{children}</div>;\r\n};\r\n","import React from \"react\";\r\nimport \"./Column.css\";\r\n\r\nexport interface ColumnProps {\r\n children?: React.ReactNode;\r\n className?: \"small\" | \"medium\" | \"large\";\r\n style?: React.CSSProperties;\r\n}\r\n\r\nexport const Column: React.FC<ColumnProps> = ({ children, className = \"\", style = {}}) => {\r\n return (\r\n <div className={`col ${className}`} style={{...style}}>\r\n {children}\r\n </div>\r\n );\r\n};\r\n","import { Column } from \"../Column\";\r\nimport { Row } from \"../Row\";\r\n\r\nexport interface GridColumn {\r\n children?: React.ReactNode;\r\n span?: number;\r\n style?: React.CSSProperties;\r\n className?: \"small\" | \"medium\" | \"large\";\r\n}\r\n\r\nexport interface GridProps {\r\n items: GridColumn[];\r\n}\r\n\r\nexport const Grid: React.FC<GridProps> = ({ items }) => {\r\n\r\n return (\r\n <Row>\r\n {items.map((item: GridColumn, index: number) => (\r\n <Column\r\n key={index}\r\n className={item.className}\r\n style={{ ...item.style }}\r\n >\r\n {item.children}\r\n </Column>\r\n ))}\r\n </Row>\r\n );\r\n};\r\n","import React from \"react\";\r\n\r\nexport interface SpacerProps {\r\n size?: number;\r\n direction?: \"vertical\" | \"horizontal\";\r\n}\r\n\r\nexport const Spacer: React.FC<SpacerProps> = ({\r\n size = 16,\r\n direction = \"vertical\"\r\n}) => {\r\n const style: React.CSSProperties =\r\n direction === \"vertical\"\r\n ? { height: size }\r\n : { width: size, display: \"inline-block\" };\r\n\r\n return <div style={style} />;\r\n};\r\n","import React from \"react\";\r\n\r\nexport interface DividerProps {\r\n color?: string;\r\n thickness?: number;\r\n orientation?: \"horizontal\" | \"vertical\";\r\n margin?: number;\r\n}\r\n\r\nexport const Divider: React.FC<DividerProps> = ({\r\n color = \"#e0e0e0\",\r\n thickness = 1,\r\n orientation = \"horizontal\",\r\n margin = 8,\r\n}) => {\r\n const styles: React.CSSProperties =\r\n orientation === \"horizontal\"\r\n ? {\r\n width: \"100%\",\r\n height: thickness,\r\n backgroundColor: color,\r\n margin: `${margin}px 0`,\r\n }\r\n : {\r\n width: thickness,\r\n height: \"100%\",\r\n backgroundColor: color,\r\n margin: `0 ${margin}px`,\r\n };\r\n\r\n return <div style={styles} />;\r\n};\r\n","import React from \"react\";\r\nimport \"./Checkbox.css\";\r\n\r\nexport interface CheckboxProps {\r\n label?: string;\r\n checked: boolean;\r\n onChange: (value: boolean) => void;\r\n disabled?: boolean;\r\n error?: boolean;\r\n\r\n // Custom colors\r\n boxColor?: string;\r\n checkColor?: string;\r\n checkedBackground?: string;\r\n focusShadow?: string;\r\n\r\n style?: React.CSSProperties;\r\n}\r\n\r\nexport const Checkbox: React.FC<CheckboxProps> = ({\r\n label,\r\n checked,\r\n onChange,\r\n disabled = false,\r\n error = false,\r\n\r\n boxColor = \"#777\",\r\n checkColor = \"#fff\",\r\n checkedBackground = \"#007bff\",\r\n focusShadow = \"rgba(0, 123, 255, 0.4)\",\r\n\r\n style,\r\n}) => {\r\n return (\r\n <label\r\n className={`checkbox-container ${disabled ? \"disabled\" : \"\"}`}\r\n style={{\r\n [\"--cb-box-color\" as any]: boxColor,\r\n [\"--cb-check-color\" as any]: checkColor,\r\n [\"--cb-checked-bg\" as any]: checkedBackground,\r\n [\"--cb-focus-shadow\" as any]: focusShadow,\r\n }}\r\n >\r\n <input\r\n type=\"checkbox\"\r\n checked={checked}\r\n disabled={disabled}\r\n onChange={(e) => onChange(e.target.checked)}\r\n />\r\n\r\n <span className={`checkbox-box ${error ? \"error\" : \"\"}`} />\r\n\r\n {label && <span className=\"checkbox-label\">{label}</span>}\r\n </label>\r\n );\r\n};\r\n","import React from \"react\";\r\nimport \"./TextField.css\";\r\n\r\nexport interface TextFieldProps {\r\n label?: string;\r\n value?: string;\r\n placeholder?: string;\r\n onChange?: (value: string) => void;\r\n error?: string;\r\n disabled?: boolean;\r\n type?: string;\r\n fullWidth?: boolean;\r\n icon?: React.ReactNode;\r\n}\r\n\r\nexport const TextField: React.FC<TextFieldProps> = ({\r\n label,\r\n value = \"\",\r\n placeholder,\r\n onChange,\r\n error,\r\n disabled = false,\r\n type = \"text\",\r\n fullWidth = true,\r\n icon,\r\n}) => {\r\n return (\r\n <div className={`textfield ${fullWidth ? \"fullWidth\" : \"\"}`}>\r\n {label && <label className=\"textfield-label\">{label}</label>}\r\n\r\n <input\r\n type={type}\r\n className={`textfield-input ${error ? \"error\" : \"\"}`}\r\n value={value}\r\n placeholder={placeholder}\r\n disabled={disabled}\r\n onChange={(e) => onChange && onChange(e.target.value)}\r\n />\r\n {icon && <div className=\"textfield-icon\">{icon}</div>}\r\n\r\n {error && <p className=\"textfield-error\">{error}</p>}\r\n </div>\r\n );\r\n};\r\n","import React from \"react\";\r\nimport \"./Radio.css\";\r\n\r\nexport interface RadioProps {\r\n label?: string;\r\n name: string; // obligatoire pour grouper les radios\r\n value: string;\r\n selectedValue: string;\r\n onChange: (value: string) => void;\r\n\r\n disabled?: boolean;\r\n error?: boolean;\r\n\r\n // Thème custom\r\n borderColor?: string;\r\n dotColor?: string;\r\n checkedBorderColor?: string;\r\n checkedBackground?: string;\r\n focusShadow?: string;\r\n\r\n style?: React.CSSProperties;\r\n}\r\n\r\nexport const Radio: React.FC<RadioProps> = ({\r\n label,\r\n name,\r\n value,\r\n selectedValue,\r\n onChange,\r\n disabled = false,\r\n error = false,\r\n\r\n borderColor = \"#777\",\r\n dotColor = \"#fff\",\r\n checkedBorderColor = \"#007bff\",\r\n checkedBackground = error ? \"#d93025\" : \"#007bff\",\r\n focusShadow = \"rgba(0, 123, 255, 0.4)\",\r\n\r\n style,\r\n}) => {\r\n const checked = selectedValue === value;\r\n\r\n return (\r\n <label\r\n className={`radio-container ${disabled ? \"disabled\" : \"\"}`}\r\n style={{\r\n ...style,\r\n [\"--rd-border-color\" as any]: borderColor,\r\n [\"--rd-dot-color\" as any]: dotColor,\r\n [\"--rd-checked-border\" as any]: checkedBorderColor,\r\n [\"--rd-checked-bg\" as any]: checkedBackground,\r\n [\"--rd-focus-shadow\" as any]: focusShadow,\r\n }}\r\n >\r\n <input\r\n type=\"radio\"\r\n name={name}\r\n value={value}\r\n disabled={disabled}\r\n checked={checked}\r\n onChange={() => onChange(value)}\r\n />\r\n\r\n <span className={`radio-circle ${error ? \"error\" : \"\"}`} />\r\n\r\n {label && <span className=\"radio-label\">{label}</span>}\r\n </label>\r\n );\r\n};\r\n","import React from \"react\";\r\nimport \"./Select.css\";\r\n\r\nexport interface SelectOption {\r\n value: string | number;\r\n label: string;\r\n\r\n bgColor?: string;\r\n textColor?: string;\r\n}\r\n\r\nexport interface SelectProps {\r\n label?: string;\r\n value: string | number;\r\n onChange: (value: string | number) => void;\r\n options: SelectOption[];\r\n disabled?: boolean;\r\n error?: boolean;\r\n\r\n // Custom colors\r\n borderColor?: string;\r\n focusBorder?: string;\r\n focusShadow?: string;\r\n errorColor?: string;\r\n\r\n style?: React.CSSProperties;\r\n}\r\n\r\nexport const Select: React.FC<SelectProps> = ({\r\n label,\r\n value,\r\n onChange,\r\n options,\r\n disabled = false,\r\n error = false,\r\n\r\n borderColor = \"#ccc\",\r\n focusBorder = \"#007bff\",\r\n focusShadow = \"rgba(0, 123, 255, 0.4)\",\r\n errorColor = \"#e63946\",\r\n\r\n style,\r\n}) => {\r\n return (\r\n <div className=\"select-wrapper\" style={style}>\r\n {label && <label className=\"select-label\">{label}</label>}\r\n\r\n <div\r\n className={`select-container ${disabled ? \"disabled\" : \"\"} ${\r\n error ? \"error\" : \"\"\r\n }`}\r\n >\r\n <select\r\n value={value}\r\n disabled={disabled}\r\n onChange={(e) => onChange(e.target.value)}\r\n style={{\r\n [\"--sel-border\" as any]: borderColor,\r\n [\"--sel-focus-border\" as any]: focusBorder,\r\n [\"--sel-focus-shadow\" as any]: focusShadow,\r\n [\"--sel-error\" as any]: errorColor,\r\n }}\r\n >\r\n {options.map((opt) => (\r\n <option\r\n key={opt.value}\r\n value={opt.value}\r\n style={{\r\n backgroundColor: opt.bgColor,\r\n color: opt.textColor,\r\n }}\r\n >\r\n {opt.label}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n </div>\r\n );\r\n};\r\n","import React, { createContext, useContext, useState } from \"react\";\r\nimport \"./Toast.css\";\r\n\r\nexport type ToastVariant = \"success\" | \"error\" | \"warning\" | \"info\";\r\n\r\nexport interface Toast {\r\n id: string;\r\n message: string;\r\n variant?: ToastVariant;\r\n duration?: number;\r\n}\r\n\r\ninterface ToastContextType {\r\n addToast: (msg: string, variant?: ToastVariant, duration?: number) => void;\r\n}\r\n\r\nconst ToastContext = createContext<ToastContextType | undefined>(undefined);\r\n\r\nexport const useToast = () => {\r\n const ctx = useContext(ToastContext);\r\n if (!ctx) throw new Error(\"useToast must be used inside <ToastProvider>\");\r\n return ctx;\r\n};\r\n\r\nexport const ToastProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => {\r\n const [toasts, setToasts] = useState<Toast[]>([]);\r\n\r\n function addToast(\r\n message: string,\r\n variant: ToastVariant = \"info\",\r\n duration = 3000\r\n ) {\r\n const toast: Toast = {\r\n id: Date.now().toString(),\r\n message,\r\n variant,\r\n duration,\r\n };\r\n\r\n setToasts((prev) => [...prev, toast]);\r\n\r\n // auto-remove\r\n setTimeout(() => {\r\n setToasts((prev) => prev.filter((t) => t.id !== toast.id));\r\n }, duration);\r\n }\r\n\r\n return (\r\n <ToastContext.Provider value={{ addToast }}>\r\n {children}\r\n\r\n {/* Toast container */}\r\n <div className=\"toast-container\">\r\n {toasts.map((t) => (\r\n <div key={t.id} className={`toast toast-${t.variant}`}>\r\n <span>{t.message}</span>\r\n <button className=\"toast-close\" onClick={() =>\r\n setToasts((prev) => prev.filter((x) => x.id !== t.id))\r\n }>\r\n ✕\r\n </button>\r\n </div>\r\n ))}\r\n </div>\r\n </ToastContext.Provider>\r\n );\r\n};\r\n"],"names":["_jsx","_Fragment","_jsxs","createContext","useContext","useState"],"mappings":"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","x_google_ignoreList":[0]}
@@ -0,0 +1,15 @@
1
+ import './button.css';
2
+ export interface ButtonProps {
3
+ /** Is this the principal call to action on the page? */
4
+ primary?: boolean;
5
+ /** What background color to use */
6
+ backgroundColor?: string;
7
+ /** How large should the button be? */
8
+ size?: 'small' | 'medium' | 'large';
9
+ /** Button contents */
10
+ label: string;
11
+ /** Optional click handler */
12
+ onClick?: () => void;
13
+ }
14
+ /** Primary UI component for user interaction */
15
+ export declare const Button: ({ primary, size, backgroundColor, label, ...props }: ButtonProps) => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,8 @@
1
+ import type { StoryObj } from '@storybook/react-webpack5';
2
+ declare const meta: Meta<({ primary, size, backgroundColor, label, ...props }: import("./Button").ButtonProps) => import("react/jsx-runtime").JSX.Element>;
3
+ export default meta;
4
+ type Story = StoryObj<typeof meta>;
5
+ export declare const Primary: Story;
6
+ export declare const Secondary: Story;
7
+ export declare const Large: Story;
8
+ export declare const Small: Story;
@@ -0,0 +1,12 @@
1
+ import './header.css';
2
+ type User = {
3
+ name: string;
4
+ };
5
+ export interface HeaderProps {
6
+ user?: User;
7
+ onLogin?: () => void;
8
+ onLogout?: () => void;
9
+ onCreateAccount?: () => void;
10
+ }
11
+ export declare const Header: ({ user, onLogin, onLogout, onCreateAccount }: HeaderProps) => import("react/jsx-runtime").JSX.Element;
12
+ export {};
@@ -0,0 +1,6 @@
1
+ import type { StoryObj } from '@storybook/react-webpack5';
2
+ declare const meta: Meta<({ user, onLogin, onLogout, onCreateAccount }: import("./Header").HeaderProps) => import("react/jsx-runtime").JSX.Element>;
3
+ export default meta;
4
+ type Story = StoryObj<typeof meta>;
5
+ export declare const LoggedIn: Story;
6
+ export declare const LoggedOut: Story;
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ import './page.css';
3
+ export declare const Page: React.FC;
@@ -0,0 +1,6 @@
1
+ import type { StoryObj } from '@storybook/react-webpack5';
2
+ declare const meta: Meta<import("react").FC<{}>>;
3
+ export default meta;
4
+ type Story = StoryObj<typeof meta>;
5
+ export declare const LoggedOut: Story;
6
+ export declare const LoggedIn: Story;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@houssemdi2000/design-system",
3
- "version": "1.0.0",
3
+ "version": "1.2.0",
4
4
  "description": "Mon système de design React",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.esm.js",
@@ -10,7 +10,11 @@
10
10
  ],
11
11
  "scripts": {
12
12
  "build": "rollup -c",
13
- "prepublishOnly": "npm run build"
13
+ "test": "jest",
14
+ "test:watch": "jest --watch",
15
+ "prepublishOnly": "npm run build",
16
+ "storybook": "storybook dev -p 6006",
17
+ "build-storybook": "storybook build"
14
18
  },
15
19
  "peerDependencies": {
16
20
  "react": "^18.0.0",
@@ -28,11 +32,26 @@
28
32
  "@rollup/plugin-commonjs": "^29.0.0",
29
33
  "@rollup/plugin-node-resolve": "^16.0.3",
30
34
  "@rollup/plugin-typescript": "^12.3.0",
35
+ "@storybook/addon-a11y": "^10.1.4",
36
+ "@storybook/addon-docs": "^10.1.4",
37
+ "@storybook/addon-webpack5-compiler-swc": "^4.0.2",
38
+ "@storybook/react-webpack5": "^10.1.4",
39
+ "@testing-library/jest-dom": "^6.9.1",
40
+ "@testing-library/react": "^16.3.0",
41
+ "@testing-library/user-event": "^14.6.1",
42
+ "@types/jest": "^30.0.0",
31
43
  "@types/react": "^19.2.7",
32
44
  "@types/react-dom": "^19.2.3",
45
+ "@vitest/mocker": "^4.0.15",
46
+ "identity-obj-proxy": "^3.0.0",
47
+ "jest": "^30.2.0",
48
+ "jest-environment-jsdom": "^30.2.0",
49
+ "jsdom": "^27.0.1",
33
50
  "rollup": "^4.53.3",
34
51
  "rollup-plugin-peer-deps-external": "^2.2.4",
35
52
  "rollup-plugin-postcss": "^4.0.2",
53
+ "storybook": "^10.1.4",
54
+ "ts-jest": "^29.4.6",
36
55
  "tslib": "^2.8.1",
37
56
  "typescript": "^5.9.3"
38
57
  }