@cdx-ui/components 0.2.1 → 0.2.3

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.
Files changed (158) hide show
  1. package/README.md +4 -2
  2. package/coverage.svg +1 -1
  3. package/lib/commonjs/components/Button/styles.js +7 -2
  4. package/lib/commonjs/components/Button/styles.js.map +1 -1
  5. package/lib/commonjs/components/Checkbox/index.js.map +1 -1
  6. package/lib/commonjs/components/Field/index.js +1 -1
  7. package/lib/commonjs/components/Field/index.js.map +1 -1
  8. package/lib/commonjs/components/Heading/index.js.map +1 -1
  9. package/lib/commonjs/components/Icon/index.js.map +1 -1
  10. package/lib/commonjs/components/ListItem/index.js +170 -9
  11. package/lib/commonjs/components/ListItem/index.js.map +1 -1
  12. package/lib/commonjs/components/ListItem/styles.js +36 -1
  13. package/lib/commonjs/components/ListItem/styles.js.map +1 -1
  14. package/lib/commonjs/components/Menu/index.js.map +1 -1
  15. package/lib/commonjs/components/RangeCalendar/index.js.map +1 -1
  16. package/lib/commonjs/components/ReorderableList/ReorderableListShared.js +91 -0
  17. package/lib/commonjs/components/ReorderableList/ReorderableListShared.js.map +1 -0
  18. package/lib/commonjs/components/ReorderableList/index.js +135 -0
  19. package/lib/commonjs/components/ReorderableList/index.js.map +1 -0
  20. package/lib/commonjs/components/ReorderableList/index.web.js +233 -0
  21. package/lib/commonjs/components/ReorderableList/index.web.js.map +1 -0
  22. package/lib/commonjs/components/ReorderableList/labels.js +47 -0
  23. package/lib/commonjs/components/ReorderableList/labels.js.map +1 -0
  24. package/lib/commonjs/components/ReorderableList/reorderItems.js +16 -0
  25. package/lib/commonjs/components/ReorderableList/reorderItems.js.map +1 -0
  26. package/lib/commonjs/components/ReorderableList/rowContext.js +42 -0
  27. package/lib/commonjs/components/ReorderableList/rowContext.js.map +1 -0
  28. package/lib/commonjs/components/ReorderableList/types.js +6 -0
  29. package/lib/commonjs/components/ReorderableList/types.js.map +1 -0
  30. package/lib/commonjs/components/ReorderableList/useReorder.js +131 -0
  31. package/lib/commonjs/components/ReorderableList/useReorder.js.map +1 -0
  32. package/lib/commonjs/components/ReorderableList/webDnd.js +64 -0
  33. package/lib/commonjs/components/ReorderableList/webDnd.js.map +1 -0
  34. package/lib/commonjs/components/ScopedTheme/index.js.map +1 -1
  35. package/lib/commonjs/components/Skeleton/index.js.map +1 -1
  36. package/lib/commonjs/components/TablePagination/index.js.map +1 -1
  37. package/lib/commonjs/components/Text/index.js.map +1 -1
  38. package/lib/commonjs/components/Tile/styles.js +1 -1
  39. package/lib/commonjs/components/Tile/styles.js.map +1 -1
  40. package/lib/commonjs/components/index.js.map +1 -1
  41. package/lib/commonjs/reorderable-list.js +17 -0
  42. package/lib/commonjs/reorderable-list.js.map +1 -0
  43. package/lib/commonjs/styles.css +18 -0
  44. package/lib/module/components/Button/styles.js +7 -2
  45. package/lib/module/components/Button/styles.js.map +1 -1
  46. package/lib/module/components/Checkbox/index.js.map +1 -1
  47. package/lib/module/components/Field/index.js +1 -1
  48. package/lib/module/components/Field/index.js.map +1 -1
  49. package/lib/module/components/Heading/index.js.map +1 -1
  50. package/lib/module/components/Icon/index.js.map +1 -1
  51. package/lib/module/components/ListItem/index.js +163 -14
  52. package/lib/module/components/ListItem/index.js.map +1 -1
  53. package/lib/module/components/ListItem/styles.js +35 -0
  54. package/lib/module/components/ListItem/styles.js.map +1 -1
  55. package/lib/module/components/Menu/index.js.map +1 -1
  56. package/lib/module/components/RangeCalendar/index.js.map +1 -1
  57. package/lib/module/components/ReorderableList/ReorderableListShared.js +86 -0
  58. package/lib/module/components/ReorderableList/ReorderableListShared.js.map +1 -0
  59. package/lib/module/components/ReorderableList/index.js +130 -0
  60. package/lib/module/components/ReorderableList/index.js.map +1 -0
  61. package/lib/module/components/ReorderableList/index.web.js +229 -0
  62. package/lib/module/components/ReorderableList/index.web.js.map +1 -0
  63. package/lib/module/components/ReorderableList/labels.js +41 -0
  64. package/lib/module/components/ReorderableList/labels.js.map +1 -0
  65. package/lib/module/components/ReorderableList/reorderItems.js +12 -0
  66. package/lib/module/components/ReorderableList/reorderItems.js.map +1 -0
  67. package/lib/module/components/ReorderableList/rowContext.js +38 -0
  68. package/lib/module/components/ReorderableList/rowContext.js.map +1 -0
  69. package/lib/module/components/ReorderableList/types.js +4 -0
  70. package/lib/module/components/ReorderableList/types.js.map +1 -0
  71. package/lib/module/components/ReorderableList/useReorder.js +123 -0
  72. package/lib/module/components/ReorderableList/useReorder.js.map +1 -0
  73. package/lib/module/components/ReorderableList/webDnd.js +59 -0
  74. package/lib/module/components/ReorderableList/webDnd.js.map +1 -0
  75. package/lib/module/components/ScopedTheme/index.js.map +1 -1
  76. package/lib/module/components/Skeleton/index.js.map +1 -1
  77. package/lib/module/components/TablePagination/index.js.map +1 -1
  78. package/lib/module/components/Text/index.js.map +1 -1
  79. package/lib/module/components/Tile/styles.js +1 -1
  80. package/lib/module/components/Tile/styles.js.map +1 -1
  81. package/lib/module/components/index.js.map +1 -1
  82. package/lib/module/reorderable-list.js +4 -0
  83. package/lib/module/reorderable-list.js.map +1 -0
  84. package/lib/module/styles.css +18 -0
  85. package/lib/typescript/components/Button/styles.d.ts.map +1 -1
  86. package/lib/typescript/components/Checkbox/index.d.ts +22 -0
  87. package/lib/typescript/components/Checkbox/index.d.ts.map +1 -1
  88. package/lib/typescript/components/Heading/index.d.ts +20 -2
  89. package/lib/typescript/components/Heading/index.d.ts.map +1 -1
  90. package/lib/typescript/components/Icon/index.d.ts +2 -0
  91. package/lib/typescript/components/Icon/index.d.ts.map +1 -1
  92. package/lib/typescript/components/ListItem/index.d.ts +23 -1
  93. package/lib/typescript/components/ListItem/index.d.ts.map +1 -1
  94. package/lib/typescript/components/ListItem/styles.d.ts +5 -0
  95. package/lib/typescript/components/ListItem/styles.d.ts.map +1 -1
  96. package/lib/typescript/components/Menu/index.d.ts +116 -4
  97. package/lib/typescript/components/Menu/index.d.ts.map +1 -1
  98. package/lib/typescript/components/RangeCalendar/index.d.ts +2 -0
  99. package/lib/typescript/components/RangeCalendar/index.d.ts.map +1 -1
  100. package/lib/typescript/components/ReorderableList/ReorderableListShared.d.ts +31 -0
  101. package/lib/typescript/components/ReorderableList/ReorderableListShared.d.ts.map +1 -0
  102. package/lib/typescript/components/ReorderableList/index.d.ts +8 -0
  103. package/lib/typescript/components/ReorderableList/index.d.ts.map +1 -0
  104. package/lib/typescript/components/ReorderableList/index.web.d.ts +8 -0
  105. package/lib/typescript/components/ReorderableList/index.web.d.ts.map +1 -0
  106. package/lib/typescript/components/ReorderableList/labels.d.ts +16 -0
  107. package/lib/typescript/components/ReorderableList/labels.d.ts.map +1 -0
  108. package/lib/typescript/components/ReorderableList/reorderItems.d.ts +3 -0
  109. package/lib/typescript/components/ReorderableList/reorderItems.d.ts.map +1 -0
  110. package/lib/typescript/components/ReorderableList/rowContext.d.ts +57 -0
  111. package/lib/typescript/components/ReorderableList/rowContext.d.ts.map +1 -0
  112. package/lib/typescript/components/ReorderableList/types.d.ts +75 -0
  113. package/lib/typescript/components/ReorderableList/types.d.ts.map +1 -0
  114. package/lib/typescript/components/ReorderableList/useReorder.d.ts +31 -0
  115. package/lib/typescript/components/ReorderableList/useReorder.d.ts.map +1 -0
  116. package/lib/typescript/components/ReorderableList/webDnd.d.ts +27 -0
  117. package/lib/typescript/components/ReorderableList/webDnd.d.ts.map +1 -0
  118. package/lib/typescript/components/ScopedTheme/index.d.ts +6 -1
  119. package/lib/typescript/components/ScopedTheme/index.d.ts.map +1 -1
  120. package/lib/typescript/components/Skeleton/index.d.ts +3 -0
  121. package/lib/typescript/components/Skeleton/index.d.ts.map +1 -1
  122. package/lib/typescript/components/TablePagination/index.d.ts +54 -0
  123. package/lib/typescript/components/TablePagination/index.d.ts.map +1 -1
  124. package/lib/typescript/components/Text/index.d.ts +12 -2
  125. package/lib/typescript/components/Text/index.d.ts.map +1 -1
  126. package/lib/typescript/components/Tile/styles.d.ts.map +1 -1
  127. package/lib/typescript/components/ToggleButton/styles.d.ts +1 -1
  128. package/lib/typescript/components/index.d.ts +1 -0
  129. package/lib/typescript/components/index.d.ts.map +1 -1
  130. package/lib/typescript/reorderable-list.d.ts +2 -0
  131. package/lib/typescript/reorderable-list.d.ts.map +1 -0
  132. package/package.json +34 -7
  133. package/src/components/Button/styles.ts +7 -1
  134. package/src/components/Checkbox/index.tsx +22 -0
  135. package/src/components/Field/index.tsx +1 -1
  136. package/src/components/Heading/index.tsx +10 -1
  137. package/src/components/Icon/index.tsx +2 -0
  138. package/src/components/ListItem/index.tsx +227 -11
  139. package/src/components/ListItem/styles.ts +40 -0
  140. package/src/components/Menu/index.tsx +117 -4
  141. package/src/components/RangeCalendar/index.tsx +2 -0
  142. package/src/components/ReorderableList/ReorderableListShared.tsx +113 -0
  143. package/src/components/ReorderableList/index.tsx +162 -0
  144. package/src/components/ReorderableList/index.web.tsx +254 -0
  145. package/src/components/ReorderableList/labels.ts +52 -0
  146. package/src/components/ReorderableList/reorderItems.ts +16 -0
  147. package/src/components/ReorderableList/rowContext.tsx +72 -0
  148. package/src/components/ReorderableList/types.ts +80 -0
  149. package/src/components/ReorderableList/useReorder.ts +159 -0
  150. package/src/components/ReorderableList/webDnd.ts +60 -0
  151. package/src/components/ScopedTheme/index.tsx +6 -1
  152. package/src/components/Skeleton/index.tsx +3 -0
  153. package/src/components/TablePagination/index.tsx +54 -0
  154. package/src/components/Text/index.tsx +6 -1
  155. package/src/components/Tile/styles.ts +4 -1
  156. package/src/components/index.ts +5 -0
  157. package/src/reorderable-list.ts +1 -0
  158. package/src/styles.css +18 -0
@@ -0,0 +1,80 @@
1
+ import type { ReactNode } from 'react';
2
+ import type { ScrollViewProps } from 'react-native';
3
+
4
+ export interface ReorderableListRenderItemInfo<T> {
5
+ /** The item from `data` that this row renders. */
6
+ item: T;
7
+ /** Zero-based position of `item` in `data`. */
8
+ index: number;
9
+ /**
10
+ * `true` while this row is being dragged. Restyle the row with color or opacity only: on iOS,
11
+ * changing `zIndex` on the row (or anything wrapping its handle) mid-drag cancels the drag.
12
+ */
13
+ isDragging: boolean;
14
+ }
15
+
16
+ /**
17
+ * Overridable copy for reorder announcements and accessibility actions.
18
+ *
19
+ * Placeholders: `{item}` is the row name (from `getItemLabel`, or the `item` template),
20
+ * `{position}` is a 1-based position, and `{count}` is the number of rows.
21
+ */
22
+ export interface ReorderableListLabels {
23
+ /**
24
+ * Row name used when `getItemLabel` is not provided. `{position}` is the row's position
25
+ * before the move.
26
+ * @default 'item {position}'
27
+ */
28
+ item: string;
29
+ /** @default 'Picked up {item}. Position {position} of {count}.' */
30
+ pickedUp: string;
31
+ /** @default 'Moved {item} to position {position} of {count}.' */
32
+ movedTo: string;
33
+ /** @default 'Dropped {item} at position {position} of {count}.' */
34
+ dropped: string;
35
+ /** @default 'Reorder cancelled. {item} returned to position {position} of {count}.' */
36
+ cancelled: string;
37
+ /**
38
+ * Read by screen readers when a drag handle receives focus on web.
39
+ * @default 'To pick up an item, press Space or Enter. Use the arrow keys to move it, then press Space or Enter to drop it, or Escape to cancel.'
40
+ */
41
+ screenReaderInstructions: string;
42
+ /** @default 'Move up' */
43
+ moveUp: string;
44
+ /** @default 'Move down' */
45
+ moveDown: string;
46
+ /** @default 'Move to top' */
47
+ moveToTop: string;
48
+ /** @default 'Move to bottom' */
49
+ moveToBottom: string;
50
+ }
51
+
52
+ export interface ReorderableListProps<T> extends Omit<
53
+ ScrollViewProps,
54
+ 'children' | 'horizontal' | 'role'
55
+ > {
56
+ /** Items in their current order. The parent owns this array and updates it from `onReorder`. */
57
+ data: T[];
58
+ /**
59
+ * Returns a stable, unique key for an item. Keys identify rows while they move, so they must
60
+ * not be derived from `index`. Duplicate keys log a warning in development.
61
+ */
62
+ keyExtractor: (item: T, index: number) => string;
63
+ /** Renders one row. Compose with `ListItem` and `ListItem.DragHandle`. */
64
+ renderItem: (info: ReorderableListRenderItemInfo<T>) => ReactNode;
65
+ /** Called with the reordered array after a drop or an accessibility move. */
66
+ onReorder: (data: T[]) => void;
67
+ /** Called after `onReorder` with the moved row's previous and new zero-based positions. */
68
+ onReorderIndices?: (from: number, to: number) => void;
69
+ /**
70
+ * Returns the name screen readers use for a row in reorder announcements. Without it,
71
+ * announcements use the `item` label (`item 2`). Keys are never announced.
72
+ */
73
+ getItemLabel?: (item: T, index: number) => string;
74
+ /**
75
+ * Overrides for announcement and accessibility-action copy. Unset keys keep their defaults.
76
+ * @default {}
77
+ */
78
+ labels?: Partial<ReorderableListLabels>;
79
+ className?: string;
80
+ }
@@ -0,0 +1,159 @@
1
+ import { useCallback, useMemo } from 'react';
2
+ import type { AccessibilityActionEvent, AccessibilityActionInfo } from 'react-native';
3
+ import { formatReorderMessage, resolveReorderableListLabels } from './labels';
4
+ import { reorderItems } from './reorderItems';
5
+ import type { ReorderableRowContextValue, ReorderableRowHandle } from './rowContext';
6
+ import type { ReorderableListLabels, ReorderableListProps } from './types';
7
+
8
+ type ReorderActionName = 'moveUp' | 'moveDown' | 'moveToTop' | 'moveToBottom';
9
+
10
+ export function buildReorderAccessibilityActions(
11
+ index: number,
12
+ count: number,
13
+ labels: ReorderableListLabels,
14
+ ): AccessibilityActionInfo[] {
15
+ const actions: AccessibilityActionInfo[] = [];
16
+ if (index > 0) {
17
+ actions.push({ name: 'moveUp', label: labels.moveUp });
18
+ if (index > 1) actions.push({ name: 'moveToTop', label: labels.moveToTop });
19
+ }
20
+ if (index < count - 1) {
21
+ actions.push({ name: 'moveDown', label: labels.moveDown });
22
+ if (index < count - 2) actions.push({ name: 'moveToBottom', label: labels.moveToBottom });
23
+ }
24
+ return actions;
25
+ }
26
+
27
+ /** Target index for a reorder accessibility action, or `undefined` for other actions. */
28
+ export function getReorderActionTarget(
29
+ actionName: string,
30
+ index: number,
31
+ count: number,
32
+ ): number | undefined {
33
+ switch (actionName as ReorderActionName) {
34
+ case 'moveUp':
35
+ return index - 1;
36
+ case 'moveDown':
37
+ return index + 1;
38
+ case 'moveToTop':
39
+ return 0;
40
+ case 'moveToBottom':
41
+ return count - 1;
42
+ default:
43
+ return undefined;
44
+ }
45
+ }
46
+
47
+ /** Duplicate keys in `data`, for the development warning. */
48
+ export function findDuplicateKeys<T>(
49
+ data: readonly T[],
50
+ keyExtractor: (item: T, index: number) => string,
51
+ ): string[] {
52
+ const seen = new Set<string>();
53
+ const duplicates = new Set<string>();
54
+ data.forEach((item, index) => {
55
+ const key = keyExtractor(item, index);
56
+ if (seen.has(key)) duplicates.add(key);
57
+ seen.add(key);
58
+ });
59
+ return [...duplicates];
60
+ }
61
+
62
+ type ReorderControllerOptions<T> = Pick<
63
+ ReorderableListProps<T>,
64
+ 'data' | 'onReorder' | 'onReorderIndices' | 'getItemLabel' | 'labels'
65
+ > & {
66
+ announce: (message: string) => void;
67
+ };
68
+
69
+ export interface ReorderController<T> {
70
+ labels: ReorderableListLabels;
71
+ /** Commits a move from one position to another and announces it. */
72
+ moveItem: (fromIndex: number, toIndex: number) => void;
73
+ /** Formats an announcement for the item currently at `fromIndex`. */
74
+ describe: (
75
+ key: 'pickedUp' | 'movedTo' | 'dropped' | 'cancelled',
76
+ fromIndex: number,
77
+ position: number,
78
+ ) => string | undefined;
79
+ data: T[];
80
+ }
81
+
82
+ export function useReorderController<T>({
83
+ data,
84
+ onReorder,
85
+ onReorderIndices,
86
+ getItemLabel,
87
+ labels: labelsProp,
88
+ announce,
89
+ }: ReorderControllerOptions<T>): ReorderController<T> {
90
+ const labels = useMemo(() => resolveReorderableListLabels(labelsProp), [labelsProp]);
91
+
92
+ const describe = useCallback<ReorderController<T>['describe']>(
93
+ (key, fromIndex, position) => {
94
+ const item = data[fromIndex];
95
+ if (item === undefined) return undefined;
96
+ return formatReorderMessage(key, {
97
+ labels,
98
+ getItemLabel,
99
+ item,
100
+ fromIndex,
101
+ position,
102
+ count: data.length,
103
+ });
104
+ },
105
+ [data, getItemLabel, labels],
106
+ );
107
+
108
+ const moveItem = useCallback(
109
+ (fromIndex: number, toIndex: number) => {
110
+ if (fromIndex < 0 || fromIndex >= data.length) return;
111
+ const target = Math.min(Math.max(toIndex, 0), data.length - 1);
112
+ if (target === fromIndex) return;
113
+ const message = describe('movedTo', fromIndex, target);
114
+ onReorder(reorderItems(data, fromIndex, target));
115
+ onReorderIndices?.(fromIndex, target);
116
+ if (message) announce(message);
117
+ },
118
+ [announce, data, describe, onReorder, onReorderIndices],
119
+ );
120
+
121
+ // Stable identity: web's accessibility memo keys off this object. A fresh return every render
122
+ // rebuilds createReorderAnnouncements and clears lastAnnouncedIndex, so pick-up is replaced by
123
+ // "moved to" the current position.
124
+ return useMemo(() => ({ labels, moveItem, describe, data }), [labels, moveItem, describe, data]);
125
+ }
126
+
127
+ interface RowValueOptions {
128
+ index: number;
129
+ count: number;
130
+ isDragging: boolean;
131
+ handle: ReorderableRowHandle;
132
+ labels: ReorderableListLabels;
133
+ moveItem: (fromIndex: number, toIndex: number) => void;
134
+ }
135
+
136
+ export function useReorderableRowValue({
137
+ index,
138
+ count,
139
+ isDragging,
140
+ handle,
141
+ labels,
142
+ moveItem,
143
+ }: RowValueOptions): ReorderableRowContextValue {
144
+ return useMemo(() => {
145
+ const move = (toIndex: number) => moveItem(index, toIndex);
146
+ return {
147
+ isDragging,
148
+ index,
149
+ count,
150
+ move,
151
+ accessibilityActions: buildReorderAccessibilityActions(index, count, labels),
152
+ onAccessibilityAction: (event: AccessibilityActionEvent) => {
153
+ const target = getReorderActionTarget(event.nativeEvent.actionName, index, count);
154
+ if (target !== undefined) move(target);
155
+ },
156
+ handle,
157
+ };
158
+ }, [count, handle, index, isDragging, labels, moveItem]);
159
+ }
@@ -0,0 +1,60 @@
1
+ import type { ReorderController } from './useReorder';
2
+
3
+ type Id = string | number;
4
+
5
+ interface DragArgs {
6
+ active: { id: Id };
7
+ over: { id: Id } | null;
8
+ }
9
+
10
+ /** Maps a dnd-kit drop to `data` positions, or `null` when nothing should move. */
11
+ export function resolveDragEnd(
12
+ ids: readonly string[],
13
+ activeId: Id,
14
+ overId: Id | null | undefined,
15
+ ): { from: number; to: number } | null {
16
+ if (overId == null || activeId === overId) return null;
17
+ const from = ids.indexOf(String(activeId));
18
+ const to = ids.indexOf(String(overId));
19
+ if (from === -1 || to === -1) return null;
20
+ return { from, to };
21
+ }
22
+
23
+ /**
24
+ * Position-based dnd-kit announcements. dnd-kit's defaults read the raw draggable ids, which are
25
+ * `keyExtractor` keys — these never mention them.
26
+ */
27
+ export function createReorderAnnouncements<T>(
28
+ ids: readonly string[],
29
+ describe: ReorderController<T>['describe'],
30
+ ) {
31
+ const indexOf = (id: Id | undefined) => (id === undefined ? -1 : ids.indexOf(String(id)));
32
+ // dnd-kit reports the row's own slot as "over" right after pick-up; skip repeats so the
33
+ // pick-up message is not replaced by "moved to" its current position.
34
+ let lastAnnouncedIndex = -1;
35
+
36
+ return {
37
+ onDragStart({ active }: Pick<DragArgs, 'active'>) {
38
+ const from = indexOf(active.id);
39
+ lastAnnouncedIndex = from;
40
+ return from === -1 ? undefined : describe('pickedUp', from, from);
41
+ },
42
+ onDragOver({ active, over }: DragArgs) {
43
+ const from = indexOf(active.id);
44
+ const to = indexOf(over?.id);
45
+ if (from === -1 || to === -1 || to === lastAnnouncedIndex) return undefined;
46
+ lastAnnouncedIndex = to;
47
+ return describe('movedTo', from, to);
48
+ },
49
+ onDragEnd({ active, over }: DragArgs) {
50
+ const from = indexOf(active.id);
51
+ if (from === -1) return undefined;
52
+ const to = indexOf(over?.id);
53
+ return describe('dropped', from, to === -1 ? from : to);
54
+ },
55
+ onDragCancel({ active }: DragArgs) {
56
+ const from = indexOf(active.id);
57
+ return from === -1 ? undefined : describe('cancelled', from, from);
58
+ },
59
+ };
60
+ }
@@ -1,7 +1,12 @@
1
1
  import type { ComponentProps } from 'react';
2
2
  import { ScopedTheme as UniwindScopedTheme } from 'uniwind';
3
3
 
4
- export type ScopedThemeProps = ComponentProps<typeof UniwindScopedTheme>;
4
+ export type ScopedThemeProps = ComponentProps<typeof UniwindScopedTheme> & {
5
+ /** The theme forced on the subtree, such as `'dark'` or `'light'`. */
6
+ theme: ComponentProps<typeof UniwindScopedTheme>['theme'];
7
+ /** The subtree that renders in `theme`. */
8
+ children?: ComponentProps<typeof UniwindScopedTheme>['children'];
9
+ };
5
10
 
6
11
  /**
7
12
  * Forces a specific theme on a component subtree, regardless of the application's
@@ -11,7 +11,10 @@ import { cn } from '@cdx-ui/utils';
11
11
  import { skeletonVariants } from './styles';
12
12
 
13
13
  export interface SkeletonProps extends ViewProps {
14
+ /** Size and shape classes for the placeholder, such as `h-4 w-32 rounded-md`. */
14
15
  className?: string;
16
+ /** Optional content to render inside the placeholder. */
17
+ children?: ViewProps['children'];
15
18
  /**
16
19
  * Half-cycle of the opacity pulse (`1` → `0.35`) in milliseconds.
17
20
  * A full pulse takes `duration × 2`.
@@ -26,57 +26,111 @@ export type { TablePaginationItemToken } from './getTablePaginationItems';
26
26
  export type TablePaginationPageSizeOption = number | { value: number; label: string };
27
27
 
28
28
  export interface TablePaginationProps extends ViewProps {
29
+ /** Render the consumer's child element in place of the default container. */
29
30
  asChild?: boolean;
31
+ /** Additional Uniwind/Tailwind classes, merged after the container's own styles. */
30
32
  className?: string;
33
+ /** Custom layout of pagination parts. Omit to render the status, controls and generated page items. */
31
34
  children?: ReactNode;
32
35
  /** 1-based current page. Controlled when set. */
33
36
  page?: number;
37
+ /**
38
+ * Initial 1-based page when uncontrolled.
39
+ * @default 1
40
+ */
34
41
  defaultPage?: number;
35
42
  /** Total page count. When set with no children, items are generated. */
36
43
  count?: number;
44
+ /** Called with the new 1-based page when the user changes page. */
37
45
  onPageChange?: (page: number) => void;
46
+ /**
47
+ * Number of page items shown on each side of the current page before an ellipsis.
48
+ * @default 1
49
+ */
38
50
  siblingCount?: number;
51
+ /** Current rows-per-page value. When set with no children, the page-size select is rendered. */
39
52
  pageSize?: number;
53
+ /**
54
+ * Choices offered by `TablePagination.PageSize`, as numbers or `{ value, label }` pairs.
55
+ * @default [25, 50, 100]
56
+ */
40
57
  pageSizeOptions?: readonly TablePaginationPageSizeOption[];
58
+ /** Called with the new rows-per-page value when the user picks one. */
41
59
  onPageSizeChange?: (pageSize: number) => void;
60
+ /**
61
+ * Disables every control in the pagination.
62
+ * @default false
63
+ */
42
64
  disabled?: boolean;
65
+ /**
66
+ * Accessible name for the pagination.
67
+ * @default 'Table pagination'
68
+ */
43
69
  'aria-label'?: string;
44
70
  }
45
71
 
46
72
  export interface TablePaginationItemProps extends ViewProps {
73
+ /** Render the consumer's child element in place of the default page button. */
47
74
  asChild?: boolean;
75
+ /** Additional Uniwind/Tailwind classes, merged after the item's own styles. */
48
76
  className?: string;
77
+ /** The page number or label to display. */
49
78
  children?: ReactNode;
79
+ /** 1-based page this item navigates to when pressed. */
50
80
  page?: number;
81
+ /**
82
+ * Marks the item as the current page. Set automatically when `page` matches the current page.
83
+ * @default false
84
+ */
51
85
  current?: boolean;
86
+ /** Disables the item. Defaults to the pagination's `disabled`. */
52
87
  disabled?: boolean;
88
+ /** Called on press, before the pagination navigates to `page`. */
53
89
  onPress?: PressableProps['onPress'];
54
90
  }
55
91
 
56
92
  export interface TablePaginationControlProps extends ViewProps {
93
+ /** Render the consumer's child element in place of the default icon button. */
57
94
  asChild?: boolean;
95
+ /** Additional Uniwind/Tailwind classes, merged after the control's own styles. */
58
96
  className?: string;
97
+ /** The element to render when `asChild` is set. */
59
98
  children?: ReactNode;
99
+ /** Disables the control. It is also disabled at the first or last page, or when the pagination is disabled. */
60
100
  disabled?: boolean;
101
+ /** Called on press, before the pagination moves to the adjacent page. */
61
102
  onPress?: PressableProps['onPress'];
62
103
  }
63
104
 
64
105
  export interface TablePaginationEllipsisProps extends ViewProps {
106
+ /** Render the consumer's child element in place of the default `View` host. */
65
107
  asChild?: boolean;
108
+ /** Additional Uniwind/Tailwind classes, merged after the ellipsis's own styles. */
66
109
  className?: string;
110
+ /** Custom content in place of the default `…`. */
67
111
  children?: ReactNode;
68
112
  }
69
113
 
70
114
  export interface TablePaginationStatusProps extends ViewProps {
115
+ /** Render the consumer's child element in place of the default `View` host. */
71
116
  asChild?: boolean;
117
+ /** Additional Uniwind/Tailwind classes, merged after the status's own styles. */
72
118
  className?: string;
119
+ /** Custom status content in place of the default "Page N of M" text. */
73
120
  children?: ReactNode;
74
121
  }
75
122
 
76
123
  export interface TablePaginationPageSizeProps extends ViewProps {
124
+ /** Render the consumer's child element in place of the default select. */
77
125
  asChild?: boolean;
126
+ /** Additional Uniwind/Tailwind classes, merged after the select's own styles. */
78
127
  className?: string;
128
+ /** The element to render when `asChild` is set. */
79
129
  children?: ReactNode;
130
+ /**
131
+ * Accessible name for the page-size select.
132
+ * @default 'Rows per page'
133
+ */
80
134
  'aria-label'?: string;
81
135
  }
82
136
 
@@ -8,7 +8,7 @@ export type TextColor = NonNullable<TextVariantProps['color']>;
8
8
  export type TextSize = NonNullable<TextVariantProps['size']>;
9
9
  export type TextWeight = NonNullable<TextVariantProps['weight']>;
10
10
 
11
- export type TextProps = Omit<TextVariantProps, 'color' | 'size' | 'weight'> &
11
+ export type TextProps = Omit<TextVariantProps, 'color' | 'size' | 'weight' | 'italic'> &
12
12
  ComponentPropsWithoutRef<typeof RNText> & {
13
13
  /**
14
14
  * Semantic content color, mapped to the matching `text-content-*` token.
@@ -27,7 +27,12 @@ export type TextProps = Omit<TextVariantProps, 'color' | 'size' | 'weight'> &
27
27
  * @default 'normal'
28
28
  */
29
29
  weight?: TextWeight;
30
+ /** Renders the text in italics. A nested `Text` inherits its parent's style when omitted. */
31
+ italic?: TextVariantProps['italic'];
32
+ /** Additional Uniwind/Tailwind classes, merged after the text's own styles. */
30
33
  className?: string;
34
+ /** Text content, which may include nested `Text` elements. */
35
+ children?: ComponentPropsWithoutRef<typeof RNText>['children'];
31
36
  };
32
37
 
33
38
  export const Text = forwardRef<ComponentRef<typeof RNText>, TextProps>(function Text(
@@ -43,7 +43,10 @@ export const tileRootVariants = cva(
43
43
  {
44
44
  variants: {
45
45
  shape: {
46
- flat: 'rounded-none border-0 bg-transparent',
46
+ flat: [
47
+ 'rounded-none border-0 bg-transparent',
48
+ 'data-[state=selected]:bg-surface-action-tint',
49
+ ].join(' '),
47
50
  card: [
48
51
  'rounded-[var(--border-radius-default)] border-1 border-solid',
49
52
  'border-stroke-secondary',
@@ -52,6 +52,11 @@ export * from './ScrollShadow';
52
52
  export * from './Select';
53
53
  export * from './Slider';
54
54
  export * from './VirtualizedList';
55
+ export type {
56
+ ReorderableListLabels,
57
+ ReorderableListProps,
58
+ ReorderableListRenderItemInfo,
59
+ } from './ReorderableList/types';
55
60
  export * from './Switch';
56
61
  export * from './Tabs';
57
62
  export * from './Table';
@@ -0,0 +1 @@
1
+ export * from './components/ReorderableList';
package/src/styles.css CHANGED
@@ -1,2 +1,20 @@
1
1
  @source './**/*.{ts,tsx}';
2
2
  @source '../../data-grid/src/**/*.{ts,tsx}';
3
+
4
+ /*
5
+ * react-native-web resets every root <Text> to `display: inline`, which stops
6
+ * `text-align` from working inside a plain block parent. Its reset class is
7
+ * `css-text-<hash>` in development and `css-<hash>` in production; the hash is
8
+ * derived from RNW's Text reset style and is checked against RNW's actual output
9
+ * by __tests__/rnw-text-reset.test.ts.
10
+ *
11
+ * Uniwind moves that reset into `@layer rnw`, the first layer in the document.
12
+ * Joining the same layer with equal specificity overrides only the reset:
13
+ * Tailwind utilities (layered or not) and RNW's unlayered `numberOfLines`
14
+ * styles still win.
15
+ */
16
+ @layer rnw {
17
+ :is(.css-text-146c3p1, .css-146c3p1) {
18
+ display: revert;
19
+ }
20
+ }