@egen-civitas/esm-extensions 2.1.0 → 2.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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # @egen-civitas/esm-extensions
2
2
 
3
+ ## 2.2.0
4
+
5
+ ### Minor Changes
6
+
7
+ - fa07dbd: Compartiments verticaux dans les zones gauche et droite. Chaque zone devient une pile de compartiments dont les hauteurs (en % de la zone) totalisent toujours 100 : aucun débordement, contenu défilant en interne, redimensionnement libre entre voisins (les autres s'ajustent selon leurs minimum et maximum). La zone actuelle devient le compartiment par défaut (dimensions fixées par le shell) et porte désormais le fond sombre à la place de la zone. Une app choisit, dans la `meta` de son option de rail, d'afficher dans le compartiment par défaut ou dans un compartiment propre via `meta.compartment` (`{ height, minHeight, maxHeight }` en %, valeurs par défaut `DEFAULT_COMPARTMENT_HEIGHTS`). Nouveaux exports : `getToolWindowCompartment`, `DEFAULT_COMPARTMENT_HEIGHTS`, `ToolWindowCompartment`, `closeToolWindow(anchor, id?)` pour fermer un seul compartiment.
8
+
3
9
  ## 2.1.0
4
10
 
5
11
  ### Minor Changes
package/dist/public.d.ts CHANGED
@@ -4,7 +4,7 @@ export { type ExtensionMeta, type ExtensionRegistration, type ExtensionStore, ty
4
4
  export { type WorkspaceRegistration } from './workspaces.js';
5
5
  export { type ExtensionData, type ComponentConfig } from './types.js';
6
6
  export { TOPBAR_LEVEL2_NAV_SLOT, NAV_ALL_WORKSPACES, type NavEntryMeta, isNavEntryMeta, isNavEntryInWorkspace, } from './nav-entry.js';
7
- export { SHELL_RAIL_LEFT_SLOT, SHELL_RAIL_BOTTOM_SLOT, SHELL_RAIL_RIGHT_SLOT, TOOL_WINDOW_SLOTS, type ToolWindowAnchor, type ToolWindowMeta, isToolWindowMeta, isToolWindowSlot, isSafeToolWindowIconUrl, getToolWindowMetaProblems, } from './tool-window.js';
7
+ export { SHELL_RAIL_LEFT_SLOT, SHELL_RAIL_BOTTOM_SLOT, SHELL_RAIL_RIGHT_SLOT, TOOL_WINDOW_SLOTS, type ToolWindowAnchor, type ToolWindowMeta, isToolWindowMeta, isToolWindowSlot, isSafeToolWindowIconUrl, getToolWindowMetaProblems, getToolWindowCompartment, DEFAULT_COMPARTMENT_HEIGHTS, type ToolWindowCompartment, type ResolvedToolWindowCompartment, } from './tool-window.js';
8
8
  export { registerToolWindow, type ToolWindowRegistration } from './tool-window-registration.js';
9
9
  export { type NavBehavior, type NavBehaviorTarget, type NavSelectContext, registerNavBehavior, getNavBehavior, } from './nav-behavior.js';
10
10
  //# sourceMappingURL=public.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"public.d.ts","sourceRoot":"","sources":["../src/public.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,iBAAiB,EACjB,MAAM,EACN,MAAM,EACN,SAAS,EACT,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,KAAK,aAAa,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAClE,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,qBAAqB,EAC1B,KAAK,cAAc,EACnB,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EACvB,iBAAiB,GAClB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,KAAK,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAC7D,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,eAAe,EAAE,MAAM,YAAY,CAAC;AACtE,OAAO,EACL,sBAAsB,EACtB,kBAAkB,EAClB,KAAK,YAAY,EACjB,cAAc,EACd,qBAAqB,GACtB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,oBAAoB,EACpB,sBAAsB,EACtB,qBAAqB,EACrB,iBAAiB,EACjB,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,gBAAgB,EAChB,gBAAgB,EAChB,uBAAuB,EACvB,yBAAyB,GAC1B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,kBAAkB,EAAE,KAAK,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAChG,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,mBAAmB,EACnB,cAAc,GACf,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"public.d.ts","sourceRoot":"","sources":["../src/public.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,iBAAiB,EACjB,MAAM,EACN,MAAM,EACN,SAAS,EACT,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,KAAK,aAAa,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAClE,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,qBAAqB,EAC1B,KAAK,cAAc,EACnB,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EACvB,iBAAiB,GAClB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,KAAK,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAC7D,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,eAAe,EAAE,MAAM,YAAY,CAAC;AACtE,OAAO,EACL,sBAAsB,EACtB,kBAAkB,EAClB,KAAK,YAAY,EACjB,cAAc,EACd,qBAAqB,GACtB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,oBAAoB,EACpB,sBAAsB,EACtB,qBAAqB,EACrB,iBAAiB,EACjB,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,gBAAgB,EAChB,gBAAgB,EAChB,uBAAuB,EACvB,yBAAyB,EACzB,wBAAwB,EACxB,2BAA2B,EAC3B,KAAK,qBAAqB,EAC1B,KAAK,6BAA6B,GACnC,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,kBAAkB,EAAE,KAAK,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAChG,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,mBAAmB,EACnB,cAAc,GACf,MAAM,mBAAmB,CAAC"}
package/dist/public.js CHANGED
@@ -2,6 +2,6 @@ export { getExtensionNameFromId, registerExtension, attach, detach, detachAll, g
2
2
  export { renderExtension } from "./render.js";
3
3
  export { getExtensionStore } from "./store.js";
4
4
  export { TOPBAR_LEVEL2_NAV_SLOT, NAV_ALL_WORKSPACES, isNavEntryMeta, isNavEntryInWorkspace } from "./nav-entry.js";
5
- export { SHELL_RAIL_LEFT_SLOT, SHELL_RAIL_BOTTOM_SLOT, SHELL_RAIL_RIGHT_SLOT, TOOL_WINDOW_SLOTS, isToolWindowMeta, isToolWindowSlot, isSafeToolWindowIconUrl, getToolWindowMetaProblems } from "./tool-window.js";
5
+ export { SHELL_RAIL_LEFT_SLOT, SHELL_RAIL_BOTTOM_SLOT, SHELL_RAIL_RIGHT_SLOT, TOOL_WINDOW_SLOTS, isToolWindowMeta, isToolWindowSlot, isSafeToolWindowIconUrl, getToolWindowMetaProblems, getToolWindowCompartment, DEFAULT_COMPARTMENT_HEIGHTS } from "./tool-window.js";
6
6
  export { registerToolWindow } from "./tool-window-registration.js";
7
7
  export { registerNavBehavior, getNavBehavior } from "./nav-behavior.js";
@@ -1 +1 @@
1
- {"version":3,"file":"tool-window-registration.d.ts","sourceRoot":"","sources":["../src/tool-window-registration.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACxD,OAAO,EAGL,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACpB,MAAM,kBAAkB,CAAC;AAE1B,MAAM,WAAW,sBAAsB;IACrC,+FAA+F;IAC/F,UAAU,EAAE,MAAM,CAAC;IACnB,sEAAsE;IACtE,IAAI,EAAE,MAAM,CAAC;IACb,0GAA0G;IAC1G,MAAM,EAAE,gBAAgB,CAAC;IACzB,yCAAyC;IACzC,IAAI,EAAE,cAAc,CAAC;IACrB,sFAAsF;IACtF,IAAI,EAAE,qBAAqB,CAAC,MAAM,CAAC,CAAC;IACpC,UAAU,CAAC,EAAE,qBAAqB,CAAC,YAAY,CAAC,CAAC;IACjD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,YAAY,EAAE,sBAAsB,GAAG,OAAO,CAwBhF"}
1
+ {"version":3,"file":"tool-window-registration.d.ts","sourceRoot":"","sources":["../src/tool-window-registration.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACxD,OAAO,EAGL,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACpB,MAAM,kBAAkB,CAAC;AAE1B,MAAM,WAAW,sBAAsB;IACrC,+FAA+F;IAC/F,UAAU,EAAE,MAAM,CAAC;IACnB,sEAAsE;IACtE,IAAI,EAAE,MAAM,CAAC;IACb,0GAA0G;IAC1G,MAAM,EAAE,gBAAgB,CAAC;IACzB,yCAAyC;IACzC,IAAI,EAAE,cAAc,CAAC;IACrB,sFAAsF;IACtF,IAAI,EAAE,qBAAqB,CAAC,MAAM,CAAC,CAAC;IACpC,UAAU,CAAC,EAAE,qBAAqB,CAAC,YAAY,CAAC,CAAC;IACjD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,YAAY,EAAE,sBAAsB,GAAG,OAAO,CA6BhF"}
@@ -11,6 +11,9 @@ import { getToolWindowMetaProblems, TOOL_WINDOW_SLOTS } from "./tool-window.js";
11
11
  console.warn(`[workbench] La fenêtre d'outils « ${name} » de ${moduleName} n'est pas enregistrée : ${problems.join(' ; ') || `zone inconnue « ${String(anchor)} »`}.`);
12
12
  return false;
13
13
  }
14
+ if (anchor === 'bottom' && meta.compartment && meta.compartment !== 'default') {
15
+ console.warn(`[workbench] La fenêtre d'outils « ${name} » de ${moduleName} : \`compartment\` est ignoré dans la zone basse (zones gauche et droite uniquement).`);
16
+ }
14
17
  registerExtension({
15
18
  name,
16
19
  moduleName,
@@ -27,6 +27,28 @@ export declare const SHELL_RAIL_RIGHT_SLOT = "shell-rail-right-slot";
27
27
  export type ToolWindowAnchor = 'left' | 'bottom' | 'right';
28
28
  /** Slot de rail associé à chaque zone. */
29
29
  export declare const TOOL_WINDOW_SLOTS: Readonly<Record<ToolWindowAnchor, string>>;
30
+ /**
31
+ * Compartiment propre : bloc vertical redimensionnable d'une zone latérale (gauche ou droite).
32
+ *
33
+ * Une zone latérale est une pile verticale de compartiments dont les hauteurs, exprimées en
34
+ * **pourcentage de la hauteur de la zone**, totalisent toujours 100 : jamais de débordement. Chaque
35
+ * compartiment défile en interne quand son contenu est trop haut, et peut être redimensionné librement
36
+ * (dans ses bornes) face à ses voisins.
37
+ *
38
+ * Toutes les valeurs sont optionnelles : celles qui manquent prennent `DEFAULT_COMPARTMENT_HEIGHTS`.
39
+ */
40
+ export interface ToolWindowCompartment {
41
+ /** Hauteur de base à l'ouverture, en % de la zone (défaut 40). */
42
+ height?: number;
43
+ /** Hauteur minimale, en % de la zone (défaut 15). */
44
+ minHeight?: number;
45
+ /** Hauteur maximale, en % de la zone (défaut 100). */
46
+ maxHeight?: number;
47
+ }
48
+ /** Hauteurs (en % de la zone) d'un compartiment propre dont l'app n'a pas précisé les valeurs. */
49
+ export declare const DEFAULT_COMPARTMENT_HEIGHTS: Readonly<Required<ToolWindowCompartment>>;
50
+ /** Hauteurs résolues d'un compartiment propre : `minHeight <= height <= maxHeight`, tout dans ]0, 100]. */
51
+ export type ResolvedToolWindowCompartment = Required<ToolWindowCompartment>;
30
52
  /** Métadonnées d'une fenêtre d'outils (bouton de rail + titre de zone). */
31
53
  export interface ToolWindowMeta {
32
54
  /** Titre par défaut : info-bulle du bouton et en-tête de la zone. */
@@ -56,7 +78,27 @@ export interface ToolWindowMeta {
56
78
  * qui occupe toute la largeur entre les rails.
57
79
  */
58
80
  rail?: 'left' | 'right';
81
+ /**
82
+ * Zones gauche et droite uniquement : où s'affiche le contenu.
83
+ *
84
+ * - `'default'` (ou absent) : dans le **compartiment par défaut** de la zone, partagé avec les autres
85
+ * fenêtres d'outils du rail (une seule y est affichée à la fois). Ses dimensions sont fixées par le
86
+ * shell et ne sont pas modifiables par les apps.
87
+ * - un objet `ToolWindowCompartment` : dans un **compartiment propre**, empilé verticalement sous/sur les
88
+ * autres, ouvert indépendamment du compartiment par défaut. L'app y définit la hauteur de base, le
89
+ * minimum et le maximum (en % de la zone) ; les valeurs omises prennent `DEFAULT_COMPARTMENT_HEIGHTS`.
90
+ *
91
+ * Sans effet sur la zone basse.
92
+ */
93
+ compartment?: 'default' | ToolWindowCompartment;
59
94
  }
95
+ /**
96
+ * Résout `meta.compartment` : `null` pour le compartiment par défaut, sinon les hauteurs d'un compartiment
97
+ * propre, complétées par `DEFAULT_COMPARTMENT_HEIGHTS` puis rendues cohérentes (`min <= base <= max`).
98
+ */
99
+ export declare function getToolWindowCompartment(meta: {
100
+ compartment?: unknown;
101
+ }): ResolvedToolWindowCompartment | null;
60
102
  /** Vrai si `url` est une URL d'icône autorisée (`ToolWindowMeta.iconUrl`). */
61
103
  export declare function isSafeToolWindowIconUrl(url: unknown): url is string;
62
104
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"tool-window.d.ts","sourceRoot":"","sources":["../src/tool-window.ts"],"names":[],"mappings":"AAAA,kCAAkC;AAElC;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,oBAAoB,yBAAyB,CAAC;AAC3D,eAAO,MAAM,sBAAsB,2BAA2B,CAAC;AAC/D,eAAO,MAAM,qBAAqB,0BAA0B,CAAC;AAE7D,4EAA4E;AAC5E,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;AAE3D,0CAA0C;AAC1C,eAAO,MAAM,iBAAiB,EAAE,QAAQ,CAAC,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAIxE,CAAC;AAEF,2EAA2E;AAC3E,MAAM,WAAW,cAAc;IAC7B,qEAAqE;IACrE,KAAK,EAAE,MAAM,CAAC;IACd,gDAAgD;IAChD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,oFAAoF;IACpF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2EAA2E;IAC3E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CACzB;AAED,8EAA8E;AAC9E,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,MAAM,CAGnE;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,EAAE,CAcjE;AAED,sFAAsF;AACtF,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,IAAI,cAAc,CAEtE;AAED,0DAA0D;AAC1D,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEtD"}
1
+ {"version":3,"file":"tool-window.d.ts","sourceRoot":"","sources":["../src/tool-window.ts"],"names":[],"mappings":"AAAA,kCAAkC;AAElC;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,oBAAoB,yBAAyB,CAAC;AAC3D,eAAO,MAAM,sBAAsB,2BAA2B,CAAC;AAC/D,eAAO,MAAM,qBAAqB,0BAA0B,CAAC;AAE7D,4EAA4E;AAC5E,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;AAE3D,0CAA0C;AAC1C,eAAO,MAAM,iBAAiB,EAAE,QAAQ,CAAC,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAIxE,CAAC;AAEF;;;;;;;;;GASG;AACH,MAAM,WAAW,qBAAqB;IACpC,kEAAkE;IAClE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qDAAqD;IACrD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sDAAsD;IACtD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,kGAAkG;AAClG,eAAO,MAAM,2BAA2B,EAAE,QAAQ,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAIjF,CAAC;AAEF,2GAA2G;AAC3G,MAAM,MAAM,6BAA6B,GAAG,QAAQ,CAAC,qBAAqB,CAAC,CAAC;AAE5E,2EAA2E;AAC3E,MAAM,WAAW,cAAc;IAC7B,qEAAqE;IACrE,KAAK,EAAE,MAAM,CAAC;IACd,gDAAgD;IAChD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,oFAAoF;IACpF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2EAA2E;IAC3E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IACxB;;;;;;;;;;;OAWG;IACH,WAAW,CAAC,EAAE,SAAS,GAAG,qBAAqB,CAAC;CACjD;AAID;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE;IAAE,WAAW,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,6BAA6B,GAAG,IAAI,CAW9G;AAED,8EAA8E;AAC9E,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,MAAM,CAGnE;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,EAAE,CAmCjE;AAED,sFAAsF;AACtF,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,IAAI,cAAc,CAEtE;AAED,0DAA0D;AAC1D,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEtD"}
@@ -26,6 +26,35 @@ export const SHELL_RAIL_RIGHT_SLOT = 'shell-rail-right-slot';
26
26
  bottom: SHELL_RAIL_BOTTOM_SLOT,
27
27
  right: SHELL_RAIL_RIGHT_SLOT
28
28
  };
29
+ /** Hauteurs (en % de la zone) d'un compartiment propre dont l'app n'a pas précisé les valeurs. */ export const DEFAULT_COMPARTMENT_HEIGHTS = {
30
+ height: 40,
31
+ minHeight: 15,
32
+ maxHeight: 100
33
+ };
34
+ const COMPARTMENT_KEYS = [
35
+ 'height',
36
+ 'minHeight',
37
+ 'maxHeight'
38
+ ];
39
+ /**
40
+ * Résout `meta.compartment` : `null` pour le compartiment par défaut, sinon les hauteurs d'un compartiment
41
+ * propre, complétées par `DEFAULT_COMPARTMENT_HEIGHTS` puis rendues cohérentes (`min <= base <= max`).
42
+ */ export function getToolWindowCompartment(meta) {
43
+ const raw = meta.compartment;
44
+ if (!raw || raw === 'default' || typeof raw !== 'object') return null;
45
+ const value = (key)=>{
46
+ const n = raw[key];
47
+ return typeof n === 'number' && Number.isFinite(n) && n > 0 && n <= 100 ? n : DEFAULT_COMPARTMENT_HEIGHTS[key];
48
+ };
49
+ const minHeight = value('minHeight');
50
+ const maxHeight = Math.max(minHeight, value('maxHeight'));
51
+ const height = Math.min(maxHeight, Math.max(minHeight, value('height')));
52
+ return {
53
+ height,
54
+ minHeight,
55
+ maxHeight
56
+ };
57
+ }
29
58
  /** Vrai si `url` est une URL d'icône autorisée (`ToolWindowMeta.iconUrl`). */ export function isSafeToolWindowIconUrl(url) {
30
59
  if (typeof url !== 'string' || url.length === 0) return false;
31
60
  return /^(https:\/\/|\/(?!\/)|data:image\/(svg\+xml|png|webp|gif|jpeg)[;,])/i.test(url);
@@ -47,6 +76,27 @@ export const SHELL_RAIL_RIGHT_SLOT = 'shell-rail-right-slot';
47
76
  if (m.order !== undefined && (typeof m.order !== 'number' || !Number.isFinite(m.order))) problems.push('`order` doit être un nombre fini');
48
77
  if (m.global !== undefined && typeof m.global !== 'boolean') problems.push('`global` doit être un booléen');
49
78
  if (m.rail !== undefined && m.rail !== 'left' && m.rail !== 'right') problems.push('`rail` vaut "left" ou "right"');
79
+ if (m.compartment !== undefined && m.compartment !== 'default') {
80
+ const c = m.compartment;
81
+ if (!c || typeof c !== 'object' || Array.isArray(c)) {
82
+ problems.push('`compartment` vaut \"default\" ou un objet { height, minHeight, maxHeight }');
83
+ } else {
84
+ for (const key of COMPARTMENT_KEYS){
85
+ const n = c[key];
86
+ if (n !== undefined && (typeof n !== 'number' || !Number.isFinite(n) || n <= 0 || n > 100)) problems.push(`\`compartment.${key}\` doit être un nombre dans ]0, 100] (pourcentage de la zone)`);
87
+ }
88
+ const resolved = getToolWindowCompartment({
89
+ compartment: c
90
+ });
91
+ if (resolved && problems.length === 0) {
92
+ const { minHeight, maxHeight } = {
93
+ minHeight: c.minHeight ?? DEFAULT_COMPARTMENT_HEIGHTS.minHeight,
94
+ maxHeight: c.maxHeight ?? DEFAULT_COMPARTMENT_HEIGHTS.maxHeight
95
+ };
96
+ if (minHeight > maxHeight) problems.push('`compartment.minHeight` ne peut pas dépasser `compartment.maxHeight`');
97
+ }
98
+ }
99
+ }
50
100
  return problems;
51
101
  }
52
102
  /** Valide une `meta` d'extension : vrai si c'est une `ToolWindowMeta` exploitable. */ export function isToolWindowMeta(meta) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@egen-civitas/esm-extensions",
3
- "version": "2.1.0",
3
+ "version": "2.2.0",
4
4
  "license": "MPL-2.0",
5
5
  "description": "Coordinates extensions and extension points in the Egen Frontend",
6
6
  "type": "module",