@neo4j-ndl/react 4.21.2 → 4.22.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 (185) hide show
  1. package/lib/cjs/_common/form-control/FormFieldLabel.js +52 -0
  2. package/lib/cjs/_common/form-control/FormFieldLabel.js.map +1 -0
  3. package/lib/cjs/_common/form-control/FormFieldMessage.js +72 -0
  4. package/lib/cjs/_common/form-control/FormFieldMessage.js.map +1 -0
  5. package/lib/cjs/_common/form-control/form-control-types.js +23 -0
  6. package/lib/cjs/_common/form-control/form-control-types.js.map +1 -0
  7. package/lib/cjs/_common/form-control/index.js +39 -0
  8. package/lib/cjs/_common/form-control/index.js.map +1 -0
  9. package/lib/cjs/_common/form-control/use-form-field.js +76 -0
  10. package/lib/cjs/_common/form-control/use-form-field.js.map +1 -0
  11. package/lib/cjs/_common/form-control/use-inline-field-label.js +76 -0
  12. package/lib/cjs/_common/form-control/use-inline-field-label.js.map +1 -0
  13. package/lib/cjs/checkbox/Checkbox.js +9 -21
  14. package/lib/cjs/checkbox/Checkbox.js.map +1 -1
  15. package/lib/cjs/combobox/Combobox.js +61 -45
  16. package/lib/cjs/combobox/Combobox.js.map +1 -1
  17. package/lib/cjs/combobox/combobox-types.js.map +1 -1
  18. package/lib/cjs/date-picker/DatePicker.js.map +1 -1
  19. package/lib/cjs/dropzone/stories/dropzone-full.story.js +5 -5
  20. package/lib/cjs/dropzone/stories/dropzone-full.story.js.map +1 -1
  21. package/lib/cjs/helpers/index.js +1 -0
  22. package/lib/cjs/helpers/index.js.map +1 -1
  23. package/lib/cjs/helpers/platform.js +59 -0
  24. package/lib/cjs/helpers/platform.js.map +1 -0
  25. package/lib/cjs/kbd/kbd-utils.js +6 -22
  26. package/lib/cjs/kbd/kbd-utils.js.map +1 -1
  27. package/lib/cjs/next/tree-view/TreeView.js +384 -66
  28. package/lib/cjs/next/tree-view/TreeView.js.map +1 -1
  29. package/lib/cjs/next/tree-view/selection.js +181 -0
  30. package/lib/cjs/next/tree-view/selection.js.map +1 -0
  31. package/lib/cjs/next/tree-view/stories/index.js +13 -1
  32. package/lib/cjs/next/tree-view/stories/index.js.map +1 -1
  33. package/lib/cjs/next/tree-view/stories/tree-view-large.story.js +57 -0
  34. package/lib/cjs/next/tree-view/stories/tree-view-large.story.js.map +1 -0
  35. package/lib/cjs/next/tree-view/stories/tree-view-lazy.story.js +1 -0
  36. package/lib/cjs/next/tree-view/stories/tree-view-lazy.story.js.map +1 -1
  37. package/lib/cjs/next/tree-view/stories/tree-view-multi.story.js +16 -40
  38. package/lib/cjs/next/tree-view/stories/tree-view-multi.story.js.map +1 -1
  39. package/lib/cjs/next/tree-view/stories/tree-view-multiple-replace.story.js +38 -0
  40. package/lib/cjs/next/tree-view/stories/tree-view-multiple-replace.story.js.map +1 -0
  41. package/lib/cjs/next/tree-view/stories/tree-view-non-selectable-folders.story.js +7 -4
  42. package/lib/cjs/next/tree-view/stories/tree-view-non-selectable-folders.story.js.map +1 -1
  43. package/lib/cjs/next/tree-view/stories/tree-view-root-selection.story.js +125 -0
  44. package/lib/cjs/next/tree-view/stories/tree-view-root-selection.story.js.map +1 -0
  45. package/lib/cjs/radio/Radio.js +12 -22
  46. package/lib/cjs/radio/Radio.js.map +1 -1
  47. package/lib/cjs/select/Select.js +14 -5
  48. package/lib/cjs/select/Select.js.map +1 -1
  49. package/lib/cjs/select/types.js.map +1 -1
  50. package/lib/cjs/switch/Switch.js +9 -21
  51. package/lib/cjs/switch/Switch.js.map +1 -1
  52. package/lib/cjs/text-area/TextArea.js +8 -21
  53. package/lib/cjs/text-area/TextArea.js.map +1 -1
  54. package/lib/cjs/text-input/TextInput.js +15 -38
  55. package/lib/cjs/text-input/TextInput.js.map +1 -1
  56. package/lib/cjs/text-input/stories/text-input-sizes.story.js +1 -1
  57. package/lib/cjs/text-input/stories/text-input-sizes.story.js.map +1 -1
  58. package/lib/cjs/time-picker/TimePicker.js +13 -7
  59. package/lib/cjs/time-picker/TimePicker.js.map +1 -1
  60. package/lib/cjs/timezone-picker/TimeZonePicker.js +13 -7
  61. package/lib/cjs/timezone-picker/TimeZonePicker.js.map +1 -1
  62. package/lib/cjs/toast/ToastControlled.js +1 -1
  63. package/lib/cjs/toast/ToastControlled.js.map +1 -1
  64. package/lib/esm/_common/form-control/FormFieldLabel.js +45 -0
  65. package/lib/esm/_common/form-control/FormFieldLabel.js.map +1 -0
  66. package/lib/esm/_common/form-control/FormFieldMessage.js +65 -0
  67. package/lib/esm/_common/form-control/FormFieldMessage.js.map +1 -0
  68. package/lib/esm/_common/form-control/form-control-types.js +22 -0
  69. package/lib/esm/_common/form-control/form-control-types.js.map +1 -0
  70. package/lib/esm/_common/form-control/index.js +32 -0
  71. package/lib/esm/_common/form-control/index.js.map +1 -0
  72. package/lib/esm/_common/form-control/use-form-field.js +72 -0
  73. package/lib/esm/_common/form-control/use-form-field.js.map +1 -0
  74. package/lib/esm/_common/form-control/use-inline-field-label.js +69 -0
  75. package/lib/esm/_common/form-control/use-inline-field-label.js.map +1 -0
  76. package/lib/esm/checkbox/Checkbox.js +10 -22
  77. package/lib/esm/checkbox/Checkbox.js.map +1 -1
  78. package/lib/esm/combobox/Combobox.js +62 -46
  79. package/lib/esm/combobox/Combobox.js.map +1 -1
  80. package/lib/esm/combobox/combobox-types.js.map +1 -1
  81. package/lib/esm/date-picker/DatePicker.js.map +1 -1
  82. package/lib/esm/dropzone/stories/dropzone-full.story.js +5 -5
  83. package/lib/esm/dropzone/stories/dropzone-full.story.js.map +1 -1
  84. package/lib/esm/helpers/index.js +1 -0
  85. package/lib/esm/helpers/index.js.map +1 -1
  86. package/lib/esm/helpers/platform.js +55 -0
  87. package/lib/esm/helpers/platform.js.map +1 -0
  88. package/lib/esm/kbd/kbd-utils.js +2 -18
  89. package/lib/esm/kbd/kbd-utils.js.map +1 -1
  90. package/lib/esm/next/tree-view/TreeView.js +385 -67
  91. package/lib/esm/next/tree-view/TreeView.js.map +1 -1
  92. package/lib/esm/next/tree-view/selection.js +175 -0
  93. package/lib/esm/next/tree-view/selection.js.map +1 -0
  94. package/lib/esm/next/tree-view/stories/index.js +9 -0
  95. package/lib/esm/next/tree-view/stories/index.js.map +1 -1
  96. package/lib/esm/next/tree-view/stories/tree-view-large.story.js +55 -0
  97. package/lib/esm/next/tree-view/stories/tree-view-large.story.js.map +1 -0
  98. package/lib/esm/next/tree-view/stories/tree-view-lazy.story.js +1 -0
  99. package/lib/esm/next/tree-view/stories/tree-view-lazy.story.js.map +1 -1
  100. package/lib/esm/next/tree-view/stories/tree-view-multi.story.js +16 -40
  101. package/lib/esm/next/tree-view/stories/tree-view-multi.story.js.map +1 -1
  102. package/lib/esm/next/tree-view/stories/tree-view-multiple-replace.story.js +36 -0
  103. package/lib/esm/next/tree-view/stories/tree-view-multiple-replace.story.js.map +1 -0
  104. package/lib/esm/next/tree-view/stories/tree-view-non-selectable-folders.story.js +7 -4
  105. package/lib/esm/next/tree-view/stories/tree-view-non-selectable-folders.story.js.map +1 -1
  106. package/lib/esm/next/tree-view/stories/tree-view-root-selection.story.js +123 -0
  107. package/lib/esm/next/tree-view/stories/tree-view-root-selection.story.js.map +1 -0
  108. package/lib/esm/radio/Radio.js +12 -22
  109. package/lib/esm/radio/Radio.js.map +1 -1
  110. package/lib/esm/select/Select.js +14 -5
  111. package/lib/esm/select/Select.js.map +1 -1
  112. package/lib/esm/select/types.js.map +1 -1
  113. package/lib/esm/switch/Switch.js +10 -22
  114. package/lib/esm/switch/Switch.js.map +1 -1
  115. package/lib/esm/text-area/TextArea.js +9 -22
  116. package/lib/esm/text-area/TextArea.js.map +1 -1
  117. package/lib/esm/text-input/TextInput.js +15 -38
  118. package/lib/esm/text-input/TextInput.js.map +1 -1
  119. package/lib/esm/text-input/stories/text-input-sizes.story.js +1 -1
  120. package/lib/esm/text-input/stories/text-input-sizes.story.js.map +1 -1
  121. package/lib/esm/time-picker/TimePicker.js +13 -7
  122. package/lib/esm/time-picker/TimePicker.js.map +1 -1
  123. package/lib/esm/timezone-picker/TimeZonePicker.js +13 -7
  124. package/lib/esm/timezone-picker/TimeZonePicker.js.map +1 -1
  125. package/lib/esm/toast/ToastControlled.js +1 -1
  126. package/lib/esm/toast/ToastControlled.js.map +1 -1
  127. package/lib/types/_common/form-control/FormFieldLabel.d.ts +58 -0
  128. package/lib/types/_common/form-control/FormFieldLabel.d.ts.map +1 -0
  129. package/lib/types/_common/form-control/FormFieldMessage.d.ts +46 -0
  130. package/lib/types/_common/form-control/FormFieldMessage.d.ts.map +1 -0
  131. package/lib/types/_common/form-control/form-control-types.d.ts +92 -0
  132. package/lib/types/_common/form-control/form-control-types.d.ts.map +1 -0
  133. package/lib/types/_common/form-control/index.d.ts +33 -0
  134. package/lib/types/_common/form-control/index.d.ts.map +1 -0
  135. package/lib/types/_common/form-control/use-form-field.d.ts +53 -0
  136. package/lib/types/_common/form-control/use-form-field.d.ts.map +1 -0
  137. package/lib/types/_common/form-control/use-inline-field-label.d.ts +69 -0
  138. package/lib/types/_common/form-control/use-inline-field-label.d.ts.map +1 -0
  139. package/lib/types/checkbox/Checkbox.d.ts.map +1 -1
  140. package/lib/types/combobox/Combobox.d.ts.map +1 -1
  141. package/lib/types/combobox/combobox-types.d.ts +1 -1
  142. package/lib/types/combobox/combobox-types.d.ts.map +1 -1
  143. package/lib/types/helpers/index.d.ts +1 -0
  144. package/lib/types/helpers/index.d.ts.map +1 -1
  145. package/lib/types/helpers/platform.d.ts +29 -0
  146. package/lib/types/helpers/platform.d.ts.map +1 -0
  147. package/lib/types/kbd/kbd-utils.d.ts +2 -5
  148. package/lib/types/kbd/kbd-utils.d.ts.map +1 -1
  149. package/lib/types/next/tree-view/TreeView.d.ts +29 -5
  150. package/lib/types/next/tree-view/TreeView.d.ts.map +1 -1
  151. package/lib/types/next/tree-view/selection.d.ts +78 -0
  152. package/lib/types/next/tree-view/selection.d.ts.map +1 -0
  153. package/lib/types/next/tree-view/stories/index.d.ts +6 -0
  154. package/lib/types/next/tree-view/stories/index.d.ts.map +1 -1
  155. package/lib/types/next/tree-view/stories/tree-view-large.story.d.ts +24 -0
  156. package/lib/types/next/tree-view/stories/tree-view-large.story.d.ts.map +1 -0
  157. package/lib/types/next/tree-view/stories/tree-view-lazy.story.d.ts.map +1 -1
  158. package/lib/types/next/tree-view/stories/tree-view-multi.story.d.ts +10 -0
  159. package/lib/types/next/tree-view/stories/tree-view-multi.story.d.ts.map +1 -1
  160. package/lib/types/next/tree-view/stories/tree-view-multiple-replace.story.d.ts +29 -0
  161. package/lib/types/next/tree-view/stories/tree-view-multiple-replace.story.d.ts.map +1 -0
  162. package/lib/types/next/tree-view/stories/tree-view-non-selectable-folders.story.d.ts +5 -0
  163. package/lib/types/next/tree-view/stories/tree-view-non-selectable-folders.story.d.ts.map +1 -1
  164. package/lib/types/next/tree-view/stories/tree-view-root-selection.story.d.ts +24 -0
  165. package/lib/types/next/tree-view/stories/tree-view-root-selection.story.d.ts.map +1 -0
  166. package/lib/types/radio/Radio.d.ts.map +1 -1
  167. package/lib/types/select/Select.d.ts.map +1 -1
  168. package/lib/types/select/types.d.ts.map +1 -1
  169. package/lib/types/switch/Switch.d.ts.map +1 -1
  170. package/lib/types/text-area/TextArea.d.ts.map +1 -1
  171. package/lib/types/text-input/TextInput.d.ts.map +1 -1
  172. package/lib/types/text-input/stories/text-input-sizes.story.d.ts.map +1 -1
  173. package/lib/types/time-picker/TimePicker.d.ts +3 -1
  174. package/lib/types/time-picker/TimePicker.d.ts.map +1 -1
  175. package/lib/types/timezone-picker/TimeZonePicker.d.ts +4 -1
  176. package/lib/types/timezone-picker/TimeZonePicker.d.ts.map +1 -1
  177. package/package.json +2 -2
  178. package/skills/ndl-react/SKILL.md +1 -1
  179. package/skills/ndl-react/components/color-picker.md +32 -32
  180. package/skills/ndl-react/components/combobox.md +2 -2
  181. package/skills/ndl-react/components/dropzone.md +5 -5
  182. package/skills/ndl-react/components/next/tree-view.md +444 -104
  183. package/skills/ndl-react/components/text-input.md +6 -0
  184. package/skills/ndl-react/components/time-picker.md +1 -0
  185. package/skills/ndl-react/components/timezone-picker.md +1 -0
@@ -40,6 +40,7 @@ const react_1 = require("@floating-ui/react");
40
40
  const react_virtual_1 = require("@tanstack/react-virtual");
41
41
  const classnames_1 = __importDefault(require("classnames"));
42
42
  const react_2 = require("react");
43
+ const form_control_1 = require("../_common/form-control");
43
44
  const use_semi_controlled_state_1 = require("../_common/use-semi-controlled-state");
44
45
  const utils_1 = require("../_common/utils");
45
46
  const checkbox_1 = require("../checkbox");
@@ -108,9 +109,6 @@ const Combobox = ({ label, name, formId, autoComplete, triggerRef, hasVisuallyHi
108
109
  const listboxId = `${baseId}-listbox`;
109
110
  const panelId = `${baseId}-panel`;
110
111
  const triggerId = `${baseId}-trigger`;
111
- const labelId = `${baseId}-label`;
112
- const helpTextId = `${baseId}-help-text`;
113
- const errorTextId = `${baseId}-error-text`;
114
112
  const initialValue = (0, combobox_utils_1.getInitialValue)(value, defaultValue, isMulti);
115
113
  const [selectedValue, setSelectedValue, resetSelectedValue] = (0, use_semi_controlled_state_1.useSemicontrolledState)({
116
114
  isControlled: value !== undefined,
@@ -468,13 +466,22 @@ const Combobox = ({ label, name, formId, autoComplete, triggerRef, hasVisuallyHi
468
466
  ? actionRows.map((row) => getOptionId(row)).join(' ')
469
467
  : undefined;
470
468
  const isDialogPanel = isSearchable;
471
- // An error replaces the help text, so only one message is ever rendered and
472
- // only that one is described.
473
- const displayedErrorText = errorText !== null && errorText !== void 0 ? errorText : nativeValidationMessage;
474
- const hasError = Boolean(displayedErrorText);
475
- const hasHelpText = Boolean(helpText) && !hasError;
476
- const messageId = hasError ? errorTextId : helpTextId;
477
- const describedById = hasError || hasHelpText ? messageId : undefined;
469
+ // The shared form field resolves the ids and which message is displayed -
470
+ // an error always replaces the help text. A native validation failure
471
+ // reported by the hidden form control acts as the error while no errorText
472
+ // is set.
473
+ const { field: formField, controlProps: fieldControlProps } = (0, form_control_1.useFormField)({
474
+ baseId,
475
+ controlId: triggerId,
476
+ errorText: errorText !== null && errorText !== void 0 ? errorText : nativeValidationMessage,
477
+ hasRequiredIndicator,
478
+ hasVisuallyHiddenLabel,
479
+ helpText,
480
+ isRequired,
481
+ label,
482
+ });
483
+ const hasError = formField.hasError;
484
+ const labelId = formField.labelId;
478
485
  const triggerAria = {
479
486
  'aria-activedescendant': isPanelOpen && !isSearchable ? activeOptionId : undefined,
480
487
  'aria-controls': getTriggerControlsId({
@@ -484,11 +491,11 @@ const Combobox = ({ label, name, formId, autoComplete, triggerRef, hasVisuallyHi
484
491
  listboxId,
485
492
  panelId,
486
493
  }),
487
- 'aria-describedby': describedById,
494
+ 'aria-describedby': fieldControlProps['aria-describedby'],
488
495
  'aria-disabled': isDisabled ? true : undefined,
489
496
  'aria-expanded': isPanelOpen,
490
497
  'aria-haspopup': isDialogPanel ? 'dialog' : 'listbox',
491
- 'aria-invalid': hasError ? true : undefined,
498
+ 'aria-invalid': fieldControlProps['aria-invalid'],
492
499
  'aria-required': isRequired ? true : undefined,
493
500
  // The label points at the trigger through `htmlFor`, so clicking it moves
494
501
  // focus to the trigger.
@@ -508,13 +515,13 @@ const Combobox = ({ label, name, formId, autoComplete, triggerRef, hasVisuallyHi
508
515
  // is referenced, keeping "Optional" out of the accessible name.
509
516
  'aria-labelledby': labelId, ref: builtInTriggerRef });
510
517
  const field = {
511
- errorText: displayedErrorText,
512
- errorTextId,
518
+ errorText: formField.errorText,
519
+ errorTextId: formField.errorTextId,
513
520
  hasError,
514
521
  hasRequiredIndicator,
515
522
  hasVisuallyHiddenLabel,
516
523
  helpText,
517
- helpTextId,
524
+ helpTextId: formField.helpTextId,
518
525
  isRequired,
519
526
  label,
520
527
  labelId,
@@ -602,6 +609,42 @@ const getSelectedOptions = (value) => {
602
609
  }
603
610
  return value === null ? [] : [value];
604
611
  };
612
+ /**
613
+ * The public `ComboboxFieldState` keeps its own shape - a custom trigger
614
+ * renders from it - so the built-in field parts map it onto the shared form
615
+ * field state (`_common/form-control`) instead of taking it directly.
616
+ */
617
+ const toFormFieldState = (field) => {
618
+ const hasHelpText = Boolean(field.helpText) && !field.hasError;
619
+ return {
620
+ controlId: field.triggerId,
621
+ errorText: field.errorText,
622
+ errorTextId: field.errorTextId,
623
+ hasError: field.hasError,
624
+ hasRequiredIndicator: field.hasRequiredIndicator,
625
+ hasVisuallyHiddenLabel: field.hasVisuallyHiddenLabel,
626
+ helpText: field.helpText,
627
+ helpTextId: field.helpTextId,
628
+ isRequired: field.isRequired,
629
+ label: field.label,
630
+ labelId: field.labelId,
631
+ message: field.hasError
632
+ ? field.errorText
633
+ : hasHelpText
634
+ ? field.helpText
635
+ : undefined,
636
+ messageId: field.hasError
637
+ ? field.errorTextId
638
+ : hasHelpText
639
+ ? field.helpTextId
640
+ : undefined,
641
+ messageSeverity: field.hasError
642
+ ? 'error'
643
+ : hasHelpText
644
+ ? 'help'
645
+ : undefined,
646
+ };
647
+ };
605
648
  /**
606
649
  * A native select mirrors the custom control for submission, autofill,
607
650
  * constraint validation, and reset. It is hidden from assistive technology
@@ -698,6 +741,7 @@ const Control = ({ triggerProps, state, field, placeholder, isClearable, isClean
698
741
  const { isOpen, isMulti, isDisabled, selectedOptions, clear, remove } = state;
699
742
  const { MultiValue, SingleValue } = components;
700
743
  const { ref: triggerRef } = triggerProps, triggerAria = __rest(triggerProps, ["ref"]);
744
+ const sharedField = toFormFieldState(field);
701
745
  const hasValue = selectedOptions.length > 0;
702
746
  const singleValueOption = isMulti ? undefined : selectedOptions[0];
703
747
  // Selected values are shown as tags, so the trigger renders nothing and is
@@ -807,7 +851,7 @@ const Control = ({ triggerProps, state, field, placeholder, isClearable, isClean
807
851
  return (
808
852
  // A fragment, so the label, the control, and the message are rows of the
809
853
  // combobox itself. A custom trigger replaces all three.
810
- (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(FieldLabel, { field: field, size: size, onLabelClick: handleLabelClick }), (0, jsx_runtime_1.jsxs)("div", Object.assign({ ref: referenceRef, className: (0, classnames_1.default)('ndl-combobox-control', {
854
+ (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(form_control_1.FormFieldLabel, { field: sharedField, size: size, onLabelClick: handleLabelClick }), (0, jsx_runtime_1.jsxs)("div", Object.assign({ ref: referenceRef, className: (0, classnames_1.default)('ndl-combobox-control', {
811
855
  'ndl-clean': isClean,
812
856
  'ndl-disabled': isDisabled,
813
857
  'ndl-has-error': field.hasError,
@@ -853,35 +897,7 @@ const Control = ({ triggerProps, state, field, placeholder, isClearable, isClean
853
897
  // Select.
854
898
  (0, jsx_runtime_1.jsxs)("div", { className: "ndl-combobox-clear", children: [(0, jsx_runtime_1.jsx)("button", { type: "button", className: "ndl-combobox-clear-button", "aria-label": "Clear selection", onKeyDown: handleAuxiliaryActionKeyDown, onClick: handleClear, children: (0, jsx_runtime_1.jsx)(heroIcons_1.XMarkIconOutline, {}) }), (0, jsx_runtime_1.jsx)("div", { className: "ndl-combobox-divider" })] })), (0, jsx_runtime_1.jsx)("div", { className: (0, classnames_1.default)('ndl-combobox-dropdown-indicator', {
855
899
  'ndl-open': isOpen,
856
- }), children: (0, jsx_runtime_1.jsx)(heroIcons_1.ChevronDownIconOutline, { "aria-hidden": "true", className: "ndl-combobox-icon" }) })] })] })), (0, jsx_runtime_1.jsx)(FieldMessage, { field: field, size: size })] }));
857
- };
858
- /**
859
- * The trigger is a button with `role="combobox"`, which takes its accessible
860
- * name from the author rather than from its content, so the label is referenced
861
- * through `aria-labelledby` instead of wrapping the control in a `<label>`.
862
- * The label is still a `<label>` associated through `htmlFor`, and clicking it
863
- * moves focus to the trigger, as with a native select. It deliberately does
864
- * not open the panel, which is also what a native select label leaves alone.
865
- */
866
- const FieldLabel = ({ field, size, onLabelClick }) => {
867
- const { label, labelId, triggerId, hasVisuallyHiddenLabel, hasRequiredIndicator, isRequired, } = field;
868
- const variant = size === 'large' ? 'body-large' : 'body-medium';
869
- return ((0, jsx_runtime_1.jsxs)("div", { className: (0, classnames_1.default)('ndl-combobox-label-row', {
870
- 'ndl-visually-hidden': hasVisuallyHiddenLabel,
871
- }), children: [(0, jsx_runtime_1.jsx)(typography_1.Typography, { as: "label", variant: variant, className: "ndl-combobox-label", htmlAttributes: {
872
- htmlFor: triggerId,
873
- id: labelId,
874
- onClick: onLabelClick,
875
- }, children: label }), hasRequiredIndicator && ((0, jsx_runtime_1.jsx)(typography_1.Typography, { variant: variant, className: "ndl-combobox-label-indicator", children: isRequired ? 'Required' : 'Optional' }))] }));
876
- };
877
- /**
878
- * Rendered whether or not there is a message, so the live region is in the
879
- * document before the text arrives and a validation error is announced.
880
- */
881
- const FieldMessage = ({ field, size }) => {
882
- const { errorText, hasError, helpText, helpTextId, errorTextId } = field;
883
- const variant = size === 'large' ? 'body-medium' : 'body-small';
884
- return ((0, jsx_runtime_1.jsxs)("div", { className: "ndl-combobox-message", "aria-live": "polite", children: [hasError && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("div", { className: "ndl-error-icon", children: (0, jsx_runtime_1.jsx)(heroIcons_1.ExclamationCircleIconSolid, {}) }), (0, jsx_runtime_1.jsx)(typography_1.Typography, { variant: variant, className: "ndl-error-text", htmlAttributes: { id: errorTextId }, children: errorText })] })), !hasError && Boolean(helpText) && ((0, jsx_runtime_1.jsx)(typography_1.Typography, { variant: variant, htmlAttributes: { id: helpTextId }, children: helpText }))] }));
900
+ }), children: (0, jsx_runtime_1.jsx)(heroIcons_1.ChevronDownIconOutline, { "aria-hidden": "true", className: "ndl-combobox-icon" }) })] })] })), (0, jsx_runtime_1.jsx)(form_control_1.FormFieldMessage, { field: sharedField, size: size })] }));
885
901
  };
886
902
  const Panel = (_a) => {
887
903
  var { children, ref, id, ariaLabel, isDialog, className, style } = _a, restProps = __rest(_a, ["children", "ref", "id", "ariaLabel", "isDialog", "className", "style"]);