@workday/canvas-kit-react-side-panel
Version:
A Canvas-styled side panel
200 lines (199 loc) • 9.83 kB
JavaScript
;
var __extends = (this && this.__extends) || (function () {
var extendStatics = function (d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
return extendStatics(d, b);
};
return function (d, b) {
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
var __rest = (this && this.__rest) || function (s, e) {
var t = {};
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
t[p] = s[p];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
t[p[i]] = s[p[i]];
}
return t;
};
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
result["default"] = mod;
return result;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
var React = __importStar(require("react"));
var styled_1 = __importDefault(require("@emotion/styled"));
var throttle_1 = __importDefault(require("lodash/throttle"));
var canvas_kit_react_core_1 = require("@workday/canvas-kit-react-core");
var canvas_kit_react_button_1 = require("@workday/canvas-kit-react-button");
var canvas_system_icons_web_1 = require("@workday/canvas-system-icons-web");
var SidePanelOpenDirection;
(function (SidePanelOpenDirection) {
SidePanelOpenDirection[SidePanelOpenDirection["Left"] = 0] = "Left";
SidePanelOpenDirection[SidePanelOpenDirection["Right"] = 1] = "Right";
})(SidePanelOpenDirection = exports.SidePanelOpenDirection || (exports.SidePanelOpenDirection = {}));
var SidePanelBackgroundColor;
(function (SidePanelBackgroundColor) {
SidePanelBackgroundColor[SidePanelBackgroundColor["White"] = 0] = "White";
SidePanelBackgroundColor[SidePanelBackgroundColor["Transparent"] = 1] = "Transparent";
SidePanelBackgroundColor[SidePanelBackgroundColor["Gray"] = 2] = "Gray";
})(SidePanelBackgroundColor = exports.SidePanelBackgroundColor || (exports.SidePanelBackgroundColor = {}));
var closedWidth = canvas_kit_react_core_1.spacing.xxl;
var Header = styled_1.default('h2')(__assign(__assign({}, canvas_kit_react_core_1.type.h2), { marginTop: canvas_kit_react_core_1.spacing.zero }));
var SidePanelContainer = styled_1.default('div')({
overflow: 'hidden',
height: '100%',
boxSizing: 'border-box',
display: 'flex',
flexDirection: 'column',
transition: 'width 200ms ease',
position: 'absolute',
}, function (_a) {
var open = _a.open;
return ({
alignItems: open ? undefined : 'center',
boxShadow: open ? undefined : '0 8px 16px -8px rgba(0, 0, 0, 0.16)',
});
}, function (_a) {
var open = _a.open, backgroundColor = _a.backgroundColor;
var openBackgroundColor;
switch (backgroundColor) {
case SidePanelBackgroundColor.Transparent:
openBackgroundColor = 'transparent';
break;
case SidePanelBackgroundColor.Gray:
openBackgroundColor = canvas_kit_react_core_1.colors.soap100;
break;
case SidePanelBackgroundColor.White:
default:
openBackgroundColor = canvas_kit_react_core_1.colors.frenchVanilla100;
break;
}
return {
backgroundColor: open ? openBackgroundColor : canvas_kit_react_core_1.colors.frenchVanilla100,
};
}, function (_a) {
var open = _a.open, openWidth = _a.openWidth;
return ({
width: open ? openWidth : closedWidth,
});
}, function (_a) {
var open = _a.open, padding = _a.padding;
return ({
padding: open ? padding || canvas_kit_react_core_1.spacing.m : canvas_kit_react_core_1.spacing.s + " 0",
});
}, function (_a) {
var openDirection = _a.openDirection;
return ({
right: openDirection === SidePanelOpenDirection.Right ? canvas_kit_react_core_1.spacing.zero : undefined,
left: openDirection === SidePanelOpenDirection.Left ? canvas_kit_react_core_1.spacing.zero : undefined,
});
});
var ChildrenContainer = styled_1.default('div')({
transition: 'none',
zIndex: 1,
}, function (_a) {
var open = _a.open, openWidth = _a.openWidth;
return ({
width: open ? openWidth : closedWidth,
});
});
var ToggleButton = styled_1.default(canvas_kit_react_button_1.IconButton)({
position: 'absolute',
bottom: canvas_kit_react_core_1.spacing.s,
}, function (_a) {
var openDirection = _a.openDirection;
return ({
right: openDirection === SidePanelOpenDirection.Left ? canvas_kit_react_core_1.spacing.s : '',
left: openDirection === SidePanelOpenDirection.Right ? canvas_kit_react_core_1.spacing.s : '',
});
});
var SidePanelFooter = styled_1.default('div')({
position: 'absolute',
bottom: '0',
height: 120,
left: 0,
background: 'linear-gradient(180deg, rgba(255, 255, 255, 0.0001) 0%, #FFFFFF 100%)',
}, function (_a) {
var open = _a.open, openWidth = _a.openWidth;
return ({
width: open ? openWidth : canvas_kit_react_core_1.spacing.xxl,
});
});
var SidePanel = (function (_super) {
__extends(SidePanel, _super);
function SidePanel(props) {
var _this = _super.call(this, props) || this;
_this.state = {
screenSize: typeof window !== 'undefined' ? window.innerWidth : 0,
};
_this.handleResize = function () {
if (!_this.props.onBreakpointChange || !_this.props.breakpoint) {
return;
}
if (window.innerWidth > _this.props.breakpoint && !_this.props.open) {
_this.props.onBreakpointChange(true);
}
if (window.innerWidth <= _this.props.breakpoint && _this.props.open) {
_this.props.onBreakpointChange(false);
}
};
_this.onToggleClick = function () {
if (_this.props.onToggleClick) {
_this.props.onToggleClick();
}
};
_this.toggleButtonDirection = function (open, openDirection) {
if (openDirection !== SidePanelOpenDirection.Right) {
return open ? canvas_system_icons_web_1.chevronLeftIcon : canvas_system_icons_web_1.chevronRightIcon;
}
else {
return open ? canvas_system_icons_web_1.chevronRightIcon : canvas_system_icons_web_1.chevronLeftIcon;
}
};
_this.handleResize = throttle_1.default(_this.handleResize.bind(_this), 150);
return _this;
}
SidePanel.prototype.componentDidMount = function () {
window.addEventListener('resize', this.handleResize);
};
SidePanel.prototype.componentWillUnmount = function () {
window.removeEventListener('resize', this.handleResize);
};
SidePanel.prototype.render = function () {
var _a = this.props, _b = _a.backgroundColor, backgroundColor = _b === void 0 ? SidePanelBackgroundColor.White : _b, _c = _a.openNavigationAriaLabel, openNavigationAriaLabel = _c === void 0 ? 'open navigation' : _c, _d = _a.closeNavigationAriaLabel, closeNavigationAriaLabel = _d === void 0 ? 'close navigation' : _d, _e = _a.openDirection, openDirection = _e === void 0 ? SidePanelOpenDirection.Left : _e, _f = _a.breakpoint, breakpoint = _f === void 0 ? 768 : _f, _g = _a.openWidth, openWidth = _g === void 0 ? 300 : _g, header = _a.header, onToggleClick = _a.onToggleClick, open = _a.open, padding = _a.padding, onBreakpointChange = _a.onBreakpointChange, elemProps = __rest(_a, ["backgroundColor", "openNavigationAriaLabel", "closeNavigationAriaLabel", "openDirection", "breakpoint", "openWidth", "header", "onToggleClick", "open", "padding", "onBreakpointChange"]);
return (React.createElement(SidePanelContainer, __assign({ role: "region", padding: padding, openDirection: openDirection, openWidth: openWidth, backgroundColor: backgroundColor, open: open }, elemProps),
React.createElement(ChildrenContainer, { open: open, openWidth: openWidth },
header && open ? React.createElement(Header, null, header) : null,
this.props.children),
React.createElement(SidePanelFooter, { openWidth: openWidth, open: open }, onToggleClick && (React.createElement(ToggleButton, { openDirection: openDirection, "aria-label": open ? closeNavigationAriaLabel : openNavigationAriaLabel, toggled: false, size: canvas_kit_react_button_1.IconButton.Size.Small, onClick: this.onToggleClick, icon: this.toggleButtonDirection(open, openDirection), variant: canvas_kit_react_button_1.IconButton.Variant.CircleFilled })))));
};
SidePanel.OpenDirection = SidePanelOpenDirection;
SidePanel.BackgroundColor = SidePanelBackgroundColor;
return SidePanel;
}(React.Component));
exports.default = SidePanel;