mui-language-picker 2.6.0 → 2.6.1

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.
Files changed (49) hide show
  1. package/dist/ChangeFeat.d.ts +12 -0
  2. package/dist/ChangeFeat.js +125 -0
  3. package/dist/ChangeName.d.ts +11 -0
  4. package/dist/ChangeName.js +41 -0
  5. package/dist/GrowingSpacer.d.ts +2 -0
  6. package/dist/GrowingSpacer.js +10 -0
  7. package/dist/LanguageChoice.d.ts +13 -0
  8. package/dist/LanguageChoice.js +94 -0
  9. package/dist/LanguagePicker.d.ts +28 -0
  10. package/dist/LanguagePicker.js +476 -0
  11. package/dist/bcp47.d.ts +13 -0
  12. package/dist/bcp47.js +133 -0
  13. package/dist/data/codeScripts.d.ts +2 -0
  14. package/dist/data/codeScripts.js +4 -0
  15. package/dist/data/families.json +35009 -0
  16. package/dist/data/langtags.json +290496 -0
  17. package/dist/data/langtagsIndex.d.ts +2 -0
  18. package/dist/data/langtagsIndex.js +4 -0
  19. package/dist/data/rtlScripts.d.ts +2 -0
  20. package/dist/data/rtlScripts.js +3 -0
  21. package/dist/data/scriptFontIndex.d.ts +2 -0
  22. package/dist/data/scriptFontIndex.js +4 -0
  23. package/dist/data/scriptName.d.ts +2 -0
  24. package/dist/data/scriptName.js +897 -0
  25. package/dist/data/tagIndex.d.ts +2 -0
  26. package/dist/data/tagIndex.js +4 -0
  27. package/dist/getDisplayName.d.ts +3 -0
  28. package/dist/getDisplayName.js +20 -0
  29. package/dist/index.d.ts +3 -0
  30. package/dist/index.js +23 -0
  31. package/dist/langPicker/getJsonData.d.ts +1 -0
  32. package/dist/langPicker/getJsonData.js +22 -0
  33. package/dist/langPicker/makeIndex2.d.ts +1 -0
  34. package/dist/langPicker/makeIndex2.js +372 -0
  35. package/dist/langPicker/types.d.ts +84 -0
  36. package/dist/langPicker/types.js +6 -0
  37. package/dist/langTags.d.ts +16 -0
  38. package/dist/langTags.js +115 -0
  39. package/dist/localization/index.d.ts +29 -0
  40. package/dist/localization/index.js +32 -0
  41. package/dist/model/index.d.ts +2 -0
  42. package/dist/model/index.js +18 -0
  43. package/dist/useDebounce.d.ts +5 -0
  44. package/dist/useDebounce.js +17 -0
  45. package/dist/util/badChar.d.ts +2 -0
  46. package/dist/util/badChar.js +25 -0
  47. package/dist/util/index.d.ts +1 -0
  48. package/dist/util/index.js +17 -0
  49. package/package.json +1 -1
@@ -0,0 +1,12 @@
1
+ import React from 'react';
2
+ import { ILanguagePickerStrings } from './model';
3
+ interface IProps {
4
+ isOpen: boolean;
5
+ onClose?: () => void;
6
+ curFeats?: string;
7
+ onNewFeat?: (feats: string) => void;
8
+ offline?: boolean;
9
+ t?: ILanguagePickerStrings;
10
+ }
11
+ export default function ChangeFeat({ isOpen, onClose, curFeats, onNewFeat, offline, t, }: IProps): React.JSX.Element;
12
+ export {};
@@ -0,0 +1,125 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ var react_1 = __importDefault(require("react"));
7
+ var Button_1 = __importDefault(require("@mui/material/Button"));
8
+ var TextField_1 = __importDefault(require("@mui/material/TextField"));
9
+ var Dialog_1 = __importDefault(require("@mui/material/Dialog"));
10
+ var DialogActions_1 = __importDefault(require("@mui/material/DialogActions"));
11
+ var DialogContent_1 = __importDefault(require("@mui/material/DialogContent"));
12
+ var DialogContentText_1 = __importDefault(require("@mui/material/DialogContentText"));
13
+ var DialogTitle_1 = __importDefault(require("@mui/material/DialogTitle"));
14
+ var Info_1 = __importDefault(require("@mui/icons-material/Info"));
15
+ var localization_1 = require("./localization");
16
+ var material_1 = require("@mui/material");
17
+ function ChangeFeat(_a) {
18
+ var isOpen = _a.isOpen, onClose = _a.onClose, curFeats = _a.curFeats, onNewFeat = _a.onNewFeat, _b = _a.offline, offline = _b === void 0 ? false : _b, t = _a.t;
19
+ var _c = react_1.default.useState(isOpen), openFeat = _c[0], setOpenFeat = _c[1];
20
+ var _d = react_1.default.useState(false), openAdd = _d[0], setOpenAdd = _d[1];
21
+ var _e = react_1.default.useState([]), chipData = _e[0], setChipData = _e[1];
22
+ var _f = react_1.default.useState(''), oneFeat = _f[0], setOneFeat = _f[1];
23
+ var _g = react_1.default.useState(1), nextKey = _g[0], setNextKey = _g[1];
24
+ var _h = react_1.default.useState(''), helpText = _h[0], setHelpText = _h[1];
25
+ react_1.default.useEffect(function () {
26
+ if (curFeats) {
27
+ var n_1 = 0;
28
+ var feats = curFeats
29
+ .split(',')
30
+ .map(function (feat) {
31
+ var m = /^"(\w\w\w\w)"\s*([0-9]?)$/.exec(feat.trim());
32
+ if (!m)
33
+ return undefined;
34
+ return {
35
+ key: ++n_1,
36
+ label: m[2] ? "".concat(m[1], " ").concat(m[2]) : m[1],
37
+ };
38
+ })
39
+ .filter(function (v) { return Boolean(v); });
40
+ setChipData(feats);
41
+ }
42
+ }, [curFeats]);
43
+ var makeCssFeat = function (chipValue) {
44
+ var m = /^(\w\w\w\w)\s*([0-9]?)$/.exec(chipValue.trim());
45
+ return m ? (m[2] ? "\"".concat(m[1], "\" ").concat(m[2]) : "\"".concat(m[1], "\"")) : '';
46
+ };
47
+ var handleCloseFeatures = function (save) { return function () {
48
+ if (save && onNewFeat) {
49
+ onNewFeat(chipData.map(function (chip) { return makeCssFeat(chip.label); }).join(', '));
50
+ }
51
+ if (onClose)
52
+ onClose();
53
+ setOpenFeat(false);
54
+ }; };
55
+ react_1.default.useEffect(function () {
56
+ setOpenFeat(isOpen);
57
+ }, [isOpen]);
58
+ var handleDelete = function (chipToDelete) { return function () {
59
+ setChipData(function (chips) {
60
+ return chips.filter(function (chip) { return chip.key !== chipToDelete.key; });
61
+ });
62
+ }; };
63
+ var handleAdd = function () {
64
+ setOneFeat('');
65
+ setOpenAdd(true);
66
+ };
67
+ var handleCloseAdd = function (label) { return function () {
68
+ if (label && !makeCssFeat(label)) {
69
+ setHelpText((t === null || t === void 0 ? void 0 : t.invalidFeature) || localization_1.languagePickerStrings_en.invalidFeature || '');
70
+ return;
71
+ }
72
+ if (label) {
73
+ setChipData(chipData.concat([{ key: nextKey, label: label }]));
74
+ setNextKey(nextKey + 1);
75
+ }
76
+ setOpenAdd(false);
77
+ setHelpText('');
78
+ }; };
79
+ var handleSelect = function (chipToSelect) { return function () {
80
+ setOneFeat(chipToSelect.label);
81
+ setOpenAdd(true);
82
+ }; };
83
+ var handleChange = function (event) {
84
+ setOneFeat(event.target.value);
85
+ };
86
+ return (react_1.default.createElement(Dialog_1.default, { open: openFeat, onClose: handleCloseFeatures() },
87
+ react_1.default.createElement(DialogTitle_1.default, null, (t === null || t === void 0 ? void 0 : t.changeFeatures) || localization_1.languagePickerStrings_en.changeFeatures),
88
+ react_1.default.createElement(DialogContent_1.default, null,
89
+ react_1.default.createElement(DialogContentText_1.default, null,
90
+ react_1.default.createElement(react_1.default.Fragment, null,
91
+ (t === null || t === void 0 ? void 0 : t.featureInstruction) || localization_1.languagePickerStrings_en.featureInstruction,
92
+ ' ',
93
+ !offline && (react_1.default.createElement("a", { href: "https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_fonts/OpenType_fonts_guide#Font_features", title: (t === null || t === void 0 ? void 0 : t.openTypeFeatures) || localization_1.languagePickerStrings_en.openTypeFeatures, target: "_blank", rel: "noopener noreferrer" },
94
+ react_1.default.createElement(Info_1.default, { fontSize: "small" }))))),
95
+ react_1.default.createElement(react_1.default.Fragment, null,
96
+ react_1.default.createElement(material_1.Paper, { sx: {
97
+ display: 'flex',
98
+ justifyContent: 'center',
99
+ flexWrap: 'wrap',
100
+ listStyle: 'none',
101
+ flexDirection: 'row',
102
+ p: 0.5,
103
+ m: 0,
104
+ }, component: "ul" }, chipData
105
+ .map(function (data) {
106
+ return (react_1.default.createElement(material_1.ListItem, { key: data.key, sx: { width: 'auto' } },
107
+ react_1.default.createElement(material_1.Chip, { label: data.label, onClick: handleSelect(data), onDelete: chipData.length > 0 ? handleDelete(data) : undefined })));
108
+ })
109
+ .concat([
110
+ react_1.default.createElement(material_1.ListItem, { key: 99, sx: { width: 'auto' } },
111
+ react_1.default.createElement(material_1.Chip, { label: (t === null || t === void 0 ? void 0 : t.addFeature) || localization_1.languagePickerStrings_en.addFeature, "data-testid": "add-feature", onClick: handleAdd })),
112
+ ])),
113
+ react_1.default.createElement(Dialog_1.default, { open: openAdd, onClose: handleCloseAdd(undefined) },
114
+ react_1.default.createElement(DialogTitle_1.default, null, (t === null || t === void 0 ? void 0 : t.addFeatureTitle) || localization_1.languagePickerStrings_en.addFeatureTitle),
115
+ react_1.default.createElement(DialogContent_1.default, null,
116
+ react_1.default.createElement(DialogContentText_1.default, null, (t === null || t === void 0 ? void 0 : t.addFeatureInstruction) || localization_1.languagePickerStrings_en.addFeatureInstruction),
117
+ react_1.default.createElement(TextField_1.default, { autoFocus: true, margin: "dense", id: "feature", "data-testid": "feature-input", label: (t === null || t === void 0 ? void 0 : t.featureInput) || localization_1.languagePickerStrings_en.featureInput, fullWidth: true, variant: "standard", value: oneFeat, onChange: handleChange, helperText: helpText })),
118
+ react_1.default.createElement(DialogActions_1.default, null,
119
+ react_1.default.createElement(Button_1.default, { onClick: handleCloseAdd(undefined) }, (t === null || t === void 0 ? void 0 : t.cancel) || localization_1.languagePickerStrings_en.cancel),
120
+ react_1.default.createElement(Button_1.default, { onClick: handleCloseAdd(oneFeat), "data-testid": "do-add-feature" }, (t === null || t === void 0 ? void 0 : t.addFeature) || localization_1.languagePickerStrings_en.addFeature))))),
121
+ react_1.default.createElement(DialogActions_1.default, null,
122
+ react_1.default.createElement(Button_1.default, { onClick: handleCloseFeatures() }, (t === null || t === void 0 ? void 0 : t.cancel) || localization_1.languagePickerStrings_en.cancel),
123
+ react_1.default.createElement(Button_1.default, { onClick: handleCloseFeatures(true) }, (t === null || t === void 0 ? void 0 : t.change) || localization_1.languagePickerStrings_en.change))));
124
+ }
125
+ exports.default = ChangeFeat;
@@ -0,0 +1,11 @@
1
+ import React from 'react';
2
+ import { ILanguagePickerStrings } from './model';
3
+ interface IProps {
4
+ isOpen: boolean;
5
+ onClose?: () => void;
6
+ curName?: string;
7
+ onNewName?: (name: string) => void;
8
+ t?: ILanguagePickerStrings;
9
+ }
10
+ export default function ChangeName({ isOpen, onClose, curName, onNewName, t, }: IProps): React.JSX.Element;
11
+ export {};
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ var react_1 = __importDefault(require("react"));
7
+ var Button_1 = __importDefault(require("@mui/material/Button"));
8
+ var TextField_1 = __importDefault(require("@mui/material/TextField"));
9
+ var Dialog_1 = __importDefault(require("@mui/material/Dialog"));
10
+ var DialogActions_1 = __importDefault(require("@mui/material/DialogActions"));
11
+ var DialogContent_1 = __importDefault(require("@mui/material/DialogContent"));
12
+ var DialogContentText_1 = __importDefault(require("@mui/material/DialogContentText"));
13
+ var DialogTitle_1 = __importDefault(require("@mui/material/DialogTitle"));
14
+ var localization_1 = require("./localization");
15
+ function ChangeName(_a) {
16
+ var isOpen = _a.isOpen, onClose = _a.onClose, curName = _a.curName, onNewName = _a.onNewName, t = _a.t;
17
+ var _b = react_1.default.useState(isOpen), open = _b[0], setOpen = _b[1];
18
+ var _c = react_1.default.useState(curName || ''), name = _c[0], setName = _c[1];
19
+ var handleClose = function (save) { return function () {
20
+ if (save && name && onNewName)
21
+ onNewName(name);
22
+ if (onClose)
23
+ onClose();
24
+ setOpen(false);
25
+ }; };
26
+ var handleNameChange = function (event) {
27
+ setName(event.target.value);
28
+ };
29
+ react_1.default.useEffect(function () {
30
+ setOpen(isOpen);
31
+ }, [isOpen]);
32
+ return (react_1.default.createElement(Dialog_1.default, { open: open, onClose: handleClose() },
33
+ react_1.default.createElement(DialogTitle_1.default, null, (t === null || t === void 0 ? void 0 : t.changeName) || localization_1.languagePickerStrings_en.changeName),
34
+ react_1.default.createElement(DialogContent_1.default, null,
35
+ react_1.default.createElement(DialogContentText_1.default, null, (t === null || t === void 0 ? void 0 : t.nameInstruction) || localization_1.languagePickerStrings_en.nameInstruction),
36
+ react_1.default.createElement(TextField_1.default, { autoFocus: true, margin: "dense", id: "name", "data-testid": "name", label: (t === null || t === void 0 ? void 0 : t.newName) || localization_1.languagePickerStrings_en.newName, fullWidth: true, value: name, onChange: handleNameChange })),
37
+ react_1.default.createElement(DialogActions_1.default, null,
38
+ react_1.default.createElement(Button_1.default, { onClick: handleClose() }, (t === null || t === void 0 ? void 0 : t.cancel) || localization_1.languagePickerStrings_en.cancel),
39
+ react_1.default.createElement(Button_1.default, { onClick: handleClose(true) }, (t === null || t === void 0 ? void 0 : t.change) || localization_1.languagePickerStrings_en.change))));
40
+ }
41
+ exports.default = ChangeName;
@@ -0,0 +1,2 @@
1
+ import React from 'react';
2
+ export declare const GrowingSpacer: () => React.JSX.Element;
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.GrowingSpacer = void 0;
7
+ var react_1 = __importDefault(require("react"));
8
+ var material_1 = require("@mui/material");
9
+ var GrowingSpacer = function () { return react_1.default.createElement(material_1.Box, { sx: { flexGrow: 1 } }, '\u00A0'); };
10
+ exports.GrowingSpacer = GrowingSpacer;
@@ -0,0 +1,13 @@
1
+ import React from 'react';
2
+ import { ILanguagePickerStrings } from './model';
3
+ import { LangTag } from './langPicker/types';
4
+ import { DisplayName } from './getDisplayName';
5
+ interface IProps {
6
+ list: LangTag[];
7
+ choose: (tag: LangTag) => void;
8
+ secondary?: boolean;
9
+ displayName?: DisplayName;
10
+ t: ILanguagePickerStrings;
11
+ }
12
+ export declare function LanguageChoice(props: IProps): React.JSX.Element;
13
+ export default LanguageChoice;
@@ -0,0 +1,94 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
26
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
27
+ if (ar || !(i in from)) {
28
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
29
+ ar[i] = from[i];
30
+ }
31
+ }
32
+ return to.concat(ar || Array.prototype.slice.call(from));
33
+ };
34
+ Object.defineProperty(exports, "__esModule", { value: true });
35
+ exports.LanguageChoice = void 0;
36
+ var react_1 = __importStar(require("react"));
37
+ var material_1 = require("@mui/material");
38
+ var langTags_1 = require("./langTags");
39
+ var lodash_1 = require("lodash");
40
+ var GrowingSpacer_1 = require("./GrowingSpacer");
41
+ var getDisplayName_1 = require("./getDisplayName");
42
+ function LanguageChoice(props) {
43
+ var list = props.list, secondary = props.secondary, t = props.t, choose = props.choose;
44
+ var displayName = props.displayName;
45
+ var dense = (0, react_1.useState)(true)[0];
46
+ var _a = (0, react_1.useState)(window.innerHeight), height = _a[0], setHeight = _a[1];
47
+ var handleChoose = function (tag) { return function () {
48
+ choose(tag);
49
+ }; };
50
+ var handleKeydown = function (tag) { return function (e) {
51
+ if (e.key === ' ' || e.key === 'Enter') {
52
+ choose(tag);
53
+ }
54
+ }; };
55
+ (0, react_1.useEffect)(function () {
56
+ var handleResize = (0, lodash_1.debounce)(function () { return setHeight(window.innerHeight); }, 100);
57
+ window.addEventListener('resize', handleResize);
58
+ return function () {
59
+ window.removeEventListener('resize', handleResize);
60
+ };
61
+ }, []);
62
+ var scriptDetail = function (tag) {
63
+ var _a;
64
+ var tagParts = tag.tag.split('-');
65
+ return tagParts.length > 1 && tagParts[1].length === 4
66
+ ? t.inScript.replace('$1', (_a = langTags_1.scriptName.get(tagParts[1])) !== null && _a !== void 0 ? _a : tagParts[1])
67
+ : '';
68
+ };
69
+ var detail = function (tag) {
70
+ var _a, _b;
71
+ var namesSet = new Set(__spreadArray(__spreadArray([], (_a = tag.localnames) !== null && _a !== void 0 ? _a : [], true), (_b = tag.names) !== null && _b !== void 0 ? _b : [], true));
72
+ return (react_1.default.createElement(react_1.default.Fragment, null,
73
+ react_1.default.createElement(material_1.Typography, { component: 'span' }, t.languageOf
74
+ .replace('$1', tag.regionname ? tag.regionname : tag.region ? tag.region : '')
75
+ .replace('$2', scriptDetail(tag))),
76
+ react_1.default.createElement("br", null),
77
+ react_1.default.createElement(material_1.Typography, { component: 'span' }, Array.from(namesSet).sort().join(', '))));
78
+ };
79
+ var langElems = function (refList) {
80
+ var filteredList = refList.filter(function (tag) { return Boolean(tag === null || tag === void 0 ? void 0 : tag.tag); });
81
+ return filteredList.map(function (tag, i) {
82
+ return (react_1.default.createElement(material_1.ListItemButton, { key: "".concat(tag.tag, " ").concat(i), onClick: handleChoose(tag), onKeyDown: handleKeydown(tag) },
83
+ react_1.default.createElement(material_1.ListItemText, { primary: react_1.default.createElement(material_1.Box, { sx: { display: 'flex' } },
84
+ react_1.default.createElement(material_1.Typography, null, (0, getDisplayName_1.getDisplayName)(tag.name, tag, displayName)),
85
+ react_1.default.createElement(GrowingSpacer_1.GrowingSpacer, null),
86
+ react_1.default.createElement(material_1.Typography, null, tag.tag)), secondary: secondary ? detail(tag) : null })));
87
+ });
88
+ };
89
+ return (react_1.default.createElement(material_1.Box, { sx: { flexGrow: 1, maxWidth: 752 } },
90
+ react_1.default.createElement(material_1.Box, { sx: { backgroundColor: 'background.paper' } },
91
+ react_1.default.createElement(material_1.List, { dense: dense, sx: { overflowY: 'scroll' }, style: { maxHeight: Math.max(height - 450, 200) } }, langElems(list)))));
92
+ }
93
+ exports.LanguageChoice = LanguageChoice;
94
+ exports.default = LanguageChoice;
@@ -0,0 +1,28 @@
1
+ import React from 'react';
2
+ import { ILanguagePickerStrings } from './model';
3
+ import { LangTag } from './langPicker/types';
4
+ import { DisplayName } from './getDisplayName';
5
+ interface IStateProps {
6
+ t: ILanguagePickerStrings;
7
+ }
8
+ interface IProps extends IStateProps {
9
+ value: string;
10
+ name: string;
11
+ font: string;
12
+ feats?: string;
13
+ displayName?: DisplayName;
14
+ setCode?: (code: string) => void;
15
+ setName?: (name: string) => void;
16
+ setFont?: (font: string) => void;
17
+ setFeats?: (features?: string) => void;
18
+ setInfo?: (tag: LangTag) => void;
19
+ setDir?: (rtl: boolean) => void;
20
+ filter?: (code: string) => boolean;
21
+ disabled?: boolean;
22
+ offline?: boolean;
23
+ required?: boolean;
24
+ noScript?: boolean;
25
+ noFont?: boolean;
26
+ }
27
+ export declare const LanguagePicker: (props: IProps) => React.JSX.Element;
28
+ export default LanguagePicker;