@workday/canvas-kit-docs 16.2.0-0615-next.0 → 16.2.0-0622-next.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.
@@ -412448,7 +412448,7 @@ export const docs = (typeof window !== 'undefined' && window.__docs) ||
412448
412448
  {
412449
412449
  "name": "Select",
412450
412450
  "fileName": "/home/runner/work/canvas-kit/canvas-kit/modules/react/select/lib/Select.tsx",
412451
- "description": "Use `Select` to allow users to choose an option from a list or type characters to select a matching option.\n\n**Note: `Select` must wrap `FormField` and `FormField` must wrap all `Select` children to ensure proper accessibility. **\n\n```tsx\n<Select items={options}>\n <FormField label=\"Your Label\">\n <Select.Input onChange={e => handleChange(e)} id=\"contact-select\" />\n <Select.Popper>\n <Select.Card>\n <Select.List>\n {item => <Select.Item>{item.id}</Select.Item>}\n </Select.List>\n </Select.Card>\n </Select.Popper>\n </FormField>\n</Select>\n```",
412451
+ "description": "Use `Select` to allow users to choose an option from a list or type characters to select a matching option.\n\n**Note: Wrap `Select` with `FormField` and compose `FormField.Input as={Select.Input}` so the combobox receives the field label.**\n\n```tsx\n<FormField>\n <FormField.Label>Contact</FormField.Label>\n <FormField.Field>\n <Select items={options}>\n <FormField.Input as={Select.Input} onChange={e => handleChange(e)} />\n <Select.Popper>\n <Select.Card>\n <Select.List>{item => <Select.Item>{item}</Select.Item>}</Select.List>\n </Select.Card>\n </Select.Popper>\n </Select>\n </FormField.Field>\n</FormField>\n```",
412452
412452
  "declarations": [
412453
412453
  {
412454
412454
  "name": "Select",
@@ -412536,7 +412536,7 @@ export const docs = (typeof window !== 'undefined' && window.__docs) ||
412536
412536
  {
412537
412537
  "name": "Input",
412538
412538
  "symbol": "SelectInput",
412539
- "description": "`Select.Input` renders a {@link ComboboxMenu Combobox.Input} that handles keyboard navigation and interaction defined by [WAI](https://www.w3.org/WAI/ARIA/apg/patterns/combobox/examples/combobox-select-only/).\nThis component can either be [controlled or uncontrolled](https://react.dev/learn/sharing-state-between-components#controlled-and-uncontrolled-components).\n\n```tsx\n<Select items={options}>\n <FormField label=\"Contact\">\n <Select.Input onChange={(event) => handleChange(event)}>\n ...\n </FormField>\n</Select>\n```",
412539
+ "description": "`Select.Input` renders a {@link ComboboxMenu Combobox.Input} that handles keyboard navigation and interaction defined by [WAI](https://www.w3.org/WAI/ARIA/apg/patterns/combobox/examples/combobox-select-only/).\nThis component can either be [controlled or uncontrolled](https://react.dev/learn/sharing-state-between-components#controlled-and-uncontrolled-components).\n\nCompose it as `FormField.Input as={Select.Input}` so label, required, and error wiring apply.\n\n```tsx\n<FormField>\n <FormField.Label>Contact</FormField.Label>\n <FormField.Field>\n <Select items={options}>\n <FormField.Input as={Select.Input} onChange={event => handleChange(event)} />\n ...\n </Select>\n </FormField.Field>\n</FormField>\n```",
412540
412540
  "declarations": [
412541
412541
  {
412542
412542
  "name": "Input",
@@ -412552,7 +412552,7 @@ export const docs = (typeof window !== 'undefined' && window.__docs) ||
412552
412552
  {
412553
412553
  "name": "Card",
412554
412554
  "symbol": "SelectCard",
412555
- "description": "`Select.Card` renders a {@link ComboboxCard Combobox.Card}. You have access to all `Card` props.\n\n**Note: The card will be the width of its corresponding `Select.Input`**.\n\n```tsx\n<Select items={options}>\n <FormField label=\"Your Label\">\n <Select.Input onChange={(event) => handleChange(event)}>\n <Select.Popper>\n <Select.Card>\n ...\n </Select.Card>\n </Select.Popper>\n </FormField>\n</Select>\n```",
412555
+ "description": "`Select.Card` renders a {@link ComboboxCard Combobox.Card}. You have access to all `Card` props.\n\n**Note: The card will be the width of its corresponding `Select.Input`**.\n\n```tsx\n<FormField>\n <FormField.Label>Contact</FormField.Label>\n <FormField.Field>\n <Select items={options}>\n <FormField.Input as={Select.Input} onChange={event => handleChange(event)} />\n <Select.Popper>\n <Select.Card>...</Select.Card>\n </Select.Popper>\n </Select>\n </FormField.Field>\n</FormField>\n```",
412556
412556
  "declarations": [
412557
412557
  {
412558
412558
  "name": "Card",
@@ -412568,7 +412568,7 @@ export const docs = (typeof window !== 'undefined' && window.__docs) ||
412568
412568
  {
412569
412569
  "name": "Item",
412570
412570
  "symbol": "SelectItem",
412571
- "description": "`Select.Item` renders a {@link ComboboxMenuItem Combobox.Menu.Item} with aria role of `option`. You can optionally render a `Icon`.\n\n```tsx\n<Select items={options}>\n <FormField label=\"Your Label\">\n <Select.Input onChange={(event) => handleChange(event)}>\n <Select.Popper>\n <Select.Card>\n <Select.List>\n {(item) => <Select.Item><Select.Item.Icon icon={icon} />{item}</Select.Item>}\n </Select.List\n </Select.Card>\n </Select.Popper>\n </FormField>\n</Select>\n```",
412571
+ "description": "`Select.Item` renders a {@link ComboboxMenuItem Combobox.Menu.Item} with aria role of `option`. You can optionally render a `Icon`.\n\n```tsx\n<FormField>\n <FormField.Label>Contact</FormField.Label>\n <FormField.Field>\n <Select items={options}>\n <FormField.Input as={Select.Input} onChange={event => handleChange(event)} />\n <Select.Popper>\n <Select.Card>\n <Select.List>\n {item => (\n <Select.Item>\n <Select.Item.Icon icon={icon} />\n {item}\n </Select.Item>\n )}\n </Select.List>\n </Select.Card>\n </Select.Popper>\n </Select>\n </FormField.Field>\n</FormField>\n```",
412572
412572
  "declarations": [
412573
412573
  {
412574
412574
  "name": "Item",
@@ -7077,6 +7077,68 @@ module.exports = {specifications: [
7077
7077
  }
7078
7078
  ]
7079
7079
  },
7080
+ {
7081
+ "type": "file",
7082
+ "name": "Toolbar",
7083
+ "children": [
7084
+ {
7085
+ "type": "describe",
7086
+ "name": "Toolbar",
7087
+ "children": [
7088
+ {
7089
+ "type": "describe",
7090
+ "name": "given the Text Formatting toolbar is rendered",
7091
+ "children": [
7092
+ {
7093
+ "type": "it",
7094
+ "name": "should not have any axe errors"
7095
+ },
7096
+ {
7097
+ "type": "describe",
7098
+ "name": "when focus is on the Text Style select",
7099
+ "children": [
7100
+ {
7101
+ "type": "it",
7102
+ "name": "should move focus through the toolbar with the arrow keys"
7103
+ },
7104
+ {
7105
+ "type": "describe",
7106
+ "name": "when the down arrow key is pressed",
7107
+ "children": [
7108
+ {
7109
+ "type": "it",
7110
+ "name": "should show the text style options"
7111
+ }
7112
+ ]
7113
+ }
7114
+ ]
7115
+ },
7116
+ {
7117
+ "type": "describe",
7118
+ "name": "when the Bold button is clicked",
7119
+ "children": [
7120
+ {
7121
+ "type": "it",
7122
+ "name": "should toggle the button on"
7123
+ }
7124
+ ]
7125
+ },
7126
+ {
7127
+ "type": "describe",
7128
+ "name": "when the Link button is clicked",
7129
+ "children": [
7130
+ {
7131
+ "type": "it",
7132
+ "name": "should open the link dialog with its text fields"
7133
+ }
7134
+ ]
7135
+ }
7136
+ ]
7137
+ }
7138
+ ]
7139
+ }
7140
+ ]
7141
+ },
7080
7142
  {
7081
7143
  "type": "file",
7082
7144
  "name": "Tooltip",
@@ -18,11 +18,11 @@ export const packageJSONFile = `{
18
18
  "@emotion/react": "11.11.4",
19
19
  "@types/react": "18.2.60",
20
20
  "@types/react-dom": "18.2.19",
21
- "@workday/canvas-kit-labs-react": "16.1.3",
22
- "@workday/canvas-kit-preview-react": "16.1.3",
23
- "@workday/canvas-kit-react": "16.1.3",
24
- "@workday/canvas-kit-react-fonts": "^16.1.3",
25
- "@workday/canvas-kit-styling": "16.1.3",
21
+ "@workday/canvas-kit-labs-react": "16.1.5",
22
+ "@workday/canvas-kit-preview-react": "16.1.5",
23
+ "@workday/canvas-kit-react": "16.1.5",
24
+ "@workday/canvas-kit-react-fonts": "^16.1.5",
25
+ "@workday/canvas-kit-styling": "16.1.5",
26
26
  "@workday/canvas-system-icons-web": "^5.0.3",
27
27
  "@workday/canvas-expressive-icons-web": "1.0.1",
28
28
  "@workday/canvas-tokens-web": "4.4.0-beta.11"
@@ -19,11 +19,11 @@ export const packageJSONFile = `{
19
19
  "@emotion/react": "11.11.4",
20
20
  "@types/react": "18.2.60",
21
21
  "@types/react-dom": "18.2.19",
22
- "@workday/canvas-kit-labs-react": "16.1.3",
23
- "@workday/canvas-kit-preview-react": "16.1.3",
24
- "@workday/canvas-kit-react": "16.1.3",
25
- "@workday/canvas-kit-react-fonts": "^16.1.3",
26
- "@workday/canvas-kit-styling": "16.1.3",
22
+ "@workday/canvas-kit-labs-react": "16.1.5",
23
+ "@workday/canvas-kit-preview-react": "16.1.5",
24
+ "@workday/canvas-kit-react": "16.1.5",
25
+ "@workday/canvas-kit-react-fonts": "^16.1.5",
26
+ "@workday/canvas-kit-styling": "16.1.5",
27
27
  "@workday/canvas-system-icons-web": "^5.0.3",
28
28
  "@workday/canvas-expressive-icons-web": "1.0.1",
29
29
  "@workday/canvas-tokens-web": "4.4.0-beta.11"
@@ -0,0 +1,54 @@
1
+ import {ExampleCodeBlock, Specifications, SymbolDoc} from '@workday/canvas-kit-docs';
2
+ import TextFormattingToolbar from './examples/TextFormattingToolbar';
3
+
4
+
5
+ # Canvas Kit Toolbar
6
+
7
+ Canvas Kit does not ship a Toolbar component. Build one by composing
8
+ [`ToolbarIconButton`](?path=/docs/components-buttons--docs),
9
+ [Select](?path=/docs/components-inputs-select--docs),
10
+ [Tooltip](?path=/docs/components-popups-tooltip--docs), and
11
+ [Dialog](?path=/docs/components-popups-dialog--docs) inside a group that uses the
12
+ [collection system](?path=/docs/features-collections--docs) for keyboard navigation.
13
+
14
+ The example below follows the
15
+ [W3C Toolbar pattern](https://www.w3.org/WAI/ARIA/apg/patterns/toolbar/): one tab stop for the
16
+ group, and arrow keys to move between controls.
17
+
18
+ ## Basic Example
19
+
20
+ The Text Formatting toolbar is a horizontal group of five controls:
21
+
22
+ 1. **Text Style** — a `Select` with Normal Text, Heading 1, Heading 2, and Heading 3. Normal Text
23
+ starts selected.
24
+ 2. **Bold, Italic, and Underline** — `ToolbarIconButton` toggles. `toggled` sets `aria-pressed`. The
25
+ example adds a brand border while a toggle is on, on top of the button's pressed background.
26
+ 3. **Insert Link** — a `ToolbarIconButton` used as `Dialog.Target`. The dialog is non-modal and
27
+ contains Link Text and URL fields. Focus moves to Link Text when it opens.
28
+
29
+ Each control is the single child of a `Tooltip`. The default tooltip type is `label`, so the `title`
30
+ becomes that control's accessible name. Do not also set `aria-label` on the control.
31
+
32
+ The group itself is named with `aria-label="Text Formatting"` on an element with `role="toolbar"`.
33
+
34
+ Keyboard movement comes from `useListModel` with `orientation="horizontal"` and
35
+ `navigation={navigationManager}`. `navigationManager` stops at the first and last control instead of
36
+ wrapping. Each control registers with `useListItemRovingFocus` and `useListItemRegister`, which
37
+ keeps a single tab stop and moves it with the arrow keys. Give every control a stable `data-id`.
38
+
39
+ The Text Style `Select` has its own arrow-key behavior. Left and Right move through the toolbar only
40
+ while its menu is closed. While the menu is open, Left and Right do nothing, and Home and End move
41
+ within the menu.
42
+
43
+ <ExampleCodeBlock code={TextFormattingToolbar} />
44
+
45
+ ## Component API
46
+
47
+ `ToolbarIconButton` is the icon button used inside the example. The toolbar container, roving tab
48
+ stop, and link dialog are composed in the example. They are not separate exported components.
49
+
50
+ <SymbolDoc name="ToolbarIconButton" fileName="/react/" />
51
+
52
+ ## Specifications
53
+
54
+ <Specifications file="./cypress/component/Toolbar.spec.tsx" name="Toolbar" />
@@ -0,0 +1,172 @@
1
+ import React from 'react';
2
+
3
+ import {
4
+ PrimaryButton,
5
+ ToolbarIconButton,
6
+ ToolbarIconButtonProps,
7
+ } from '@workday/canvas-kit-react/button';
8
+ import {
9
+ navigationManager,
10
+ useListItemRegister,
11
+ useListItemRovingFocus,
12
+ useListModel,
13
+ } from '@workday/canvas-kit-react/collection';
14
+ import {
15
+ composeHooks,
16
+ createContainer,
17
+ createSubcomponent,
18
+ useUniqueId,
19
+ } from '@workday/canvas-kit-react/common';
20
+ import {Dialog, useDialogModel} from '@workday/canvas-kit-react/dialog';
21
+ import {FormField} from '@workday/canvas-kit-react/form-field';
22
+ import {Select, useSelectModel} from '@workday/canvas-kit-react/select';
23
+ import {TextInput} from '@workday/canvas-kit-react/text-input';
24
+ import {Tooltip} from '@workday/canvas-kit-react/tooltip';
25
+ import {CSProps, createStyles, handleCsProp} from '@workday/canvas-kit-styling';
26
+ import {boldIcon, italicsIcon, linkIcon, underlineIcon} from '@workday/canvas-system-icons-web';
27
+ import {system} from '@workday/canvas-tokens-web';
28
+
29
+ const textStyles = [
30
+ {id: 'normal', text: 'Normal Text'},
31
+ {id: 'heading-1', text: 'Heading 1'},
32
+ {id: 'heading-2', text: 'Heading 2'},
33
+ {id: 'heading-3', text: 'Heading 3'},
34
+ ];
35
+
36
+ const toolbarStyles = createStyles({
37
+ display: 'flex',
38
+ alignItems: 'center',
39
+ gap: system.gap.sm,
40
+ padding: system.padding.sm,
41
+ });
42
+
43
+ const toggledToolbarButtonStyles = createStyles({
44
+ "&[aria-pressed='true'], &[aria-pressed='true']:hover, &[aria-pressed='true']:active, &[aria-pressed='true']:focus-visible":
45
+ {
46
+ borderColor: system.color.brand.border.primary,
47
+ },
48
+ });
49
+
50
+ const useToolbarItem = composeHooks(useListItemRovingFocus, useListItemRegister);
51
+
52
+ const Toolbar = createContainer('div')({
53
+ displayName: 'TextFormattingToolbar',
54
+ modelHook: useListModel,
55
+ })<CSProps>((elemProps, Element) => {
56
+ return (
57
+ <Element
58
+ {...handleCsProp(elemProps, toolbarStyles)}
59
+ role="toolbar"
60
+ aria-label="Text Formatting"
61
+ />
62
+ );
63
+ });
64
+
65
+ const ToolbarButton = createSubcomponent(ToolbarIconButton)({
66
+ displayName: 'TextFormattingToolbar.Button',
67
+ modelHook: useListModel,
68
+ elemPropsHook: useToolbarItem,
69
+ })<ToolbarIconButtonProps>((elemProps, Element) => {
70
+ return <Element {...elemProps} />;
71
+ });
72
+
73
+ const TextStyleSelect = ({toolbarModel}: {toolbarModel: ReturnType<typeof useListModel>}) => {
74
+ const selectModel = useSelectModel({
75
+ items: textStyles,
76
+ initialSelectedIds: ['normal'],
77
+ });
78
+ const {onKeyDown: onToolbarKeyDown, ...toolbarItemProps} = useToolbarItem(toolbarModel, {
79
+ 'data-id': 'text-style',
80
+ });
81
+
82
+ return (
83
+ <Select model={selectModel}>
84
+ <Tooltip title="Text Style">
85
+ <Select.Input
86
+ {...toolbarItemProps}
87
+ onKeyDown={event => {
88
+ if (selectModel.state.visibility === 'hidden') {
89
+ onToolbarKeyDown(event);
90
+ }
91
+ }}
92
+ />
93
+ </Tooltip>
94
+ <Select.Popper>
95
+ <Select.Card>
96
+ <Select.List>{item => <Select.Item>{item.text}</Select.Item>}</Select.List>
97
+ </Select.Card>
98
+ </Select.Popper>
99
+ </Select>
100
+ );
101
+ };
102
+
103
+ export default () => {
104
+ const toolbarModel = useListModel({
105
+ orientation: 'horizontal',
106
+ navigation: navigationManager,
107
+ });
108
+ const linkButtonId = useUniqueId();
109
+ const linkTextRef = React.useRef<HTMLInputElement>(null);
110
+ const dialogModel = useDialogModel({initialFocusRef: linkTextRef});
111
+ const [formats, setFormats] = React.useState({
112
+ bold: false,
113
+ italic: false,
114
+ underline: false,
115
+ });
116
+
117
+ return (
118
+ <Toolbar model={toolbarModel}>
119
+ <TextStyleSelect toolbarModel={toolbarModel} />
120
+ <Tooltip title="Bold">
121
+ <ToolbarButton
122
+ cs={toggledToolbarButtonStyles}
123
+ data-id="bold"
124
+ icon={boldIcon}
125
+ toggled={formats.bold}
126
+ onClick={() => setFormats(formats => ({...formats, bold: !formats.bold}))}
127
+ />
128
+ </Tooltip>
129
+ <Tooltip title="Italic">
130
+ <ToolbarButton
131
+ cs={toggledToolbarButtonStyles}
132
+ data-id="italic"
133
+ icon={italicsIcon}
134
+ toggled={formats.italic}
135
+ onClick={() => setFormats(formats => ({...formats, italic: !formats.italic}))}
136
+ />
137
+ </Tooltip>
138
+ <Tooltip title="Underline">
139
+ <ToolbarButton
140
+ cs={toggledToolbarButtonStyles}
141
+ data-id="underline"
142
+ icon={underlineIcon}
143
+ toggled={formats.underline}
144
+ onClick={() => setFormats(formats => ({...formats, underline: !formats.underline}))}
145
+ />
146
+ </Tooltip>
147
+ <Dialog model={dialogModel}>
148
+ <Tooltip title="Insert Link">
149
+ <Dialog.Target as={ToolbarButton} id={linkButtonId} data-id="link" icon={linkIcon} />
150
+ </Tooltip>
151
+ <Dialog.Popper>
152
+ <Dialog.Card aria-labelledby={linkButtonId}>
153
+ <Dialog.Body>
154
+ <FormField>
155
+ <FormField.Label>Link Text</FormField.Label>
156
+ <FormField.Input as={TextInput} ref={linkTextRef} />
157
+ </FormField>
158
+ <FormField>
159
+ <FormField.Label>URL</FormField.Label>
160
+ <FormField.Input as={TextInput} type="url" />
161
+ </FormField>
162
+ </Dialog.Body>
163
+ <Dialog.ButtonGroup>
164
+ <Dialog.CloseButton>Cancel</Dialog.CloseButton>
165
+ <Dialog.CloseButton as={PrimaryButton}>Apply</Dialog.CloseButton>
166
+ </Dialog.ButtonGroup>
167
+ </Dialog.Card>
168
+ </Dialog.Popper>
169
+ </Dialog>
170
+ </Toolbar>
171
+ );
172
+ };
@@ -1,9 +1,4 @@
1
- import {
2
- ExampleCodeBlock,
3
- Specifications,
4
- SymbolDoc,
5
- } from '@workday/canvas-kit-docs';
6
- import {Table} from '@workday/canvas-kit-react/table';
1
+ import {ExampleCodeBlock, Specifications, SymbolDoc} from '@workday/canvas-kit-docs';
7
2
  import Basic from './examples/Basic';
8
3
  import Caution from './examples/Caution';
9
4
  import Complex from './examples/Complex';
@@ -40,30 +35,16 @@ yarn add @workday/canvas-kit-react
40
35
 
41
36
  ### Basic Example
42
37
 
43
- `Select` supports a
44
- [dynamic API](/get-started/for-developers/guides/collection-api/#dynamic-items) where you
45
- pass an array of items via the `items` prop and provide a render function to display the items. The
46
- items may be provided as an
38
+ `Select` supports a [dynamic API](/get-started/for-developers/guides/collection-api/#dynamic-items)
39
+ where you pass an array of items via the `items` prop and provide a render function to display the
40
+ items. The items may be provided as an
47
41
  [array of strings](/get-started/for-developers/guides/collection-api/#array-of-strings) or an
48
42
  [array of objects](/get-started/for-developers/guides/collection-api/#array-of-objects).
49
43
 
50
- `Select` should be used in tandem with [Form Field](/components/inputs/form-field/) where the
51
- `Select` wraps the `FormField` element and the `FormField` element wraps the children of `Select` to
52
- meet accessibility standards. This ensures the `label` text from `FormField` is attached to the
53
- `Select.Input` and read out as a group for voiceover.
54
-
55
- ```tsx
56
- <Select items={options}>
57
- <FormField label="Your Label">
58
- <Select.Input onChange={e => handleChange(e)} id="contact-select" />
59
- <Select.Popper>
60
- <Select.Card>
61
- <Select.List>{item => <Select.Item>{item.id}</Select.Item>}</Select.List>
62
- </Select.Card>
63
- </Select.Popper>
64
- </FormField>
65
- </Select>
66
- ```
44
+ `Select` should be used in tandem with [Form Field](/components/inputs/form-field/) to ensure proper
45
+ label association and screen reader support. Wrap **`Select`** with **`FormField`**, and compose
46
+ **`FormField.Input as={Select.Input}`** so the combobox receives the field label. Include
47
+ **`Select.Popper`**, **`Select.Card`**, **`Select.List`**, and **`Select.Item`**.
67
48
 
68
49
  <ExampleCodeBlock code={Basic} />
69
50
 
@@ -96,14 +77,15 @@ input component. By default, the orientation will be set to `vertical`.
96
77
 
97
78
  ### Required
98
79
 
99
- Set the `required` prop of the wrapping `FormField` to `true` to indicate that the field is
80
+ Set the `isRequired` prop of the wrapping `FormField` to `true` to indicate that the field is
100
81
  required. Labels for required fields are suffixed by a red asterisk.
101
82
 
102
83
  <ExampleCodeBlock code={Required} />
103
84
 
104
85
  ### Disabled
105
86
 
106
- Set the `disabled` prop of `Select.Input` to prevent users from interacting with it.
87
+ Set the `disabled` prop on **`FormField.Input as={Select.Input}`** to prevent users from interacting
88
+ with the combobox.
107
89
 
108
90
  <ExampleCodeBlock code={Disabled} />
109
91
 
@@ -129,20 +111,21 @@ sets `aria-disabled` for the disabled items.
129
111
  Use `Select.Item.Icon` to render an icon for a `Select.Item`. The `icon` prop for `Select.Item.Icon`
130
112
  accepts [system icons](/assets/system-icons/) from `@workday/canvas-system-icons-web`.
131
113
 
132
- In order to render the icon for the selected item in the `Select.Input`:
114
+ In order to render the icon for the selected item on **`FormField.Input as={Select.Input}`**:
133
115
 
134
116
  1. Obtain a reference to the `model` by registering your `items` with `useSelectModel`.
135
117
  2. Get the selected item:
136
118
  `const selectedItem = model.navigation.getItem(model.state.selectedIds[0], model)`
137
119
  3. Pass the icon for the selected item to the input:
138
- `<Select.Input inputStartIcon={selectedItem.value.icon}>`
120
+ `<FormField.Input as={Select.Input} inputStartIcon={selectedItem?.value.icon} />`
139
121
 
140
- > **Note: `data-id` on `Select.Item` must match the `id` property in your array of objects. This
141
- > ensures proper keyboard handling and type-ahead.**
122
+ > **Note:** Dynamic `{item => <Select.Item>}` registration already uses the collection `id`. Set
123
+ > **`data-id`** only on static **`Select.Item`** children (see [Grouped Items](#grouped-items)), and
124
+ > keep it equal to that id (`id` or **`getId`**).
142
125
 
143
126
  <ExampleCodeBlock code={WithIcons} />
144
127
 
145
- **Note: that `Select.Input` will only render an icon if an item is selected.**
128
+ **Note: that `FormField.Input as={Select.Input}` will only render an icon if an item is selected.**
146
129
 
147
130
  ### Grow
148
131
 
@@ -167,23 +150,10 @@ forward `ref` to its underlying `<input type="text" role="combobox">` element.
167
150
 
168
151
  ### Error States
169
152
 
170
- Set the `error` prop of the wrapping `FormField` to `"caution"` or `"error"` to set the `Select` to
171
- the caution or error state, respectively. You will also need to set the `hintId` and `hintText`
172
- props on the `FormField` to meet accessibility standards. You must set an `id` attribute on the
173
- `Select.Input` element that matches the value of `inputId` set on the `FormField` element. These
174
- attributes ensure that the caution message is associated to the `Select` and read out by voiceover.
175
-
176
- **Note: The Select container component, `Select`, must wrap `FormField` to ensure `Select.Input` is
177
- styled correctly.**
178
-
179
- ```tsx
180
- <Select items={options}>
181
- <FormField label="Contact" inputId="contact-id-formfield">
182
- <Select.Input id="contact-id-formfield" />
183
- ...
184
- </FormField>
185
- </Select>
186
- ```
153
+ Form Field provides error and caution states for Select. Set the `error` prop on Form Field to
154
+ `"error"` or `"caution"` and use `FormField.Hint` to provide messages. See
155
+ [Form Field's Error documentation](/components/inputs/form-field/#error-states) for examples and
156
+ accessibility guidance.
187
157
 
188
158
  #### Caution
189
159
 
@@ -205,8 +175,9 @@ You can set `initialSelectedIds` to the value that you want initially selected.
205
175
 
206
176
  ### Placeholder
207
177
 
208
- You can change the placeholder text by passing in a string value to the `placeholder` attribute on
209
- the `Select.Input`.
178
+ You can change the placeholder text by passing a string to the `placeholder` prop on
179
+ **`FormField.Input as={Select.Input}`**. Placeholder text is not a substitute for
180
+ **`FormField.Label`**.
210
181
 
211
182
  <ExampleCodeBlock code={Placeholder} />
212
183
 
@@ -232,8 +203,9 @@ to `id` and `text` hence the usage of `getId` and `getTextValue`. If your object
232
203
  <ExampleCodeBlock code={Complex} />
233
204
 
234
205
  **Note: By default, the identifier and text value are `id` and `text` properties respectively. If
235
- your data object for each item is different, provide a `getId` or `getTextValue` function to the
236
- model config. For example:**
206
+ your data object for each item is different, provide `getId` and/or `getTextValue`. If a custom
207
+ `getId` does not return the display text, also pass `getTextValue` — otherwise the model uses
208
+ `getId` for type-ahead and the selected value. For example:**
237
209
 
238
210
  ```jsx
239
211
  const items = [
@@ -265,20 +237,24 @@ prop as well as the `value` DOM property and will update the model accordingly.
265
237
  `items`, do not override this function. Instead provide static items via JSX. the list will create
266
238
  an internal array of items where `id` is the only property and the default `getId` will return the
267
239
  desired result. **Note: If your array of objects has a different property for `id`, like
268
- `serverId`, use this function to set the id.**
240
+ `serverId`, use this function to set the id. If that function does not return the display text,
241
+ also pass `getTextValue`.**
269
242
 
270
243
  ```tsx
271
244
  const options = [{text: 'Pizza', serverId: 'pizza-1'}, {text: 'Cheeseburger', serverId: 'cheeseburger'}]
272
- <Select items={options} getId={(item) => item.serverId}>
273
- <FormField label="Your Label">
274
- <Select.Input onChange={e => handleChange(e)} id="contact-select" />
275
- <Select.Popper>
276
- <Select.Card>
277
- <Select.List>{item => <Select.Item>{item.text}</Select.Item>}</Select.List>
278
- </Select.Card>
279
- </Select.Popper>
280
- </FormField>
281
- </Select>
245
+ <FormField>
246
+ <FormField.Label>Your Label</FormField.Label>
247
+ <FormField.Field>
248
+ <Select items={options} getId={(item) => item.serverId} getTextValue={(item) => item.text}>
249
+ <FormField.Input as={Select.Input} onChange={e => handleChange(e)} />
250
+ <Select.Popper>
251
+ <Select.Card>
252
+ <Select.List>{item => <Select.Item>{item.text}</Select.Item>}</Select.List>
253
+ </Select.Card>
254
+ </Select.Popper>
255
+ </Select>
256
+ </FormField.Field>
257
+ </FormField>
282
258
  ```
283
259
 
284
260
  - `getTextValue`: Optional function to return the text representation of an item. If not provided,
@@ -289,21 +265,25 @@ prop as well as the `value` DOM property and will update the model accordingly.
289
265
 
290
266
  ```tsx
291
267
  const options = [{label: 'Pizza', id: 'pizza-1'}, {label: 'Cheeseburger', id: 'cheeseburger'}]
292
- <Select items={options} getTextValue={(item) => item.label}>
293
- <FormField label="Your Label">
294
- <Select.Input onChange={e => handleChange(e)} id="contact-select" />
295
- <Select.Popper>
296
- <Select.Card>
297
- <Select.List>{item => <Select.Item>{item.label}</Select.Item>}</Select.List>
298
- </Select.Card>
299
- </Select.Popper>
300
- </FormField>
301
- </Select>
268
+ <FormField>
269
+ <FormField.Label>Your Label</FormField.Label>
270
+ <FormField.Field>
271
+ <Select items={options} getTextValue={(item) => item.label}>
272
+ <FormField.Input as={Select.Input} onChange={e => handleChange(e)} />
273
+ <Select.Popper>
274
+ <Select.Card>
275
+ <Select.List>{item => <Select.Item>{item.label}</Select.Item>}</Select.List>
276
+ </Select.Card>
277
+ </Select.Popper>
278
+ </Select>
279
+ </FormField.Field>
280
+ </FormField>
302
281
  ```
303
282
 
304
283
  ### Grouped Items
305
284
 
306
- In order to group items, you have to use the static API in combination of the `Menu.Group` component.
285
+ In order to group items, use the static item API with **`Menu.Group`** inside **`Select.List`**, and
286
+ still pass **`items`** whose ids match each **`Select.Item`** **`data-id`**.
307
287
 
308
288
  <ExampleCodeBlock code={GroupedItems} />
309
289
 
@@ -313,6 +293,188 @@ Select and its subcomponents support custom styling via the `cs` prop. For more
313
293
  our
314
294
  ["How To Customize Styles"](https://workday.github.io/canvas-kit/?path=/docs/styling-guides-customizing-styles--docs).
315
295
 
296
+ ## Accessibility
297
+
298
+ The primary accessibility goal for `Select` is a visible, persistent label and a single choice from
299
+ a known list that assistive technology identifies as a combobox. Use **`Select`** when the user must
300
+ pick one option. For multiple selections, use [**MultiSelect**](/docs/preview-multiselect--docs).
301
+ For a value outside a fixed list, use [**Combobox**](/features/combobox/). See
302
+ [FormField's accessibility documentation](/components/inputs/form-field/#accessibility) for label,
303
+ hint, error, and required wiring. This follows the WAI-ARIA
304
+ [Select-Only Combobox](https://www.w3.org/WAI/ARIA/apg/patterns/combobox/examples/combobox-select-only/)
305
+ pattern.
306
+
307
+ ### Minimum Accessible Structure
308
+
309
+ Build on the [Basic Example](#basic-example): label first, then **`Select`** inside
310
+ **`FormField.Field`**, with the combobox, popup, list, and items in this order.
311
+
312
+ ```tsx
313
+ import {FormField} from '@workday/canvas-kit-react/form-field';
314
+ import {Select} from '@workday/canvas-kit-react/select';
315
+
316
+ const options = ['E-mail', 'Phone', 'Fax'];
317
+
318
+ <FormField>
319
+ <FormField.Label>Contact</FormField.Label>
320
+ <FormField.Field>
321
+ <Select items={options}>
322
+ <FormField.Input as={Select.Input} />
323
+ <Select.Popper>
324
+ <Select.Card>
325
+ <Select.List>{item => <Select.Item>{item}</Select.Item>}</Select.List>
326
+ </Select.Card>
327
+ </Select.Popper>
328
+ </Select>
329
+ </FormField.Field>
330
+ </FormField>;
331
+ ```
332
+
333
+ Every `Select` requires **`FormField`**, a visible **`FormField.Label`**, and
334
+ **`FormField.Input as={Select.Input}`** so the combobox has a programmatically determinable name,
335
+ relationships, and instructions. See
336
+ [FormField's accessibility documentation](/components/inputs/form-field/#accessibility) for hint,
337
+ error, and required wiring.
338
+
339
+ ### Built-in Behaviors
340
+
341
+ Canvas Kit applies these automatically when you compose `Select` with `FormField` subcomponents.
342
+ **Do not duplicate them** in consuming code.
343
+
344
+ **ARIA and DOM** (_applied by subcomponents_):
345
+
346
+ - **`Select.Input`**: Visual `<input>` with `role="combobox"`, `aria-haspopup="listbox"`,
347
+ `aria-expanded` from menu visibility, `aria-autocomplete="list"` (do not change to `"none"`),
348
+ `aria-controls` pointing at the listbox id (`{modelId}-list`), and `aria-activedescendant` while
349
+ the list is open (removed when the list is closed). `autoComplete` is `"off"`. Keyboard characters
350
+ are not inserted into the input; type-ahead is handled by the model. **`FormField.Label`** (via
351
+ **`FormField.Input`**) is the accessible name of the combobox — do not add a second name on the
352
+ listbox.
353
+ - **Hidden form input**: A second input holds the selected id(s) for form submission. It is
354
+ `aria-hidden`, has `tabIndex={-1}`, and is not in the tab order. `onChange` and `name` apply to
355
+ this input. Focus and blur on a `ref` are forwarded to the visual combobox.
356
+ - **`Select.List`**: `role="listbox"` with an id that matches the combobox `aria-controls`. Options
357
+ are not in the tab order; keyboard focus stays on the combobox. Listbox labelling is library-owned
358
+ — do not set `aria-labelledby` (or `aria-label`) on **`Select.List`**.
359
+ - **`Select.Item`**: `role="option"` and `aria-selected` from selection state. Disabled options need
360
+ **`aria-disabled`** from application code (see **Accessibility Requirements**).
361
+ - **`Menu.Group`** (when used inside **`Select.List`**): `role="group"` with `aria-labelledby`
362
+ referencing the group heading (`title` or **`Menu.Group.Heading`**).
363
+ - **`Select.Item.Icon`** and the caret / start icons on **`Select.Input`**: Canvas Kit icons use
364
+ `role="presentation"` and `focusable="false"`. Decorative icons need no extra attributes.
365
+ - **`disabled` on `Select.Input`**: Maps to the native `disabled` attribute on both inputs; the
366
+ combobox is removed from the tab order.
367
+ - **`ref`**: Forwards to the visual combobox (`<input type="text" role="combobox">`).
368
+
369
+ **Keyboard** (_select-only combobox; focus remains on **`Select.Input`**_):
370
+
371
+ - <kbd>Tab</kbd> / <kbd>Shift</kbd>+<kbd>Tab</kbd> move to and from the combobox (native tab order).
372
+ Other keys are prevented from editing the input.
373
+ - Clicking **`FormField.Label`** moves focus to the combobox. Clicking the combobox opens or closes
374
+ the list.
375
+ - <kbd>ArrowDown</kbd> / <kbd>ArrowUp</kbd> open the list. While the list is open, those keys move
376
+ the active option (skipping ids in **`nonInteractiveIds`**). <kbd>Home</kbd> / <kbd>End</kbd> move
377
+ to the first or last option while the list is open.
378
+ - <kbd>Space</kbd> opens the list when it is closed and no type-ahead string is in progress. While
379
+ the list is open and type-ahead is empty, <kbd>Space</kbd> selects the active option and closes
380
+ the list.
381
+ - Printable characters type-ahead: with the list closed, matching options are selected; with the
382
+ list open, assistive focus moves to the matching option. Consecutive keys within 500ms form a
383
+ search string.
384
+ - <kbd>Enter</kbd> while the list is open selects the active option (unless **`aria-disabled`**) and
385
+ closes the list in single-select mode. It does not submit the form while the list is open.
386
+ - <kbd>Escape</kbd> closes the list. Blur also hides the list. After close, `aria-activedescendant`
387
+ is removed; the active option returns to the selected item when one is selected.
388
+ - Activating an option with the pointer keeps focus on the combobox and closes the list.
389
+
390
+ **Screen reader expectations** (_when built-in behaviors are used as intended_):
391
+
392
+ - On focus, assistive technology announces the field label and, when applicable: required state,
393
+ invalid state (`error="error"`), hint or error text via `aria-describedby`, and the current
394
+ selected text (or the placeholder when nothing is selected).
395
+ - The control is announced as a combobox. Collapsed vs expanded follows `aria-expanded`. While the
396
+ list is open, the active option is exposed through `aria-activedescendant`.
397
+ - Options are announced with selected or not-selected state (`aria-selected`). Disabled options are
398
+ announced as disabled when **`aria-disabled`** is set.
399
+ - The Caution state is visual only — `aria-invalid` is **not** set for `error="caution"`.
400
+ - Disabled comboboxes may be announced as unavailable and are skipped in the tab order.
401
+ - The hidden form input and decorative icons are not announced.
402
+
403
+ For rendered label, input, and hint association markup, see the DOM examples in
404
+ [FormField's Built-in Behaviors](/components/inputs/form-field/#built-in-behaviors).
405
+
406
+ ### Accessibility Requirements
407
+
408
+ Required in application code for an accessible `Select`. Rows marked _(conditional)_ apply only when
409
+ the situation matches—otherwise omit.
410
+
411
+ **If no design spec is provided:** use a visible `FormField.Label`, wrap **`Select`** with
412
+ **`FormField`**, use **`FormField.Input as={Select.Input}`**, include **`Select.Popper`**,
413
+ **`Select.Card`**, **`Select.List`**, and **`Select.Item`**, and pass **`items`**. Omit `isHidden`,
414
+ omit a custom `id` unless testing or composition requires it, omit a `ref` unless programmatic focus
415
+ is required, omit **`disabled`**, **`nonInteractiveIds`**, icons, grouped list items, and a custom
416
+ **`placeholder`** unless the spec includes them.
417
+
418
+ **Programmatic focus** _(conditional — omit by default)_:
419
+
420
+ Use a ref when the product needs to move focus to the combobox after an action. Do not attach a
421
+ `ref` or call `focus()` unless the design or developer asks for it. See
422
+ [Ref Forwarding](#ref-forwarding) under Usage for a complete Storybook example (imports, `ref` on
423
+ **`FormField.Input as={Select.Input}`**, and a button that calls `focus()`).
424
+
425
+ **Disabled options** _(conditional)_:
426
+
427
+ When an option is unavailable, set **`nonInteractiveIds`** on **`Select`** and **`aria-disabled`**
428
+ on those **`Select.Item`**s. See [Disabled Items](#disabled-items) under Usage for a complete
429
+ Storybook example. Do not use styling alone.
430
+
431
+ | Requirement | How to satisfy |
432
+ | ---------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
433
+ | Input wiring | **`FormField.Input as={Select.Input}`** for the combobox, with **`Select.Popper`**, **`Select.Card`**, **`Select.List`**, and **`Select.Item`**. See [FormField accessibility](/components/inputs/form-field/#accessibility) for label, hint, error, and required wiring |
434
+ | Disabled combobox _(conditional)_ | `disabled` on **`FormField.Input as={Select.Input}`**. See [Disabled](#disabled) |
435
+ | Disabled options _(conditional)_ | **`nonInteractiveIds`** on **`Select`** (ids skipped by keyboard and type-ahead) **and** **`aria-disabled`** on those **`Select.Item`**s. See [Disabled Items](#disabled-items) |
436
+ | Grouped list items _(conditional)_ | Keep **`items`**. Inside **`Select.List`**, render static **`Menu.Group`** (`title` or **`Menu.Group.Heading`**) and **`Select.Item`**s with matching **`data-id`** — not `{item => …}`. See [Grouped Items](#grouped-items) |
437
+ | Option icons _(conditional)_ | **`Select.Item.Icon`** on each item; **`inputStartIcon`** on **`FormField.Input as={Select.Input}`** for the selected item. Decorative icons need no extra attributes; meaning beyond the label must be text |
438
+ | Custom placeholder _(conditional)_ | `placeholder` on **`FormField.Input as={Select.Input}`** only as short prompt text—never as the only name. Default is `"Choose an option"` |
439
+ | Programmatic focus _(conditional)_ | `ref` on **`FormField.Input as={Select.Input}`** and call `focus()` when moving focus to the field after an action—omit by default (see **Programmatic focus** above) |
440
+
441
+ **Summary for code generation:**
442
+
443
+ - **REQUIRED:** visible label, **`FormField.Input as={Select.Input}`**, popup list composition
444
+ (**`Select.Popper`**, **`Select.Card`**, **`Select.List`**, **`Select.Item`**), **`items`**.
445
+ Default list rendering is `{item => <Select.Item>{item}</Select.Item>}` (or `item.text` /
446
+ **`getTextValue`**).
447
+ - **CONDITIONAL:** disabled combobox, disabled options (`nonInteractiveIds` + `aria-disabled`),
448
+ grouped list items (**`items`** plus static **`Menu.Group`** / **`data-id`** children — do not
449
+ omit **`items`**), option icons, custom placeholder, programmatic focus via `ref`, **`getId`** and
450
+ **`getTextValue`** when item shape is not `{id, text}` (always pass **`getTextValue`** if custom
451
+ **`getId`** is not the display text), **`data-id`** on static JSX **`Select.Item`**s. See
452
+ [FormField accessibility](/components/inputs/form-field/#accessibility) for shared FormField
453
+ conditionals (hint/error, required, stable `id`).
454
+
455
+ ### Anti-Patterns
456
+
457
+ Do **not** generate code that does the following (see **Accessibility Requirements** above for what
458
+ to supply instead):
459
+
460
+ - **Missing `FormField` wiring**: Do not use `Select` without **`FormField`** and
461
+ **`FormField.Label`**, and do not render a bare **`Select.Input`** when a **`FormField`** is
462
+ present. Use **`FormField.Input as={Select.Input}`** (see **Minimum accessible structure**). For
463
+ shared FormField anti-patterns (manual ARIA, placeholder-only labels, color-only errors, broken ID
464
+ references), see [FormField Anti-Patterns](/components/inputs/form-field/#anti-patterns).
465
+ - **Duplicating combobox or listbox ARIA**: Do not set `role`, `aria-haspopup`, `aria-expanded`,
466
+ `aria-autocomplete` (including `"none"`), `aria-controls`, `aria-activedescendant`,
467
+ `autoComplete`, or listbox `role` / `id` / `aria-labelledby` / `aria-label`. Do not make
468
+ **`Select.Item`** focusable — the active option is **`aria-activedescendant`** on the combobox.
469
+ - **Wrong component**: Do not use a native `<select>`, **`Menu`**, **`Combobox`**, **`TextInput`**,
470
+ or **`FormFieldGroup`** for a single submitted list value. Use
471
+ [**MultiSelect**](/docs/preview-multiselect--docs) when more than one option can be selected.
472
+ - **Item identity / grouping**: Do not set **`data-id`** on `{item => <Select.Item>}`. Do not omit
473
+ **`items`** when grouping, and do not group with a render callback alone — use **`Menu.Group`**
474
+ and **`data-id`** (see **Static item ids** and **Grouped list items**).
475
+ - **Free-text keyboard on the combobox**: Do not add `onKeyDown` that types into the input or calls
476
+ `preventDefault` on <kbd>Tab</kbd> — Select is select-only.
477
+
316
478
  ## Component API
317
479
 
318
480
  <SymbolDoc name="Select" fileName="/react/" />
@@ -24,36 +24,30 @@ const items = [
24
24
  ];
25
25
 
26
26
  export default () => {
27
- const [selected, setSelected] = React.useState('');
28
-
29
27
  return (
30
- <>
31
- <FormField>
32
- <FormField.Label>Contact</FormField.Label>
33
- <FormField.Field>
34
- <Select items={items} getId={item => item.id} getTextValue={item => item.text}>
35
- <FormField.Input as={Select.Input} />
36
- <Select.Popper>
37
- <Select.Card>
38
- <Select.List>
39
- <Menu.Group title="First Group">
40
- <Select.Item data-id="first">First Item</Select.Item>
41
- <Select.Item data-id="second">Second Item</Select.Item>
42
- </Menu.Group>
43
- <Menu.Group title="Second Group">
44
- <Select.Item data-id="third">
45
- Third Item (with a really, really, really long label)
46
- </Select.Item>
47
- <Select.Item aria-disabled data-id="fourth">
48
- Fourth Item
49
- </Select.Item>
50
- </Menu.Group>
51
- </Select.List>
52
- </Select.Card>
53
- </Select.Popper>
54
- </Select>
55
- </FormField.Field>
56
- </FormField>
57
- </>
28
+ <FormField>
29
+ <FormField.Label>Contact</FormField.Label>
30
+ <FormField.Field>
31
+ <Select items={items} getId={item => item.id} getTextValue={item => item.text}>
32
+ <FormField.Input as={Select.Input} />
33
+ <Select.Popper>
34
+ <Select.Card>
35
+ <Select.List>
36
+ <Menu.Group title="First Group">
37
+ <Select.Item data-id="first">First Item</Select.Item>
38
+ <Select.Item data-id="second">Second Item</Select.Item>
39
+ </Menu.Group>
40
+ <Menu.Group title="Second Group">
41
+ <Select.Item data-id="third">
42
+ Third Item (with a really, really, really long label)
43
+ </Select.Item>
44
+ <Select.Item data-id="fourth">Fourth Item</Select.Item>
45
+ </Menu.Group>
46
+ </Select.List>
47
+ </Select.Card>
48
+ </Select.Popper>
49
+ </Select>
50
+ </FormField.Field>
51
+ </FormField>
58
52
  );
59
53
  };
@@ -43,7 +43,7 @@ export default () => {
43
43
  {model.state.items.length > 0 && (
44
44
  <Select.List>
45
45
  {item => (
46
- <Select.Item data-id={item.id}>
46
+ <Select.Item>
47
47
  <Select.Item.Icon icon={item.icon} />
48
48
  {item.text}
49
49
  </Select.Item>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@workday/canvas-kit-docs",
3
- "version": "16.2.0-0615-next.0",
3
+ "version": "16.2.0-0622-next.0",
4
4
  "description": "Documentation components of Canvas Kit components",
5
5
  "author": "Workday, Inc. (https://www.workday.com)",
6
6
  "license": "Apache-2.0",
@@ -47,10 +47,10 @@
47
47
  "@stackblitz/sdk": "^1.11.0",
48
48
  "@storybook/csf": "0.0.1",
49
49
  "@workday/canvas-expressive-icons-web": "1.0.2",
50
- "@workday/canvas-kit-labs-react": "^16.2.0-0615-next.0",
51
- "@workday/canvas-kit-preview-react": "^16.2.0-0615-next.0",
52
- "@workday/canvas-kit-react": "^16.2.0-0615-next.0",
53
- "@workday/canvas-kit-styling": "^16.2.0-0615-next.0",
50
+ "@workday/canvas-kit-labs-react": "^16.2.0-0622-next.0",
51
+ "@workday/canvas-kit-preview-react": "^16.2.0-0622-next.0",
52
+ "@workday/canvas-kit-react": "^16.2.0-0622-next.0",
53
+ "@workday/canvas-kit-styling": "^16.2.0-0622-next.0",
54
54
  "@workday/canvas-system-icons-web": "^5.0.3",
55
55
  "@workday/canvas-tokens-web": "^4.4.0",
56
56
  "markdown-to-jsx": "^7.2.0",
@@ -63,5 +63,5 @@
63
63
  "mkdirp": "^1.0.3",
64
64
  "typescript": "5.0"
65
65
  },
66
- "gitHead": "593c0f1f5ee5047c7bea41027f76716a0f42caee"
66
+ "gitHead": "b46b831711d2b28326c53f1c40977910bce706e5"
67
67
  }