@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.
@@ -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` (forthcoming).
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.2-codexjob--9905233.7+9905233c",
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": "9905233c18ce012134f57ba140fabba5225e18a6"
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` (forthcoming).
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
- // Match web's indicatorExpandArc keyframe:
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). Matches web's
394
- // reduced-motion fallback exactly.
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` shipped
10
- in atlantis change `add-activityindicator`. Both components render the Material
11
- Design 3 three-layer indeterminate ring, with the same sizes, motion durations,
12
- color tokens, and reduced-motion fallback. Public prop names diverge to follow
13
- each platform's native conventions (`accessibilityLabel` here vs. `ariaLabel` on
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`. The other half,
18
- `ProgressIndicator`, will own determinate-controlled cases (progress with a
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 `openspec/changes/add-activityindicator-mobile/`. The
23
- web spec is at
24
- `packages/components/src/ActivityIndicator/ActivityIndicator.spec.md`.
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 (this release only)
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 not focusable and is not in the keyboard / screen reader
100
- navigation order beyond the initial announcement.
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 visually
152
- aligned with web's small indicator, not just size-matched.
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 literal base durations match Material Web's published progress motion spec;
155
- the same values ship from `@jobber/design`'s `timing.tokens.json` to both web
156
- and mobile so the base rhythm is identical across platforms. The small spin
157
- duration is a CSS literal on web and a matching constant on native (`1000ms`).
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, Android, and web. The component deliberately does
191
- not adopt iOS-native sizing (`UIActivityIndicatorView`'s ~20/~37 px) — the
192
- cross-platform parity argument wins over Apple HIG convention here, consistent
193
- with the "one implementation, no platform branch" stance.
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 + behavioral parity with the web `ActivityIndicator` is the primary goal.
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 | hardcoded `"Loading"` | `useAtlantisI18n("loading")` |
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" />` — runs unchanged for this release; warns
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.