@astryxdesign/lab 0.7.8-canary.ffd29c5 → 0.7.9-canary.0200dfe

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 (127) hide show
  1. package/blocks/CommentThreadShowcase.tsx +1 -1
  2. package/dist/Chart/Chart.d.ts.map +1 -1
  3. package/dist/Chart/Chart.js +8 -7
  4. package/dist/Chart/formatters.d.ts +9 -6
  5. package/dist/Chart/formatters.d.ts.map +1 -1
  6. package/dist/Chart/formatters.js +16 -11
  7. package/dist/CircleCheckIndicator/CircleCheckIndicator.d.ts +27 -0
  8. package/dist/CircleCheckIndicator/CircleCheckIndicator.d.ts.map +1 -0
  9. package/dist/CircleCheckIndicator/CircleCheckIndicator.js +168 -0
  10. package/dist/CircleCheckIndicator/circleCheck.stylex.d.ts +80 -0
  11. package/dist/CircleCheckIndicator/circleCheck.stylex.d.ts.map +1 -0
  12. package/dist/CircleCheckIndicator/circleCheck.stylex.js +82 -0
  13. package/dist/CircleCheckIndicator/circleCheck.table.d.ts +76 -0
  14. package/dist/CircleCheckIndicator/circleCheck.table.d.ts.map +1 -0
  15. package/dist/CircleCheckIndicator/circleCheck.table.js +78 -0
  16. package/dist/CircleCheckIndicator/index.d.ts +5 -0
  17. package/dist/CircleCheckIndicator/index.d.ts.map +1 -0
  18. package/dist/CircleCheckIndicator/index.js +7 -0
  19. package/dist/CircularProgress/CircularProgress.d.ts +4 -2
  20. package/dist/CircularProgress/CircularProgress.d.ts.map +1 -1
  21. package/dist/CircularProgress/CircularProgress.js +19 -23
  22. package/dist/Comments/CommentParts.d.ts +1 -1
  23. package/dist/RefreshControl/RefreshPullRecognizer.d.ts +40 -0
  24. package/dist/RefreshControl/RefreshPullRecognizer.d.ts.map +1 -0
  25. package/dist/RefreshControl/RefreshPullRecognizer.js +90 -0
  26. package/dist/RefreshControl/index.d.ts +11 -0
  27. package/dist/RefreshControl/index.d.ts.map +1 -0
  28. package/dist/RefreshControl/index.js +13 -0
  29. package/dist/RefreshControl/refreshIndicator.d.ts +10 -0
  30. package/dist/RefreshControl/refreshIndicator.d.ts.map +1 -0
  31. package/dist/RefreshControl/refreshIndicator.js +12 -0
  32. package/dist/RefreshControl/refreshModel.d.ts +61 -0
  33. package/dist/RefreshControl/refreshModel.d.ts.map +1 -0
  34. package/dist/RefreshControl/refreshModel.js +116 -0
  35. package/dist/RefreshControl/refreshPull.d.ts +69 -0
  36. package/dist/RefreshControl/refreshPull.d.ts.map +1 -0
  37. package/dist/RefreshControl/refreshPull.js +159 -0
  38. package/dist/RefreshControl/refreshTouchController.d.ts +45 -0
  39. package/dist/RefreshControl/refreshTouchController.d.ts.map +1 -0
  40. package/dist/RefreshControl/refreshTouchController.js +701 -0
  41. package/dist/RefreshControl/refreshValues.d.ts +76 -0
  42. package/dist/RefreshControl/refreshValues.d.ts.map +1 -0
  43. package/dist/RefreshControl/refreshValues.js +80 -0
  44. package/dist/RefreshControl/useRefreshControl.d.ts +84 -0
  45. package/dist/RefreshControl/useRefreshControl.d.ts.map +1 -0
  46. package/dist/RefreshControl/useRefreshControl.js +207 -0
  47. package/dist/SVGIcon/variations.stylex.d.ts +1 -1
  48. package/dist/Sankey/SankeyChart.d.ts.map +1 -1
  49. package/dist/Sankey/SankeyChart.js +4 -9
  50. package/dist/Schedule/DayView.d.ts.map +1 -1
  51. package/dist/Schedule/DayView.js +7 -4
  52. package/dist/Schedule/ListView.d.ts.map +1 -1
  53. package/dist/Schedule/ListView.js +8 -9
  54. package/dist/Schedule/MonthlyView.d.ts.map +1 -1
  55. package/dist/Schedule/MonthlyView.js +25 -18
  56. package/dist/Schedule/TimeGridView.d.ts.map +1 -1
  57. package/dist/Schedule/TimeGridView.js +22 -16
  58. package/dist/Schedule/WeeklyView.d.ts.map +1 -1
  59. package/dist/Schedule/WeeklyView.js +4 -4
  60. package/dist/Schedule/shared.d.ts +22 -16
  61. package/dist/Schedule/shared.d.ts.map +1 -1
  62. package/dist/Schedule/shared.js +80 -62
  63. package/dist/index.d.ts +2 -0
  64. package/dist/index.d.ts.map +1 -1
  65. package/dist/index.js +9 -1
  66. package/dist/internal/useMotionEngine.d.ts +25 -0
  67. package/dist/internal/useMotionEngine.d.ts.map +1 -0
  68. package/dist/internal/useMotionEngine.js +42 -0
  69. package/dist/lab.css +29 -8
  70. package/dist/reorderStyles.d.ts +2 -2
  71. package/package.json +7 -6
  72. package/src/Chart/Chart.test.tsx +31 -0
  73. package/src/Chart/Chart.tsx +8 -7
  74. package/src/Chart/formatters.test.ts +36 -0
  75. package/src/Chart/formatters.ts +28 -16
  76. package/src/Chat/__tests__/ChatTypingIndicator.a11y.chromium.spec.ts +1 -1
  77. package/src/CircleCheckIndicator/CircleCheckIndicator.doc.mjs +215 -0
  78. package/src/CircleCheckIndicator/CircleCheckIndicator.test.tsx +134 -0
  79. package/src/CircleCheckIndicator/CircleCheckIndicator.tsx +248 -0
  80. package/src/CircleCheckIndicator/__tests__/CircleCheckIndicator.interaction.browser.spec.ts +567 -0
  81. package/src/CircleCheckIndicator/circleCheck.stylex.ts +93 -0
  82. package/src/CircleCheckIndicator/circleCheck.table.ts +78 -0
  83. package/src/CircleCheckIndicator/circleCheck.test.tsx +188 -0
  84. package/src/CircleCheckIndicator/index.ts +7 -0
  85. package/src/CircularProgress/CircularProgress.test.tsx +23 -0
  86. package/src/CircularProgress/CircularProgress.tsx +15 -42
  87. package/src/CircularProgress/__tests__/CircularProgress.a11y.chromium.spec.ts +1 -1
  88. package/src/CircularProgress/__tests__/CircularProgressMotion.a11y.chromium.spec.ts +1 -1
  89. package/src/RefreshControl/RefreshPullRecognizer.ts +104 -0
  90. package/src/RefreshControl/__tests__/RefreshControl.interaction.browser.spec.ts +1454 -0
  91. package/src/RefreshControl/index.ts +18 -0
  92. package/src/RefreshControl/refreshIndicator.ts +12 -0
  93. package/src/RefreshControl/refreshModel.test.ts +174 -0
  94. package/src/RefreshControl/refreshModel.ts +117 -0
  95. package/src/RefreshControl/refreshPull.test.ts +270 -0
  96. package/src/RefreshControl/refreshPull.ts +186 -0
  97. package/src/RefreshControl/refreshTouchController.ts +838 -0
  98. package/src/RefreshControl/refreshValues.ts +80 -0
  99. package/src/RefreshControl/useRefreshControl.test.tsx +1316 -0
  100. package/src/RefreshControl/useRefreshControl.ts +255 -0
  101. package/src/Sankey/SankeyChart.test.tsx +31 -0
  102. package/src/Sankey/SankeyChart.tsx +4 -15
  103. package/src/Schedule/DayView.tsx +4 -3
  104. package/src/Schedule/ListView.tsx +8 -14
  105. package/src/Schedule/MonthlyView.tsx +27 -18
  106. package/src/Schedule/Schedule.calendarSystems.test.tsx +317 -0
  107. package/src/Schedule/Schedule.doc.mjs +1 -1
  108. package/src/Schedule/Schedule.test.tsx +2 -2
  109. package/src/Schedule/TimeGridView.tsx +31 -9
  110. package/src/Schedule/WeeklyView.tsx +4 -6
  111. package/src/Schedule/__tests__/ScheduleEventPopover.a11y.chromium.spec.ts +1 -1
  112. package/src/Schedule/__tests__/ScheduleMonthChip.a11y.chromium.spec.ts +1 -1
  113. package/src/Schedule/__tests__/ScheduleMonthEventPopover.a11y.chromium.spec.ts +1 -1
  114. package/src/Schedule/__tests__/ScheduleMonthOverflow.a11y.chromium.spec.ts +1 -1
  115. package/src/Schedule/__tests__/ScheduleTimeDirection.a11y.chromium.spec.ts +1 -1
  116. package/src/Schedule/__tests__/ScheduleTimeGridGeometry.a11y.chromium.spec.ts +1 -1
  117. package/src/Schedule/__tests__/ScheduleTimeGridInitialPosition.a11y.chromium.spec.ts +1 -1
  118. package/src/Schedule/__tests__/ScheduleTimeGridLongSpan.a11y.chromium.spec.ts +1 -1
  119. package/src/Schedule/__tests__/ScheduleTimeGridMidnight.a11y.chromium.spec.ts +1 -1
  120. package/src/Schedule/__tests__/ScheduleTimeGridOverlap.a11y.chromium.spec.ts +1 -1
  121. package/src/Schedule/__tests__/ScheduleTimeGridSkippedMidnight.a11y.chromium.spec.ts +1 -1
  122. package/src/Schedule/shared.tsx +112 -68
  123. package/src/SelectableCardGroup/__tests__/SelectableCardGroupRadio.a11y.chromium.spec.ts +1 -1
  124. package/src/__tests__/ReorderGripPinchZoom.a11y.chromium.spec.ts +6 -1
  125. package/src/index.ts +13 -0
  126. package/src/internal/useMotionEngine.test.tsx +108 -0
  127. package/src/internal/useMotionEngine.ts +54 -0
@@ -36,7 +36,7 @@ export default function CommentThreadShowcase() {
36
36
  });
37
37
 
38
38
  return (
39
- <Card padding={0} width={340}>
39
+ <Card padding={0} width="100%" maxWidth={340}>
40
40
  <CommentThread
41
41
  comment={thread}
42
42
  currentUser={VIEWER}
@@ -1 +1 @@
1
- {"version":3,"file":"Chart.d.ts","sourceRoot":"","sources":["../../src/Chart/Chart.tsx"],"names":[],"mappings":"AAEA;;;;;;;;;;;GAWG;AAEH,OAAO,EAEL,KAAK,SAAS,EAMf,MAAM,OAAO,CAAC;AAMf,OAAO,KAAK,EAAC,WAAW,EAAa,MAAM,SAAS,CAAC;AAErD;;;;;GAKG;AACH,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAEjD,MAAM,WAAW,UAAU;IACzB,0DAA0D;IAC1D,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IAChC;;;OAGG;IACH,IAAI,EAAE,MAAM,CAAC;IACb;;;OAGG;IACH,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,qEAAqE;IACrE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,+BAA+B;IAC/B,MAAM,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IAC9B;;;;;OAKG;IACH,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB;;;;OAIG;IACH,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3B;;;;;OAKG;IACH,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3B;;;;OAIG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;;;;OAKG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,6CAA6C;IAC7C,QAAQ,EAAE,SAAS,CAAC;CACrB;AAgBD;;;;;;;;;;;GAWG;AACH,wBAAgB,KAAK,CAAC,EACpB,IAAI,EACJ,IAAI,EACJ,KAAK,EACL,MAAY,EACZ,MAAM,EAAE,cAAc,EACtB,SAAkB,EAClB,OAAO,EAAE,WAAW,EACpB,OAAO,EAAE,WAAW,EACpB,WAAmB,EACnB,KAAK,EACL,QAAQ,GACT,EAAE,UAAU,+BA+OZ"}
1
+ {"version":3,"file":"Chart.d.ts","sourceRoot":"","sources":["../../src/Chart/Chart.tsx"],"names":[],"mappings":"AAEA;;;;;;;;;;;GAWG;AAEH,OAAO,EAEL,KAAK,SAAS,EAMf,MAAM,OAAO,CAAC;AAMf,OAAO,KAAK,EAAC,WAAW,EAAa,MAAM,SAAS,CAAC;AAErD;;;;;GAKG;AACH,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAEjD,MAAM,WAAW,UAAU;IACzB,0DAA0D;IAC1D,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IAChC;;;OAGG;IACH,IAAI,EAAE,MAAM,CAAC;IACb;;;OAGG;IACH,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,qEAAqE;IACrE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,+BAA+B;IAC/B,MAAM,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IAC9B;;;;;OAKG;IACH,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB;;;;OAIG;IACH,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3B;;;;;OAKG;IACH,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3B;;;;OAIG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;;;;OAKG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,6CAA6C;IAC7C,QAAQ,EAAE,SAAS,CAAC;CACrB;AAgBD;;;;;;;;;;;GAWG;AACH,wBAAgB,KAAK,CAAC,EACpB,IAAI,EACJ,IAAI,EACJ,KAAK,EACL,MAAY,EACZ,MAAM,EAAE,cAAc,EACtB,SAAkB,EAClB,OAAO,EAAE,WAAW,EACpB,OAAO,EAAE,WAAW,EACpB,WAAmB,EACnB,KAAK,EACL,QAAQ,GACT,EAAE,UAAU,+BAgPZ"}
@@ -73,18 +73,19 @@ export function Chart({
73
73
  const containerRef = useRef(null);
74
74
  const svgRef = useRef(null);
75
75
  const [containerWidth, setContainerWidth] = useState(0);
76
- useLayoutEffect(() => {
77
- if (!containerRef.current) {
78
- return;
79
- }
76
+ const attachContainer = useCallback(container => {
77
+ containerRef.current = container;
80
78
  const observer = new ResizeObserver(entries => {
81
79
  const entry = entries[0];
82
80
  if (entry) {
83
81
  setContainerWidth(entry.contentRect.width);
84
82
  }
85
83
  });
86
- observer.observe(containerRef.current);
87
- return () => observer.disconnect();
84
+ observer.observe(container);
85
+ return () => {
86
+ observer.disconnect();
87
+ containerRef.current = null;
88
+ };
88
89
  }, []);
89
90
 
90
91
  // Block scroll/zoom on the container when interactive.
@@ -236,7 +237,7 @@ export function Chart({
236
237
  const accessibleLabel = label ?? `Chart of ${yKeys.join(', ')} by ${xKey}`;
237
238
  const showDataTable = data.length > 0 && data.length * Math.max(yKeys.length, 1) <= MAX_TABLE_POINTS;
238
239
  return /*#__PURE__*/_jsxs("div", {
239
- ref: containerRef,
240
+ ref: attachContainer,
240
241
  style: containerStyle,
241
242
  children: [containerWidth > 0 && /*#__PURE__*/_jsxs("svg", {
242
243
  ref: svgRef,
@@ -1,10 +1,11 @@
1
1
  /**
2
2
  * @file formatters.ts
3
- * @input Tick values and optional BCP 47 locale tags
3
+ * @input Tick values, optional BCP 47 locale tags, and for dates an optional
4
+ * calendar
4
5
  * @output Built-in tick format utilities for common data types
5
6
  * @position Utility; consumed by ChartAxis via tickFormat prop
6
7
  */
7
- import type { Locale } from '@astryxdesign/core/i18n';
8
+ import type { CalendarSystem, Locale } from '@astryxdesign/core/i18n';
8
9
  /**
9
10
  * Compact number formatter (e.g. 1200 → "1.2K", 1500000 → "1.5M")
10
11
  */
@@ -25,11 +26,13 @@ export declare function currency(symbol?: string, locale?: Locale): (value: unkn
25
26
  */
26
27
  export declare function percent(value: unknown): string;
27
28
  /**
28
- * Date formatter — short date (e.g. "Jan 5", "Mar 12")
29
+ * Date formatter — short date (e.g. "Jan 5", "Mar 12"), in `calendar`
30
+ * (Gregorian by default)
29
31
  */
30
- export declare function shortDate(value: unknown, locale?: Locale): string;
32
+ export declare function shortDate(value: unknown, locale?: Locale, calendar?: CalendarSystem): string;
31
33
  /**
32
- * Date formatter — month/year (e.g. "Jan 2024", "Mar 2025")
34
+ * Date formatter — month/year (e.g. "Jan 2024", "Mar 2025"), in `calendar`
35
+ * (Gregorian by default)
33
36
  */
34
- export declare function monthYear(value: unknown, locale?: Locale): string;
37
+ export declare function monthYear(value: unknown, locale?: Locale, calendar?: CalendarSystem): string;
35
38
  //# sourceMappingURL=formatters.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"formatters.d.ts","sourceRoot":"","sources":["../../src/Chart/formatters.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AAEH,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,yBAAyB,CAAC;AAEpD;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAepD;AAED;;;;;;;;;GASG;AACH,wBAAgB,QAAQ,CACtB,MAAM,SAAM,EACZ,MAAM,GAAE,MAAa,GACpB,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,CAiB5B;AAQD;;GAEG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAM9C;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,GAAE,MAAa,GAAG,MAAM,CAUvE;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,GAAE,MAAa,GAAG,MAAM,CAUvE"}
1
+ {"version":3,"file":"formatters.d.ts","sourceRoot":"","sources":["../../src/Chart/formatters.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAC,cAAc,EAAE,MAAM,EAAC,MAAM,yBAAyB,CAAC;AAGpE;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAepD;AAED;;;;;;;;;GASG;AACH,wBAAgB,QAAQ,CACtB,MAAM,SAAM,EACZ,MAAM,GAAE,MAAa,GACpB,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,CAiB5B;AAQD;;GAEG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAM9C;AAED;;;GAGG;AACH,wBAAgB,SAAS,CACvB,KAAK,EAAE,OAAO,EACd,MAAM,GAAE,MAAa,EACrB,QAAQ,GAAE,cAA0B,GACnC,MAAM,CAUR;AAED;;;GAGG;AACH,wBAAgB,SAAS,CACvB,KAAK,EAAE,OAAO,EACd,MAAM,GAAE,MAAa,EACrB,QAAQ,GAAE,cAA0B,GACnC,MAAM,CAUR"}
@@ -2,11 +2,14 @@
2
2
 
3
3
  /**
4
4
  * @file formatters.ts
5
- * @input Tick values and optional BCP 47 locale tags
5
+ * @input Tick values, optional BCP 47 locale tags, and for dates an optional
6
+ * calendar
6
7
  * @output Built-in tick format utilities for common data types
7
8
  * @position Utility; consumed by ChartAxis via tickFormat prop
8
9
  */
9
10
 
11
+ import { plainDateFormat, plainDateFromDate } from '@astryxdesign/core/utils';
12
+
10
13
  /**
11
14
  * Compact number formatter (e.g. 1200 → "1.2K", 1500000 → "1.5M")
12
15
  */
@@ -74,31 +77,33 @@ export function percent(value) {
74
77
  }
75
78
 
76
79
  /**
77
- * Date formatter — short date (e.g. "Jan 5", "Mar 12")
80
+ * Date formatter — short date (e.g. "Jan 5", "Mar 12"), in `calendar`
81
+ * (Gregorian by default)
78
82
  */
79
- export function shortDate(value, locale = 'en') {
83
+ export function shortDate(value, locale = 'en', calendar = 'gregory') {
80
84
  const d = value instanceof Date ? value : new Date(Number(value));
81
85
  if (isNaN(d.getTime())) {
82
86
  return String(value);
83
87
  }
84
- return new Intl.DateTimeFormat(locale, {
88
+ return plainDateFormat(plainDateFromDate(d), {
85
89
  month: 'short',
86
90
  day: 'numeric',
87
- calendar: 'gregory'
88
- }).format(d);
91
+ calendar
92
+ }, locale);
89
93
  }
90
94
 
91
95
  /**
92
- * Date formatter — month/year (e.g. "Jan 2024", "Mar 2025")
96
+ * Date formatter — month/year (e.g. "Jan 2024", "Mar 2025"), in `calendar`
97
+ * (Gregorian by default)
93
98
  */
94
- export function monthYear(value, locale = 'en') {
99
+ export function monthYear(value, locale = 'en', calendar = 'gregory') {
95
100
  const d = value instanceof Date ? value : new Date(Number(value));
96
101
  if (isNaN(d.getTime())) {
97
102
  return String(value);
98
103
  }
99
- return new Intl.DateTimeFormat(locale, {
104
+ return plainDateFormat(plainDateFromDate(d), {
100
105
  month: 'short',
101
106
  year: 'numeric',
102
- calendar: 'gregory'
103
- }).format(d);
107
+ calendar
108
+ }, locale);
104
109
  }
@@ -0,0 +1,27 @@
1
+ import type { IndicatorProps } from '@astryxdesign/core/Indicator';
2
+ /**
3
+ * The iOS multiple-selection mark. It shows an empty circle when unchecked
4
+ * and a filled circle with a checkmark when checked. The partial state fills
5
+ * the circle with a bar.
6
+ *
7
+ * Decorative and non-interactive, like every indicator: it renders
8
+ * `aria-hidden` and owns no input, role, or focus behavior. Map it to
9
+ * `checkbox` in a theme, and every CheckboxInput and CheckboxList draws it.
10
+ * The owning control keeps its semantics and paints its focus ring on the
11
+ * circle. Its colours fade over the theme duration on every pointer, and
12
+ * change at once under Reduce Motion. It draws the circle everywhere, so
13
+ * map it only in a theme meant for iOS.
14
+ *
15
+ * @example
16
+ * ```
17
+ * const theme = defineTheme({
18
+ * name: 'circle-checks',
19
+ * indicators: {checkbox: CircleCheckIndicator},
20
+ * });
21
+ * ```
22
+ */
23
+ export declare function CircleCheckIndicator({ state, size, isDisabled, children, ref, className, style, xstyle, ...rest }: IndicatorProps<'multiSelection'>): import("react").JSX.Element;
24
+ export declare namespace CircleCheckIndicator {
25
+ var displayName: string;
26
+ }
27
+ //# sourceMappingURL=CircleCheckIndicator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CircleCheckIndicator.d.ts","sourceRoot":"","sources":["../../src/CircleCheckIndicator/CircleCheckIndicator.tsx"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,8BAA8B,CAAC;AA4HjE;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,oBAAoB,CAAC,EACnC,KAAK,EACL,IAAW,EACX,UAAkB,EAClB,QAAQ,EACR,GAAG,EACH,SAAS,EACT,KAAK,EACL,MAAM,EACN,GAAG,IAAI,EACR,EAAE,cAAc,CAAC,gBAAgB,CAAC,+BA2ElC;yBArFe,oBAAoB"}
@@ -0,0 +1,168 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file CircleCheckIndicator.tsx
5
+ * @input Indicator state props, the theme's colour and radius tokens, Core's
6
+ * indicator press marker, and the circle's styles (circleCheck.stylex.ts)
7
+ * @output Exports CircleCheckIndicator, the iOS multiple-selection mark
8
+ * @position Lab. A multiSelection-family indicator that a theme maps to
9
+ * `checkbox`
10
+ *
11
+ * SYNC: When modified, update CircleCheckIndicator.doc.mjs,
12
+ * CircleCheckIndicator.test.tsx, index.ts and the story.
13
+ */
14
+
15
+ import * as stylex from '@stylexjs/stylex';
16
+ import '@astryxdesign/core/Indicator/indicator.markers.stylex';
17
+ import { indicatorScope } from '@astryxdesign/core/Indicator/indicator.markers.stylex';
18
+ import { indicatorPressScope } from '@astryxdesign/core/internal/indicatorPress.stylex';
19
+ import '@astryxdesign/core/theme/tokens.stylex';
20
+ import { colorVars, radiusVars } from '@astryxdesign/core/theme/tokens.stylex';
21
+ import { isRenderable, mergeProps, themeProps } from '@astryxdesign/core/utils';
22
+ import { circleCheckMotionStyles, circleCheckSizeStyles } from "./circleCheck.stylex.js";
23
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
24
+ const styles = {
25
+ circle: {
26
+ kB7OPa: "x9f619",
27
+ k1xSpc: "x78zum5",
28
+ kGNEyG: "x6s0dn4",
29
+ kjj79g: "xl56j7k",
30
+ kmuXW: "x2lah0s",
31
+ kaIpWk: "xjspbzw",
32
+ ksu8eU: "xng3xce xx61lck",
33
+ kMzoRj: "xc342km x13rsnn2",
34
+ kVAM5u: "x9r1u3d x1w1tqly",
35
+ $$css: true
36
+ },
37
+ unchecked: {
38
+ kGVxlE: "x6a3is4 xnv7v5x",
39
+ kWkggS: "xjbqb8w",
40
+ $$css: true
41
+ },
42
+ checked: {
43
+ kMwMTN: "x17wrial",
44
+ kGVxlE: "x1gnnqk1",
45
+ kWkggS: "x1ewilqj x17srpfb",
46
+ $$css: true
47
+ },
48
+ disabled: {
49
+ kSiTet: "xbyyjgo",
50
+ $$css: true
51
+ },
52
+ ownPress: {
53
+ kVAEAm: "x1n2onr6",
54
+ k5JduY: "x1s928wv",
55
+ kwXMNM: "x1j6awrg",
56
+ kv0HGH: "xarstr8",
57
+ kUfP38: "xq94oqs",
58
+ kloYau: "x2q1x1w",
59
+ ks3ayO: "xyhc2n1 xzywxsk x1gybruy",
60
+ kNctxI: "x1ygld8r",
61
+ $$css: true
62
+ },
63
+ checkmark: {
64
+ k1xSpc: "x1s85apg",
65
+ kmuXW: "x2lah0s",
66
+ kVQacm: "x1rea2x4",
67
+ kMwMTN: "x17wrial xs5hli",
68
+ $$css: true
69
+ },
70
+ checkmarkVisible: {
71
+ k1xSpc: "x1lliihq",
72
+ $$css: true
73
+ },
74
+ bar: {
75
+ k1xSpc: "x1s85apg",
76
+ kmuXW: "x2lah0s",
77
+ kWkggS: "x1azo05 xwvh9j7",
78
+ kaIpWk: "xjspbzw",
79
+ $$css: true
80
+ },
81
+ barVisible: {
82
+ k1xSpc: "x1lliihq",
83
+ $$css: true
84
+ }
85
+ };
86
+ const CIRCLE = {
87
+ sm: circleCheckSizeStyles.smCircle,
88
+ md: circleCheckSizeStyles.mdCircle
89
+ };
90
+ const CHECK = {
91
+ sm: circleCheckSizeStyles.smCheck,
92
+ md: circleCheckSizeStyles.mdCheck
93
+ };
94
+ const BAR = {
95
+ sm: circleCheckSizeStyles.smBar,
96
+ md: circleCheckSizeStyles.mdBar
97
+ };
98
+
99
+ /**
100
+ * The iOS multiple-selection mark. It shows an empty circle when unchecked
101
+ * and a filled circle with a checkmark when checked. The partial state fills
102
+ * the circle with a bar.
103
+ *
104
+ * Decorative and non-interactive, like every indicator: it renders
105
+ * `aria-hidden` and owns no input, role, or focus behavior. Map it to
106
+ * `checkbox` in a theme, and every CheckboxInput and CheckboxList draws it.
107
+ * The owning control keeps its semantics and paints its focus ring on the
108
+ * circle. Its colours fade over the theme duration on every pointer, and
109
+ * change at once under Reduce Motion. It draws the circle everywhere, so
110
+ * map it only in a theme meant for iOS.
111
+ *
112
+ * @example
113
+ * ```
114
+ * const theme = defineTheme({
115
+ * name: 'circle-checks',
116
+ * indicators: {checkbox: CircleCheckIndicator},
117
+ * });
118
+ * ```
119
+ */
120
+ export function CircleCheckIndicator({
121
+ state,
122
+ size = 'md',
123
+ isDisabled = false,
124
+ children,
125
+ ref,
126
+ className,
127
+ style,
128
+ xstyle,
129
+ ...rest
130
+ }) {
131
+ const isChecked = state === 'checked';
132
+ const isIndeterminate = state === 'indeterminate';
133
+ const isFilled = isChecked || isIndeterminate;
134
+ return /*#__PURE__*/_jsx("span", {
135
+ ...rest,
136
+ ref: ref,
137
+ "aria-hidden": "true",
138
+ ...mergeProps(themeProps('circle-check-indicator', {
139
+ size,
140
+ checked: isChecked ? 'checked' : isIndeterminate ? 'indeterminate' : null,
141
+ disabled: isDisabled ? 'disabled' : null
142
+ }), stylex.props(
143
+ // Marks the circle as painting its own press (styles.ownPress), so
144
+ // the host leaves its square layer off.
145
+ indicatorPressScope, styles.circle, !isDisabled && styles.ownPress, circleCheckMotionStyles.mark, CIRCLE[size], isFilled ? styles.checked : styles.unchecked, isDisabled && styles.disabled, xstyle), className, style),
146
+ children: isRenderable(children) ? children : /*#__PURE__*/_jsxs(_Fragment, {
147
+ children: [/*#__PURE__*/_jsx("svg", {
148
+ viewBox: "0 0 10 10",
149
+ ...mergeProps(themeProps('circle-check-indicator-check', {
150
+ size
151
+ }), stylex.props(styles.checkmark, CHECK[size], isChecked && styles.checkmarkVisible)),
152
+ children: /*#__PURE__*/_jsx("path", {
153
+ d: "M0.75 5.25L3.75 9.25L9.25 0.75",
154
+ stroke: "currentColor",
155
+ strokeWidth: "1.5",
156
+ fill: "none",
157
+ strokeLinecap: "round",
158
+ strokeLinejoin: "round"
159
+ })
160
+ }), /*#__PURE__*/_jsx("span", {
161
+ ...mergeProps(themeProps('circle-check-indicator-dash', {
162
+ size
163
+ }), stylex.props(styles.bar, BAR[size], isIndeterminate && styles.barVisible))
164
+ })]
165
+ })
166
+ });
167
+ }
168
+ CircleCheckIndicator.displayName = 'CircleCheckIndicator';
@@ -0,0 +1,80 @@
1
+ /**
2
+ * @file circleCheck.stylex.ts
3
+ * @input The theme's duration and easing tokens
4
+ * @output Exports `circleCheckConsts`, the build-time mirror of
5
+ * circleCheck.table.ts, and the circle's motion and size styles
6
+ * @position Internal to CircleCheckIndicator
7
+ *
8
+ * StyleX cannot read the table at build time, so these constants mirror it,
9
+ * and circleCheck.test.tsx fails if they drift. StyleX inlines a
10
+ * `defineConsts` value only in its own file, so the styles live here too.
11
+ *
12
+ * SYNC: When modified, update circleCheck.test.tsx.
13
+ */
14
+ import * as stylex from '@stylexjs/stylex';
15
+ /**
16
+ * `md` is UIKit's circle at the Large text size, and `sm` at xSmall. Two `sm`
17
+ * values derive from their Large proportions: the check stroke and its offset.
18
+ * The partial state's bar has no UIKit counterpart, so it takes the
19
+ * checkmark's width and stroke.
20
+ */
21
+ export declare const circleCheckConsts: {
22
+ /** `circleCheckTable.large.diameter`. */
23
+ mdDiameter: string;
24
+ /** `circleCheckTable.large.stroke`. */
25
+ mdStroke: string;
26
+ /** `circleCheckTable.large.checkSize`. */
27
+ mdCheckSize: string;
28
+ /** `circleCheckTable.large.checkStroke`. */
29
+ mdCheckStroke: string;
30
+ /** `circleCheckTable.large.checkOffsetY`. */
31
+ mdCheckOffsetY: string;
32
+ /** `circleCheckTable.xSmall.diameter`. */
33
+ smDiameter: string;
34
+ /** `circleCheckTable.xSmall.stroke`. */
35
+ smStroke: string;
36
+ /** `circleCheckTable.xSmall.checkSize`. */
37
+ smCheckSize: string;
38
+ /** Derived: the Large check stroke, scaled by the check size (9 → 8). */
39
+ smCheckStroke: string;
40
+ /** Derived: the Large offset, scaled by the diameter (21.8 → 18). */
41
+ smCheckOffsetY: string;
42
+ };
43
+ export declare const circleCheckMotionStyles: Readonly<{
44
+ readonly mark: Readonly<{
45
+ readonly transitionProperty: stylex.StyleXClassNameFor<"transitionProperty", "background-color, box-shadow">;
46
+ readonly transitionDuration: stylex.StyleXClassNameFor<"transitionDuration", "175ms" | "0s">;
47
+ readonly transitionTimingFunction: stylex.StyleXClassNameFor<"transitionTimingFunction", "cubic-bezier(0.24, 1, 0.4, 1)">;
48
+ }>;
49
+ }>;
50
+ export declare const circleCheckSizeStyles: Readonly<{
51
+ readonly mdCircle: Readonly<{
52
+ readonly width: stylex.StyleXClassNameFor<"width", string>;
53
+ readonly height: stylex.StyleXClassNameFor<"height", string>;
54
+ readonly '--_circle-stroke': stylex.StyleXClassNameFor<"--_circle-stroke", string>;
55
+ }>;
56
+ readonly smCircle: Readonly<{
57
+ readonly width: stylex.StyleXClassNameFor<"width", string>;
58
+ readonly height: stylex.StyleXClassNameFor<"height", string>;
59
+ readonly '--_circle-stroke': stylex.StyleXClassNameFor<"--_circle-stroke", string>;
60
+ }>;
61
+ readonly mdCheck: Readonly<{
62
+ readonly width: stylex.StyleXClassNameFor<"width", string>;
63
+ readonly height: stylex.StyleXClassNameFor<"height", string>;
64
+ readonly translate: stylex.StyleXClassNameFor<"translate", `0 ${string}`>;
65
+ }>;
66
+ readonly smCheck: Readonly<{
67
+ readonly width: stylex.StyleXClassNameFor<"width", string>;
68
+ readonly height: stylex.StyleXClassNameFor<"height", string>;
69
+ readonly translate: stylex.StyleXClassNameFor<"translate", `0 ${string}`>;
70
+ }>;
71
+ readonly mdBar: Readonly<{
72
+ readonly width: stylex.StyleXClassNameFor<"width", string>;
73
+ readonly height: stylex.StyleXClassNameFor<"height", string>;
74
+ }>;
75
+ readonly smBar: Readonly<{
76
+ readonly width: stylex.StyleXClassNameFor<"width", string>;
77
+ readonly height: stylex.StyleXClassNameFor<"height", string>;
78
+ }>;
79
+ }>;
80
+ //# sourceMappingURL=circleCheck.stylex.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"circleCheck.stylex.d.ts","sourceRoot":"","sources":["../../src/CircleCheckIndicator/circleCheck.stylex.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,MAAM,MAAM,kBAAkB,CAAC;AAG3C;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB;IAC5B,yCAAyC;;IAEzC,uCAAuC;;IAEvC,0CAA0C;;IAE1C,4CAA4C;;IAE5C,6CAA6C;;IAE7C,0CAA0C;;IAE1C,wCAAwC;;IAExC,2CAA2C;;IAE3C,yEAAyE;;IAEzE,qEAAqE;;CAErE,CAAC;AAEH,eAAO,MAAM,uBAAuB;;;;;;EAUlC,CAAC;AAEH,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgChC,CAAC"}
@@ -0,0 +1,82 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file circleCheck.stylex.ts
5
+ * @input The theme's duration and easing tokens
6
+ * @output Exports `circleCheckConsts`, the build-time mirror of
7
+ * circleCheck.table.ts, and the circle's motion and size styles
8
+ * @position Internal to CircleCheckIndicator
9
+ *
10
+ * StyleX cannot read the table at build time, so these constants mirror it,
11
+ * and circleCheck.test.tsx fails if they drift. StyleX inlines a
12
+ * `defineConsts` value only in its own file, so the styles live here too.
13
+ *
14
+ * SYNC: When modified, update circleCheck.test.tsx.
15
+ */
16
+
17
+ import * as stylex from '@stylexjs/stylex';
18
+ import '@astryxdesign/core/theme/tokens.stylex';
19
+ import { durationVars, easeVars } from '@astryxdesign/core/theme/tokens.stylex';
20
+
21
+ /**
22
+ * `md` is UIKit's circle at the Large text size, and `sm` at xSmall. Two `sm`
23
+ * values derive from their Large proportions: the check stroke and its offset.
24
+ * The partial state's bar has no UIKit counterpart, so it takes the
25
+ * checkmark's width and stroke.
26
+ */
27
+ export const circleCheckConsts = {
28
+ mdDiameter: "21.8px",
29
+ mdStroke: "1.54px",
30
+ mdCheckSize: "9px",
31
+ mdCheckStroke: "1.35px",
32
+ mdCheckOffsetY: "1px",
33
+ smDiameter: "18px",
34
+ smStroke: "1.27px",
35
+ smCheckSize: "8px",
36
+ smCheckStroke: "1.2px",
37
+ smCheckOffsetY: "0.83px"
38
+ };
39
+ export const circleCheckMotionStyles = {
40
+ mark: {
41
+ k1ekBW: "x106061f",
42
+ kIyJzY: "xuedmi6 x12w9bfk",
43
+ kAMwcw: "xlr8y92",
44
+ $$css: true
45
+ }
46
+ };
47
+ export const circleCheckSizeStyles = {
48
+ mdCircle: {
49
+ kzqmXN: "x9ohm1z",
50
+ kZKoxP: "xxqnphv",
51
+ "--_circle-stroke": "x132qrjd",
52
+ $$css: true
53
+ },
54
+ smCircle: {
55
+ kzqmXN: "x1xp8n7a",
56
+ kZKoxP: "xmix8c7",
57
+ "--_circle-stroke": "xrx6na1",
58
+ $$css: true
59
+ },
60
+ mdCheck: {
61
+ kzqmXN: "x1wc42o8",
62
+ kZKoxP: "xegnrdp",
63
+ kIY38u: "x1qnfge9",
64
+ $$css: true
65
+ },
66
+ smCheck: {
67
+ kzqmXN: "x1xc55vz",
68
+ kZKoxP: "xdk7pt",
69
+ kIY38u: "x195poti",
70
+ $$css: true
71
+ },
72
+ mdBar: {
73
+ kzqmXN: "x1wc42o8",
74
+ kZKoxP: "x1rly2rj",
75
+ $$css: true
76
+ },
77
+ smBar: {
78
+ kzqmXN: "x1xc55vz",
79
+ kZKoxP: "x188kx65",
80
+ $$css: true
81
+ }
82
+ };
@@ -0,0 +1,76 @@
1
+ /**
2
+ * @file circleCheck.table.ts
3
+ * @input UIKit measurements on the iOS 26.2 simulator
4
+ * @output Exports `circleCheckTable`: the circle's geometry at two text sizes
5
+ * (pt)
6
+ * @position Internal to CircleCheckIndicator; circleCheck.stylex.ts mirrors it
7
+ *
8
+ * The circle is a Lab component, so its measurements live beside it. Core's
9
+ * UIKit table holds only what Core's own components play.
10
+ */
11
+ /**
12
+ * UIKit's multiple-selection circle, in a table row's edit mode
13
+ * (UITableViewCellEditControl) and a list's `.multiselect()` accessory. It is
14
+ * the SF Symbols `circle` and `checkmark.circle.fill` in a 25.67 pt control at
15
+ * the Large text size. It grows and thickens with the text size. Lengths are
16
+ * in pt.
17
+ */
18
+ export declare const circleCheckTable: {
19
+ /** At the Large text size, the default. */
20
+ readonly large: {
21
+ /**
22
+ * The circle's outer diameter.
23
+ * @source measured: UIKit lab (injected host app), iOS 26.2 simulator,
24
+ * iPhone 17 Pro, view frames and 3× pixels read (table edit mode and
25
+ * list multiselect, light and dark), Oct 24 2026
26
+ */
27
+ readonly diameter: 21.8;
28
+ /**
29
+ * The empty circle's stroke; its interior is clear.
30
+ * @source measured: UIKit lab (injected host app), iOS 26.2 simulator,
31
+ * iPhone 17 Pro, 3× pixels read, Oct 24 2026
32
+ */
33
+ readonly stroke: 1.54;
34
+ /**
35
+ * The white checkmark's ink box in the filled circle, square.
36
+ * @source measured: UIKit lab (injected host app), iOS 26.2 simulator,
37
+ * iPhone 17 Pro, 3× pixels read, Oct 24 2026
38
+ */
39
+ readonly checkSize: 9;
40
+ /**
41
+ * The checkmark's stroke.
42
+ * @source measured: UIKit lab (injected host app), iOS 26.2 simulator,
43
+ * iPhone 17 Pro, 3× pixels read, Oct 24 2026
44
+ */
45
+ readonly checkStroke: 1.35;
46
+ /**
47
+ * How far below the circle's centre the checkmark's ink sits.
48
+ * @source measured: UIKit lab (injected host app), iOS 26.2 simulator,
49
+ * iPhone 17 Pro, 3× pixels read, Oct 24 2026
50
+ */
51
+ readonly checkOffsetY: 1;
52
+ };
53
+ /** At the xSmall text size, the smallest. */
54
+ readonly xSmall: {
55
+ /**
56
+ * The circle's outer diameter.
57
+ * @source measured: UIKit lab (injected host app), iOS 26.2 simulator,
58
+ * iPhone 17 Pro, view frames and 3× pixels read at the xSmall text
59
+ * size, Oct 24 2026
60
+ */
61
+ readonly diameter: 18;
62
+ /**
63
+ * The empty circle's stroke.
64
+ * @source measured: UIKit lab (injected host app), iOS 26.2 simulator,
65
+ * iPhone 17 Pro, 3× pixels read at the xSmall text size, Oct 24 2026
66
+ */
67
+ readonly stroke: 1.27;
68
+ /**
69
+ * The checkmark's ink box, square.
70
+ * @source measured: UIKit lab (injected host app), iOS 26.2 simulator,
71
+ * iPhone 17 Pro, 3× pixels read at the xSmall text size, Oct 24 2026
72
+ */
73
+ readonly checkSize: 8;
74
+ };
75
+ };
76
+ //# sourceMappingURL=circleCheck.table.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"circleCheck.table.d.ts","sourceRoot":"","sources":["../../src/CircleCheckIndicator/circleCheck.table.ts"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AAEH;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB;IAC3B,2CAA2C;;QAEzC;;;;;WAKG;;QAEH;;;;WAIG;;QAEH;;;;WAIG;;QAEH;;;;WAIG;;QAEH;;;;WAIG;;;IAGL,6CAA6C;;QAE3C;;;;;WAKG;;QAEH;;;;WAIG;;QAEH;;;;WAIG;;;CAGG,CAAC"}