@butternutbox/pawprint-native 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.cts CHANGED
@@ -1346,6 +1346,7 @@ type RadioOwnProps = {
1346
1346
  label?: React.ReactNode;
1347
1347
  subText?: React.ReactNode;
1348
1348
  asset?: IllustrationProps;
1349
+ tag?: TagProps;
1349
1350
  disabled?: boolean;
1350
1351
  selected?: boolean;
1351
1352
  onSelect?: (value: string) => void;
@@ -1359,6 +1360,7 @@ type RadioProps = RadioOwnProps & Omit<PressableProps, keyof RadioOwnProps | "ch
1359
1360
  * @param {React.ReactNode} [label] - Main label text or content.
1360
1361
  * @param {React.ReactNode} [subText] - Optional descriptive subtext.
1361
1362
  * @param {IllustrationProps} [asset] - Optional illustration asset for tile variant.
1363
+ * @param {TagProps} [tag] - Optional tag rendered below the label/subtext. Accepts the full Tag API (variant, icon, size). Hidden when omitted.
1362
1364
  * @param {boolean} [disabled=false] - Whether the radio is disabled.
1363
1365
  * @param {boolean} [selected=false] - Whether the radio is currently selected.
1364
1366
  * @param {(value: string) => void} [onSelect] - Callback when radio is selected.
@@ -1614,7 +1616,11 @@ type InlineVariantProps = BaseProps & {
1614
1616
  title?: string;
1615
1617
  onClose?: () => void;
1616
1618
  size?: never;
1617
- link?: never;
1619
+ link?: {
1620
+ label: string;
1621
+ href?: string;
1622
+ onPress?: () => void;
1623
+ };
1618
1624
  };
1619
1625
  type ToastVariantProps = BaseProps & {
1620
1626
  variant: "toast";
@@ -1632,7 +1638,11 @@ type SystemVariantProps = BaseProps & {
1632
1638
  size?: NotificationSize;
1633
1639
  title?: never;
1634
1640
  onClose?: never;
1635
- link?: never;
1641
+ link?: {
1642
+ label: string;
1643
+ href?: string;
1644
+ onPress?: () => void;
1645
+ };
1636
1646
  };
1637
1647
  type NotificationOwnProps = InlineVariantProps | ToastVariantProps | SystemVariantProps;
1638
1648
  type NotificationProps = NotificationOwnProps & Omit<ViewProps, keyof NotificationOwnProps>;
@@ -1641,7 +1651,7 @@ type NotificationProps = NotificationOwnProps & Omit<ViewProps, keyof Notificati
1641
1651
  * variants — inline (within content flow), toast (floating overlay), and
1642
1652
  * system (full-width banner) — each with four severity types.
1643
1653
  *
1644
- * Note: Unlike the web version, toast link uses `onPress` callback instead
1654
+ * Note: Unlike the web version, links use `onPress` callback instead
1645
1655
  * of `href` for navigation. The `href` prop is also available and opens
1646
1656
  * the URL via `Linking`.
1647
1657
  *
@@ -1650,7 +1660,7 @@ type NotificationProps = NotificationOwnProps & Omit<ViewProps, keyof Notificati
1650
1660
  * @param {boolean} [showIcon=true] - Whether to show the status icon.
1651
1661
  * @param {string} [title] - Optional headline (inline variant only).
1652
1662
  * @param {() => void} [onClose] - Close callback (inline and toast variants).
1653
- * @param {{ label: string; href?: string; onPress?: () => void }} [link] - Optional action link (toast variant only).
1663
+ * @param {{ label: string; href?: string; onPress?: () => void }} [link] - Optional action link (all variants).
1654
1664
  * @param {"sm" | "lg"} [size="sm"] - Size variant (system variant only).
1655
1665
  * @param {React.ReactNode} children - The notification body text.
1656
1666
  *
package/dist/index.d.ts CHANGED
@@ -1346,6 +1346,7 @@ type RadioOwnProps = {
1346
1346
  label?: React.ReactNode;
1347
1347
  subText?: React.ReactNode;
1348
1348
  asset?: IllustrationProps;
1349
+ tag?: TagProps;
1349
1350
  disabled?: boolean;
1350
1351
  selected?: boolean;
1351
1352
  onSelect?: (value: string) => void;
@@ -1359,6 +1360,7 @@ type RadioProps = RadioOwnProps & Omit<PressableProps, keyof RadioOwnProps | "ch
1359
1360
  * @param {React.ReactNode} [label] - Main label text or content.
1360
1361
  * @param {React.ReactNode} [subText] - Optional descriptive subtext.
1361
1362
  * @param {IllustrationProps} [asset] - Optional illustration asset for tile variant.
1363
+ * @param {TagProps} [tag] - Optional tag rendered below the label/subtext. Accepts the full Tag API (variant, icon, size). Hidden when omitted.
1362
1364
  * @param {boolean} [disabled=false] - Whether the radio is disabled.
1363
1365
  * @param {boolean} [selected=false] - Whether the radio is currently selected.
1364
1366
  * @param {(value: string) => void} [onSelect] - Callback when radio is selected.
@@ -1614,7 +1616,11 @@ type InlineVariantProps = BaseProps & {
1614
1616
  title?: string;
1615
1617
  onClose?: () => void;
1616
1618
  size?: never;
1617
- link?: never;
1619
+ link?: {
1620
+ label: string;
1621
+ href?: string;
1622
+ onPress?: () => void;
1623
+ };
1618
1624
  };
1619
1625
  type ToastVariantProps = BaseProps & {
1620
1626
  variant: "toast";
@@ -1632,7 +1638,11 @@ type SystemVariantProps = BaseProps & {
1632
1638
  size?: NotificationSize;
1633
1639
  title?: never;
1634
1640
  onClose?: never;
1635
- link?: never;
1641
+ link?: {
1642
+ label: string;
1643
+ href?: string;
1644
+ onPress?: () => void;
1645
+ };
1636
1646
  };
1637
1647
  type NotificationOwnProps = InlineVariantProps | ToastVariantProps | SystemVariantProps;
1638
1648
  type NotificationProps = NotificationOwnProps & Omit<ViewProps, keyof NotificationOwnProps>;
@@ -1641,7 +1651,7 @@ type NotificationProps = NotificationOwnProps & Omit<ViewProps, keyof Notificati
1641
1651
  * variants — inline (within content flow), toast (floating overlay), and
1642
1652
  * system (full-width banner) — each with four severity types.
1643
1653
  *
1644
- * Note: Unlike the web version, toast link uses `onPress` callback instead
1654
+ * Note: Unlike the web version, links use `onPress` callback instead
1645
1655
  * of `href` for navigation. The `href` prop is also available and opens
1646
1656
  * the URL via `Linking`.
1647
1657
  *
@@ -1650,7 +1660,7 @@ type NotificationProps = NotificationOwnProps & Omit<ViewProps, keyof Notificati
1650
1660
  * @param {boolean} [showIcon=true] - Whether to show the status icon.
1651
1661
  * @param {string} [title] - Optional headline (inline variant only).
1652
1662
  * @param {() => void} [onClose] - Close callback (inline and toast variants).
1653
- * @param {{ label: string; href?: string; onPress?: () => void }} [link] - Optional action link (toast variant only).
1663
+ * @param {{ label: string; href?: string; onPress?: () => void }} [link] - Optional action link (all variants).
1654
1664
  * @param {"sm" | "lg"} [size="sm"] - Size variant (system variant only).
1655
1665
  * @param {React.ReactNode} children - The notification body text.
1656
1666
  *
package/dist/index.js CHANGED
@@ -8756,6 +8756,7 @@ DrawerOverlay.displayName = "Drawer.Overlay";
8756
8756
  var DrawerDragContext = React60.createContext(null);
8757
8757
  var useDrawerDragContext = () => React60.useContext(DrawerDragContext);
8758
8758
  var DrawerFooterContext = React60.createContext(false);
8759
+ var useDrawerFooterContext = () => React60.useContext(DrawerFooterContext);
8759
8760
  var DrawerHeaderContext = React60.createContext(null);
8760
8761
  var useDrawerHeaderContext = () => React60.useContext(DrawerHeaderContext);
8761
8762
  var OPEN_DURATION = 320;
@@ -9282,12 +9283,22 @@ var DrawerDescription = React60.forwardRef(
9282
9283
  );
9283
9284
  DrawerDescription.displayName = "Drawer.Description";
9284
9285
  var parseTokenValue26 = (value) => parseFloat(value);
9285
- var StyledScrollView = styled60(ScrollView)(({ bodyPaddingHorizontal, bodyPaddingRight, bodyGap }) => ({
9286
- flex: 1,
9287
- paddingLeft: bodyPaddingHorizontal,
9288
- paddingRight: bodyPaddingRight,
9289
- gap: bodyGap
9290
- }));
9286
+ var StyledScrollView = styled60(ScrollView)(
9287
+ ({
9288
+ bodyPaddingHorizontal,
9289
+ bodyPaddingRight,
9290
+ bodyGap,
9291
+ bodyMaxHeight,
9292
+ bodyPaddingBottom
9293
+ }) => ({
9294
+ flex: 1,
9295
+ paddingLeft: bodyPaddingHorizontal,
9296
+ paddingRight: bodyPaddingRight,
9297
+ gap: bodyGap,
9298
+ maxHeight: bodyMaxHeight,
9299
+ paddingBottom: bodyPaddingBottom
9300
+ })
9301
+ );
9291
9302
  var DrawerBody = React60.forwardRef(
9292
9303
  (_a, ref) => {
9293
9304
  var _b = _a, { children, contentContainerStyle } = _b, props = __objRest(_b, ["children", "contentContainerStyle"]);
@@ -9296,10 +9307,14 @@ var DrawerBody = React60.forwardRef(
9296
9307
  const { buttons } = theme2.tokens.components;
9297
9308
  const { content } = spacing;
9298
9309
  const headerContext = useDrawerHeaderContext();
9310
+ const footerContext = useDrawerFooterContext();
9311
+ const { height: windowHeight } = useWindowDimensions();
9299
9312
  const gap = parseTokenValue26(content.slot.gap);
9300
9313
  const horizontalPadding = parseTokenValue26(content.slot.horizontalPadding);
9301
9314
  const topPadding = parseTokenValue26(content.slot.verticalPadding);
9315
+ const bodyMaxHeight = windowHeight - 300;
9302
9316
  const paddingRight = headerContext === null ? parseTokenValue26(spacing.close.right.md) + parseTokenValue26(buttons.size.sm.height) : horizontalPadding;
9317
+ const bodyPaddingBottom = !footerContext ? parseTokenValue26(theme2.tokens.semantics.dimensions.spacing["2xl"]) : 0;
9303
9318
  return /* @__PURE__ */ jsx(
9304
9319
  StyledScrollView,
9305
9320
  __spreadProps(__spreadValues({
@@ -9307,6 +9322,8 @@ var DrawerBody = React60.forwardRef(
9307
9322
  bodyPaddingHorizontal: horizontalPadding,
9308
9323
  bodyPaddingRight: paddingRight,
9309
9324
  bodyGap: gap,
9325
+ bodyMaxHeight,
9326
+ bodyPaddingBottom,
9310
9327
  contentContainerStyle: [
9311
9328
  {
9312
9329
  gap,
@@ -9440,7 +9457,8 @@ var StyledDockRoot = styled60(View)(
9440
9457
  dockBgColor,
9441
9458
  dockBorderTopWidth,
9442
9459
  dockBorderTopColor,
9443
- dockPaddingVertical
9460
+ dockPaddingVertical,
9461
+ dockPaddingHorizontal
9444
9462
  }) => ({
9445
9463
  alignItems: "center",
9446
9464
  justifyContent: "center",
@@ -9448,7 +9466,8 @@ var StyledDockRoot = styled60(View)(
9448
9466
  backgroundColor: dockBgColor,
9449
9467
  borderTopWidth: dockBorderTopWidth,
9450
9468
  borderTopColor: dockBorderTopColor,
9451
- paddingVertical: dockPaddingVertical
9469
+ paddingVertical: dockPaddingVertical,
9470
+ paddingHorizontal: dockPaddingHorizontal
9452
9471
  })
9453
9472
  );
9454
9473
  var StyledStackedInner = styled60(View)(
@@ -9485,6 +9504,9 @@ var ButtonDock = React60.forwardRef(
9485
9504
  dockBorderTopColor: buttonDock.colour.border,
9486
9505
  dockPaddingVertical: parseTokenValue28(
9487
9506
  buttonDock.spacing[variant].mobile.topPadding
9507
+ ),
9508
+ dockPaddingHorizontal: parseTokenValue28(
9509
+ buttonDock.spacing[variant].mobile.horizontalPadding
9488
9510
  )
9489
9511
  }, rest), {
9490
9512
  children: isStacked ? /* @__PURE__ */ jsxs(
@@ -9519,7 +9541,7 @@ var ButtonDock = React60.forwardRef(
9519
9541
  {
9520
9542
  groupDirection: "row",
9521
9543
  groupAlign: "center",
9522
- groupJustify: "space-around",
9544
+ groupJustify: "space-between",
9523
9545
  groupGap,
9524
9546
  children
9525
9547
  }
@@ -10855,6 +10877,12 @@ var StyledTextContent = styled60(View)(({ textContentGap }) => ({
10855
10877
  var StyledAssetWrapper = styled60(View)({
10856
10878
  alignSelf: "center"
10857
10879
  });
10880
+ var StyledTagWrapper = styled60(View)(
10881
+ ({ tagTopPadding }) => ({
10882
+ alignItems: "flex-start",
10883
+ paddingTop: tagTopPadding
10884
+ })
10885
+ );
10858
10886
  var Radio = React60.forwardRef(
10859
10887
  (_a, ref) => {
10860
10888
  var _b = _a, {
@@ -10862,6 +10890,7 @@ var Radio = React60.forwardRef(
10862
10890
  label,
10863
10891
  subText,
10864
10892
  asset,
10893
+ tag,
10865
10894
  disabled = false,
10866
10895
  value,
10867
10896
  selected = false,
@@ -10872,6 +10901,7 @@ var Radio = React60.forwardRef(
10872
10901
  "label",
10873
10902
  "subText",
10874
10903
  "asset",
10904
+ "tag",
10875
10905
  "disabled",
10876
10906
  "value",
10877
10907
  "selected",
@@ -10926,7 +10956,7 @@ var Radio = React60.forwardRef(
10926
10956
  )
10927
10957
  }
10928
10958
  ),
10929
- (label || subText) && /* @__PURE__ */ jsxs(
10959
+ (label || subText || tag) && /* @__PURE__ */ jsxs(
10930
10960
  StyledTextContent,
10931
10961
  {
10932
10962
  textContentGap: parseTokenValue40(spacing.content.gap),
@@ -10939,6 +10969,13 @@ var Radio = React60.forwardRef(
10939
10969
  color: colour.text.subtext,
10940
10970
  children: subText
10941
10971
  }
10972
+ ),
10973
+ tag && /* @__PURE__ */ jsx(
10974
+ StyledTagWrapper,
10975
+ {
10976
+ tagTopPadding: parseTokenValue40(spacing.content.tag.topPadding),
10977
+ children: /* @__PURE__ */ jsx(Tag, __spreadValues({}, tag))
10978
+ }
10942
10979
  )
10943
10980
  ]
10944
10981
  }
@@ -12389,14 +12426,26 @@ var Notification = React60.forwardRef(
12389
12426
  "aria-label": type
12390
12427
  }
12391
12428
  ),
12392
- /* @__PURE__ */ jsx(
12393
- Typography,
12394
- {
12395
- token: systemNotifications.notifications.typography.default,
12396
- color: systemNotifications.notification.colour.text.default,
12397
- children
12398
- }
12399
- )
12429
+ /* @__PURE__ */ jsxs(View, { style: { flexDirection: "column", gap: 8, flex: 1 }, children: [
12430
+ /* @__PURE__ */ jsx(
12431
+ Typography,
12432
+ {
12433
+ token: systemNotifications.notifications.typography.default,
12434
+ color: systemNotifications.notification.colour.text.default,
12435
+ children
12436
+ }
12437
+ ),
12438
+ link && /* @__PURE__ */ jsx(
12439
+ Link,
12440
+ {
12441
+ href: link.href,
12442
+ onPress: link.onPress,
12443
+ weight: "semiBold",
12444
+ size: "md",
12445
+ children: link.label
12446
+ }
12447
+ )
12448
+ ] })
12400
12449
  ]
12401
12450
  })
12402
12451
  );
@@ -12490,41 +12539,59 @@ var Notification = React60.forwardRef(
12490
12539
  rootBgColor: bgMap[type]
12491
12540
  }, rest), {
12492
12541
  children: [
12493
- /* @__PURE__ */ jsx(StyledContents, { contentsGap: parseTokenValue49(content.spacing.gap), children: /* @__PURE__ */ jsxs(StyledCopyRow, { copyGap: parseTokenValue49(content.spacing.gap), children: [
12494
- showIcon && /* @__PURE__ */ jsx(
12495
- Icon,
12496
- {
12497
- icon: IconComponent,
12498
- size: "md",
12499
- colour: type,
12500
- "aria-label": type
12501
- }
12502
- ),
12503
- /* @__PURE__ */ jsxs(
12504
- StyledInlineCopy,
12542
+ /* @__PURE__ */ jsxs(StyledContents, { contentsGap: parseTokenValue49(content.spacing.gap), children: [
12543
+ /* @__PURE__ */ jsxs(StyledCopyRow, { copyGap: parseTokenValue49(content.spacing.gap), children: [
12544
+ showIcon && /* @__PURE__ */ jsx(
12545
+ Icon,
12546
+ {
12547
+ icon: IconComponent,
12548
+ size: "md",
12549
+ colour: type,
12550
+ "aria-label": type
12551
+ }
12552
+ ),
12553
+ /* @__PURE__ */ jsxs(
12554
+ StyledInlineCopy,
12555
+ {
12556
+ copyGap: parseTokenValue49(content.copy.spacing.gap),
12557
+ children: [
12558
+ title && /* @__PURE__ */ jsx(
12559
+ Typography,
12560
+ {
12561
+ token: notifications.typography.title,
12562
+ color: colour.text.title,
12563
+ children: title
12564
+ }
12565
+ ),
12566
+ /* @__PURE__ */ jsx(
12567
+ Typography,
12568
+ {
12569
+ token: notifications.typography.body,
12570
+ color: colour.text.body,
12571
+ children
12572
+ }
12573
+ )
12574
+ ]
12575
+ }
12576
+ )
12577
+ ] }),
12578
+ link && /* @__PURE__ */ jsx(
12579
+ StyledLinkWrapper,
12505
12580
  {
12506
- copyGap: parseTokenValue49(content.copy.spacing.gap),
12507
- children: [
12508
- title && /* @__PURE__ */ jsx(
12509
- Typography,
12510
- {
12511
- token: notifications.typography.title,
12512
- color: colour.text.title,
12513
- children: title
12514
- }
12515
- ),
12516
- /* @__PURE__ */ jsx(
12517
- Typography,
12518
- {
12519
- token: notifications.typography.body,
12520
- color: colour.text.body,
12521
- children
12522
- }
12523
- )
12524
- ]
12581
+ linkPaddingLeft: parseTokenValue49(content.copy.spacing.gap),
12582
+ children: /* @__PURE__ */ jsx(
12583
+ Link,
12584
+ {
12585
+ href: link.href,
12586
+ onPress: link.onPress,
12587
+ weight: "semiBold",
12588
+ size: "md",
12589
+ children: link.label
12590
+ }
12591
+ )
12525
12592
  }
12526
12593
  )
12527
- ] }) }),
12594
+ ] }),
12528
12595
  onClose && /* @__PURE__ */ jsx(
12529
12596
  StyledCloseButton,
12530
12597
  {