@jobber/components 8.3.0 → 8.4.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.
@@ -0,0 +1 @@
1
+ export * from "./dist/ActivityIndicator";
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true,
5
+ });
6
+
7
+ var ActivityIndicator = require("./dist/ActivityIndicator");
8
+
9
+ Object.keys(ActivityIndicator).forEach(function(key) {
10
+ if (key === "default" || key === "__esModule") return;
11
+ Object.defineProperty(exports, key, {
12
+ enumerable: true,
13
+ get: function get() {
14
+ return ActivityIndicator[key];
15
+ },
16
+ });
17
+ });
@@ -0,0 +1,38 @@
1
+ import React from "react";
2
+ import type { CSSProperties } from "react";
3
+ export interface ActivityIndicatorProps {
4
+ /**
5
+ * Visual size. `base` renders at 32px, `small` renders at 16px.
6
+ *
7
+ * @default "base"
8
+ */
9
+ readonly size?: "small" | "base";
10
+ /**
11
+ * Accessible label exposed via `aria-label` on the root element. Override
12
+ * to localize or to describe the specific activity (e.g. "Uploading file").
13
+ *
14
+ * @default "Loading"
15
+ */
16
+ readonly ariaLabel?: string;
17
+ /**
18
+ * Custom class name merged onto the root element alongside the component's
19
+ * own classes.
20
+ */
21
+ readonly className?: string;
22
+ /**
23
+ * Custom inline styles applied to the root element.
24
+ */
25
+ readonly style?: CSSProperties;
26
+ }
27
+ /**
28
+ * `ActivityIndicator` communicates an indeterminate activity that the user
29
+ * cannot directly control or measure — loading, fetching, or waiting on an
30
+ * external system.
31
+ *
32
+ * For determinate progress (a known fraction completed), use
33
+ * `ProgressIndicator` instead (forthcoming).
34
+ *
35
+ * For now, the legacy `Spinner` component also remains available; new code
36
+ * should prefer `ActivityIndicator`.
37
+ */
38
+ export declare function ActivityIndicator({ size, ariaLabel, className, style, }: ActivityIndicatorProps): React.JSX.Element;
@@ -0,0 +1,9 @@
1
+ 'use strict';
2
+
3
+ var ActivityIndicator = require('../ActivityIndicator-cjs.js');
4
+ require('react');
5
+ require('classnames');
6
+
7
+
8
+
9
+ exports.ActivityIndicator = ActivityIndicator.ActivityIndicator;
@@ -0,0 +1,2 @@
1
+ export { ActivityIndicator } from "./ActivityIndicator";
2
+ export type { ActivityIndicatorProps } from "./ActivityIndicator";
@@ -0,0 +1,3 @@
1
+ export { A as ActivityIndicator } from '../ActivityIndicator-es.js';
2
+ import 'react';
3
+ import 'classnames';
@@ -0,0 +1,27 @@
1
+ 'use strict';
2
+
3
+ var React = require('react');
4
+ var classnames = require('classnames');
5
+
6
+ var styles = {"indicator":"YST686vLR3c-","screenReaderOnly":"MmNHh-oCyxc-","small":"_888S5Y2IeZ8-","svg":"Av9z-aLocss-","indicatorLinearRotate":"WvHFS--Nm80-","track":"VDTWabJptKI-","arc":"_9XO0290QNCY-","indicatorRotateArc":"SHHICknKvqA-","indicatorExpandArc":"_0m0Nzc5awnA-","indicatorReducedPulse":"_4dXQsbprq3s-","spinning":"IZCteJUCKio-"};
7
+
8
+ /**
9
+ * `ActivityIndicator` communicates an indeterminate activity that the user
10
+ * cannot directly control or measure — loading, fetching, or waiting on an
11
+ * external system.
12
+ *
13
+ * For determinate progress (a known fraction completed), use
14
+ * `ProgressIndicator` instead (forthcoming).
15
+ *
16
+ * For now, the legacy `Spinner` component also remains available; new code
17
+ * should prefer `ActivityIndicator`.
18
+ */
19
+ function ActivityIndicator({ size = "base", ariaLabel = "Loading", className, style, }) {
20
+ return (React.createElement("div", { role: "status", "aria-label": ariaLabel, className: classnames(styles.indicator, size === "small" && styles.small, className), style: style },
21
+ React.createElement("span", { className: styles.screenReaderOnly }, ariaLabel),
22
+ React.createElement("svg", { className: styles.svg, viewBox: "0 0 48 48", focusable: "false", "aria-hidden": "true" },
23
+ React.createElement("circle", { className: styles.track, cx: "24", cy: "24", r: "20" }),
24
+ React.createElement("circle", { className: styles.arc, cx: "24", cy: "24", r: "20" }))));
25
+ }
26
+
27
+ exports.ActivityIndicator = ActivityIndicator;
@@ -0,0 +1,25 @@
1
+ import React__default from 'react';
2
+ import classnames from 'classnames';
3
+
4
+ var styles = {"indicator":"YST686vLR3c-","screenReaderOnly":"MmNHh-oCyxc-","small":"_888S5Y2IeZ8-","svg":"Av9z-aLocss-","indicatorLinearRotate":"WvHFS--Nm80-","track":"VDTWabJptKI-","arc":"_9XO0290QNCY-","indicatorRotateArc":"SHHICknKvqA-","indicatorExpandArc":"_0m0Nzc5awnA-","indicatorReducedPulse":"_4dXQsbprq3s-","spinning":"IZCteJUCKio-"};
5
+
6
+ /**
7
+ * `ActivityIndicator` communicates an indeterminate activity that the user
8
+ * cannot directly control or measure — loading, fetching, or waiting on an
9
+ * external system.
10
+ *
11
+ * For determinate progress (a known fraction completed), use
12
+ * `ProgressIndicator` instead (forthcoming).
13
+ *
14
+ * For now, the legacy `Spinner` component also remains available; new code
15
+ * should prefer `ActivityIndicator`.
16
+ */
17
+ function ActivityIndicator({ size = "base", ariaLabel = "Loading", className, style, }) {
18
+ return (React__default.createElement("div", { role: "status", "aria-label": ariaLabel, className: classnames(styles.indicator, size === "small" && styles.small, className), style: style },
19
+ React__default.createElement("span", { className: styles.screenReaderOnly }, ariaLabel),
20
+ React__default.createElement("svg", { className: styles.svg, viewBox: "0 0 48 48", focusable: "false", "aria-hidden": "true" },
21
+ React__default.createElement("circle", { className: styles.track, cx: "24", cy: "24", r: "20" }),
22
+ React__default.createElement("circle", { className: styles.arc, cx: "24", cy: "24", r: "20" }))));
23
+ }
24
+
25
+ export { ActivityIndicator as A };
@@ -1,4 +1,7 @@
1
1
  import React from "react";
2
+ /**
3
+ * @deprecated Use `ActivityIndicator` instead.
4
+ */
2
5
  interface SpinnerProps {
3
6
  /**
4
7
  * Specifies the size of the spinner
@@ -12,5 +15,8 @@ interface SpinnerProps {
12
15
  */
13
16
  readonly inline?: boolean;
14
17
  }
18
+ /**
19
+ * @deprecated Use `ActivityIndicator` instead.
20
+ */
15
21
  export declare function Spinner({ size, inline }: SpinnerProps): React.JSX.Element;
16
22
  export {};
@@ -5,6 +5,9 @@ var classnames = require('classnames');
5
5
 
6
6
  var styles = {"spinner":"_6hfmGZoXNyg-","animationSpin":"aT3CETCJ4hQ-","small":"bMfynkzmlL4-","inline":"NA68eWblbLo-","spinning":"aCBq1WrkI4M-"};
7
7
 
8
+ /**
9
+ * @deprecated Use `ActivityIndicator` instead.
10
+ */
8
11
  function Spinner({ size = "base", inline }) {
9
12
  const spinnerStyles = classnames(styles.spinner, {
10
13
  [styles.small]: size === "small",
@@ -3,6 +3,9 @@ import classnames from 'classnames';
3
3
 
4
4
  var styles = {"spinner":"_6hfmGZoXNyg-","animationSpin":"aT3CETCJ4hQ-","small":"bMfynkzmlL4-","inline":"NA68eWblbLo-","spinning":"aCBq1WrkI4M-"};
5
5
 
6
+ /**
7
+ * @deprecated Use `ActivityIndicator` instead.
8
+ */
6
9
  function Spinner({ size = "base", inline }) {
7
10
  const spinnerStyles = classnames(styles.spinner, {
8
11
  [styles.small]: size === "small",
@@ -0,0 +1,67 @@
1
+ # Activity Indicator
2
+
3
+ `ActivityIndicator` is used to communicate an **indeterminate** activity the
4
+ user cannot directly control or measure — loading, fetching, or waiting on an
5
+ external system.
6
+
7
+ Use `ActivityIndicator` when the loading time or fraction of progress is
8
+ unknown. If you know the fraction of progress (for example, "3 of 4 files
9
+ uploaded"), use `ProgressBar` instead. A `ProgressIndicator` counterpart that
10
+ will subsume `ProgressBar` under the new naming is forthcoming.
11
+
12
+ ## Design & usage guidelines
13
+
14
+ The default `ActivityIndicator` size is `base` (32px) and can be used in most
15
+ cases. The `small` size (16px) should be used on individual elements of an
16
+ interface (e.g. inside a `Button` or `Card`) or when sitting next to short
17
+ inline text.
18
+
19
+ Layout is the consumer's responsibility — `ActivityIndicator` does not expose
20
+ an `inline` prop. Place it inside your own flex / inline-block container, or
21
+ pass a `className` / `style`, to control surrounding layout.
22
+
23
+ ## Accessibility
24
+
25
+ `ActivityIndicator` announces itself politely to assistive technology:
26
+
27
+ * `role="status"` marks the element as a polite live region, appropriate for
28
+ a non-urgent loading state.
29
+ * `aria-label` defaults to the literal English string `"Loading"`. Pass a
30
+ custom `ariaLabel` to localize or to describe the specific activity
31
+ (e.g. `ariaLabel="Uploading file"`).
32
+
33
+ The indicator does not participate in the keyboard tab order.
34
+
35
+ ### Reduced motion
36
+
37
+ When the user's operating system reports
38
+ [`prefers-reduced-motion: reduce`](https://developer.mozilla.org/docs/Web/CSS/@media/prefers-reduced-motion),
39
+ the indicator hides its rocking and rotating layers, repaints a single
40
+ static ring in the icon foreground colour, and gently pulses its opacity so
41
+ the indicator still reads as "busy" without rotational motion.
42
+
43
+ ## Relationship to Spinner
44
+
45
+ The legacy [Spinner](../Spinner/Spinner.md) component remains available and
46
+ unchanged. New code should prefer `ActivityIndicator`. A follow-up change is
47
+ expected to deprecate `Spinner` in favour of `ActivityIndicator`.
48
+
49
+ ## Mobile
50
+
51
+ On mobile (`@jobber/components-native`), `ActivityIndicator` uses the
52
+ [ActivityIndicator](https://reactnative.dev/docs/activityIndicator) core
53
+ component from React Native.
54
+
55
+ ## Mockup
56
+
57
+
58
+ ## Props
59
+
60
+ ### Web
61
+
62
+ | Prop | Type | Required | Default | Description |
63
+ |------|------|----------|---------|-------------|
64
+ | `ariaLabel` | `string` | No | `Loading` | Accessible label exposed via `aria-label` on the root element. Override to localize or to describe the specific activ... |
65
+ | `className` | `string` | No | — | Custom class name merged onto the root element alongside the component's own classes. |
66
+ | `size` | `"base" | "small"` | No | `base` | Visual size. `base` renders at 32px, `small` renders at 16px. |
67
+ | `style` | `CSSProperties` | No | — | Custom inline styles applied to the root element. |
@@ -1,5 +1,13 @@
1
1
  # Spinner
2
2
 
3
+ > **Deprecated.** Use
4
+ > [ActivityIndicator](../ActivityIndicator/ActivityIndicator.md) for new work.
5
+ > `ActivityIndicator` is the supported indeterminate loading indicator going
6
+ > forward — it offers the same semantic with a cleaner prop surface, a polite
7
+ > `role="status"`, theme-adaptive tokens, Material-style three-layer
8
+ > animation, and a `prefers-reduced-motion` fallback. `Spinner` continues to
9
+ > work unchanged for existing call sites.
10
+
3
11
  Spinner is used to indicate the loading of content where the actual amount of
4
12
  loading time or progress is unknown.
5
13
 
@@ -32,7 +40,7 @@ If the amount of progress or loading time is known, use
32
40
  process.
33
41
 
34
42
  To indicate loading content in mobile applications, refer to
35
- [ActivityIndicator](/components/ActivityIndicator).
43
+ [ActivityIndicator](../ActivityIndicator/ActivityIndicator.md).
36
44
 
37
45
 
38
46
  ## Props
@@ -1,3 +1,4 @@
1
+ [ActivityIndicator](./ActivityIndicator/ActivityIndicator.md)
1
2
  [AnimatedPresence](./AnimatedPresence/AnimatedPresence.md)
2
3
  [AnimatedSwitcher](./AnimatedSwitcher/AnimatedSwitcher.md)
3
4
  [Animation](./Animation/Animation.md)
package/dist/index.cjs CHANGED
@@ -1,5 +1,6 @@
1
1
  'use strict';
2
2
 
3
+ var ActivityIndicator = require('./ActivityIndicator-cjs.js');
3
4
  var AnimatedPresence = require('./AnimatedPresence-cjs.js');
4
5
  var AnimatedSwitcher = require('./AnimatedSwitcher-cjs.js');
5
6
  var AtlantisContext = require('./AtlantisContext-cjs.js');
@@ -93,6 +94,7 @@ var Tiles = require('./Tiles-cjs.js');
93
94
  var showToast = require('./showToast-cjs.js');
94
95
  var Tooltip = require('./Tooltip-cjs.js');
95
96
  var Typography = require('./Typography-cjs.js');
97
+ require('classnames');
96
98
  require('framer-motion');
97
99
  require('@jobber/design');
98
100
  require('./_commonjsHelpers-cjs.js');
@@ -110,7 +112,6 @@ require('./index.esm-cjs.js');
110
112
  require('react/jsx-runtime');
111
113
  require('react-dom');
112
114
  require('./floating-ui.react-dom-cjs.js');
113
- require('classnames');
114
115
  require('./maxHeight-cjs.js');
115
116
  require('./tslib.es6-cjs.js');
116
117
  require('react-hook-form');
@@ -205,6 +206,7 @@ function isNormalClick(evt) {
205
206
  !evt.altKey);
206
207
  }
207
208
 
209
+ exports.ActivityIndicator = ActivityIndicator.ActivityIndicator;
208
210
  exports.AnimatedPresence = AnimatedPresence.AnimatedPresence;
209
211
  exports.AnimatedSwitcher = AnimatedSwitcher.AnimatedSwitcher;
210
212
  exports.AtlantisContext = AtlantisContext.AtlantisContext;
package/dist/index.d.mts CHANGED
@@ -1,3 +1,4 @@
1
+ export * from "./ActivityIndicator";
1
2
  export * from "./AnimatedPresence";
2
3
  export * from "./AnimatedSwitcher";
3
4
  export * from "./AtlantisContext";
package/dist/index.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ export * from "./ActivityIndicator";
1
2
  export * from "./AnimatedPresence";
2
3
  export * from "./AnimatedSwitcher";
3
4
  export * from "./AtlantisContext";
package/dist/index.mjs CHANGED
@@ -1,3 +1,4 @@
1
+ export { A as ActivityIndicator } from './ActivityIndicator-es.js';
1
2
  export { A as AnimatedPresence } from './AnimatedPresence-es.js';
2
3
  export { A as AnimatedSwitcher } from './AnimatedSwitcher-es.js';
3
4
  export { A as AtlantisContext, a as atlantisContextDefaultValues, u as useAtlantisContext } from './AtlantisContext-es.js';
@@ -91,6 +92,7 @@ export { T as Tiles } from './Tiles-es.js';
91
92
  export { T as Toast, s as showToast } from './showToast-es.js';
92
93
  export { T as Tooltip } from './Tooltip-es.js';
93
94
  export { T as Typography } from './Typography-es.js';
95
+ import 'classnames';
94
96
  import 'framer-motion';
95
97
  import '@jobber/design';
96
98
  import './_commonjsHelpers-es.js';
@@ -108,7 +110,6 @@ import './index.esm-es.js';
108
110
  import 'react/jsx-runtime';
109
111
  import 'react-dom';
110
112
  import './floating-ui.react-dom-es.js';
111
- import 'classnames';
112
113
  import './maxHeight-es.js';
113
114
  import './tslib.es6-es.js';
114
115
  import 'react-hook-form';
package/dist/styles.css CHANGED
@@ -1,3 +1,282 @@
1
+ /*
2
+ * ActivityIndicator
3
+ *
4
+ * Indeterminate three-layer ring, following Material Web's canonical
5
+ * SVG-based pattern:
6
+ * 1. The <svg> rotates continuously at a constant linear speed (Layer 1).
7
+ * 2. The active <circle> rotates through 8 discrete phases per cycle
8
+ * (Layer 2).
9
+ * 3. The active <circle>'s stroke-dasharray expands and contracts so the
10
+ * visible arc length grows and shrinks (Layer 3); stroke-dashoffset
11
+ * slides the arc around the ring across the cycle.
12
+ */
13
+
14
+ .YST686vLR3c- {
15
+ position: relative;
16
+ width: 32px;
17
+ width: var(--space-larger);
18
+ height: 32px;
19
+ height: var(--space-larger);
20
+ }
21
+
22
+ /*
23
+ * Visually hide an element from sighted users while keeping it in the
24
+ * accessibility tree and the live-region text content. Used for the
25
+ * mount-time "Loading" announcement on role=\"status\". Mirrors the
26
+ * .screenReaderOnly pattern already used elsewhere in @jobber/components.
27
+ */
28
+
29
+ .MmNHh-oCyxc- {
30
+ position: absolute;
31
+ width: 1px;
32
+ height: 1px;
33
+ margin: -1px;
34
+ overflow: hidden;
35
+ clip: rect(0, 0, 0, 0);
36
+ white-space: nowrap;
37
+ }
38
+
39
+ ._888S5Y2IeZ8- {
40
+ width: 16px;
41
+ width: var(--space-base);
42
+ height: 16px;
43
+ height: var(--space-base);
44
+ }
45
+
46
+ /*
47
+ * Layer 1 — continuous linear rotation on the SVG.
48
+ *
49
+ * The three indicator durations (1568ms outer rotation, 5332ms inner
50
+ * 8-phase cycle, 1333ms arc expand/contract) are taken from Material
51
+ * Web's published progress-motion spec. They are tuned against each
52
+ * other to produce the canonical Material rhythm and are intentionally
53
+ * inlined as literals because no other component currently consumes
54
+ * them; promote them to design tokens once a second consumer (e.g. a
55
+ * future `ProgressIndicator`) needs the same values.
56
+ */
57
+
58
+ .Av9z-aLocss- {
59
+ display: block;
60
+ width: 100%;
61
+ height: 100%;
62
+ -webkit-animation: WvHFS--Nm80- 1568ms linear infinite;
63
+ animation: WvHFS--Nm80- 1568ms linear infinite;
64
+ will-change: transform;
65
+ }
66
+
67
+ /* Static background ring drawn beneath the moving arc. */
68
+
69
+ .VDTWabJptKI- {
70
+ fill: none;
71
+ stroke: hsl(0, 0%, 93%);
72
+ stroke: var(--color-disabled--secondary);
73
+ stroke-width: 4;
74
+ }
75
+
76
+ ._888S5Y2IeZ8- .VDTWabJptKI- {
77
+ stroke-width: 6;
78
+ }
79
+
80
+ /*
81
+ * Layer 2 + 3 — the active arc.
82
+ *
83
+ * The circle has circumference 2π·20 ≈ 125.66 (SVG units). The dasharray
84
+ * (visible, gap) interpolates so the visible portion grows from ~1 unit to
85
+ * ~95 units, while the dashoffset slides the arc around the ring. The
86
+ * combined cycle is the canonical Material rhythm.
87
+ *
88
+ * stroke-linecap: round produces the soft pill-shaped tips on the arc.
89
+ */
90
+
91
+ ._9XO0290QNCY- {
92
+ fill: none;
93
+ stroke: hsl(198, 35%, 21%);
94
+ stroke: var(--color-interactive--subtle);
95
+ stroke-width: 4;
96
+ stroke-linecap: round;
97
+ -webkit-transform-origin: center;
98
+ transform-origin: center;
99
+ -webkit-animation:
100
+ SHHICknKvqA- 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both,
101
+ _0m0Nzc5awnA- 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;
102
+ animation:
103
+ SHHICknKvqA- 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both,
104
+ _0m0Nzc5awnA- 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;
105
+ }
106
+
107
+ ._888S5Y2IeZ8- ._9XO0290QNCY- {
108
+ stroke-width: 6;
109
+ }
110
+
111
+ @-webkit-keyframes WvHFS--Nm80- {
112
+ to {
113
+ -webkit-transform: rotate(360deg);
114
+ transform: rotate(360deg);
115
+ }
116
+ }
117
+
118
+ @keyframes WvHFS--Nm80- {
119
+ to {
120
+ -webkit-transform: rotate(360deg);
121
+ transform: rotate(360deg);
122
+ }
123
+ }
124
+
125
+ /* Layer 2 — 8-phase 1080° rotation on the active arc. */
126
+
127
+ @-webkit-keyframes SHHICknKvqA- {
128
+ 12.5% {
129
+ -webkit-transform: rotate(135deg);
130
+ transform: rotate(135deg);
131
+ }
132
+ 25% {
133
+ -webkit-transform: rotate(270deg);
134
+ transform: rotate(270deg);
135
+ }
136
+ 37.5% {
137
+ -webkit-transform: rotate(405deg);
138
+ transform: rotate(405deg);
139
+ }
140
+ 50% {
141
+ -webkit-transform: rotate(540deg);
142
+ transform: rotate(540deg);
143
+ }
144
+ 62.5% {
145
+ -webkit-transform: rotate(675deg);
146
+ transform: rotate(675deg);
147
+ }
148
+ 75% {
149
+ -webkit-transform: rotate(810deg);
150
+ transform: rotate(810deg);
151
+ }
152
+ 87.5% {
153
+ -webkit-transform: rotate(945deg);
154
+ transform: rotate(945deg);
155
+ }
156
+ 100% {
157
+ -webkit-transform: rotate(1080deg);
158
+ transform: rotate(1080deg);
159
+ }
160
+ }
161
+
162
+ @keyframes SHHICknKvqA- {
163
+ 12.5% {
164
+ -webkit-transform: rotate(135deg);
165
+ transform: rotate(135deg);
166
+ }
167
+ 25% {
168
+ -webkit-transform: rotate(270deg);
169
+ transform: rotate(270deg);
170
+ }
171
+ 37.5% {
172
+ -webkit-transform: rotate(405deg);
173
+ transform: rotate(405deg);
174
+ }
175
+ 50% {
176
+ -webkit-transform: rotate(540deg);
177
+ transform: rotate(540deg);
178
+ }
179
+ 62.5% {
180
+ -webkit-transform: rotate(675deg);
181
+ transform: rotate(675deg);
182
+ }
183
+ 75% {
184
+ -webkit-transform: rotate(810deg);
185
+ transform: rotate(810deg);
186
+ }
187
+ 87.5% {
188
+ -webkit-transform: rotate(945deg);
189
+ transform: rotate(945deg);
190
+ }
191
+ 100% {
192
+ -webkit-transform: rotate(1080deg);
193
+ transform: rotate(1080deg);
194
+ }
195
+ }
196
+
197
+ /*
198
+ * Layer 3 — expand/contract the visible arc length via stroke-dasharray
199
+ * while shifting it around the ring via stroke-dashoffset. The "200" gap
200
+ * value exceeds the circle's circumference, ensuring only one stroke
201
+ * segment is visible at a time.
202
+ */
203
+
204
+ @-webkit-keyframes _0m0Nzc5awnA- {
205
+ 0% {
206
+ stroke-dasharray: 1, 200;
207
+ stroke-dashoffset: 0;
208
+ }
209
+ 50% {
210
+ stroke-dasharray: 90, 200;
211
+ stroke-dashoffset: -35;
212
+ }
213
+ 100% {
214
+ stroke-dasharray: 90, 200;
215
+ stroke-dashoffset: -125;
216
+ }
217
+ }
218
+
219
+ @keyframes _0m0Nzc5awnA- {
220
+ 0% {
221
+ stroke-dasharray: 1, 200;
222
+ stroke-dashoffset: 0;
223
+ }
224
+ 50% {
225
+ stroke-dasharray: 90, 200;
226
+ stroke-dashoffset: -35;
227
+ }
228
+ 100% {
229
+ stroke-dasharray: 90, 200;
230
+ stroke-dashoffset: -125;
231
+ }
232
+ }
233
+
234
+ @-webkit-keyframes _4dXQsbprq3s- {
235
+ from {
236
+ opacity: 1;
237
+ }
238
+ to {
239
+ opacity: 0.35;
240
+ }
241
+ }
242
+
243
+ @keyframes _4dXQsbprq3s- {
244
+ from {
245
+ opacity: 1;
246
+ }
247
+ to {
248
+ opacity: 0.35;
249
+ }
250
+ }
251
+
252
+ /*
253
+ * Reduced motion fallback. Hide the active arc entirely; repaint the static
254
+ * track in the icon foreground colour and pulse its opacity so the
255
+ * indicator still reads as "busy" without rotational motion.
256
+ *
257
+ * A naive `animation: none` would freeze a partial arc mid-cycle and lose
258
+ * the busy affordance.
259
+ */
260
+
261
+ @media (prefers-reduced-motion: reduce) {
262
+ .Av9z-aLocss-,
263
+ ._9XO0290QNCY- {
264
+ -webkit-animation: none;
265
+ animation: none;
266
+ }
267
+
268
+ ._9XO0290QNCY- {
269
+ display: none;
270
+ }
271
+
272
+ .VDTWabJptKI- {
273
+ stroke: hsl(198, 35%, 21%);
274
+ stroke: var(--color-interactive--subtle);
275
+ -webkit-animation: _4dXQsbprq3s- 2s ease-in-out infinite alternate;
276
+ animation: _4dXQsbprq3s- 2s ease-in-out infinite alternate;
277
+ }
278
+ }
279
+
1
280
  .P6HrDSaI0Ac- {
2
281
  display: contents;
3
282
  }
@@ -1,5 +1,6 @@
1
1
  {
2
2
  "exportedComponents": [
3
+ "ActivityIndicator",
3
4
  "AffixIcon",
4
5
  "AffixLabel",
5
6
  "AnimatedPresence",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jobber/components",
3
- "version": "8.3.0",
3
+ "version": "8.4.0",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "main": "dist/index.cjs",
@@ -25,6 +25,11 @@
25
25
  "import": "./dist/unstyledPrimitives/index.mjs",
26
26
  "require": "./dist/unstyledPrimitives/index.cjs"
27
27
  },
28
+ "./ActivityIndicator": {
29
+ "types": "./dist/ActivityIndicator/index.d.ts",
30
+ "import": "./dist/ActivityIndicator/index.mjs",
31
+ "require": "./dist/ActivityIndicator/index.cjs"
32
+ },
28
33
  "./AnimatedPresence": {
29
34
  "types": "./dist/AnimatedPresence/index.d.ts",
30
35
  "import": "./dist/AnimatedPresence/index.mjs",
@@ -508,7 +513,7 @@
508
513
  "devDependencies": {
509
514
  "@apollo/client": "^3.7.10",
510
515
  "@csstools/postcss-global-data": "^1.0.3",
511
- "@jobber/design": "0.101.0",
516
+ "@jobber/design": "0.101.1",
512
517
  "@jobber/hooks": "2.20.1",
513
518
  "@rollup/plugin-alias": "^5.1.0",
514
519
  "@rollup/plugin-commonjs": "^25.0.7",
@@ -563,5 +568,5 @@
563
568
  "> 1%",
564
569
  "IE 10"
565
570
  ],
566
- "gitHead": "2829a8684a94528cf087b63fa471c531c95d01c8"
571
+ "gitHead": "7b859533f0b0482ad30654fb0fde5d41c2d918ba"
567
572
  }