@transferwise/components 46.11.0 → 46.13.0

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 (38) hide show
  1. package/build/i18n/zh-HK.json +2 -2
  2. package/build/index.esm.js +67 -153
  3. package/build/index.esm.js.map +1 -1
  4. package/build/index.js +67 -153
  5. package/build/index.js.map +1 -1
  6. package/build/types/drawer/Drawer.d.ts.map +1 -1
  7. package/build/types/index.d.ts +1 -0
  8. package/build/types/index.d.ts.map +1 -1
  9. package/build/types/modal/Modal.d.ts.map +1 -1
  10. package/build/types/popover/Popover.d.ts +1 -0
  11. package/build/types/popover/Popover.d.ts.map +1 -1
  12. package/build/types/typeahead/Typeahead.d.ts +95 -57
  13. package/build/types/typeahead/Typeahead.d.ts.map +1 -1
  14. package/build/types/typeahead/index.d.ts +2 -2
  15. package/build/types/typeahead/index.d.ts.map +1 -1
  16. package/build/types/typeahead/typeaheadInput/TypeaheadInput.d.ts +23 -41
  17. package/build/types/typeahead/typeaheadInput/TypeaheadInput.d.ts.map +1 -1
  18. package/build/types/typeahead/typeaheadOption/TypeaheadOption.d.ts +9 -17
  19. package/build/types/typeahead/typeaheadOption/TypeaheadOption.d.ts.map +1 -1
  20. package/build/types/typeahead/util/highlight.d.ts +2 -1
  21. package/build/types/typeahead/util/highlight.d.ts.map +1 -1
  22. package/package.json +5 -2
  23. package/src/drawer/Drawer.js +13 -2
  24. package/src/drawer/__snapshots__/Drawer.rtl.spec.js.snap +1 -0
  25. package/src/i18n/zh-HK.json +2 -2
  26. package/src/index.ts +1 -0
  27. package/src/modal/Modal.tsx +6 -3
  28. package/src/popover/Popover.js +7 -3
  29. package/src/popover/Popover.spec.js +16 -8
  30. package/src/popover/__snapshots__/Popover.spec.js.snap +0 -56
  31. package/src/typeahead/{Typeahead.story.js → Typeahead.story.tsx} +8 -7
  32. package/src/typeahead/{Typeahead.js → Typeahead.tsx} +110 -111
  33. package/src/typeahead/index.ts +2 -0
  34. package/src/typeahead/typeaheadInput/TypeaheadInput.spec.js +1 -0
  35. package/src/typeahead/typeaheadInput/{TypeaheadInput.js → TypeaheadInput.tsx} +35 -46
  36. package/src/typeahead/typeaheadOption/{TypeaheadOption.js → TypeaheadOption.tsx} +10 -20
  37. package/src/typeahead/util/{highlight.js → highlight.tsx} +1 -1
  38. package/src/typeahead/index.js +0 -3
package/build/index.js CHANGED
@@ -1901,6 +1901,7 @@ const Drawer = ({
1901
1901
  const {
1902
1902
  isMobile
1903
1903
  } = useLayout();
1904
+ const titleId = reactId.useId();
1904
1905
  return /*#__PURE__*/jsxRuntime.jsx(Dimmer$1, {
1905
1906
  open: open,
1906
1907
  onClose: onClose,
@@ -1908,13 +1909,16 @@ const Drawer = ({
1908
1909
  open: open,
1909
1910
  position: isMobile ? exports.Position.BOTTOM : position,
1910
1911
  children: /*#__PURE__*/jsxRuntime.jsxs("div", {
1911
- className: classNames__default.default('np-drawer', className),
1912
1912
  role: "dialog",
1913
+ "aria-modal": true,
1914
+ "aria-labelledby": headerTitle ? titleId : undefined,
1915
+ className: classNames__default.default('np-drawer', className),
1913
1916
  children: [/*#__PURE__*/jsxRuntime.jsxs("div", {
1914
1917
  className: classNames__default.default('np-drawer-header', {
1915
1918
  'np-drawer-header--withborder': headerTitle
1916
1919
  }),
1917
1920
  children: [headerTitle && /*#__PURE__*/jsxRuntime.jsx(Title, {
1921
+ id: titleId,
1918
1922
  type: exports.Typography.TITLE_BODY,
1919
1923
  children: headerTitle
1920
1924
  }), /*#__PURE__*/jsxRuntime.jsx(CloseButton, {
@@ -5956,6 +5960,7 @@ const Modal = ({
5956
5960
  const isCompact = checkSpecialClasses('compact');
5957
5961
  const noDivider = checkSpecialClasses('no-divider');
5958
5962
  const contentReference = React.useRef(null);
5963
+ const titleId = reactId.useId();
5959
5964
  return !isMedium ? /*#__PURE__*/jsxRuntime.jsx(Drawer$1, {
5960
5965
  open: open,
5961
5966
  headerTitle: title,
@@ -5983,11 +5988,12 @@ const Modal = ({
5983
5988
  className: classNames__default.default('tw-modal', 'd-flex', 'fade', 'outline-none', scroll === exports.Scroll.CONTENT && 'tw-modal--scrollable', className),
5984
5989
  ...otherProps,
5985
5990
  children: /*#__PURE__*/jsxRuntime.jsx("div", {
5991
+ role: "dialog",
5992
+ "aria-modal": true,
5993
+ "aria-labelledby": titleId,
5986
5994
  className: classNames__default.default('tw-modal-dialog', 'd-flex', {
5987
5995
  [`tw-modal-${size}`]: size
5988
5996
  }),
5989
- "aria-modal": true,
5990
- role: "dialog",
5991
5997
  children: /*#__PURE__*/jsxRuntime.jsxs("div", {
5992
5998
  className: classNames__default.default('tw-modal-content', 'd-flex', 'flex-column', 'justify-content-between', {
5993
5999
  'tw-modal-compact': isCompact,
@@ -5998,6 +6004,7 @@ const Modal = ({
5998
6004
  'modal--withoutborder': !title || noDivider
5999
6005
  }),
6000
6006
  children: [/*#__PURE__*/jsxRuntime.jsx(Title, {
6007
+ id: titleId,
6001
6008
  type: exports.Typography.TITLE_BODY,
6002
6009
  className: "tw-modal-title",
6003
6010
  children: title
@@ -6027,7 +6034,8 @@ const Popover$1 = ({
6027
6034
  className,
6028
6035
  content,
6029
6036
  preferredPlacement,
6030
- title
6037
+ title,
6038
+ onClose
6031
6039
  }) => {
6032
6040
  logActionRequired({
6033
6041
  preferredPlacement
@@ -6037,7 +6045,10 @@ const Popover$1 = ({
6037
6045
  const {
6038
6046
  isModern
6039
6047
  } = componentsTheming.useTheme();
6040
- const onClose = () => setOpen(false);
6048
+ const handleOnClose = () => {
6049
+ setOpen(false);
6050
+ onClose?.();
6051
+ };
6041
6052
  return /*#__PURE__*/jsxRuntime.jsxs("span", {
6042
6053
  className: classNames__default.default('np-popover', className),
6043
6054
  children: [/*#__PURE__*/jsxRuntime.jsx("span", {
@@ -6057,7 +6068,7 @@ const Popover$1 = ({
6057
6068
  position: deprecatedPlacements[preferredPlacement] || preferredPlacement,
6058
6069
  arrow: true,
6059
6070
  className: "np-popover__container",
6060
- onClose: onClose,
6071
+ onClose: handleOnClose,
6061
6072
  children: /*#__PURE__*/jsxRuntime.jsxs("div", {
6062
6073
  className: isModern ? 'np-popover__content np-text-default-body' : 'np-popover__content',
6063
6074
  "aria-hidden": !open,
@@ -6090,6 +6101,7 @@ Popover$1.propTypes = {
6090
6101
  * `'bottom-right'` / `'bottom-left'` are deprecated use `Position.BOTTOM` / `'bottom'` instead
6091
6102
  */
6092
6103
  preferredPlacement: PropTypes__default.default.oneOf(['top', 'right', 'bottom', 'left', 'left-top', 'right-top', 'bottom-right', 'bottom-left']),
6104
+ onClose: PropTypes__default.default.func,
6093
6105
  title: PropTypes__default.default.node
6094
6106
  };
6095
6107
  const deprecatedPlacements = {
@@ -12244,8 +12256,10 @@ const TextareaWithDisplayFormat = props => /*#__PURE__*/jsxRuntime.jsx(WithDispl
12244
12256
  /* eslint-disable jsx-a11y/no-static-element-interactions */
12245
12257
  const DEFAULT_INPUT_MIN_WIDTH = 10;
12246
12258
  class TypeaheadInput extends React.Component {
12247
- constructor() {
12248
- super();
12259
+ inputRef = /*#__PURE__*/React.createRef();
12260
+ sizerRef = /*#__PURE__*/React.createRef();
12261
+ constructor(props) {
12262
+ super(props);
12249
12263
  this.state = {
12250
12264
  inputWidth: DEFAULT_INPUT_MIN_WIDTH
12251
12265
  };
@@ -12255,7 +12269,7 @@ class TypeaheadInput extends React.Component {
12255
12269
  autoFocus
12256
12270
  } = this.props;
12257
12271
  if (autoFocus) {
12258
- this.inputRef.focus();
12272
+ this.inputRef.current?.focus();
12259
12273
  }
12260
12274
  }
12261
12275
  componentDidUpdate(previousProps) {
@@ -12266,7 +12280,7 @@ class TypeaheadInput extends React.Component {
12266
12280
  recalculateWidth = () => {
12267
12281
  requestAnimationFrame(() => {
12268
12282
  this.setState({
12269
- inputWidth: Math.max(DEFAULT_INPUT_MIN_WIDTH, this.sizerRef.scrollWidth + 10)
12283
+ inputWidth: Math.max(DEFAULT_INPUT_MIN_WIDTH, this.sizerRef.current?.scrollWidth ?? 0 + 10)
12270
12284
  });
12271
12285
  });
12272
12286
  };
@@ -12291,9 +12305,7 @@ class TypeaheadInput extends React.Component {
12291
12305
  } = this.state;
12292
12306
  const hasPlaceholder = !multiple || selected.length === 0;
12293
12307
  return /*#__PURE__*/jsxRuntime.jsx(Input, {
12294
- ref: reference => {
12295
- this.inputRef = reference;
12296
- },
12308
+ ref: this.inputRef,
12297
12309
  className: classNames__default.default(multiple && 'typeahead__input'),
12298
12310
  name: name,
12299
12311
  id: `input-${typeaheadId}`,
@@ -12326,11 +12338,11 @@ class TypeaheadInput extends React.Component {
12326
12338
  } = this.props;
12327
12339
  return multiple ? /*#__PURE__*/jsxRuntime.jsxs("div", {
12328
12340
  className: "form-control typeahead__input-container",
12329
- style: maxHeight && {
12341
+ style: {
12330
12342
  maxHeight
12331
12343
  },
12332
12344
  onClick: () => {
12333
- this.inputRef.focus();
12345
+ this.inputRef.current?.focus();
12334
12346
  },
12335
12347
  children: [/*#__PURE__*/jsxRuntime.jsxs("div", {
12336
12348
  className: "typeahead__input-wrapper",
@@ -12338,39 +12350,13 @@ class TypeaheadInput extends React.Component {
12338
12350
  className: "typeahead__input-aligner"
12339
12351
  })]
12340
12352
  }), /*#__PURE__*/jsxRuntime.jsx("div", {
12341
- ref: reference => {
12342
- this.sizerRef = reference;
12343
- },
12353
+ ref: this.sizerRef,
12344
12354
  className: "sizer form-control typeahead__input",
12345
12355
  children: value
12346
12356
  })]
12347
12357
  }) : this.renderInput();
12348
12358
  }
12349
12359
  }
12350
- TypeaheadInput.propTypes = {
12351
- typeaheadId: PropTypes__default.default.string.isRequired,
12352
- name: PropTypes__default.default.string.isRequired,
12353
- autoFocus: PropTypes__default.default.bool,
12354
- multiple: PropTypes__default.default.bool.isRequired,
12355
- value: PropTypes__default.default.string.isRequired,
12356
- selected: PropTypes__default.default.arrayOf(PropTypes__default.default.object),
12357
- placeholder: PropTypes__default.default.string,
12358
- optionsShown: PropTypes__default.default.bool,
12359
- maxHeight: PropTypes__default.default.number,
12360
- autoComplete: PropTypes__default.default.string.isRequired,
12361
- onChange: PropTypes__default.default.func.isRequired,
12362
- renderChip: PropTypes__default.default.func.isRequired,
12363
- onKeyDown: PropTypes__default.default.func.isRequired,
12364
- onFocus: PropTypes__default.default.func.isRequired,
12365
- onPaste: PropTypes__default.default.func.isRequired
12366
- };
12367
- TypeaheadInput.defaultProps = {
12368
- autoFocus: false,
12369
- maxHeight: null,
12370
- placeholder: '',
12371
- optionsShown: false,
12372
- selected: []
12373
- };
12374
12360
 
12375
12361
  function highlight(value, query) {
12376
12362
  if (value && query) {
@@ -12391,9 +12377,9 @@ function highlight(value, query) {
12391
12377
  const Option = props => {
12392
12378
  const {
12393
12379
  option,
12394
- selected,
12395
- onClick,
12396
- query
12380
+ selected = false,
12381
+ onClick = () => {},
12382
+ query = ''
12397
12383
  } = props;
12398
12384
  const {
12399
12385
  label,
@@ -12423,46 +12409,48 @@ const Option = props => {
12423
12409
  })
12424
12410
  });
12425
12411
  };
12426
- Option.propTypes = {
12427
- option: PropTypes__default.default.shape({
12428
- label: PropTypes__default.default.string.isRequired,
12429
- note: PropTypes__default.default.string,
12430
- secondary: PropTypes__default.default.string
12431
- }).isRequired,
12432
- query: PropTypes__default.default.string,
12433
- selected: PropTypes__default.default.bool,
12434
- onClick: PropTypes__default.default.func
12435
- };
12436
- Option.defaultProps = {
12437
- selected: false,
12438
- query: '',
12439
- onClick: () => {}
12440
- };
12441
- var TypeaheadOption = Option;
12442
12412
 
12443
12413
  /* eslint-disable jsx-a11y/anchor-is-valid */
12444
12414
  /* eslint-disable jsx-a11y/click-events-have-key-events */
12445
12415
  /* eslint-disable jsx-a11y/no-static-element-interactions */
12446
-
12447
12416
  const DEFAULT_MIN_QUERY_LENGTH = 3;
12448
12417
  const SEARCH_DELAY = 200;
12449
12418
  class Typeahead extends React.Component {
12419
+ static defaultProps = {
12420
+ allowNew: false,
12421
+ autoFillOnBlur: true,
12422
+ autoFocus: false,
12423
+ chipSeparators: [],
12424
+ clearable: true,
12425
+ initialValue: [],
12426
+ inputAutoComplete: 'new-password',
12427
+ minQueryLength: DEFAULT_MIN_QUERY_LENGTH,
12428
+ multiple: false,
12429
+ searchDelay: SEARCH_DELAY,
12430
+ showSuggestions: true,
12431
+ showNewEntry: true,
12432
+ size: exports.Size.MEDIUM,
12433
+ validateChip: () => true
12434
+ };
12450
12435
  constructor(props) {
12451
12436
  super(props);
12452
12437
  const {
12453
12438
  searchDelay,
12454
12439
  initialValue,
12455
12440
  multiple
12456
- } = props;
12441
+ } = this.props;
12457
12442
  this.handleSearchDebounced = debounce__default.default(this.handleSearch, searchDelay);
12458
12443
  const initialQuery = !multiple && initialValue.length > 0 ? initialValue[0].label : '';
12459
12444
  this.state = {
12460
12445
  selected: initialValue,
12461
12446
  errorState: false,
12462
12447
  query: initialQuery,
12463
- keyboardFocusedOptionIndex: null
12448
+ keyboardFocusedOptionIndex: null,
12449
+ optionsShown: false,
12450
+ isFocused: false
12464
12451
  };
12465
12452
  }
12453
+ handleSearchDebounced;
12466
12454
  UNSAFE_componentWillReceiveProps(nextProps) {
12467
12455
  if (nextProps.multiple !== this.props.multiple) {
12468
12456
  this.setState(previousState => {
@@ -12476,6 +12464,7 @@ class Typeahead extends React.Component {
12476
12464
  };
12477
12465
  }
12478
12466
  return {
12467
+ selected: previousState.selected,
12479
12468
  query: ''
12480
12469
  };
12481
12470
  });
@@ -12485,13 +12474,8 @@ class Typeahead extends React.Component {
12485
12474
  this.handleSearchDebounced.cancel();
12486
12475
  }
12487
12476
  handleOnFocus = () => {
12488
- const {
12489
- onFocus
12490
- } = this.props;
12491
12477
  this.showMenu();
12492
- if (onFocus) {
12493
- this.props.onFocus();
12494
- }
12478
+ this.props.onFocus?.();
12495
12479
  };
12496
12480
  onOptionSelected = (event, item) => {
12497
12481
  event.preventDefault();
@@ -12574,7 +12558,7 @@ class Typeahead extends React.Component {
12574
12558
  break;
12575
12559
  case 'Enter':
12576
12560
  event.preventDefault();
12577
- if (options[keyboardFocusedOptionIndex]) {
12561
+ if (keyboardFocusedOptionIndex != null && options[keyboardFocusedOptionIndex]) {
12578
12562
  this.selectItem(options[keyboardFocusedOptionIndex]);
12579
12563
  } else if (allowNew && query.trim()) {
12580
12564
  this.selectItem({
@@ -12626,13 +12610,6 @@ class Typeahead extends React.Component {
12626
12610
  query
12627
12611
  });
12628
12612
  };
12629
- stopPropagation = event => {
12630
- event.stopPropagation();
12631
- event.preventDefault();
12632
- if (event.nativeEvent && event.nativeEvent.stopImmediatePropagation) {
12633
- event.nativeEvent.stopImmediatePropagation();
12634
- }
12635
- };
12636
12613
  handleSearch = query => {
12637
12614
  const {
12638
12615
  onSearch
@@ -12717,7 +12694,7 @@ class Typeahead extends React.Component {
12717
12694
  }
12718
12695
  };
12719
12696
  renderChip = (option, idx) => {
12720
- const valid = this.props.validateChip(option);
12697
+ const valid = this.props.validateChip?.(option);
12721
12698
  return /*#__PURE__*/jsxRuntime.jsx(Chip, {
12722
12699
  label: option.label,
12723
12700
  className: classNames__default.default('m-t-1', {
@@ -12752,7 +12729,7 @@ class Typeahead extends React.Component {
12752
12729
  className: "dropdown-menu",
12753
12730
  role: "menu",
12754
12731
  "aria-labelledby": "dropdownMenu1",
12755
- children: [optionsToRender.map((option, idx) => /*#__PURE__*/jsxRuntime.jsx(TypeaheadOption, {
12732
+ children: [optionsToRender.map((option, idx) => /*#__PURE__*/jsxRuntime.jsx(Option, {
12756
12733
  query: query,
12757
12734
  option: option,
12758
12735
  selected: keyboardFocusedOptionIndex === idx,
@@ -12795,16 +12772,18 @@ class Typeahead extends React.Component {
12795
12772
  const menu = this.renderMenu({
12796
12773
  footer,
12797
12774
  options,
12775
+ id,
12798
12776
  keyboardFocusedOptionIndex,
12799
12777
  query,
12800
12778
  allowNew,
12801
12779
  showNewEntry,
12802
12780
  dropdownOpen
12803
12781
  });
12804
- const hasError = errorState || alert && alert.type === exports.Sentiment.ERROR;
12805
- const displayAlert = !errorState && alert || alert && alert.type === exports.Sentiment.ERROR;
12806
- const hasWarning = displayAlert && alert.type === exports.Sentiment.WARNING;
12807
- const hasInfo = displayAlert && alert.type === exports.Sentiment.NEUTRAL;
12782
+ const alertType = alert?.type ?? exports.Sentiment.NEUTRAL;
12783
+ const hasError = errorState || alert && alertType === exports.Sentiment.ERROR;
12784
+ const displayAlert = !errorState && alert || alert && alertType === exports.Sentiment.ERROR;
12785
+ const hasWarning = displayAlert && alertType === exports.Sentiment.WARNING;
12786
+ const hasInfo = displayAlert && alertType === exports.Sentiment.NEUTRAL;
12808
12787
  return /*#__PURE__*/jsxRuntime.jsx("div", {
12809
12788
  id: id,
12810
12789
  className: classNames__default.default('typeahead', `typeahead-${size}`, {
@@ -12813,7 +12792,7 @@ class Typeahead extends React.Component {
12813
12792
  'typeahead--multiple': multiple,
12814
12793
  open: dropdownOpen
12815
12794
  }),
12816
- onClick: this.stopPropagation,
12795
+ onClick: stopPropagation$1,
12817
12796
  children: /*#__PURE__*/jsxRuntime.jsxs("div", {
12818
12797
  className: classNames__default.default('form-group', {
12819
12798
  'has-error': hasError,
@@ -12834,6 +12813,7 @@ class Typeahead extends React.Component {
12834
12813
  placeholder,
12835
12814
  selected,
12836
12815
  maxHeight,
12816
+ id: id,
12837
12817
  name: name,
12838
12818
  value: query,
12839
12819
  typeaheadId: id,
@@ -12860,72 +12840,6 @@ class Typeahead extends React.Component {
12860
12840
  });
12861
12841
  }
12862
12842
  }
12863
- Typeahead.propTypes = {
12864
- id: PropTypes__default.default.string.isRequired,
12865
- name: PropTypes__default.default.string.isRequired,
12866
- options: PropTypes__default.default.arrayOf(PropTypes__default.default.shape({
12867
- label: PropTypes__default.default.string.isRequired,
12868
- note: PropTypes__default.default.string,
12869
- secondary: PropTypes__default.default.string,
12870
- value: PropTypes__default.default.object
12871
- })).isRequired,
12872
- initialValue: PropTypes__default.default.arrayOf(PropTypes__default.default.shape({
12873
- label: PropTypes__default.default.string.isRequired,
12874
- note: PropTypes__default.default.string,
12875
- secondary: PropTypes__default.default.string
12876
- })),
12877
- onChange: PropTypes__default.default.func.isRequired,
12878
- allowNew: PropTypes__default.default.bool,
12879
- autoFocus: PropTypes__default.default.bool,
12880
- clearable: PropTypes__default.default.bool,
12881
- multiple: PropTypes__default.default.bool,
12882
- showSuggestions: PropTypes__default.default.bool,
12883
- showNewEntry: PropTypes__default.default.bool,
12884
- searchDelay: PropTypes__default.default.number,
12885
- maxHeight: PropTypes__default.default.number,
12886
- minQueryLength: PropTypes__default.default.number,
12887
- addon: PropTypes__default.default.node,
12888
- placeholder: PropTypes__default.default.string,
12889
- alert: PropTypes__default.default.shape({
12890
- message: PropTypes__default.default.string.isRequired,
12891
- type: PropTypes__default.default.oneOf(['error', 'warning', 'neutral']).isRequired
12892
- }),
12893
- footer: PropTypes__default.default.node,
12894
- validateChip: PropTypes__default.default.func,
12895
- onSearch: PropTypes__default.default.func,
12896
- onBlur: PropTypes__default.default.func,
12897
- onInputChange: PropTypes__default.default.func,
12898
- onFocus: PropTypes__default.default.func,
12899
- chipSeparators: PropTypes__default.default.arrayOf(PropTypes__default.default.string),
12900
- size: PropTypes__default.default.oneOf(['md', 'lg']),
12901
- inputAutoComplete: PropTypes__default.default.string,
12902
- autoFillOnBlur: PropTypes__default.default.bool
12903
- };
12904
- Typeahead.defaultProps = {
12905
- allowNew: false,
12906
- autoFocus: false,
12907
- clearable: true,
12908
- multiple: false,
12909
- maxHeight: null,
12910
- showSuggestions: true,
12911
- showNewEntry: true,
12912
- searchDelay: SEARCH_DELAY,
12913
- minQueryLength: DEFAULT_MIN_QUERY_LENGTH,
12914
- addon: null,
12915
- placeholder: null,
12916
- alert: null,
12917
- footer: null,
12918
- size: exports.Size.MEDIUM,
12919
- chipSeparators: [],
12920
- initialValue: [],
12921
- onSearch: null,
12922
- onBlur: null,
12923
- onInputChange: null,
12924
- onFocus: null,
12925
- validateChip: () => true,
12926
- inputAutoComplete: 'new-password',
12927
- autoFillOnBlur: true
12928
- };
12929
12843
 
12930
12844
  // TODO: consider to move this enum into component file once we migrate it on TypeScript or replace with some common enum
12931
12845
  exports.UploadStep = void 0;
@@ -15474,10 +15388,10 @@ var zhHK = {
15474
15388
  "neptune.ClearButton.ariaLabel": "清除",
15475
15389
  "neptune.CloseButton.ariaLabel": "關閉",
15476
15390
  "neptune.DateInput.day.label": "日",
15477
- "neptune.DateInput.day.placeholder": "",
15391
+ "neptune.DateInput.day.placeholder": "DD",
15478
15392
  "neptune.DateInput.month.label": "月",
15479
15393
  "neptune.DateInput.year.label": "年",
15480
- "neptune.DateInput.year.placeholder": "",
15394
+ "neptune.DateInput.year.placeholder": "YYYY",
15481
15395
  "neptune.DateLookup.day": "日",
15482
15396
  "neptune.DateLookup.goTo20YearView": "切換至20年視圖",
15483
15397
  "neptune.DateLookup.month": "月",