@transferwise/components 0.0.0-experimental-5d40786 → 0.0.0-experimental-2932cd5

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 (47) hide show
  1. package/build/field/Field.js +4 -4
  2. package/build/field/Field.js.map +1 -1
  3. package/build/field/Field.mjs +4 -4
  4. package/build/field/Field.mjs.map +1 -1
  5. package/build/inputs/InputGroup.js +42 -46
  6. package/build/inputs/InputGroup.js.map +1 -1
  7. package/build/inputs/InputGroup.mjs +43 -47
  8. package/build/inputs/InputGroup.mjs.map +1 -1
  9. package/build/inputs/contexts.js +1 -2
  10. package/build/inputs/contexts.js.map +1 -1
  11. package/build/inputs/contexts.mjs +1 -2
  12. package/build/inputs/contexts.mjs.map +1 -1
  13. package/build/main.css +0 -3
  14. package/build/segmentedControl/SegmentedControl.js +1 -6
  15. package/build/segmentedControl/SegmentedControl.js.map +1 -1
  16. package/build/segmentedControl/SegmentedControl.mjs +1 -6
  17. package/build/segmentedControl/SegmentedControl.mjs.map +1 -1
  18. package/build/styles/main.css +0 -3
  19. package/build/styles/segmentedControl/SegmentedControl.css +0 -3
  20. package/build/tabs/TabList.js +11 -8
  21. package/build/tabs/TabList.js.map +1 -1
  22. package/build/tabs/TabList.mjs +7 -8
  23. package/build/tabs/TabList.mjs.map +1 -1
  24. package/build/types/field/Field.d.ts.map +1 -1
  25. package/build/types/inputs/InputGroup.d.ts.map +1 -1
  26. package/build/types/inputs/contexts.d.ts.map +1 -1
  27. package/build/types/segmentedControl/SegmentedControl.d.ts.map +1 -1
  28. package/build/types/tabs/TabList.d.ts +8 -3
  29. package/build/types/tabs/TabList.d.ts.map +1 -1
  30. package/package.json +3 -3
  31. package/src/field/Field.tsx +7 -5
  32. package/src/inputs/InputGroup.spec.tsx +6 -1
  33. package/src/inputs/InputGroup.tsx +39 -45
  34. package/src/inputs/SearchInput.spec.tsx +1 -1
  35. package/src/inputs/SelectInput.spec.tsx +1 -1
  36. package/src/inputs/contexts.tsx +1 -2
  37. package/src/main.css +0 -3
  38. package/src/segmentedControl/SegmentedControl.css +0 -3
  39. package/src/segmentedControl/SegmentedControl.less +0 -4
  40. package/src/segmentedControl/SegmentedControl.spec.tsx +0 -10
  41. package/src/segmentedControl/SegmentedControl.story.tsx +4 -42
  42. package/src/segmentedControl/SegmentedControl.tsx +1 -5
  43. package/src/tabs/TabList.js +15 -0
  44. package/src/tabs/Tabs.story.js +135 -0
  45. package/src/tabs/TabList.tsx +0 -15
  46. package/src/tabs/Tabs.rtl.spec.tsx +0 -40
  47. package/src/tabs/Tabs.story.tsx +0 -88
@@ -1 +1 @@
1
- {"version":3,"file":"SegmentedControl.js","sources":["../../src/segmentedControl/SegmentedControl.tsx"],"sourcesContent":["import classNames from 'classnames';\nimport { createRef, useEffect, useRef, useState } from 'react';\n\nimport Body from '../body';\nimport { Typography } from '../common';\nimport { useInputAttributes } from '../inputs/contexts';\n\ntype SegmentBase = { id: string; label: string; value: string };\n\ntype Segment = SegmentBase & { controls?: never };\ntype SegmentWithControls = SegmentBase & { controls: string };\n\nexport type Segments = readonly Segment[] | readonly SegmentWithControls[];\n\ntype SegmentedControlPropsBase = {\n name: string;\n value: string;\n mode: 'input' | 'view';\n onChange: (value: string) => void;\n};\n\ntype SegmentedControlViewProps = {\n mode: 'view';\n segments: readonly SegmentWithControls[];\n};\n\ntype SegmentedControlInputProps = {\n mode: 'input';\n segments: readonly Segment[];\n};\n\nexport type SegmentedControlProps = SegmentedControlPropsBase &\n (SegmentedControlViewProps | SegmentedControlInputProps);\n\nconst SegmentedControl = ({\n name,\n value,\n mode = 'input',\n segments,\n onChange,\n}: SegmentedControlProps) => {\n const inputAttributes = useInputAttributes({ nonLabelable: true });\n\n const [animate, setAnimate] = useState(false);\n\n const segmentsRef = useRef<HTMLDivElement>(null);\n\n if (segments.length > 3) {\n throw new Error(\n 'SegmentedControl only supports up to 3 segments. Please refer to: https://wise.design/components/segmented-control',\n );\n }\n\n const segmentsWithRefs = segments.map((segment) => ({\n ...segment,\n ref: createRef<HTMLLabelElement | HTMLButtonElement>(),\n }));\n\n const updateSegmentPosition = () => {\n const selectedSegmentRef = segmentsWithRefs.find((segment) => segment.value === value)?.ref;\n\n // We grab the active segments style object from the ref\n // and set the css variables to the selected segments width and x position.\n // This is so we can animate the highlight to the selected segment\n if (selectedSegmentRef?.current && segmentsRef.current) {\n const { style } = segmentsRef.current;\n style.setProperty('--segment-highlight-width', `${selectedSegmentRef.current.offsetWidth}px`);\n style.setProperty('--segment-highlight-x', `${selectedSegmentRef.current.offsetLeft}px`);\n }\n };\n\n useEffect(() => {\n setAnimate(true);\n updateSegmentPosition();\n\n const handleWindowSizeChange = () => {\n setAnimate(false);\n updateSegmentPosition();\n };\n\n window.addEventListener('resize', handleWindowSizeChange);\n return () => {\n window.removeEventListener('resize', handleWindowSizeChange);\n };\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [segmentsWithRefs, value]);\n\n return (\n <div\n ref={segmentsRef}\n data-testid=\"segmented-control\"\n className={classNames('segmented-control', {\n 'segmented-control--input': mode === 'input',\n })}\n >\n <div\n className={classNames('segmented-control__segments', {\n 'segmented-control__segments--no-animate': !animate,\n })}\n role={mode !== 'input' ? 'tablist' : 'group'}\n {...inputAttributes}\n >\n {segmentsWithRefs.map((segment) => {\n const onSelect = () => {\n setAnimate(true);\n onChange(segment.value);\n };\n return mode === 'input' ? (\n <label\n ref={segment.ref as React.MutableRefObject<HTMLLabelElement | null>}\n key={segment.id}\n htmlFor={segment.id}\n className={classNames('segmented-control__segment', {\n 'segmented-control__selected-segment': value === segment.value,\n })}\n >\n <input\n type=\"radio\"\n className=\"segmented-control__radio-input\"\n id={segment.id}\n name={name}\n value={segment.value}\n checked={value === segment.value}\n onChange={onSelect}\n />\n <Body\n className=\"segmented-control__text\"\n as=\"span\"\n type={\n value === segment.value ? Typography.BODY_DEFAULT_BOLD : Typography.BODY_DEFAULT\n }\n >\n {segment.label}\n </Body>\n </label>\n ) : (\n <button\n ref={segment.ref as React.MutableRefObject<HTMLButtonElement | null>}\n key={segment.id}\n type=\"button\"\n role=\"tab\"\n id={segment.id}\n aria-controls={segment.controls}\n aria-selected={value === segment.value}\n className={classNames('segmented-control__segment', 'segmented-control__button', {\n 'segmented-control__selected-segment': value === segment.value,\n })}\n onClick={onSelect}\n >\n <Body\n as=\"span\"\n className=\"segmented-control__text\"\n type={\n value === segment.value ? Typography.BODY_DEFAULT_BOLD : Typography.BODY_DEFAULT\n }\n >\n {segment.label}\n </Body>\n </button>\n );\n })}\n </div>\n </div>\n );\n};\n\nexport default SegmentedControl;\n"],"names":["SegmentedControl","name","value","mode","segments","onChange","inputAttributes","useInputAttributes","nonLabelable","animate","setAnimate","useState","segmentsRef","useRef","length","Error","segmentsWithRefs","map","segment","ref","createRef","updateSegmentPosition","selectedSegmentRef","find","current","style","setProperty","offsetWidth","offsetLeft","useEffect","handleWindowSizeChange","window","addEventListener","removeEventListener","_jsx","className","classNames","children","role","onSelect","_jsxs","htmlFor","id","type","checked","Body","as","Typography","BODY_DEFAULT_BOLD","BODY_DEFAULT","label","controls","onClick"],"mappings":"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"}
1
+ {"version":3,"file":"SegmentedControl.js","sources":["../../src/segmentedControl/SegmentedControl.tsx"],"sourcesContent":["import classNames from 'classnames';\nimport { createRef, useEffect, useRef, useState } from 'react';\n\nimport Body from '../body';\nimport { Typography } from '../common';\n\ntype SegmentBase = { id: string; label: string; value: string };\n\ntype Segment = SegmentBase & { controls?: never };\ntype SegmentWithControls = SegmentBase & { controls: string };\n\nexport type Segments = readonly Segment[] | readonly SegmentWithControls[];\n\ntype SegmentedControlPropsBase = {\n name: string;\n value: string;\n mode: 'input' | 'view';\n onChange: (value: string) => void;\n};\n\ntype SegmentedControlViewProps = {\n mode: 'view';\n segments: readonly SegmentWithControls[];\n};\n\ntype SegmentedControlInputProps = {\n mode: 'input';\n segments: readonly Segment[];\n};\n\nexport type SegmentedControlProps = SegmentedControlPropsBase &\n (SegmentedControlViewProps | SegmentedControlInputProps);\n\nconst SegmentedControl = ({\n name,\n value,\n mode = 'input',\n segments,\n onChange,\n}: SegmentedControlProps) => {\n const [animate, setAnimate] = useState(false);\n\n const segmentsRef = useRef<HTMLDivElement>(null);\n\n if (segments.length > 3) {\n throw new Error(\n 'SegmentedControl only supports up to 3 segments. Please refer to: https://wise.design/components/segmented-control',\n );\n }\n\n const segmentsWithRefs = segments.map((segment) => ({\n ...segment,\n ref: createRef<HTMLLabelElement | HTMLButtonElement>(),\n }));\n\n const updateSegmentPosition = () => {\n const selectedSegmentRef = segmentsWithRefs.find((segment) => segment.value === value)?.ref;\n\n // We grab the active segments style object from the ref\n // and set the css variables to the selected segments width and x position.\n // This is so we can animate the highlight to the selected segment\n if (selectedSegmentRef?.current && segmentsRef.current) {\n const { style } = segmentsRef.current;\n style.setProperty('--segment-highlight-width', `${selectedSegmentRef.current.offsetWidth}px`);\n style.setProperty('--segment-highlight-x', `${selectedSegmentRef.current.offsetLeft}px`);\n }\n };\n\n useEffect(() => {\n setAnimate(true);\n updateSegmentPosition();\n\n const handleWindowSizeChange = () => {\n setAnimate(false);\n updateSegmentPosition();\n };\n\n window.addEventListener('resize', handleWindowSizeChange);\n return () => {\n window.removeEventListener('resize', handleWindowSizeChange);\n };\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [segmentsWithRefs, value]);\n\n return (\n <div\n ref={segmentsRef}\n data-testid=\"segmented-control\"\n className={classNames('segmented-control', {\n 'segmented-control--input': mode === 'input',\n })}\n >\n <div\n className={classNames('segmented-control__segments', {\n 'segmented-control__segments--no-animate': !animate,\n })}\n role={mode !== 'input' ? 'tablist' : undefined}\n >\n {segmentsWithRefs.map((segment) => {\n const onSelect = () => {\n setAnimate(true);\n onChange(segment.value);\n };\n return mode === 'input' ? (\n <label\n ref={segment.ref as React.MutableRefObject<HTMLLabelElement | null>}\n key={segment.id}\n htmlFor={segment.id}\n className={classNames('segmented-control__segment', {\n 'segmented-control__selected-segment': value === segment.value,\n })}\n >\n <input\n type=\"radio\"\n className=\"segmented-control__radio-input\"\n id={segment.id}\n name={name}\n value={segment.value}\n checked={value === segment.value}\n onChange={onSelect}\n />\n <Body\n className=\"segmented-control__text\"\n as=\"span\"\n type={\n value === segment.value ? Typography.BODY_DEFAULT_BOLD : Typography.BODY_DEFAULT\n }\n >\n {segment.label}\n </Body>\n </label>\n ) : (\n <button\n ref={segment.ref as React.MutableRefObject<HTMLButtonElement | null>}\n key={segment.id}\n type=\"button\"\n role=\"tab\"\n id={segment.id}\n aria-controls={segment.controls}\n aria-selected={value === segment.value}\n className={classNames('segmented-control__segment', 'segmented-control__button', {\n 'segmented-control__selected-segment': value === segment.value,\n })}\n onClick={onSelect}\n >\n <Body\n as=\"span\"\n className=\"segmented-control__text\"\n type={\n value === segment.value ? Typography.BODY_DEFAULT_BOLD : Typography.BODY_DEFAULT\n }\n >\n {segment.label}\n </Body>\n </button>\n );\n })}\n </div>\n </div>\n );\n};\n\nexport default SegmentedControl;\n"],"names":["SegmentedControl","name","value","mode","segments","onChange","animate","setAnimate","useState","segmentsRef","useRef","length","Error","segmentsWithRefs","map","segment","ref","createRef","updateSegmentPosition","selectedSegmentRef","find","current","style","setProperty","offsetWidth","offsetLeft","useEffect","handleWindowSizeChange","window","addEventListener","removeEventListener","_jsx","className","classNames","children","role","undefined","onSelect","_jsxs","htmlFor","id","type","checked","Body","as","Typography","BODY_DEFAULT_BOLD","BODY_DEFAULT","label","controls","onClick"],"mappings":"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"}
@@ -1,7 +1,6 @@
1
1
  import classNames from 'classnames';
2
2
  import { useState, useRef, createRef, useEffect } from 'react';
3
3
  import Body from '../body/Body.mjs';
4
- import { useInputAttributes } from '../inputs/contexts.mjs';
5
4
  import { jsx, jsxs } from 'react/jsx-runtime';
6
5
  import { Typography } from '../common/propsValues/typography.mjs';
7
6
 
@@ -12,9 +11,6 @@ const SegmentedControl = ({
12
11
  segments,
13
12
  onChange
14
13
  }) => {
15
- const inputAttributes = useInputAttributes({
16
- nonLabelable: true
17
- });
18
14
  const [animate, setAnimate] = useState(false);
19
15
  const segmentsRef = useRef(null);
20
16
  if (segments.length > 3) {
@@ -60,8 +56,7 @@ const SegmentedControl = ({
60
56
  className: classNames('segmented-control__segments', {
61
57
  'segmented-control__segments--no-animate': !animate
62
58
  }),
63
- role: mode !== 'input' ? 'tablist' : 'group',
64
- ...inputAttributes,
59
+ role: mode !== 'input' ? 'tablist' : undefined,
65
60
  children: segmentsWithRefs.map(segment => {
66
61
  const onSelect = () => {
67
62
  setAnimate(true);
@@ -1 +1 @@
1
- {"version":3,"file":"SegmentedControl.mjs","sources":["../../src/segmentedControl/SegmentedControl.tsx"],"sourcesContent":["import classNames from 'classnames';\nimport { createRef, useEffect, useRef, useState } from 'react';\n\nimport Body from '../body';\nimport { Typography } from '../common';\nimport { useInputAttributes } from '../inputs/contexts';\n\ntype SegmentBase = { id: string; label: string; value: string };\n\ntype Segment = SegmentBase & { controls?: never };\ntype SegmentWithControls = SegmentBase & { controls: string };\n\nexport type Segments = readonly Segment[] | readonly SegmentWithControls[];\n\ntype SegmentedControlPropsBase = {\n name: string;\n value: string;\n mode: 'input' | 'view';\n onChange: (value: string) => void;\n};\n\ntype SegmentedControlViewProps = {\n mode: 'view';\n segments: readonly SegmentWithControls[];\n};\n\ntype SegmentedControlInputProps = {\n mode: 'input';\n segments: readonly Segment[];\n};\n\nexport type SegmentedControlProps = SegmentedControlPropsBase &\n (SegmentedControlViewProps | SegmentedControlInputProps);\n\nconst SegmentedControl = ({\n name,\n value,\n mode = 'input',\n segments,\n onChange,\n}: SegmentedControlProps) => {\n const inputAttributes = useInputAttributes({ nonLabelable: true });\n\n const [animate, setAnimate] = useState(false);\n\n const segmentsRef = useRef<HTMLDivElement>(null);\n\n if (segments.length > 3) {\n throw new Error(\n 'SegmentedControl only supports up to 3 segments. Please refer to: https://wise.design/components/segmented-control',\n );\n }\n\n const segmentsWithRefs = segments.map((segment) => ({\n ...segment,\n ref: createRef<HTMLLabelElement | HTMLButtonElement>(),\n }));\n\n const updateSegmentPosition = () => {\n const selectedSegmentRef = segmentsWithRefs.find((segment) => segment.value === value)?.ref;\n\n // We grab the active segments style object from the ref\n // and set the css variables to the selected segments width and x position.\n // This is so we can animate the highlight to the selected segment\n if (selectedSegmentRef?.current && segmentsRef.current) {\n const { style } = segmentsRef.current;\n style.setProperty('--segment-highlight-width', `${selectedSegmentRef.current.offsetWidth}px`);\n style.setProperty('--segment-highlight-x', `${selectedSegmentRef.current.offsetLeft}px`);\n }\n };\n\n useEffect(() => {\n setAnimate(true);\n updateSegmentPosition();\n\n const handleWindowSizeChange = () => {\n setAnimate(false);\n updateSegmentPosition();\n };\n\n window.addEventListener('resize', handleWindowSizeChange);\n return () => {\n window.removeEventListener('resize', handleWindowSizeChange);\n };\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [segmentsWithRefs, value]);\n\n return (\n <div\n ref={segmentsRef}\n data-testid=\"segmented-control\"\n className={classNames('segmented-control', {\n 'segmented-control--input': mode === 'input',\n })}\n >\n <div\n className={classNames('segmented-control__segments', {\n 'segmented-control__segments--no-animate': !animate,\n })}\n role={mode !== 'input' ? 'tablist' : 'group'}\n {...inputAttributes}\n >\n {segmentsWithRefs.map((segment) => {\n const onSelect = () => {\n setAnimate(true);\n onChange(segment.value);\n };\n return mode === 'input' ? (\n <label\n ref={segment.ref as React.MutableRefObject<HTMLLabelElement | null>}\n key={segment.id}\n htmlFor={segment.id}\n className={classNames('segmented-control__segment', {\n 'segmented-control__selected-segment': value === segment.value,\n })}\n >\n <input\n type=\"radio\"\n className=\"segmented-control__radio-input\"\n id={segment.id}\n name={name}\n value={segment.value}\n checked={value === segment.value}\n onChange={onSelect}\n />\n <Body\n className=\"segmented-control__text\"\n as=\"span\"\n type={\n value === segment.value ? Typography.BODY_DEFAULT_BOLD : Typography.BODY_DEFAULT\n }\n >\n {segment.label}\n </Body>\n </label>\n ) : (\n <button\n ref={segment.ref as React.MutableRefObject<HTMLButtonElement | null>}\n key={segment.id}\n type=\"button\"\n role=\"tab\"\n id={segment.id}\n aria-controls={segment.controls}\n aria-selected={value === segment.value}\n className={classNames('segmented-control__segment', 'segmented-control__button', {\n 'segmented-control__selected-segment': value === segment.value,\n })}\n onClick={onSelect}\n >\n <Body\n as=\"span\"\n className=\"segmented-control__text\"\n type={\n value === segment.value ? Typography.BODY_DEFAULT_BOLD : Typography.BODY_DEFAULT\n }\n >\n {segment.label}\n </Body>\n </button>\n );\n })}\n </div>\n </div>\n );\n};\n\nexport default SegmentedControl;\n"],"names":["SegmentedControl","name","value","mode","segments","onChange","inputAttributes","useInputAttributes","nonLabelable","animate","setAnimate","useState","segmentsRef","useRef","length","Error","segmentsWithRefs","map","segment","ref","createRef","updateSegmentPosition","selectedSegmentRef","find","current","style","setProperty","offsetWidth","offsetLeft","useEffect","handleWindowSizeChange","window","addEventListener","removeEventListener","_jsx","className","classNames","children","role","onSelect","_jsxs","htmlFor","id","type","checked","Body","as","Typography","BODY_DEFAULT_BOLD","BODY_DEFAULT","label","controls","onClick"],"mappings":"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"}
1
+ {"version":3,"file":"SegmentedControl.mjs","sources":["../../src/segmentedControl/SegmentedControl.tsx"],"sourcesContent":["import classNames from 'classnames';\nimport { createRef, useEffect, useRef, useState } from 'react';\n\nimport Body from '../body';\nimport { Typography } from '../common';\n\ntype SegmentBase = { id: string; label: string; value: string };\n\ntype Segment = SegmentBase & { controls?: never };\ntype SegmentWithControls = SegmentBase & { controls: string };\n\nexport type Segments = readonly Segment[] | readonly SegmentWithControls[];\n\ntype SegmentedControlPropsBase = {\n name: string;\n value: string;\n mode: 'input' | 'view';\n onChange: (value: string) => void;\n};\n\ntype SegmentedControlViewProps = {\n mode: 'view';\n segments: readonly SegmentWithControls[];\n};\n\ntype SegmentedControlInputProps = {\n mode: 'input';\n segments: readonly Segment[];\n};\n\nexport type SegmentedControlProps = SegmentedControlPropsBase &\n (SegmentedControlViewProps | SegmentedControlInputProps);\n\nconst SegmentedControl = ({\n name,\n value,\n mode = 'input',\n segments,\n onChange,\n}: SegmentedControlProps) => {\n const [animate, setAnimate] = useState(false);\n\n const segmentsRef = useRef<HTMLDivElement>(null);\n\n if (segments.length > 3) {\n throw new Error(\n 'SegmentedControl only supports up to 3 segments. Please refer to: https://wise.design/components/segmented-control',\n );\n }\n\n const segmentsWithRefs = segments.map((segment) => ({\n ...segment,\n ref: createRef<HTMLLabelElement | HTMLButtonElement>(),\n }));\n\n const updateSegmentPosition = () => {\n const selectedSegmentRef = segmentsWithRefs.find((segment) => segment.value === value)?.ref;\n\n // We grab the active segments style object from the ref\n // and set the css variables to the selected segments width and x position.\n // This is so we can animate the highlight to the selected segment\n if (selectedSegmentRef?.current && segmentsRef.current) {\n const { style } = segmentsRef.current;\n style.setProperty('--segment-highlight-width', `${selectedSegmentRef.current.offsetWidth}px`);\n style.setProperty('--segment-highlight-x', `${selectedSegmentRef.current.offsetLeft}px`);\n }\n };\n\n useEffect(() => {\n setAnimate(true);\n updateSegmentPosition();\n\n const handleWindowSizeChange = () => {\n setAnimate(false);\n updateSegmentPosition();\n };\n\n window.addEventListener('resize', handleWindowSizeChange);\n return () => {\n window.removeEventListener('resize', handleWindowSizeChange);\n };\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [segmentsWithRefs, value]);\n\n return (\n <div\n ref={segmentsRef}\n data-testid=\"segmented-control\"\n className={classNames('segmented-control', {\n 'segmented-control--input': mode === 'input',\n })}\n >\n <div\n className={classNames('segmented-control__segments', {\n 'segmented-control__segments--no-animate': !animate,\n })}\n role={mode !== 'input' ? 'tablist' : undefined}\n >\n {segmentsWithRefs.map((segment) => {\n const onSelect = () => {\n setAnimate(true);\n onChange(segment.value);\n };\n return mode === 'input' ? (\n <label\n ref={segment.ref as React.MutableRefObject<HTMLLabelElement | null>}\n key={segment.id}\n htmlFor={segment.id}\n className={classNames('segmented-control__segment', {\n 'segmented-control__selected-segment': value === segment.value,\n })}\n >\n <input\n type=\"radio\"\n className=\"segmented-control__radio-input\"\n id={segment.id}\n name={name}\n value={segment.value}\n checked={value === segment.value}\n onChange={onSelect}\n />\n <Body\n className=\"segmented-control__text\"\n as=\"span\"\n type={\n value === segment.value ? Typography.BODY_DEFAULT_BOLD : Typography.BODY_DEFAULT\n }\n >\n {segment.label}\n </Body>\n </label>\n ) : (\n <button\n ref={segment.ref as React.MutableRefObject<HTMLButtonElement | null>}\n key={segment.id}\n type=\"button\"\n role=\"tab\"\n id={segment.id}\n aria-controls={segment.controls}\n aria-selected={value === segment.value}\n className={classNames('segmented-control__segment', 'segmented-control__button', {\n 'segmented-control__selected-segment': value === segment.value,\n })}\n onClick={onSelect}\n >\n <Body\n as=\"span\"\n className=\"segmented-control__text\"\n type={\n value === segment.value ? Typography.BODY_DEFAULT_BOLD : Typography.BODY_DEFAULT\n }\n >\n {segment.label}\n </Body>\n </button>\n );\n })}\n </div>\n </div>\n );\n};\n\nexport default SegmentedControl;\n"],"names":["SegmentedControl","name","value","mode","segments","onChange","animate","setAnimate","useState","segmentsRef","useRef","length","Error","segmentsWithRefs","map","segment","ref","createRef","updateSegmentPosition","selectedSegmentRef","find","current","style","setProperty","offsetWidth","offsetLeft","useEffect","handleWindowSizeChange","window","addEventListener","removeEventListener","_jsx","className","classNames","children","role","undefined","onSelect","_jsxs","htmlFor","id","type","checked","Body","as","Typography","BODY_DEFAULT_BOLD","BODY_DEFAULT","label","controls","onClick"],"mappings":"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"}
@@ -4755,9 +4755,6 @@ html:not([dir="rtl"]) .np-navigation-option {
4755
4755
  transition: background 300ms;
4756
4756
  color: var(--color-interactive-primary);
4757
4757
  }
4758
- .np-theme-personal .form-group .segmented-control__segment {
4759
- margin-bottom: 0;
4760
- }
4761
4758
  .segmented-control__segment:first-child {
4762
4759
  margin-left: 0;
4763
4760
  }
@@ -60,9 +60,6 @@
60
60
  transition: background 300ms;
61
61
  color: var(--color-interactive-primary);
62
62
  }
63
- .np-theme-personal .form-group .segmented-control__segment {
64
- margin-bottom: 0;
65
- }
66
63
  .segmented-control__segment:first-child {
67
64
  margin-left: 0;
68
65
  }
@@ -1,21 +1,24 @@
1
1
  'use strict';
2
2
 
3
- var contexts = require('../inputs/contexts.js');
3
+ var PropTypes = require('prop-types');
4
4
  var jsxRuntime = require('react/jsx-runtime');
5
5
 
6
- function TabList({
6
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
7
+
8
+ var PropTypes__default = /*#__PURE__*/_interopDefault(PropTypes);
9
+
10
+ const TabList = ({
7
11
  children
8
- }) {
9
- const inputAttributes = contexts.useInputAttributes({
10
- nonLabelable: true
11
- });
12
+ }) => {
12
13
  return /*#__PURE__*/jsxRuntime.jsx("ul", {
13
14
  className: "tabs__tab-list",
14
15
  role: "tablist",
15
- ...inputAttributes,
16
16
  children: children
17
17
  });
18
- }
18
+ };
19
+ TabList.propTypes = {
20
+ children: PropTypes__default.default.oneOfType([PropTypes__default.default.object, PropTypes__default.default.array]).isRequired
21
+ };
19
22
 
20
23
  module.exports = TabList;
21
24
  //# sourceMappingURL=TabList.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TabList.js","sources":["../../src/tabs/TabList.tsx"],"sourcesContent":["import { useInputAttributes } from '../inputs/contexts';\n\nexport interface TabListProps {\n children?: React.ReactNode;\n}\n\nexport default function TabList({ children }: TabListProps) {\n const inputAttributes = useInputAttributes({ nonLabelable: true });\n\n return (\n <ul className=\"tabs__tab-list\" role=\"tablist\" {...inputAttributes}>\n {children}\n </ul>\n );\n}\n"],"names":["TabList","children","inputAttributes","useInputAttributes","nonLabelable","_jsx","className","role"],"mappings":";;;;;AAMc,SAAUA,OAAOA,CAAC;AAAEC,EAAAA,QAAAA;AAAwB,CAAA,EAAA;EACxD,MAAMC,eAAe,GAAGC,2BAAkB,CAAC;AAAEC,IAAAA,YAAY,EAAE,IAAA;AAAM,GAAA,CAAC,CAAA;AAElE,EAAA,oBACEC,cAAA,CAAA,IAAA,EAAA;AAAIC,IAAAA,SAAS,EAAC,gBAAgB;AAACC,IAAAA,IAAI,EAAC,SAAS;AAAA,IAAA,GAAKL,eAAe;AAAAD,IAAAA,QAAA,EAC9DA,QAAAA;AAAQ,GACP,CAAC,CAAA;AAET;;;;"}
1
+ {"version":3,"file":"TabList.js","sources":["../../src/tabs/TabList.js"],"sourcesContent":["import PropTypes from 'prop-types';\n\nconst TabList = ({ children }) => {\n return (\n <ul className=\"tabs__tab-list\" role=\"tablist\">\n {children}\n </ul>\n );\n};\n\nTabList.propTypes = {\n children: PropTypes.oneOfType([PropTypes.object, PropTypes.array]).isRequired,\n};\n\nexport default TabList;\n"],"names":["TabList","children","_jsx","className","role","propTypes","PropTypes","oneOfType","object","array","isRequired"],"mappings":";;;;;;;;;AAEMA,MAAAA,OAAO,GAAGA,CAAC;AAAEC,EAAAA,QAAAA;AAAS,CAAC,KAAK;AAChC,EAAA,oBACEC,cAAA,CAAA,IAAA,EAAA;AAAIC,IAAAA,SAAS,EAAC,gBAAgB;AAACC,IAAAA,IAAI,EAAC,SAAS;AAAAH,IAAAA,QAAA,EAC1CA,QAAAA;AAAQ,GACP,CAAC,CAAA;AAET,EAAC;AAEDD,OAAO,CAACK,SAAS,GAAG;AAClBJ,EAAAA,QAAQ,EAAEK,0BAAS,CAACC,SAAS,CAAC,CAACD,0BAAS,CAACE,MAAM,EAAEF,0BAAS,CAACG,KAAK,CAAC,CAAC,CAACC,UAAAA;AACrE,CAAC;;;;"}
@@ -1,19 +1,18 @@
1
- import { useInputAttributes } from '../inputs/contexts.mjs';
1
+ import PropTypes from 'prop-types';
2
2
  import { jsx } from 'react/jsx-runtime';
3
3
 
4
- function TabList({
4
+ const TabList = ({
5
5
  children
6
- }) {
7
- const inputAttributes = useInputAttributes({
8
- nonLabelable: true
9
- });
6
+ }) => {
10
7
  return /*#__PURE__*/jsx("ul", {
11
8
  className: "tabs__tab-list",
12
9
  role: "tablist",
13
- ...inputAttributes,
14
10
  children: children
15
11
  });
16
- }
12
+ };
13
+ TabList.propTypes = {
14
+ children: PropTypes.oneOfType([PropTypes.object, PropTypes.array]).isRequired
15
+ };
17
16
 
18
17
  export { TabList as default };
19
18
  //# sourceMappingURL=TabList.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"TabList.mjs","sources":["../../src/tabs/TabList.tsx"],"sourcesContent":["import { useInputAttributes } from '../inputs/contexts';\n\nexport interface TabListProps {\n children?: React.ReactNode;\n}\n\nexport default function TabList({ children }: TabListProps) {\n const inputAttributes = useInputAttributes({ nonLabelable: true });\n\n return (\n <ul className=\"tabs__tab-list\" role=\"tablist\" {...inputAttributes}>\n {children}\n </ul>\n );\n}\n"],"names":["TabList","children","inputAttributes","useInputAttributes","nonLabelable","_jsx","className","role"],"mappings":";;;AAMc,SAAUA,OAAOA,CAAC;AAAEC,EAAAA,QAAAA;AAAwB,CAAA,EAAA;EACxD,MAAMC,eAAe,GAAGC,kBAAkB,CAAC;AAAEC,IAAAA,YAAY,EAAE,IAAA;AAAM,GAAA,CAAC,CAAA;AAElE,EAAA,oBACEC,GAAA,CAAA,IAAA,EAAA;AAAIC,IAAAA,SAAS,EAAC,gBAAgB;AAACC,IAAAA,IAAI,EAAC,SAAS;AAAA,IAAA,GAAKL,eAAe;AAAAD,IAAAA,QAAA,EAC9DA,QAAAA;AAAQ,GACP,CAAC,CAAA;AAET;;;;"}
1
+ {"version":3,"file":"TabList.mjs","sources":["../../src/tabs/TabList.js"],"sourcesContent":["import PropTypes from 'prop-types';\n\nconst TabList = ({ children }) => {\n return (\n <ul className=\"tabs__tab-list\" role=\"tablist\">\n {children}\n </ul>\n );\n};\n\nTabList.propTypes = {\n children: PropTypes.oneOfType([PropTypes.object, PropTypes.array]).isRequired,\n};\n\nexport default TabList;\n"],"names":["TabList","children","_jsx","className","role","propTypes","PropTypes","oneOfType","object","array","isRequired"],"mappings":";;;AAEMA,MAAAA,OAAO,GAAGA,CAAC;AAAEC,EAAAA,QAAAA;AAAS,CAAC,KAAK;AAChC,EAAA,oBACEC,GAAA,CAAA,IAAA,EAAA;AAAIC,IAAAA,SAAS,EAAC,gBAAgB;AAACC,IAAAA,IAAI,EAAC,SAAS;AAAAH,IAAAA,QAAA,EAC1CA,QAAAA;AAAQ,GACP,CAAC,CAAA;AAET,EAAC;AAEDD,OAAO,CAACK,SAAS,GAAG;AAClBJ,EAAAA,QAAQ,EAAEK,SAAS,CAACC,SAAS,CAAC,CAACD,SAAS,CAACE,MAAM,EAAEF,SAAS,CAACG,KAAK,CAAC,CAAC,CAACC,UAAAA;AACrE,CAAC;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"Field.d.ts","sourceRoot":"","sources":["../../../src/field/Field.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAUtC,MAAM,MAAM,UAAU,GAAG;IACvB,6IAA6I;IAC7I,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,sGAAsG;IACtG,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,4EAA4E;IAC5E,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,6EAA6E;IAC7E,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,SAAS,CAAC,EAAE,GAAG,SAAS,CAAC,QAAQ,GAAG,SAAS,CAAC,OAAO,GAAG,SAAS,CAAC,QAAQ,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC;IACjG,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B,CAAC;AAEF,eAAO,MAAM,KAAK,4FAQf,UAAU,gCA+CZ,CAAC"}
1
+ {"version":3,"file":"Field.d.ts","sourceRoot":"","sources":["../../../src/field/Field.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAUtC,MAAM,MAAM,UAAU,GAAG;IACvB,6IAA6I;IAC7I,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,sGAAsG;IACtG,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,4EAA4E;IAC5E,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,6EAA6E;IAC7E,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,SAAS,CAAC,EAAE,GAAG,SAAS,CAAC,QAAQ,GAAG,SAAS,CAAC,OAAO,GAAG,SAAS,CAAC,QAAQ,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC;IACjG,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B,CAAC;AAEF,eAAO,MAAM,KAAK,4FAQf,UAAU,gCAiDZ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"InputGroup.d.ts","sourceRoot":"","sources":["../../../src/inputs/InputGroup.tsx"],"names":[],"mappings":"AAsBA,wBAAgB,gBAAgB;;;EAQ/B;AAED,UAAU,eAAe;IACvB,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,mBAAmB,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACtC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;CAChC;AAED,MAAM,WAAW,eAAe;IAC9B,UAAU,CAAC,EAAE,eAAe,CAAC;IAC7B,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B;AAiBD,wBAAgB,UAAU,CAAC,EACzB,UAAU,EACV,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,QAAQ,GACT,EAAE,eAAe,+BAkCjB"}
1
+ {"version":3,"file":"InputGroup.d.ts","sourceRoot":"","sources":["../../../src/inputs/InputGroup.tsx"],"names":[],"mappings":"AAsBA,wBAAgB,gBAAgB;;;EAQ/B;AAED,UAAU,eAAe;IACvB,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,mBAAmB,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACtC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;CAChC;AAED,MAAM,WAAW,eAAe;IAC9B,UAAU,CAAC,EAAE,eAAe,CAAC;IAC7B,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B;AAiBD,wBAAgB,UAAU,CAAC,EACzB,UAAU,EACV,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,QAAQ,GACT,EAAE,eAAe,+BAmBjB"}
@@ -1 +1 @@
1
- {"version":3,"file":"contexts.d.ts","sourceRoot":"","sources":["../../../src/inputs/contexts.tsx"],"names":[],"mappings":"AAGA,eAAO,MAAM,2BAA2B,8CAA+B,CAAC;AAGxE,eAAO,MAAM,sBAAsB,8CAA0B,CAAC;AAG9D,eAAO,MAAM,wBAAwB,8CAAmC,CAAC;AAGzE,eAAO,MAAM,oBAAoB,+CAA+B,CAAC;AAEjE,UAAU,sBAAsB;IAC9B,gLAAgL;IAChL,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,wBAAgB,kBAAkB,CAAC,EAAE,YAAY,EAAE,GAAE,sBAA2B;;;;;EAS/E;AAED,MAAM,WAAW,wBAAwB;IACvC,eAAe,EAAE,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC;CACxD;AAED,wBAAgB,mBAAmB,CAAC,CAAC,SAAS,OAAO,CAAC,wBAAwB,CAAC,EAC7E,SAAS,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,EACjC,IAAI,CAAC,EAAE,sBAAsB;YAEgB,IAAI,CAAC,CAAC,EAAE,MAAM,wBAAwB,CAAC;;EAOrF"}
1
+ {"version":3,"file":"contexts.d.ts","sourceRoot":"","sources":["../../../src/inputs/contexts.tsx"],"names":[],"mappings":"AAGA,eAAO,MAAM,2BAA2B,8CAA+B,CAAC;AAGxE,eAAO,MAAM,sBAAsB,8CAA0B,CAAC;AAG9D,eAAO,MAAM,wBAAwB,8CAAmC,CAAC;AAGzE,eAAO,MAAM,oBAAoB,+CAA+B,CAAC;AAEjE,UAAU,sBAAsB;IAC9B,gLAAgL;IAChL,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,wBAAgB,kBAAkB,CAAC,EAAE,YAAY,EAAE,GAAE,sBAA2B;;;;;EAQ/E;AAED,MAAM,WAAW,wBAAwB;IACvC,eAAe,EAAE,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC;CACxD;AAED,wBAAgB,mBAAmB,CAAC,CAAC,SAAS,OAAO,CAAC,wBAAwB,CAAC,EAC7E,SAAS,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,EACjC,IAAI,CAAC,EAAE,sBAAsB;YAEgB,IAAI,CAAC,CAAC,EAAE,MAAM,wBAAwB,CAAC;;EAOrF"}
@@ -1 +1 @@
1
- {"version":3,"file":"SegmentedControl.d.ts","sourceRoot":"","sources":["../../../src/segmentedControl/SegmentedControl.tsx"],"names":[],"mappings":"AAOA,KAAK,WAAW,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEhE,KAAK,OAAO,GAAG,WAAW,GAAG;IAAE,QAAQ,CAAC,EAAE,KAAK,CAAA;CAAE,CAAC;AAClD,KAAK,mBAAmB,GAAG,WAAW,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC;AAE9D,MAAM,MAAM,QAAQ,GAAG,SAAS,OAAO,EAAE,GAAG,SAAS,mBAAmB,EAAE,CAAC;AAE3E,KAAK,yBAAyB,GAAG;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,OAAO,GAAG,MAAM,CAAC;IACvB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC,CAAC;AAEF,KAAK,yBAAyB,GAAG;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,SAAS,mBAAmB,EAAE,CAAC;CAC1C,CAAC;AAEF,KAAK,0BAA0B,GAAG;IAChC,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,SAAS,OAAO,EAAE,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG,yBAAyB,GAC3D,CAAC,yBAAyB,GAAG,0BAA0B,CAAC,CAAC;AAE3D,QAAA,MAAM,gBAAgB,+CAMnB,qBAAqB,gCA6HvB,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
1
+ {"version":3,"file":"SegmentedControl.d.ts","sourceRoot":"","sources":["../../../src/segmentedControl/SegmentedControl.tsx"],"names":[],"mappings":"AAMA,KAAK,WAAW,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEhE,KAAK,OAAO,GAAG,WAAW,GAAG;IAAE,QAAQ,CAAC,EAAE,KAAK,CAAA;CAAE,CAAC;AAClD,KAAK,mBAAmB,GAAG,WAAW,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC;AAE9D,MAAM,MAAM,QAAQ,GAAG,SAAS,OAAO,EAAE,GAAG,SAAS,mBAAmB,EAAE,CAAC;AAE3E,KAAK,yBAAyB,GAAG;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,OAAO,GAAG,MAAM,CAAC;IACvB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC,CAAC;AAEF,KAAK,yBAAyB,GAAG;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,SAAS,mBAAmB,EAAE,CAAC;CAC1C,CAAC;AAEF,KAAK,0BAA0B,GAAG;IAChC,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,SAAS,OAAO,EAAE,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG,yBAAyB,GAC3D,CAAC,yBAAyB,GAAG,0BAA0B,CAAC,CAAC;AAE3D,QAAA,MAAM,gBAAgB,+CAMnB,qBAAqB,gCA0HvB,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
@@ -1,5 +1,10 @@
1
- export interface TabListProps {
2
- children?: React.ReactNode;
1
+ export default TabList;
2
+ declare function TabList({ children }: {
3
+ children: any;
4
+ }): import("react").JSX.Element;
5
+ declare namespace TabList {
6
+ namespace propTypes {
7
+ let children: any;
8
+ }
3
9
  }
4
- export default function TabList({ children }: TabListProps): import("react").JSX.Element;
5
10
  //# sourceMappingURL=TabList.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"TabList.d.ts","sourceRoot":"","sources":["../../../src/tabs/TabList.tsx"],"names":[],"mappings":"AAEA,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B;AAED,MAAM,CAAC,OAAO,UAAU,OAAO,CAAC,EAAE,QAAQ,EAAE,EAAE,YAAY,+BAQzD"}
1
+ {"version":3,"file":"TabList.d.ts","sourceRoot":"","sources":["../../../src/tabs/TabList.js"],"names":[],"mappings":";AAEA;;gCAMC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@transferwise/components",
3
- "version": "0.0.0-experimental-5d40786",
3
+ "version": "0.0.0-experimental-2932cd5",
4
4
  "description": "Neptune React components",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
@@ -94,12 +94,12 @@
94
94
  "rollup-preserve-directives": "^1.1.1",
95
95
  "storybook": "^8.1.10",
96
96
  "@transferwise/less-config": "3.1.0",
97
- "@transferwise/neptune-css": "0.0.0-experimental-5d40786",
97
+ "@transferwise/neptune-css": "14.12.0",
98
98
  "@wise/components-theming": "1.4.0"
99
99
  },
100
100
  "peerDependencies": {
101
101
  "@transferwise/icons": "^3.7.0",
102
- "@transferwise/neptune-css": "0.0.0-experimental-5d40786",
102
+ "@transferwise/neptune-css": "^14.9.6",
103
103
  "@wise/art": "^2.7.0",
104
104
  "@wise/components-theming": "^1.0.0",
105
105
  "react": ">=18",
@@ -63,12 +63,14 @@ export const Field = ({
63
63
  className,
64
64
  )}
65
65
  >
66
- {label ? (
67
- <label id={labelId} htmlFor={inputId} className="control-label">
66
+ {label != null ? (
67
+ <Label id={labelId} htmlFor={inputId}>
68
68
  {label}
69
- </label>
70
- ) : null}
71
- {children}
69
+ {children}
70
+ </Label>
71
+ ) : (
72
+ children
73
+ )}
72
74
 
73
75
  {message && (
74
76
  <InlineAlert type={sentiment} id={descriptionId}>
@@ -4,6 +4,7 @@ import { Field } from '../field/Field';
4
4
  import { mockResizeObserver, render, screen } from '../test-utils';
5
5
  import { Input } from './Input';
6
6
  import { InputGroup } from './InputGroup';
7
+ import Button from '../button';
7
8
 
8
9
  mockResizeObserver();
9
10
 
@@ -16,11 +17,15 @@ describe('InputGroup', () => {
16
17
  content: <Search size={24} />,
17
18
  initialContentWidth: 24,
18
19
  }}
20
+ addonEnd={{
21
+ content: <Button>Go</Button>,
22
+ interactive: true,
23
+ }}
19
24
  >
20
25
  <Input />
21
26
  </InputGroup>
22
27
  </Field>,
23
28
  );
24
- expect(screen.getAllByRole('group')[0]).toHaveAccessibleName(/^Search…/);
29
+ expect(screen.getByLabelText('Search…')).toHaveRole('textbox');
25
30
  });
26
31
  });
@@ -67,38 +67,23 @@ export function InputGroup({
67
67
  className,
68
68
  children,
69
69
  }: InputGroupProps) {
70
- const inputAttributes = useInputAttributes({ nonLabelable: true });
71
-
72
70
  const [paddingStart, setPaddingStart] = useState(inputPaddingInitialState(addonStart));
73
71
  const [paddingEnd, setPaddingEnd] = useState(inputPaddingInitialState(addonEnd));
74
72
 
75
73
  return (
76
- /* Prevent nested controls from being labeled redundantly */
77
- <FieldLabelIdContextProvider value={undefined}>
78
- <InputIdContextProvider value={undefined}>
79
- <InputDescribedByProvider value={undefined}>
80
- <InputInvalidProvider value={undefined}>
81
- <InputPaddingStartContext.Provider
82
- value={useMemo(() => [paddingStart, setPaddingStart], [paddingStart])}
83
- >
84
- <InputPaddingEndContext.Provider
85
- value={useMemo(() => [paddingEnd, setPaddingEnd], [paddingEnd])}
86
- >
87
- <fieldset
88
- {...inputAttributes}
89
- disabled={disabled}
90
- className={classNames(className, 'np-input-group')}
91
- >
92
- {addonStart != null ? <InputAddon placement="start" {...addonStart} /> : null}
93
- {children}
94
- {addonEnd != null ? <InputAddon placement="end" {...addonEnd} /> : null}
95
- </fieldset>
96
- </InputPaddingEndContext.Provider>
97
- </InputPaddingStartContext.Provider>
98
- </InputInvalidProvider>
99
- </InputDescribedByProvider>
100
- </InputIdContextProvider>
101
- </FieldLabelIdContextProvider>
74
+ <InputPaddingStartContext.Provider
75
+ value={useMemo(() => [paddingStart, setPaddingStart], [paddingStart])}
76
+ >
77
+ <InputPaddingEndContext.Provider
78
+ value={useMemo(() => [paddingEnd, setPaddingEnd], [paddingEnd])}
79
+ >
80
+ <fieldset disabled={disabled} className={classNames(className, 'np-input-group')}>
81
+ {addonStart != null ? <InputAddon placement="start" {...addonStart} /> : null}
82
+ {children}
83
+ {addonEnd != null ? <InputAddon placement="end" {...addonEnd} /> : null}
84
+ </fieldset>
85
+ </InputPaddingEndContext.Provider>
86
+ </InputPaddingStartContext.Provider>
102
87
  );
103
88
  }
104
89
 
@@ -143,22 +128,31 @@ function InputAddon({
143
128
  });
144
129
 
145
130
  return (
146
- <span
147
- ref={ref}
148
- className={classNames(
149
- 'np-input-addon',
150
- {
151
- 'np-input-addon--placement-start': placement === 'start',
152
- 'np-input-addon--placement-end': placement === 'end',
153
- },
154
- interactive && 'np-input-addon--interactive',
155
- {
156
- 'np-input-addon--padding-sm': padding === 'sm',
157
- 'np-input-addon--padding-md': padding === 'md',
158
- },
159
- )}
160
- >
161
- {content}
162
- </span>
131
+ /* Prevent nested controls from being labeled redundantly */
132
+ <FieldLabelIdContextProvider value={undefined}>
133
+ <InputIdContextProvider value={undefined}>
134
+ <InputDescribedByProvider value={undefined}>
135
+ <InputInvalidProvider value={undefined}>
136
+ <span
137
+ ref={ref}
138
+ className={classNames(
139
+ 'np-input-addon',
140
+ {
141
+ 'np-input-addon--placement-start': placement === 'start',
142
+ 'np-input-addon--placement-end': placement === 'end',
143
+ },
144
+ interactive && 'np-input-addon--interactive',
145
+ {
146
+ 'np-input-addon--padding-sm': padding === 'sm',
147
+ 'np-input-addon--padding-md': padding === 'md',
148
+ },
149
+ )}
150
+ >
151
+ {content}
152
+ </span>
153
+ </InputInvalidProvider>
154
+ </InputDescribedByProvider>
155
+ </InputIdContextProvider>
156
+ </FieldLabelIdContextProvider>
163
157
  );
164
158
  }
@@ -11,6 +11,6 @@ describe('SearchInput', () => {
11
11
  <SearchInput />
12
12
  </Field>,
13
13
  );
14
- expect(screen.getAllByRole('group')[0]).toHaveAccessibleName(/^Search…/);
14
+ expect(screen.getByLabelText('Search…')).toHaveRole('searchbox');
15
15
  });
16
16
  });
@@ -214,6 +214,6 @@ describe('SelectInput', () => {
214
214
  <SelectInput items={[{ type: 'option', value: 'USD' }]} value="USD" />
215
215
  </Field>,
216
216
  );
217
- expect(screen.getAllByRole('group')[0]).toHaveAccessibleName(/^Currency/);
217
+ expect(screen.getByLabelText('Currency')).toHaveAttribute('aria-haspopup');
218
218
  });
219
219
  });
@@ -18,10 +18,9 @@ interface UseInputAttributesArgs {
18
18
  }
19
19
 
20
20
  export function useInputAttributes({ nonLabelable }: UseInputAttributesArgs = {}) {
21
- const id = useContext(InputIdContext);
22
21
  const labelId = useContext(FieldLabelIdContext);
23
22
  return {
24
- id: !nonLabelable ? id : undefined,
23
+ id: useContext(InputIdContext),
25
24
  'aria-labelledby': nonLabelable ? labelId : undefined,
26
25
  'aria-describedby': useContext(InputDescribedByContext),
27
26
  'aria-invalid': useContext(InputInvalidContext),
package/src/main.css CHANGED
@@ -4755,9 +4755,6 @@ html:not([dir="rtl"]) .np-navigation-option {
4755
4755
  transition: background 300ms;
4756
4756
  color: var(--color-interactive-primary);
4757
4757
  }
4758
- .np-theme-personal .form-group .segmented-control__segment {
4759
- margin-bottom: 0;
4760
- }
4761
4758
  .segmented-control__segment:first-child {
4762
4759
  margin-left: 0;
4763
4760
  }
@@ -60,9 +60,6 @@
60
60
  transition: background 300ms;
61
61
  color: var(--color-interactive-primary);
62
62
  }
63
- .np-theme-personal .form-group .segmented-control__segment {
64
- margin-bottom: 0;
65
- }
66
63
  .segmented-control__segment:first-child {
67
64
  margin-left: 0;
68
65
  }
@@ -54,10 +54,6 @@
54
54
  cursor: pointer;
55
55
  transition: background 300ms;
56
56
  color: var(--color-interactive-primary);
57
-
58
- .np-theme-personal .form-group & {
59
- margin-bottom: 0;
60
- }
61
57
  }
62
58
 
63
59
  .segmented-control__segment:first-child {
@@ -3,7 +3,6 @@ import React from 'react';
3
3
  import { render, screen, userEvent, waitFor } from '../test-utils';
4
4
 
5
5
  import SegmentedControl, { SegmentedControlProps } from './SegmentedControl';
6
- import { Field } from '../field/Field';
7
6
 
8
7
  const defaultSegments = [
9
8
  {
@@ -189,13 +188,4 @@ describe('SegmentedControl', () => {
189
188
  'SegmentedControl only supports up to 3 segments. Please refer to: https://wise.design/components/segmented-control',
190
189
  );
191
190
  });
192
-
193
- it('supports `Field` for labeling', () => {
194
- render(
195
- <Field label="Label">
196
- <SegmentedControl {...defaultProps} />
197
- </Field>,
198
- );
199
- expect(screen.getAllByRole('group')[0]).toHaveAccessibleName(/^Label/);
200
- });
201
191
  });
@@ -1,18 +1,14 @@
1
- import { Meta, StoryFn, StoryObj } from '@storybook/react';
2
- import React, { useState } from 'react';
1
+ import { StoryFn } from '@storybook/react';
2
+ import React from 'react';
3
3
 
4
4
  import Button from '../button';
5
5
 
6
6
  import SegmentedControl from './SegmentedControl';
7
- import { Field } from '../field/Field';
8
7
 
9
- const meta = {
8
+ export default {
10
9
  component: SegmentedControl,
11
10
  title: 'Forms/SegmentedControl',
12
- } satisfies Meta<typeof SegmentedControl>;
13
-
14
- export default meta;
15
- type Story = StoryObj<typeof meta>;
11
+ };
16
12
 
17
13
  const Template: StoryFn = (args) => {
18
14
  const [segments, setSegments] = React.useState([
@@ -95,37 +91,3 @@ export const SegmentedControlView = {
95
91
  mode: 'view',
96
92
  },
97
93
  };
98
-
99
- export const WithinField = {
100
- args: {
101
- name: 'aSegmentedControl',
102
- mode: 'input',
103
- value: 'cupcakes',
104
- segments: [
105
- { id: 'CUPCAKE', label: 'Cupcakes', value: 'cupcakes' },
106
- { id: 'SPONGECAKE', label: 'Sponge cake', value: 'spongecake' },
107
- { id: 'CARROT_CAKE', label: 'Carrot cake', value: 'carrotcake' },
108
- ],
109
- onChange: () => {},
110
- },
111
- render: function Render({ value: initialValue, onChange, ...args }) {
112
- const [value, setValue] = useState(initialValue);
113
- return (
114
- <SegmentedControl
115
- value={value}
116
- onChange={(nextValue) => {
117
- setValue(nextValue);
118
- onChange?.(nextValue);
119
- }}
120
- {...args}
121
- />
122
- );
123
- },
124
- decorators: [
125
- (Story) => (
126
- <Field label="Label">
127
- <Story />
128
- </Field>
129
- ),
130
- ],
131
- } satisfies Story;