@rmwc/menu
Advanced tools
Comparing version
@@ -8,2 +8,3 @@ "use strict"; | ||
var menu_surface_1 = require("@material/menu-surface"); | ||
var animation_1 = require("@material/animation"); | ||
var ANCHOR_CORNER_MAP = { | ||
@@ -71,20 +72,2 @@ bottomEnd: 'BOTTOM_END', | ||
} | ||
}, | ||
isFirstElementFocused: function () { | ||
return !!firstFocusableElementRef.current && | ||
firstFocusableElementRef.current === document.activeElement; | ||
}, | ||
isLastElementFocused: function () { | ||
return !!firstFocusableElementRef.current && | ||
firstFocusableElementRef.current === document.activeElement; | ||
}, | ||
focusFirstElement: function () { | ||
return !!firstFocusableElementRef.current && | ||
firstFocusableElementRef.current.focus && | ||
firstFocusableElementRef.current.focus(); | ||
}, | ||
focusLastElement: function () { | ||
return !!firstFocusableElementRef.current && | ||
firstFocusableElementRef.current.focus && | ||
firstFocusableElementRef.current.focus(); | ||
} | ||
@@ -141,5 +124,9 @@ }; | ||
setOpen(false); | ||
}, notifyClosing: function () { | ||
return emit(menu_surface_1.MDCMenuSurfaceFoundation.strings.CLOSING_EVENT, {}); | ||
}, notifyOpen: function () { | ||
emit('onOpen', {}); | ||
registerBodyClickListener(); | ||
}, notifyOpening: function () { | ||
return emit(menu_surface_1.MDCMenuSurfaceFoundation.strings.OPENING_EVENT, {}); | ||
}, isElementInContainer: function (el) { | ||
@@ -151,3 +138,4 @@ return rootEl.ref === el || (!!rootEl.ref && rootEl.ref.contains(el)); | ||
}, setTransformOrigin: function (origin) { | ||
rootEl.setStyle(menu_surface_1.util.getTransformPropertyName(window) + "-origin", origin); | ||
var propertyName = animation_1.getCorrectPropertyName(window, 'transform') + "-origin"; | ||
rootEl.setStyle(propertyName, origin); | ||
} }, getFocusAdapterMethods()), getDimensionAdapterMethods())); | ||
@@ -154,0 +142,0 @@ // Fixes a very annoying issue where the menu isn't stateful |
@@ -39,3 +39,3 @@ import * as RMWC from '@rmwc/types'; | ||
export declare const MenuSurface: { | ||
<Tag extends React.ElementType<any> = "div">(props: RMWC.ComponentProps<MenuSurfaceProps, React.HTMLProps<HTMLElement>, Tag>, ref: any): JSX.Element; | ||
<Tag extends React.ElementType<any> = "div">(props: RMWC.ComponentProps<MenuSurfaceProps, React.HTMLProps<HTMLElement>, Tag>, ref: any): React.JSX.Element; | ||
displayName: string; | ||
@@ -50,4 +50,4 @@ }; | ||
export declare const MenuSurfaceAnchor: { | ||
<Tag extends React.ElementType<any> = "div">(props: RMWC.ComponentProps<MenuSurfaceAnchorProps, React.HTMLProps<HTMLElement>, Tag>, ref: any): JSX.Element; | ||
<Tag extends React.ElementType<any> = "div">(props: RMWC.ComponentProps<MenuSurfaceAnchorProps, React.HTMLProps<HTMLElement>, Tag>, ref: any): React.JSX.Element; | ||
displayName: string; | ||
}; |
@@ -93,3 +93,3 @@ "use strict"; | ||
// fixes an issue with nested span element on list items | ||
var el = base_1.closest(evt.target, '.mdc-list-item'); | ||
var el = base_1.closest(evt.target, '.mdc-deprecated-list-item'); | ||
el && foundation.handleItemAction(el); | ||
@@ -96,0 +96,0 @@ }, [foundation, onClick]); |
@@ -33,3 +33,3 @@ import * as RMWC from '@rmwc/types'; | ||
export declare const MenuItems: { | ||
<Tag extends React.ElementType<any> = "div">(props: RMWC.ComponentProps<MenuItemsProps, React.HTMLProps<HTMLElement>, Tag>, ref: any): JSX.Element; | ||
<Tag extends React.ElementType<any> = "div">(props: RMWC.ComponentProps<MenuItemsProps, React.HTMLProps<HTMLElement>, Tag>, ref: any): React.JSX.Element; | ||
displayName: string; | ||
@@ -42,3 +42,3 @@ }; | ||
export declare const MenuItem: { | ||
<Tag extends React.ElementType<any> = "div">(props: RMWC.ComponentProps<MenuItemProps, React.HTMLProps<HTMLElement>, Tag>, ref: any): JSX.Element; | ||
<Tag extends React.ElementType<any> = "div">(props: RMWC.ComponentProps<MenuItemProps, React.HTMLProps<HTMLElement>, Tag>, ref: any): React.JSX.Element; | ||
displayName: string; | ||
@@ -45,0 +45,0 @@ }; |
@@ -1,3 +0,3 @@ | ||
/// <reference types="react" /> | ||
export default function Readme(): JSX.Element; | ||
export declare const galleryExample: JSX.Element; | ||
import React from 'react'; | ||
export default function Readme(): React.JSX.Element; | ||
export declare const galleryExample: React.JSX.Element; |
@@ -122,5 +122,5 @@ "use strict"; | ||
exports.galleryExample = (react_1.default.createElement("div", { "aria-hidden": "false", className: "mdc-menu mdc-menu-surface--open mdc-menu-surface", style: { position: 'static' } }, | ||
react_1.default.createElement("div", { role: "menu", className: "mdc-list mdc-menu__items mdc-list" }, | ||
react_1.default.createElement("div", { role: "menuitem", className: "mdc-ripple-upgraded mdc-list-item" }, "Cookies"), | ||
react_1.default.createElement("div", { role: "menuitem", className: "mdc-ripple-upgraded mdc-list-item" }, "Pizza"), | ||
react_1.default.createElement("div", { role: "menuitem", className: "mdc-ripple-upgraded mdc-list-item" }, "Icecream")))); | ||
react_1.default.createElement("div", { role: "menu", className: "mdc-deprecated-list mdc-menu__items mdc-deprecated-list" }, | ||
react_1.default.createElement("div", { role: "menuitem", className: "mdc-ripple-upgraded mdc-deprecated-list-item" }, "Cookies"), | ||
react_1.default.createElement("div", { role: "menuitem", className: "mdc-ripple-upgraded mdc-deprecated-list-item" }, "Pizza"), | ||
react_1.default.createElement("div", { role: "menuitem", className: "mdc-ripple-upgraded mdc-deprecated-list-item" }, "Icecream")))); |
import { __assign, __read, __rest } from "tslib"; | ||
import { useCallback, useEffect, useState, useRef } from 'react'; | ||
import { useFoundation, closest, emptyClientRect, raf } from '@rmwc/base'; | ||
import { MDCMenuSurfaceFoundation, util } from '@material/menu-surface'; | ||
import { MDCMenuSurfaceFoundation } from '@material/menu-surface'; | ||
import { getCorrectPropertyName } from '@material/animation'; | ||
var ANCHOR_CORNER_MAP = { | ||
@@ -67,20 +68,2 @@ bottomEnd: 'BOTTOM_END', | ||
} | ||
}, | ||
isFirstElementFocused: function () { | ||
return !!firstFocusableElementRef.current && | ||
firstFocusableElementRef.current === document.activeElement; | ||
}, | ||
isLastElementFocused: function () { | ||
return !!firstFocusableElementRef.current && | ||
firstFocusableElementRef.current === document.activeElement; | ||
}, | ||
focusFirstElement: function () { | ||
return !!firstFocusableElementRef.current && | ||
firstFocusableElementRef.current.focus && | ||
firstFocusableElementRef.current.focus(); | ||
}, | ||
focusLastElement: function () { | ||
return !!firstFocusableElementRef.current && | ||
firstFocusableElementRef.current.focus && | ||
firstFocusableElementRef.current.focus(); | ||
} | ||
@@ -137,5 +120,9 @@ }; | ||
setOpen(false); | ||
}, notifyClosing: function () { | ||
return emit(MDCMenuSurfaceFoundation.strings.CLOSING_EVENT, {}); | ||
}, notifyOpen: function () { | ||
emit('onOpen', {}); | ||
registerBodyClickListener(); | ||
}, notifyOpening: function () { | ||
return emit(MDCMenuSurfaceFoundation.strings.OPENING_EVENT, {}); | ||
}, isElementInContainer: function (el) { | ||
@@ -147,3 +134,4 @@ return rootEl.ref === el || (!!rootEl.ref && rootEl.ref.contains(el)); | ||
}, setTransformOrigin: function (origin) { | ||
rootEl.setStyle(util.getTransformPropertyName(window) + "-origin", origin); | ||
var propertyName = getCorrectPropertyName(window, 'transform') + "-origin"; | ||
rootEl.setStyle(propertyName, origin); | ||
} }, getFocusAdapterMethods()), getDimensionAdapterMethods())); | ||
@@ -150,0 +138,0 @@ // Fixes a very annoying issue where the menu isn't stateful |
@@ -39,3 +39,3 @@ import * as RMWC from '@rmwc/types'; | ||
export declare const MenuSurface: { | ||
<Tag extends React.ElementType<any> = "div">(props: RMWC.ComponentProps<MenuSurfaceProps, React.HTMLProps<HTMLElement>, Tag>, ref: any): JSX.Element; | ||
<Tag extends React.ElementType<any> = "div">(props: RMWC.ComponentProps<MenuSurfaceProps, React.HTMLProps<HTMLElement>, Tag>, ref: any): React.JSX.Element; | ||
displayName: string; | ||
@@ -50,4 +50,4 @@ }; | ||
export declare const MenuSurfaceAnchor: { | ||
<Tag extends React.ElementType<any> = "div">(props: RMWC.ComponentProps<MenuSurfaceAnchorProps, React.HTMLProps<HTMLElement>, Tag>, ref: any): JSX.Element; | ||
<Tag extends React.ElementType<any> = "div">(props: RMWC.ComponentProps<MenuSurfaceAnchorProps, React.HTMLProps<HTMLElement>, Tag>, ref: any): React.JSX.Element; | ||
displayName: string; | ||
}; |
@@ -90,3 +90,3 @@ import { __assign, __read, __rest, __spreadArray } from "tslib"; | ||
// fixes an issue with nested span element on list items | ||
var el = closest(evt.target, '.mdc-list-item'); | ||
var el = closest(evt.target, '.mdc-deprecated-list-item'); | ||
el && foundation.handleItemAction(el); | ||
@@ -93,0 +93,0 @@ }, [foundation, onClick]); |
@@ -33,3 +33,3 @@ import * as RMWC from '@rmwc/types'; | ||
export declare const MenuItems: { | ||
<Tag extends React.ElementType<any> = "div">(props: RMWC.ComponentProps<MenuItemsProps, React.HTMLProps<HTMLElement>, Tag>, ref: any): JSX.Element; | ||
<Tag extends React.ElementType<any> = "div">(props: RMWC.ComponentProps<MenuItemsProps, React.HTMLProps<HTMLElement>, Tag>, ref: any): React.JSX.Element; | ||
displayName: string; | ||
@@ -42,3 +42,3 @@ }; | ||
export declare const MenuItem: { | ||
<Tag extends React.ElementType<any> = "div">(props: RMWC.ComponentProps<MenuItemProps, React.HTMLProps<HTMLElement>, Tag>, ref: any): JSX.Element; | ||
<Tag extends React.ElementType<any> = "div">(props: RMWC.ComponentProps<MenuItemProps, React.HTMLProps<HTMLElement>, Tag>, ref: any): React.JSX.Element; | ||
displayName: string; | ||
@@ -45,0 +45,0 @@ }; |
@@ -1,3 +0,3 @@ | ||
/// <reference types="react" /> | ||
export default function Readme(): JSX.Element; | ||
export declare const galleryExample: JSX.Element; | ||
import React from 'react'; | ||
export default function Readme(): React.JSX.Element; | ||
export declare const galleryExample: React.JSX.Element; |
@@ -118,5 +118,5 @@ import { __read } from "tslib"; | ||
export var galleryExample = (React.createElement("div", { "aria-hidden": "false", className: "mdc-menu mdc-menu-surface--open mdc-menu-surface", style: { position: 'static' } }, | ||
React.createElement("div", { role: "menu", className: "mdc-list mdc-menu__items mdc-list" }, | ||
React.createElement("div", { role: "menuitem", className: "mdc-ripple-upgraded mdc-list-item" }, "Cookies"), | ||
React.createElement("div", { role: "menuitem", className: "mdc-ripple-upgraded mdc-list-item" }, "Pizza"), | ||
React.createElement("div", { role: "menuitem", className: "mdc-ripple-upgraded mdc-list-item" }, "Icecream")))); | ||
React.createElement("div", { role: "menu", className: "mdc-deprecated-list mdc-menu__items mdc-deprecated-list" }, | ||
React.createElement("div", { role: "menuitem", className: "mdc-ripple-upgraded mdc-deprecated-list-item" }, "Cookies"), | ||
React.createElement("div", { role: "menuitem", className: "mdc-ripple-upgraded mdc-deprecated-list-item" }, "Pizza"), | ||
React.createElement("div", { role: "menuitem", className: "mdc-ripple-upgraded mdc-deprecated-list-item" }, "Icecream")))); |
{ | ||
"name": "@rmwc/menu", | ||
"version": "8.0.8", | ||
"version": "14.0.0-alpha.0", | ||
"description": "RMWC Menu component", | ||
@@ -39,9 +39,10 @@ "main": "dist/index.js", | ||
"dependencies": { | ||
"@material/menu": "^8.0.0", | ||
"@material/menu-surface": "^8.0.0", | ||
"@rmwc/base": "^8.0.8", | ||
"@rmwc/list": "^8.0.8", | ||
"@rmwc/types": "^8.0.8" | ||
"@material/animation": "^14.0.0", | ||
"@material/menu": "^14.0.0", | ||
"@material/menu-surface": "^14.0.0", | ||
"@rmwc/base": "^14.0.0-alpha.0", | ||
"@rmwc/list": "^14.0.0-alpha.0", | ||
"@rmwc/types": "^14.0.0-alpha.0" | ||
}, | ||
"gitHead": "d9befec0e3b258864b71686eecd16c16feb43cf1" | ||
} |
282
README.md
@@ -22,85 +22,93 @@ # Menus | ||
```jsx | ||
function Example() { | ||
const [open, setOpen] = React.useState(false); | ||
<> | ||
{function Example() { | ||
const [open, setOpen] = React.useState(false); | ||
return ( | ||
<MenuSurfaceAnchor> | ||
<Menu | ||
open={open} | ||
onSelect={(evt) => console.log(evt.detail.index)} | ||
onClose={(evt) => setOpen(false)} | ||
> | ||
<MenuItem>Cookies</MenuItem> | ||
<MenuItem>Pizza</MenuItem> | ||
{/** MenuItem is just a ListItem, so you can intermingle other List components */} | ||
<ListDivider /> | ||
<MenuItem>Icecream</MenuItem> | ||
</Menu> | ||
return ( | ||
<MenuSurfaceAnchor> | ||
<Menu | ||
open={open} | ||
onSelect={(evt) => console.log(evt.detail.index)} | ||
onClose={(evt) => setOpen(false)} | ||
> | ||
<MenuItem>Cookies</MenuItem> | ||
<MenuItem>Pizza</MenuItem> | ||
{/** MenuItem is just a ListItem, so you can intermingle other List components */} | ||
<ListDivider /> | ||
<MenuItem>Icecream</MenuItem> | ||
</Menu> | ||
<Button raised onClick={(evt) => setOpen(!open)}> | ||
Menu | ||
</Button> | ||
</MenuSurfaceAnchor> | ||
); | ||
} | ||
<Button raised onClick={(evt) => setOpen(!open)}> | ||
Menu | ||
</Button> | ||
</MenuSurfaceAnchor> | ||
); | ||
}} | ||
</> | ||
``` | ||
```jsx | ||
function Example() { | ||
const [open, setOpen] = React.useState(false); | ||
<> | ||
{function Example() { | ||
const [open, setOpen] = React.useState(false); | ||
return ( | ||
<MenuSurfaceAnchor> | ||
<MenuSurface open={open} onClose={(evt) => setOpen(false)}> | ||
<div style={{ padding: '1rem', width: '8rem' }}> | ||
Make the content whatever you want. | ||
</div> | ||
</MenuSurface> | ||
return ( | ||
<MenuSurfaceAnchor> | ||
<MenuSurface open={open} onClose={(evt) => setOpen(false)}> | ||
<div style={{ padding: '1rem', width: '8rem' }}> | ||
Make the content whatever you want. | ||
</div> | ||
</MenuSurface> | ||
<Button raised onClick={(evt) => setOpen(!open)}> | ||
Menu Surface | ||
</Button> | ||
</MenuSurfaceAnchor> | ||
); | ||
} | ||
<Button raised onClick={(evt) => setOpen(!open)}> | ||
Menu Surface | ||
</Button> | ||
</MenuSurfaceAnchor> | ||
); | ||
}} | ||
</> | ||
``` | ||
```jsx | ||
function Example() { | ||
const [open, setOpen] = React.useState(false); | ||
<> | ||
{function Example() { | ||
const [open, setOpen] = React.useState(false); | ||
return ( | ||
<MenuSurfaceAnchor> | ||
<MenuSurface open={open} onClose={(evt) => setOpen(false)}> | ||
<div style={{ padding: '1rem', width: '8rem' }}>Menu</div> | ||
</MenuSurface> | ||
{/** The handle can be any component you want */} | ||
<IconButton icon="menu" onClick={(evt) => setOpen(!open)} /> | ||
</MenuSurfaceAnchor> | ||
); | ||
} | ||
return ( | ||
<MenuSurfaceAnchor> | ||
<MenuSurface open={open} onClose={(evt) => setOpen(false)}> | ||
<div style={{ padding: '1rem', width: '8rem' }}>Menu</div> | ||
</MenuSurface> | ||
{/** The handle can be any component you want */} | ||
<IconButton icon="menu" onClick={(evt) => setOpen(!open)} /> | ||
</MenuSurfaceAnchor> | ||
); | ||
}} | ||
</> | ||
``` | ||
```jsx | ||
function Example() { | ||
const [open, setOpen] = React.useState(false); | ||
<> | ||
{function Example() { | ||
const [open, setOpen] = React.useState(false); | ||
return ( | ||
<MenuSurfaceAnchor> | ||
<Menu | ||
open={open} | ||
onSelect={(evt) => console.log(evt.detail.index)} | ||
onClose={(evt) => setOpen(false)} | ||
> | ||
<MenuItem>Item One</MenuItem> | ||
<MenuItem disabled>Item Two (disabled)</MenuItem> | ||
<MenuItem>Item Three</MenuItem> | ||
</Menu> | ||
return ( | ||
<MenuSurfaceAnchor> | ||
<Menu | ||
open={open} | ||
onSelect={(evt) => console.log(evt.detail.index)} | ||
onClose={(evt) => setOpen(false)} | ||
> | ||
<MenuItem>Item One</MenuItem> | ||
<MenuItem disabled>Item Two (disabled)</MenuItem> | ||
<MenuItem>Item Three</MenuItem> | ||
</Menu> | ||
<Button raised onClick={() => setOpen(!open)}> | ||
Menu | ||
</Button> | ||
</MenuSurfaceAnchor> | ||
); | ||
} | ||
<Button raised onClick={() => setOpen(!open)}> | ||
Menu | ||
</Button> | ||
</MenuSurfaceAnchor> | ||
); | ||
}} | ||
</> | ||
``` | ||
@@ -133,35 +141,37 @@ | ||
```jsx | ||
function Example() { | ||
const [anchorCorner, setAnchorCorner] = | ||
React.useState('topLeft'); | ||
<> | ||
{function Example() { | ||
const [anchorCorner, setAnchorCorner] = | ||
React.useState('topLeft'); | ||
return ( | ||
<> | ||
<MenuSurfaceAnchor> | ||
<MenuSurface anchorCorner={anchorCorner} open={true}> | ||
<div style={{ padding: '1rem', width: '8rem' }}> | ||
anchorCorner: {anchorCorner} | ||
</div> | ||
</MenuSurface> | ||
<Button raised label="Anchored Menu" /> | ||
</MenuSurfaceAnchor> | ||
return ( | ||
<> | ||
<MenuSurfaceAnchor> | ||
<MenuSurface anchorCorner={anchorCorner} open={true}> | ||
<div style={{ padding: '1rem', width: '8rem' }}> | ||
anchorCorner: {anchorCorner} | ||
</div> | ||
</MenuSurface> | ||
<Button raised label="Anchored Menu" /> | ||
</MenuSurfaceAnchor> | ||
<Select | ||
value={anchorCorner} | ||
label="anchorCorner" | ||
onChange={(evt) => setAnchorCorner(evt.currentTarget.value)} | ||
options={[ | ||
'topLeft', | ||
'topRight', | ||
'bottomLeft', | ||
'bottomRight', | ||
'topStart', | ||
'topEnd', | ||
'bottomStart', | ||
'bottomEnd' | ||
]} | ||
/> | ||
</> | ||
); | ||
} | ||
<Select | ||
value={anchorCorner} | ||
label="anchorCorner" | ||
onChange={(evt) => setAnchorCorner(evt.currentTarget.value)} | ||
options={[ | ||
'topLeft', | ||
'topRight', | ||
'bottomLeft', | ||
'bottomRight', | ||
'topStart', | ||
'topEnd', | ||
'bottomStart', | ||
'bottomEnd' | ||
]} | ||
/> | ||
</> | ||
); | ||
}} | ||
</> | ||
``` | ||
@@ -199,38 +209,42 @@ | ||
```jsx | ||
function Example() { | ||
const [renderToPortal, setRenderToPortal] = React.useState(true); | ||
const [menuIsOpen, setMenuIsOpen] = React.useState(false); | ||
const options = ['Cookies', 'Pizza', 'Icecream']; | ||
return ( | ||
<> | ||
<div | ||
style={{ | ||
marginBottom: '10rem', | ||
height: '3.5rem', | ||
overflow: 'hidden' | ||
}} | ||
> | ||
<MenuSurfaceAnchor> | ||
<Button raised onClick={() => setMenuIsOpen(!menuIsOpen)}> | ||
Open Menu | ||
</Button> | ||
<Menu | ||
open={menuIsOpen} | ||
onClose={() => setMenuIsOpen(false)} | ||
renderToPortal={renderToPortal} | ||
> | ||
{options.map((o) => ( | ||
<MenuItem key={o}>{o}</MenuItem> | ||
))} | ||
</Menu> | ||
</MenuSurfaceAnchor> | ||
</div> | ||
<Checkbox | ||
checked={renderToPortal} | ||
onChange={(evt) => setRenderToPortal(evt.currentTarget.checked)} | ||
label="renderToPortal" | ||
/> | ||
</> | ||
); | ||
} | ||
<> | ||
{function Example() { | ||
const [renderToPortal, setRenderToPortal] = React.useState(true); | ||
const [menuIsOpen, setMenuIsOpen] = React.useState(false); | ||
const options = ['Cookies', 'Pizza', 'Icecream']; | ||
return ( | ||
<> | ||
<div | ||
style={{ | ||
marginBottom: '10rem', | ||
height: '3.5rem', | ||
overflow: 'hidden' | ||
}} | ||
> | ||
<MenuSurfaceAnchor> | ||
<Button raised onClick={() => setMenuIsOpen(!menuIsOpen)}> | ||
Open Menu | ||
</Button> | ||
<Menu | ||
open={menuIsOpen} | ||
onClose={() => setMenuIsOpen(false)} | ||
renderToPortal={renderToPortal} | ||
> | ||
{options.map((o) => ( | ||
<MenuItem key={o}>{o}</MenuItem> | ||
))} | ||
</Menu> | ||
</MenuSurfaceAnchor> | ||
</div> | ||
<Checkbox | ||
checked={renderToPortal} | ||
onChange={(evt) => | ||
setRenderToPortal(evt.currentTarget.checked) | ||
} | ||
label="renderToPortal" | ||
/> | ||
</> | ||
); | ||
}} | ||
</> | ||
``` | ||
@@ -237,0 +251,0 @@ |
Sorry, the diff of this file is not supported yet
No v1
QualityPackage is not semver >=1. This means it is not stable and does not support ^ ranges.
Found 1 instance in 1 package
316
4.64%108660
-0.35%8
14.29%1805
-0.33%3
50%+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
Updated
Updated
Updated
Updated