@jobber/components-native 0.115.2-codexjob--9905233.7 → 0.115.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.
- package/dist/docs/ActivityIndicator/ActivityIndicator.md +52 -74
- package/dist/package.json +2 -2
- package/dist/src/ActivityIndicator/ActivityIndicator.js +4 -4
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/dist/types/src/ActivityIndicator/ActivityIndicator.d.ts +1 -1
- package/package.json +2 -2
- package/src/ActivityIndicator/ActivityIndicator.tsx +4 -4
- package/src/ActivityIndicator/guide.md +33 -33
|
@@ -42,7 +42,7 @@ export interface ActivityIndicatorProps {
|
|
|
42
42
|
* Renders the Material Design 3 three-layer indeterminate ring,
|
|
43
43
|
* matching the visual identity of the web `ActivityIndicator` from
|
|
44
44
|
* `@jobber/components`. For determinate progress, use
|
|
45
|
-
* `ProgressIndicator
|
|
45
|
+
* `ProgressIndicator`.
|
|
46
46
|
*/
|
|
47
47
|
export declare function ActivityIndicator({ size, accessibilityLabel, style, testID, }: ActivityIndicatorProps): React.JSX.Element;
|
|
48
48
|
export {};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jobber/components-native",
|
|
3
|
-
"version": "0.115.
|
|
3
|
+
"version": "0.115.3",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"description": "React Native implementation of Atlantis",
|
|
6
6
|
"repository": {
|
|
@@ -123,5 +123,5 @@
|
|
|
123
123
|
"react-native-screens": ">=4.18.0",
|
|
124
124
|
"react-native-svg": ">=12.0.0"
|
|
125
125
|
},
|
|
126
|
-
"gitHead": "
|
|
126
|
+
"gitHead": "b499bb6c3219b55c6de2614a8d83b44a4800980b"
|
|
127
127
|
}
|
|
@@ -130,7 +130,7 @@ function useAnnounceOnMount(label: string) {
|
|
|
130
130
|
* Renders the Material Design 3 three-layer indeterminate ring,
|
|
131
131
|
* matching the visual identity of the web `ActivityIndicator` from
|
|
132
132
|
* `@jobber/components`. For determinate progress, use
|
|
133
|
-
* `ProgressIndicator
|
|
133
|
+
* `ProgressIndicator`.
|
|
134
134
|
*/
|
|
135
135
|
export function ActivityIndicator({
|
|
136
136
|
size = "base",
|
|
@@ -276,7 +276,7 @@ function FullMotionRing({
|
|
|
276
276
|
|
|
277
277
|
const arcAnimatedProps = useAnimatedProps(() => {
|
|
278
278
|
"worklet";
|
|
279
|
-
//
|
|
279
|
+
// Follow the original Material indicator arc progression:
|
|
280
280
|
// 0% → dasharray (1, 200), offset 0
|
|
281
281
|
// 50% → dasharray (90, 200), offset -35
|
|
282
282
|
// 100% → dasharray (90, 200), offset -125
|
|
@@ -390,8 +390,8 @@ function ReducedMotionRing({
|
|
|
390
390
|
}: ReducedMotionRingProps) {
|
|
391
391
|
// Reduced motion: hide rotation entirely, render one static ring in the
|
|
392
392
|
// active foreground colour, and pulse opacity 1.0 ↔ 0.35 over a 4s
|
|
393
|
-
// ease-in-out alternate cycle (2s down, 2s up).
|
|
394
|
-
// reduced-motion fallback
|
|
393
|
+
// ease-in-out alternate cycle (2s down, 2s up). This matches the web
|
|
394
|
+
// reduced-motion fallback's presentation and rhythm.
|
|
395
395
|
//
|
|
396
396
|
// CRITICAL: Reanimated 3 automatically suppresses `withTiming` /
|
|
397
397
|
// `withRepeat` when the OS reduce-motion setting is enabled, snapping
|
|
@@ -6,22 +6,21 @@
|
|
|
6
6
|
directly control or measure — loading, fetching, or waiting on an external
|
|
7
7
|
system. It is a non-interactive Atom in `@jobber/components-native`.
|
|
8
8
|
|
|
9
|
-
This component is the mobile counterpart of the web `ActivityIndicator
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
web; `style` here vs. `className` + `style` on web).
|
|
9
|
+
This component is the mobile counterpart of the web `ActivityIndicator`. Both
|
|
10
|
+
components render the same indeterminate-ring visual language and share semantic
|
|
11
|
+
color tokens, simplified small-size motion, and a reduced-motion fallback.
|
|
12
|
+
Sizes, base motion timings, and public prop names intentionally follow each
|
|
13
|
+
platform's needs.
|
|
15
14
|
|
|
16
15
|
This is one half of the paired Indicators system described in
|
|
17
|
-
`docs/component_upgrades/Indicators.proposal.md`.
|
|
18
|
-
|
|
19
|
-
known fraction) on both platforms and is forthcoming.
|
|
16
|
+
`docs/component_upgrades/Indicators.proposal.md`. Use `ProgressIndicator` for
|
|
17
|
+
determinate cases where the completed fraction is known.
|
|
20
18
|
|
|
21
19
|
The change that introduced this component (motivation, decisions, alternatives
|
|
22
|
-
considered) is recorded in
|
|
23
|
-
|
|
24
|
-
`
|
|
20
|
+
considered) is recorded in
|
|
21
|
+
`openspec/changes/archive/2026-06-10-add-activityindicator-mobile/`. The current
|
|
22
|
+
web contract is in `openspec/specs/activity-indicator/spec.md`, with additional
|
|
23
|
+
implementation guidance in `packages/components/src/ActivityIndicator/guide.md`.
|
|
25
24
|
|
|
26
25
|
## API
|
|
27
26
|
|
|
@@ -61,7 +60,7 @@ spread. The new public API drops the following intentionally:
|
|
|
61
60
|
- Other React Native `View` / `ActivityIndicatorProps` pass-throughs — `style`
|
|
62
61
|
and `testID` are the two preserved escape hatches.
|
|
63
62
|
|
|
64
|
-
### Deprecated alias
|
|
63
|
+
### Deprecated alias
|
|
65
64
|
|
|
66
65
|
`size` accepts `"large"` as a deprecated alias for `"base"`. The TypeScript type
|
|
67
66
|
unions `"small" | "base" | "large"`; the `"large"` branch carries a JSDoc
|
|
@@ -96,8 +95,8 @@ double-announce on mount. The imperative call is uniform across iOS and Android;
|
|
|
96
95
|
the live region is platform-specific. Dropping the latter keeps the rendering
|
|
97
96
|
path free of `Platform.OS` branches.
|
|
98
97
|
|
|
99
|
-
The indicator is
|
|
100
|
-
|
|
98
|
+
The indicator is non-interactive. It exposes one accessible progress element and
|
|
99
|
+
does not require keyboard or screen-reader interaction.
|
|
101
100
|
|
|
102
101
|
## Animation Model
|
|
103
102
|
|
|
@@ -148,13 +147,14 @@ entry rather than nested `isSmall` / `isLarge` branches.
|
|
|
148
147
|
- The 8-phase inner rotation and expand/contract arc are omitted because that
|
|
149
148
|
layered motion reads as too busy at 28px.
|
|
150
149
|
|
|
151
|
-
This keeps FormatFile grid thumbnails and other small call sites
|
|
152
|
-
aligned with web's small indicator
|
|
150
|
+
This keeps FormatFile grid thumbnails and other small call sites behaviorally
|
|
151
|
+
aligned with web's small indicator while retaining mobile-appropriate sizing.
|
|
153
152
|
|
|
154
|
-
The
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
153
|
+
The native base durations match Material Web's published progress motion spec
|
|
154
|
+
and are provided by `@jobber/design`'s `timing-indicator-*` tokens. Web scales
|
|
155
|
+
those timings by 1.15× for a calmer desktop rhythm, so the base motion is
|
|
156
|
+
deliberately similar rather than identical. The small spin duration is `1000ms`
|
|
157
|
+
on both platforms.
|
|
158
158
|
|
|
159
159
|
## Reduced Motion
|
|
160
160
|
|
|
@@ -187,10 +187,10 @@ shipped — the original 0.55 lower bound was too subtle to read as activity.
|
|
|
187
187
|
| `small` | 28 px | proportional to web's small variant | Layer 1 only; fixed arc; 1000ms spin |
|
|
188
188
|
| `base` | 44 px | proportional to web's base variant | Full three-layer Material indeterminate ring |
|
|
189
189
|
|
|
190
|
-
Sizes are unified across iOS
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
190
|
+
Sizes are unified across iOS and Android. Mobile deliberately uses larger
|
|
191
|
+
dimensions than web (28/44px here versus 16/32px on web) and does not adopt
|
|
192
|
+
iOS-native sizing (`UIActivityIndicatorView`'s ~20/~37 px). The implementation
|
|
193
|
+
still avoids platform-specific rendering branches.
|
|
194
194
|
|
|
195
195
|
Layout — inline-vs-block placement, margins, alignment — is the consumer's
|
|
196
196
|
responsibility. The component has no `inline` prop. Wrap in a `<View>`,
|
|
@@ -198,23 +198,23 @@ responsibility. The component has no `inline` prop. Wrap in a `<View>`,
|
|
|
198
198
|
|
|
199
199
|
## Cross-platform parity
|
|
200
200
|
|
|
201
|
-
Visual
|
|
202
|
-
Both components share:
|
|
201
|
+
Visual and behavioral consistency with the web `ActivityIndicator` is the
|
|
202
|
+
primary goal. Both components share:
|
|
203
203
|
|
|
204
204
|
- Material Design 3 three-layer indeterminate ring geometry
|
|
205
|
-
- Sizes (28 px small, 44 px base)
|
|
206
|
-
- Motion durations (`timing-indicator-arc`, `timing-indicator-cycle`,
|
|
207
|
-
`timing-indicator-linear-rotate`) from the same `@jobber/design` source
|
|
208
205
|
- Color tokens (`color-text--secondary` for arcs, `color-surface--active` for
|
|
209
206
|
track) from the same `@jobber/design` source
|
|
210
207
|
- Reduced-motion fallback (opacity 1.0 ↔ 0.35, 2 s ease-in-out alternate)
|
|
208
|
+
- Layer 1-only motion for the small size, with a 1000ms spin
|
|
211
209
|
|
|
212
210
|
Documented divergences:
|
|
213
211
|
|
|
214
212
|
| Aspect | Web | Mobile |
|
|
215
213
|
| ------------------------ | ---------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------ |
|
|
214
|
+
| Sizes | 16px small, 32px base | 28px small, 44px base |
|
|
215
|
+
| Base motion | Tuned 1803 / 6132 / 1533ms CSS literals | Material 1568 / 5332 / 1333ms `timing-indicator-*` tokens |
|
|
216
216
|
| Accessible label | `ariaLabel` | `accessibilityLabel` |
|
|
217
|
-
| Default label |
|
|
217
|
+
| Default label | `useAtlantisI18n(commonMessages)` | `useAtlantisI18n("loading")` |
|
|
218
218
|
| Styling | `className` + `style` | `style` |
|
|
219
219
|
| Test id | (no equivalent; tests use `getByRole` / `getByText`) | `testID` |
|
|
220
220
|
| Accessibility plumbing | `role="status"` + visually-hidden text + announce-on-mount fix for VoiceOver | `accessibilityRole="progressbar"` + `accessibilityState={{ busy: true }}` + `AccessibilityInfo.announceForAccessibility` |
|
|
@@ -232,8 +232,8 @@ wrapper around React Native's primitive. Migration of existing call sites:
|
|
|
232
232
|
- Bare `<ActivityIndicator />` — no change needed. The new component renders a
|
|
233
233
|
(better-looking) Material ring at the base size.
|
|
234
234
|
- `<ActivityIndicator size="small" />` — no change needed.
|
|
235
|
-
- `<ActivityIndicator size="large" />` —
|
|
236
|
-
in development. Update to `size="base"` at your convenience.
|
|
235
|
+
- `<ActivityIndicator size="large" />` — remains available during the migration
|
|
236
|
+
window and warns in development. Update to `size="base"` at your convenience.
|
|
237
237
|
- `<ActivityIndicator color="white" />` — no longer supported. The single known
|
|
238
238
|
site (`jobber-mobile/GalleryHeader`) is migrated by the
|
|
239
239
|
`migrate-activityindicator` change in the jobber-mobile repository.
|