@daoyi/nmtl-ui 2.0.1-beta.91 → 2.0.1-beta.92

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 (50) hide show
  1. package/lib/components/{Autocomplete-887cda6a.js → Autocomplete-5d6f1df8.js} +44 -11
  2. package/lib/components/Autocomplete.js +5 -4
  3. package/lib/components/Avatar.js +1 -1
  4. package/lib/components/BackTop.js +2 -2
  5. package/lib/components/BarChart.js +1 -1
  6. package/lib/components/Breadcrumbs.js +1 -1
  7. package/lib/components/{Button-8742afeb.js → Button-305b69a0.js} +1 -1
  8. package/lib/components/Button.js +2 -2
  9. package/lib/components/Carousel.js +1 -1
  10. package/lib/components/CollapseContent.js +2 -2
  11. package/lib/components/{ContactModal-530d4d80.js → ContactModal-1997d146.js} +92 -20
  12. package/lib/components/ContactModal.js +9 -9
  13. package/lib/components/{Drawer-96442344.js → Drawer-b9855a54.js} +9 -2
  14. package/lib/components/Drawer.js +5 -4
  15. package/lib/components/Dropdown.js +1 -1
  16. package/lib/components/{Empty-94a8d8ff.js → Empty-bf77164f.js} +1 -1
  17. package/lib/components/Empty.js +2 -2
  18. package/lib/components/ExportButton.js +1 -1
  19. package/lib/components/{ExtraTools-bfb076ca.js → ExtraTools-5954ee3a.js} +72 -14
  20. package/lib/components/ExtraTools.js +3 -3
  21. package/lib/components/Filter.js +2 -2
  22. package/lib/components/Footer.js +9 -9
  23. package/lib/components/{ForwardLink-059be72d.js → ForwardLink-aa950a50.js} +12 -3
  24. package/lib/components/ForwardLink.js +3 -2
  25. package/lib/components/Header.js +24 -8
  26. package/lib/components/Image.js +1 -1
  27. package/lib/components/Input.js +1 -1
  28. package/lib/components/InputMethod.js +1 -1
  29. package/lib/components/{KeywordSearch-c3acab41.js → KeywordSearch-33341dd3.js} +2 -2
  30. package/lib/components/KeywordSearch.js +6 -5
  31. package/lib/components/KeywordTicker.js +4 -3
  32. package/lib/components/Keywords.js +6 -5
  33. package/lib/components/Loading.js +1 -1
  34. package/lib/components/{Modal-fc4320d3.js → Modal-5a27951f.js} +12 -4
  35. package/lib/components/Modal.js +5 -4
  36. package/lib/components/{MoreButton-d7c9f3b8.js → MoreButton-44d3b4fe.js} +1 -1
  37. package/lib/components/MoreButton.js +2 -2
  38. package/lib/components/Pagination.js +2 -2
  39. package/lib/components/SNA.js +3 -3
  40. package/lib/components/{Select-fdb4d9b8.js → Select-e550d0a5.js} +23 -6
  41. package/lib/components/Select.js +3 -3
  42. package/lib/components/{Spin-fafe3787.js → Spin-8dc60bfe.js} +1 -1
  43. package/lib/components/Spin.js +2 -2
  44. package/lib/components/{Tooltip-e67a18bc.js → Tooltip-6ebfa9c1.js} +1 -1
  45. package/lib/components/Tooltip.js +2 -2
  46. package/lib/components/globalConfig.js +27 -3
  47. package/package.json +1 -1
  48. /package/lib/components/{createSvgIcon-0d38de2e.js → createSvgIcon-e3803ee1.js} +0 -0
  49. /package/lib/components/{index-0be0afec.js → index-b47819f3.js} +0 -0
  50. /package/lib/components/{index-ef96775f.js → index-b76a85f4.js} +0 -0
@@ -1,18 +1,19 @@
1
1
  import { _ as _extends$1, a as _slicedToArray, b as _objectSpread2 } from './_rollupPluginBabelHelpers-a52356f6.js';
2
2
  import React__default, { useCallback, useState, useRef, useEffect } from 'react';
3
3
  import PropTypes from 'prop-types';
4
- import { c as classNames } from './index-ef96775f.js';
4
+ import { c as classNames } from './index-b76a85f4.js';
5
5
  import { d as debounce_1 } from './debounce-127da66c.js';
6
6
  import { Autocomplete as Autocomplete$1 } from '@material-ui/lab';
7
7
  import { Chip, TextField, CircularProgress } from '@material-ui/core';
8
8
  import { Close, SearchOutlined } from '@material-ui/icons';
9
- import { r as requireCreateSvgIcon, i as interopRequireDefault, a as interopRequireWildcard } from './createSvgIcon-0d38de2e.js';
9
+ import { r as requireCreateSvgIcon, i as interopRequireDefault, a as interopRequireWildcard } from './createSvgIcon-e3803ee1.js';
10
10
  import { _ as _extends, m as merge, d as defaultTheme, c as compose, b as borders, a as display, f as flexbox, g as grid, p as positions, e as palette, h as boxShadow, s as sizing, i as spacing, t as typography } from './defaultTheme-ed7746fe.js';
11
11
  import 'react-is';
12
12
  import { _ as _toConsumableArray } from './toConsumableArray-dbe8af76.js';
13
13
  import { styled as styled$1 } from '@material-ui/styles';
14
+ import { getIntl } from './globalConfig';
14
15
  import { s as styleInject } from './style-inject.es-1f59c1d0.js';
15
- import { E as Empty } from './Empty-94a8d8ff.js';
16
+ import { E as Empty } from './Empty-bf77164f.js';
16
17
 
17
18
  var ArrowDropDown = {};
18
19
 
@@ -97,7 +98,8 @@ var useAutocomplete = (_ref => {
97
98
  onEnter,
98
99
  currentResult,
99
100
  setCurrentDefaultValue,
100
- arrowIcon
101
+ arrowIcon,
102
+ ariaLabel
101
103
  } = _ref;
102
104
  const getValue = useCallback(data => typeof data === 'object' ? data.value : data, []);
103
105
  const getLabel = useCallback(value => {
@@ -156,7 +158,13 @@ var useAutocomplete = (_ref => {
156
158
  }, getTagProps({
157
159
  index
158
160
  })))), [options]);
159
- const defaultRenderInput = useCallback(params => /*#__PURE__*/React__default.createElement(TextField, _extends$1({}, params, {
161
+ const defaultRenderInput = useCallback(params => /*#__PURE__*/React__default.createElement(TextField
162
+ // WCAG 3.3.2 輸入框需有可及名稱(placeholder 不是 label),未提供 ariaLabel 時以 placeholder 代替
163
+ , _extends$1({}, params, {
164
+ inputProps: {
165
+ ...params.inputProps,
166
+ 'aria-label': ariaLabel || placeholder
167
+ },
160
168
  variant: "outlined",
161
169
  placeholder: placeholder,
162
170
  InputProps: {
@@ -165,8 +173,16 @@ var useAutocomplete = (_ref => {
165
173
  className: "autocomplete__icon",
166
174
  color: "inherit",
167
175
  size: 20
168
- }), searchIcon && /*#__PURE__*/React__default.createElement(SearchOutlined, {
176
+ }), searchIcon &&
177
+ /*#__PURE__*/
178
+ // WCAG 2.1.1 / 4.1.2 搜尋圖示為可點擊元素,需可鍵盤操作並有名稱
179
+ React__default.createElement(SearchOutlined, {
169
180
  className: "autocomplete__icon",
181
+ role: "button",
182
+ tabIndex: 0,
183
+ "aria-label": getIntl().formatMessage({
184
+ id: 'aria.autocomplete.search'
185
+ }),
170
186
  onClick: event => {
171
187
  const tmpObj = {
172
188
  labels: currentResult || '',
@@ -174,6 +190,17 @@ var useAutocomplete = (_ref => {
174
190
  };
175
191
  setCurrentDefaultValue(tmpObj);
176
192
  return onEnter(event, tmpObj);
193
+ },
194
+ onKeyDown: event => {
195
+ if (event.key === 'Enter' || event.key === ' ') {
196
+ event.preventDefault();
197
+ const tmpObj = {
198
+ labels: currentResult || '',
199
+ value: currentResult || ''
200
+ };
201
+ setCurrentDefaultValue(tmpObj);
202
+ onEnter(event, tmpObj);
203
+ }
177
204
  }
178
205
  }), !searchIcon && !loading && arrowIcon && /*#__PURE__*/React__default.createElement(Box, {
179
206
  style: {
@@ -183,7 +210,7 @@ var useAutocomplete = (_ref => {
183
210
  }
184
211
  }, /*#__PURE__*/React__default.createElement(default_1, null)), params.InputProps.endAdornment)
185
212
  }
186
- })), [loading, searchIcon, arrowIcon]);
213
+ })), [loading, searchIcon, arrowIcon, ariaLabel, placeholder]);
187
214
  return {
188
215
  getValue,
189
216
  getValueFromOptions,
@@ -210,7 +237,8 @@ var Autocomplete = function Autocomplete(props) {
210
237
  placeholder = props.placeholder,
211
238
  searchIcon = props.searchIcon,
212
239
  _renderInput = props.renderInput,
213
- _renderTags = props.renderTags;
240
+ _renderTags = props.renderTags,
241
+ ariaLabel = props.ariaLabel;
214
242
  var _onChange = props.onChange,
215
243
  onSearch = props.onSearch,
216
244
  onFocus = props.onFocus,
@@ -237,7 +265,7 @@ var Autocomplete = function Autocomplete(props) {
237
265
  _useState10 = _slicedToArray(_useState9, 2),
238
266
  currentDefaultValue = _useState10[0],
239
267
  setCurrentDefaultValue = _useState10[1];
240
- var _useAutocomplete = useAutocomplete(_objectSpread2({}, {
268
+ var _useAutocomplete = useAutocomplete(_objectSpread2(_objectSpread2({}, {
241
269
  options: options,
242
270
  placeholder: placeholder,
243
271
  loading: loading,
@@ -247,6 +275,8 @@ var Autocomplete = function Autocomplete(props) {
247
275
  onEnter: onEnter,
248
276
  setCurrentDefaultValue: setCurrentDefaultValue,
249
277
  arrowIcon: arrowIcon
278
+ }), {}, {
279
+ ariaLabel: ariaLabel
250
280
  })),
251
281
  getValue = _useAutocomplete.getValue,
252
282
  getValueFromOptions = _useAutocomplete.getValueFromOptions,
@@ -384,7 +414,8 @@ Autocomplete.defaultProps = {
384
414
  onFocus: function onFocus() {},
385
415
  onBlur: function onBlur() {},
386
416
  onEnter: function onEnter() {},
387
- arrowIcon: false
417
+ arrowIcon: false,
418
+ ariaLabel: undefined
388
419
  };
389
420
  Autocomplete.propTypes = {
390
421
  /** Css名稱 */
@@ -426,7 +457,9 @@ Autocomplete.propTypes = {
426
457
  /** 鍵盤輸入Enter的callback */
427
458
  onEnter: PropTypes.func,
428
459
  /** 是否顯示arrow icon */
429
- arrowIcon: PropTypes.bool
460
+ arrowIcon: PropTypes.bool,
461
+ /** 輸入框的無障礙名稱(WCAG 3.3.2),未提供時以placeholder代替 */
462
+ ariaLabel: PropTypes.string
430
463
  };
431
464
 
432
465
  export { Autocomplete as A };
@@ -1,19 +1,20 @@
1
- export { A as default } from './Autocomplete-887cda6a.js';
1
+ export { A as default } from './Autocomplete-5d6f1df8.js';
2
2
  import './_rollupPluginBabelHelpers-a52356f6.js';
3
3
  import 'react';
4
4
  import 'prop-types';
5
- import './index-ef96775f.js';
5
+ import './index-b76a85f4.js';
6
6
  import './debounce-127da66c.js';
7
7
  import './isObjectLike-e111475d.js';
8
8
  import './_commonjsHelpers-70de2c37.js';
9
9
  import '@material-ui/lab';
10
10
  import '@material-ui/core';
11
11
  import '@material-ui/icons';
12
- import './createSvgIcon-0d38de2e.js';
12
+ import './createSvgIcon-e3803ee1.js';
13
13
  import './defaultTheme-ed7746fe.js';
14
14
  import 'react-is';
15
15
  import '@material-ui/styles';
16
16
  import 'react-dom';
17
17
  import './toConsumableArray-dbe8af76.js';
18
+ import './globalConfig';
18
19
  import './style-inject.es-1f59c1d0.js';
19
- import './Empty-94a8d8ff.js';
20
+ import './Empty-bf77164f.js';
@@ -1,5 +1,5 @@
1
1
  import React__default from 'react';
2
- import { c as classNames } from './index-ef96775f.js';
2
+ import { c as classNames } from './index-b76a85f4.js';
3
3
  import PropTypes from 'prop-types';
4
4
  import { Avatar as Avatar$1 } from '@material-ui/core';
5
5
  import { s as styleInject } from './style-inject.es-1f59c1d0.js';
@@ -1,10 +1,10 @@
1
1
  import { a as _slicedToArray } from './_rollupPluginBabelHelpers-a52356f6.js';
2
2
  import React__default, { useState, useRef, useEffect } from 'react';
3
3
  import PropTypes from 'prop-types';
4
- import { c as classNames } from './index-ef96775f.js';
4
+ import { c as classNames } from './index-b76a85f4.js';
5
5
  import { d as debounce_1 } from './debounce-127da66c.js';
6
6
  import { Fade, NoSsr, Box } from '@material-ui/core';
7
- import { r as requireCreateSvgIcon, i as interopRequireDefault, a as interopRequireWildcard } from './createSvgIcon-0d38de2e.js';
7
+ import { r as requireCreateSvgIcon, i as interopRequireDefault, a as interopRequireWildcard } from './createSvgIcon-e3803ee1.js';
8
8
  import { s as styleInject } from './style-inject.es-1f59c1d0.js';
9
9
  import './isObjectLike-e111475d.js';
10
10
  import './_commonjsHelpers-70de2c37.js';
@@ -1,5 +1,5 @@
1
1
  import React__default, { useEffect } from 'react';
2
- import { c as classNames } from './index-ef96775f.js';
2
+ import { c as classNames } from './index-b76a85f4.js';
3
3
  import PropTypes from 'prop-types';
4
4
  import { g as constant$1, h as interpolateNumber, j as color, k as interpolateRgb, l as interpolateString, n as exponent, o as ordinal, p as initRange, r as map, s as slice$1, u as bisectRight, v as formatSpecifier, w as formatPrefix, x as format, d as d3Select } from './transform-3a04288b.js';
5
5
  import { s as styleInject } from './style-inject.es-1f59c1d0.js';
@@ -1,5 +1,5 @@
1
1
  import React__default from 'react';
2
- import { c as classNames } from './index-ef96775f.js';
2
+ import { c as classNames } from './index-b76a85f4.js';
3
3
  import PropTypes from 'prop-types';
4
4
  import { NavLink } from 'react-router-dom';
5
5
  import { Typography, Breadcrumbs as Breadcrumbs$1 } from '@material-ui/core';
@@ -1,6 +1,6 @@
1
1
  import React__default from 'react';
2
2
  import PropTypes from 'prop-types';
3
- import { c as classNames } from './index-ef96775f.js';
3
+ import { c as classNames } from './index-b76a85f4.js';
4
4
  import { Button as Button$1, CircularProgress } from '@material-ui/core';
5
5
  import { s as styleInject } from './style-inject.es-1f59c1d0.js';
6
6
 
@@ -1,6 +1,6 @@
1
- export { B as default } from './Button-8742afeb.js';
1
+ export { B as default } from './Button-305b69a0.js';
2
2
  import 'react';
3
3
  import 'prop-types';
4
- import './index-ef96775f.js';
4
+ import './index-b76a85f4.js';
5
5
  import '@material-ui/core';
6
6
  import './style-inject.es-1f59c1d0.js';
@@ -1,6 +1,6 @@
1
1
  import { c as _objectWithoutProperties$1, b as _objectSpread2, _ as _extends$3 } from './_rollupPluginBabelHelpers-a52356f6.js';
2
2
  import React__default, { forwardRef, useRef, useImperativeHandle } from 'react';
3
- import { a as classnames, c as classNames } from './index-ef96775f.js';
3
+ import { a as classnames, c as classNames } from './index-b76a85f4.js';
4
4
  import PropTypes from 'prop-types';
5
5
  import { c as commonjsGlobal, g as getAugmentedNamespace, a as getDefaultExportFromCjs } from './_commonjsHelpers-70de2c37.js';
6
6
  import { s as styleInject } from './style-inject.es-1f59c1d0.js';
@@ -1,9 +1,9 @@
1
1
  import { a as _slicedToArray } from './_rollupPluginBabelHelpers-a52356f6.js';
2
2
  import React__default, { useState, useRef, useEffect } from 'react';
3
- import { c as classNames } from './index-ef96775f.js';
3
+ import { c as classNames } from './index-b76a85f4.js';
4
4
  import PropTypes from 'prop-types';
5
5
  import { Typography } from '@material-ui/core';
6
- import { M as MoreButton } from './MoreButton-d7c9f3b8.js';
6
+ import { M as MoreButton } from './MoreButton-44d3b4fe.js';
7
7
  import { s as styleInject } from './style-inject.es-1f59c1d0.js';
8
8
  import '@material-ui/icons';
9
9
 
@@ -3,14 +3,14 @@ import React__default, { createContext, forwardRef, createElement, useContext, u
3
3
  import PropTypes from 'prop-types';
4
4
  import { h as hoistNonReactStatics_cjs } from './hoist-non-react-statics.cjs-3f408ad2.js';
5
5
  import axios from 'axios';
6
- import { M as Modal } from './Modal-fc4320d3.js';
6
+ import { M as Modal } from './Modal-5a27951f.js';
7
7
  import { c as commonjsGlobal, a as getDefaultExportFromCjs } from './_commonjsHelpers-70de2c37.js';
8
- import { c as classNames } from './index-ef96775f.js';
8
+ import { c as classNames } from './index-b76a85f4.js';
9
9
  import { Input, Button, Box, Typography, FormControl, RadioGroup, FormControlLabel, Radio, TextField, TextareaAutosize } from '@material-ui/core';
10
- import { S as Select } from './Select-fdb4d9b8.js';
11
- import { s as styleInject } from './style-inject.es-1f59c1d0.js';
12
- import { r as requireCreateSvgIcon, i as interopRequireDefault, a as interopRequireWildcard } from './createSvgIcon-0d38de2e.js';
10
+ import { S as Select } from './Select-e550d0a5.js';
13
11
  import { getIntl } from './globalConfig';
12
+ import { s as styleInject } from './style-inject.es-1f59c1d0.js';
13
+ import { r as requireCreateSvgIcon, i as interopRequireDefault, a as interopRequireWildcard } from './createSvgIcon-e3803ee1.js';
14
14
 
15
15
  var isArray$1 = Array.isArray;
16
16
  var keyList = Object.keys;
@@ -10000,7 +10000,9 @@ const VCode = _ref => {
10000
10000
  visible,
10001
10001
  onChange,
10002
10002
  formatMessage,
10003
- name
10003
+ name,
10004
+ inputId,
10005
+ required
10004
10006
  } = _ref;
10005
10007
  const [codeConfig, setCodeConfig] = useState(getConfig());
10006
10008
  const {
@@ -10020,6 +10022,10 @@ const VCode = _ref => {
10020
10022
  return /*#__PURE__*/React__default.createElement("div", {
10021
10023
  className: "vcode"
10022
10024
  }, /*#__PURE__*/React__default.createElement(Input, {
10025
+ inputProps: {
10026
+ id: inputId,
10027
+ 'aria-required': required || undefined
10028
+ },
10023
10029
  placeholder: formatMessage({
10024
10030
  id: 'common.form.code.check'
10025
10031
  }),
@@ -10027,14 +10033,20 @@ const VCode = _ref => {
10027
10033
  }), /*#__PURE__*/React__default.createElement("div", {
10028
10034
  className: "vcode__box"
10029
10035
  }, /*#__PURE__*/React__default.createElement("div", {
10030
- className: "vcode__image"
10036
+ className: "vcode__image",
10037
+ role: "img",
10038
+ "aria-label": getIntl().formatMessage({
10039
+ id: 'aria.vcode.image'
10040
+ })
10031
10041
  }, /*#__PURE__*/React__default.createElement("canvas", {
10032
10042
  id: "bgi",
10033
10043
  width: "200",
10034
- height: "200"
10044
+ height: "200",
10045
+ "aria-hidden": "true"
10035
10046
  }), data.map((v, i) => /*#__PURE__*/React__default.createElement("div", {
10036
10047
  key: i.toString(),
10037
10048
  className: "vcode__image__itemStr",
10049
+ "aria-hidden": "true",
10038
10050
  style: {
10039
10051
  transform: `rotate(${rotate[i]}deg)`,
10040
10052
  fontSize: `${fz[i]}px`,
@@ -10042,7 +10054,18 @@ const VCode = _ref => {
10042
10054
  }
10043
10055
  }, convert(v))), /*#__PURE__*/React__default.createElement("div", {
10044
10056
  className: "vcode__image__mask",
10045
- onClick: refresh
10057
+ role: "button",
10058
+ tabIndex: 0,
10059
+ "aria-label": getIntl().formatMessage({
10060
+ id: 'aria.vcode.refresh'
10061
+ }),
10062
+ onClick: refresh,
10063
+ onKeyDown: e => {
10064
+ if (e.key === 'Enter' || e.key === ' ') {
10065
+ e.preventDefault();
10066
+ refresh();
10067
+ }
10068
+ }
10046
10069
  }, formatMessage({
10047
10070
  id: 'common.click.refresh'
10048
10071
  }))), /*#__PURE__*/React__default.createElement(ErrorMessage, {
@@ -10056,14 +10079,20 @@ VCode.defaultProps = {
10056
10079
  // placeholder: undefined,
10057
10080
  onChange: () => {},
10058
10081
  formatMessage: () => {},
10059
- name: undefined
10082
+ name: undefined,
10083
+ inputId: undefined,
10084
+ required: false
10060
10085
  };
10061
10086
  VCode.propTypes = {
10062
10087
  visible: PropTypes.bool,
10063
10088
  // placeholder: PropTypes.string,
10064
10089
  onChange: PropTypes.func,
10065
10090
  formatMessage: PropTypes.func,
10066
- name: PropTypes.string
10091
+ name: PropTypes.string,
10092
+ /** 與外部 label 關聯用的 input id(WCAG 3.3.2) */
10093
+ inputId: PropTypes.string,
10094
+ /** 是否必填(aria-required) */
10095
+ required: PropTypes.bool
10067
10096
  };
10068
10097
 
10069
10098
  var facebookLoginWithButton = {exports: {}};
@@ -10090,7 +10119,9 @@ const EmailInput = _ref => {
10090
10119
  value,
10091
10120
  placeholder,
10092
10121
  onChange,
10093
- onNotify
10122
+ onNotify,
10123
+ inputId,
10124
+ required
10094
10125
  } = _ref;
10095
10126
  const [init, setInit] = useState(false); // google login 在init時會先failed
10096
10127
  useMemo(() => () => setTimeout(() => setInit(true), 1000), []); // 故延遲一秒後再給google call(最非最佳解 可優化)
@@ -10139,6 +10170,10 @@ const EmailInput = _ref => {
10139
10170
  className: "emailInput__operator"
10140
10171
  }, /*#__PURE__*/React__default.createElement(Input, {
10141
10172
  value: value,
10173
+ inputProps: {
10174
+ id: inputId,
10175
+ 'aria-required': required || undefined
10176
+ },
10142
10177
  placeholder: placeholder,
10143
10178
  onChange: e => onChange(e.target.value)
10144
10179
  })));
@@ -10147,13 +10182,19 @@ EmailInput.defaultProps = {
10147
10182
  value: undefined,
10148
10183
  placeholder: undefined,
10149
10184
  onChange: () => {},
10150
- onNotify: () => {}
10185
+ onNotify: () => {},
10186
+ inputId: undefined,
10187
+ required: false
10151
10188
  };
10152
10189
  EmailInput.propTypes = {
10153
10190
  value: PropTypes.string,
10154
10191
  placeholder: PropTypes.string,
10155
10192
  onChange: PropTypes.func,
10156
- onNotify: PropTypes.func
10193
+ onNotify: PropTypes.func,
10194
+ /** 與外部 label 關聯用的 input id(WCAG 3.3.2) */
10195
+ inputId: PropTypes.string,
10196
+ /** 是否必填(aria-required) */
10197
+ required: PropTypes.bool
10157
10198
  };
10158
10199
 
10159
10200
  var CloudUpload = {};
@@ -11538,7 +11579,7 @@ Upload.propTypes = {
11538
11579
  onChange: PropTypes.func.isRequired
11539
11580
  };
11540
11581
 
11541
- var css_248z = ".formItem {\n width: 100%;\n margin-bottom: 16px;\n}\n.formItem:last-child {\n margin-bottom: initial;\n}\n.formItem__title {\n display: flex;\n font-size: 16px;\n font-weight: bold;\n}\n.formItem__title__star {\n margin-left: 3px;\n color: #d93333;\n}\n.formItem__operator {\n margin: 2px 0;\n font-size: 14px;\n}\n.formItem__operator__radio__desc {\n margin-left: 35px !important;\n}\n.formItem__operator--unsupport {\n border: 1px solid #d93333;\n background: pink;\n color: black;\n padding: 5px 10px;\n}\n.formItem__error {\n color: #d93333;\n font-weight: bold;\n}\n.formItem textarea {\n border: 1px solid #d9d9d9;\n border-radius: 3px;\n width: 100%;\n background: transparent;\n padding: 6px 10px;\n}\n.formItem ::-webkit-calendar-picker-indicator {\n filter: invert(1);\n}";
11582
+ var css_248z = ".formItem {\n width: 100%;\n margin-bottom: 16px;\n}\n.formItem:last-child {\n margin-bottom: initial;\n}\n.formItem__title {\n display: flex;\n font-size: 16px;\n font-weight: bold;\n}\n.formItem__title__star {\n margin-left: 3px;\n color: #b91c1c;\n}\n.formItem__operator {\n margin: 2px 0;\n font-size: 14px;\n}\n.formItem__operator__radio__desc {\n margin-left: 35px !important;\n}\n.formItem__operator--unsupport {\n border: 1px solid #d93333;\n background: pink;\n color: black;\n padding: 5px 10px;\n}\n.formItem__error {\n color: #b91c1c;\n font-weight: bold;\n}\n.formItem textarea {\n border: 1px solid #d9d9d9;\n border-radius: 3px;\n width: 100%;\n background: transparent;\n padding: 6px 10px;\n}\n.formItem ::-webkit-calendar-picker-indicator {\n filter: invert(1);\n}";
11542
11583
  styleInject(css_248z);
11543
11584
 
11544
11585
  const FormItem = _ref => {
@@ -11558,22 +11599,35 @@ const FormItem = _ref => {
11558
11599
  const currentPlaceholder = placeholder || `${formatMessage({
11559
11600
  id: 'common.enter'
11560
11601
  })} ${label}`;
11602
+ /* WCAG 1.3.1/3.3.2 欄位與標題的程式化關聯(WAVE: Missing form label) */
11603
+ const inputId = `form-input-${name}`;
11604
+ const labelId = `form-label-${name}`;
11605
+ const a11yInputProps = {
11606
+ id: inputId,
11607
+ 'aria-required': required || undefined
11608
+ };
11609
+ /* 這些欄位型別會渲染帶 inputId 的 input,標題才能用 label htmlFor;其餘型別改以 aria-labelledby 關聯 */
11610
+ const hasInputId = ['input', 'textarea', 'datePicker', 'email', 'vcode'].includes(type);
11561
11611
  const render = field => {
11562
11612
  let component;
11563
11613
  switch (type) {
11564
11614
  case 'input':
11565
11615
  component = /*#__PURE__*/React__default.createElement(Input, _extends$1({}, field, {
11616
+ inputProps: a11yInputProps,
11566
11617
  placeholder: currentPlaceholder
11567
11618
  }));
11568
11619
  break;
11569
11620
  case 'textarea':
11570
11621
  component = /*#__PURE__*/React__default.createElement(TextareaAutosize, _extends$1({}, field, {
11622
+ id: inputId,
11623
+ "aria-required": required || undefined,
11571
11624
  minRows: 3,
11572
11625
  placeholder: currentPlaceholder
11573
11626
  }));
11574
11627
  break;
11575
11628
  case 'select':
11576
11629
  component = /*#__PURE__*/React__default.createElement(Select, _extends$1({}, field, {
11630
+ ariaLabelledby: labelId,
11577
11631
  options: options,
11578
11632
  placeholder: currentPlaceholder,
11579
11633
  onChange: age => setFieldValue(field.name, age)
@@ -11581,12 +11635,15 @@ const FormItem = _ref => {
11581
11635
  break;
11582
11636
  case 'datePicker':
11583
11637
  component = /*#__PURE__*/React__default.createElement(TextField, _extends$1({}, field, {
11638
+ inputProps: a11yInputProps,
11584
11639
  type: "date",
11585
11640
  onChange: event => setFieldValue(field.name, event.target.value)
11586
11641
  }));
11587
11642
  break;
11588
11643
  case 'email':
11589
11644
  component = /*#__PURE__*/React__default.createElement(EmailInput, _extends$1({}, field, {
11645
+ inputId: inputId,
11646
+ required: required,
11590
11647
  placeholder: currentPlaceholder,
11591
11648
  onChange: email => setFieldValue(field.name, email),
11592
11649
  onNotify: onNotify
@@ -11594,7 +11651,8 @@ const FormItem = _ref => {
11594
11651
  break;
11595
11652
  case 'radio':
11596
11653
  component = /*#__PURE__*/React__default.createElement(FormControl, {
11597
- component: "fieldset"
11654
+ component: "fieldset",
11655
+ "aria-labelledby": labelId
11598
11656
  }, /*#__PURE__*/React__default.createElement(RadioGroup, field, options.map(option => /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement(FormControlLabel, {
11599
11657
  key: option.value,
11600
11658
  value: option.value,
@@ -11612,6 +11670,8 @@ const FormItem = _ref => {
11612
11670
  break;
11613
11671
  case 'vcode':
11614
11672
  component = /*#__PURE__*/React__default.createElement(VCode, {
11673
+ inputId: inputId,
11674
+ required: required,
11615
11675
  placeholder: currentPlaceholder,
11616
11676
  onChange: pass => setFieldValue(field.name, pass),
11617
11677
  formatMessage: formatMessage,
@@ -11633,11 +11693,23 @@ const FormItem = _ref => {
11633
11693
  return /*#__PURE__*/React__default.createElement("div", {
11634
11694
  id: `form-${name}`,
11635
11695
  className: "formItem"
11636
- }, label && /*#__PURE__*/React__default.createElement("div", {
11637
- className: "formItem__title"
11696
+ }, label && (hasInputId ?
11697
+ /*#__PURE__*/
11698
+ // eslint-disable-next-line jsx-a11y/label-has-for, jsx-a11y/label-has-associated-control
11699
+ React__default.createElement("label", {
11700
+ className: "formItem__title",
11701
+ id: labelId,
11702
+ htmlFor: inputId
11703
+ }, label, required && /*#__PURE__*/React__default.createElement("div", {
11704
+ className: "formItem__title__star",
11705
+ "aria-hidden": "true"
11706
+ }, '*')) : /*#__PURE__*/React__default.createElement("div", {
11707
+ className: "formItem__title",
11708
+ id: labelId
11638
11709
  }, label, required && /*#__PURE__*/React__default.createElement("div", {
11639
- className: "formItem__title__star"
11640
- }, "*")), hint && /*#__PURE__*/React__default.createElement(Box, {
11710
+ className: "formItem__title__star",
11711
+ "aria-hidden": "true"
11712
+ }, '*'))), hint && /*#__PURE__*/React__default.createElement(Box, {
11641
11713
  my: 1
11642
11714
  }, /*#__PURE__*/React__default.createElement(Typography, {
11643
11715
  variant: "body2"
@@ -1,22 +1,22 @@
1
- export { C as default } from './ContactModal-530d4d80.js';
1
+ export { C as default } from './ContactModal-1997d146.js';
2
2
  import './_rollupPluginBabelHelpers-a52356f6.js';
3
3
  import 'react';
4
4
  import 'prop-types';
5
5
  import './hoist-non-react-statics.cjs-3f408ad2.js';
6
6
  import 'react-is';
7
7
  import 'axios';
8
- import './Modal-fc4320d3.js';
9
- import './index-ef96775f.js';
8
+ import './Modal-5a27951f.js';
9
+ import './index-b76a85f4.js';
10
10
  import '@material-ui/core';
11
11
  import '@material-ui/icons';
12
- import './Button-8742afeb.js';
12
+ import './Button-305b69a0.js';
13
13
  import './style-inject.es-1f59c1d0.js';
14
- import './Spin-fafe3787.js';
14
+ import './Spin-8dc60bfe.js';
15
+ import './globalConfig';
15
16
  import './_commonjsHelpers-70de2c37.js';
16
- import './Select-fdb4d9b8.js';
17
- import './Empty-94a8d8ff.js';
18
- import './createSvgIcon-0d38de2e.js';
17
+ import './Select-e550d0a5.js';
18
+ import './Empty-bf77164f.js';
19
+ import './createSvgIcon-e3803ee1.js';
19
20
  import './defaultTheme-ed7746fe.js';
20
21
  import '@material-ui/styles';
21
22
  import 'react-dom';
22
- import './globalConfig';
@@ -3,8 +3,9 @@ import React__default, { useState } from 'react';
3
3
  import PropTypes from 'prop-types';
4
4
  import { List, ListItem, ListItemIcon, ListItemText, IconButton, Drawer as Drawer$1, Divider } from '@material-ui/core';
5
5
  import { DehazeRounded } from '@material-ui/icons';
6
- import { S as Select } from './Select-fdb4d9b8.js';
6
+ import { S as Select } from './Select-e550d0a5.js';
7
7
  import { useHistory, useRouteMatch } from 'react-router-dom';
8
+ import { getIntl } from './globalConfig';
8
9
  import { s as styleInject } from './style-inject.es-1f59c1d0.js';
9
10
 
10
11
  var defaultSupportLanguage = [
@@ -90,11 +91,17 @@ var Drawer = function Drawer(_ref) {
90
91
  className: "drawer"
91
92
  }, /*#__PURE__*/React__default.createElement(IconButton, {
92
93
  className: "drawer__icon",
94
+ "aria-label": getIntl().formatMessage({
95
+ id: 'aria.header.menuOpen'
96
+ }),
97
+ "aria-haspopup": "menu",
98
+ "aria-expanded": open,
93
99
  onClick: function onClick() {
94
100
  return setOpen(true);
95
101
  }
96
102
  }, /*#__PURE__*/React__default.createElement(DehazeRounded, {
97
- fontSize: "large"
103
+ fontSize: "large",
104
+ "aria-hidden": "true"
98
105
  })), /*#__PURE__*/React__default.createElement(Drawer$1, {
99
106
  anchor: "right",
100
107
  open: open,
@@ -1,11 +1,12 @@
1
- export { D as default } from './Drawer-96442344.js';
1
+ export { D as default } from './Drawer-b9855a54.js';
2
2
  import './_rollupPluginBabelHelpers-a52356f6.js';
3
3
  import 'react';
4
4
  import 'prop-types';
5
5
  import '@material-ui/core';
6
6
  import '@material-ui/icons';
7
- import './Select-fdb4d9b8.js';
8
- import './index-ef96775f.js';
9
- import './Empty-94a8d8ff.js';
7
+ import './Select-e550d0a5.js';
8
+ import './index-b76a85f4.js';
9
+ import './Empty-bf77164f.js';
10
10
  import './style-inject.es-1f59c1d0.js';
11
11
  import 'react-router-dom';
12
+ import './globalConfig';
@@ -1,6 +1,6 @@
1
1
  import { a as _slicedToArray } from './_rollupPluginBabelHelpers-a52356f6.js';
2
2
  import React__default, { useRef, useState } from 'react';
3
- import { c as classNames } from './index-ef96775f.js';
3
+ import { c as classNames } from './index-b76a85f4.js';
4
4
  import PropTypes from 'prop-types';
5
5
  import { Button, Menu, Divider, MenuItem, ListItemIcon, ListItemText } from '@material-ui/core';
6
6
  import { makeStyles } from '@material-ui/styles';
@@ -1,6 +1,6 @@
1
1
  import React__default from 'react';
2
2
  import PropTypes from 'prop-types';
3
- import { c as classNames } from './index-ef96775f.js';
3
+ import { c as classNames } from './index-b76a85f4.js';
4
4
  import { s as styleInject } from './style-inject.es-1f59c1d0.js';
5
5
 
6
6
  var img = "data:image/svg+xml,%3csvg class='ant-empty-img-default' width='184' height='152' viewBox='0 0 184 152' xmlns='http://www.w3.org/2000/svg'%3e %3cg fill='none' fill-rule='evenodd'%3e %3cg transform='translate(24 31.67)'%3e %3cellipse fill='%23f5f5f5' fill-opacity='0.8' cx='67.797' cy='106.89' rx='67.797' ry='12.668'%3e%3c/ellipse%3e %3cpath fill='%23aeb8c2' d='M122.034 69.674L98.109 40.229c-1.148-1.386-2.826-2.225-4.593-2.225h-51.44c-1.766 0-3.444.839-4.592 2.225L13.56 69.674v15.383h108.475V69.674z'%3e%3c/path%3e %3cpath fill='url(%23linearGradient-1)' d='M101.537 86.214L80.63 61.102c-1.001-1.207-2.507-1.867-4.048-1.867H31.724c-1.54 0-3.047.66-4.048 1.867L6.769 86.214v13.792h94.768V86.214z' transform='translate(13.56)'%3e%3c/path%3e %3cpath fill='%23f5f5f7' d='M33.83 0h67.933a4 4 0 0 1 4 4v93.344a4 4 0 0 1-4 4H33.83a4 4 0 0 1-4-4V4a4 4 0 0 1 4-4z'%3e%3c/path%3e %3cpath fill='%23dce0e6' d='M42.678 9.953h50.237a2 2 0 0 1 2 2V36.91a2 2 0 0 1-2 2H42.678a2 2 0 0 1-2-2V11.953a2 2 0 0 1 2-2zM42.94 49.767h49.713a2.262 2.262 0 1 1 0 4.524H42.94a2.262 2.262 0 0 1 0-4.524zM42.94 61.53h49.713a2.262 2.262 0 1 1 0 4.525H42.94a2.262 2.262 0 0 1 0-4.525zM121.813 105.032c-.775 3.071-3.497 5.36-6.735 5.36H20.515c-3.238 0-5.96-2.29-6.734-5.36a7.309 7.309 0 0 1-.222-1.79V69.675h26.318c2.907 0 5.25 2.448 5.25 5.42v.04c0 2.971 2.37 5.37 5.277 5.37h34.785c2.907 0 5.277-2.421 5.277-5.393V75.1c0-2.972 2.343-5.426 5.25-5.426h26.318v33.569c0 .617-.077 1.216-.221 1.789z'%3e%3c/path%3e %3c/g%3e %3cpath fill='%23dce0e6' d='M149.121 33.292l-6.83 2.65a1 1 0 0 1-1.317-1.23l1.937-6.207c-2.589-2.944-4.109-6.534-4.109-10.408C138.802 8.102 148.92 0 161.402 0 173.881 0 184 8.102 184 18.097c0 9.995-10.118 18.097-22.599 18.097-4.528 0-8.744-1.066-12.28-2.902z'%3e%3c/path%3e %3cg fill='white' transform='translate(149.65 15.383)'%3e %3cellipse cx='20.654' cy='3.167' rx='2.849' ry='2.815'%3e%3c/ellipse%3e %3cpath d='M5.698 5.63H0L2.898.704zM9.259.704h4.985V5.63H9.259z'%3e%3c/path%3e %3c/g%3e %3c/g%3e%3c/svg%3e";
@@ -1,5 +1,5 @@
1
- export { E as default } from './Empty-94a8d8ff.js';
1
+ export { E as default } from './Empty-bf77164f.js';
2
2
  import 'react';
3
3
  import 'prop-types';
4
- import './index-ef96775f.js';
4
+ import './index-b76a85f4.js';
5
5
  import './style-inject.es-1f59c1d0.js';
@@ -1,7 +1,7 @@
1
1
  import { a as _slicedToArray } from './_rollupPluginBabelHelpers-a52356f6.js';
2
2
  import React__default, { useState } from 'react';
3
3
  import PropTypes from 'prop-types';
4
- import { c as classNames } from './index-ef96775f.js';
4
+ import { c as classNames } from './index-b76a85f4.js';
5
5
  import { ExitToApp } from '@material-ui/icons';
6
6
  import { Dialog, DialogContent, DialogContentText, DialogActions, Button } from '@material-ui/core';
7
7
  import { f as fileDownload, j as jsonTxt, a as jsonExcel } from './dataExport-d55d6fa3.js';