@multiplatform.one/table-primitives 7.21.0 → 7.22.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
@@ -14,7 +14,7 @@ import {
14
14
  } from "@multiplatform.one/theme";
15
15
  import { TableCellContext } from "./tableCellContext";
16
16
  import { wrapBareTextChildren } from "./textRidesText";
17
- import { Children, Fragment, isValidElement } from "react";
17
+ import { Children, Fragment, createContext, isValidElement, useContext } from "react";
18
18
  import type { FontSizeTokens, SizeTokens } from "tamagui";
19
19
  import {
20
20
  SizableText,
@@ -234,6 +234,31 @@ const HeaderCell = styled(ThemeableStack, {
234
234
  } as const,
235
235
  });
236
236
 
237
+ export type TableZebraStripe = "off" | "even" | "odd";
238
+
239
+ export function tableZebraStripe(tableZebra: unknown, index: number): TableZebraStripe {
240
+ if (tableZebra !== "on") return "off";
241
+ return index % 2 === 1 ? "odd" : "even";
242
+ }
243
+
244
+ const BodyRowIndexContext = createContext<number | undefined>(undefined);
245
+
246
+ function indexBodyRows(children: React.ReactNode, counter: { next: number }): React.ReactNode {
247
+ return Children.map(children, (child) => {
248
+ if (!isValidElement(child)) return child;
249
+ if (child.type === Fragment) {
250
+ return (
251
+ <Fragment>
252
+ {indexBodyRows((child.props as { children?: React.ReactNode }).children, counter)}
253
+ </Fragment>
254
+ );
255
+ }
256
+ return (
257
+ <BodyRowIndexContext.Provider value={counter.next++}>{child}</BodyRowIndexContext.Provider>
258
+ );
259
+ });
260
+ }
261
+
237
262
  const TableBody = styled(ThemeableStack, {
238
263
  name: "TableBody",
239
264
  ...({ render: "tbody" } as { render?: string }),
@@ -443,7 +468,7 @@ function extractCardModel(children: React.ReactNode): {
443
468
  },
444
469
  );
445
470
  }
446
- } else if (section.type === TableBody) {
471
+ } else if (section.type === ThemedTableBody) {
447
472
  for (const rowEl of flattenChildren(sectionProps.children)) {
448
473
  if (!isValidElement(rowEl) || rowEl.type !== ThemedRow) continue;
449
474
  const rowProps = rowEl.props as ThemedRowProps;
@@ -510,7 +535,8 @@ function TableCardsList({
510
535
  ) : (
511
536
  caption
512
537
  ))}
513
- {rows.map((row) => {
538
+ {rows.map((row, rowIndex) => {
539
+ const stripe = tableZebraStripe(knobProps.tableZebra, rowIndex);
514
540
  const card = (
515
541
  <ThemeableStack
516
542
  key={row.key}
@@ -520,7 +546,9 @@ function TableCardsList({
520
546
  elevation={knobProps.elevation}
521
547
  {...motion}
522
548
  borderColor="$color6"
549
+ {...(stripe === "odd" ? { backgroundColor: "$color2" as const } : {})}
523
550
  {...(row.intent ? { backgroundColor: "$color3" as const } : {})}
551
+ {...({ "data-table-zebra": stripe } as Record<string, unknown>)}
524
552
  >
525
553
  {row.cells.map((cell, index) => {
526
554
  const label = headerLabels[index];
@@ -582,28 +610,35 @@ function ThemedTableComp({ layout = "table", ...props }: ThemedTableProps) {
582
610
 
583
611
  const motion = transitionProps(knobProps.transition);
584
612
  return (
585
- <TableComp
586
- // Table frames are R-OUTER + SF-CARD-tier surface (theme-propagation-spec
587
- // `@multiplatform.one/table-primitives`): outer corners follow the capped
588
- // outer radius map; like the card list, the fill never takes the
589
- // control flip.
590
- {...knobProps.surface}
591
- {...knobProps.borderRadiusNested}
592
- borderWidth={resolvedBorderWidth}
593
- elevation={knobProps.elevation}
594
- {...motion}
595
- // Size knob sets default row height through the table context; consumer
596
- // cellHeight (table- or cell-level) still overrides via {...props}.
597
- cellHeight={knobProps.sizeToken as SizeTokens}
598
- {...({ "data-animation": knobProps.transition ? "on" : "none" } as Record<string, unknown>)}
599
- {...props}
600
- // borderSpacing 0 neutralizes the real <table> UA default (2px gaps
601
- // between cells) so the migrated element keeps the div-table look.
602
- style={[{ tableLayout: "fixed" as const, borderSpacing: 0 }, props.style]}
603
- />
613
+ // A table nested in a body cell must not stripe its rows by the outer index.
614
+ <BodyRowIndexContext.Provider value={undefined}>
615
+ <TableComp
616
+ // Table frames are R-OUTER + SF-CARD-tier surface (theme-propagation-spec
617
+ // `@multiplatform.one/table-primitives`): outer corners follow the capped
618
+ // outer radius map; like the card list, the fill never takes the
619
+ // control flip.
620
+ {...knobProps.surface}
621
+ {...knobProps.borderRadiusNested}
622
+ borderWidth={resolvedBorderWidth}
623
+ elevation={knobProps.elevation}
624
+ {...motion}
625
+ // Size knob sets default row height through the table context; consumer
626
+ // cellHeight (table- or cell-level) still overrides via {...props}.
627
+ cellHeight={knobProps.sizeToken as SizeTokens}
628
+ {...({ "data-animation": knobProps.transition ? "on" : "none" } as Record<string, unknown>)}
629
+ {...props}
630
+ // borderSpacing 0 neutralizes the real <table> UA default (2px gaps
631
+ // between cells) so the migrated element keeps the div-table look.
632
+ style={[{ tableLayout: "fixed" as const, borderSpacing: 0 }, props.style]}
633
+ />
634
+ </BodyRowIndexContext.Provider>
604
635
  );
605
636
  }
606
637
 
638
+ function ThemedTableBody({ children, ...props }: React.ComponentProps<typeof TableBody>) {
639
+ return <TableBody {...props}>{indexBodyRows(children, { next: 0 })}</TableBody>;
640
+ }
641
+
607
642
  function ThemedTableHead(props: React.ComponentProps<typeof TableHead>) {
608
643
  // Head/body rule is a divider, not a control border — hairline on
609
644
  // high-DPI (Axiom 15). Explicit consumer props still override.
@@ -615,6 +650,9 @@ function ThemedRow({ accent, error, warning, success, ...props }: ThemedRowProps
615
650
  const context = TableContext.useStyledContext();
616
651
  const motion = transitionProps(knobProps.transition);
617
652
  const intent = resolveIntent({ accent, error, warning, success } as ThemedRowProps);
653
+ const bodyIndex = useContext(BodyRowIndexContext);
654
+ const stripe =
655
+ bodyIndex === undefined ? undefined : tableZebraStripe(knobProps.tableZebra, bodyIndex);
618
656
  // LC-54: rows abut, so a slop outset would intersect the neighbour and the
619
657
  // painted row is the only press target a pressable row can have.
620
658
  const pressFloor =
@@ -635,6 +673,7 @@ function ThemedRow({ accent, error, warning, success, ...props }: ThemedRowProps
635
673
  {...motion}
636
674
  {...pressFloor}
637
675
  {...({ "data-animation": knobProps.transition ? "on" : "none" } as Record<string, unknown>)}
676
+ {...(stripe ? ({ "data-table-zebra": stripe } as Record<string, unknown>) : {})}
638
677
  {...(intent
639
678
  ? {
640
679
  backgroundColor: "$color3" as const,
@@ -645,6 +684,9 @@ function ThemedRow({ accent, error, warning, success, ...props }: ThemedRowProps
645
684
  }
646
685
  : {})}
647
686
  {...props}
687
+ {...(stripe === "odd" && !intent && props.backgroundColor == null
688
+ ? { backgroundColor: "$color2" as const }
689
+ : {})}
648
690
  />
649
691
  );
650
692
 
@@ -746,7 +788,7 @@ function ThemedHeaderCell({ children, style, ...props }: React.ComponentProps<ty
746
788
 
747
789
  export const Table = withStaticProperties(ThemedTableComp, {
748
790
  Head: ThemedTableHead,
749
- Body: TableBody,
791
+ Body: ThemedTableBody,
750
792
  Row: ThemedRow,
751
793
  Cell: ThemedCell,
752
794
  HeaderCell: ThemedHeaderCell,
@@ -388,4 +388,172 @@ describe("Table Primitives", () => {
388
388
  expect(card("filled")).toHaveLength(1);
389
389
  expect(card("outlined")).toEqual(card("filled"));
390
390
  });
391
+
392
+ describe("tableZebra (K4: Table, DataTable, SimpleTable and ChildTable honour it)", () => {
393
+ function zebraTable(
394
+ tableZebra: "on" | "off",
395
+ body: React.ReactNode,
396
+ props: Record<string, unknown> = {},
397
+ ) {
398
+ return renderWithProviders(
399
+ <Preset overrides={{ tableZebra }}>
400
+ <Table {...props}>
401
+ <Table.Head>
402
+ <Table.Row>
403
+ <Table.HeaderCell>Name</Table.HeaderCell>
404
+ </Table.Row>
405
+ </Table.Head>
406
+ <Table.Body>{body}</Table.Body>
407
+ <Table.Foot>
408
+ <Table.Row>
409
+ <Table.Cell>Total</Table.Cell>
410
+ </Table.Row>
411
+ </Table.Foot>
412
+ </Table>
413
+ </Preset>,
414
+ ).container;
415
+ }
416
+
417
+ const names = ["Ada", "Grace", "Edsger", "Barbara"];
418
+ const plainRows = names.map((name) => (
419
+ <Table.Row key={name}>
420
+ <Table.Cell>{name}</Table.Cell>
421
+ </Table.Row>
422
+ ));
423
+ const stripes = (container: HTMLElement) =>
424
+ Array.from(container.querySelectorAll("tbody tr")).map((row) =>
425
+ row.getAttribute("data-table-zebra"),
426
+ );
427
+ const fills = (container: HTMLElement) =>
428
+ Array.from(container.querySelectorAll("tbody tr")).map((row) => atomic(row, "bg"));
429
+
430
+ it("stays off by default and paints no body row", () => {
431
+ const container = zebraTable("off", plainRows);
432
+ expect(stripes(container)).toEqual(["off", "off", "off", "off"]);
433
+ expect(fills(container)).toEqual([[], [], [], []]);
434
+ });
435
+
436
+ it("fills odd body rows with $color2 and leaves the head and foot rows alone", () => {
437
+ const container = zebraTable("on", plainRows);
438
+ expect(stripes(container)).toEqual(["even", "odd", "even", "odd"]);
439
+ expect(fills(container)).toEqual([[], ["_bg-color2"], [], ["_bg-color2"]]);
440
+ expect(container.querySelector("thead tr")?.hasAttribute("data-table-zebra")).toBe(false);
441
+ expect(container.querySelector("tfoot tr")?.hasAttribute("data-table-zebra")).toBe(false);
442
+ });
443
+
444
+ it("counts rows through arrays and fragments", () => {
445
+ const container = zebraTable(
446
+ "on",
447
+ <>
448
+ {plainRows.slice(0, 1)}
449
+ <>
450
+ {plainRows[1]}
451
+ {plainRows[2]}
452
+ </>
453
+ {plainRows[3]}
454
+ </>,
455
+ );
456
+ expect(stripes(container)).toEqual(["even", "odd", "even", "odd"]);
457
+ });
458
+
459
+ it("keeps an intent row's tint and a consumer fill, and stripes a consumer's undefined fill", () => {
460
+ const container = zebraTable("on", [
461
+ <Table.Row key="a">
462
+ <Table.Cell>Ada</Table.Cell>
463
+ </Table.Row>,
464
+ <Table.Row key="b" error>
465
+ <Table.Cell>Grace</Table.Cell>
466
+ </Table.Row>,
467
+ <Table.Row key="c">
468
+ <Table.Cell>Edsger</Table.Cell>
469
+ </Table.Row>,
470
+ <Table.Row key="d" backgroundColor="$color4">
471
+ <Table.Cell>Barbara</Table.Cell>
472
+ </Table.Row>,
473
+ <Table.Row key="e">
474
+ <Table.Cell>Alan</Table.Cell>
475
+ </Table.Row>,
476
+ <Table.Row key="f" backgroundColor={undefined}>
477
+ <Table.Cell>Frances</Table.Cell>
478
+ </Table.Row>,
479
+ ]);
480
+ expect(fills(container)).toEqual([
481
+ [],
482
+ ["_bg-color3"],
483
+ [],
484
+ ["_bg-color4"],
485
+ [],
486
+ ["_bg-color2"],
487
+ ]);
488
+ });
489
+
490
+ it("restarts the count in a table nested in a body cell", () => {
491
+ const container = zebraTable("on", [
492
+ plainRows[0],
493
+ <Table.Row key="nest">
494
+ <Table.Cell>
495
+ <Table>
496
+ <Table.Head>
497
+ <Table.Row>
498
+ <Table.HeaderCell>Inner</Table.HeaderCell>
499
+ </Table.Row>
500
+ </Table.Head>
501
+ <Table.Body>{plainRows.slice(0, 2)}</Table.Body>
502
+ </Table>
503
+ </Table.Cell>
504
+ </Table.Row>,
505
+ ]);
506
+ const inner = container.querySelector("tbody table") as HTMLElement;
507
+ expect(inner.querySelector("thead tr")?.hasAttribute("data-table-zebra")).toBe(false);
508
+ expect(stripes(inner)).toEqual(["even", "odd"]);
509
+ });
510
+
511
+ it("gives the flex composition the same stripes (native parity)", () => {
512
+ const container = zebraTable("on", plainRows, { displayMode: "flex" });
513
+ expect(stripes(container)).toEqual(["even", "odd", "even", "odd"]);
514
+ expect(fills(container)).toEqual([[], ["_bg-color2"], [], ["_bg-color2"]]);
515
+ });
516
+
517
+ it("stripes odd cards in the card layout and leaves intent cards tinted", () => {
518
+ const cards = (tableZebra: "on" | "off") =>
519
+ Array.from(
520
+ zebraTable(
521
+ tableZebra,
522
+ [
523
+ ...plainRows,
524
+ <Table.Row key="intent" success>
525
+ <Table.Cell>Alan</Table.Cell>
526
+ </Table.Row>,
527
+ <Table.Row key="last">
528
+ <Table.Cell>Frances</Table.Cell>
529
+ </Table.Row>,
530
+ ],
531
+ { layout: "cards" },
532
+ ).querySelectorAll('[data-testid="table-card"]'),
533
+ );
534
+ const off = cards("off");
535
+ const on = cards("on");
536
+ expect(off.map((card) => card.getAttribute("data-table-zebra"))).toEqual([
537
+ "off",
538
+ "off",
539
+ "off",
540
+ "off",
541
+ "off",
542
+ "off",
543
+ ]);
544
+ expect(on.map((card) => card.getAttribute("data-table-zebra"))).toEqual([
545
+ "even",
546
+ "odd",
547
+ "even",
548
+ "odd",
549
+ "even",
550
+ "odd",
551
+ ]);
552
+ expect(atomic(on[0], "bg")).toEqual(atomic(off[0], "bg"));
553
+ expect(atomic(on[1], "bg")).toEqual(["_bg-color2"]);
554
+ expect(atomic(on[3], "bg")).toEqual(["_bg-color2"]);
555
+ expect(atomic(on[4], "bg")).toEqual(atomic(off[4], "bg"));
556
+ expect(atomic(on[5], "bg")).toEqual(["_bg-color2"]);
557
+ });
558
+ });
391
559
  });
package/types/index.d.ts CHANGED
@@ -62,6 +62,8 @@ declare const HeaderCell: import("tamagui").TamaguiComponent<import("@tamagui/we
62
62
  alignHeaderCells?: AlignCells | undefined;
63
63
  cellLocation?: "middle" | "first" | "last" | undefined;
64
64
  }, import("@tamagui/web").StaticConfigPublic>;
65
+ export type TableZebraStripe = "off" | "even" | "odd";
66
+ export declare function tableZebraStripe(tableZebra: unknown, index: number): TableZebraStripe;
65
67
  declare const TableBody: import("tamagui").TamaguiComponent<import("@tamagui/web").TamaDefer, import("tamagui").TamaguiElement, import("@tamagui/core").RNTamaguiViewNonStyleProps, import("@tamagui/web").StackStyleBase, {
66
68
  elevation?: number | SizeTokens | undefined;
67
69
  transparent?: boolean | undefined;
@@ -143,22 +145,14 @@ export interface ThemedTableProps extends React.ComponentProps<typeof TableComp>
143
145
  layout?: TableLayout;
144
146
  }
145
147
  declare function ThemedTableComp({ layout, ...props }: ThemedTableProps): import("react/jsx-runtime").JSX.Element;
148
+ declare function ThemedTableBody({ children, ...props }: React.ComponentProps<typeof TableBody>): import("react/jsx-runtime").JSX.Element;
146
149
  declare function ThemedTableHead(props: React.ComponentProps<typeof TableHead>): import("react/jsx-runtime").JSX.Element;
147
150
  declare function ThemedRow({ accent, error, warning, success, ...props }: ThemedRowProps): import("react/jsx-runtime").JSX.Element;
148
151
  declare function ThemedCell({ children, style, ...props }: React.ComponentProps<typeof Cell>): import("react/jsx-runtime").JSX.Element;
149
152
  declare function ThemedHeaderCell({ children, style, ...props }: React.ComponentProps<typeof HeaderCell>): import("react/jsx-runtime").JSX.Element;
150
153
  export declare const Table: typeof ThemedTableComp & {
151
154
  Head: typeof ThemedTableHead;
152
- Body: import("tamagui").TamaguiComponent<import("@tamagui/web").TamaDefer, import("tamagui").TamaguiElement, import("@tamagui/core").RNTamaguiViewNonStyleProps, import("@tamagui/web").StackStyleBase, {
153
- elevation?: number | SizeTokens | undefined;
154
- transparent?: boolean | undefined;
155
- circular?: boolean | undefined;
156
- fullscreen?: boolean | undefined;
157
- elevate?: boolean | undefined;
158
- bordered?: boolean | undefined;
159
- chromeless?: boolean | "all" | undefined;
160
- displayMode?: "table" | "flex" | undefined;
161
- }, import("@tamagui/web").StaticConfigPublic>;
155
+ Body: typeof ThemedTableBody;
162
156
  Row: typeof ThemedRow;
163
157
  Cell: typeof ThemedCell;
164
158
  HeaderCell: typeof ThemedHeaderCell;
@@ -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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"}