@lystech/sections 0.5.1 → 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/dist/types.d.ts CHANGED
@@ -26,6 +26,29 @@ export type BlocDeclare = {
26
26
  pages?: string[] | null;
27
27
  maxPerPage?: number | null;
28
28
  };
29
+ /**
30
+ * À QUI S'ADRESSE UNE SECTION (fidélité). Choisi dans l'éditeur, appliqué
31
+ * par le SERVEUR : une section réservée n'est jamais envoyée à qui n'y a
32
+ * pas droit — ni dans la route publique, ni dans le HTML prérendu.
33
+ */
34
+ export type AudienceSection = {
35
+ mode: "everyone";
36
+ } | {
37
+ mode: "loggedIn";
38
+ } | {
39
+ mode: "members";
40
+ } | {
41
+ mode: "nonMembers";
42
+ } | {
43
+ mode: "plans";
44
+ plans: string[];
45
+ };
46
+ /** Le visiteur tel que le SERVEUR l'a reconnu (jamais tel que la page le croit). */
47
+ export type Visiteur = {
48
+ isLoggedIn: boolean;
49
+ isMember: boolean;
50
+ activePlanUIDs: string[];
51
+ };
29
52
  /** Une section telle qu'elle revient du serveur. */
30
53
  export type SectionPubliee = {
31
54
  UID: string;
@@ -33,6 +56,13 @@ export type SectionPubliee = {
33
56
  blockType: string;
34
57
  position: number;
35
58
  data: Record<string, unknown> | null;
59
+ /**
60
+ * La section existe mais CE visiteur ne doit pas la voir : elle arrive
61
+ * SANS contenu. Le site n'affiche alors ni elle, ni son repli.
62
+ */
63
+ hidden?: boolean;
64
+ /** Présente seulement dans l'aperçu d'une éditrice (mode édition). */
65
+ audience?: AudienceSection;
36
66
  };
37
67
  export type ValeurTraduite = {
38
68
  [langue: string]: unknown;
@@ -1,3 +1,4 @@
1
+ import { AudienceSection } from './types';
1
2
  /**
2
3
  * LES ATTRIBUTS À POSER SUR LE CONTENEUR DE LA SECTION.
3
4
  *
@@ -16,9 +17,42 @@
16
17
  export type AncrageEdition = {
17
18
  "data-lystech-section": string;
18
19
  };
20
+ /**
21
+ * LES ATTRIBUTS À POSER SUR L'ÉLÉMENT QUI AFFICHE UN CHAMP — un prix, un
22
+ * numéro, une adresse.
23
+ *
24
+ * Un texte traduit se retrouve tout seul dans la page : l'éditeur connaît
25
+ * le dictionnaire du site. Un NOMBRE, lui, se fond dans un format (« 85 $ »,
26
+ * « $85 ») : rien ne permet de deviner que ce 85 est le prix de la séance.
27
+ * Le site le dit en étalant ces attributs sur l'élément qui ne contient QUE
28
+ * la valeur :
29
+ *
30
+ * const { contenu, champ } = useSection("tarifs", { defaut });
31
+ * return <p><span {...champ("seance")}>{contenu.seance}</span> $</p>;
32
+ *
33
+ * En mode édition, un clic dessus permet de corriger la valeur sur place.
34
+ * Pour un visiteur, c'est un attribut `data-` inerte.
35
+ */
36
+ export type ChampEdition = {
37
+ "data-lystech-champ": string;
38
+ };
19
39
  export type ResultatSection<T> = {
20
40
  /** Le contenu à afficher : aperçu, sinon publié, sinon défaut. */
21
41
  contenu: T;
42
+ /**
43
+ * FAUX quand la section est RÉSERVÉE à une autre audience que ce visiteur
44
+ * (membres, plan précis, connectés…). Le site ne l'affiche pas — ni elle,
45
+ * ni son repli :
46
+ *
47
+ * const { contenu, visible } = useSection("offre-membres", { defaut });
48
+ * if (!visible) return null;
49
+ *
50
+ * RÈGLE : un contenu réservé ne va JAMAIS dans le `defaut` du code (le code
51
+ * du site est public). Il s'écrit dans l'éditeur, où le serveur le garde.
52
+ */
53
+ visible: boolean;
54
+ /** Audience de la section — seulement dans l'aperçu d'une éditrice. */
55
+ audience: AudienceSection | null;
22
56
  /** Vrai quand le contenu vient du serveur, faux quand c'est le défaut. */
23
57
  publie: boolean;
24
58
  /** L'identifiant de la section — nécessaire à l'édition. */
@@ -26,6 +60,8 @@ export type ResultatSection<T> = {
26
60
  chargement: boolean;
27
61
  /** À étaler sur le conteneur pour que l'éditeur puisse le situer. */
28
62
  ancrage: AncrageEdition;
63
+ /** À étaler sur l'élément qui affiche UN champ, pour le corriger sur place. */
64
+ champ: (nom: keyof T & string) => ChampEdition;
29
65
  };
30
66
  /**
31
67
  * Le contenu d'un type de bloc sur la page courante.
package/package.json CHANGED
@@ -1,46 +1,46 @@
1
- {
2
- "name": "@lystech/sections",
3
- "version": "0.5.1",
4
- "description": "Contenu de site editable par le client — lecture legere, edition chargee a la demande.",
5
- "type": "module",
6
- "main": "./dist/index.js",
7
- "module": "./dist/index.js",
8
- "types": "./dist/index.d.ts",
9
- "exports": {
10
- ".": {
11
- "types": "./dist/index.d.ts",
12
- "import": "./dist/index.js"
13
- },
14
- "./editeur": {
15
- "types": "./dist/editeur/index.d.ts",
16
- "import": "./dist/editeur.js"
17
- }
18
- },
19
- "sideEffects": false,
20
- "files": [
21
- "dist"
22
- ],
23
- "scripts": {
24
- "build": "tsc -b && vite build",
25
- "dev": "vite build --watch"
26
- },
27
- "peerDependencies": {
28
- "react": ">=18",
29
- "react-dom": ">=18"
30
- },
31
- "devDependencies": {
32
- "@types/react": "^19.0.0",
33
- "@types/react-dom": "^19.0.0",
34
- "react": "^19.0.0",
35
- "react-dom": "^19.0.0",
36
- "typescript": "^5.7.2",
37
- "vite": "^7.0.0",
38
- "vite-plugin-dts": "^4.5.4"
39
- },
40
- "publishConfig": {
41
- "access": "public"
42
- },
43
- "dependencies": {
44
- "firebase": "^12.19.0"
45
- }
46
- }
1
+ {
2
+ "name": "@lystech/sections",
3
+ "version": "0.8.0",
4
+ "description": "Contenu de site editable par le client — lecture legere, edition chargee a la demande.",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js"
13
+ },
14
+ "./editeur": {
15
+ "types": "./dist/editeur/index.d.ts",
16
+ "import": "./dist/editeur.js"
17
+ }
18
+ },
19
+ "sideEffects": false,
20
+ "files": [
21
+ "dist"
22
+ ],
23
+ "scripts": {
24
+ "build": "tsc -b && vite build",
25
+ "dev": "vite build --watch"
26
+ },
27
+ "peerDependencies": {
28
+ "react": ">=18",
29
+ "react-dom": ">=18"
30
+ },
31
+ "devDependencies": {
32
+ "@types/react": "^19.0.0",
33
+ "@types/react-dom": "^19.0.0",
34
+ "react": "^19.0.0",
35
+ "react-dom": "^19.0.0",
36
+ "typescript": "^5.7.2",
37
+ "vite": "^7.0.0",
38
+ "vite-plugin-dts": "^4.5.4"
39
+ },
40
+ "publishConfig": {
41
+ "access": "public"
42
+ },
43
+ "dependencies": {
44
+ "firebase": "^12.19.0"
45
+ }
46
+ }
@@ -1,19 +0,0 @@
1
- const o = "lystech-edit", t = "lystech-edit-sortie";
2
- function e() {
3
- try {
4
- window.localStorage.setItem(t, "1"), window.localStorage.removeItem(o);
5
- } catch {
6
- }
7
- try {
8
- window.sessionStorage.removeItem(o);
9
- } catch {
10
- }
11
- window.location.reload();
12
- }
13
- const s = "lystech-hors-edition";
14
- export {
15
- s as C,
16
- t as a,
17
- o as b,
18
- e as s
19
- };