@douglasneuroinformatics/libui 3.8.5 → 3.8.7
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/{chunk-M5H3G5VE.js → chunk-CAWCERN4.js} +19 -10
- package/dist/chunk-CAWCERN4.js.map +1 -0
- package/dist/{chunk-GLOKPJGE.js → chunk-GFIT4FAN.js} +2 -2
- package/dist/components.d.ts +3 -3
- package/dist/components.js +8 -8
- package/dist/components.js.map +1 -1
- package/dist/douglasneuroinformatics-libui-3.8.7.tgz +0 -0
- package/dist/hooks.js +2 -2
- package/dist/i18n.d.ts +9 -1
- package/dist/i18n.js +1 -1
- package/package.json +2 -2
- package/src/components/CopyButton/CopyButton.tsx +1 -1
- package/src/components/DatePicker/Calendar.tsx +1 -1
- package/src/components/DatePicker/DatePicker.tsx +1 -1
- package/src/components/Form/Form.tsx +3 -3
- package/src/components/Form/StringField/StringFieldPassword.tsx +1 -1
- package/src/components/NotificationHub/NotificationHub.tsx +1 -1
- package/src/components/StatisticCard/StatisticCard.tsx +1 -1
- package/src/i18n/store.ts +18 -9
- package/dist/chunk-M5H3G5VE.js.map +0 -1
- package/dist/douglasneuroinformatics-libui-3.8.5.tgz +0 -0
- /package/dist/{chunk-GLOKPJGE.js.map → chunk-GFIT4FAN.js.map} +0 -0
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
// src/i18n/store.ts
|
|
4
4
|
import { createStore } from "zustand/vanilla";
|
|
5
|
+
import { subscribeWithSelector } from "zustand/middleware";
|
|
5
6
|
|
|
6
7
|
// src/i18n/translations/libui.json
|
|
7
8
|
var libui_default = {
|
|
@@ -173,15 +174,17 @@ function getTranslation(target, state, ...args) {
|
|
|
173
174
|
}
|
|
174
175
|
|
|
175
176
|
// src/i18n/store.ts
|
|
176
|
-
var translationStore = createStore(
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
}
|
|
177
|
+
var translationStore = createStore(
|
|
178
|
+
subscribeWithSelector((set) => ({
|
|
179
|
+
changeLanguage(language) {
|
|
180
|
+
set({ resolvedLanguage: language });
|
|
181
|
+
},
|
|
182
|
+
fallbackLanguage: "en",
|
|
183
|
+
isInitialized: false,
|
|
184
|
+
resolvedLanguage: "en",
|
|
185
|
+
translations: { libui: libui_default }
|
|
186
|
+
}))
|
|
187
|
+
);
|
|
185
188
|
var i18n = {
|
|
186
189
|
init: ({ defaultLanguage, fallbackLanguage, translations } = {}) => {
|
|
187
190
|
const state = translationStore.getState();
|
|
@@ -189,6 +192,12 @@ var i18n = {
|
|
|
189
192
|
console.error("Cannot reinitialize translations store");
|
|
190
193
|
return;
|
|
191
194
|
}
|
|
195
|
+
translationStore.subscribe(
|
|
196
|
+
(state2) => state2.resolvedLanguage,
|
|
197
|
+
(resolvedLanguage) => {
|
|
198
|
+
document.documentElement.lang = resolvedLanguage;
|
|
199
|
+
}
|
|
200
|
+
);
|
|
192
201
|
translationStore.setState({
|
|
193
202
|
fallbackLanguage: fallbackLanguage ?? state.fallbackLanguage,
|
|
194
203
|
isInitialized: true,
|
|
@@ -210,4 +219,4 @@ export {
|
|
|
210
219
|
translationStore,
|
|
211
220
|
i18n
|
|
212
221
|
};
|
|
213
|
-
//# sourceMappingURL=chunk-
|
|
222
|
+
//# sourceMappingURL=chunk-CAWCERN4.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/i18n/store.ts","../src/i18n/translations/libui.json","../src/i18n/internal.ts"],"sourcesContent":["import type { SetOptional } from 'type-fest';\nimport { createStore } from 'zustand/vanilla';\nimport { subscribeWithSelector } from 'zustand/middleware';\n\nimport libui from '@/i18n/translations/libui.json';\n\nimport { getTranslation } from './internal';\n\nimport type { Language, TranslateFunction, Translations } from './types';\n\ntype InitOptions = {\n defaultLanguage?: Language;\n fallbackLanguage?: Language;\n translations?: SetOptional<Translations, 'libui'>;\n};\n\ntype I18N = {\n init: (options?: InitOptions) => void;\n t: TranslateFunction;\n};\n\nexport type TranslationStore = {\n changeLanguage: (language: Language) => void;\n fallbackLanguage: Language;\n isInitialized: boolean;\n resolvedLanguage: Language;\n translations: Translations;\n};\n\nexport const translationStore = createStore(\n subscribeWithSelector<TranslationStore>((set) => ({\n changeLanguage(language) {\n set({ resolvedLanguage: language });\n },\n fallbackLanguage: 'en',\n isInitialized: false,\n resolvedLanguage: 'en',\n translations: { libui }\n }))\n);\n\nexport const i18n: I18N = {\n init: ({ defaultLanguage, fallbackLanguage, translations }: InitOptions = {}) => {\n const state = translationStore.getState();\n if (state.isInitialized) {\n console.error('Cannot reinitialize translations store');\n return;\n }\n translationStore.subscribe(\n (state) => state.resolvedLanguage,\n (resolvedLanguage) => {\n document.documentElement.lang = resolvedLanguage;\n }\n );\n translationStore.setState({\n fallbackLanguage: fallbackLanguage ?? state.fallbackLanguage,\n isInitialized: true,\n resolvedLanguage: defaultLanguage ?? state.resolvedLanguage,\n translations: {\n ...state.translations,\n ...translations\n }\n });\n },\n t: (target, ...args) => {\n const state = translationStore.getState();\n return getTranslation(target, state, ...args);\n }\n};\n","{\n \"days\": {\n \"friday\": {\n \"en\": \"Friday\",\n \"fr\": \"Vendredi\"\n },\n \"monday\": {\n \"en\": \"Monday\",\n \"fr\": \"Lundi\"\n },\n \"saturday\": {\n \"en\": \"Saturday\",\n \"fr\": \"Samedi\"\n },\n \"sunday\": {\n \"en\": \"Sunday\",\n \"fr\": \"Dimanche\"\n },\n \"thursday\": {\n \"en\": \"Thursday\",\n \"fr\": \"Jeudi\"\n },\n \"tuesday\": {\n \"en\": \"Tuesday\",\n \"fr\": \"Mardi\"\n },\n \"wednesday\": {\n \"en\": \"Wednesday\",\n \"fr\": \"Mercredi\"\n }\n },\n \"form\": {\n \"append\": {\n \"en\": \"Append\",\n \"fr\": \"Ajouter\"\n },\n \"radioLabels\": {\n \"false\": {\n \"en\": \"False\",\n \"fr\": \"Faux\"\n },\n \"true\": {\n \"en\": \"True\",\n \"fr\": \"Vrai\"\n }\n },\n \"remove\": {\n \"en\": \"Remove\",\n \"fr\": \"Supprimer\"\n },\n \"required\": {\n \"en\": \"This field is required\",\n \"fr\": \"Ce champ est obligatoire\"\n },\n \"reset\": {\n \"en\": \"Reset\",\n \"fr\": \"Réinitialiser\"\n },\n \"submit\": {\n \"en\": \"Submit\",\n \"fr\": \"Soumettre\"\n }\n },\n \"months\": {\n \"april\": {\n \"en\": \"April\",\n \"fr\": \"Avril\"\n },\n \"august\": {\n \"en\": \"August\",\n \"fr\": \"Août\"\n },\n \"december\": {\n \"en\": \"December\",\n \"fr\": \"Décembre\"\n },\n \"february\": {\n \"en\": \"February\",\n \"fr\": \"Février\"\n },\n \"january\": {\n \"en\": \"January\",\n \"fr\": \"Janvier\"\n },\n \"july\": {\n \"en\": \"July\",\n \"fr\": \"Juillet\"\n },\n \"june\": {\n \"en\": \"June\",\n \"fr\": \"Juin\"\n },\n \"march\": {\n \"en\": \"March\",\n \"fr\": \"Mars\"\n },\n \"may\": {\n \"en\": \"May\",\n \"fr\": \"Mai\"\n },\n \"november\": {\n \"en\": \"November\",\n \"fr\": \"Novembre\"\n },\n \"october\": {\n \"en\": \"October\",\n \"fr\": \"Octobre\"\n },\n \"september\": {\n \"en\": \"September\",\n \"fr\": \"Septembre\"\n }\n },\n \"notifications\": {\n \"types\": {\n \"error\": {\n \"en\": \"Error\",\n \"fr\": \"Erreur\"\n },\n \"info\": {\n \"en\": \"Info\",\n \"fr\": \"Attention\"\n },\n \"success\": {\n \"en\": \"Success\",\n \"fr\": \"Succès\"\n },\n \"warning\": {\n \"en\": \"Warning\",\n \"fr\": \"Avertissement\"\n }\n }\n },\n \"pagination\": {\n \"info\": {\n \"en\": \"Showing {{first}} to {{last}} of {{total}} results\",\n \"fr\": \"Affichage de {{first}} à {{last}} sur {{total}} résultats\"\n },\n \"next\": {\n \"en\": \"Next\",\n \"fr\": \"Suivant\"\n },\n \"previous\": {\n \"en\": \"Previous\",\n \"fr\": \"Précédent\"\n }\n },\n \"searchBar\": {\n \"placeholder\": {\n \"en\": \"Search...\",\n \"fr\": \"Rechercher...\"\n }\n }\n}\n","import { format } from '@douglasneuroinformatics/libjs';\nimport { get } from 'lodash-es';\nimport type { Primitive } from 'type-fest';\n\nimport type { Language } from './types';\n\nexport function getTranslation(\n target: { [L in Language]?: string } | string,\n state: {\n fallbackLanguage: Language;\n resolvedLanguage: Language;\n translations: { [key: string]: any };\n },\n ...args: Exclude<Primitive, symbol>[]\n) {\n let value: { [key: string]: string };\n if (typeof target === 'string') {\n value = get(state.translations, target) as { [key: string]: string };\n } else {\n value = target;\n }\n return format((value[state.resolvedLanguage] ?? value[state.fallbackLanguage])!, ...args);\n}\n"],"mappings":"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","names":["state"]}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import {
|
|
3
3
|
getTranslation,
|
|
4
4
|
translationStore
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-CAWCERN4.js";
|
|
6
6
|
import {
|
|
7
7
|
isBrowser
|
|
8
8
|
} from "./chunk-VJSOLDCS.js";
|
|
@@ -367,4 +367,4 @@ export {
|
|
|
367
367
|
useTranslation,
|
|
368
368
|
useWindowSize
|
|
369
369
|
};
|
|
370
|
-
//# sourceMappingURL=chunk-
|
|
370
|
+
//# sourceMappingURL=chunk-GFIT4FAN.js.map
|
package/dist/components.d.ts
CHANGED
|
@@ -1239,9 +1239,9 @@ type FormProps<TSchema extends z.ZodType<FormDataType>, TData extends z.TypeOf<T
|
|
|
1239
1239
|
content: FormContent<TData>;
|
|
1240
1240
|
fieldsFooter?: React.ReactNode;
|
|
1241
1241
|
id?: string;
|
|
1242
|
-
initialValues?: PartialNullableFormDataType<TData
|
|
1243
|
-
onError?: (error: z.ZodError<TData
|
|
1244
|
-
onSubmit: (data: TData) => Promisable<void>;
|
|
1242
|
+
initialValues?: PartialNullableFormDataType<NoInfer<TData>>;
|
|
1243
|
+
onError?: (error: z.ZodError<NoInfer<TData>>) => void;
|
|
1244
|
+
onSubmit: (data: NoInfer<TData>) => Promisable<void>;
|
|
1245
1245
|
preventResetValuesOnReset?: boolean;
|
|
1246
1246
|
readOnly?: boolean;
|
|
1247
1247
|
resetBtn?: boolean;
|
package/dist/components.js
CHANGED
|
@@ -5,8 +5,8 @@ import {
|
|
|
5
5
|
useNotificationsStore,
|
|
6
6
|
useTheme,
|
|
7
7
|
useTranslation
|
|
8
|
-
} from "./chunk-
|
|
9
|
-
import "./chunk-
|
|
8
|
+
} from "./chunk-GFIT4FAN.js";
|
|
9
|
+
import "./chunk-CAWCERN4.js";
|
|
10
10
|
import {
|
|
11
11
|
cn
|
|
12
12
|
} from "./chunk-VJSOLDCS.js";
|
|
@@ -1514,8 +1514,8 @@ var ContextMenu = Object.assign(Root7.bind(null), {
|
|
|
1514
1514
|
|
|
1515
1515
|
// src/components/CopyButton/CopyButton.tsx
|
|
1516
1516
|
import { useState as useState2 } from "react";
|
|
1517
|
-
import { AnimatePresence, motion } from "framer-motion";
|
|
1518
1517
|
import { ClipboardCheckIcon, ClipboardListIcon } from "lucide-react";
|
|
1518
|
+
import { AnimatePresence, motion } from "motion/react";
|
|
1519
1519
|
import { match } from "ts-pattern";
|
|
1520
1520
|
import { jsx as jsx71 } from "react/jsx-runtime";
|
|
1521
1521
|
var CopyButton = ({
|
|
@@ -1556,12 +1556,12 @@ var CopyButton = ({
|
|
|
1556
1556
|
// src/components/DatePicker/DatePicker.tsx
|
|
1557
1557
|
import { useReducer, useState as useState3 } from "react";
|
|
1558
1558
|
import * as React17 from "react";
|
|
1559
|
-
import { AnimatePresence as AnimatePresence3, motion as motion3 } from "
|
|
1559
|
+
import { AnimatePresence as AnimatePresence3, motion as motion3 } from "motion/react";
|
|
1560
1560
|
|
|
1561
1561
|
// src/components/DatePicker/Calendar.tsx
|
|
1562
1562
|
import { forwardRef as forwardRef59 } from "react";
|
|
1563
|
-
import { AnimatePresence as AnimatePresence2, motion as motion2 } from "framer-motion";
|
|
1564
1563
|
import { range as range2 } from "lodash-es";
|
|
1564
|
+
import { AnimatePresence as AnimatePresence2, motion as motion2 } from "motion/react";
|
|
1565
1565
|
import { jsx as jsx72, jsxs as jsxs19 } from "react/jsx-runtime";
|
|
1566
1566
|
var CALENDAR_ANIMATION_DURATION = 0.2;
|
|
1567
1567
|
var Calendar = forwardRef59(function Calendar2(props, ref) {
|
|
@@ -2976,8 +2976,8 @@ var StringFieldInput = ({
|
|
|
2976
2976
|
|
|
2977
2977
|
// src/components/Form/StringField/StringFieldPassword.tsx
|
|
2978
2978
|
import { useEffect as useEffect7, useState as useState6 } from "react";
|
|
2979
|
-
import { motion as motion4 } from "framer-motion";
|
|
2980
2979
|
import { EyeIcon, EyeOffIcon } from "lucide-react";
|
|
2980
|
+
import { motion as motion4 } from "motion/react";
|
|
2981
2981
|
import { jsx as jsx125, jsxs as jsxs42 } from "react/jsx-runtime";
|
|
2982
2982
|
var StringFieldPassword = ({
|
|
2983
2983
|
calculateStrength,
|
|
@@ -4022,8 +4022,8 @@ var MenuBar = Object.assign(MenuBarRoot, {
|
|
|
4022
4022
|
});
|
|
4023
4023
|
|
|
4024
4024
|
// src/components/NotificationHub/NotificationHub.tsx
|
|
4025
|
-
import { AnimatePresence as AnimatePresence4, motion as motion5 } from "framer-motion";
|
|
4026
4025
|
import { XIcon as XIcon2 } from "lucide-react";
|
|
4026
|
+
import { AnimatePresence as AnimatePresence4, motion as motion5 } from "motion/react";
|
|
4027
4027
|
|
|
4028
4028
|
// src/components/NotificationHub/NotificationIcon.tsx
|
|
4029
4029
|
import { jsx as jsx152 } from "react/jsx-runtime";
|
|
@@ -4516,7 +4516,7 @@ var SpinnerIcon = ({ className, ...props }) => /* @__PURE__ */ jsx175(
|
|
|
4516
4516
|
|
|
4517
4517
|
// src/components/StatisticCard/StatisticCard.tsx
|
|
4518
4518
|
import { useEffect as useEffect11 } from "react";
|
|
4519
|
-
import { motion as motion6, useSpring, useTransform } from "
|
|
4519
|
+
import { motion as motion6, useSpring, useTransform } from "motion/react";
|
|
4520
4520
|
import { jsx as jsx176, jsxs as jsxs60 } from "react/jsx-runtime";
|
|
4521
4521
|
var StatisticCard = ({ className, icon, label, value, ...props }) => {
|
|
4522
4522
|
const spring = useSpring(0, { bounce: 0 });
|