Big News: Socket raises $60M Series C at a $1B valuation to secure software supply chains for AI-driven development.Announcement
Sign In

@focus4/styling

Package Overview
Dependencies
Maintainers
1
Versions
194
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@focus4/styling - npm Package Compare versions

Comparing version
12.10.0
to
12.11.0
+1
-1
package.json
{
"name": "@focus4/styling",
"version": "12.10.0",
"version": "12.11.0",
"description": "Focus v4, styling module",

@@ -5,0 +5,0 @@ "main": "lib/focus4.styling.js",

html {
color: rgb(var(--color-black));
font-size: var(--font-size-small);
line-height: 1.4;
font-family: var(--preferred-font);
}
body {
animation-duration: var(--animation-duration);
animation-delay: var(--animation-delay);
animation-timing-function: var(--animation-curve-default);
margin: 0;
}
textarea {
resize: vertical;
}
h1, h2, h3, h4, h5, h6 {
margin: 24px 0;
font-weight: 400;
}
h1 {
font-size: calc(3.5 * var(--font-size));
letter-spacing: -.02em;
line-height: 1.35;
}
h2 {
font-size: calc(2.8 * var(--font-size));
line-height: 48px;
}
h3 {
font-size: calc(2.2 * var(--font-size));
line-height: 40px;
}
h4 {
font-size: calc(1.5 * var(--font-size));
line-height: 32px;
}
h5 {
font-size: calc(1.25 * var(--font-size));
font-weight: var(--font-weight-semi-bold);
letter-spacing: .02em;
line-height: 1;
}
h6 {
font-size: var(--font-size);
letter-spacing: .04em;
line-height: 24px;
}
th {
font-weight: normal;
}
:root {
--color-black: 0, 0, 0;
--color-white: 255, 255, 255;
--palette-red-50: 255, 235, 238;
--palette-red-100: 255, 205, 210;
--palette-red-200: 239, 154, 154;
--palette-red-300: 229, 115, 115;
--palette-red-400: 239, 83, 80;
--palette-red-500: 244, 67, 54;
--palette-red-600: 229, 57, 53;
--palette-red-700: 211, 47, 47;
--palette-red-800: 198, 40, 40;
--palette-red-900: 183, 28, 28;
--palette-red-a100: 255, 138, 128;
--palette-red-a200: 255, 82, 82;
--palette-red-a400: 255, 23, 68;
--palette-red-a700: 213, 0, 0;
--palette-pink-50: 252, 228, 236;
--palette-pink-100: 248, 187, 208;
--palette-pink-200: 244, 143, 177;
--palette-pink-300: 240, 98, 146;
--palette-pink-400: 236, 64, 122;
--palette-pink-500: 233, 30, 99;
--palette-pink-600: 216, 27, 96;
--palette-pink-700: 194, 24, 91;
--palette-pink-800: 173, 20, 87;
--palette-pink-900: 136, 14, 79;
--palette-pink-a100: 255, 128, 171;
--palette-pink-a200: 255, 64, 129;
--palette-pink-a400: 245, 0, 87;
--palette-pink-a700: 197, 17, 98;
--palette-purple-50: 243, 229, 245;
--palette-purple-100: 225, 190, 231;
--palette-purple-200: 206, 147, 216;
--palette-purple-300: 186, 104, 200;
--palette-purple-400: 171, 71, 188;
--palette-purple-500: 156, 39, 176;
--palette-purple-600: 142, 36, 170;
--palette-purple-700: 123, 31, 162;
--palette-purple-800: 106, 27, 154;
--palette-purple-900: 74, 20, 140;
--palette-purple-a100: 234, 128, 252;
--palette-purple-a200: 224, 64, 251;
--palette-purple-a400: 213, 0, 249;
--palette-purple-a700: 170, 0, 255;
--palette-deep-purple-50: 237, 231, 246;
--palette-deep-purple-100: 209, 196, 233;
--palette-deep-purple-200: 179, 157, 219;
--palette-deep-purple-300: 149, 117, 205;
--palette-deep-purple-400: 126, 87, 194;
--palette-deep-purple-500: 103, 58, 183;
--palette-deep-purple-600: 94, 53, 177;
--palette-deep-purple-700: 81, 45, 168;
--palette-deep-purple-800: 69, 39, 160;
--palette-deep-purple-900: 49, 27, 146;
--palette-deep-purple-a100: 179, 136, 255;
--palette-deep-purple-a200: 124, 77, 255;
--palette-deep-purple-a400: 101, 31, 255;
--palette-deep-purple-a700: 98, 0, 234;
--palette-indigo-50: 232, 234, 246;
--palette-indigo-100: 197, 202, 233;
--palette-indigo-200: 159, 168, 218;
--palette-indigo-300: 121, 134, 203;
--palette-indigo-400: 92, 107, 192;
--palette-indigo-500: 63, 81, 181;
--palette-indigo-600: 57, 73, 171;
--palette-indigo-700: 48, 63, 159;
--palette-indigo-800: 40, 53, 147;
--palette-indigo-900: 26, 35, 126;
--palette-indigo-a100: 140, 158, 255;
--palette-indigo-a200: 83, 109, 254;
--palette-indigo-a400: 61, 90, 254;
--palette-indigo-a700: 48, 79, 254;
--palette-blue-50: 227, 242, 253;
--palette-blue-100: 187, 222, 251;
--palette-blue-200: 144, 202, 249;
--palette-blue-300: 100, 181, 246;
--palette-blue-400: 66, 165, 245;
--palette-blue-500: 33, 150, 243;
--palette-blue-600: 30, 136, 229;
--palette-blue-700: 25, 118, 210;
--palette-blue-800: 21, 101, 192;
--palette-blue-900: 13, 71, 161;
--palette-blue-a100: 130, 177, 255;
--palette-blue-a200: 68, 138, 255;
--palette-blue-a400: 41, 121, 255;
--palette-blue-a700: 41, 98, 255;
--palette-light-blue-50: 225, 245, 254;
--palette-light-blue-100: 179, 229, 252;
--palette-light-blue-200: 129, 212, 250;
--palette-light-blue-300: 79, 195, 247;
--palette-light-blue-400: 41, 182, 246;
--palette-light-blue-500: 3, 169, 244;
--palette-light-blue-600: 3, 155, 229;
--palette-light-blue-700: 2, 136, 209;
--palette-light-blue-800: 2, 119, 189;
--palette-light-blue-900: 1, 87, 155;
--palette-light-blue-a100: 128, 216, 255;
--palette-light-blue-a200: 64, 196, 255;
--palette-light-blue-a400: 0, 176, 255;
--palette-light-blue-a700: 0, 145, 234;
--palette-cyan-50: 224, 247, 250;
--palette-cyan-100: 178, 235, 242;
--palette-cyan-200: 128, 222, 234;
--palette-cyan-300: 77, 208, 225;
--palette-cyan-400: 38, 198, 218;
--palette-cyan-500: 0, 188, 212;
--palette-cyan-600: 0, 172, 193;
--palette-cyan-700: 0, 151, 167;
--palette-cyan-800: 0, 131, 143;
--palette-cyan-900: 0, 96, 100;
--palette-cyan-a100: 132, 255, 255;
--palette-cyan-a200: 24, 255, 255;
--palette-cyan-a400: 0, 229, 255;
--palette-cyan-a700: 0, 184, 212;
--palette-teal-50: 224, 242, 241;
--palette-teal-100: 178, 223, 219;
--palette-teal-200: 128, 203, 196;
--palette-teal-300: 77, 182, 172;
--palette-teal-400: 38, 166, 154;
--palette-teal-500: 0, 150, 136;
--palette-teal-600: 0, 137, 123;
--palette-teal-700: 0, 121, 107;
--palette-teal-800: 0, 105, 92;
--palette-teal-900: 0, 77, 64;
--palette-teal-a100: 167, 255, 235;
--palette-teal-a200: 100, 255, 218;
--palette-teal-a400: 29, 233, 182;
--palette-teal-a700: 0, 191, 165;
--palette-green-50: 232, 245, 233;
--palette-green-100: 200, 230, 201;
--palette-green-200: 165, 214, 167;
--palette-green-300: 129, 199, 132;
--palette-green-400: 102, 187, 106;
--palette-green-500: 76, 175, 80;
--palette-green-600: 67, 160, 71;
--palette-green-700: 56, 142, 60;
--palette-green-800: 46, 125, 50;
--palette-green-900: 27, 94, 32;
--palette-green-a100: 185, 246, 202;
--palette-green-a200: 105, 240, 174;
--palette-green-a400: 0, 230, 118;
--palette-green-a700: 0, 200, 83;
--palette-light-green-50: 241, 248, 233;
--palette-light-green-100: 220, 237, 200;
--palette-light-green-200: 197, 225, 165;
--palette-light-green-300: 174, 213, 129;
--palette-light-green-400: 156, 204, 101;
--palette-light-green-500: 139, 195, 74;
--palette-light-green-600: 124, 179, 66;
--palette-light-green-700: 104, 159, 56;
--palette-light-green-800: 85, 139, 47;
--palette-light-green-900: 51, 105, 30;
--palette-light-green-a100: 204, 255, 144;
--palette-light-green-a200: 178, 255, 89;
--palette-light-green-a400: 118, 255, 3;
--palette-light-green-a700: 100, 221, 23;
--palette-lime-50: 249, 251, 231;
--palette-lime-100: 240, 244, 195;
--palette-lime-200: 230, 238, 156;
--palette-lime-300: 220, 231, 117;
--palette-lime-400: 212, 225, 87;
--palette-lime-500: 205, 220, 57;
--palette-lime-600: 192, 202, 51;
--palette-lime-700: 175, 180, 43;
--palette-lime-800: 158, 157, 36;
--palette-lime-900: 130, 119, 23;
--palette-lime-a100: 244, 255, 129;
--palette-lime-a200: 238, 255, 65;
--palette-lime-a400: 198, 255, 0;
--palette-lime-a700: 174, 234, 0;
--palette-yellow-50: 255, 253, 231;
--palette-yellow-100: 255, 249, 196;
--palette-yellow-200: 255, 245, 157;
--palette-yellow-300: 255, 241, 118;
--palette-yellow-400: 255, 238, 88;
--palette-yellow-500: 255, 235, 59;
--palette-yellow-600: 253, 216, 53;
--palette-yellow-700: 251, 192, 45;
--palette-yellow-800: 249, 168, 37;
--palette-yellow-900: 245, 127, 23;
--palette-yellow-a100: 255, 255, 141;
--palette-yellow-a200: 255, 255, 0;
--palette-yellow-a400: 255, 234, 0;
--palette-yellow-a700: 255, 214, 0;
--palette-amber-50: 255, 248, 225;
--palette-amber-100: 255, 236, 179;
--palette-amber-200: 255, 224, 130;
--palette-amber-300: 255, 213, 79;
--palette-amber-400: 255, 202, 40;
--palette-amber-500: 255, 193, 7;
--palette-amber-600: 255, 179, 0;
--palette-amber-700: 255, 160, 0;
--palette-amber-800: 255, 143, 0;
--palette-amber-900: 255, 111, 0;
--palette-amber-a100: 255, 229, 127;
--palette-amber-a200: 255, 215, 64;
--palette-amber-a400: 255, 196, 0;
--palette-amber-a700: 255, 171, 0;
--palette-orange-50: 255, 243, 224;
--palette-orange-100: 255, 224, 178;
--palette-orange-200: 255, 204, 128;
--palette-orange-300: 255, 183, 77;
--palette-orange-400: 255, 167, 38;
--palette-orange-500: 255, 152, 0;
--palette-orange-600: 251, 140, 0;
--palette-orange-700: 245, 124, 0;
--palette-orange-800: 239, 108, 0;
--palette-orange-900: 230, 81, 0;
--palette-orange-a100: 255, 209, 128;
--palette-orange-a200: 255, 171, 64;
--palette-orange-a400: 255, 145, 0;
--palette-orange-a700: 255, 109, 0;
--palette-deep-orange-50: 251, 233, 231;
--palette-deep-orange-100: 255, 204, 188;
--palette-deep-orange-200: 255, 171, 145;
--palette-deep-orange-300: 255, 138, 101;
--palette-deep-orange-400: 255, 112, 67;
--palette-deep-orange-500: 255, 87, 34;
--palette-deep-orange-600: 244, 81, 30;
--palette-deep-orange-700: 230, 74, 25;
--palette-deep-orange-800: 216, 67, 21;
--palette-deep-orange-900: 191, 54, 12;
--palette-deep-orange-a100: 255, 158, 128;
--palette-deep-orange-a200: 255, 110, 64;
--palette-deep-orange-a400: 255, 61, 0;
--palette-deep-orange-a700: 221, 44, 0;
--palette-brown-50: 239, 235, 233;
--palette-brown-100: 215, 204, 200;
--palette-brown-200: 188, 170, 164;
--palette-brown-300: 161, 136, 127;
--palette-brown-400: 141, 110, 99;
--palette-brown-500: 121, 85, 72;
--palette-brown-600: 109, 76, 65;
--palette-brown-700: 93, 64, 55;
--palette-brown-800: 78, 52, 46;
--palette-brown-900: 62, 39, 35;
--palette-grey-50: 250, 250, 250;
--palette-grey-100: 245, 245, 245;
--palette-grey-200: 238, 238, 238;
--palette-grey-300: 224, 224, 224;
--palette-grey-400: 189, 189, 189;
--palette-grey-500: 158, 158, 158;
--palette-grey-600: 117, 117, 117;
--palette-grey-700: 97, 97, 97;
--palette-grey-800: 66, 66, 66;
--palette-grey-900: 33, 33, 33;
--palette-blue-grey-50: 236, 239, 241;
--palette-blue-grey-100: 207, 216, 220;
--palette-blue-grey-200: 176, 190, 197;
--palette-blue-grey-300: 144, 164, 174;
--palette-blue-grey-400: 120, 144, 156;
--palette-blue-grey-500: 96, 125, 139;
--palette-blue-grey-600: 84, 110, 122;
--palette-blue-grey-700: 69, 90, 100;
--palette-blue-grey-800: 55, 71, 79;
--palette-blue-grey-900: 38, 50, 56;
}
:root[dark] {
--color-black: 238, 238, 238;
--color-white: 11, 11, 11;
--palette-grey-50: 22, 22, 22;
--palette-grey-100: 33, 33, 33;
--palette-grey-200: 44, 44, 44;
--palette-grey-300: 66, 66, 66;
--palette-grey-400: 97, 97, 97;
--palette-grey-500: 117, 117, 117;
--palette-grey-600: 158, 158, 158;
--palette-grey-700: 189, 189, 189;
--palette-grey-800: 224, 224, 224;
--palette-grey-900: 238, 238, 238;
}
:root {
--color-primary: var(--palette-indigo-500);
--color-primary-light: var(--palette-indigo-100);
--color-accent: var(--palette-pink-a200);
--color-divider: var(--palette-grey-300);
--preferred-font: "Roboto", "Helvetica", "Arial", sans-serif;
--font-size: 16px;
--font-size-small: 14px;
--font-size-big: 18px;
--font-weight-semi-bold: 500;
--font-weight-bold: 700;
--shadow-2p: 0 2px 2px 0 #00000024, 0 3px 1px -2px #0003, 0 1px 5px 0 #0000001f;
--shadow-4p: 0 4px 5px 0 #00000024, 0 1px 10px 0 #0000001f, 0 2px 4px -1px #0003;
--animation-duration: .35s;
--animation-duration-short: .2s;
--animation-delay: calc(var(--animation-duration) / 5);
--animation-curve-fast-out-slow-in: cubic-bezier(.4, 0, .2, 1);
--animation-curve-fast-out-linear-in: cubic-bezier(.4, 0, 1, 1);
--animation-curve-focus-ring: cubic-bezier(.2, 0, 0, 1);
--animation-curve-default: var(--animation-curve-fast-out-slow-in);
--z-index-highest: 300;
--z-index-higher: 200;
--z-index-high: 100;
--z-index-normal: 1;
}
:root[dark] {
color-scheme: dark;
--color-primary: var(--palette-indigo-300);
--color-primary-light: var(--palette-indigo-900);
--color-accent: var(--palette-pink-a100);
}
import * as react from "react";
import { ReactNode } from "react";
import * as react_jsx_runtime0 from "react/jsx-runtime";
//#region src/animation.d.ts
/** Récupère les paramètres de transition par défaut, à partir des variables CSS correspondantes. */
declare function getDefaultTransition(): {
readonly delay: number;
readonly duration: number;
readonly ease: [number, number, number, number] | undefined;
};
/** Récupère les paramètres de transition "spring" par défaut. */
declare function getSpringTransition(): {
readonly type: "spring";
readonly bounce: 0;
readonly duration: number;
};
//#endregion
//#region src/config.d.ts
/** Config Focus de l'application */
declare const uiConfig: {
/** Valeur de "autocomplete" sur les inputs pour lesquels on ne veut pas d'autocomplétion. */autocompleteOffValue: string; /** Classe CSS par défaut des icônes. */
defaultIconClassName: string;
};
//#endregion
//#region src/theme/common.d.ts
type CSSElement<T> = T & string & {
_element: void;
};
type CSSMod<N extends string, T> = N & T & string & {
_mod: void;
};
type CSSToStrings<T> = { [P in keyof T]?: string };
type Mods<CSS, E> = { [P in keyof CSS]: CSS[P] extends CSSMod<infer M, E> ? M : never }[keyof CSS];
type ModNames<CSS, E> = { [P in keyof CSS]: CSS[P] extends CSSMod<infer _, E> ? P : never }[keyof CSS];
type BemFunction<CSS = any, P extends number | string | symbol = any, E = any> = ((object: true) => { [_ in ModNames<CSS, E> | P]: string }) & (Mods<CSS, E> extends never | undefined ? () => string : (mods?: { [_ in Mods<CSS, E>]?: boolean }) => string);
interface CSSContext {
[key: string]: {};
}
declare const ThemeContext: react.Context<CSSContext>;
//#endregion
//#region src/theme/themeable.d.ts
/** Merges passed themes by concatenating string keys */
declare function themeable<T extends {}>(...themes: T[]): T;
//#endregion
//#region src/theme/theme-provider.d.ts
/** Contient l'ensemble des classes CSS surchargeables (elles le sont toutes), regroupées par composant. */
interface FocusCSSContext extends CSSContext {
actionBar: {};
advancedSearch: {};
contextualActions: {};
facet: {};
facetBox: {};
group: {};
list: {};
listBase: {};
searchBar: {};
summary: {};
table: {};
timeline: {};
booleanRadio: {};
display: {};
field: {};
form: {};
inputDate: {};
inputFile: {};
label: {};
select: {};
selectCheckbox: {};
selectChips: {};
selectRadio: {};
dialog: {};
filAriane: {};
header: {};
lateralMenu: {};
layout: {};
mainMenu: {};
overlay: {};
panel: {};
popin: {};
scrollable: {};
scrollspy: {};
autocomplete: {};
button: {};
calendar: {};
checkbox: {};
chip: {};
dropdown: {};
floatingActionButton: {};
iconButton: {};
menu: {};
progressIndicator: {};
radio: {};
ripple: {};
slider: {};
snackbar: {};
supportingText: {};
switch: {};
textField: {};
tabs: {};
tooltip: {};
}
/** Props du ThemeProvider. */
interface ThemeProviderProps {
/** Objet faisant correspondre à un identifiant de composant son objet de classes CSS associé. */
appTheme: Partial<FocusCSSContext>;
/** Enfants. */
children: ReactNode;
}
/**
* Le `ThemeProvider` permet d'ajouter des classes CSS aux composants Focus (et autres composants utilisant `useTheme`) posés
* à l'intérieur (via un context React).
*
* Les classes CSS ajoutées dans un `ThemeProvider` s'ajouteront aux éventuelles classes posées par un `ThemeProvider` parent,
* y compris sur les mêmes composants.
*/
declare function ThemeProvider({
appTheme,
children
}: ThemeProviderProps): react_jsx_runtime0.JSX.Element;
//#endregion
//#region src/theme/to-bem.d.ts
type AllMods<CSS> = { [P in keyof CSS]: CSS[P] extends CSSMod<infer _, infer __> ? P : never }[keyof CSS];
type ToBem<CSS> = Omit<{ [P in keyof CSS]-?: CSS[P] extends CSSElement<infer E> ? BemFunction<CSS, P, E> : CSS[P] extends CSSMod<infer __, infer ___> ? never : BemFunction<CSS, P, string> }, AllMods<CSS>>;
type CSSProp<CSS> = CSSToStrings<CSS> | Partial<ToBem<CSS>>;
/**
* `toBem` permet de transformer un objet de classes CSS, tel que celui importé d'un module CSS, dont les noms respectent la convention BEM
* en un objet contenant une fonction par "élément" à laquelle on peut appliquer ses "modificateurs".
*
* Par exemple, un objet contenant les classes
* ```ts
* ["panel", "panel--editing", "panel--loading", "title", "title--top", "title--bottom"]
* ```
* sera transformé en un objet avec 2 fonctions `panel` et `title` :
* ```ts
* {
* panel({editing?: boolean; loading?: boolean}) => string;
* title({top?: boolean; bottom?: boolean}) => string;
* }
* ```
* Un appel à une fonction retournera la classe CSS de l'"élément", à laquelle seront ajoutées ou non les classes des différents "modificateurs",
* selon les valeurs des différents booléens.
*
* Vous pouvez utiliser `toBem` pour éviter d'avoir à concaténer des classes CSS à la main et pour rendre vos composants et votre CSS plus propres.
* Son usage est bien évidemment totalement facultatif et à utiliser si cela vous arrange.
*
* _Remarque 1 : Les modules CSS importés doivent avoir des définitions Typescript générés par la commande `focus4 cssgen` du module `@focus4/tooling`._
*
* _Remarque 2 : Les propriétés `theme` des différents composants Focus acceptent aussi bien un objet CSS classique ou un objet créé par `toBem`._
*/
declare function toBem<CSS>(css: CSS): ToBem<CSS>;
/**
* `fromBem` permet de faire la transformation inverse de `toBem`, à savoir prendre l'objet résultant d'un appel à `toBem` et de ressortir un objet
* qui contient toutes les classes CSS qui le compose.
*/
declare function fromBem<T>(css: CSSToStrings<T> | Partial<ToBem<T>> | T): CSSToStrings<T>;
//#endregion
//#region src/theme/use-theme.d.ts
/**
* `useTheme` permet de récupérer les classes CSS passées dans un éventuel `ThemeProvider` parent et de les fusionner avec d'autres classes CSS
* passées en paramètre.
*
* `useTheme` accepte aussi bien des objets de classes CSS classiques (importés d'un module CSS), que des objets créés avec `toBem`.
*
* @param name L'identifiant du composant dans le `appTheme` du `ThemeProvider`
* @param themes Les objets de classes CSS à fusionner ensemble et avec celui du contexte.
*/
declare function useTheme<T>(name: string, ...themes: (CSSToStrings<T> | Partial<ToBem<T>> | T | undefined)[]): ToBem<T>;
//#endregion
export { type CSSContext, type CSSElement, type CSSMod, type CSSProp, type CSSToStrings, type FocusCSSContext, ThemeContext, ThemeProvider, type ThemeProviderProps, type ToBem, fromBem, getDefaultTransition, getSpringTransition, themeable, toBem, uiConfig, useTheme };
//# sourceMappingURL=focus4.styling.d.ts.map
{"version":3,"file":"focus4.styling.d.ts","names":[],"sources":["../src/animation.ts","../src/config.ts","../src/theme/common.ts","../src/theme/themeable.ts","../src/theme/theme-provider.tsx","../src/theme/to-bem.ts","../src/theme/use-theme.ts"],"mappings":"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"}
import { createContext, useContext, useMemo } from "react";
import classNames from "classnames";
import { pick } from "es-toolkit";
import { jsx } from "react/jsx-runtime";
//#region src/animation.ts
function get() {
const { animationDelay, animationDuration, animationTimingFunction } = window.getComputedStyle(document.body);
return {
delay: toMs(animationDelay),
duration: toMs(animationDuration),
ease: animationTimingFunction.startsWith("cubic-bezier") ? animationTimingFunction.slice(13).split(",").map(parseFloat) : void 0
};
}
/** Récupère les paramètres de transition par défaut, à partir des variables CSS correspondantes. */
function getDefaultTransition() {
const { delay, duration, ease } = get();
return {
delay: delay / 1e3,
duration: duration / 1e3,
ease
};
}
/** Récupère les paramètres de transition "spring" par défaut. */
function getSpringTransition() {
return {
type: "spring",
bounce: 0,
duration: get().duration / 1e3
};
}
function toMs(d) {
if (d.endsWith("ms")) return +d.slice(0, -2);
else return +d.slice(0, -1) * 1e3;
}
//#endregion
//#region src/config.ts
/** Config Focus de l'application */
const uiConfig = {
autocompleteOffValue: /Firefox/.test(navigator.userAgent) ? "off" : "one-time-code",
defaultIconClassName: "material-symbols-outlined"
};
//#endregion
//#region src/theme/common.ts
const ThemeContext = createContext({});
//#endregion
//#region src/theme/themeable.ts
/** Merges passed themes by concatenating string keys */
function themeable(...themes) {
return themes.reduce(merge, {});
}
function merge(original = {}, mixin = {}) {
const result = Object.keys(original).reduce((acc, key) => {
const value = original[key];
if (typeof value !== "function") acc[key] = value;
return acc;
}, {});
for (const key in mixin) {
const originalValue = result[key];
const mixinValue = mixin[key];
switch (typeof mixinValue) {
case "undefined":
case "function": break;
default:
switch (typeof originalValue) {
case "undefined":
result[key] = mixinValue;
break;
case "function": break;
default:
result[key] = [...originalValue.split(" "), ...mixinValue.split(" ")].filter((item, pos, self) => self.indexOf(item) === pos && item !== "").join(" ");
break;
}
break;
}
}
return result;
}
//#endregion
//#region src/theme/to-bem.ts
/**
* `toBem` permet de transformer un objet de classes CSS, tel que celui importé d'un module CSS, dont les noms respectent la convention BEM
* en un objet contenant une fonction par "élément" à laquelle on peut appliquer ses "modificateurs".
*
* Par exemple, un objet contenant les classes
* ```ts
* ["panel", "panel--editing", "panel--loading", "title", "title--top", "title--bottom"]
* ```
* sera transformé en un objet avec 2 fonctions `panel` et `title` :
* ```ts
* {
* panel({editing?: boolean; loading?: boolean}) => string;
* title({top?: boolean; bottom?: boolean}) => string;
* }
* ```
* Un appel à une fonction retournera la classe CSS de l'"élément", à laquelle seront ajoutées ou non les classes des différents "modificateurs",
* selon les valeurs des différents booléens.
*
* Vous pouvez utiliser `toBem` pour éviter d'avoir à concaténer des classes CSS à la main et pour rendre vos composants et votre CSS plus propres.
* Son usage est bien évidemment totalement facultatif et à utiliser si cela vous arrange.
*
* _Remarque 1 : Les modules CSS importés doivent avoir des définitions Typescript générés par la commande `focus4 cssgen` du module `@focus4/tooling`._
*
* _Remarque 2 : Les propriétés `theme` des différents composants Focus acceptent aussi bien un objet CSS classique ou un objet créé par `toBem`._
*/
function toBem(css) {
const data = {};
for (const key in css) {
const [element, modifier] = key.split("--");
if (data[element] && modifier) data[element].push(modifier);
else if (!data[element]) data[element] = modifier ? [modifier] : [];
}
return Object.keys(data).reduce((bem, key) => ({
...bem,
[key]: (mods = {}) => {
if (mods !== true) return classNames(css[key], ...data[key].filter((mod) => mods[mod]).map((mod) => css[`${key}--${mod}`]));
else return pick(css, [key, ...data[key].map((mod) => `${key}--${mod}`)]);
}
}), {});
}
/**
* `fromBem` permet de faire la transformation inverse de `toBem`, à savoir prendre l'objet résultant d'un appel à `toBem` et de ressortir un objet
* qui contient toutes les classes CSS qui le compose.
*/
function fromBem(css) {
const res = {};
for (const key in css) {
const value = css[key];
if (value) if (typeof value === "string") res[key] = value;
else Object.assign(res, value(true));
}
return res;
}
//#endregion
//#region src/theme/theme-provider.tsx
/**
* Le `ThemeProvider` permet d'ajouter des classes CSS aux composants Focus (et autres composants utilisant `useTheme`) posés
* à l'intérieur (via un context React).
*
* Les classes CSS ajoutées dans un `ThemeProvider` s'ajouteront aux éventuelles classes posées par un `ThemeProvider` parent,
* y compris sur les mêmes composants.
*/
function ThemeProvider({ appTheme, children }) {
const context = useContext(ThemeContext);
const mergedContext = useMemo(() => {
const mc = {};
for (const key in context) if (key in appTheme && appTheme[key]) mc[key] = themeable(fromBem(context[key]), fromBem(appTheme[key]));
else mc[key] = context[key];
for (const key in appTheme) if (!(key in context) && appTheme[key]) mc[key] = appTheme[key];
return mc;
}, [appTheme, context]);
return /* @__PURE__ */ jsx(ThemeContext.Provider, {
value: mergedContext,
children
});
}
//#endregion
//#region src/theme/use-theme.ts
/**
* `useTheme` permet de récupérer les classes CSS passées dans un éventuel `ThemeProvider` parent et de les fusionner avec d'autres classes CSS
* passées en paramètre.
*
* `useTheme` accepte aussi bien des objets de classes CSS classiques (importés d'un module CSS), que des objets créés avec `toBem`.
*
* @param name L'identifiant du composant dans le `appTheme` du `ThemeProvider`
* @param themes Les objets de classes CSS à fusionner ensemble et avec celui du contexte.
*/
function useTheme(name, ...themes) {
return toBem(themeable(fromBem(useContext(ThemeContext)[name]) || {}, ...themes.filter((x) => x).map((x) => fromBem(x))));
}
//#endregion
export { ThemeContext, ThemeProvider, fromBem, getDefaultTransition, getSpringTransition, themeable, toBem, uiConfig, useTheme };
//# sourceMappingURL=focus4.styling.js.map
{"version":3,"file":"focus4.styling.js","names":[],"sources":["../src/animation.ts","../src/config.ts","../src/theme/common.ts","../src/theme/themeable.ts","../src/theme/to-bem.ts","../src/theme/theme-provider.tsx","../src/theme/use-theme.ts"],"sourcesContent":["function get() {\r\n const {animationDelay, animationDuration, animationTimingFunction} = window.getComputedStyle(document.body);\r\n\r\n const delay = toMs(animationDelay);\r\n const duration = toMs(animationDuration);\r\n const ease = animationTimingFunction.startsWith(\"cubic-bezier\")\r\n ? (animationTimingFunction.slice(13).split(\",\").map(parseFloat) as [number, number, number, number])\r\n : undefined;\r\n\r\n return {delay, duration, ease};\r\n}\r\n\r\n/** Récupère les paramètres de transition par défaut, à partir des variables CSS correspondantes. */\r\nexport function getDefaultTransition() {\r\n const {delay, duration, ease} = get();\r\n return {\r\n delay: delay / 1000,\r\n duration: duration / 1000,\r\n ease\r\n } as const;\r\n}\r\n\r\n/** Récupère les paramètres de transition \"spring\" par défaut. */\r\nexport function getSpringTransition() {\r\n return {\r\n type: \"spring\",\r\n bounce: 0,\r\n duration: get().duration / 1000\r\n } as const;\r\n}\r\n\r\nfunction toMs(d: string) {\r\n if (d.endsWith(\"ms\")) {\r\n return +d.slice(0, -2);\r\n } else {\r\n return +d.slice(0, -1) * 1000;\r\n }\r\n}\r\n","/** Config Focus de l'application */\r\nexport const uiConfig = {\r\n /** Valeur de \"autocomplete\" sur les inputs pour lesquels on ne veut pas d'autocomplétion. */\r\n autocompleteOffValue: /Firefox/.test(navigator.userAgent) ? \"off\" : \"one-time-code\",\r\n\r\n /** Classe CSS par défaut des icônes. */\r\n defaultIconClassName: \"material-symbols-outlined\"\r\n};\r\n","import {createContext} from \"react\";\r\n\r\nexport type CSSElement<T> = T & string & {_element: void};\r\nexport type CSSMod<N extends string, T> = N & T & string & {_mod: void};\r\nexport type CSSToStrings<T> = {[P in keyof T]?: string};\r\n\r\nexport type Mods<CSS, E> = {[P in keyof CSS]: CSS[P] extends CSSMod<infer M, E> ? M : never}[keyof CSS];\r\nexport type ModNames<CSS, E> = {[P in keyof CSS]: CSS[P] extends CSSMod<infer _, E> ? P : never}[keyof CSS];\r\nexport type BemFunction<CSS = any, P extends number | string | symbol = any, E = any> = ((object: true) => {\r\n [_ in ModNames<CSS, E> | P]: string;\r\n}) &\r\n (Mods<CSS, E> extends never | undefined ? () => string : (mods?: {[_ in Mods<CSS, E>]?: boolean}) => string);\r\n\r\nexport interface CSSContext {\r\n [key: string]: {};\r\n}\r\n\r\nexport const ThemeContext = createContext<CSSContext>({});\r\n","/** Merges passed themes by concatenating string keys */\r\nexport function themeable<T extends {}>(...themes: T[]) {\r\n return themes.reduce(merge, {}) as T;\r\n}\r\n\r\nfunction merge<T extends {[key: string]: string}>(original = {} as T, mixin = {} as T) {\r\n /*\r\n * Make a copy to avoid mutations of nested objects\r\n * also strip all functions injected by isomorphic-style-loader\r\n */\r\n const result = Object.keys(original).reduce(\r\n (acc, key) => {\r\n const value = original[key];\r\n if (typeof value !== \"function\") {\r\n acc[key] = value;\r\n }\r\n return acc;\r\n },\r\n {} as {[key: string]: string}\r\n );\r\n\r\n // Traverse mixin keys and merge them to resulting theme\r\n for (const key in mixin) {\r\n // There's no need to set any defaults here\r\n const originalValue = result[key];\r\n const mixinValue = mixin[key];\r\n\r\n switch (typeof mixinValue) {\r\n case \"undefined\": // Fallthrough - handles accidentally unset values which may come from props\r\n case \"function\":\r\n // This handles issue when isomorphic-style-loader addes helper functions to css-module\r\n break; // Just skip\r\n\r\n default:\r\n // Plain values\r\n switch (typeof originalValue) {\r\n case \"undefined\":\r\n // Mixin key is new to original theme - take it as is\r\n result[key] = mixinValue;\r\n break;\r\n\r\n case \"function\":\r\n // This handles issue when isomorphic-style-loader addes helper functions to css-module\r\n break; // Just skip\r\n\r\n default:\r\n // Finally we can merge\r\n result[key] = [...originalValue.split(\" \"), ...mixinValue.split(\" \")]\r\n .filter((item, pos, self) => self.indexOf(item) === pos && item !== \"\")\r\n .join(\" \");\r\n break;\r\n }\r\n break;\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n","import classNames from \"classnames\";\r\nimport {pick} from \"es-toolkit\";\r\n\r\nimport {BemFunction, CSSElement, CSSMod, CSSToStrings} from \"./common\";\r\n\r\nexport type AllMods<CSS> = {[P in keyof CSS]: CSS[P] extends CSSMod<infer _, infer __> ? P : never}[keyof CSS];\r\nexport type ToBem<CSS> = Omit<\r\n {\r\n [P in keyof CSS]-?: CSS[P] extends CSSElement<infer E>\r\n ? BemFunction<CSS, P, E>\r\n : CSS[P] extends CSSMod<infer __, infer ___>\r\n ? never\r\n : BemFunction<CSS, P, string>;\r\n },\r\n AllMods<CSS>\r\n>;\r\n\r\nexport type CSSProp<CSS> = CSSToStrings<CSS> | Partial<ToBem<CSS>>;\r\n\r\n/**\r\n * `toBem` permet de transformer un objet de classes CSS, tel que celui importé d'un module CSS, dont les noms respectent la convention BEM\r\n * en un objet contenant une fonction par \"élément\" à laquelle on peut appliquer ses \"modificateurs\".\r\n *\r\n * Par exemple, un objet contenant les classes\r\n * ```ts\r\n * [\"panel\", \"panel--editing\", \"panel--loading\", \"title\", \"title--top\", \"title--bottom\"]\r\n * ```\r\n * sera transformé en un objet avec 2 fonctions `panel` et `title` :\r\n * ```ts\r\n * {\r\n * panel({editing?: boolean; loading?: boolean}) => string;\r\n * title({top?: boolean; bottom?: boolean}) => string;\r\n * }\r\n * ```\r\n * Un appel à une fonction retournera la classe CSS de l'\"élément\", à laquelle seront ajoutées ou non les classes des différents \"modificateurs\",\r\n * selon les valeurs des différents booléens.\r\n *\r\n * Vous pouvez utiliser `toBem` pour éviter d'avoir à concaténer des classes CSS à la main et pour rendre vos composants et votre CSS plus propres.\r\n * Son usage est bien évidemment totalement facultatif et à utiliser si cela vous arrange.\r\n *\r\n * _Remarque 1 : Les modules CSS importés doivent avoir des définitions Typescript générés par la commande `focus4 cssgen` du module `@focus4/tooling`._\r\n *\r\n * _Remarque 2 : Les propriétés `theme` des différents composants Focus acceptent aussi bien un objet CSS classique ou un objet créé par `toBem`._\r\n */\r\nexport function toBem<CSS>(css: CSS): ToBem<CSS> {\r\n const data: {[key: string]: string[]} = {};\r\n for (const key in css) {\r\n const [element, modifier] = key.split(\"--\");\r\n if (data[element] && modifier) {\r\n data[element].push(modifier);\r\n } else if (!data[element]) {\r\n data[element] = modifier ? [modifier] : [];\r\n }\r\n }\r\n\r\n return Object.keys(data).reduce(\r\n (bem, key) => ({\r\n ...bem,\r\n [key]: (mods: true | {[key: string]: boolean} = {}) => {\r\n if (mods !== true) {\r\n return classNames(\r\n (css as any)[key],\r\n ...data[key].filter(mod => mods[mod]).map(mod => (css as any)[`${key}--${mod}`])\r\n );\r\n } else {\r\n return pick(css as any, [key, ...data[key].map(mod => `${key}--${mod}`)]);\r\n }\r\n }\r\n }),\r\n {}\r\n ) as ToBem<CSS>;\r\n}\r\n\r\n/**\r\n * `fromBem` permet de faire la transformation inverse de `toBem`, à savoir prendre l'objet résultant d'un appel à `toBem` et de ressortir un objet\r\n * qui contient toutes les classes CSS qui le compose.\r\n */\r\nexport function fromBem<T>(css: CSSToStrings<T> | Partial<ToBem<T>> | T): CSSToStrings<T> {\r\n const res: CSSToStrings<T> = {};\r\n\r\n for (const key in css as any) {\r\n const value = (css as any)[key];\r\n if (value) {\r\n if (typeof value === \"string\") {\r\n (res as any)[key] = value;\r\n } else {\r\n Object.assign(res, value(true));\r\n }\r\n }\r\n }\r\n\r\n return res;\r\n}\r\n","import {ReactNode, useContext, useMemo} from \"react\";\r\n\r\nimport {CSSContext, ThemeContext} from \"./common\";\r\nimport {themeable} from \"./themeable\";\r\nimport {fromBem} from \"./to-bem\";\r\n\r\n/** Contient l'ensemble des classes CSS surchargeables (elles le sont toutes), regroupées par composant. */\r\nexport interface FocusCSSContext extends CSSContext {\r\n // Collections\r\n actionBar: {};\r\n advancedSearch: {};\r\n contextualActions: {};\r\n facet: {};\r\n facetBox: {};\r\n group: {};\r\n list: {};\r\n listBase: {};\r\n searchBar: {};\r\n summary: {};\r\n table: {};\r\n timeline: {};\r\n\r\n // Forms\r\n booleanRadio: {};\r\n display: {};\r\n field: {};\r\n form: {};\r\n inputDate: {};\r\n inputFile: {};\r\n label: {};\r\n select: {};\r\n selectCheckbox: {};\r\n selectChips: {};\r\n selectRadio: {};\r\n\r\n // Layout\r\n dialog: {};\r\n filAriane: {};\r\n header: {};\r\n lateralMenu: {};\r\n layout: {};\r\n mainMenu: {};\r\n overlay: {};\r\n panel: {};\r\n popin: {};\r\n scrollable: {};\r\n scrollspy: {};\r\n\r\n // Toolbox\r\n autocomplete: {};\r\n button: {};\r\n calendar: {};\r\n checkbox: {};\r\n chip: {};\r\n dropdown: {};\r\n floatingActionButton: {};\r\n iconButton: {};\r\n menu: {};\r\n progressIndicator: {};\r\n radio: {};\r\n ripple: {};\r\n slider: {};\r\n snackbar: {};\r\n supportingText: {};\r\n switch: {};\r\n textField: {};\r\n tabs: {};\r\n tooltip: {};\r\n}\r\n\r\n/** Props du ThemeProvider. */\r\nexport interface ThemeProviderProps {\r\n /** Objet faisant correspondre à un identifiant de composant son objet de classes CSS associé. */\r\n appTheme: Partial<FocusCSSContext>;\r\n /** Enfants. */\r\n children: ReactNode;\r\n}\r\n\r\n/**\r\n * Le `ThemeProvider` permet d'ajouter des classes CSS aux composants Focus (et autres composants utilisant `useTheme`) posés\r\n * à l'intérieur (via un context React).\r\n *\r\n * Les classes CSS ajoutées dans un `ThemeProvider` s'ajouteront aux éventuelles classes posées par un `ThemeProvider` parent,\r\n * y compris sur les mêmes composants.\r\n */\r\nexport function ThemeProvider({appTheme, children}: ThemeProviderProps) {\r\n const context = useContext(ThemeContext);\r\n\r\n const mergedContext = useMemo(() => {\r\n const mc = {} as CSSContext;\r\n\r\n for (const key in context) {\r\n if (key in appTheme && appTheme[key]) {\r\n mc[key] = themeable(fromBem(context[key]), fromBem(appTheme[key]));\r\n } else {\r\n mc[key] = context[key];\r\n }\r\n }\r\n\r\n for (const key in appTheme) {\r\n if (!(key in context) && appTheme[key]) {\r\n mc[key] = appTheme[key]!;\r\n }\r\n }\r\n return mc;\r\n }, [appTheme, context]);\r\n\r\n return <ThemeContext.Provider value={mergedContext}>{children}</ThemeContext.Provider>;\r\n}\r\n","import {useContext} from \"react\";\r\n\r\nimport {CSSToStrings, ThemeContext} from \"./common\";\r\nimport {themeable} from \"./themeable\";\r\nimport {fromBem, toBem, ToBem} from \"./to-bem\";\r\n\r\n/**\r\n * `useTheme` permet de récupérer les classes CSS passées dans un éventuel `ThemeProvider` parent et de les fusionner avec d'autres classes CSS\r\n * passées en paramètre.\r\n *\r\n * `useTheme` accepte aussi bien des objets de classes CSS classiques (importés d'un module CSS), que des objets créés avec `toBem`.\r\n *\r\n * @param name L'identifiant du composant dans le `appTheme` du `ThemeProvider`\r\n * @param themes Les objets de classes CSS à fusionner ensemble et avec celui du contexte.\r\n */\r\nexport function useTheme<T>(\r\n name: string,\r\n ...themes: (CSSToStrings<T> | Partial<ToBem<T>> | T | undefined)[]\r\n): ToBem<T> {\r\n const contextTheme = fromBem(useContext(ThemeContext)[name]) || {};\r\n return toBem(themeable(contextTheme, ...themes.filter(x => x).map(x => fromBem(x!))) as T);\r\n}\r\n"],"mappings":"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"}