@daoyi/nmtl-ui 2.0.1-beta.13 → 2.0.1-beta.131
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/lib/components/Autocomplete-3b418e5f.js +494 -0
- package/lib/components/Autocomplete.js +20 -1
- package/lib/components/Avatar.js +59 -1
- package/lib/components/BackTop.js +124 -1
- package/lib/components/BarChart.js +764 -1
- package/lib/components/Breadcrumbs.js +122 -1
- package/lib/components/Button-7bd5aa09.js +114 -0
- package/lib/components/Button.js +7 -1
- package/lib/components/Carousel.js +4654 -1
- package/lib/components/Checkbox.js +37 -1
- package/lib/components/CollapseContent.js +180 -1
- package/lib/components/ContactModal-eaed02b8.js +12282 -0
- package/lib/components/ContactModal.js +24 -3
- package/lib/components/Drawer-629e59c7.js +176 -0
- package/lib/components/Drawer.js +17 -1
- package/lib/components/Dropdown.js +134 -1
- package/lib/components/Empty-c6a44967.js +46 -0
- package/lib/components/Empty.js +5 -1
- package/lib/components/ExportButton.js +128 -1
- package/lib/components/ExtraTools-2691c13e.js +3676 -0
- package/lib/components/ExtraTools.js +11 -22
- package/lib/components/Filter.js +821 -12
- package/lib/components/Footer.js +317 -1
- package/lib/components/ForwardLink-5fbd2705.js +184 -0
- package/lib/components/ForwardLink.js +10 -0
- package/lib/components/Header.js +233 -1
- package/lib/components/Image.js +61 -1
- package/lib/components/Input.js +89 -1
- package/lib/components/InputMethod.js +33949 -12
- package/lib/components/KeywordSearch-fec33a2c.js +156 -0
- package/lib/components/KeywordSearch.js +22 -1
- package/lib/components/KeywordTicker.js +224 -1
- package/lib/components/Keywords.js +383 -1
- package/lib/components/Loading.js +32 -1
- package/lib/components/MUITheme.js +2657 -1
- package/lib/components/Modal-e04532fa.js +127 -0
- package/lib/components/Modal.js +11 -1
- package/lib/components/MoreButton-19055e07.js +148 -0
- package/lib/components/MoreButton.js +8 -1
- package/lib/components/Pagination.js +3702 -0
- package/lib/components/Radio.js +83 -1
- package/lib/components/SNA.js +1755 -22
- package/lib/components/Select-cb3e1ba1.js +189 -0
- package/lib/components/Select.js +14 -1
- package/lib/components/Spin-8f87eadc.js +79 -0
- package/lib/components/Spin.js +7 -1
- package/lib/components/Table.js +51 -1
- package/lib/components/Tooltip-6ebfa9c1.js +70 -0
- package/lib/components/Tooltip.js +7 -1
- package/lib/components/_commonjsHelpers-70de2c37.js +28 -0
- package/lib/components/_rollupPluginBabelHelpers-a52356f6.js +142 -0
- package/lib/components/createSvgIcon-e3803ee1.js +576 -0
- package/lib/components/dataExport-a9e3fae1.js +91 -0
- package/lib/components/debounce-127da66c.js +355 -0
- package/lib/components/defaultTheme-ed7746fe.js +1661 -0
- package/lib/components/globalConfig.js +429 -0
- package/lib/components/hoist-non-react-statics.cjs-3f408ad2.js +105 -0
- package/lib/components/index-b47819f3.js +481 -0
- package/lib/components/index-b76a85f4.js +61 -0
- package/lib/components/isObjectLike-e111475d.js +190 -0
- package/lib/components/style-inject.es-1f59c1d0.js +28 -1
- package/lib/components/toConsumableArray-dbe8af76.js +19 -0
- package/lib/components/transform-849a452c.js +5475 -0
- package/lib/components/useTheme-d16d02d9.js +11 -0
- package/lib/components/withTheme-2d778133.js +6 -0
- package/lib/configs/config.selector.js +151 -0
- package/lib/configs/index.d.ts +1 -0
- package/lib/configs/index.js +1 -0
- package/lib/index.d.ts +5 -1
- package/lib/index.js +5 -1
- package/lib/utils/_rollupPluginBabelHelpers-9802e640.js +121 -0
- package/lib/utils/arrayMerge.js +4953 -1
- package/lib/utils/chunkArray.js +15 -1
- package/lib/utils/convert2HtmlEntities.js +42 -1
- package/lib/utils/domToImage.js +802 -1
- package/lib/utils/downloadGephi.js +106 -1
- package/lib/utils/exportXlsx.js +221 -1
- package/lib/utils/historyAppendSearch.js +502 -1
- package/lib/utils/isDevelopMode.js +5 -1
- package/lib/utils/parseYMD.js +36 -1
- package/lib/utils/removeDuplicateItem.js +11 -1
- package/lib/utils/sendEmail.js +39 -1
- package/lib/utils/snaDefine-6a2bcd94.js +5 -0
- package/lib/utils/snaDefine.js +1 -1
- package/lib/utils/snaPreProcess.js +84 -1
- package/package.json +134 -128
- package/lib/components/Empty-54b79907.js +0 -1
- package/lib/components/KeywordSearch-5a393f12.js +0 -1
- package/lib/components/Select-f2441b83.js +0 -1
- package/lib/components/_rollupPluginBabelHelpers-1b8c042f.js +0 -1
- package/lib/components/_rollupPluginBabelHelpers-ec4e2a53.js +0 -1
- package/lib/components/createSvgIcon-62b64929.js +0 -1
- package/lib/components/createSvgIcon-e24792d4.js +0 -1
- package/lib/components/createTheme-7fffa109.js +0 -1
- package/lib/components/dataExport-9fccd4f0.js +0 -1
- package/lib/components/debounce-c993109b.js +0 -1
- package/lib/components/hoist-non-react-statics.cjs-d6a9befd.js +0 -1
- package/lib/components/index-11391ca3.js +0 -7
- package/lib/components/index-b2745105.js +0 -7
- package/lib/components/isObjectLike-2f1983fe.js +0 -1
- package/lib/components/style-inject.es-c875d022.js +0 -1
- package/lib/components/transform-95ae0119.js +0 -1
- package/lib/utils/_commonjsHelpers-e2cda605.js +0 -1
- package/lib/utils/_rollupPluginBabelHelpers-928a52ce.js +0 -1
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import { a as _slicedToArray } from './_rollupPluginBabelHelpers-a52356f6.js';
|
|
2
|
+
import React__default, { useState, useEffect } from 'react';
|
|
3
|
+
import PropTypes from 'prop-types';
|
|
4
|
+
import { c as classNames } from './index-b76a85f4.js';
|
|
5
|
+
import axios from 'axios';
|
|
6
|
+
import { s as styleInject } from './style-inject.es-1f59c1d0.js';
|
|
7
|
+
import { A as Autocomplete } from './Autocomplete-3b418e5f.js';
|
|
8
|
+
|
|
9
|
+
var css_248z = ".keywordSearch {\n border-radius: 4px;\n width: 100%;\n margin-right: 14px;\n}\n.keywordSearch--animation .autocomplete {\n transition: max-width 0.3s ease-out;\n max-width: 240px;\n}\n.keywordSearch--focus {\n flex: 1;\n}\n.keywordSearch--focus .autocomplete {\n max-width: 100%;\n}\n.keywordSearch .MuiAutocomplete-hasPopupIcon.MuiAutocomplete-hasClearIcon .MuiAutocomplete-inputRoot[class*=MuiOutlinedInput-root] {\n border-radius: 10px;\n background-color: #ffffff66;\n}";
|
|
10
|
+
styleInject(css_248z);
|
|
11
|
+
|
|
12
|
+
const removeDuplicateItem = function (array) {
|
|
13
|
+
let key = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'value';
|
|
14
|
+
if (Array.isArray(array)) return array.filter((v, i, a) => a.findIndex(t => t[key] === v[key]) === i);
|
|
15
|
+
return [];
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
// 必須要有的參數:name
|
|
19
|
+
var FILTER_ID = 'id';
|
|
20
|
+
var FILTER_KEY = 'name';
|
|
21
|
+
var KeywordSearch = function KeywordSearch(_ref) {
|
|
22
|
+
var className = _ref.className,
|
|
23
|
+
animation = _ref.animation,
|
|
24
|
+
filterSameName = _ref.filterSameName,
|
|
25
|
+
keyword = _ref.keyword,
|
|
26
|
+
searchAPI = _ref.searchAPI,
|
|
27
|
+
placeholder = _ref.placeholder,
|
|
28
|
+
ariaLabel = _ref.ariaLabel,
|
|
29
|
+
setMenuOpen = _ref.setMenuOpen,
|
|
30
|
+
menuOpen = _ref.menuOpen,
|
|
31
|
+
onSearch = _ref.onSearch;
|
|
32
|
+
var _useState = useState(false),
|
|
33
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
34
|
+
loading = _useState2[0],
|
|
35
|
+
setLoading = _useState2[1];
|
|
36
|
+
var _useState3 = useState([]),
|
|
37
|
+
_useState4 = _slicedToArray(_useState3, 2),
|
|
38
|
+
options = _useState4[0],
|
|
39
|
+
setOptions = _useState4[1];
|
|
40
|
+
var _useState5 = useState(keyword),
|
|
41
|
+
_useState6 = _slicedToArray(_useState5, 2),
|
|
42
|
+
currentKeyword = _useState6[0],
|
|
43
|
+
setCurrentKeyword = _useState6[1];
|
|
44
|
+
|
|
45
|
+
// 過濾特定符號
|
|
46
|
+
var escapeRegExpKeyword = function escapeRegExpKeyword(string) {
|
|
47
|
+
return string.replace(/[-"':.*+?^${}()|[\]\\ ]/g, '\\\\$&');
|
|
48
|
+
}; // $& means the whole matched string
|
|
49
|
+
var fetchSearchList = function fetchSearchList(text) {
|
|
50
|
+
if (!text || text.length === 0) return;
|
|
51
|
+
setLoading(true);
|
|
52
|
+
axios.get(searchAPI, {
|
|
53
|
+
params: {
|
|
54
|
+
keyword: escapeRegExpKeyword(text)
|
|
55
|
+
}
|
|
56
|
+
}).then(function (response) {
|
|
57
|
+
if (response.data && response.data.data) {
|
|
58
|
+
setOptions(removeDuplicateItem(response.data.data, FILTER_ID));
|
|
59
|
+
}
|
|
60
|
+
}).finally(function () {
|
|
61
|
+
return setLoading(false);
|
|
62
|
+
});
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
/* 偵測keyword變動時開始搜尋 */
|
|
66
|
+
useEffect(function () {
|
|
67
|
+
return fetchSearchList(currentKeyword);
|
|
68
|
+
}, [currentKeyword]);
|
|
69
|
+
return /*#__PURE__*/React__default.createElement("div", {
|
|
70
|
+
className: classNames('keywordSearch', {
|
|
71
|
+
'keywordSearch--animation': animation
|
|
72
|
+
}, {
|
|
73
|
+
'keywordSearch--focus': menuOpen
|
|
74
|
+
}, className)
|
|
75
|
+
}, /*#__PURE__*/React__default.createElement(Autocomplete, {
|
|
76
|
+
ariaLabel: ariaLabel,
|
|
77
|
+
freeTyping: true,
|
|
78
|
+
renderAfterDefaultValueChange: true,
|
|
79
|
+
defaultValue: {
|
|
80
|
+
label: keyword,
|
|
81
|
+
value: keyword
|
|
82
|
+
},
|
|
83
|
+
loading: loading,
|
|
84
|
+
options: (filterSameName ? removeDuplicateItem(options, FILTER_KEY) : options).map(function (_ref2) {
|
|
85
|
+
var name = _ref2.name,
|
|
86
|
+
id = _ref2.id,
|
|
87
|
+
value = _ref2.value,
|
|
88
|
+
label = _ref2.label;
|
|
89
|
+
return {
|
|
90
|
+
value: id || value || name,
|
|
91
|
+
label: name || label
|
|
92
|
+
};
|
|
93
|
+
}),
|
|
94
|
+
placeholder: placeholder,
|
|
95
|
+
onSearch: setCurrentKeyword,
|
|
96
|
+
onChange: function onChange(result) {
|
|
97
|
+
if (result) onSearch(options.find(function (_ref3) {
|
|
98
|
+
var id = _ref3.id,
|
|
99
|
+
value = _ref3.value;
|
|
100
|
+
return id === result.value || value === result.value;
|
|
101
|
+
}) || result);
|
|
102
|
+
},
|
|
103
|
+
onEnter: function onEnter(event, result) {
|
|
104
|
+
return onSearch(result);
|
|
105
|
+
},
|
|
106
|
+
onFocus: function onFocus() {
|
|
107
|
+
return setMenuOpen(true);
|
|
108
|
+
},
|
|
109
|
+
onBlur: function onBlur() {
|
|
110
|
+
return setMenuOpen(false);
|
|
111
|
+
},
|
|
112
|
+
onKeyDown: function onKeyDown(event) {
|
|
113
|
+
/* WCAG 2.1.1:搜尋框聚焦時 header--focus 會 display:none 隱藏導覽連結,
|
|
114
|
+
瀏覽器在 keydown 當下就決定 Tab 的下一個焦點目標——若等 blur 才收合,
|
|
115
|
+
導覽連結永遠不在焦點順序中。改在 Tab 按下時同步收合(React 事件結尾
|
|
116
|
+
同步 re-render,早於瀏覽器預設移焦),讓導覽連結恢復可聚焦。 */
|
|
117
|
+
if (event.key === 'Tab') setMenuOpen(false);
|
|
118
|
+
}
|
|
119
|
+
}));
|
|
120
|
+
};
|
|
121
|
+
KeywordSearch.defaultProps = {
|
|
122
|
+
className: undefined,
|
|
123
|
+
animation: false,
|
|
124
|
+
filterSameName: true,
|
|
125
|
+
keyword: undefined,
|
|
126
|
+
searchAPI: undefined,
|
|
127
|
+
placeholder: undefined,
|
|
128
|
+
ariaLabel: undefined,
|
|
129
|
+
menuOpen: false,
|
|
130
|
+
setMenuOpen: function setMenuOpen() {},
|
|
131
|
+
onSearch: function onSearch() {}
|
|
132
|
+
};
|
|
133
|
+
KeywordSearch.propTypes = {
|
|
134
|
+
/** Css Name */
|
|
135
|
+
className: PropTypes.string,
|
|
136
|
+
/** 點擊後自動展開(動畫) */
|
|
137
|
+
animation: PropTypes.bool,
|
|
138
|
+
/** 是否過濾相同名字的項目 */
|
|
139
|
+
filterSameName: PropTypes.bool,
|
|
140
|
+
/** 預設的關鍵字 */
|
|
141
|
+
keyword: PropTypes.string,
|
|
142
|
+
/** SearchBar的API */
|
|
143
|
+
searchAPI: PropTypes.string,
|
|
144
|
+
/** 提示字 */
|
|
145
|
+
placeholder: PropTypes.string,
|
|
146
|
+
/** 輸入框可及名稱(可含輸入後效果提示;未提供時以 placeholder 代替) */
|
|
147
|
+
ariaLabel: PropTypes.string,
|
|
148
|
+
/** Dropdown是否開啟 */
|
|
149
|
+
menuOpen: PropTypes.bool,
|
|
150
|
+
/** 設定Dropdown開啟 */
|
|
151
|
+
setMenuOpen: PropTypes.func,
|
|
152
|
+
/** 搜尋後點擊的callback */
|
|
153
|
+
onSearch: PropTypes.func
|
|
154
|
+
};
|
|
155
|
+
|
|
156
|
+
export { KeywordSearch as K };
|
|
@@ -1 +1,22 @@
|
|
|
1
|
-
|
|
1
|
+
export { K as default } from './KeywordSearch-fec33a2c.js';
|
|
2
|
+
import './_rollupPluginBabelHelpers-a52356f6.js';
|
|
3
|
+
import 'react';
|
|
4
|
+
import 'prop-types';
|
|
5
|
+
import './index-b76a85f4.js';
|
|
6
|
+
import 'axios';
|
|
7
|
+
import './style-inject.es-1f59c1d0.js';
|
|
8
|
+
import './Autocomplete-3b418e5f.js';
|
|
9
|
+
import './debounce-127da66c.js';
|
|
10
|
+
import './isObjectLike-e111475d.js';
|
|
11
|
+
import './_commonjsHelpers-70de2c37.js';
|
|
12
|
+
import '@material-ui/lab';
|
|
13
|
+
import '@material-ui/core';
|
|
14
|
+
import '@material-ui/icons';
|
|
15
|
+
import './createSvgIcon-e3803ee1.js';
|
|
16
|
+
import './defaultTheme-ed7746fe.js';
|
|
17
|
+
import 'react-is';
|
|
18
|
+
import '@material-ui/styles';
|
|
19
|
+
import 'react-dom';
|
|
20
|
+
import './toConsumableArray-dbe8af76.js';
|
|
21
|
+
import './globalConfig';
|
|
22
|
+
import './Empty-c6a44967.js';
|
|
@@ -1 +1,224 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { a as _slicedToArray } from './_rollupPluginBabelHelpers-a52356f6.js';
|
|
2
|
+
import React__default, { useState, useRef, useEffect } from 'react';
|
|
3
|
+
import PropTypes from 'prop-types';
|
|
4
|
+
import { c as classNames } from './index-b76a85f4.js';
|
|
5
|
+
import { F as ForwardLink } from './ForwardLink-5fbd2705.js';
|
|
6
|
+
import { getIntl } from './globalConfig';
|
|
7
|
+
import { s as styleInject } from './style-inject.es-1f59c1d0.js';
|
|
8
|
+
import './index-b47819f3.js';
|
|
9
|
+
import 'react-router-dom';
|
|
10
|
+
import '@material-ui/core';
|
|
11
|
+
|
|
12
|
+
var css_248z = ".keywordTicker {\n width: 100%;\n display: flex;\n justify-content: flex-start;\n align-items: center;\n position: relative;\n}\n.keywordTicker__playToggle {\n flex-shrink: 0;\n order: -1;\n z-index: 3;\n margin-right: 8px;\n padding: 4px 10px;\n background: rgba(0, 0, 0, 0.75);\n color: #fff;\n border: 1px solid #fff;\n border-radius: 4px;\n font-size: 1rem;\n white-space: nowrap;\n cursor: pointer;\n}\n.keywordTicker__track {\n display: flex;\n width: 100%;\n padding: 20px 0px;\n background-color: #ece8c0;\n overflow: hidden;\n margin-left: -80px;\n padding-left: 100px;\n z-index: 1;\n position: relative;\n}\n.keywordTicker__items {\n display: flex;\n justify-content: flex-start;\n align-items: center;\n flex-wrap: nowrap;\n position: relative;\n}\n.keywordTicker-item {\n width: auto;\n display: flex;\n justify-content: center;\n align-items: center;\n white-space: nowrap;\n cursor: pointer;\n}\n.keywordTicker-text {\n font-size: 1.5rem;\n z-index: 2;\n font-weight: bold;\n color: #825c0d;\n border-left: 2px solid #fff;\n padding: 0px 40px;\n}\n.keywordTicker__img {\n z-index: 2;\n position: relative;\n display: flex;\n}\n.keywordTicker__img img {\n height: 100%;\n max-height: 195px;\n image-rendering: -webkit-optimize-contrast;\n position: relative;\n}\n.keywordTicker--fake {\n position: absolute;\n opacity: 0;\n width: 100%;\n}\n\n@media only screen and (max-width: 768px) {\n .keywordTicker-text {\n font-size: 1.5rem;\n padding: 0px 15px;\n }\n .keywordTicker__img img {\n max-height: 104px;\n left: -60px;\n }\n .keywordTicker__track {\n padding: 10px 0px;\n margin-left: -100px;\n }\n}\n@media only screen and (max-width: 484px) {\n .keywordTicker-text {\n font-size: 0.875rem;\n }\n}";
|
|
13
|
+
styleInject(css_248z);
|
|
14
|
+
|
|
15
|
+
var KeywordTicker = function KeywordTicker(_ref) {
|
|
16
|
+
var className = _ref.className,
|
|
17
|
+
tickerStyles = _ref.tickerStyles,
|
|
18
|
+
leftImg = _ref.leftImg,
|
|
19
|
+
tickerAttribute = _ref.tickerAttribute,
|
|
20
|
+
setTickerAttribute = _ref.setTickerAttribute,
|
|
21
|
+
_onClick = _ref.onClick;
|
|
22
|
+
var _useState = useState(null),
|
|
23
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
24
|
+
tracking = _useState2[0],
|
|
25
|
+
setTracking = _useState2[1];
|
|
26
|
+
/* WCAG 2.2.2 自動移動內容需提供暫停控制;並尊重「減少動態效果」偏好預設暫停(WCAG 2.3.3) */
|
|
27
|
+
var _useState3 = useState(typeof window !== 'undefined' && window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches),
|
|
28
|
+
_useState4 = _slicedToArray(_useState3, 2),
|
|
29
|
+
paused = _useState4[0],
|
|
30
|
+
setPaused = _useState4[1];
|
|
31
|
+
var _ref2 = tickerAttribute || {
|
|
32
|
+
result: [],
|
|
33
|
+
mounted: false,
|
|
34
|
+
strp: 0
|
|
35
|
+
},
|
|
36
|
+
result = _ref2.result,
|
|
37
|
+
mounted = _ref2.mounted,
|
|
38
|
+
step = _ref2.step;
|
|
39
|
+
var _ref3 = tickerStyles || {},
|
|
40
|
+
_ref3$fontColor = _ref3.fontColor,
|
|
41
|
+
fontColor = _ref3$fontColor === void 0 ? '#825c0d' : _ref3$fontColor,
|
|
42
|
+
_ref3$backgroundColor = _ref3.backgroundColor,
|
|
43
|
+
backgroundColor = _ref3$backgroundColor === void 0 ? '#ece8c0' : _ref3$backgroundColor,
|
|
44
|
+
_ref3$borderColor = _ref3.borderColor,
|
|
45
|
+
borderColor = _ref3$borderColor === void 0 ? '#fff' : _ref3$borderColor;
|
|
46
|
+
var track = useRef(null);
|
|
47
|
+
var words = useRef(null);
|
|
48
|
+
|
|
49
|
+
// 1.算出api長出UI的長度, 並計算需溢出次數
|
|
50
|
+
useEffect(function () {
|
|
51
|
+
// 第一次mount且參考的dom皆就緒
|
|
52
|
+
if (result && !mounted && track.current && words.current) {
|
|
53
|
+
// dom初始值
|
|
54
|
+
var _trackWidth$wordsWidt = {
|
|
55
|
+
trackWidth: track.current.offsetWidth || 0,
|
|
56
|
+
wordsWidth: words.current.offsetWidth || 0
|
|
57
|
+
},
|
|
58
|
+
trackWidth = _trackWidth$wordsWidt.trackWidth,
|
|
59
|
+
wordsWidth = _trackWidth$wordsWidt.wordsWidth;
|
|
60
|
+
var wordsNum = Math.ceil(trackWidth / wordsWidth) > 0 ? Math.ceil(trackWidth / wordsWidth) : 0;
|
|
61
|
+
var newResults = Array(wordsNum * 2).fill(null).map(function () {
|
|
62
|
+
return result;
|
|
63
|
+
}).flat();
|
|
64
|
+
setTickerAttribute({
|
|
65
|
+
result: newResults,
|
|
66
|
+
loading: false,
|
|
67
|
+
mounted: true,
|
|
68
|
+
step: wordsNum * wordsWidth
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
}, [result]);
|
|
72
|
+
|
|
73
|
+
// 2.取得溢出後的文字長度製作無限跑馬燈動畫 (跑馬燈動畫核心)
|
|
74
|
+
useEffect(function () {
|
|
75
|
+
if (mounted && window) {
|
|
76
|
+
// dom初始值
|
|
77
|
+
var _wordsWidth = {
|
|
78
|
+
wordsWidth: words.current.offsetWidth || 0
|
|
79
|
+
},
|
|
80
|
+
wordsWidth = _wordsWidth.wordsWidth;
|
|
81
|
+
|
|
82
|
+
// 不同螢幕寬度時取得不同播放速度
|
|
83
|
+
var responsiveSpeed = function responsiveSpeed(width) {
|
|
84
|
+
if (width) {
|
|
85
|
+
if (width < 767) return 0.06 * 0.6;
|
|
86
|
+
if (width < 480) return 0.06 * 0.55;
|
|
87
|
+
return 0.06;
|
|
88
|
+
}
|
|
89
|
+
return 0.06;
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
// 起始點為0
|
|
93
|
+
var startLine = 0;
|
|
94
|
+
|
|
95
|
+
// animation config
|
|
96
|
+
var _buffer$speed = {
|
|
97
|
+
buffer: startLine,
|
|
98
|
+
// 左側跑馬燈進入buffer
|
|
99
|
+
speed: responsiveSpeed(window.innerWidth) || 0.06 // 速度
|
|
100
|
+
},
|
|
101
|
+
speed = _buffer$speed.speed;
|
|
102
|
+
var _start$end = {
|
|
103
|
+
start: startLine,
|
|
104
|
+
end: wordsWidth - step
|
|
105
|
+
},
|
|
106
|
+
start = _start$end.start,
|
|
107
|
+
end = _start$end.end;
|
|
108
|
+
|
|
109
|
+
// 固定移動速度並計算動畫時間
|
|
110
|
+
var distance = startLine + wordsWidth - step; // 減掉單次畫面溢出的長度
|
|
111
|
+
var duration = distance / speed;
|
|
112
|
+
var initTracking = words.current.animate(
|
|
113
|
+
// keyframes
|
|
114
|
+
[{
|
|
115
|
+
left: "".concat(start, "px")
|
|
116
|
+
}, {
|
|
117
|
+
left: "-".concat(end, "px")
|
|
118
|
+
}],
|
|
119
|
+
// timing options
|
|
120
|
+
{
|
|
121
|
+
duration: duration,
|
|
122
|
+
iterations: Infinity
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
// 初始化並將狀態傳出
|
|
126
|
+
setTracking(initTracking);
|
|
127
|
+
}
|
|
128
|
+
}, [mounted, step]);
|
|
129
|
+
|
|
130
|
+
/* 暫停狀態同步到動畫(含 prefers-reduced-motion 預設暫停) */
|
|
131
|
+
useEffect(function () {
|
|
132
|
+
if (!tracking) return;
|
|
133
|
+
if (paused) tracking.pause();else tracking.play();
|
|
134
|
+
}, [tracking, paused]);
|
|
135
|
+
|
|
136
|
+
/* WCAG 2.1.1/2.4.7 跑馬燈連結為無限輪播重複複製且持續移動,鍵盤逐一 Tab 體驗惡劣:
|
|
137
|
+
本體標記 aria-hidden 並將內部連結移出 Tab 順序(消費端另以等效清單提供鍵盤操作)。
|
|
138
|
+
跑馬燈重渲染後需重設。 */
|
|
139
|
+
useEffect(function () {
|
|
140
|
+
if (track.current) {
|
|
141
|
+
track.current.querySelectorAll('a').forEach(function (a) {
|
|
142
|
+
return a.setAttribute('tabindex', '-1');
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
}, [result]);
|
|
146
|
+
return /*#__PURE__*/React__default.createElement("div", {
|
|
147
|
+
className: classNames('keywordTicker', className)
|
|
148
|
+
}, /*#__PURE__*/React__default.createElement("button", {
|
|
149
|
+
type: "button",
|
|
150
|
+
className: "keywordTicker__playToggle",
|
|
151
|
+
"aria-pressed": paused,
|
|
152
|
+
onClick: function onClick() {
|
|
153
|
+
return setPaused(!paused);
|
|
154
|
+
}
|
|
155
|
+
}, getIntl().formatMessage({
|
|
156
|
+
id: paused ? 'aria.ticker.play' : 'aria.ticker.pause'
|
|
157
|
+
})), leftImg && /*#__PURE__*/React__default.createElement("div", {
|
|
158
|
+
className: "keywordTicker__img"
|
|
159
|
+
}, /*#__PURE__*/React__default.createElement("img", {
|
|
160
|
+
src: leftImg,
|
|
161
|
+
alt: "",
|
|
162
|
+
"aria-hidden": "true"
|
|
163
|
+
})), /*#__PURE__*/React__default.createElement("div", {
|
|
164
|
+
className: "keywordTicker__track",
|
|
165
|
+
ref: track,
|
|
166
|
+
style: {
|
|
167
|
+
backgroundColor: backgroundColor
|
|
168
|
+
},
|
|
169
|
+
"aria-hidden": "true",
|
|
170
|
+
onMouseEnter: function onMouseEnter() {
|
|
171
|
+
return tracking === null || tracking === void 0 ? void 0 : tracking.pause();
|
|
172
|
+
},
|
|
173
|
+
onMouseLeave: function onMouseLeave() {
|
|
174
|
+
if (!paused && tracking) tracking.play();
|
|
175
|
+
}
|
|
176
|
+
}, /*#__PURE__*/React__default.createElement("div", {
|
|
177
|
+
className: "keywordTicker__items",
|
|
178
|
+
ref: words
|
|
179
|
+
}, (result || []).map(function (_ref4, index) {
|
|
180
|
+
var keyword = _ref4.keyword;
|
|
181
|
+
return /*#__PURE__*/React__default.createElement(ForwardLink, {
|
|
182
|
+
key: index.toString(),
|
|
183
|
+
className: "keywordTicker-item",
|
|
184
|
+
pathname: "/knowledge/keyword",
|
|
185
|
+
search: {
|
|
186
|
+
keyword: keyword
|
|
187
|
+
},
|
|
188
|
+
disabled: _onClick
|
|
189
|
+
}, /*#__PURE__*/React__default.createElement("div", {
|
|
190
|
+
className: "keywordTicker-text",
|
|
191
|
+
style: {
|
|
192
|
+
color: fontColor,
|
|
193
|
+
borderColor: borderColor
|
|
194
|
+
},
|
|
195
|
+
onClick: function onClick() {
|
|
196
|
+
return _onClick === null || _onClick === void 0 ? void 0 : _onClick(keyword);
|
|
197
|
+
}
|
|
198
|
+
}, keyword));
|
|
199
|
+
}))));
|
|
200
|
+
};
|
|
201
|
+
KeywordTicker.defaultProps = {
|
|
202
|
+
className: undefined,
|
|
203
|
+
leftImg: undefined,
|
|
204
|
+
tickerStyles: undefined,
|
|
205
|
+
tickerAttribute: undefined,
|
|
206
|
+
setTickerAttribute: function setTickerAttribute() {},
|
|
207
|
+
onClick: undefined
|
|
208
|
+
};
|
|
209
|
+
KeywordTicker.propTypes = {
|
|
210
|
+
/** Css Name */
|
|
211
|
+
className: PropTypes.string,
|
|
212
|
+
/** Custom image by each project */
|
|
213
|
+
leftImg: PropTypes.string,
|
|
214
|
+
/** Items Color */
|
|
215
|
+
tickerStyles: PropTypes.objectOf(PropTypes.any),
|
|
216
|
+
/** Attribute of result, loading, mounted, step */
|
|
217
|
+
tickerAttribute: PropTypes.objectOf(PropTypes.any),
|
|
218
|
+
/** Set Attribute */
|
|
219
|
+
setTickerAttribute: PropTypes.func,
|
|
220
|
+
/** Click callback */
|
|
221
|
+
onClick: PropTypes.func
|
|
222
|
+
};
|
|
223
|
+
|
|
224
|
+
export { KeywordTicker as default };
|