@multiplatform.one/frappe-ui 7.36.0 → 7.38.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.
@@ -1,6 +1,5 @@
1
- import { Avatar, Text, XStack, YStack } from "@multiplatform.one/components";
2
- import { Button } from "@multiplatform.one/forms";
3
- import { sizeRecipeEscape, useResolvedKnobs } from "@multiplatform.one/theme";
1
+ import { Avatar, Text, XStack, YStack, isWeb, useTheme } from "@multiplatform.one/components";
2
+ import { useResolvedKnobs } from "@multiplatform.one/theme";
4
3
  import { ArrowLeftIcon, ArrowRightIcon } from "@phosphor-icons/react";
5
4
  import { useTranslation } from "react-i18next";
6
5
  import { jsx, jsxs } from "react/jsx-runtime";
@@ -12,61 +11,73 @@ function PagerButton({
12
11
  const {
13
12
  t
14
13
  } = useTranslation();
14
+ const theme = useTheme();
15
15
  const {
16
- knobProps: nested
16
+ knobProps,
17
+ control
17
18
  } = useResolvedKnobs();
18
19
  const isPrev = direction === "prev";
20
+ const label = isPrev ? t("Previous") : t("Next");
21
+ const Arrow = isPrev ? ArrowLeftIcon : ArrowRightIcon;
19
22
  const avatar = /* @__PURE__ */jsx(Avatar, {
20
23
  src: entry.image,
21
24
  name: entry.title,
22
25
  backgroundColor: "$color4",
23
26
  fallbackBackgroundColor: "$color4"
24
27
  });
25
- return /* @__PURE__ */jsx(Button, {
26
- outlined: true,
27
- minHeight: sizeRecipeEscape(56, "pager button: room for the neighbor's two-line label beside its avatar"),
28
- flexShrink: 1,
28
+ return /* @__PURE__ */jsxs(YStack, {
29
+ ...(isWeb ? {
30
+ render: /* @__PURE__ */jsx("button", {
31
+ type: "button"
32
+ })
33
+ } : {}),
34
+ role: "button",
35
+ tabIndex: 0,
36
+ "aria-label": [label, entry.code, entry.title].filter(Boolean).join(" "),
37
+ ...knobProps.inputSurface,
38
+ ...knobProps.containerRadius,
39
+ ...knobProps.panelPadding,
40
+ ...knobProps.gapSm,
41
+ backgroundColor: "$background",
42
+ borderColor: "$borderColor",
43
+ hoverStyle: control.hoverKnobProps,
44
+ pressStyle: control.pressKnobProps,
45
+ focusVisibleStyle: control.focusVisibleKnobProps,
46
+ flexGrow: 1,
47
+ flexBasis: 0,
29
48
  minWidth: 0,
49
+ cursor: "pointer",
30
50
  onPress: entry.onPress,
31
- icon: isPrev ? /* @__PURE__ */jsx(ArrowLeftIcon, {
32
- size: 18
33
- }) : void 0,
34
- iconAfter: isPrev ? void 0 : /* @__PURE__ */jsx(ArrowRightIcon, {
35
- size: 18
36
- }),
37
51
  testID,
38
- children: /* @__PURE__ */jsxs(XStack, {
39
- gap: "$2",
52
+ children: [/* @__PURE__ */jsxs(XStack, {
53
+ ...knobProps.gapSm,
40
54
  alignItems: "center",
41
- flexShrink: 1,
42
- minWidth: 0,
43
- children: [isPrev ? avatar : null, /* @__PURE__ */jsxs(YStack, {
44
- alignItems: isPrev ? "flex-start" : "flex-end",
55
+ flexDirection: isPrev ? "row" : "row-reverse",
56
+ children: [/* @__PURE__ */jsx(Arrow, {
57
+ size: knobProps.controlIcon.width,
58
+ color: theme.color11?.val
59
+ }), /* @__PURE__ */jsx(Text, {
60
+ ...knobProps.label,
61
+ color: "$color11",
62
+ numberOfLines: 1,
45
63
  flexShrink: 1,
46
- minWidth: 0,
47
- children: [/* @__PURE__ */jsx(Text, {
48
- ...nested.label,
49
- color: "$color10",
50
- textTransform: "uppercase",
51
- letterSpacing: 1,
52
- children: isPrev ? t("Previous") : t("Next")
53
- }), /* @__PURE__ */jsxs(XStack, {
54
- gap: "$1.5",
55
- alignItems: "baseline",
56
- minWidth: 0,
57
- children: [entry.code ? /* @__PURE__ */jsx(Text, {
58
- ...nested.label,
59
- color: "$color10",
60
- children: entry.code
61
- }) : null, /* @__PURE__ */jsx(Text, {
62
- fontWeight: "700",
63
- numberOfLines: 1,
64
- flexShrink: 1,
65
- children: entry.title
66
- })]
67
- })]
68
- }), isPrev ? null : avatar]
69
- })
64
+ children: label
65
+ })]
66
+ }), /* @__PURE__ */jsxs(XStack, {
67
+ ...knobProps.gapSm,
68
+ alignItems: "center",
69
+ flexWrap: "wrap",
70
+ children: [avatar, entry.code ? /* @__PURE__ */jsx(Text, {
71
+ ...knobProps.label,
72
+ color: "$color11",
73
+ children: entry.code
74
+ }) : null]
75
+ }), /* @__PURE__ */jsx(Text, {
76
+ ...knobProps.body,
77
+ fontWeight: "700",
78
+ textAlign: "left",
79
+ children: entry.title
80
+ })]
70
81
  });
71
82
  }
72
83
  function RecordPager({
@@ -79,18 +90,26 @@ function RecordPager({
79
90
  } = useResolvedKnobs();
80
91
  if (!prev && !next) return null;
81
92
  return /* @__PURE__ */jsxs(XStack, {
82
- justifyContent: "space-between",
83
93
  ...knobProps.gap,
84
94
  marginTop: "$2",
95
+ alignItems: "stretch",
85
96
  children: [prev ? /* @__PURE__ */jsx(PagerButton, {
86
97
  direction: "prev",
87
98
  entry: prev,
88
99
  testID: testID && `${testID}-prev`
89
- }) : /* @__PURE__ */jsx(YStack, {}), next ? /* @__PURE__ */jsx(PagerButton, {
100
+ }) : /* @__PURE__ */jsx(YStack, {
101
+ flexGrow: 1,
102
+ flexBasis: 0,
103
+ minWidth: 0
104
+ }), next ? /* @__PURE__ */jsx(PagerButton, {
90
105
  direction: "next",
91
106
  entry: next,
92
107
  testID: testID && `${testID}-next`
93
- }) : /* @__PURE__ */jsx(YStack, {})]
108
+ }) : /* @__PURE__ */jsx(YStack, {
109
+ flexGrow: 1,
110
+ flexBasis: 0,
111
+ minWidth: 0
112
+ })]
94
113
  });
95
114
  }
96
115
  export { RecordPager };
@@ -1 +1 @@
1
- {"version":3,"names":["Avatar","Text","XStack","YStack","Button","sizeRecipeEscape","useResolvedKnobs","ArrowLeftIcon","ArrowRightIcon","useTranslation","jsx","jsxs","PagerButton","direction","entry","testID","t","knobProps","nested","isPrev","avatar","src","image","name","title","backgroundColor","fallbackBackgroundColor","outlined","minHeight","flexShrink","minWidth","onPress","icon","size","iconAfter","children","gap","alignItems","label","color","textTransform","letterSpacing","code","fontWeight","numberOfLines","RecordPager","prev","next","justifyContent","marginTop"],"sources":["../../../src/record/RecordPager.tsx"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["Avatar","Text","XStack","YStack","isWeb","useTheme","useResolvedKnobs","ArrowLeftIcon","ArrowRightIcon","useTranslation","jsx","jsxs","PagerButton","direction","entry","testID","t","theme","knobProps","control","isPrev","label","Arrow","avatar","src","image","name","title","backgroundColor","fallbackBackgroundColor","render","type","role","tabIndex","code","filter","Boolean","join","inputSurface","containerRadius","panelPadding","gapSm","borderColor","hoverStyle","hoverKnobProps","pressStyle","pressKnobProps","focusVisibleStyle","focusVisibleKnobProps","flexGrow","flexBasis","minWidth","cursor","onPress","children","alignItems","flexDirection","size","controlIcon","width","color","color11","val","numberOfLines","flexShrink","flexWrap","body","fontWeight","textAlign","RecordPager","prev","next","gap","marginTop"],"sources":["../../../src/record/RecordPager.tsx"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
@@ -29,7 +29,6 @@ __export(RecordPager_exports, {
29
29
  module.exports = __toCommonJS(RecordPager_exports);
30
30
  var import_jsx_runtime = require("react/jsx-runtime");
31
31
  var import_components = require("@multiplatform.one/components");
32
- var import_forms = require("@multiplatform.one/forms");
33
32
  var import_theme = require("@multiplatform.one/theme");
34
33
  var import_react = require("@phosphor-icons/react");
35
34
  var import_react_i18next = require("react-i18next");
@@ -39,64 +38,77 @@ function PagerButton(param) {
39
38
  entry,
40
39
  testID
41
40
  } = param;
41
+ var _theme_color11;
42
42
  var {
43
43
  t
44
44
  } = (0, import_react_i18next.useTranslation)();
45
+ var theme = (0, import_components.useTheme)();
45
46
  var {
46
- knobProps: nested
47
+ knobProps,
48
+ control
47
49
  } = (0, import_theme.useResolvedKnobs)();
48
50
  var isPrev = direction === "prev";
51
+ var label = isPrev ? t("Previous") : t("Next");
52
+ var Arrow = isPrev ? import_react.ArrowLeftIcon : import_react.ArrowRightIcon;
49
53
  var avatar = /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.Avatar, {
50
54
  src: entry.image,
51
55
  name: entry.title,
52
56
  backgroundColor: "$color4",
53
57
  fallbackBackgroundColor: "$color4"
54
58
  });
55
- return /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_forms.Button, {
56
- outlined: true,
57
- minHeight: (0, import_theme.sizeRecipeEscape)(56, "pager button: room for the neighbor's two-line label beside its avatar"),
58
- flexShrink: 1,
59
+ return /* @__PURE__ */(0, import_jsx_runtime.jsxs)(import_components.YStack, {
60
+ ...(import_components.isWeb ? {
61
+ render: /* @__PURE__ */(0, import_jsx_runtime.jsx)("button", {
62
+ type: "button"
63
+ })
64
+ } : {}),
65
+ role: "button",
66
+ tabIndex: 0,
67
+ "aria-label": [label, entry.code, entry.title].filter(Boolean).join(" "),
68
+ ...knobProps.inputSurface,
69
+ ...knobProps.containerRadius,
70
+ ...knobProps.panelPadding,
71
+ ...knobProps.gapSm,
72
+ backgroundColor: "$background",
73
+ borderColor: "$borderColor",
74
+ hoverStyle: control.hoverKnobProps,
75
+ pressStyle: control.pressKnobProps,
76
+ focusVisibleStyle: control.focusVisibleKnobProps,
77
+ flexGrow: 1,
78
+ flexBasis: 0,
59
79
  minWidth: 0,
80
+ cursor: "pointer",
60
81
  onPress: entry.onPress,
61
- icon: isPrev ? /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_react.ArrowLeftIcon, {
62
- size: 18
63
- }) : void 0,
64
- iconAfter: isPrev ? void 0 : /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_react.ArrowRightIcon, {
65
- size: 18
66
- }),
67
82
  testID,
68
- children: /* @__PURE__ */(0, import_jsx_runtime.jsxs)(import_components.XStack, {
69
- gap: "$2",
83
+ children: [/* @__PURE__ */(0, import_jsx_runtime.jsxs)(import_components.XStack, {
84
+ ...knobProps.gapSm,
70
85
  alignItems: "center",
71
- flexShrink: 1,
72
- minWidth: 0,
73
- children: [isPrev ? avatar : null, /* @__PURE__ */(0, import_jsx_runtime.jsxs)(import_components.YStack, {
74
- alignItems: isPrev ? "flex-start" : "flex-end",
86
+ flexDirection: isPrev ? "row" : "row-reverse",
87
+ children: [/* @__PURE__ */(0, import_jsx_runtime.jsx)(Arrow, {
88
+ size: knobProps.controlIcon.width,
89
+ color: (_theme_color11 = theme.color11) === null || _theme_color11 === void 0 ? void 0 : _theme_color11.val
90
+ }), /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.Text, {
91
+ ...knobProps.label,
92
+ color: "$color11",
93
+ numberOfLines: 1,
75
94
  flexShrink: 1,
76
- minWidth: 0,
77
- children: [/* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.Text, {
78
- ...nested.label,
79
- color: "$color10",
80
- textTransform: "uppercase",
81
- letterSpacing: 1,
82
- children: isPrev ? t("Previous") : t("Next")
83
- }), /* @__PURE__ */(0, import_jsx_runtime.jsxs)(import_components.XStack, {
84
- gap: "$1.5",
85
- alignItems: "baseline",
86
- minWidth: 0,
87
- children: [entry.code ? /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.Text, {
88
- ...nested.label,
89
- color: "$color10",
90
- children: entry.code
91
- }) : null, /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.Text, {
92
- fontWeight: "700",
93
- numberOfLines: 1,
94
- flexShrink: 1,
95
- children: entry.title
96
- })]
97
- })]
98
- }), isPrev ? null : avatar]
99
- })
95
+ children: label
96
+ })]
97
+ }), /* @__PURE__ */(0, import_jsx_runtime.jsxs)(import_components.XStack, {
98
+ ...knobProps.gapSm,
99
+ alignItems: "center",
100
+ flexWrap: "wrap",
101
+ children: [avatar, entry.code ? /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.Text, {
102
+ ...knobProps.label,
103
+ color: "$color11",
104
+ children: entry.code
105
+ }) : null]
106
+ }), /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.Text, {
107
+ ...knobProps.body,
108
+ fontWeight: "700",
109
+ textAlign: "left",
110
+ children: entry.title
111
+ })]
100
112
  });
101
113
  }
102
114
  function RecordPager(param) {
@@ -110,18 +122,26 @@ function RecordPager(param) {
110
122
  } = (0, import_theme.useResolvedKnobs)();
111
123
  if (!prev && !next) return null;
112
124
  return /* @__PURE__ */(0, import_jsx_runtime.jsxs)(import_components.XStack, {
113
- justifyContent: "space-between",
114
125
  ...knobProps.gap,
115
126
  marginTop: "$2",
127
+ alignItems: "stretch",
116
128
  children: [prev ? /* @__PURE__ */(0, import_jsx_runtime.jsx)(PagerButton, {
117
129
  direction: "prev",
118
130
  entry: prev,
119
131
  testID: testID && `${testID}-prev`
120
- }) : /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.YStack, {}), next ? /* @__PURE__ */(0, import_jsx_runtime.jsx)(PagerButton, {
132
+ }) : /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.YStack, {
133
+ flexGrow: 1,
134
+ flexBasis: 0,
135
+ minWidth: 0
136
+ }), next ? /* @__PURE__ */(0, import_jsx_runtime.jsx)(PagerButton, {
121
137
  direction: "next",
122
138
  entry: next,
123
139
  testID: testID && `${testID}-next`
124
- }) : /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.YStack, {})]
140
+ }) : /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_components.YStack, {
141
+ flexGrow: 1,
142
+ flexBasis: 0,
143
+ minWidth: 0
144
+ })]
125
145
  });
126
146
  }
127
147
  //# sourceMappingURL=RecordPager.native.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["__defProp","Object","defineProperty","__getOwnPropDesc","getOwnPropertyDescriptor","__getOwnPropNames","getOwnPropertyNames","__hasOwnProp","prototype","hasOwnProperty","__export","target","all","name","get","enumerable","__copyProps","to","from","except","desc","key","call","__toCommonJS","mod","value","RecordPager_exports","RecordPager","module","exports","import_jsx_runtime","require","import_components","import_forms","import_theme","import_react","import_react_i18next","PagerButton","param","direction","entry","testID","t","useTranslation","knobProps","nested","useResolvedKnobs","isPrev","avatar","jsx","Avatar","src","image","title","backgroundColor","fallbackBackgroundColor","Button","outlined","minHeight","sizeRecipeEscape","flexShrink","minWidth","onPress","icon","ArrowLeftIcon","size","iconAfter","ArrowRightIcon","children","jsxs","XStack","gap","alignItems","YStack"],"sources":["../../../src/record/RecordPager.tsx"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["__defProp","Object","defineProperty","__getOwnPropDesc","getOwnPropertyDescriptor","__getOwnPropNames","getOwnPropertyNames","__hasOwnProp","prototype","hasOwnProperty","__export","target","all","name","get","enumerable","__copyProps","to","from","except","desc","key","call","__toCommonJS","mod","value","RecordPager_exports","RecordPager","module","exports","import_jsx_runtime","require","import_components","import_theme","import_react","import_react_i18next","PagerButton","param","direction","entry","testID","_theme_color11","t","useTranslation","theme","useTheme","knobProps","control","useResolvedKnobs","isPrev","label","Arrow","ArrowLeftIcon","ArrowRightIcon","avatar","jsx","Avatar","src","image","title","backgroundColor","fallbackBackgroundColor","jsxs","YStack","isWeb","render","type","role","tabIndex","code","filter","Boolean","join","inputSurface","containerRadius","panelPadding","gapSm","borderColor","hoverStyle","hoverKnobProps","pressStyle","pressKnobProps","focusVisibleStyle","focusVisibleKnobProps","flexGrow","flexBasis","minWidth","cursor","onPress","children","XStack","alignItems","flexDirection","size","controlIcon","width","color","color11","val"],"sources":["../../../src/record/RecordPager.tsx"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@multiplatform.one/frappe-ui",
3
- "version": "7.36.0",
3
+ "version": "7.38.0",
4
4
  "description": "Pre-wired Tamagui components for Frappe doctypes with live data",
5
5
  "keywords": [
6
6
  "cross-platform",
@@ -72,18 +72,18 @@
72
72
  "access": "public"
73
73
  },
74
74
  "dependencies": {
75
- "@multiplatform.one/components": "^7.36.0",
76
- "@multiplatform.one/desktop": "^7.36.0",
77
- "@multiplatform.one/forms": "^7.36.0",
78
- "@multiplatform.one/frappe": "^7.36.0",
79
- "@multiplatform.one/i18n": "^7.36.0",
80
- "@multiplatform.one/markdown": "^7.36.0",
81
- "@multiplatform.one/platform": "^7.36.0",
82
- "@multiplatform.one/rich-text": "^7.36.0",
83
- "@multiplatform.one/router": "^7.36.0",
84
- "@multiplatform.one/store": "^7.36.0",
85
- "@multiplatform.one/table": "^7.36.0",
86
- "@multiplatform.one/theme": "^7.36.0",
75
+ "@multiplatform.one/components": "^7.38.0",
76
+ "@multiplatform.one/desktop": "^7.38.0",
77
+ "@multiplatform.one/forms": "^7.38.0",
78
+ "@multiplatform.one/frappe": "^7.38.0",
79
+ "@multiplatform.one/i18n": "^7.38.0",
80
+ "@multiplatform.one/markdown": "^7.38.0",
81
+ "@multiplatform.one/platform": "^7.38.0",
82
+ "@multiplatform.one/rich-text": "^7.38.0",
83
+ "@multiplatform.one/router": "^7.38.0",
84
+ "@multiplatform.one/store": "^7.38.0",
85
+ "@multiplatform.one/table": "^7.38.0",
86
+ "@multiplatform.one/theme": "^7.38.0",
87
87
  "@phosphor-icons/react": "^2.1.10",
88
88
  "@tamagui/colors": "2.7.6",
89
89
  "@tanstack/db": "0.8.0",
@@ -100,9 +100,9 @@
100
100
  "tamagui": "2.7.6"
101
101
  },
102
102
  "devDependencies": {
103
- "@multiplatform.one/config": "7.36.0",
104
- "@multiplatform.one/storybook": "7.36.0",
105
- "@multiplatform.one/test-utils": "7.36.0",
103
+ "@multiplatform.one/config": "7.38.0",
104
+ "@multiplatform.one/storybook": "7.38.0",
105
+ "@multiplatform.one/test-utils": "7.38.0",
106
106
  "@tamagui/build": "2.7.6",
107
107
  "@testing-library/jest-dom": "^7.0.1",
108
108
  "@testing-library/react": "^16.3.3",
@@ -0,0 +1,64 @@
1
+ import { createDefaultThemeConfig } from "@multiplatform.one/theme";
2
+ import { TamaguiProvider } from "tamagui";
3
+ import type { ReactElement } from "react";
4
+ import { cleanup, render } from "@testing-library/react";
5
+ import { afterEach, describe, expect, it } from "vitest";
6
+ import { RecordBars } from "./RecordBars";
7
+ import type { FrappeRecordBarsSection } from "./recordSections";
8
+
9
+ const config = createDefaultThemeConfig().tamagui;
10
+ function renderWithProviders(ui: ReactElement) {
11
+ return render(
12
+ <TamaguiProvider config={config} defaultTheme="light">
13
+ {ui}
14
+ </TamaguiProvider>,
15
+ );
16
+ }
17
+
18
+ const stats = [
19
+ { stat: "HP", value: 45 },
20
+ { stat: "Attack", value: 30 },
21
+ { stat: "Defense", value: 35 },
22
+ { stat: "Sp. Atk", value: 20 },
23
+ { stat: "Sp. Def", value: 20 },
24
+ { stat: "Speed", value: 45 },
25
+ ];
26
+ const section: FrappeRecordBarsSection = {
27
+ kind: "bars",
28
+ id: "stats",
29
+ table: "stats",
30
+ label: "stat",
31
+ value: "value",
32
+ max: 255,
33
+ title: "Stats",
34
+ };
35
+
36
+ afterEach(cleanup);
37
+
38
+ describe("RecordBars", () => {
39
+ it.each([undefined, "lime", "missing-hue"])("paints every stat with tint %s", (tint) => {
40
+ const { container, getByRole } = renderWithProviders(
41
+ <RecordBars rows={stats} section={section} tint={tint} />,
42
+ );
43
+ const fills = container.querySelectorAll<HTMLElement>("[data-record-bar-fill]");
44
+ stats.forEach(({ stat, value }, index) => {
45
+ expect(getByRole("meter", { name: stat }).getAttribute("aria-valuenow")).toBe(String(value));
46
+ expect(getComputedStyle(fills[index]).width).toBe(`${(value / 255) * 100}%`);
47
+ const paintClass = (element: HTMLElement) =>
48
+ Array.from(element.classList).find((name) => name.startsWith("_bg-"));
49
+ expect(paintClass(fills[index])).toBeTruthy();
50
+ expect(paintClass(fills[index])).toBe(paintClass(fills[1]));
51
+ });
52
+ });
53
+ it("keeps a supported hue on the maximum bars", () => {
54
+ const { container } = renderWithProviders(
55
+ <RecordBars rows={stats} section={section} tint="blue" />,
56
+ );
57
+ const fills = container.querySelectorAll<HTMLElement>("[data-record-bar-fill]");
58
+ const paintClass = (element: HTMLElement) =>
59
+ Array.from(element.classList).find((name) => name.startsWith("_bg-"));
60
+ expect(paintClass(fills[0])).toBeTruthy();
61
+ expect(paintClass(fills[0])).not.toBe(paintClass(fills[1]));
62
+ expect(paintClass(fills[5])).toBe(paintClass(fills[0]));
63
+ });
64
+ });
@@ -1,4 +1,11 @@
1
- import { Separator, Text, XStack, YStack } from "@multiplatform.one/components";
1
+ import {
2
+ Separator,
3
+ Text,
4
+ XStack,
5
+ YStack,
6
+ getTokens,
7
+ useTheme,
8
+ } from "@multiplatform.one/components";
2
9
  import { useResolvedKnobs } from "@multiplatform.one/theme";
3
10
  import { useTranslation } from "react-i18next";
4
11
  import { childBars } from "./recordData";
@@ -27,6 +34,9 @@ export function RecordBars({
27
34
  testID?: string;
28
35
  }) {
29
36
  const { t } = useTranslation();
37
+ const theme = useTheme();
38
+ const tintToken = `$${tint}9`;
39
+ const hasTint = tint && (theme[`${tint}9`]?.val || getTokens().color?.[tintToken]);
30
40
  const { knobProps } = useResolvedKnobs();
31
41
  const { knobProps: nested } = useResolvedKnobs();
32
42
  const { bars, total } = childBars(rows, section);
@@ -52,7 +62,7 @@ export function RecordBars({
52
62
  <YStack role="list" {...knobProps.gap}>
53
63
  {bars.map((bar) => {
54
64
  const percent = Math.max(0, Math.min(100, (bar.value / section.max) * 100));
55
- const fill = tint && bar.value === top ? `$${tint}9` : "$color9";
65
+ const fill = hasTint && bar.value === top ? tintToken : "$color9";
56
66
  return (
57
67
  <XStack
58
68
  key={bar.key}
@@ -0,0 +1,37 @@
1
+ import { renderWithProviders } from "@multiplatform.one/test-utils";
2
+ import { cleanup, fireEvent } from "@testing-library/react";
3
+ import { afterEach, describe, expect, it, vi } from "vitest";
4
+ import { RecordPager } from "./RecordPager";
5
+
6
+ afterEach(cleanup);
7
+
8
+ describe("RecordPager", () => {
9
+ it("uses growing, equal-width cards and preserves full record names", () => {
10
+ const previous = vi.fn();
11
+ const next = vi.fn();
12
+ const { getByRole, getByText } = renderWithProviders(
13
+ <RecordPager
14
+ prev={{ title: "Blastoise", code: "#009", onPress: previous }}
15
+ next={{ title: "Metapod", code: "#011", onPress: next }}
16
+ />,
17
+ );
18
+ const cards = [
19
+ getByRole("button", { name: "Previous #009 Blastoise" }),
20
+ getByRole("button", { name: "Next #011 Metapod" }),
21
+ ];
22
+ for (const card of cards) {
23
+ expect(card.tagName).toBe("BUTTON");
24
+ const style = getComputedStyle(card);
25
+ expect(style.height).not.toMatch(/\d/);
26
+ expect(style.flexBasis).toMatch(/^0(px|%)?$/);
27
+ expect(style.flexGrow).toBe("1");
28
+ }
29
+ for (const title of ["Blastoise", "Metapod"]) {
30
+ expect(getComputedStyle(getByText(title)).whiteSpace).not.toBe("nowrap");
31
+ }
32
+ fireEvent.click(cards[0]);
33
+ fireEvent.click(cards[1]);
34
+ expect(previous).toHaveBeenCalledOnce();
35
+ expect(next).toHaveBeenCalledOnce();
36
+ });
37
+ });