@multiplatform.one/table-primitives 7.7.6 → 7.8.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/src/index.tsx CHANGED
@@ -476,8 +476,16 @@ function TableCardsList({
476
476
  ...viewProps
477
477
  } = props;
478
478
 
479
+ const motion = knobProps.transition ? { transition: knobProps.transition } : {};
479
480
  return (
480
- <ThemeableStack flexDirection="column" {...knobProps.gap} testID="table-cards" {...viewProps}>
481
+ <ThemeableStack
482
+ flexDirection="column"
483
+ {...knobProps.gap}
484
+ {...motion}
485
+ testID="table-cards"
486
+ {...({ "data-animation": knobProps.transition ? "on" : "none" } as Record<string, unknown>)}
487
+ {...viewProps}
488
+ >
481
489
  {caption != null &&
482
490
  (typeof caption === "string" || typeof caption === "number" ? (
483
491
  <SizableText fontSize={knobProps.sizeToken as FontSizeTokens} color="$color10">
@@ -494,6 +502,7 @@ function TableCardsList({
494
502
  {...knobProps.surface}
495
503
  {...knobProps.cardSurface}
496
504
  elevation={knobProps.elevation}
505
+ {...motion}
497
506
  borderColor="$color6"
498
507
  {...(row.intent ? { backgroundColor: "$color3" as const } : {})}
499
508
  >
@@ -511,7 +520,7 @@ function TableCardsList({
511
520
  <SizableText
512
521
  fontSize={knobProps.sizeToken as FontSizeTokens}
513
522
  fontWeight="500"
514
- color="$color10"
523
+ color={knobProps.textAccentColor}
515
524
  width="40%"
516
525
  flexShrink={0}
517
526
  >
@@ -555,6 +564,7 @@ function ThemedTableComp({ layout = "table", ...props }: ThemedTableProps) {
555
564
  return <TableCardsList {...props} />;
556
565
  }
557
566
 
567
+ const motion = knobProps.transition ? { transition: knobProps.transition } : {};
558
568
  return (
559
569
  <TableComp
560
570
  // Table frames are R-OUTER + SF-CARD-tier surface (theme-propagation-spec
@@ -565,9 +575,11 @@ function ThemedTableComp({ layout = "table", ...props }: ThemedTableProps) {
565
575
  {...(knobProps.outlined ? { backgroundColor: "transparent" as const } : null)}
566
576
  borderWidth={resolvedBorderWidth}
567
577
  elevation={knobProps.elevation}
578
+ {...motion}
568
579
  // Size knob sets default row height through the table context; consumer
569
580
  // cellHeight (table- or cell-level) still overrides via {...props}.
570
581
  cellHeight={knobProps.sizeToken as SizeTokens}
582
+ {...({ "data-animation": knobProps.transition ? "on" : "none" } as Record<string, unknown>)}
571
583
  {...props}
572
584
  // borderSpacing 0 neutralizes the real <table> UA default (2px gaps
573
585
  // between cells) so the migrated element keeps the div-table look.
@@ -583,6 +595,8 @@ function ThemedTableHead(props: React.ComponentProps<typeof TableHead>) {
583
595
  }
584
596
 
585
597
  function ThemedRow({ accent, error, warning, success, ...props }: ThemedRowProps) {
598
+ const { knobProps } = useResolvedKnobs();
599
+ const motion = knobProps.transition ? { transition: knobProps.transition } : {};
586
600
  const intent = resolveIntent({ accent, error, warning, success } as ThemedRowProps);
587
601
 
588
602
  // Intent rows must not use the plain <Theme> wrapper: on web it renders a
@@ -595,6 +609,8 @@ function ThemedRow({ accent, error, warning, success, ...props }: ThemedRowProps
595
609
  // without emitting any wrapper element.
596
610
  const row = (
597
611
  <Row
612
+ {...motion}
613
+ {...({ "data-animation": knobProps.transition ? "on" : "none" } as Record<string, unknown>)}
598
614
  {...(intent
599
615
  ? {
600
616
  backgroundColor: "$color3" as const,
@@ -651,6 +667,17 @@ function TableCellSurfaceBody({
651
667
  key={key}
652
668
  fontSize={knobProps.sizeToken as FontSizeTokens}
653
669
  fontWeight={isHeader ? "600" : undefined}
670
+ // data-chrome: honour textAccent on labels. Body cells stay T-VALUE
671
+ // (inherit), matching SimpleTable's header vs value split (MPO-132).
672
+ {...(isHeader
673
+ ? {
674
+ color: knobProps.textAccentColor,
675
+ ...({ "data-text-accent": String(knobProps.textAccentColor) } as Record<
676
+ string,
677
+ unknown
678
+ >),
679
+ }
680
+ : {})}
654
681
  >
655
682
  {label}
656
683
  </SizableText>
@@ -659,9 +686,12 @@ function TableCellSurfaceBody({
659
686
 
660
687
  function ThemedCell({ children, style, ...props }: React.ComponentProps<typeof Cell>) {
661
688
  const { knobProps } = useResolvedKnobs();
689
+ const motion = knobProps.transition ? { transition: knobProps.transition } : {};
662
690
  return (
663
691
  <Cell
664
692
  {...getTableCellPadding(knobProps.space)}
693
+ {...motion}
694
+ {...({ "data-animation": knobProps.transition ? "on" : "none" } as Record<string, unknown>)}
665
695
  {...props}
666
696
  // Compose (not replace) the inline style so a consumer style (e.g.
667
697
  // sticky pinned cells) keeps the verticalAlign baseline.
@@ -674,9 +704,12 @@ function ThemedCell({ children, style, ...props }: React.ComponentProps<typeof C
674
704
 
675
705
  function ThemedHeaderCell({ children, style, ...props }: React.ComponentProps<typeof HeaderCell>) {
676
706
  const { knobProps } = useResolvedKnobs();
707
+ const motion = knobProps.transition ? { transition: knobProps.transition } : {};
677
708
  return (
678
709
  <HeaderCell
679
710
  {...getTableCellPadding(knobProps.space)}
711
+ {...motion}
712
+ {...({ "data-animation": knobProps.transition ? "on" : "none" } as Record<string, unknown>)}
680
713
  {...props}
681
714
  // Compose (not replace) the inline style so consumer styles (sticky
682
715
  // pinned headers) keep the real-<th> UA neutralizers (bold/centered).
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Table primitives tests - 5 focused tests for Task Group 1.
2
+ * Table primitives tests — semantic HTML, knobs, data-chrome animation / textAccent.
3
3
  *
4
4
  * Note: tamagui 2.0.0-rc derives the DOM element from the `render` prop —
5
5
  * the primitives emit REAL <table>/<thead>/<tbody>/<tfoot>/<tr>/<th>/<td>/
@@ -7,6 +7,7 @@
7
7
  */
8
8
 
9
9
  import { renderWithProviders } from "@multiplatform.one/test-utils";
10
+ import { Preset } from "@multiplatform.one/theme";
10
11
  import { describe, expect, it } from "vitest";
11
12
  import { Table } from "./index";
12
13
 
@@ -203,4 +204,91 @@ describe("Table Primitives", () => {
203
204
  expect(getByText("F1")).toBeDefined();
204
205
  expect(getByText("F2")).toBeDefined();
205
206
  });
207
+
208
+ it("honours animation on the frame, row and cell (data-chrome)", () => {
209
+ const { container: none } = renderWithProviders(
210
+ <Preset overrides={{ animation: "none" }}>
211
+ <Table>
212
+ <Table.Head>
213
+ <Table.Row>
214
+ <Table.HeaderCell>H</Table.HeaderCell>
215
+ </Table.Row>
216
+ </Table.Head>
217
+ <Table.Body>
218
+ <Table.Row>
219
+ <Table.Cell>C</Table.Cell>
220
+ </Table.Row>
221
+ </Table.Body>
222
+ </Table>
223
+ </Preset>,
224
+ );
225
+ const { container: bouncy } = renderWithProviders(
226
+ <Preset overrides={{ animation: "bouncy" }}>
227
+ <Table>
228
+ <Table.Head>
229
+ <Table.Row>
230
+ <Table.HeaderCell>H</Table.HeaderCell>
231
+ </Table.Row>
232
+ </Table.Head>
233
+ <Table.Body>
234
+ <Table.Row>
235
+ <Table.Cell>C</Table.Cell>
236
+ </Table.Row>
237
+ </Table.Body>
238
+ </Table>
239
+ </Preset>,
240
+ );
241
+
242
+ expect(none.querySelector("table")?.getAttribute("data-animation")).toBe("none");
243
+ expect(bouncy.querySelector("table")?.getAttribute("data-animation")).toBe("on");
244
+ expect(none.querySelector("tr")?.getAttribute("data-animation")).toBe("none");
245
+ expect(bouncy.querySelector("tr")?.getAttribute("data-animation")).toBe("on");
246
+ expect(none.querySelector("td")?.getAttribute("data-animation")).toBe("none");
247
+ expect(bouncy.querySelector("td")?.getAttribute("data-animation")).toBe("on");
248
+ });
249
+
250
+ it("honours textAccent on header labels and leaves body cells as T-VALUE", () => {
251
+ const { container: high } = renderWithProviders(
252
+ <Preset overrides={{ textAccent: "high" }}>
253
+ <Table>
254
+ <Table.Head>
255
+ <Table.Row>
256
+ <Table.HeaderCell>Name</Table.HeaderCell>
257
+ </Table.Row>
258
+ </Table.Head>
259
+ <Table.Body>
260
+ <Table.Row>
261
+ <Table.Cell>Ada</Table.Cell>
262
+ </Table.Row>
263
+ </Table.Body>
264
+ </Table>
265
+ </Preset>,
266
+ );
267
+ const { container: low } = renderWithProviders(
268
+ <Preset overrides={{ textAccent: "low" }}>
269
+ <Table>
270
+ <Table.Head>
271
+ <Table.Row>
272
+ <Table.HeaderCell>Name</Table.HeaderCell>
273
+ </Table.Row>
274
+ </Table.Head>
275
+ <Table.Body>
276
+ <Table.Row>
277
+ <Table.Cell>Ada</Table.Cell>
278
+ </Table.Row>
279
+ </Table.Body>
280
+ </Table>
281
+ </Preset>,
282
+ );
283
+
284
+ const headerHigh = high
285
+ .querySelector("th [data-text-accent]")
286
+ ?.getAttribute("data-text-accent");
287
+ const headerLow = low.querySelector("th [data-text-accent]")?.getAttribute("data-text-accent");
288
+ expect(headerHigh).toBeTruthy();
289
+ expect(headerLow).toBeTruthy();
290
+ expect(headerHigh).not.toBe(headerLow);
291
+ expect(high.querySelector("td [data-text-accent]")).toBeNull();
292
+ expect(low.querySelector("td [data-text-accent]")).toBeNull();
293
+ });
206
294
  });
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.tsx"],"names":[],"mappings":"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"}