@nypl/design-system-react-components 1.0.7 → 1.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1726,7 +1726,7 @@ var Icon = /*#__PURE__*/react.chakra( /*#__PURE__*/React.forwardRef(function (pr
1726
1726
  }
1727
1727
  });
1728
1728
 
1729
- var _excluded$R = ["accordionData", "id", "isDefaultOpen"];
1729
+ var _excluded$R = ["accordionData", "id", "isDefaultOpen", "panelMaxHeight"];
1730
1730
  /**
1731
1731
  * Get the minus or plus icon depending on whether the accordion
1732
1732
  * is open or closed.
@@ -1751,7 +1751,7 @@ var getIcon = function getIcon(isExpanded, index, id) {
1751
1751
  */
1752
1752
 
1753
1753
 
1754
- var getElementsFromData = function getElementsFromData(data, id) {
1754
+ var getElementsFromData = function getElementsFromData(data, id, panelMaxHeight) {
1755
1755
  var _data, _data2;
1756
1756
 
1757
1757
  if (data === void 0) {
@@ -1774,10 +1774,14 @@ var getElementsFromData = function getElementsFromData(data, id) {
1774
1774
  key: index,
1775
1775
  dangerouslySetInnerHTML: {
1776
1776
  __html: content.panel
1777
- }
1777
+ },
1778
+ maxHeight: panelMaxHeight,
1779
+ overflow: "auto"
1778
1780
  }) : React__default.createElement(react.AccordionPanel, {
1779
1781
  id: id + "-panel-" + index,
1780
- key: index
1782
+ key: index,
1783
+ maxHeight: panelMaxHeight,
1784
+ overflow: "auto"
1781
1785
  }, content.panel);
1782
1786
  return React__default.createElement(react.AccordionItem, {
1783
1787
  id: id + "-item-" + index,
@@ -1802,7 +1806,7 @@ var getElementsFromData = function getElementsFromData(data, id) {
1802
1806
  flex: "1",
1803
1807
  fontSize: multipleFontSize,
1804
1808
  textAlign: "left"
1805
- }, content.label), getIcon(isExpanded, index, id)), panel);
1809
+ }, content.label), getIcon(isExpanded, index, id)), isExpanded && panel);
1806
1810
  });
1807
1811
  });
1808
1812
  };
@@ -1817,6 +1821,7 @@ var Accordion = /*#__PURE__*/react.chakra( /*#__PURE__*/React.forwardRef(functio
1817
1821
  id = props.id,
1818
1822
  _props$isDefaultOpen = props.isDefaultOpen,
1819
1823
  isDefaultOpen = _props$isDefaultOpen === void 0 ? false : _props$isDefaultOpen,
1824
+ panelMaxHeight = props.panelMaxHeight,
1820
1825
  rest = _objectWithoutPropertiesLoose(props, _excluded$R); // Pass `0` to open the first accordion in the 0-index based array.
1821
1826
 
1822
1827
 
@@ -1826,7 +1831,7 @@ var Accordion = /*#__PURE__*/react.chakra( /*#__PURE__*/React.forwardRef(functio
1826
1831
  defaultIndex: openFirstAccordion,
1827
1832
  id: id,
1828
1833
  ref: ref
1829
- }, rest), getElementsFromData(accordionData, id));
1834
+ }, rest), getElementsFromData(accordionData, id, panelMaxHeight));
1830
1835
  }));
1831
1836
 
1832
1837
  var _excluded$S = ["breadcrumbsData", "breadcrumbsType", "className", "id"];
@@ -2358,19 +2363,19 @@ var Image = /*#__PURE__*/react.chakra( /*#__PURE__*/React.forwardRef(function (p
2358
2363
  loading: isLazy ? "lazy" : undefined
2359
2364
  }, srcProp, {
2360
2365
  __css: _extends({}, styles.img, additionalImageStyles)
2361
- }));
2366
+ }, rest));
2362
2367
  var finalImage = useImageWrapper ? React__default.createElement(ImageWrapper, Object.assign({
2363
2368
  additionalWrapperStyles: additionalWrapperStyles,
2364
2369
  aspectRatio: aspectRatio,
2365
2370
  className: className,
2366
2371
  size: size
2367
2372
  }, caption || credit ? {} : rest), imageComponent) : imageComponent;
2368
- return React__default.createElement(react.Box, Object.assign({
2373
+ return React__default.createElement(react.Box, {
2369
2374
  ref: finalRefs
2370
- }, rest), caption || credit ? React__default.createElement(react.Box, Object.assign({
2375
+ }, caption || credit ? React__default.createElement(react.Box, {
2371
2376
  as: "figure",
2372
2377
  __css: _extends({}, styles.figure, additionalFigureStyles)
2373
- }, rest), finalImage, React__default.createElement(react.Box, {
2378
+ }, finalImage, React__default.createElement(react.Box, {
2374
2379
  as: "figcaption",
2375
2380
  __css: styles.figcaption
2376
2381
  }, caption && React__default.createElement(react.Box, {
@@ -3311,14 +3316,119 @@ var Table = /*#__PURE__*/react.chakra( /*#__PURE__*/React.forwardRef(function (p
3311
3316
  }, rest), tableCaption, columnHeadersElems, tableBodyElems());
3312
3317
  }));
3313
3318
 
3319
+ /**
3320
+ * A custom hook that returns the Chakra-based NYPL theme object. This must be
3321
+ * used inside a component that is wrapped in the `DSProvider` component, so
3322
+ * that the theme object can be available to use.
3323
+ */
3324
+
3325
+ function useNYPLTheme() {
3326
+ var theme = react.useTheme();
3327
+
3328
+ if (!theme || Object.keys(theme).length === 0) {
3329
+ console.warn("NYPL Reservoir useNYPLTheme: hook must be used inside of `<DSProvider />`.");
3330
+ return {};
3331
+ } // Chakra provides a lot of their own styles but
3332
+ // only NYPL styles should be exported.
3333
+
3334
+
3335
+ return {
3336
+ // base, sm, md, lg, xl, 2xl
3337
+ breakpoints: theme.breakpoints,
3338
+ colors: {
3339
+ // primary, secondary
3340
+ brand: theme.colors.brand,
3341
+ // dark mode colors:
3342
+ // ui.disabled, ui.error, ui.focus, ui.link,
3343
+ // ui.status, ui.success, ui.test, ui.warning,
3344
+ // ui.bg, ui.border, ui.typography
3345
+ dark: theme.colors.dark,
3346
+ // blogs, books-and-more, education, locations,
3347
+ // research, research-library, whats-on
3348
+ section: theme.colors.section,
3349
+ transparent: theme.colors.transparent,
3350
+ // black, white, gray, disabled, error, focus, link,
3351
+ // status, success, test, warning, bg, border, typography
3352
+ ui: theme.colors.ui
3353
+ },
3354
+ fontSizes: {
3355
+ "-3": theme.fontSizes["-3"],
3356
+ "-2": theme.fontSizes["-2"],
3357
+ "-1": theme.fontSizes["-1"],
3358
+ "0": theme.fontSizes["0"],
3359
+ "1": theme.fontSizes["1"],
3360
+ "2": theme.fontSizes["2"],
3361
+ "3": theme.fontSizes["3"],
3362
+ "4": theme.fontSizes["4"],
3363
+ // default
3364
+ breadcrumbs: theme.fontSizes.breadcrumbs,
3365
+ // default
3366
+ button: theme.fontSizes.button,
3367
+ // primary, secondary, tertiary, callout
3368
+ heading: theme.fontSizes.heading,
3369
+ // default
3370
+ helper: theme.fontSizes.helper,
3371
+ // default, secondary
3372
+ label: theme.fontSizes.label,
3373
+ // default, caption, tag, mini
3374
+ text: theme.fontSizes.text
3375
+ },
3376
+ fontWeights: {
3377
+ light: theme.fontWeights.light,
3378
+ regular: theme.fontWeights.regular,
3379
+ medium: theme.fontWeights.medium,
3380
+ bold: theme.fontWeights.bold,
3381
+ // default, lastChild
3382
+ breadcrumbs: theme.fontWeights.breadcrumbs,
3383
+ // default
3384
+ button: theme.fontWeights.button,
3385
+ // primary, secondary, tertiary, callout
3386
+ heading: theme.fontWeights.heading,
3387
+ // default
3388
+ helper: theme.fontWeights.helper,
3389
+ // default
3390
+ label: theme.fontWeights.label,
3391
+ // default, caption, tag, mini
3392
+ text: theme.fontWeights.text
3393
+ },
3394
+ fonts: {
3395
+ body: theme.fonts.body,
3396
+ heading: theme.fonts.heading
3397
+ },
3398
+ radii: theme.radii,
3399
+ space: {
3400
+ xxs: theme.space.xxs,
3401
+ xs: theme.space.xs,
3402
+ s: theme.space.s,
3403
+ m: theme.space.m,
3404
+ l: theme.space.l,
3405
+ xl: theme.space.xl,
3406
+ xxl: theme.space.xxl,
3407
+ xxxl: theme.space.xxxl
3408
+ }
3409
+ };
3410
+ }
3411
+
3314
3412
  var DataTable = function DataTable(props) {
3315
- var _props$dataBlack = props.dataBlack,
3316
- dataBlack = _props$dataBlack === void 0 ? ["--", "--", "--"] : _props$dataBlack,
3317
- _props$dataWhite = props.dataWhite,
3318
- dataWhite = _props$dataWhite === void 0 ? ["--", "--", "--"] : _props$dataWhite,
3413
+ var dataBgPageColor = props.dataBgPageColor,
3414
+ dataBgDefaultColor = props.dataBgDefaultColor,
3415
+ _props$dataBlackColor = props.dataBlackColor,
3416
+ dataBlackColor = _props$dataBlackColor === void 0 ? ["--", "--", "--"] : _props$dataBlackColor,
3417
+ dataHeadingColor = props.dataHeadingColor,
3418
+ dataBodyColor = props.dataBodyColor,
3419
+ _props$dataWhiteColor = props.dataWhiteColor,
3420
+ dataWhiteColor = _props$dataWhiteColor === void 0 ? ["--", "--", "--"] : _props$dataWhiteColor,
3319
3421
  _props$textColor = props.textColor,
3320
3422
  textColor = _props$textColor === void 0 ? "ui.white" : _props$textColor;
3321
3423
 
3424
+ var _useNYPLTheme = useNYPLTheme(),
3425
+ ui = _useNYPLTheme.colors.ui;
3426
+
3427
+ var grayxxxxDark = ui.gray["xxxx-dark"];
3428
+ var grayxxxDark = ui.gray["xxx-dark"];
3429
+ var grayLightCool = ui.gray["light-cool"];
3430
+ var grayMedium = ui.gray.medium;
3431
+
3322
3432
  var SuccessIcon = function SuccessIcon() {
3323
3433
  return React.createElement(Icon, {
3324
3434
  color: textColor,
@@ -3331,24 +3441,44 @@ var DataTable = function DataTable(props) {
3331
3441
  });
3332
3442
  };
3333
3443
 
3334
- var columnHeaders = ["Color", "Ratio", "16px", "36px"];
3335
- var whiteSmallTextSuccess = (dataWhite[1] === "AA" || dataWhite[1] === "AAA") && React.createElement(SuccessIcon, null);
3336
- var whiteLargeTextSuccess = (dataWhite[2] === "AA" || dataWhite[2] === "AAA") && React.createElement(SuccessIcon, null);
3337
- var blackSmallTextSuccess = (dataBlack[1] === "AA" || dataBlack[1] === "AAA") && React.createElement(SuccessIcon, null);
3338
- var blackLargeTextSuccess = (dataBlack[2] === "AA" || dataBlack[2] === "AAA") && React.createElement(SuccessIcon, null);
3444
+ var successfulContrast = function successfulContrast(dataColor, textSize) {
3445
+ if (textSize === void 0) {
3446
+ textSize = "small";
3447
+ }
3448
+
3449
+ var dataTextIndex = textSize === "small" ? 1 : 2;
3450
+ return (dataColor[dataTextIndex] === "AA" || dataColor[dataTextIndex] === "AAA") && React.createElement(SuccessIcon, null);
3451
+ };
3452
+
3453
+ var columnHeaders = ["Color", "Ratio", "16px", "36px"]; // All color data have the following two rows.
3454
+
3455
+ var whiteSmallTextSuccess = successfulContrast(dataWhiteColor);
3456
+ var whiteLargeTextSuccess = successfulContrast(dataWhiteColor, "large");
3457
+ var blackSmallTextSuccess = successfulContrast(dataBlackColor);
3458
+ var blackLargeTextSuccess = successfulContrast(dataBlackColor, "large"); // The dark theme colors might have the following color contrast information.
3459
+
3460
+ var bgPageSmallTextSuccess = dataBgPageColor && successfulContrast(dataBgPageColor);
3461
+ var bgPageLargeTextSuccess = dataBgPageColor && successfulContrast(dataBgPageColor, "large");
3462
+ var bgDefaultSmallTextSuccess = dataBgDefaultColor && successfulContrast(dataBgDefaultColor);
3463
+ var bgDefaultLargeTextSuccess = dataBgDefaultColor && successfulContrast(dataBgDefaultColor, "large");
3464
+ var headingSmallTextSuccess = dataHeadingColor && successfulContrast(dataHeadingColor);
3465
+ var headingLargeTextSuccess = dataHeadingColor && successfulContrast(dataHeadingColor, "large");
3466
+ var textSmallTextSuccess = dataBodyColor && successfulContrast(dataBodyColor);
3467
+ var textLargeTextSuccess = dataBodyColor && successfulContrast(dataBodyColor, "large"); // All ColorCards have these two rows.
3468
+
3339
3469
  var tableData = [[React.createElement("span", {
3340
3470
  key: "colorUiWhite",
3341
3471
  style: {
3342
3472
  color: "white",
3343
3473
  padding: 0
3344
3474
  }
3345
- }, "ui.white"), dataWhite[0] + ":1", React.createElement(React.Fragment, null, dataWhite[1], whiteSmallTextSuccess), React.createElement(React.Fragment, null, dataWhite[2], whiteLargeTextSuccess)], [React.createElement("span", {
3475
+ }, "ui.white"), dataWhiteColor[0] + ":1", React.createElement(React.Fragment, null, dataWhiteColor[1], whiteSmallTextSuccess), React.createElement(React.Fragment, null, dataWhiteColor[2], whiteLargeTextSuccess)], [React.createElement("span", {
3346
3476
  key: "colorUiBlack",
3347
3477
  style: {
3348
3478
  color: "black",
3349
3479
  padding: 0
3350
3480
  }
3351
- }, "ui.black"), dataBlack[0] + ":1", React.createElement(React.Fragment, null, dataBlack[1], blackSmallTextSuccess), React.createElement(React.Fragment, null, dataBlack[2], blackLargeTextSuccess)]];
3481
+ }, "ui.black"), dataBlackColor[0] + ":1", React.createElement(React.Fragment, null, dataBlackColor[1], blackSmallTextSuccess), React.createElement(React.Fragment, null, dataBlackColor[2], blackLargeTextSuccess)]];
3352
3482
  var cellStyles = {
3353
3483
  borderColor: textColor === "ui.white" ? "white !important" : "black !important",
3354
3484
  fontWeight: "medium",
@@ -3370,7 +3500,48 @@ var DataTable = function DataTable(props) {
3370
3500
  fontSize: "text.tag"
3371
3501
  }, cellStyles)
3372
3502
  }
3373
- };
3503
+ }; // For dark mode `ColorCard`s, there are four extra rows.
3504
+
3505
+ if (dataBgPageColor && dataBgPageColor.length > 0) {
3506
+ tableData.push([React.createElement("span", {
3507
+ key: "colorBgPage",
3508
+ style: {
3509
+ color: grayxxxxDark,
3510
+ padding: 0
3511
+ }
3512
+ }, "bg page"), dataBgPageColor[0] + ":1", React.createElement(React.Fragment, null, dataBgPageColor[1], bgPageSmallTextSuccess), React.createElement(React.Fragment, null, dataBgPageColor[2], bgPageLargeTextSuccess)]);
3513
+ }
3514
+
3515
+ if (dataBgDefaultColor && dataBgDefaultColor.length > 0) {
3516
+ tableData.push([React.createElement("span", {
3517
+ key: "colorBgDefault",
3518
+ style: {
3519
+ color: grayxxxDark,
3520
+ padding: 0
3521
+ }
3522
+ }, "bg default"), dataBgDefaultColor[0] + ":1", React.createElement(React.Fragment, null, dataBgDefaultColor[1], bgDefaultSmallTextSuccess), React.createElement(React.Fragment, null, dataBgDefaultColor[2], bgDefaultLargeTextSuccess)]);
3523
+ }
3524
+
3525
+ if (dataHeadingColor && dataHeadingColor.length > 0) {
3526
+ tableData.push([React.createElement("span", {
3527
+ key: "colorHeading",
3528
+ style: {
3529
+ color: grayLightCool,
3530
+ padding: 0
3531
+ }
3532
+ }, "heading"), dataHeadingColor[0] + ":1", React.createElement(React.Fragment, null, dataHeadingColor[1], headingSmallTextSuccess), React.createElement(React.Fragment, null, dataHeadingColor[2], headingLargeTextSuccess)]);
3533
+ }
3534
+
3535
+ if (dataBodyColor && dataBodyColor.length > 0) {
3536
+ tableData.push([React.createElement("span", {
3537
+ key: "colorText",
3538
+ style: {
3539
+ color: grayMedium,
3540
+ padding: 0
3541
+ }
3542
+ }, "body"), dataBodyColor[0] + ":1", React.createElement(React.Fragment, null, dataBodyColor[1], textSmallTextSuccess), React.createElement(React.Fragment, null, dataBodyColor[2], textLargeTextSuccess)]);
3543
+ }
3544
+
3374
3545
  return React.createElement(Table, {
3375
3546
  columnHeaders: columnHeaders,
3376
3547
  showRowDividers: true,
@@ -3381,13 +3552,17 @@ var DataTable = function DataTable(props) {
3381
3552
  };
3382
3553
  var ColorCard = function ColorCard(props) {
3383
3554
  var backgroundColor = props.backgroundColor,
3555
+ dataBgPageColor = props.dataBgPageColor,
3556
+ dataBgDefaultColor = props.dataBgDefaultColor,
3384
3557
  _props$colorName = props.colorName,
3385
3558
  colorName = _props$colorName === void 0 ? "" : _props$colorName,
3386
3559
  colorSource = props.colorSource,
3387
- _props$dataBlack2 = props.dataBlack,
3388
- dataBlack = _props$dataBlack2 === void 0 ? ["--", "--", "--"] : _props$dataBlack2,
3389
- _props$dataWhite2 = props.dataWhite,
3390
- dataWhite = _props$dataWhite2 === void 0 ? ["--", "--", "--"] : _props$dataWhite2,
3560
+ _props$dataBlackColor2 = props.dataBlackColor,
3561
+ dataBlackColor = _props$dataBlackColor2 === void 0 ? ["--", "--", "--"] : _props$dataBlackColor2,
3562
+ dataHeadingColor = props.dataHeadingColor,
3563
+ dataBodyColor = props.dataBodyColor,
3564
+ _props$dataWhiteColor2 = props.dataWhiteColor,
3565
+ dataWhiteColor = _props$dataWhiteColor2 === void 0 ? ["--", "--", "--"] : _props$dataWhiteColor2,
3391
3566
  _props$textColor2 = props.textColor,
3392
3567
  textColor = _props$textColor2 === void 0 ? "ui.white" : _props$textColor2;
3393
3568
  var cssVarName = "--nypl-colors-" + colorName.replace(/\./g, "-");
@@ -3412,9 +3587,13 @@ var ColorCard = function ColorCard(props) {
3412
3587
  fontWeight: "medium",
3413
3588
  noSpace: true,
3414
3589
  size: "tag"
3415
- }, "Base: ", colorSource)), React.createElement(DataTable, {
3416
- dataBlack: dataBlack,
3417
- dataWhite: dataWhite,
3590
+ }, "Source: ", colorSource)), React.createElement(DataTable, {
3591
+ dataBgPageColor: dataBgPageColor,
3592
+ dataBgDefaultColor: dataBgDefaultColor,
3593
+ dataBlackColor: dataBlackColor,
3594
+ dataHeadingColor: dataHeadingColor,
3595
+ dataBodyColor: dataBodyColor,
3596
+ dataWhiteColor: dataWhiteColor,
3418
3597
  textColor: textColor
3419
3598
  })));
3420
3599
  };
@@ -4177,21 +4356,32 @@ var breakpoints = /*#__PURE__*/themeTools.createBreakpoints({
4177
4356
  * All colors can be found in Storybook:
4178
4357
  * https://nypl.github.io/nypl-design-system/reservoir/v1/?path=/docs/style-guide-colors--page
4179
4358
  *
4180
- * All UI colors can be found in Figma:
4359
+ * All UI Fills colors can be found in Figma:
4181
4360
  * https://www.figma.com/file/qShodlfNCJHb8n03IFyApM/Main?node-id=47083%3A27674
4182
4361
  *
4183
- * All Brand colors can be found in Figma:
4362
+ * All Brand Fills colors can be found in Figma:
4184
4363
  * https://www.figma.com/file/qShodlfNCJHb8n03IFyApM/Main?node-id=15454%3A47007
4185
4364
  *
4365
+ * All Dark Mode UI Fills colors can be found in Figma:
4366
+ * https://www.figma.com/file/qShodlfNCJHb8n03IFyApM/Main?node-id=61991%3A45315
4367
+ *
4186
4368
  * At the end of this file, there are objects that extend Chakra's default
4187
4369
  * color shade palette for individual colors. WE DO NOT RECOMMEND to use them
4188
4370
  * and only recommend to use the colors defined by the Design System such as the
4189
4371
  * following "ui", "brand", and "section" colors below.
4190
4372
  */
4191
4373
  // Reusable variables:
4374
+ var black = "#000";
4375
+ var white = "#fff";
4376
+ var grayDark = "#616161";
4377
+ var grayxxxxDark = "#121212";
4378
+ var grayxxxDark = "#191919";
4379
+ var grayxxDark = "#212121";
4380
+ var grayxDark = "#424242";
4381
+ var grayMedium = "#BDBDBD";
4192
4382
  var grayLightCool = "#E9E9E9";
4383
+ var grayxLightCool = "#F5F5F5";
4193
4384
  var grayxxLightCool = "#FAFAFA";
4194
- var grayMedium = "#BDBDBD";
4195
4385
  var brandPrimary = "#C60917";
4196
4386
  var brandSecondary = "#760000";
4197
4387
  var brandObj = {
@@ -4202,8 +4392,8 @@ var colors = {
4202
4392
  transparent: "transparent",
4203
4393
  // ui fills
4204
4394
  ui: {
4205
- black: "#000",
4206
- white: "#fff",
4395
+ black: black,
4396
+ white: white,
4207
4397
  /// State and link utilities
4208
4398
  disabled: {
4209
4399
  primary: grayLightCool,
@@ -4231,18 +4421,81 @@ var colors = {
4231
4421
  primary: "#F0974E",
4232
4422
  secondary: "#EC7B1F"
4233
4423
  },
4424
+ // Semantic colors
4425
+ bg: {
4426
+ "default": grayxLightCool,
4427
+ hover: grayLightCool,
4428
+ active: grayMedium
4429
+ },
4430
+ border: {
4431
+ "default": grayMedium,
4432
+ hover: grayDark
4433
+ },
4434
+ typography: {
4435
+ heading: black,
4436
+ body: black
4437
+ },
4234
4438
  // Grayscale
4235
4439
  gray: {
4236
- "xx-dark": "#212121",
4237
- "x-dark": "#424242",
4238
- xdark: "#424242",
4239
- dark: "#616161",
4440
+ "xxxx-dark": grayxxxxDark,
4441
+ "xxx-dark": grayxxxDark,
4442
+ "xx-dark": grayxxDark,
4443
+ "x-dark": grayxDark,
4444
+ dark: grayDark,
4240
4445
  medium: grayMedium,
4241
4446
  "light-cool": grayLightCool,
4447
+ "x-light-cool": grayxLightCool,
4448
+ "xx-light-cool": grayxxLightCool,
4449
+ // Gray Alts
4242
4450
  "light-warm": "#EFEDEB",
4243
- "x-light-cool": "#F5F5F5",
4244
- "x-light-warm": "#F8F8F7",
4245
- "xx-light-cool": grayxxLightCool
4451
+ "x-light-warm": "#F8F8F7"
4452
+ }
4453
+ },
4454
+ // dark mode ui fills
4455
+ dark: {
4456
+ ui: {
4457
+ /// State and link utilities
4458
+ disabled: {
4459
+ primary: grayxDark,
4460
+ secondary: grayxxDark
4461
+ },
4462
+ error: {
4463
+ primary: "#E1454C",
4464
+ secondary: "#F67C82"
4465
+ },
4466
+ focus: "#5181D4",
4467
+ link: {
4468
+ primary: "#2085D8",
4469
+ secondary: "#50A0E1"
4470
+ },
4471
+ status: {
4472
+ primary: "#6F6544",
4473
+ secondary: "#6F6765"
4474
+ },
4475
+ success: {
4476
+ primary: "#0E3B15",
4477
+ secondary: "#0F2912"
4478
+ },
4479
+ test: "#592B22",
4480
+ warning: {
4481
+ primary: "#493320",
4482
+ secondary: "#482C15"
4483
+ },
4484
+ // Semantic colors
4485
+ bg: {
4486
+ page: grayxxxxDark,
4487
+ "default": grayxxxDark,
4488
+ hover: grayxxDark,
4489
+ active: grayxDark
4490
+ },
4491
+ border: {
4492
+ "default": grayxDark,
4493
+ hover: grayMedium
4494
+ },
4495
+ typography: {
4496
+ heading: grayLightCool,
4497
+ body: grayMedium
4498
+ }
4246
4499
  }
4247
4500
  },
4248
4501
 
@@ -4274,21 +4527,21 @@ var colors = {
4274
4527
 
4275
4528
  /** Research is used for the Research Catalog and SCC. */
4276
4529
  research: {
4277
- primary: "#00838a",
4530
+ primary: "#00838A",
4278
4531
  secondary: "#006166"
4279
4532
  },
4280
4533
 
4281
4534
  /** Research libraries with specific brand colors to adhere to. */
4282
4535
  "research-library": {
4283
- lpa: "#005d53",
4284
- schomburg: "#a03e31",
4536
+ lpa: "#005D53",
4537
+ schomburg: "#A03E31",
4285
4538
  schwartzman: brandSecondary
4286
4539
  },
4287
4540
 
4288
4541
  /** What's On is used for Exhibitions & Events. */
4289
4542
  "whats-on": {
4290
4543
  primary: "#242424",
4291
- secondary: "#000000"
4544
+ secondary: black
4292
4545
  }
4293
4546
  },
4294
4547
 
@@ -6483,11 +6736,11 @@ var SkipNavigation = {
6483
6736
  width: "1px",
6484
6737
  // Only display when the user focuses on the links.
6485
6738
  _focus: {
6486
- border: "1px solid var(—nypl-colors-ui-gray-dark)",
6487
6739
  height: "auto",
6488
- left: "2rem",
6489
- padding: "var(--nypl-space-inset-extranarrow) var(--nypl-space-inset-narrow)",
6490
- top: "3rem",
6740
+ left: "1rem",
6741
+ paddingX: "inset.extranarrow",
6742
+ paddingY: "inset.extranarrow",
6743
+ top: "1rem",
6491
6744
  width: "auto"
6492
6745
  }
6493
6746
  }
@@ -7079,87 +7332,72 @@ var CustomTabs = {
7079
7332
  }
7080
7333
  };
7081
7334
 
7082
- // From @mixin breakout:
7083
- // Used for elements that should be edge-to-edge.
7084
- var breakout = {
7085
- marginEnd: "calc(-50vw + 50%)",
7086
- marginStart: "calc(-50vw + 50%)"
7087
- }; // From the `wrapper` SCSS mixin.
7088
- // TODO: Eventually we may be able to put shared JS style objects
7089
- // into a utils file for other mixins that are shared.
7090
-
7091
- var wrapperStyles$1 = {
7092
- marginY: 0,
7093
- marginX: "auto",
7094
- maxWidth: "1280px",
7095
- paddingTop: 0,
7096
- paddingBottom: 0,
7097
- paddingEnd: "s",
7098
- paddingStart: "s",
7099
- width: "100%"
7100
- };
7335
+ /**
7336
+ * Grid layout based on https://www.joshwcomeau.com/css/full-bleed/
7337
+ */
7101
7338
  var Template = {
7102
7339
  baseStyle: {
7103
7340
  boxSizing: "border-box",
7104
7341
  color: "ui.black",
7105
- // Users with non-overlay scrollbars have a small horizontal scrollbar from
7106
- // our breakout mixin. Fix identified here: https://cloudfour.com/thinks/breaking-out-with-viewport-units-and-calc/#one-big-dumb-caveat
7107
- overflowX: "hidden",
7108
- "*": {
7109
- boxSizing: "inherit"
7110
- },
7111
- "*::after": {
7112
- boxSizing: "inherit"
7113
- },
7114
- "*::before": {
7115
- boxSizing: "inherit"
7116
- }
7342
+ display: "grid",
7343
+ gridTemplateColumns: "\n 1fr\n min(1280px, 100%)\n 1fr",
7344
+ rowGap: "grid.l"
7117
7345
  },
7118
7346
  sizes: {},
7119
7347
  defaultProps: {}
7120
- };
7121
- var TemplateHeader = {
7348
+ }; // Elements that need to breakout will span outside
7349
+ // the center 1280px grid column.
7350
+
7351
+ var TemplateBreakout = {
7122
7352
  baseStyle: {
7123
- marginBottom: "page.hstack"
7353
+ width: "100%",
7354
+ // This could be "1 / 4" and it would mean the same. This is
7355
+ // "future-proof" the grid column assignment to the last column.
7356
+ gridColumn: "1 / -1"
7124
7357
  }
7125
7358
  };
7126
- var TemplateBreakout = {
7127
- baseStyle: /*#__PURE__*/_extends({}, breakout, {
7128
- width: "100vw",
7129
- marginBottom: "page.hstack"
7130
- })
7131
- };
7132
7359
  var TemplateContent = {
7133
- baseStyle: /*#__PURE__*/_extends({}, wrapperStyles$1, {
7134
- display: "block",
7135
- marginBottom: "page.hstack"
7136
- }),
7360
+ baseStyle: {
7361
+ // Set this element to start on the second 1280px grid column.
7362
+ gridColumn: "2",
7363
+ // But this element also contains its own grid system within.
7364
+ display: "grid",
7365
+ gridTemplateColumns: "1fr",
7366
+ paddingY: 0,
7367
+ paddingX: "s",
7368
+ gap: "grid.l"
7369
+ },
7370
+ // With left or right sidebars, we need to set two grid columns and
7371
+ // the column for the sidebar is max 255px width.
7137
7372
  variants: {
7138
- sidebar: {
7139
- display: "flex",
7140
- flexFlow: {
7141
- base: "column nowrap",
7142
- md: "row wrap"
7373
+ left: {
7374
+ gridTemplateColumns: {
7375
+ md: "255px 1fr"
7376
+ }
7377
+ },
7378
+ right: {
7379
+ gridTemplateColumns: {
7380
+ md: "1fr 255px"
7143
7381
  }
7144
7382
  }
7145
7383
  }
7146
7384
  };
7147
- var TemplateContentTop = {
7385
+ var TemplateContentTopBottom = {
7148
7386
  baseStyle: {
7149
- flex: "1 0 100%",
7150
- marginBottom: "page.hstack"
7387
+ gridColumn: {
7388
+ base: "1",
7389
+ md: "1 / span 2"
7390
+ },
7391
+ height: "100%"
7151
7392
  }
7152
7393
  };
7153
7394
  var TemplateContentPrimary = {
7154
- baseStyle: {
7155
- flex: "1 1",
7156
- marginBottom: "page.hstack"
7157
- },
7158
7395
  variants: {
7159
7396
  left: {
7160
- display: "flex",
7161
- flexFlow: "column nowrap",
7162
- order: "1",
7397
+ gridColumn: {
7398
+ base: "1",
7399
+ md: "2"
7400
+ },
7163
7401
  marginEnd: {
7164
7402
  md: 0
7165
7403
  },
@@ -7170,37 +7408,23 @@ var TemplateContentPrimary = {
7170
7408
  }
7171
7409
  };
7172
7410
  var TemplateContentSidebar = {
7173
- baseStyle: {
7174
- flex: {
7175
- base: "0 0 auto",
7176
- md: "0 0 255px"
7177
- },
7178
- order: {
7179
- md: "page.vstack"
7180
- },
7181
- marginBottom: "page.hstack"
7182
- },
7183
7411
  variants: {
7184
7412
  left: {
7185
- marginEnd: {
7186
- base: 0,
7187
- md: "page.vstack"
7188
- }
7413
+ gridColumn: "1"
7189
7414
  },
7190
7415
  right: {
7191
- marginStart: {
7192
- base: 0,
7193
- md: "page.vstack"
7416
+ gridColumn: {
7417
+ base: "1",
7418
+ md: "2"
7194
7419
  }
7195
7420
  }
7196
7421
  }
7197
7422
  };
7198
7423
  var TemplateStyles = {
7199
7424
  Template: Template,
7200
- TemplateHeader: TemplateHeader,
7201
7425
  TemplateBreakout: TemplateBreakout,
7202
7426
  TemplateContent: TemplateContent,
7203
- TemplateContentTop: TemplateContentTop,
7427
+ TemplateContentTopBottom: TemplateContentTopBottom,
7204
7428
  TemplateContentPrimary: TemplateContentPrimary,
7205
7429
  TemplateContentSidebar: TemplateContentSidebar
7206
7430
  };
@@ -12049,7 +12273,7 @@ var Tabs = /*#__PURE__*/react.chakra( /*#__PURE__*/React.forwardRef(function (pr
12049
12273
  }, React__default.createElement(react.Box, Object.assign({}, carouselStyle), tabs)), nextButton), panels);
12050
12274
  })); // Tabs is also exported above so the props can display in Storybook.
12051
12275
 
12052
- var _excluded$29 = ["aboveHeader", "breakout", "contentId", "contentPrimary", "contentSidebar", "contentTop", "footer", "header", "sidebar", "renderFooterElement", "renderHeaderElement", "renderSkipNavigation"];
12276
+ var _excluded$29 = ["aboveHeader", "breakout", "contentId", "contentBottom", "contentPrimary", "contentSidebar", "contentTop", "footer", "header", "sidebar", "renderFooterElement", "renderHeaderElement", "renderSkipNavigation"];
12053
12277
  /**
12054
12278
  * The main top-level parent component that wraps all template-related
12055
12279
  * components.
@@ -12086,11 +12310,11 @@ var TemplateAboveHeader = function TemplateAboveHeader(props) {
12086
12310
  */
12087
12311
 
12088
12312
 
12089
- var TemplateHeader$1 = function TemplateHeader(_ref) {
12313
+ var TemplateHeader = function TemplateHeader(_ref) {
12090
12314
  var children = _ref.children,
12091
12315
  _ref$renderHeaderElem = _ref.renderHeaderElement,
12092
12316
  renderHeaderElement = _ref$renderHeaderElem === void 0 ? true : _ref$renderHeaderElem;
12093
- var styles = react.useStyleConfig("TemplateHeader", {});
12317
+ var styles = react.useStyleConfig("TemplateBreakout", {});
12094
12318
  var headerElement = React__default.createElement(react.Box, {
12095
12319
  __css: styles
12096
12320
  }, children); // The user wants to render the `header` HTML element.
@@ -12114,9 +12338,10 @@ var TemplateHeader$1 = function TemplateHeader(_ref) {
12114
12338
  return headerElement;
12115
12339
  };
12116
12340
  /**
12117
- * This optional component should be used inside the `TemplateHeader` component.
12118
- * This is meant to render its children from edge to edge and is most useful
12119
- * for the `Breadcrumbs` and `Hero` components, and other banner-like components.
12341
+ * This component should be used inside the `Template` component to contain both
12342
+ * the `TemplateAboveHeader` and `TemplateHeader` components. This is meant to
12343
+ * render its children from edge to edge and is most useful for the headers,
12344
+ * `Breadcrumbs`, and `Hero` components or other banner-like components.
12120
12345
  */
12121
12346
 
12122
12347
 
@@ -12145,7 +12370,7 @@ var TemplateContent$1 = function TemplateContent(props) {
12145
12370
  _props$sidebar = props.sidebar,
12146
12371
  sidebar = _props$sidebar === void 0 ? "none" : _props$sidebar;
12147
12372
  var styles = react.useStyleConfig("TemplateContent", {
12148
- variant: sidebar !== "none" ? "sidebar" : null
12373
+ variant: sidebar
12149
12374
  }); // Manually pass in the `sidebar` prop to the `TemplateContentPrimary` and
12150
12375
  // `TemplateContentSidebar` components.
12151
12376
 
@@ -12175,8 +12400,22 @@ var TemplateContent$1 = function TemplateContent(props) {
12175
12400
  */
12176
12401
 
12177
12402
 
12178
- var TemplateContentTop$1 = function TemplateContentTop(props) {
12179
- var styles = react.useStyleConfig("TemplateContentTop", {});
12403
+ var TemplateContentTop = function TemplateContentTop(props) {
12404
+ var styles = react.useStyleConfig("TemplateContentTopBottom", {});
12405
+ return React__default.createElement(react.Box, {
12406
+ __css: styles
12407
+ }, props.children);
12408
+ };
12409
+ /**
12410
+ * This optional component must be used inside the `TemplateContent` component
12411
+ * and after the `TemplateContentPrimary` or `TemplateContentSidebar` component.
12412
+ * This renders content in the main width of the container and should always
12413
+ * render below the primary component and the sidebar component (if any).
12414
+ */
12415
+
12416
+
12417
+ var TemplateContentBottom = function TemplateContentBottom(props) {
12418
+ var styles = react.useStyleConfig("TemplateContentTopBottom", {});
12180
12419
  return React__default.createElement(react.Box, {
12181
12420
  __css: styles
12182
12421
  }, props.children);
@@ -12234,6 +12473,7 @@ var TemplateFooter = function TemplateFooter(_ref2) {
12234
12473
  var children = _ref2.children,
12235
12474
  _ref2$renderFooterEle = _ref2.renderFooterElement,
12236
12475
  renderFooterElement = _ref2$renderFooterEle === void 0 ? true : _ref2$renderFooterEle;
12476
+ var styles = react.useStyleConfig("TemplateBreakout", {});
12237
12477
  var footerElement = React__default.createElement(React__default.Fragment, null, children); // The user wants to render the `footer` HTML element.
12238
12478
 
12239
12479
  if (renderFooterElement) {
@@ -12246,7 +12486,8 @@ var TemplateFooter = function TemplateFooter(_ref2) {
12246
12486
  }
12247
12487
  });
12248
12488
  footerElement = React__default.createElement(react.Box, {
12249
- as: "footer"
12489
+ as: "footer",
12490
+ __css: styles
12250
12491
  }, children);
12251
12492
  }
12252
12493
 
@@ -12266,6 +12507,7 @@ var TemplateAppContainer = /*#__PURE__*/react.chakra( /*#__PURE__*/React.forward
12266
12507
  breakout = props.breakout,
12267
12508
  _props$contentId = props.contentId,
12268
12509
  contentId = _props$contentId === void 0 ? "mainContent" : _props$contentId,
12510
+ contentBottom = props.contentBottom,
12269
12511
  contentPrimary = props.contentPrimary,
12270
12512
  contentSidebar = props.contentSidebar,
12271
12513
  contentTop = props.contentTop,
@@ -12282,20 +12524,20 @@ var TemplateAppContainer = /*#__PURE__*/react.chakra( /*#__PURE__*/React.forward
12282
12524
  rest = _objectWithoutPropertiesLoose(props, _excluded$29);
12283
12525
 
12284
12526
  var aboveHeaderElem = aboveHeader && React__default.createElement(TemplateAboveHeader, null, aboveHeader);
12285
- var breakoutElem = breakout && React__default.createElement(TemplateBreakout$1, null, breakout);
12286
- var contentTopElem = contentTop && React__default.createElement(TemplateContentTop$1, null, contentTop);
12527
+ var contentTopElem = contentTop && React__default.createElement(TemplateContentTop, null, contentTop);
12287
12528
  var contentPrimaryElem = contentPrimary && React__default.createElement(TemplateContentPrimary$1, null, contentPrimary);
12529
+ var contentBottomElem = contentBottom && React__default.createElement(TemplateContentBottom, null, contentBottom);
12288
12530
  var contentSidebarElem = contentSidebar && React__default.createElement(TemplateContentSidebar$1, null, contentSidebar);
12289
- return React__default.createElement(Template$1, Object.assign({
12531
+ return React__default.createElement(React__default.Fragment, null, renderSkipNavigation ? React__default.createElement(SkipNavigation$1, null) : null, React__default.createElement(Template$1, Object.assign({
12290
12532
  ref: ref
12291
- }, rest), renderSkipNavigation ? React__default.createElement(SkipNavigation$1, null) : null, aboveHeaderElem, (header || breakoutElem) && React__default.createElement(TemplateHeader$1, {
12533
+ }, rest), React__default.createElement(TemplateBreakout$1, null, aboveHeaderElem, (header || breakout) && React__default.createElement(TemplateHeader, {
12292
12534
  renderHeaderElement: renderHeaderElement
12293
- }, header, breakoutElem), React__default.createElement(TemplateContent$1, {
12535
+ }, header, breakout)), React__default.createElement(TemplateContent$1, {
12294
12536
  id: contentId,
12295
12537
  sidebar: sidebar
12296
- }, contentTopElem, sidebar === "left" && contentSidebarElem, contentPrimaryElem, sidebar === "right" && contentSidebarElem), footer && React__default.createElement(TemplateFooter, {
12538
+ }, contentTopElem, sidebar === "left" && contentSidebarElem, contentPrimaryElem, sidebar === "right" && contentSidebarElem, contentBottomElem), footer && React__default.createElement(TemplateFooter, {
12297
12539
  renderFooterElement: renderFooterElement
12298
- }, footer));
12540
+ }, footer)));
12299
12541
  }));
12300
12542
 
12301
12543
  var _excluded$2a = ["defaultChecked", "helperText", "id", "invalidText", "isChecked", "isDisabled", "isInvalid", "isRequired", "labelText", "name", "onChange", "size"];
@@ -12374,94 +12616,6 @@ var Toggle$2 = /*#__PURE__*/react.chakra( /*#__PURE__*/React.forwardRef(function
12374
12616
  }), labelText)));
12375
12617
  }));
12376
12618
 
12377
- /**
12378
- * A custom hook that returns the Chakra-based NYPL theme object. This must be
12379
- * used inside a component that is wrapped in the `DSProvider` component, so
12380
- * that the theme object can be available to use.
12381
- */
12382
-
12383
- function useNYPLTheme() {
12384
- var theme = react.useTheme();
12385
-
12386
- if (!theme || Object.keys(theme).length === 0) {
12387
- console.warn("NYPL Reservoir useNYPLTheme: hook must be used inside of `<DSProvider />`.");
12388
- return {};
12389
- } // Chakra provides a lot of their own styles but
12390
- // only NYPL styles should be exported.
12391
-
12392
-
12393
- return {
12394
- // base, sm, md, lg, xl, 2xl
12395
- breakpoints: theme.breakpoints,
12396
- colors: {
12397
- // primary, secondary
12398
- brand: theme.colors.brand,
12399
- // blogs, books-and-more, education, locations,
12400
- // research, research-library, whats-on
12401
- section: theme.colors.section,
12402
- transparent: theme.colors.transparent,
12403
- // black, disabled, error, focus, gray, link,
12404
- // status, success, test, warning, white
12405
- ui: theme.colors.ui
12406
- },
12407
- fontSizes: {
12408
- "-3": theme.fontSizes["-3"],
12409
- "-2": theme.fontSizes["-2"],
12410
- "-1": theme.fontSizes["-1"],
12411
- "0": theme.fontSizes["0"],
12412
- "1": theme.fontSizes["1"],
12413
- "2": theme.fontSizes["2"],
12414
- "3": theme.fontSizes["3"],
12415
- "4": theme.fontSizes["4"],
12416
- // default
12417
- breadcrumbs: theme.fontSizes.breadcrumbs,
12418
- // default
12419
- button: theme.fontSizes.button,
12420
- // primary, secondary, tertiary, callout
12421
- heading: theme.fontSizes.heading,
12422
- // default
12423
- helper: theme.fontSizes.helper,
12424
- // default, secondary
12425
- label: theme.fontSizes.label,
12426
- // default, caption, tag, mini
12427
- text: theme.fontSizes.text
12428
- },
12429
- fontWeights: {
12430
- light: theme.fontWeights.light,
12431
- regular: theme.fontWeights.regular,
12432
- medium: theme.fontWeights.medium,
12433
- bold: theme.fontWeights.bold,
12434
- // default, lastChild
12435
- breadcrumbs: theme.fontWeights.breadcrumbs,
12436
- // default
12437
- button: theme.fontWeights.button,
12438
- // primary, secondary, tertiary, callout
12439
- heading: theme.fontWeights.heading,
12440
- // default
12441
- helper: theme.fontWeights.helper,
12442
- // default
12443
- label: theme.fontWeights.label,
12444
- // default, caption, tag, mini
12445
- text: theme.fontWeights.text
12446
- },
12447
- fonts: {
12448
- body: theme.fonts.body,
12449
- heading: theme.fonts.heading
12450
- },
12451
- radii: theme.radii,
12452
- space: {
12453
- xxs: theme.space.xxs,
12454
- xs: theme.space.xs,
12455
- s: theme.space.s,
12456
- m: theme.space.m,
12457
- l: theme.space.l,
12458
- xl: theme.space.xl,
12459
- xxl: theme.space.xxl,
12460
- xxxl: theme.space.xxxl
12461
- }
12462
- };
12463
- }
12464
-
12465
12619
  var _excluded$2b = ["aspectRatio", "className", "descriptionText", "embedCode", "headingText", "helperText", "id", "iframeTitle", "showHelperInvalidText", "videoId", "videoType"];
12466
12620
  var VideoPlayer$1 = /*#__PURE__*/react.chakra( /*#__PURE__*/React.forwardRef(function (props, ref) {
12467
12621
  var aspectRatio = props.aspectRatio,
@@ -12716,9 +12870,9 @@ exports.TemplateBreakout = TemplateBreakout$1;
12716
12870
  exports.TemplateContent = TemplateContent$1;
12717
12871
  exports.TemplateContentPrimary = TemplateContentPrimary$1;
12718
12872
  exports.TemplateContentSidebar = TemplateContentSidebar$1;
12719
- exports.TemplateContentTop = TemplateContentTop$1;
12873
+ exports.TemplateContentTop = TemplateContentTop;
12720
12874
  exports.TemplateFooter = TemplateFooter;
12721
- exports.TemplateHeader = TemplateHeader$1;
12875
+ exports.TemplateHeader = TemplateHeader;
12722
12876
  exports.Text = Text;
12723
12877
  exports.TextInput = TextInput;
12724
12878
  exports.Toggle = Toggle$2;