@sia-ui/react 0.7.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,57 @@
1
1
  # @sia-ui/react
2
2
 
3
+ ## 0.8.0
4
+
5
+ ### Minor Changes
6
+
7
+ - Français et anglais livrés, temps réel, calendrier réécrit, suivi d'opérations.
8
+ - **Deux langues** — `FRENCH` et `ENGLISH` (`@sia-ui/headless`), au format
9
+ `SiaLocale` : la langue de formatage (`language`), le vocabulaire commun et
10
+ un groupe typé par composant. Plus aucun texte en dur dans les composants,
11
+ `aria-label` compris ; dates, nombres et pluriels suivent `language`. Une
12
+ application qui a sa propre i18n remplit le même format. `formatMessage` et
13
+ `plural` (`{count}`, clés `_one` / `_other`). `ENGLISH_STATUS_MESSAGES`
14
+ (`@sia-ui/api`) à côté de `FRENCH_STATUS_MESSAGES`.
15
+ Seul changement de forme : `EventCalendarLabels.more`, qui était une
16
+ fonction, devient `more_one` / `more_other` avec `{count}`.
17
+ - **`SiaProvider` seul fournisseur** — il prend `locale` et `defaults`, et
18
+ s'imbrique pour une section. `SiaConfigProvider` est obsolète.
19
+ - **Temps réel** — `createRealtimeBinding`, `socketIoSource`,
20
+ `eventSourceSource` (`@sia-ui/api`), `useRealtimeStatus`, `LiveIndicator`.
21
+ - **`EventCalendar` réécrit** — vues mois, semaine, jour, agenda ; variantes ;
22
+ mode étroit. **`EventManager`** : créer, consulter, modifier, supprimer.
23
+ - **Nouveaux composants** — `AccountMenu`, `ColorModeToggle`, `LogStream`,
24
+ `JsonView`, `JobProgress`, `BrandIcon` ; `SunIcon`, `MoonIcon`.
25
+ - **Formulaires** — `validateAsync` par champ, `submitProps.disabled`
26
+ respecté ; `controlProps` sur une propriété de ressource.
27
+ - **Tons lisibles en mode sombre** — `--sia-<ton>-foreground`, calculés pour
28
+ le contraste ; noms de variables CSS en kebab-case.
29
+ - **Couches en portail** — menus, calendriers, boîtes et toasts, rendus hors
30
+ de `[data-sia-root]`, reprennent la police et la couleur de texte du
31
+ système au lieu de celles du navigateur.
32
+ - **`Drawer` et `Modal`** — la fermeture est signalée tout de suite ; un
33
+ double clic à l'ouverture ne referme plus.
34
+ - **Documentation** — la présentation décrit chaque brique métier (session,
35
+ greffons d'API, ressources, formulaires, temps réel, langues, utilitaires)
36
+ avec son scénario et un exemple.
37
+ - **Props des sous-composants** — chaque composant composé expose celles de
38
+ ce qu'il utilise (`…Props`) ; `pnpm check:slot-props` le vérifie.
39
+
40
+ ### Patch Changes
41
+
42
+ - Updated dependencies
43
+ - @sia-ui/headless@0.8.0
44
+ - @sia-ui/tokens@0.8.0
45
+
46
+ ## 0.7.1
47
+
48
+ ### Patch Changes
49
+
50
+ - Aligne les packages publics de SIA UI sur la version 0.7.1 afin que les huit packages restent sur une version commune.
51
+ - Updated dependencies
52
+ - @sia-ui/tokens@0.7.1
53
+ - @sia-ui/utils@0.7.1
54
+
3
55
  ## 0.7.0
4
56
 
5
57
  ### Minor Changes
package/README.md CHANGED
@@ -12,7 +12,9 @@ pnpm add @sia-ui/react
12
12
  import { SiaProvider, Portal, usePortal, useOutsideClick } from "@sia-ui/react";
13
13
  ```
14
14
 
15
- - `SiaProvider` — thème clair/sombre, variables CSS;
15
+ - `SiaProvider` — le seul fournisseur : thème clair/sombre, variables CSS,
16
+ langue (`locale={ENGLISH}`) et valeurs par défaut des composants. Il
17
+ s'imbrique pour une section, et ne remplace que ce qu'on lui passe;
16
18
  - `Portal` et `usePortal` — rendre hors du flux, sans casser le rendu serveur;
17
19
  - `useOutsideClick` — écoute `pointerdown`, pas `click` : une sélection de
18
20
  texte qui déborde ne ferme pas l'overlay;
@@ -51,6 +53,58 @@ Le contenu ci-dessous reprend intégralement `CHANGELOG.md` pour rester visible
51
53
  <!-- sia:changelog:start -->
52
54
  # @sia-ui/react
53
55
 
56
+ ## 0.8.0
57
+
58
+ ### Minor Changes
59
+
60
+ - Français et anglais livrés, temps réel, calendrier réécrit, suivi d'opérations.
61
+ - **Deux langues** — `FRENCH` et `ENGLISH` (`@sia-ui/headless`), au format
62
+ `SiaLocale` : la langue de formatage (`language`), le vocabulaire commun et
63
+ un groupe typé par composant. Plus aucun texte en dur dans les composants,
64
+ `aria-label` compris ; dates, nombres et pluriels suivent `language`. Une
65
+ application qui a sa propre i18n remplit le même format. `formatMessage` et
66
+ `plural` (`{count}`, clés `_one` / `_other`). `ENGLISH_STATUS_MESSAGES`
67
+ (`@sia-ui/api`) à côté de `FRENCH_STATUS_MESSAGES`.
68
+ Seul changement de forme : `EventCalendarLabels.more`, qui était une
69
+ fonction, devient `more_one` / `more_other` avec `{count}`.
70
+ - **`SiaProvider` seul fournisseur** — il prend `locale` et `defaults`, et
71
+ s'imbrique pour une section. `SiaConfigProvider` est obsolète.
72
+ - **Temps réel** — `createRealtimeBinding`, `socketIoSource`,
73
+ `eventSourceSource` (`@sia-ui/api`), `useRealtimeStatus`, `LiveIndicator`.
74
+ - **`EventCalendar` réécrit** — vues mois, semaine, jour, agenda ; variantes ;
75
+ mode étroit. **`EventManager`** : créer, consulter, modifier, supprimer.
76
+ - **Nouveaux composants** — `AccountMenu`, `ColorModeToggle`, `LogStream`,
77
+ `JsonView`, `JobProgress`, `BrandIcon` ; `SunIcon`, `MoonIcon`.
78
+ - **Formulaires** — `validateAsync` par champ, `submitProps.disabled`
79
+ respecté ; `controlProps` sur une propriété de ressource.
80
+ - **Tons lisibles en mode sombre** — `--sia-<ton>-foreground`, calculés pour
81
+ le contraste ; noms de variables CSS en kebab-case.
82
+ - **Couches en portail** — menus, calendriers, boîtes et toasts, rendus hors
83
+ de `[data-sia-root]`, reprennent la police et la couleur de texte du
84
+ système au lieu de celles du navigateur.
85
+ - **`Drawer` et `Modal`** — la fermeture est signalée tout de suite ; un
86
+ double clic à l'ouverture ne referme plus.
87
+ - **Documentation** — la présentation décrit chaque brique métier (session,
88
+ greffons d'API, ressources, formulaires, temps réel, langues, utilitaires)
89
+ avec son scénario et un exemple.
90
+ - **Props des sous-composants** — chaque composant composé expose celles de
91
+ ce qu'il utilise (`…Props`) ; `pnpm check:slot-props` le vérifie.
92
+
93
+ ### Patch Changes
94
+
95
+ - Updated dependencies
96
+ - @sia-ui/headless@0.8.0
97
+ - @sia-ui/tokens@0.8.0
98
+
99
+ ## 0.7.1
100
+
101
+ ### Patch Changes
102
+
103
+ - Aligne les packages publics de SIA UI sur la version 0.7.1 afin que les huit packages restent sur une version commune.
104
+ - Updated dependencies
105
+ - @sia-ui/tokens@0.7.1
106
+ - @sia-ui/utils@0.7.1
107
+
54
108
  ## 0.7.0
55
109
 
56
110
  ### Minor Changes
package/dist/index.cjs CHANGED
@@ -2,6 +2,7 @@
2
2
 
3
3
  var react = require('react');
4
4
  var tokens = require('@sia-ui/tokens');
5
+ var headless = require('@sia-ui/headless');
5
6
  var jsxRuntime = require('react/jsx-runtime');
6
7
  var reactDom = require('react-dom');
7
8
  var clipboard = require('@sia-ui/utils/clipboard');
@@ -119,13 +120,74 @@ var ThemeContext = react.createContext({
119
120
  toggleColorMode: () => {
120
121
  }
121
122
  });
122
- function SiaProvider({
123
+ var DejaFourni = react.createContext(false);
124
+ function SiaProvider(props) {
125
+ const imbrique = react.useContext(DejaFourni);
126
+ if (imbrique) return /* @__PURE__ */ jsxRuntime.jsx(SectionSia, { ...props });
127
+ return /* @__PURE__ */ jsxRuntime.jsx(DejaFourni.Provider, { value: true, children: /* @__PURE__ */ jsxRuntime.jsx(RacineSia, { ...props }) });
128
+ }
129
+ function Reglages({
130
+ locale,
131
+ defaults,
132
+ children
133
+ }) {
134
+ if (!locale && !defaults) return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children });
135
+ return /* @__PURE__ */ jsxRuntime.jsx(
136
+ headless.SiaConfigProvider,
137
+ {
138
+ ...locale ? { locale } : {},
139
+ ...defaults ? { defaults } : {},
140
+ children
141
+ }
142
+ );
143
+ }
144
+ function SectionSia({
145
+ children,
146
+ colorMode,
147
+ theme,
148
+ locale,
149
+ defaults,
150
+ className
151
+ }) {
152
+ const parent = react.useContext(ThemeContext);
153
+ const force = colorMode === "light" || colorMode === "dark" ? colorMode : void 0;
154
+ const resolved = force ?? parent.resolvedColorMode;
155
+ const habille = force !== void 0 || theme !== void 0 || className !== void 0;
156
+ const variables = react.useMemo(() => {
157
+ if (!habille) return void 0;
158
+ return {
159
+ // Le mode seul ne change que le sémantique ; les primitives sont déjà
160
+ // posées par la racine.
161
+ ...force ? tokens.toCssVariables(force === "dark" ? tokens.darkTheme : tokens.lightTheme) : {},
162
+ ...tokens.toCssVariables(theme ?? {})
163
+ };
164
+ }, [habille, force, theme]);
165
+ const valeur = react.useMemo(
166
+ () => force ? { ...parent, resolvedColorMode: force } : parent,
167
+ [force, parent]
168
+ );
169
+ const contenu = /* @__PURE__ */ jsxRuntime.jsx(Reglages, { locale, defaults, children });
170
+ if (!habille) return contenu;
171
+ return /* @__PURE__ */ jsxRuntime.jsx(ThemeContext.Provider, { value: valeur, children: /* @__PURE__ */ jsxRuntime.jsx(
172
+ "div",
173
+ {
174
+ className,
175
+ "data-sia-color-mode": resolved,
176
+ style: { ...variables, colorScheme: resolved },
177
+ ...locale?.language ? { lang: locale.language } : {},
178
+ children: contenu
179
+ }
180
+ ) });
181
+ }
182
+ function RacineSia({
123
183
  children,
124
184
  colorMode: controlled,
125
185
  defaultColorMode = "system",
126
186
  onColorModeChange,
127
187
  storageKey = COLOR_MODE_KEY,
128
188
  theme,
189
+ locale,
190
+ defaults,
129
191
  className
130
192
  }) {
131
193
  const [stored, setStored] = useLocalStorage(
@@ -174,7 +236,8 @@ function SiaProvider({
174
236
  "data-sia-root": "",
175
237
  "data-sia-color-mode": resolved,
176
238
  style: variables,
177
- children
239
+ ...locale?.language ? { lang: locale.language } : {},
240
+ children: /* @__PURE__ */ jsxRuntime.jsx(Reglages, { locale, defaults, children })
178
241
  }
179
242
  ) });
180
243
  }
package/dist/index.d.cts CHANGED
@@ -2,6 +2,7 @@ import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import * as react from 'react';
3
3
  import { PropsWithChildren, Ref, RefCallback, RefObject } from 'react';
4
4
  import { SiaTheme } from '@sia-ui/tokens';
5
+ import { SiaLocaleInput, SiaComponentDefaults } from '@sia-ui/headless';
5
6
 
6
7
  /** Ce que l'application demande. */
7
8
  type ColorMode = "light" | "dark" | "system";
@@ -17,6 +18,14 @@ interface SiaProviderProps extends PropsWithChildren {
17
18
  /** Clé de persistance, ou `false` pour ne rien enregistrer. */
18
19
  storageKey?: string | false;
19
20
  theme?: SiaTheme;
21
+ /**
22
+ * Les textes des composants et la langue des dates et nombres : `FRENCH`
23
+ * (par défaut), `ENGLISH`, ou une locale remplie par l'application —
24
+ * depuis i18next ou ailleurs. Voir `SiaLocale`.
25
+ */
26
+ locale?: SiaLocaleInput;
27
+ /** Les props par défaut, par composant. Voir `SiaConfigProvider`. */
28
+ defaults?: SiaComponentDefaults;
20
29
  className?: string;
21
30
  }
22
31
  interface ThemeValue {
@@ -29,14 +38,23 @@ interface ThemeValue {
29
38
  toggleColorMode: () => void;
30
39
  }
31
40
  /**
32
- * Le thème de l'application.
41
+ * Le fournisseur de SIA UI : thème, mode clair / sombre, textes des
42
+ * composants et réglages par défaut. Le seul à poser.
43
+ *
44
+ * À la racine, il applique le thème et gère le mode. Imbriqué, il ne
45
+ * remplace que ce qu'on lui passe, pour la section qu'il entoure : une autre
46
+ * locale, un autre réglage par défaut, un thème ou un mode forcé.
33
47
  *
34
- * `next-themes` apparaît dans cinq des projets du disque D, pour cette seule
35
- * fonction. Il tient ici en un fournisseur, sans dépendance et sans être lié
36
- * à un cadre : `system` suit la préférence du poste, le choix est enregistré,
37
- * et `colorMode` reste disponible pour piloter le mode depuis l'extérieur.
48
+ * ```tsx
49
+ * <SiaProvider locale={ENGLISH}>
50
+ * <App />
51
+ * <SiaProvider defaults={{ button: { size: "sm" } }}>
52
+ * <Barre />
53
+ * </SiaProvider>
54
+ * </SiaProvider>
55
+ * ```
38
56
  */
39
- declare function SiaProvider({ children, colorMode: controlled, defaultColorMode, onColorModeChange, storageKey, theme, className, }: SiaProviderProps): react_jsx_runtime.JSX.Element;
57
+ declare function SiaProvider(props: SiaProviderProps): react_jsx_runtime.JSX.Element;
40
58
  /** Le thème en vigueur, et de quoi en changer. */
41
59
  declare function useSiaTheme(): ThemeValue;
42
60
  /**
package/dist/index.d.ts CHANGED
@@ -2,6 +2,7 @@ import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import * as react from 'react';
3
3
  import { PropsWithChildren, Ref, RefCallback, RefObject } from 'react';
4
4
  import { SiaTheme } from '@sia-ui/tokens';
5
+ import { SiaLocaleInput, SiaComponentDefaults } from '@sia-ui/headless';
5
6
 
6
7
  /** Ce que l'application demande. */
7
8
  type ColorMode = "light" | "dark" | "system";
@@ -17,6 +18,14 @@ interface SiaProviderProps extends PropsWithChildren {
17
18
  /** Clé de persistance, ou `false` pour ne rien enregistrer. */
18
19
  storageKey?: string | false;
19
20
  theme?: SiaTheme;
21
+ /**
22
+ * Les textes des composants et la langue des dates et nombres : `FRENCH`
23
+ * (par défaut), `ENGLISH`, ou une locale remplie par l'application —
24
+ * depuis i18next ou ailleurs. Voir `SiaLocale`.
25
+ */
26
+ locale?: SiaLocaleInput;
27
+ /** Les props par défaut, par composant. Voir `SiaConfigProvider`. */
28
+ defaults?: SiaComponentDefaults;
20
29
  className?: string;
21
30
  }
22
31
  interface ThemeValue {
@@ -29,14 +38,23 @@ interface ThemeValue {
29
38
  toggleColorMode: () => void;
30
39
  }
31
40
  /**
32
- * Le thème de l'application.
41
+ * Le fournisseur de SIA UI : thème, mode clair / sombre, textes des
42
+ * composants et réglages par défaut. Le seul à poser.
43
+ *
44
+ * À la racine, il applique le thème et gère le mode. Imbriqué, il ne
45
+ * remplace que ce qu'on lui passe, pour la section qu'il entoure : une autre
46
+ * locale, un autre réglage par défaut, un thème ou un mode forcé.
33
47
  *
34
- * `next-themes` apparaît dans cinq des projets du disque D, pour cette seule
35
- * fonction. Il tient ici en un fournisseur, sans dépendance et sans être lié
36
- * à un cadre : `system` suit la préférence du poste, le choix est enregistré,
37
- * et `colorMode` reste disponible pour piloter le mode depuis l'extérieur.
48
+ * ```tsx
49
+ * <SiaProvider locale={ENGLISH}>
50
+ * <App />
51
+ * <SiaProvider defaults={{ button: { size: "sm" } }}>
52
+ * <Barre />
53
+ * </SiaProvider>
54
+ * </SiaProvider>
55
+ * ```
38
56
  */
39
- declare function SiaProvider({ children, colorMode: controlled, defaultColorMode, onColorModeChange, storageKey, theme, className, }: SiaProviderProps): react_jsx_runtime.JSX.Element;
57
+ declare function SiaProvider(props: SiaProviderProps): react_jsx_runtime.JSX.Element;
40
58
  /** Le thème en vigueur, et de quoi en changer. */
41
59
  declare function useSiaTheme(): ThemeValue;
42
60
  /**
package/dist/index.js CHANGED
@@ -1,6 +1,7 @@
1
- import { createContext, useState, useRef, useEffect, useCallback, useSyncExternalStore, useMemo, useContext } from 'react';
1
+ import { createContext, useState, useRef, useEffect, useCallback, useSyncExternalStore, useContext, useMemo } from 'react';
2
2
  import { toCssVariables, darkTheme, lightTheme, primitives } from '@sia-ui/tokens';
3
- import { jsx } from 'react/jsx-runtime';
3
+ import { SiaConfigProvider } from '@sia-ui/headless';
4
+ import { jsx, Fragment } from 'react/jsx-runtime';
4
5
  import { createPortal } from 'react-dom';
5
6
  import { copyText } from '@sia-ui/utils/clipboard';
6
7
 
@@ -117,13 +118,74 @@ var ThemeContext = createContext({
117
118
  toggleColorMode: () => {
118
119
  }
119
120
  });
120
- function SiaProvider({
121
+ var DejaFourni = createContext(false);
122
+ function SiaProvider(props) {
123
+ const imbrique = useContext(DejaFourni);
124
+ if (imbrique) return /* @__PURE__ */ jsx(SectionSia, { ...props });
125
+ return /* @__PURE__ */ jsx(DejaFourni.Provider, { value: true, children: /* @__PURE__ */ jsx(RacineSia, { ...props }) });
126
+ }
127
+ function Reglages({
128
+ locale,
129
+ defaults,
130
+ children
131
+ }) {
132
+ if (!locale && !defaults) return /* @__PURE__ */ jsx(Fragment, { children });
133
+ return /* @__PURE__ */ jsx(
134
+ SiaConfigProvider,
135
+ {
136
+ ...locale ? { locale } : {},
137
+ ...defaults ? { defaults } : {},
138
+ children
139
+ }
140
+ );
141
+ }
142
+ function SectionSia({
143
+ children,
144
+ colorMode,
145
+ theme,
146
+ locale,
147
+ defaults,
148
+ className
149
+ }) {
150
+ const parent = useContext(ThemeContext);
151
+ const force = colorMode === "light" || colorMode === "dark" ? colorMode : void 0;
152
+ const resolved = force ?? parent.resolvedColorMode;
153
+ const habille = force !== void 0 || theme !== void 0 || className !== void 0;
154
+ const variables = useMemo(() => {
155
+ if (!habille) return void 0;
156
+ return {
157
+ // Le mode seul ne change que le sémantique ; les primitives sont déjà
158
+ // posées par la racine.
159
+ ...force ? toCssVariables(force === "dark" ? darkTheme : lightTheme) : {},
160
+ ...toCssVariables(theme ?? {})
161
+ };
162
+ }, [habille, force, theme]);
163
+ const valeur = useMemo(
164
+ () => force ? { ...parent, resolvedColorMode: force } : parent,
165
+ [force, parent]
166
+ );
167
+ const contenu = /* @__PURE__ */ jsx(Reglages, { locale, defaults, children });
168
+ if (!habille) return contenu;
169
+ return /* @__PURE__ */ jsx(ThemeContext.Provider, { value: valeur, children: /* @__PURE__ */ jsx(
170
+ "div",
171
+ {
172
+ className,
173
+ "data-sia-color-mode": resolved,
174
+ style: { ...variables, colorScheme: resolved },
175
+ ...locale?.language ? { lang: locale.language } : {},
176
+ children: contenu
177
+ }
178
+ ) });
179
+ }
180
+ function RacineSia({
121
181
  children,
122
182
  colorMode: controlled,
123
183
  defaultColorMode = "system",
124
184
  onColorModeChange,
125
185
  storageKey = COLOR_MODE_KEY,
126
186
  theme,
187
+ locale,
188
+ defaults,
127
189
  className
128
190
  }) {
129
191
  const [stored, setStored] = useLocalStorage(
@@ -172,7 +234,8 @@ function SiaProvider({
172
234
  "data-sia-root": "",
173
235
  "data-sia-color-mode": resolved,
174
236
  style: variables,
175
- children
237
+ ...locale?.language ? { lang: locale.language } : {},
238
+ children: /* @__PURE__ */ jsx(Reglages, { locale, defaults, children })
176
239
  }
177
240
  ) });
178
241
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sia-ui/react",
3
- "version": "0.7.0",
3
+ "version": "0.8.0",
4
4
  "description": "React runtime foundations for SIA UI.",
5
5
  "keywords": [
6
6
  "sia-ui",
@@ -44,8 +44,9 @@
44
44
  "access": "public"
45
45
  },
46
46
  "dependencies": {
47
- "@sia-ui/tokens": "0.7.0",
48
- "@sia-ui/utils": "0.7.0"
47
+ "@sia-ui/headless": "0.8.0",
48
+ "@sia-ui/tokens": "0.8.0",
49
+ "@sia-ui/utils": "0.8.0"
49
50
  },
50
51
  "peerDependencies": {
51
52
  "react": ">=18.2.0",