From a24f6272a709ad28910432a8176f3c1475527fc1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9Cnora?= Date: Wed, 20 Mar 2024 16:17:56 -0600 Subject: [PATCH 01/12] chore(side-panel): build side panel --- yarn.lock | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/yarn.lock b/yarn.lock index d7f77fac78..b5ea3701c8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -41710,7 +41710,7 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard -"source-map-support@npm:^0.5.16, source-map-support@npm:~0.5.12, source-map-support@npm:~0.5.19, source-map-support@npm:~0.5.20": +"source-map-support@npm:^0.5.16, source-map-support@npm:^0.5.21, source-map-support@npm:~0.5.12, source-map-support@npm:~0.5.19, source-map-support@npm:~0.5.20": version: 0.5.21 resolution: "source-map-support@npm:0.5.21" dependencies: @@ -43722,6 +43722,23 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard +"tsx@npm:^3.12.10": + version: 3.14.0 + resolution: "tsx@npm:3.14.0" + dependencies: + esbuild: ~0.18.20 + fsevents: ~2.3.3 + get-tsconfig: ^4.7.2 + source-map-support: ^0.5.21 + dependenciesMeta: + fsevents: + optional: true + bin: + tsx: dist/cli.mjs + checksum: afcef5d9b90b5800cf1ffb749e943f63042d78a4c0d9eef6e13e43f4ecab465d45e2c9812a2c515cbdc2ee913ff1cd01bf5c606a48013dd3ce2214a631b45557 + languageName: node + linkType: hard + "tsx@npm:^4.0.0": version: 4.6.2 resolution: "tsx@npm:4.6.2" From 1d7998a57bb5747dfda0d461264bb5b186eaf2c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9Cnora?= Date: Thu, 21 Mar 2024 14:49:39 -0600 Subject: [PATCH 02/12] chore: prep for handoff --- yarn.lock | 19 +------------------ 1 file changed, 1 insertion(+), 18 deletions(-) diff --git a/yarn.lock b/yarn.lock index b5ea3701c8..d7f77fac78 100644 --- a/yarn.lock +++ b/yarn.lock @@ -41710,7 +41710,7 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard -"source-map-support@npm:^0.5.16, source-map-support@npm:^0.5.21, source-map-support@npm:~0.5.12, source-map-support@npm:~0.5.19, source-map-support@npm:~0.5.20": +"source-map-support@npm:^0.5.16, source-map-support@npm:~0.5.12, source-map-support@npm:~0.5.19, source-map-support@npm:~0.5.20": version: 0.5.21 resolution: "source-map-support@npm:0.5.21" dependencies: @@ -43722,23 +43722,6 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard -"tsx@npm:^3.12.10": - version: 3.14.0 - resolution: "tsx@npm:3.14.0" - dependencies: - esbuild: ~0.18.20 - fsevents: ~2.3.3 - get-tsconfig: ^4.7.2 - source-map-support: ^0.5.21 - dependenciesMeta: - fsevents: - optional: true - bin: - tsx: dist/cli.mjs - checksum: afcef5d9b90b5800cf1ffb749e943f63042d78a4c0d9eef6e13e43f4ecab465d45e2c9812a2c515cbdc2ee913ff1cd01bf5c606a48013dd3ce2214a631b45557 - languageName: node - linkType: hard - "tsx@npm:^4.0.0": version: 4.6.2 resolution: "tsx@npm:4.6.2" From 5bd855e62dce19dbc54274abe74bdd0f6fbd0f19 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9Cnora?= Date: Wed, 8 May 2024 17:46:27 -0400 Subject: [PATCH 03/12] chore: make side panel sticky and full height --- packages/paste-core/components/side-panel/src/SidePanel.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/paste-core/components/side-panel/src/SidePanel.tsx b/packages/paste-core/components/side-panel/src/SidePanel.tsx index 6d33b5aed9..37e3cb8976 100644 --- a/packages/paste-core/components/side-panel/src/SidePanel.tsx +++ b/packages/paste-core/components/side-panel/src/SidePanel.tsx @@ -67,6 +67,8 @@ const SidePanel = React.forwardRef( setOffsetY(boundingClientRect?.y || 0); }, []); + const screenSize = window.innerHeight; + return ( <> {transitions( From 32f01e085caef82332a900c5b55d1a3a4f3c958a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9Cnora?= Date: Thu, 9 May 2024 18:12:48 -0400 Subject: [PATCH 04/12] chore: small changes to api, scrollbar styles --- .../components/side-panel/src/SidePanel.tsx | 2 ++ .../side-panel/src/SidePanelPageWrapper.tsx | 29 +++++++++++++++++++ .../side-panel/stories/index.stories.tsx | 4 +++ 3 files changed, 35 insertions(+) create mode 100644 packages/paste-core/components/side-panel/src/SidePanelPageWrapper.tsx diff --git a/packages/paste-core/components/side-panel/src/SidePanel.tsx b/packages/paste-core/components/side-panel/src/SidePanel.tsx index 37e3cb8976..8a7c9029a7 100644 --- a/packages/paste-core/components/side-panel/src/SidePanel.tsx +++ b/packages/paste-core/components/side-panel/src/SidePanel.tsx @@ -69,6 +69,8 @@ const SidePanel = React.forwardRef( const screenSize = window.innerHeight; + const topInPixels = top === "space200" ? 76 : 0; + return ( <> {transitions( diff --git a/packages/paste-core/components/side-panel/src/SidePanelPageWrapper.tsx b/packages/paste-core/components/side-panel/src/SidePanelPageWrapper.tsx new file mode 100644 index 0000000000..4b81133fa3 --- /dev/null +++ b/packages/paste-core/components/side-panel/src/SidePanelPageWrapper.tsx @@ -0,0 +1,29 @@ +import { Box, safelySpreadBoxProps } from "@twilio-paste/box"; +import type { BoxProps } from "@twilio-paste/box"; +import type { HTMLPasteProps } from "@twilio-paste/types"; +import * as React from "react"; + +export interface SidePanelPageWrapperProps extends HTMLPasteProps<"div"> { + children?: React.ReactNode; + /** + * Overrides the default element name to apply unique styles with the Customization Provider + * @default "SIDE_PANEL_PAGE_WRAPPER" + * @type {BoxProps['element']} + * @memberof SidePanelPageWrapperProps + */ + element?: BoxProps["element"]; +} + +const SidePanelPageWrapper = React.forwardRef( + ({ element = "SIDE_PANEL_PAGE_WRAPPER", children, ...props }, ref) => { + return ( + + {children} + + ); + }, +); + +SidePanelPageWrapper.displayName = "SidePanelPageWrapper"; + +export { SidePanelPageWrapper }; diff --git a/packages/paste-core/components/side-panel/stories/index.stories.tsx b/packages/paste-core/components/side-panel/stories/index.stories.tsx index 15210c3434..25d49886d3 100644 --- a/packages/paste-core/components/side-panel/stories/index.stories.tsx +++ b/packages/paste-core/components/side-panel/stories/index.stories.tsx @@ -1,10 +1,14 @@ /* eslint-disable eslint-comments/disable-enable-pair */ /* eslint-disable react/jsx-max-depth */ /* eslint-disable import/no-extraneous-dependencies */ +import { Anchor } from "@twilio-paste/anchor"; +import { Avatar } from "@twilio-paste/avatar"; +import { Badge } from "@twilio-paste/badge/"; import { Box } from "@twilio-paste/box"; import { Button } from "@twilio-paste/button"; import { CustomizationProvider } from "@twilio-paste/customization"; import { Heading } from "@twilio-paste/heading"; +import { ArtificialIntelligenceIcon } from "@twilio-paste/icons/esm/ArtificialIntelligenceIcon"; import { ChevronDoubleLeftIcon } from "@twilio-paste/icons/esm/ChevronDoubleLeftIcon"; import { ChevronDoubleRightIcon } from "@twilio-paste/icons/esm/ChevronDoubleRightIcon"; import { MoreIcon } from "@twilio-paste/icons/esm/MoreIcon"; From 155b79ef58b7652052e3e287c09e0bde2b327820 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9Cnora?= Date: Fri, 10 May 2024 11:28:15 -0400 Subject: [PATCH 05/12] chore: improvements --- .../paste-codemods/tools/.cache/mappings.json | 1 + .../components/side-panel/src/SidePanel.tsx | 10 +- .../side-panel/stories/index.stories.tsx | 4 - .../components/side-panel/type-docs.json | 1590 +++++++++++++++++ 4 files changed, 1600 insertions(+), 5 deletions(-) diff --git a/packages/paste-codemods/tools/.cache/mappings.json b/packages/paste-codemods/tools/.cache/mappings.json index 4f44b5ffb3..245434f9e3 100644 --- a/packages/paste-codemods/tools/.cache/mappings.json +++ b/packages/paste-codemods/tools/.cache/mappings.json @@ -233,6 +233,7 @@ "SidePanelContext": "@twilio-paste/core/side-panel", "SidePanelHeader": "@twilio-paste/core/side-panel", "SidePanelHeaderActions": "@twilio-paste/core/side-panel", + "SidePanelPageWrapper": "@twilio-paste/core/side-panel", "SidePanelPushContentWrapper": "@twilio-paste/core/side-panel", "Sidebar": "@twilio-paste/core/sidebar", "SidebarBetaBadge": "@twilio-paste/core/sidebar", diff --git a/packages/paste-core/components/side-panel/src/SidePanel.tsx b/packages/paste-core/components/side-panel/src/SidePanel.tsx index 8a7c9029a7..5254d1867f 100644 --- a/packages/paste-core/components/side-panel/src/SidePanel.tsx +++ b/packages/paste-core/components/side-panel/src/SidePanel.tsx @@ -69,7 +69,15 @@ const SidePanel = React.forwardRef( const screenSize = window.innerHeight; - const topInPixels = top === "space200" ? 76 : 0; + const sidePanelRef = React.useRef(null); + const mergedSidePanelRef = useMergeRefs(sidePanelRef, ref) as React.RefObject; + + const [offsetY, setOffsetY] = React.useState(0); + + React.useEffect(() => { + const boundingClientRect = sidePanelRef?.current?.getBoundingClientRect(); + setOffsetY(boundingClientRect?.y || 0); + }, []); return ( <> diff --git a/packages/paste-core/components/side-panel/stories/index.stories.tsx b/packages/paste-core/components/side-panel/stories/index.stories.tsx index 25d49886d3..15210c3434 100644 --- a/packages/paste-core/components/side-panel/stories/index.stories.tsx +++ b/packages/paste-core/components/side-panel/stories/index.stories.tsx @@ -1,14 +1,10 @@ /* eslint-disable eslint-comments/disable-enable-pair */ /* eslint-disable react/jsx-max-depth */ /* eslint-disable import/no-extraneous-dependencies */ -import { Anchor } from "@twilio-paste/anchor"; -import { Avatar } from "@twilio-paste/avatar"; -import { Badge } from "@twilio-paste/badge/"; import { Box } from "@twilio-paste/box"; import { Button } from "@twilio-paste/button"; import { CustomizationProvider } from "@twilio-paste/customization"; import { Heading } from "@twilio-paste/heading"; -import { ArtificialIntelligenceIcon } from "@twilio-paste/icons/esm/ArtificialIntelligenceIcon"; import { ChevronDoubleLeftIcon } from "@twilio-paste/icons/esm/ChevronDoubleLeftIcon"; import { ChevronDoubleRightIcon } from "@twilio-paste/icons/esm/ChevronDoubleRightIcon"; import { MoreIcon } from "@twilio-paste/icons/esm/MoreIcon"; diff --git a/packages/paste-core/components/side-panel/type-docs.json b/packages/paste-core/components/side-panel/type-docs.json index 854fd87f72..a561be698d 100644 --- a/packages/paste-core/components/side-panel/type-docs.json +++ b/packages/paste-core/components/side-panel/type-docs.json @@ -3384,6 +3384,13 @@ } }, "SidePanel": { + "collapsed": { + "type": "boolean", + "defaultValue": null, + "required": true, + "externalProp": false, + "description": "Determines whether the Side Panel is open or collapsed" + }, "label": { "type": "string", "defaultValue": null, @@ -12922,5 +12929,1588 @@ "required": false, "externalProp": true } + }, + "SidePanelPageWrapper": { + "about": { + "type": "string", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "accessKey": { + "type": "string", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "aria-activedescendant": { + "type": "string", + "defaultValue": null, + "required": false, + "externalProp": true, + "description": "Identifies the currently active element when DOM focus is on a composite widget, textbox, group, or application." + }, + "aria-atomic": { + "type": "Booleanish", + "defaultValue": null, + "required": false, + "externalProp": true, + "description": "Indicates whether assistive technologies will present all, or only parts of, the changed region based on the change notifications defined by the aria-relevant attribute." + }, + "aria-autocomplete": { + "type": "\"list\" | \"none\" | \"inline\" | \"both\"", + "defaultValue": null, + "required": false, + "externalProp": true, + "description": "Indicates whether inputting text could trigger display of one or more predictions of the user's intended value for an input and specifies how predictions would be\npresented if they are made." + }, + "aria-busy": { + "type": "Booleanish", + "defaultValue": null, + "required": false, + "externalProp": true, + "description": "Indicates an element is being modified and that assistive technologies MAY want to wait until the modifications are complete before exposing them to the user." + }, + "aria-checked": { + "type": "boolean | \"true\" | \"false\" | \"mixed\"", + "defaultValue": null, + "required": false, + "externalProp": true, + "description": "Indicates the current \"checked\" state of checkboxes, radio buttons, and other widgets." + }, + "aria-colcount": { + "type": "number", + "defaultValue": null, + "required": false, + "externalProp": true, + "description": "Defines the total number of columns in a table, grid, or treegrid." + }, + "aria-colindex": { + "type": "number", + "defaultValue": null, + "required": false, + "externalProp": true, + "description": "Defines an element's column index or position with respect to the total number of columns within a table, grid, or treegrid." + }, + "aria-colspan": { + "type": "number", + "defaultValue": null, + "required": false, + "externalProp": true, + "description": "Defines the number of columns spanned by a cell or gridcell within a table, grid, or treegrid." + }, + "aria-controls": { + "type": "string", + "defaultValue": null, + "required": false, + "externalProp": true, + "description": "Identifies the element (or elements) whose contents or presence are controlled by the current element." + }, + "aria-current": { + "type": "| boolean\n | \"time\"\n | \"true\"\n | \"false\"\n | \"page\"\n | \"step\"\n | \"location\"\n | \"date\"", + "defaultValue": null, + "required": false, + "externalProp": true, + "description": "Indicates the element that represents the current item within a container or set of related elements." + }, + "aria-describedby": { + "type": "string", + "defaultValue": null, + "required": false, + "externalProp": true, + "description": "Identifies the element (or elements) that describes the object." + }, + "aria-details": { + "type": "string", + "defaultValue": null, + "required": false, + "externalProp": true, + "description": "Identifies the element that provides a detailed, extended description for the object." + }, + "aria-disabled": { + "type": "Booleanish", + "defaultValue": null, + "required": false, + "externalProp": true, + "description": "Indicates that the element is perceivable but disabled, so it is not editable or otherwise operable." + }, + "aria-dropeffect": { + "type": "\"link\" | \"none\" | \"copy\" | \"execute\" | \"move\" | \"popup\"", + "defaultValue": null, + "required": false, + "externalProp": true, + "description": "Indicates what functions can be performed when a dragged object is released on the drop target." + }, + "aria-errormessage": { + "type": "string", + "defaultValue": null, + "required": false, + "externalProp": true, + "description": "Identifies the element that provides an error message for the object." + }, + "aria-expanded": { + "type": "Booleanish", + "defaultValue": null, + "required": false, + "externalProp": true, + "description": "Indicates whether the element, or another grouping element it controls, is currently expanded or collapsed." + }, + "aria-flowto": { + "type": "string", + "defaultValue": null, + "required": false, + "externalProp": true, + "description": "Identifies the next element (or elements) in an alternate reading order of content which, at the user's discretion,\nallows assistive technology to override the general default of reading in document source order." + }, + "aria-grabbed": { + "type": "Booleanish", + "defaultValue": null, + "required": false, + "externalProp": true, + "description": "Indicates an element's \"grabbed\" state in a drag-and-drop operation." + }, + "aria-haspopup": { + "type": "| boolean\n | \"dialog\"\n | \"menu\"\n | \"true\"\n | \"false\"\n | \"grid\"\n | \"listbox\"\n | \"tree\"", + "defaultValue": null, + "required": false, + "externalProp": true, + "description": "Indicates the availability and type of interactive popup element, such as menu or dialog, that can be triggered by an element." + }, + "aria-hidden": { + "type": "Booleanish", + "defaultValue": null, + "required": false, + "externalProp": true, + "description": "Indicates whether the element is exposed to an accessibility API." + }, + "aria-invalid": { + "type": "boolean | \"true\" | \"false\" | \"grammar\" | \"spelling\"", + "defaultValue": null, + "required": false, + "externalProp": true, + "description": "Indicates the entered value does not conform to the format expected by the application." + }, + "aria-keyshortcuts": { + "type": "string", + "defaultValue": null, + "required": false, + "externalProp": true, + "description": "Indicates keyboard shortcuts that an author has implemented to activate or give focus to an element." + }, + "aria-label": { + "type": "string", + "defaultValue": null, + "required": false, + "externalProp": true, + "description": "Defines a string value that labels the current element." + }, + "aria-labelledby": { + "type": "string", + "defaultValue": null, + "required": false, + "externalProp": true, + "description": "Identifies the element (or elements) that labels the current element." + }, + "aria-level": { + "type": "number", + "defaultValue": null, + "required": false, + "externalProp": true, + "description": "Defines the hierarchical level of an element within a structure." + }, + "aria-live": { + "type": "\"off\" | \"assertive\" | \"polite\"", + "defaultValue": null, + "required": false, + "externalProp": true, + "description": "Indicates that an element will be updated, and describes the types of updates the user agents, assistive technologies, and user can expect from the live region." + }, + "aria-modal": { + "type": "Booleanish", + "defaultValue": null, + "required": false, + "externalProp": true, + "description": "Indicates whether an element is modal when displayed." + }, + "aria-multiline": { + "type": "Booleanish", + "defaultValue": null, + "required": false, + "externalProp": true, + "description": "Indicates whether a text box accepts multiple lines of input or only a single line." + }, + "aria-multiselectable": { + "type": "Booleanish", + "defaultValue": null, + "required": false, + "externalProp": true, + "description": "Indicates that the user may select more than one item from the current selectable descendants." + }, + "aria-orientation": { + "type": "\"horizontal\" | \"vertical\"", + "defaultValue": null, + "required": false, + "externalProp": true, + "description": "Indicates whether the element's orientation is horizontal, vertical, or unknown/ambiguous." + }, + "aria-owns": { + "type": "string", + "defaultValue": null, + "required": false, + "externalProp": true, + "description": "Identifies an element (or elements) in order to define a visual, functional, or contextual parent/child relationship\nbetween DOM elements where the DOM hierarchy cannot be used to represent the relationship." + }, + "aria-placeholder": { + "type": "string", + "defaultValue": null, + "required": false, + "externalProp": true, + "description": "Defines a short hint (a word or short phrase) intended to aid the user with data entry when the control has no value.\nA hint could be a sample value or a brief description of the expected format." + }, + "aria-posinset": { + "type": "number", + "defaultValue": null, + "required": false, + "externalProp": true, + "description": "Defines an element's number or position in the current set of listitems or treeitems. Not required if all elements in the set are present in the DOM." + }, + "aria-pressed": { + "type": "boolean | \"true\" | \"false\" | \"mixed\"", + "defaultValue": null, + "required": false, + "externalProp": true, + "description": "Indicates the current \"pressed\" state of toggle buttons." + }, + "aria-readonly": { + "type": "Booleanish", + "defaultValue": null, + "required": false, + "externalProp": true, + "description": "Indicates that the element is not editable, but is otherwise operable." + }, + "aria-relevant": { + "type": "| \"text\"\n | \"additions\"\n | \"additions removals\"\n | \"additions text\"\n | \"all\"\n | \"removals\"\n | \"removals additions\"\n | \"removals text\"\n | \"text additions\"\n | \"text removals\"", + "defaultValue": null, + "required": false, + "externalProp": true, + "description": "Indicates what notifications the user agent will trigger when the accessibility tree within a live region is modified." + }, + "aria-required": { + "type": "Booleanish", + "defaultValue": null, + "required": false, + "externalProp": true, + "description": "Indicates that user input is required on the element before a form may be submitted." + }, + "aria-roledescription": { + "type": "string", + "defaultValue": null, + "required": false, + "externalProp": true, + "description": "Defines a human-readable, author-localized description for the role of an element." + }, + "aria-rowcount": { + "type": "number", + "defaultValue": null, + "required": false, + "externalProp": true, + "description": "Defines the total number of rows in a table, grid, or treegrid." + }, + "aria-rowindex": { + "type": "number", + "defaultValue": null, + "required": false, + "externalProp": true, + "description": "Defines an element's row index or position with respect to the total number of rows within a table, grid, or treegrid." + }, + "aria-rowspan": { + "type": "number", + "defaultValue": null, + "required": false, + "externalProp": true, + "description": "Defines the number of rows spanned by a cell or gridcell within a table, grid, or treegrid." + }, + "aria-selected": { + "type": "Booleanish", + "defaultValue": null, + "required": false, + "externalProp": true, + "description": "Indicates the current \"selected\" state of various widgets." + }, + "aria-setsize": { + "type": "number", + "defaultValue": null, + "required": false, + "externalProp": true, + "description": "Defines the number of items in the current set of listitems or treeitems. Not required if all elements in the set are present in the DOM." + }, + "aria-sort": { + "type": "\"none\" | \"ascending\" | \"descending\" | \"other\"", + "defaultValue": null, + "required": false, + "externalProp": true, + "description": "Indicates if items in a table or grid are sorted in ascending or descending order." + }, + "aria-valuemax": { + "type": "number", + "defaultValue": null, + "required": false, + "externalProp": true, + "description": "Defines the maximum allowed value for a range widget." + }, + "aria-valuemin": { + "type": "number", + "defaultValue": null, + "required": false, + "externalProp": true, + "description": "Defines the minimum allowed value for a range widget." + }, + "aria-valuenow": { + "type": "number", + "defaultValue": null, + "required": false, + "externalProp": true, + "description": "Defines the current value for a range widget." + }, + "aria-valuetext": { + "type": "string", + "defaultValue": null, + "required": false, + "externalProp": true, + "description": "Defines the human readable text alternative of aria-valuenow for a range widget." + }, + "autoCapitalize": { + "type": "string", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "autoCorrect": { + "type": "string", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "autoSave": { + "type": "string", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "contentEditable": { + "type": "Booleanish | \"inherit\"", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "contextMenu": { + "type": "string", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "dangerouslySetInnerHTML": { + "type": "{ __html: string }", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "datatype": { + "type": "string", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "defaultChecked": { + "type": "boolean", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "defaultValue": { + "type": "string | number | readonly string[]", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "dir": { + "type": "string", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "draggable": { + "type": "Booleanish", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "element": { + "type": "string", + "defaultValue": "SIDE_PANEL_PAGE_WRAPPER", + "required": false, + "externalProp": false, + "description": "Overrides the default element name to apply unique styles with the Customization Provider" + }, + "hidden": { + "type": "boolean", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "id": { + "type": "string", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "inlist": { + "type": "any", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "inputMode": { + "type": "| \"text\"\n | \"none\"\n | \"search\"\n | \"tel\"\n | \"url\"\n | \"email\"\n | \"numeric\"\n | \"decimal\"", + "defaultValue": null, + "required": false, + "externalProp": true, + "description": "Hints at the type of data that might be entered by the user while editing the element or its contents" + }, + "is": { + "type": "string", + "defaultValue": null, + "required": false, + "externalProp": true, + "description": "Specify that a standard HTML element should behave like a defined custom built-in element" + }, + "itemID": { + "type": "string", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "itemProp": { + "type": "string", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "itemRef": { + "type": "string", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "itemScope": { + "type": "boolean", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "itemType": { + "type": "string", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "key": { + "type": "Key", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "lang": { + "type": "string", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "nonce": { + "type": "string", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onAbort": { + "type": "ReactEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onAbortCapture": { + "type": "ReactEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onAnimationEnd": { + "type": "AnimationEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onAnimationEndCapture": { + "type": "AnimationEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onAnimationIteration": { + "type": "AnimationEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onAnimationIterationCapture": { + "type": "AnimationEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onAnimationStart": { + "type": "AnimationEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onAnimationStartCapture": { + "type": "AnimationEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onAuxClick": { + "type": "MouseEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onAuxClickCapture": { + "type": "MouseEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onBeforeInput": { + "type": "FormEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onBeforeInputCapture": { + "type": "FormEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onBlur": { + "type": "FocusEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onBlurCapture": { + "type": "FocusEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onCanPlay": { + "type": "ReactEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onCanPlayCapture": { + "type": "ReactEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onCanPlayThrough": { + "type": "ReactEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onCanPlayThroughCapture": { + "type": "ReactEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onChange": { + "type": "FormEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onChangeCapture": { + "type": "FormEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onClick": { + "type": "MouseEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onClickCapture": { + "type": "MouseEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onCompositionEnd": { + "type": "CompositionEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onCompositionEndCapture": { + "type": "CompositionEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onCompositionStart": { + "type": "CompositionEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onCompositionStartCapture": { + "type": "CompositionEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onCompositionUpdate": { + "type": "CompositionEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onCompositionUpdateCapture": { + "type": "CompositionEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onContextMenu": { + "type": "MouseEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onContextMenuCapture": { + "type": "MouseEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onCopy": { + "type": "ClipboardEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onCopyCapture": { + "type": "ClipboardEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onCut": { + "type": "ClipboardEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onCutCapture": { + "type": "ClipboardEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onDoubleClick": { + "type": "MouseEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onDoubleClickCapture": { + "type": "MouseEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onDrag": { + "type": "DragEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onDragCapture": { + "type": "DragEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onDragEnd": { + "type": "DragEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onDragEndCapture": { + "type": "DragEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onDragEnter": { + "type": "DragEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onDragEnterCapture": { + "type": "DragEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onDragExit": { + "type": "DragEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onDragExitCapture": { + "type": "DragEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onDragLeave": { + "type": "DragEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onDragLeaveCapture": { + "type": "DragEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onDragOver": { + "type": "DragEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onDragOverCapture": { + "type": "DragEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onDragStart": { + "type": "DragEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onDragStartCapture": { + "type": "DragEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onDrop": { + "type": "DragEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onDropCapture": { + "type": "DragEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onDurationChange": { + "type": "ReactEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onDurationChangeCapture": { + "type": "ReactEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onEmptied": { + "type": "ReactEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onEmptiedCapture": { + "type": "ReactEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onEncrypted": { + "type": "ReactEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onEncryptedCapture": { + "type": "ReactEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onEnded": { + "type": "ReactEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onEndedCapture": { + "type": "ReactEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onError": { + "type": "ReactEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onErrorCapture": { + "type": "ReactEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onFocus": { + "type": "FocusEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onFocusCapture": { + "type": "FocusEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onGotPointerCapture": { + "type": "PointerEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onGotPointerCaptureCapture": { + "type": "PointerEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onInput": { + "type": "FormEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onInputCapture": { + "type": "FormEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onInvalid": { + "type": "FormEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onInvalidCapture": { + "type": "FormEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onKeyDown": { + "type": "KeyboardEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onKeyDownCapture": { + "type": "KeyboardEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onKeyPress": { + "type": "KeyboardEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onKeyPressCapture": { + "type": "KeyboardEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onKeyUp": { + "type": "KeyboardEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onKeyUpCapture": { + "type": "KeyboardEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onLoad": { + "type": "ReactEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onLoadCapture": { + "type": "ReactEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onLoadedData": { + "type": "ReactEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onLoadedDataCapture": { + "type": "ReactEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onLoadedMetadata": { + "type": "ReactEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onLoadedMetadataCapture": { + "type": "ReactEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onLoadStart": { + "type": "ReactEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onLoadStartCapture": { + "type": "ReactEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onLostPointerCapture": { + "type": "PointerEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onLostPointerCaptureCapture": { + "type": "PointerEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onMouseDown": { + "type": "MouseEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onMouseDownCapture": { + "type": "MouseEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onMouseEnter": { + "type": "MouseEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onMouseLeave": { + "type": "MouseEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onMouseMove": { + "type": "MouseEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onMouseMoveCapture": { + "type": "MouseEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onMouseOut": { + "type": "MouseEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onMouseOutCapture": { + "type": "MouseEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onMouseOver": { + "type": "MouseEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onMouseOverCapture": { + "type": "MouseEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onMouseUp": { + "type": "MouseEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onMouseUpCapture": { + "type": "MouseEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onPaste": { + "type": "ClipboardEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onPasteCapture": { + "type": "ClipboardEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onPause": { + "type": "ReactEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onPauseCapture": { + "type": "ReactEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onPlay": { + "type": "ReactEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onPlayCapture": { + "type": "ReactEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onPlaying": { + "type": "ReactEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onPlayingCapture": { + "type": "ReactEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onPointerCancel": { + "type": "PointerEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onPointerCancelCapture": { + "type": "PointerEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onPointerDown": { + "type": "PointerEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onPointerDownCapture": { + "type": "PointerEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onPointerEnter": { + "type": "PointerEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onPointerEnterCapture": { + "type": "PointerEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onPointerLeave": { + "type": "PointerEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onPointerLeaveCapture": { + "type": "PointerEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onPointerMove": { + "type": "PointerEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onPointerMoveCapture": { + "type": "PointerEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onPointerOut": { + "type": "PointerEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onPointerOutCapture": { + "type": "PointerEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onPointerOver": { + "type": "PointerEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onPointerOverCapture": { + "type": "PointerEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onPointerUp": { + "type": "PointerEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onPointerUpCapture": { + "type": "PointerEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onProgress": { + "type": "ReactEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onProgressCapture": { + "type": "ReactEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onRateChange": { + "type": "ReactEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onRateChangeCapture": { + "type": "ReactEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onReset": { + "type": "FormEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onResetCapture": { + "type": "FormEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onResize": { + "type": "ReactEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onResizeCapture": { + "type": "ReactEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onScroll": { + "type": "UIEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onScrollCapture": { + "type": "UIEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onSeeked": { + "type": "ReactEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onSeekedCapture": { + "type": "ReactEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onSeeking": { + "type": "ReactEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onSeekingCapture": { + "type": "ReactEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onSelect": { + "type": "ReactEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onSelectCapture": { + "type": "ReactEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onStalled": { + "type": "ReactEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onStalledCapture": { + "type": "ReactEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onSubmit": { + "type": "FormEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onSubmitCapture": { + "type": "FormEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onSuspend": { + "type": "ReactEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onSuspendCapture": { + "type": "ReactEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onTimeUpdate": { + "type": "ReactEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onTimeUpdateCapture": { + "type": "ReactEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onTouchCancel": { + "type": "TouchEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onTouchCancelCapture": { + "type": "TouchEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onTouchEnd": { + "type": "TouchEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onTouchEndCapture": { + "type": "TouchEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onTouchMove": { + "type": "TouchEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onTouchMoveCapture": { + "type": "TouchEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onTouchStart": { + "type": "TouchEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onTouchStartCapture": { + "type": "TouchEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onTransitionEnd": { + "type": "TransitionEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onTransitionEndCapture": { + "type": "TransitionEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onVolumeChange": { + "type": "ReactEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onVolumeChangeCapture": { + "type": "ReactEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onWaiting": { + "type": "ReactEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onWaitingCapture": { + "type": "ReactEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onWheel": { + "type": "WheelEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "onWheelCapture": { + "type": "WheelEventHandler", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "placeholder": { + "type": "string", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "prefix": { + "type": "string", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "property": { + "type": "string", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "radioGroup": { + "type": "string", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "resource": { + "type": "string", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "results": { + "type": "number", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "role": { + "type": "AriaRole", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "security": { + "type": "string", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "slot": { + "type": "string", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "spellCheck": { + "type": "Booleanish", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "suppressContentEditableWarning": { + "type": "boolean", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "suppressHydrationWarning": { + "type": "boolean", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "tabIndex": { + "type": "number", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "title": { + "type": "string", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "translate": { + "type": "\"yes\" | \"no\"", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "typeof": { + "type": "string", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "unselectable": { + "type": "\"on\" | \"off\"", + "defaultValue": null, + "required": false, + "externalProp": true + }, + "vocab": { + "type": "string", + "defaultValue": null, + "required": false, + "externalProp": true + } } } From 1589e3813ef2993935f63e9a61495795fb8f70cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9Cnora?= Date: Fri, 10 May 2024 16:29:30 -0400 Subject: [PATCH 06/12] chore: add tests --- packages/paste-core/components/side-panel/src/SidePanel.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/paste-core/components/side-panel/src/SidePanel.tsx b/packages/paste-core/components/side-panel/src/SidePanel.tsx index 5254d1867f..26321240a9 100644 --- a/packages/paste-core/components/side-panel/src/SidePanel.tsx +++ b/packages/paste-core/components/side-panel/src/SidePanel.tsx @@ -79,6 +79,8 @@ const SidePanel = React.forwardRef( setOffsetY(boundingClientRect?.y || 0); }, []); + const sidePanelId = id || useUID(); + return ( <> {transitions( From de31615d745a76c8c07d2e75398469affff0072e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9Cnora?= Date: Mon, 13 May 2024 16:10:38 -0400 Subject: [PATCH 07/12] feat(docs): add side panel docs page --- .../components/side-panel/CHANGELOG.md | 0 .../src/pages/components/side-panel/api.mdx | 80 +++++++++++++++++++ .../pages/components/side-panel/changelog.mdx | 38 +++++++++ .../src/pages/components/side-panel/index.mdx | 78 ++++++++++++++++++ 4 files changed, 196 insertions(+) create mode 100644 packages/paste-core/components/side-panel/CHANGELOG.md create mode 100644 packages/paste-website/src/pages/components/side-panel/api.mdx create mode 100644 packages/paste-website/src/pages/components/side-panel/changelog.mdx create mode 100644 packages/paste-website/src/pages/components/side-panel/index.mdx diff --git a/packages/paste-core/components/side-panel/CHANGELOG.md b/packages/paste-core/components/side-panel/CHANGELOG.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/paste-website/src/pages/components/side-panel/api.mdx b/packages/paste-website/src/pages/components/side-panel/api.mdx new file mode 100644 index 0000000000..d0f749214f --- /dev/null +++ b/packages/paste-website/src/pages/components/side-panel/api.mdx @@ -0,0 +1,80 @@ +export const meta = { + title: 'Side Panel - API', + package: '@twilio-paste/side-panel', + description: + 'Side Panel is a container that pushes the main page content when open.', + slug: '/components/side-panel/api', +}; + +import Changelog from '@twilio-paste/side-panel/CHANGELOG.md'; // I don't know why this is needed but if you remove it the page fails to render +import packageJson from '@twilio-paste/side-panel/package.json'; + +import {SidebarCategoryRoutes} from '../../../constants'; +import ComponentPageLayout from '../../../layouts/ComponentPageLayout'; +import {getFeature, getNavigationData, getComponentApi} from '../../../utils/api'; + +export default ComponentPageLayout; + +export const getStaticProps = async () => { + const navigationData = await getNavigationData(); + const feature = await getFeature('Side Panel'); + const {componentApi, componentApiTocData} = getComponentApi('@twilio-paste/side-panel'); + return { + props: { + data: { + ...packageJson, + ...feature, + }, + componentApi, + mdxHeadings: [...mdxHeadings, ...componentApiTocData], + navigationData, + pageHeaderData: { + categoryRoute: SidebarCategoryRoutes.COMPONENTS, + githubUrl: 'https://github.com/twilio-labs/paste/tree/main/packages/paste-core/components/side-panel', + storybookUrl: '/?path=/story/components-side-panel--default', + }, + }, + }; +}; + +## Installation + +```bash +yarn add @twilio-paste/side-panel - or - yarn add @twilio-paste/core +``` + +## Usage + +```jsx +import { + SidePanel, + SidePanelBody, + SidePanelHeader, + SidePanelHeaderActions, + SidePanelPageWrapper, + SidePanelPushContentWrapper, +} from '@twilio-paste/core/side-panel'; + +const SideModalExample: React.FC = () => { + return ( + + + + {heading} + + {actions} + + + {body} + + + {page content} + + + ); +}; +``` + +## Props + + diff --git a/packages/paste-website/src/pages/components/side-panel/changelog.mdx b/packages/paste-website/src/pages/components/side-panel/changelog.mdx new file mode 100644 index 0000000000..a9b113756a --- /dev/null +++ b/packages/paste-website/src/pages/components/side-panel/changelog.mdx @@ -0,0 +1,38 @@ +export const meta = { + title: 'Side Panel - Changelog', + package: '@twilio-paste/side-panel', + description: + 'Side Panel is a container that pushes the main page content when open.', + slug: '/components/side-panel/changelog', +}; + +import Changelog from '@twilio-paste/side-panel/CHANGELOG.md'; +import packageJson from '@twilio-paste/side-panel/package.json'; + +import {SidebarCategoryRoutes} from '../../../constants'; +import ComponentPageLayout from '../../../layouts/ComponentPageLayout'; +import {getFeature, getNavigationData} from '../../../utils/api'; + +export default ComponentPageLayout; + +export const getStaticProps = async () => { + const navigationData = await getNavigationData(); + const feature = await getFeature('Side Panel'); + return { + props: { + data: { + ...packageJson, + ...feature, + }, + navigationData, + mdxHeadings, + pageHeaderData: { + categoryRoute: SidebarCategoryRoutes.COMPONENTS, + githubUrl: 'https://github.com/twilio-labs/paste/tree/main/packages/paste-core/components/side-panel', + storybookUrl: '/?path=/story/components-side-panel--default', + }, + }, + }; +}; + + diff --git a/packages/paste-website/src/pages/components/side-panel/index.mdx b/packages/paste-website/src/pages/components/side-panel/index.mdx new file mode 100644 index 0000000000..70101b4c6d --- /dev/null +++ b/packages/paste-website/src/pages/components/side-panel/index.mdx @@ -0,0 +1,78 @@ +export const meta = { + title: 'Side Panel', + package: '@twilio-paste/side-panel', + description: + 'Side Panel is a container that pushes the main page content when open.', + slug: '/components/side-panel/', +}; + +import {Anchor} from '@twilio-paste/anchor'; +import {Callout, CalloutHeading, CalloutText} from '@twilio-paste/callout'; + + +import {SidebarCategoryRoutes} from '../../../constants'; +import { + defaultExample, + footerExample, + sideModalButtonExample, + hookExample, +} from '../../../component-examples/SideModalExamples'; +import packageJson from '@twilio-paste/side-panel/package.json'; +import ComponentPageLayout from '../../../layouts/ComponentPageLayout'; +import {getFeature, getNavigationData} from '../../../utils/api'; + +export default ComponentPageLayout; + +export const getStaticProps = async () => { + const navigationData = await getNavigationData(); + const feature = await getFeature('Side Panel'); + return { + props: { + data: { + ...packageJson, + ...feature, + }, + navigationData, + mdxHeadings, + pageHeaderData: { + categoryRoute: SidebarCategoryRoutes.COMPONENTS, + githubUrl: 'https://github.com/twilio-labs/paste/tree/main/packages/paste-core/components/side-panel', + storybookUrl: '/?path=/story/components-side-panel--default', + }, + }, + }; +}; + + +// TODO: storybook example + +## Guidelines + +### About Side Modal + +Side Panel is a container that pushes the main page content when open. + + + Only use one Side Panel on a page + + We currenly only support having one Side Panel open on a page. If you have questions, please post{' '} + + a GitHub Discussion + + . + + + +### Accessibility + +Side Panel and non-modal dialogs follow these accessibility guidelines: + +- There must be a focusable element inside the dialog. +- There should be a close button so screen readers have a specific close action to target. +- There must be an accessible aria label. + +## Examples + +### Basic Side Panel + +// TODO: storybook example From 55109d0eb40af2be3e7f3892a4b920a6ad5a290f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9Cnora?= Date: Wed, 15 May 2024 09:51:38 -0400 Subject: [PATCH 08/12] chore: add more usage guidance --- .../src/pages/components/side-panel/index.mdx | 26 ++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/packages/paste-website/src/pages/components/side-panel/index.mdx b/packages/paste-website/src/pages/components/side-panel/index.mdx index 70101b4c6d..e209ae618e 100644 --- a/packages/paste-website/src/pages/components/side-panel/index.mdx +++ b/packages/paste-website/src/pages/components/side-panel/index.mdx @@ -50,7 +50,7 @@ export const getStaticProps = async () => { ### About Side Modal -Side Panel is a container that pushes the main page content when open. +Side Panel is a container that pushes the main page content when open. It's important for page content to be responsive when using a Side Panel so that the opening and closing of the panel doesn't cause the page to jump or shift. At mobile breakpoints, the Side Panel overlays the page content and takes up the full width of the viewport. Only use one Side Panel on a page @@ -76,3 +76,27 @@ Side Panel and non-modal dialogs follow these accessibility guidelines: ### Basic Side Panel // TODO: storybook example + +## Composition notes + +The Side Panel comes with some smaller components that can be used to compose a Side Panel to your application's needs. + +### Side Panel Page Wrapper + +This wrapper controls the positioning of the Side Panel with relation to the page content and should always wrap both the Side Panel itslef as well as the main page content. + +### Side Panel Header + +The Side Panel Header is a container for the descriptive title of the panel and sometimes an associated icon, in addition to any action buttons used in the panel. + +### Side Panel Header Actions + +The Side Panel Header Actions component is a container for action buttons that are used in the Side Panel Header. A "close" button should always be included. Other common actions include a MoreIcon for additional options. + +### Side Panel Body + +The Side Panel Body is a container for the main content of the Side Panel. This is where the majority of the content will be placed. + +### Side Panel Push Content Wrapper + +The Side Panel Push Content Wrapper is a container for the main page content that is pushed when the Side Panel is open. This wrapper is used to control the positioning of the main page content when the Side Panel is open. \ No newline at end of file From a2ac905d83d99cef58a1d5c52fc58513805781a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9Cnora?= Date: Mon, 20 May 2024 13:18:19 -0400 Subject: [PATCH 09/12] chore: test --- .../paste-website/src/pages/components/side-panel/index.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/paste-website/src/pages/components/side-panel/index.mdx b/packages/paste-website/src/pages/components/side-panel/index.mdx index e209ae618e..736bf9a25f 100644 --- a/packages/paste-website/src/pages/components/side-panel/index.mdx +++ b/packages/paste-website/src/pages/components/side-panel/index.mdx @@ -44,7 +44,7 @@ export const getStaticProps = async () => { }; -// TODO: storybook example +// TODO: storybook example!! ## Guidelines From d148cccb1546a2729b3bcbeb98a67906b1896a49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9Cnora?= Date: Wed, 22 May 2024 17:29:27 -0400 Subject: [PATCH 10/12] chore: finish docs --- cypress/integration/sitemap-vrt/constants.ts | 3 + .../paste-codemods/tools/.cache/mappings.json | 1 - .../components/side-panel/src/SidePanel.tsx | 14 - .../side-panel/src/SidePanelHeader.tsx | 1 + .../components/MessagingInsightsContent.tsx | 1 - .../stories/components/SidebarWithContent.tsx | 4 +- .../side-panel/stories/index.stories.tsx | 73 +- .../components/side-panel/type-docs.json | 1590 ----------------- .../src/pages/components/side-modal/index.mdx | 7 + .../src/pages/components/side-panel/api.mdx | 36 +- .../src/pages/components/side-panel/index.mdx | 138 +- 11 files changed, 218 insertions(+), 1650 deletions(-) diff --git a/cypress/integration/sitemap-vrt/constants.ts b/cypress/integration/sitemap-vrt/constants.ts index 151730c856..49e88dd27e 100644 --- a/cypress/integration/sitemap-vrt/constants.ts +++ b/cypress/integration/sitemap-vrt/constants.ts @@ -186,6 +186,9 @@ export const SITEMAP = [ "/components/sidebar-navigation/", "/components/sidebar-navigation/api", "/components/sidebar-navigation/changelog", + "/components/side-panel/", + "/components/side-panel/api", + "/components/side-panel/changelog", "/components/stack/", "/components/stack/api", "/components/stack/changelog", diff --git a/packages/paste-codemods/tools/.cache/mappings.json b/packages/paste-codemods/tools/.cache/mappings.json index 245434f9e3..4f44b5ffb3 100644 --- a/packages/paste-codemods/tools/.cache/mappings.json +++ b/packages/paste-codemods/tools/.cache/mappings.json @@ -233,7 +233,6 @@ "SidePanelContext": "@twilio-paste/core/side-panel", "SidePanelHeader": "@twilio-paste/core/side-panel", "SidePanelHeaderActions": "@twilio-paste/core/side-panel", - "SidePanelPageWrapper": "@twilio-paste/core/side-panel", "SidePanelPushContentWrapper": "@twilio-paste/core/side-panel", "Sidebar": "@twilio-paste/core/sidebar", "SidebarBetaBadge": "@twilio-paste/core/sidebar", diff --git a/packages/paste-core/components/side-panel/src/SidePanel.tsx b/packages/paste-core/components/side-panel/src/SidePanel.tsx index 26321240a9..6d33b5aed9 100644 --- a/packages/paste-core/components/side-panel/src/SidePanel.tsx +++ b/packages/paste-core/components/side-panel/src/SidePanel.tsx @@ -67,20 +67,6 @@ const SidePanel = React.forwardRef( setOffsetY(boundingClientRect?.y || 0); }, []); - const screenSize = window.innerHeight; - - const sidePanelRef = React.useRef(null); - const mergedSidePanelRef = useMergeRefs(sidePanelRef, ref) as React.RefObject; - - const [offsetY, setOffsetY] = React.useState(0); - - React.useEffect(() => { - const boundingClientRect = sidePanelRef?.current?.getBoundingClientRect(); - setOffsetY(boundingClientRect?.y || 0); - }, []); - - const sidePanelId = id || useUID(); - return ( <> {transitions( diff --git a/packages/paste-core/components/side-panel/src/SidePanelHeader.tsx b/packages/paste-core/components/side-panel/src/SidePanelHeader.tsx index 1f19ed7bee..1ffba020b1 100644 --- a/packages/paste-core/components/side-panel/src/SidePanelHeader.tsx +++ b/packages/paste-core/components/side-panel/src/SidePanelHeader.tsx @@ -56,6 +56,7 @@ const SidePanelHeader = React.forwardRef( display="flex" columnGap="space30" alignItems="center" + justifyContent="space-between" {...safelySpreadBoxProps(props)} ref={ref} element={element} diff --git a/packages/paste-core/components/side-panel/stories/components/MessagingInsightsContent.tsx b/packages/paste-core/components/side-panel/stories/components/MessagingInsightsContent.tsx index b30a9c09ef..5e3215f650 100644 --- a/packages/paste-core/components/side-panel/stories/components/MessagingInsightsContent.tsx +++ b/packages/paste-core/components/side-panel/stories/components/MessagingInsightsContent.tsx @@ -2,7 +2,6 @@ /* eslint-disable react/jsx-max-depth */ // eslint-disable-next-line eslint-comments/disable-enable-pair /* eslint-disable import/no-extraneous-dependencies */ -import { Badge } from "@twilio-paste/badge"; import { Box } from "@twilio-paste/box"; import { Button } from "@twilio-paste/button"; import { Card } from "@twilio-paste/card"; diff --git a/packages/paste-core/components/side-panel/stories/components/SidebarWithContent.tsx b/packages/paste-core/components/side-panel/stories/components/SidebarWithContent.tsx index 9119903746..4502099ed8 100644 --- a/packages/paste-core/components/side-panel/stories/components/SidebarWithContent.tsx +++ b/packages/paste-core/components/side-panel/stories/components/SidebarWithContent.tsx @@ -22,7 +22,7 @@ export const SidebarWithContent: React.FC< return ( - + Explore products diff --git a/packages/paste-core/components/side-panel/stories/index.stories.tsx b/packages/paste-core/components/side-panel/stories/index.stories.tsx index 15210c3434..7978428fe1 100644 --- a/packages/paste-core/components/side-panel/stories/index.stories.tsx +++ b/packages/paste-core/components/side-panel/stories/index.stories.tsx @@ -57,19 +57,78 @@ Default.parameters = { export const Basic = (): React.ReactNode => { const [isOpen, setIsOpen] = React.useState(true); const sidePanelId = useUID(); + const topbarSkipLinkID = useUID(); + const mainContentSkipLinkID = useUID(); return ( - - - - Toggle Side Panel - - + <> + + + + + + + + Toggle Side Panel + + + + + ); }; Basic.parameters = { padding: false, }; +export const I18n = (): React.ReactNode => { + const [isOpen, setIsOpen] = React.useState(true); + + const topbarSkipLinkID = useUID(); + const mainContentSkipLinkID = useUID(); + const sidePanelId = useUID(); + return ( + + + + + + + + Probar Panel Lateral + + + + + + Título + + + + + + + + + + ); +}; + +I18n.parameters = { + padding: false, +}; + export const ContentDemo = (): React.ReactNode => { const [isOpen, setIsOpen] = React.useState(true); @@ -148,7 +207,7 @@ export const Composed = (): React.ReactNode => { {/* Sidebar can be placed anywhere - position fixed */} - + diff --git a/packages/paste-core/components/side-panel/type-docs.json b/packages/paste-core/components/side-panel/type-docs.json index a561be698d..854fd87f72 100644 --- a/packages/paste-core/components/side-panel/type-docs.json +++ b/packages/paste-core/components/side-panel/type-docs.json @@ -3384,13 +3384,6 @@ } }, "SidePanel": { - "collapsed": { - "type": "boolean", - "defaultValue": null, - "required": true, - "externalProp": false, - "description": "Determines whether the Side Panel is open or collapsed" - }, "label": { "type": "string", "defaultValue": null, @@ -12929,1588 +12922,5 @@ "required": false, "externalProp": true } - }, - "SidePanelPageWrapper": { - "about": { - "type": "string", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "accessKey": { - "type": "string", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "aria-activedescendant": { - "type": "string", - "defaultValue": null, - "required": false, - "externalProp": true, - "description": "Identifies the currently active element when DOM focus is on a composite widget, textbox, group, or application." - }, - "aria-atomic": { - "type": "Booleanish", - "defaultValue": null, - "required": false, - "externalProp": true, - "description": "Indicates whether assistive technologies will present all, or only parts of, the changed region based on the change notifications defined by the aria-relevant attribute." - }, - "aria-autocomplete": { - "type": "\"list\" | \"none\" | \"inline\" | \"both\"", - "defaultValue": null, - "required": false, - "externalProp": true, - "description": "Indicates whether inputting text could trigger display of one or more predictions of the user's intended value for an input and specifies how predictions would be\npresented if they are made." - }, - "aria-busy": { - "type": "Booleanish", - "defaultValue": null, - "required": false, - "externalProp": true, - "description": "Indicates an element is being modified and that assistive technologies MAY want to wait until the modifications are complete before exposing them to the user." - }, - "aria-checked": { - "type": "boolean | \"true\" | \"false\" | \"mixed\"", - "defaultValue": null, - "required": false, - "externalProp": true, - "description": "Indicates the current \"checked\" state of checkboxes, radio buttons, and other widgets." - }, - "aria-colcount": { - "type": "number", - "defaultValue": null, - "required": false, - "externalProp": true, - "description": "Defines the total number of columns in a table, grid, or treegrid." - }, - "aria-colindex": { - "type": "number", - "defaultValue": null, - "required": false, - "externalProp": true, - "description": "Defines an element's column index or position with respect to the total number of columns within a table, grid, or treegrid." - }, - "aria-colspan": { - "type": "number", - "defaultValue": null, - "required": false, - "externalProp": true, - "description": "Defines the number of columns spanned by a cell or gridcell within a table, grid, or treegrid." - }, - "aria-controls": { - "type": "string", - "defaultValue": null, - "required": false, - "externalProp": true, - "description": "Identifies the element (or elements) whose contents or presence are controlled by the current element." - }, - "aria-current": { - "type": "| boolean\n | \"time\"\n | \"true\"\n | \"false\"\n | \"page\"\n | \"step\"\n | \"location\"\n | \"date\"", - "defaultValue": null, - "required": false, - "externalProp": true, - "description": "Indicates the element that represents the current item within a container or set of related elements." - }, - "aria-describedby": { - "type": "string", - "defaultValue": null, - "required": false, - "externalProp": true, - "description": "Identifies the element (or elements) that describes the object." - }, - "aria-details": { - "type": "string", - "defaultValue": null, - "required": false, - "externalProp": true, - "description": "Identifies the element that provides a detailed, extended description for the object." - }, - "aria-disabled": { - "type": "Booleanish", - "defaultValue": null, - "required": false, - "externalProp": true, - "description": "Indicates that the element is perceivable but disabled, so it is not editable or otherwise operable." - }, - "aria-dropeffect": { - "type": "\"link\" | \"none\" | \"copy\" | \"execute\" | \"move\" | \"popup\"", - "defaultValue": null, - "required": false, - "externalProp": true, - "description": "Indicates what functions can be performed when a dragged object is released on the drop target." - }, - "aria-errormessage": { - "type": "string", - "defaultValue": null, - "required": false, - "externalProp": true, - "description": "Identifies the element that provides an error message for the object." - }, - "aria-expanded": { - "type": "Booleanish", - "defaultValue": null, - "required": false, - "externalProp": true, - "description": "Indicates whether the element, or another grouping element it controls, is currently expanded or collapsed." - }, - "aria-flowto": { - "type": "string", - "defaultValue": null, - "required": false, - "externalProp": true, - "description": "Identifies the next element (or elements) in an alternate reading order of content which, at the user's discretion,\nallows assistive technology to override the general default of reading in document source order." - }, - "aria-grabbed": { - "type": "Booleanish", - "defaultValue": null, - "required": false, - "externalProp": true, - "description": "Indicates an element's \"grabbed\" state in a drag-and-drop operation." - }, - "aria-haspopup": { - "type": "| boolean\n | \"dialog\"\n | \"menu\"\n | \"true\"\n | \"false\"\n | \"grid\"\n | \"listbox\"\n | \"tree\"", - "defaultValue": null, - "required": false, - "externalProp": true, - "description": "Indicates the availability and type of interactive popup element, such as menu or dialog, that can be triggered by an element." - }, - "aria-hidden": { - "type": "Booleanish", - "defaultValue": null, - "required": false, - "externalProp": true, - "description": "Indicates whether the element is exposed to an accessibility API." - }, - "aria-invalid": { - "type": "boolean | \"true\" | \"false\" | \"grammar\" | \"spelling\"", - "defaultValue": null, - "required": false, - "externalProp": true, - "description": "Indicates the entered value does not conform to the format expected by the application." - }, - "aria-keyshortcuts": { - "type": "string", - "defaultValue": null, - "required": false, - "externalProp": true, - "description": "Indicates keyboard shortcuts that an author has implemented to activate or give focus to an element." - }, - "aria-label": { - "type": "string", - "defaultValue": null, - "required": false, - "externalProp": true, - "description": "Defines a string value that labels the current element." - }, - "aria-labelledby": { - "type": "string", - "defaultValue": null, - "required": false, - "externalProp": true, - "description": "Identifies the element (or elements) that labels the current element." - }, - "aria-level": { - "type": "number", - "defaultValue": null, - "required": false, - "externalProp": true, - "description": "Defines the hierarchical level of an element within a structure." - }, - "aria-live": { - "type": "\"off\" | \"assertive\" | \"polite\"", - "defaultValue": null, - "required": false, - "externalProp": true, - "description": "Indicates that an element will be updated, and describes the types of updates the user agents, assistive technologies, and user can expect from the live region." - }, - "aria-modal": { - "type": "Booleanish", - "defaultValue": null, - "required": false, - "externalProp": true, - "description": "Indicates whether an element is modal when displayed." - }, - "aria-multiline": { - "type": "Booleanish", - "defaultValue": null, - "required": false, - "externalProp": true, - "description": "Indicates whether a text box accepts multiple lines of input or only a single line." - }, - "aria-multiselectable": { - "type": "Booleanish", - "defaultValue": null, - "required": false, - "externalProp": true, - "description": "Indicates that the user may select more than one item from the current selectable descendants." - }, - "aria-orientation": { - "type": "\"horizontal\" | \"vertical\"", - "defaultValue": null, - "required": false, - "externalProp": true, - "description": "Indicates whether the element's orientation is horizontal, vertical, or unknown/ambiguous." - }, - "aria-owns": { - "type": "string", - "defaultValue": null, - "required": false, - "externalProp": true, - "description": "Identifies an element (or elements) in order to define a visual, functional, or contextual parent/child relationship\nbetween DOM elements where the DOM hierarchy cannot be used to represent the relationship." - }, - "aria-placeholder": { - "type": "string", - "defaultValue": null, - "required": false, - "externalProp": true, - "description": "Defines a short hint (a word or short phrase) intended to aid the user with data entry when the control has no value.\nA hint could be a sample value or a brief description of the expected format." - }, - "aria-posinset": { - "type": "number", - "defaultValue": null, - "required": false, - "externalProp": true, - "description": "Defines an element's number or position in the current set of listitems or treeitems. Not required if all elements in the set are present in the DOM." - }, - "aria-pressed": { - "type": "boolean | \"true\" | \"false\" | \"mixed\"", - "defaultValue": null, - "required": false, - "externalProp": true, - "description": "Indicates the current \"pressed\" state of toggle buttons." - }, - "aria-readonly": { - "type": "Booleanish", - "defaultValue": null, - "required": false, - "externalProp": true, - "description": "Indicates that the element is not editable, but is otherwise operable." - }, - "aria-relevant": { - "type": "| \"text\"\n | \"additions\"\n | \"additions removals\"\n | \"additions text\"\n | \"all\"\n | \"removals\"\n | \"removals additions\"\n | \"removals text\"\n | \"text additions\"\n | \"text removals\"", - "defaultValue": null, - "required": false, - "externalProp": true, - "description": "Indicates what notifications the user agent will trigger when the accessibility tree within a live region is modified." - }, - "aria-required": { - "type": "Booleanish", - "defaultValue": null, - "required": false, - "externalProp": true, - "description": "Indicates that user input is required on the element before a form may be submitted." - }, - "aria-roledescription": { - "type": "string", - "defaultValue": null, - "required": false, - "externalProp": true, - "description": "Defines a human-readable, author-localized description for the role of an element." - }, - "aria-rowcount": { - "type": "number", - "defaultValue": null, - "required": false, - "externalProp": true, - "description": "Defines the total number of rows in a table, grid, or treegrid." - }, - "aria-rowindex": { - "type": "number", - "defaultValue": null, - "required": false, - "externalProp": true, - "description": "Defines an element's row index or position with respect to the total number of rows within a table, grid, or treegrid." - }, - "aria-rowspan": { - "type": "number", - "defaultValue": null, - "required": false, - "externalProp": true, - "description": "Defines the number of rows spanned by a cell or gridcell within a table, grid, or treegrid." - }, - "aria-selected": { - "type": "Booleanish", - "defaultValue": null, - "required": false, - "externalProp": true, - "description": "Indicates the current \"selected\" state of various widgets." - }, - "aria-setsize": { - "type": "number", - "defaultValue": null, - "required": false, - "externalProp": true, - "description": "Defines the number of items in the current set of listitems or treeitems. Not required if all elements in the set are present in the DOM." - }, - "aria-sort": { - "type": "\"none\" | \"ascending\" | \"descending\" | \"other\"", - "defaultValue": null, - "required": false, - "externalProp": true, - "description": "Indicates if items in a table or grid are sorted in ascending or descending order." - }, - "aria-valuemax": { - "type": "number", - "defaultValue": null, - "required": false, - "externalProp": true, - "description": "Defines the maximum allowed value for a range widget." - }, - "aria-valuemin": { - "type": "number", - "defaultValue": null, - "required": false, - "externalProp": true, - "description": "Defines the minimum allowed value for a range widget." - }, - "aria-valuenow": { - "type": "number", - "defaultValue": null, - "required": false, - "externalProp": true, - "description": "Defines the current value for a range widget." - }, - "aria-valuetext": { - "type": "string", - "defaultValue": null, - "required": false, - "externalProp": true, - "description": "Defines the human readable text alternative of aria-valuenow for a range widget." - }, - "autoCapitalize": { - "type": "string", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "autoCorrect": { - "type": "string", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "autoSave": { - "type": "string", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "contentEditable": { - "type": "Booleanish | \"inherit\"", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "contextMenu": { - "type": "string", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "dangerouslySetInnerHTML": { - "type": "{ __html: string }", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "datatype": { - "type": "string", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "defaultChecked": { - "type": "boolean", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "defaultValue": { - "type": "string | number | readonly string[]", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "dir": { - "type": "string", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "draggable": { - "type": "Booleanish", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "element": { - "type": "string", - "defaultValue": "SIDE_PANEL_PAGE_WRAPPER", - "required": false, - "externalProp": false, - "description": "Overrides the default element name to apply unique styles with the Customization Provider" - }, - "hidden": { - "type": "boolean", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "id": { - "type": "string", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "inlist": { - "type": "any", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "inputMode": { - "type": "| \"text\"\n | \"none\"\n | \"search\"\n | \"tel\"\n | \"url\"\n | \"email\"\n | \"numeric\"\n | \"decimal\"", - "defaultValue": null, - "required": false, - "externalProp": true, - "description": "Hints at the type of data that might be entered by the user while editing the element or its contents" - }, - "is": { - "type": "string", - "defaultValue": null, - "required": false, - "externalProp": true, - "description": "Specify that a standard HTML element should behave like a defined custom built-in element" - }, - "itemID": { - "type": "string", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "itemProp": { - "type": "string", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "itemRef": { - "type": "string", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "itemScope": { - "type": "boolean", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "itemType": { - "type": "string", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "key": { - "type": "Key", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "lang": { - "type": "string", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "nonce": { - "type": "string", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onAbort": { - "type": "ReactEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onAbortCapture": { - "type": "ReactEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onAnimationEnd": { - "type": "AnimationEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onAnimationEndCapture": { - "type": "AnimationEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onAnimationIteration": { - "type": "AnimationEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onAnimationIterationCapture": { - "type": "AnimationEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onAnimationStart": { - "type": "AnimationEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onAnimationStartCapture": { - "type": "AnimationEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onAuxClick": { - "type": "MouseEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onAuxClickCapture": { - "type": "MouseEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onBeforeInput": { - "type": "FormEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onBeforeInputCapture": { - "type": "FormEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onBlur": { - "type": "FocusEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onBlurCapture": { - "type": "FocusEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onCanPlay": { - "type": "ReactEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onCanPlayCapture": { - "type": "ReactEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onCanPlayThrough": { - "type": "ReactEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onCanPlayThroughCapture": { - "type": "ReactEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onChange": { - "type": "FormEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onChangeCapture": { - "type": "FormEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onClick": { - "type": "MouseEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onClickCapture": { - "type": "MouseEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onCompositionEnd": { - "type": "CompositionEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onCompositionEndCapture": { - "type": "CompositionEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onCompositionStart": { - "type": "CompositionEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onCompositionStartCapture": { - "type": "CompositionEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onCompositionUpdate": { - "type": "CompositionEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onCompositionUpdateCapture": { - "type": "CompositionEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onContextMenu": { - "type": "MouseEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onContextMenuCapture": { - "type": "MouseEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onCopy": { - "type": "ClipboardEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onCopyCapture": { - "type": "ClipboardEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onCut": { - "type": "ClipboardEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onCutCapture": { - "type": "ClipboardEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onDoubleClick": { - "type": "MouseEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onDoubleClickCapture": { - "type": "MouseEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onDrag": { - "type": "DragEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onDragCapture": { - "type": "DragEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onDragEnd": { - "type": "DragEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onDragEndCapture": { - "type": "DragEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onDragEnter": { - "type": "DragEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onDragEnterCapture": { - "type": "DragEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onDragExit": { - "type": "DragEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onDragExitCapture": { - "type": "DragEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onDragLeave": { - "type": "DragEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onDragLeaveCapture": { - "type": "DragEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onDragOver": { - "type": "DragEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onDragOverCapture": { - "type": "DragEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onDragStart": { - "type": "DragEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onDragStartCapture": { - "type": "DragEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onDrop": { - "type": "DragEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onDropCapture": { - "type": "DragEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onDurationChange": { - "type": "ReactEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onDurationChangeCapture": { - "type": "ReactEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onEmptied": { - "type": "ReactEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onEmptiedCapture": { - "type": "ReactEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onEncrypted": { - "type": "ReactEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onEncryptedCapture": { - "type": "ReactEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onEnded": { - "type": "ReactEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onEndedCapture": { - "type": "ReactEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onError": { - "type": "ReactEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onErrorCapture": { - "type": "ReactEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onFocus": { - "type": "FocusEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onFocusCapture": { - "type": "FocusEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onGotPointerCapture": { - "type": "PointerEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onGotPointerCaptureCapture": { - "type": "PointerEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onInput": { - "type": "FormEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onInputCapture": { - "type": "FormEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onInvalid": { - "type": "FormEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onInvalidCapture": { - "type": "FormEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onKeyDown": { - "type": "KeyboardEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onKeyDownCapture": { - "type": "KeyboardEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onKeyPress": { - "type": "KeyboardEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onKeyPressCapture": { - "type": "KeyboardEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onKeyUp": { - "type": "KeyboardEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onKeyUpCapture": { - "type": "KeyboardEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onLoad": { - "type": "ReactEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onLoadCapture": { - "type": "ReactEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onLoadedData": { - "type": "ReactEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onLoadedDataCapture": { - "type": "ReactEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onLoadedMetadata": { - "type": "ReactEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onLoadedMetadataCapture": { - "type": "ReactEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onLoadStart": { - "type": "ReactEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onLoadStartCapture": { - "type": "ReactEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onLostPointerCapture": { - "type": "PointerEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onLostPointerCaptureCapture": { - "type": "PointerEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onMouseDown": { - "type": "MouseEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onMouseDownCapture": { - "type": "MouseEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onMouseEnter": { - "type": "MouseEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onMouseLeave": { - "type": "MouseEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onMouseMove": { - "type": "MouseEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onMouseMoveCapture": { - "type": "MouseEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onMouseOut": { - "type": "MouseEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onMouseOutCapture": { - "type": "MouseEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onMouseOver": { - "type": "MouseEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onMouseOverCapture": { - "type": "MouseEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onMouseUp": { - "type": "MouseEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onMouseUpCapture": { - "type": "MouseEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onPaste": { - "type": "ClipboardEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onPasteCapture": { - "type": "ClipboardEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onPause": { - "type": "ReactEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onPauseCapture": { - "type": "ReactEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onPlay": { - "type": "ReactEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onPlayCapture": { - "type": "ReactEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onPlaying": { - "type": "ReactEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onPlayingCapture": { - "type": "ReactEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onPointerCancel": { - "type": "PointerEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onPointerCancelCapture": { - "type": "PointerEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onPointerDown": { - "type": "PointerEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onPointerDownCapture": { - "type": "PointerEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onPointerEnter": { - "type": "PointerEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onPointerEnterCapture": { - "type": "PointerEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onPointerLeave": { - "type": "PointerEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onPointerLeaveCapture": { - "type": "PointerEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onPointerMove": { - "type": "PointerEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onPointerMoveCapture": { - "type": "PointerEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onPointerOut": { - "type": "PointerEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onPointerOutCapture": { - "type": "PointerEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onPointerOver": { - "type": "PointerEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onPointerOverCapture": { - "type": "PointerEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onPointerUp": { - "type": "PointerEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onPointerUpCapture": { - "type": "PointerEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onProgress": { - "type": "ReactEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onProgressCapture": { - "type": "ReactEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onRateChange": { - "type": "ReactEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onRateChangeCapture": { - "type": "ReactEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onReset": { - "type": "FormEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onResetCapture": { - "type": "FormEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onResize": { - "type": "ReactEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onResizeCapture": { - "type": "ReactEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onScroll": { - "type": "UIEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onScrollCapture": { - "type": "UIEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onSeeked": { - "type": "ReactEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onSeekedCapture": { - "type": "ReactEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onSeeking": { - "type": "ReactEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onSeekingCapture": { - "type": "ReactEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onSelect": { - "type": "ReactEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onSelectCapture": { - "type": "ReactEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onStalled": { - "type": "ReactEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onStalledCapture": { - "type": "ReactEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onSubmit": { - "type": "FormEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onSubmitCapture": { - "type": "FormEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onSuspend": { - "type": "ReactEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onSuspendCapture": { - "type": "ReactEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onTimeUpdate": { - "type": "ReactEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onTimeUpdateCapture": { - "type": "ReactEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onTouchCancel": { - "type": "TouchEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onTouchCancelCapture": { - "type": "TouchEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onTouchEnd": { - "type": "TouchEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onTouchEndCapture": { - "type": "TouchEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onTouchMove": { - "type": "TouchEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onTouchMoveCapture": { - "type": "TouchEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onTouchStart": { - "type": "TouchEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onTouchStartCapture": { - "type": "TouchEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onTransitionEnd": { - "type": "TransitionEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onTransitionEndCapture": { - "type": "TransitionEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onVolumeChange": { - "type": "ReactEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onVolumeChangeCapture": { - "type": "ReactEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onWaiting": { - "type": "ReactEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onWaitingCapture": { - "type": "ReactEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onWheel": { - "type": "WheelEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "onWheelCapture": { - "type": "WheelEventHandler", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "placeholder": { - "type": "string", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "prefix": { - "type": "string", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "property": { - "type": "string", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "radioGroup": { - "type": "string", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "resource": { - "type": "string", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "results": { - "type": "number", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "role": { - "type": "AriaRole", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "security": { - "type": "string", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "slot": { - "type": "string", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "spellCheck": { - "type": "Booleanish", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "suppressContentEditableWarning": { - "type": "boolean", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "suppressHydrationWarning": { - "type": "boolean", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "tabIndex": { - "type": "number", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "title": { - "type": "string", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "translate": { - "type": "\"yes\" | \"no\"", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "typeof": { - "type": "string", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "unselectable": { - "type": "\"on\" | \"off\"", - "defaultValue": null, - "required": false, - "externalProp": true - }, - "vocab": { - "type": "string", - "defaultValue": null, - "required": false, - "externalProp": true - } } } diff --git a/packages/paste-website/src/pages/components/side-modal/index.mdx b/packages/paste-website/src/pages/components/side-modal/index.mdx index 5071df70f2..55246c82a3 100644 --- a/packages/paste-website/src/pages/components/side-modal/index.mdx +++ b/packages/paste-website/src/pages/components/side-modal/index.mdx @@ -100,6 +100,13 @@ Side Modal and non-modal dialogs follow these accessibility guidelines: - A Side Modal is a focus trap, and focus is placed inside it when it's shown. - A Side Modal must be triggered by an explicit user action, e.g. clicking a button. +### Side Panel vs. Side Modal + +[Side Panel](/components/side-panel) and Side Modal are both used to display additional content on the side of the main page content. Side Panel is used for content that is not blocking and can be interacted with while the main page content is still visible. Side Panels are designed to remain open while the user completes other tasks in the main content of the page. Side Modals typically need to be closed before the user returns to their main task as the Modal overlays part of the page. + +Side Modals are a focus trap and can't be tabbed out of, while the content of Side Panels can be tabbed through and then tabbed out of to return to the main page content. + + ## Examples ### Basic Side Modal diff --git a/packages/paste-website/src/pages/components/side-panel/api.mdx b/packages/paste-website/src/pages/components/side-panel/api.mdx index d0f749214f..cdda14550d 100644 --- a/packages/paste-website/src/pages/components/side-panel/api.mdx +++ b/packages/paste-website/src/pages/components/side-panel/api.mdx @@ -47,30 +47,34 @@ yarn add @twilio-paste/side-panel - or - yarn add @twilio-paste/core ```jsx import { + SidePanelContainer, SidePanel, - SidePanelBody, SidePanelHeader, SidePanelHeaderActions, - SidePanelPageWrapper, + SidePanelBody, SidePanelPushContentWrapper, + SidePanelButton, } from '@twilio-paste/core/side-panel'; const SideModalExample: React.FC = () => { + const [isOpen, setIsOpen] = React.useState(true); return ( - - - - {heading} - - {actions} - - - {body} - - - {page content} - - + + + + Heading goes here. + + Actions go here. + + + + Side Panel content goes here. + + + + Toggle Side Panel + + ); }; ``` diff --git a/packages/paste-website/src/pages/components/side-panel/index.mdx b/packages/paste-website/src/pages/components/side-panel/index.mdx index 736bf9a25f..22caeac6a0 100644 --- a/packages/paste-website/src/pages/components/side-panel/index.mdx +++ b/packages/paste-website/src/pages/components/side-panel/index.mdx @@ -8,7 +8,8 @@ export const meta = { import {Anchor} from '@twilio-paste/anchor'; import {Callout, CalloutHeading, CalloutText} from '@twilio-paste/callout'; - +import {SidePanel, SidePanelBody, SidePanelContainer, SidePanelHeader, SidePanelHeaderActions, SidePanelPushContentWrapper, SidePanelButton} from '@twilio-paste/side-panel'; +import {Heading} from "@twilio-paste/heading" import {SidebarCategoryRoutes} from '../../../constants'; import { @@ -43,19 +44,48 @@ export const getStaticProps = async () => { }; }; - -// TODO: storybook example!! + { + const [isOpen, setIsOpen] = React.useState(true); + const sidePanelId = useUID(); + return ( + + + + Heading + + + + + + + Side Panel content goes here. + + + + + Toggle Side Panel + + + + )`} +/> ## Guidelines -### About Side Modal +### About Side Panel Side Panel is a container that pushes the main page content when open. It's important for page content to be responsive when using a Side Panel so that the opening and closing of the panel doesn't cause the page to jump or shift. At mobile breakpoints, the Side Panel overlays the page content and takes up the full width of the viewport. Only use one Side Panel on a page - We currenly only support having one Side Panel open on a page. If you have questions, please post{' '} + We currently only support having one Side Panel open on a page. If you have questions, please post{' '} a GitHub Discussion @@ -65,38 +95,108 @@ Side Panel is a container that pushes the main page content when open. It's impo ### Accessibility -Side Panel and non-modal dialogs follow these accessibility guidelines: +- There must be an accessible aria label. Pass the descriptive label to `SidePanel` using the `label` prop. +- The close button in the Side Panel Header as well as the Side Panel Button / Side Panel Badge Button all use `aria-controls` and `aria-expanded` to indicate the connection to and the state of the Side Panel. +- Focus is placed on the close button when the Side Panel is opened, but the Side Panel is not a focus trap. Users can tab through the Side Panel content and then tab out of the Side Panel to the main page content without closing the Side Panel. + +### Side Panel vs. Side Modal -- There must be a focusable element inside the dialog. -- There should be a close button so screen readers have a specific close action to target. -- There must be an accessible aria label. +Side Panel and [Side Modal](/components/side-modal) are both used to display additional content on the side of the main page content. Side Panel is used for content that is not blocking and can be interacted with while the main page content is still visible. Side Panels are designed to remain open while the user completes other tasks in the main content of the page. Side Modals typically need to be closed before the user returns to their main task as the Modal overlays part of the page. + +Side Modals are a focus trap and can't be tabbed out of, while the content of Side Panels can be tabbed through and then tabbed out of to return to the main page content. ## Examples ### Basic Side Panel -// TODO: storybook example +Pass the `isOpen` and `setIsOpen` props to the `SidePanelContainer` component to control the open and close state of the Side Panel. + + { + const [isOpen, setIsOpen] = React.useState(true); + const sidePanelId = useUID(); + return ( + + + + Heading + + + + + + + Side Panel content goes here. + + + + + Toggle Side Panel + + + + )`} +/> + +### Internationalization + +To internationalize Side Panel, simply pass different text as children to the Side Panel components. The only exceptions are the close button in the SidePanelHeader and the SidePanelButton/SidePanelBadgeButton. To change the buttons' accessible label text, use the `i18nCloseSidePanelTitle` and `i18nOpenSidePanel` props on the `SidePanelContainer`. + + { + const [isOpen, setIsOpen] = React.useState(true); + const sidePanelId = useUID(); + return ( + + + + Título + + + ... + + + + + Probar Panel Lateral + + + + )`} +/> ## Composition notes -The Side Panel comes with some smaller components that can be used to compose a Side Panel to your application's needs. +The Side Panel comes with some smaller components that can be used to compose a Side Panel to your application's needs. All of the following components should be used inside of a Side Panel Container, with Side Panel and Side Panel Push Content Wrapper being its direct children. The Side Panel Container controls the positioning of the Side Panel with relation to the page content. -### Side Panel Page Wrapper +### Side Panel -This wrapper controls the positioning of the Side Panel with relation to the page content and should always wrap both the Side Panel itslef as well as the main page content. +The Side Panel contains all the various elements of the component. -### Side Panel Header +#### Side Panel Header -The Side Panel Header is a container for the descriptive title of the panel and sometimes an associated icon, in addition to any action buttons used in the panel. +The Side Panel Header is a container for the descriptive title of the panel and sometimes an associated icon, in addition to any action buttons used in the panel. It also contains the close button. -### Side Panel Header Actions +##### Side Panel Header Actions -The Side Panel Header Actions component is a container for action buttons that are used in the Side Panel Header. A "close" button should always be included. Other common actions include a MoreIcon for additional options. +The Side Panel Header Actions component is a container for action buttons that are used in the Side Panel Header. Common actions include a `MoreIcon` for additional menu options. -### Side Panel Body +#### Side Panel Body The Side Panel Body is a container for the main content of the Side Panel. This is where the majority of the content will be placed. ### Side Panel Push Content Wrapper -The Side Panel Push Content Wrapper is a container for the main page content that is pushed when the Side Panel is open. This wrapper is used to control the positioning of the main page content when the Side Panel is open. \ No newline at end of file +The Side Panel Push Content Wrapper is a container for the main page content that is pushed to the side when the Side Panel is open. This wrapper is used to control the positioning of the main page content when the Side Panel is open. Ensuring that the content of this component is fully responsive is important to prevent the page from jumping or shifting when the Side Panel is opened or closed. + +#### Side Panel Button (or Side Panel Badge Button) + +In order to ensure accessibility, use one of the buttons exported from the Side Panel package as the trigger for the Side Panel. The Side Panel Button is a button that opens the Side Panel when clicked. \ No newline at end of file From 93b154fae2cd0293cb312fdd1fe0a71f49efbc58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9Cnora?= Date: Wed, 22 May 2024 17:36:10 -0400 Subject: [PATCH 11/12] chore: changeset --- .changeset/yellow-geese-sneeze.md | 6 ++++ .../side-panel/src/SidePanelPageWrapper.tsx | 29 ------------------- .../src/pages/components/side-panel/index.mdx | 2 -- 3 files changed, 6 insertions(+), 31 deletions(-) create mode 100644 .changeset/yellow-geese-sneeze.md delete mode 100644 packages/paste-core/components/side-panel/src/SidePanelPageWrapper.tsx diff --git a/.changeset/yellow-geese-sneeze.md b/.changeset/yellow-geese-sneeze.md new file mode 100644 index 0000000000..6abda8edd9 --- /dev/null +++ b/.changeset/yellow-geese-sneeze.md @@ -0,0 +1,6 @@ +--- +"@twilio-paste/side-panel": patch +"@twilio-paste/core": patch +--- + +[Side Panel] Fix positioning of close button when no header actions are being used by adding justifyContent="space-between" diff --git a/packages/paste-core/components/side-panel/src/SidePanelPageWrapper.tsx b/packages/paste-core/components/side-panel/src/SidePanelPageWrapper.tsx deleted file mode 100644 index 4b81133fa3..0000000000 --- a/packages/paste-core/components/side-panel/src/SidePanelPageWrapper.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import { Box, safelySpreadBoxProps } from "@twilio-paste/box"; -import type { BoxProps } from "@twilio-paste/box"; -import type { HTMLPasteProps } from "@twilio-paste/types"; -import * as React from "react"; - -export interface SidePanelPageWrapperProps extends HTMLPasteProps<"div"> { - children?: React.ReactNode; - /** - * Overrides the default element name to apply unique styles with the Customization Provider - * @default "SIDE_PANEL_PAGE_WRAPPER" - * @type {BoxProps['element']} - * @memberof SidePanelPageWrapperProps - */ - element?: BoxProps["element"]; -} - -const SidePanelPageWrapper = React.forwardRef( - ({ element = "SIDE_PANEL_PAGE_WRAPPER", children, ...props }, ref) => { - return ( - - {children} - - ); - }, -); - -SidePanelPageWrapper.displayName = "SidePanelPageWrapper"; - -export { SidePanelPageWrapper }; diff --git a/packages/paste-website/src/pages/components/side-panel/index.mdx b/packages/paste-website/src/pages/components/side-panel/index.mdx index 22caeac6a0..23d79371af 100644 --- a/packages/paste-website/src/pages/components/side-panel/index.mdx +++ b/packages/paste-website/src/pages/components/side-panel/index.mdx @@ -8,8 +8,6 @@ export const meta = { import {Anchor} from '@twilio-paste/anchor'; import {Callout, CalloutHeading, CalloutText} from '@twilio-paste/callout'; -import {SidePanel, SidePanelBody, SidePanelContainer, SidePanelHeader, SidePanelHeaderActions, SidePanelPushContentWrapper, SidePanelButton} from '@twilio-paste/side-panel'; -import {Heading} from "@twilio-paste/heading" import {SidebarCategoryRoutes} from '../../../constants'; import { From 1b632f0058d9b480c0881e856ca47659e840ab65 Mon Sep 17 00:00:00 2001 From: Nora Krantz <75342690+nkrantz@users.noreply.github.com> Date: Thu, 23 May 2024 11:42:07 -0300 Subject: [PATCH 12/12] Update packages/paste-website/src/pages/components/side-panel/index.mdx Co-authored-by: Sarah --- .../paste-website/src/pages/components/side-panel/index.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/paste-website/src/pages/components/side-panel/index.mdx b/packages/paste-website/src/pages/components/side-panel/index.mdx index 23d79371af..c8e2f0240e 100644 --- a/packages/paste-website/src/pages/components/side-panel/index.mdx +++ b/packages/paste-website/src/pages/components/side-panel/index.mdx @@ -173,7 +173,7 @@ export const SidePanelExample = (): React.ReactNode => { ## Composition notes -The Side Panel comes with some smaller components that can be used to compose a Side Panel to your application's needs. All of the following components should be used inside of a Side Panel Container, with Side Panel and Side Panel Push Content Wrapper being its direct children. The Side Panel Container controls the positioning of the Side Panel with relation to the page content. +The Side Panel comes with some smaller components that can be used to compose a Side Panel to your application's needs. All of the following components should be used inside of a `SidePanelContainer`, with `SidePanel` and `SidePanelPushContentWrapper` being its direct children. The Side Panel Container controls the positioning of the Side Panel with relation to the page content. ### Side Panel