@astryxdesign/lab 0.7.5-canary.d76a228 → 0.7.5-canary.dbcfc30

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 (40) hide show
  1. package/dist/Chat/ChatUnreadDivider.js +1 -1
  2. package/dist/CircularProgress/CircularProgress.js +3 -3
  3. package/dist/DiffViewer/DiffViewer.d.ts +15 -4
  4. package/dist/DiffViewer/DiffViewer.d.ts.map +1 -1
  5. package/dist/DiffViewer/DiffViewer.js +31 -6
  6. package/dist/ListInput/ListInput.d.ts.map +1 -1
  7. package/dist/ListInput/ListInput.js +19 -0
  8. package/dist/LogStream/LogStream.d.ts.map +1 -1
  9. package/dist/LogStream/LogStream.js +2 -2
  10. package/dist/SVGIcon/SVGIcon.js +3 -3
  11. package/dist/Stat/Stat.js +2 -2
  12. package/dist/TransferList/TransferList.d.ts.map +1 -1
  13. package/dist/TransferList/TransferList.js +20 -0
  14. package/dist/lab.css +10 -9
  15. package/dist/reorderStyles.d.ts +2 -2
  16. package/dist/reorderStyles.d.ts.map +1 -1
  17. package/dist/reorderStyles.js +2 -2
  18. package/package.json +7 -7
  19. package/src/Chat/ChatUnreadDivider.tsx +1 -1
  20. package/src/Chat/__tests__/ChatTypingIndicator.a11y.chromium.spec.ts +1 -0
  21. package/src/CircularProgress/CircularProgress.tsx +3 -3
  22. package/src/CircularProgress/__tests__/CircularProgress.a11y.chromium.spec.ts +1 -0
  23. package/src/Comments/Comments.test.tsx +10 -4
  24. package/src/DiffViewer/DiffViewer.doc.mjs +8 -2
  25. package/src/DiffViewer/DiffViewer.test.tsx +71 -0
  26. package/src/DiffViewer/DiffViewer.tsx +52 -9
  27. package/src/InfoTip/InfoTip.test.tsx +9 -4
  28. package/src/ListInput/ListInput.test.tsx +43 -3
  29. package/src/ListInput/ListInput.tsx +23 -0
  30. package/src/LogStream/LogStream.doc.mjs +1 -1
  31. package/src/LogStream/LogStream.tsx +3 -5
  32. package/src/MobileTokenizer/MobileTokenizer.test.tsx +12 -3
  33. package/src/SVGIcon/SVGIcon.tsx +3 -3
  34. package/src/Stat/Stat.tsx +2 -2
  35. package/src/TransferList/TransferList.composition.test.tsx +4 -4
  36. package/src/TransferList/TransferList.test.tsx +36 -0
  37. package/src/TransferList/TransferList.tsx +24 -0
  38. package/src/TransferList/TransferListSelector.test.tsx +4 -4
  39. package/src/__tests__/ReorderGripPinchZoom.a11y.chromium.spec.ts +178 -0
  40. package/src/reorderStyles.ts +7 -2
@@ -74,7 +74,7 @@ export function ChatUnreadDivider({
74
74
  }
75
75
  }), /*#__PURE__*/_jsx("span", {
76
76
  ...{
77
- className: "x2lah0s x9ynric x141an7d x1lvx875 xjt36v0 x1ltkj2j"
77
+ className: "x2lah0s x9ynric x141an7d x1lvx875 x1wj83wy x1ltkj2j"
78
78
  },
79
79
  children: label
80
80
  })]
@@ -106,15 +106,15 @@ const variantStyles = {
106
106
  $$css: true
107
107
  },
108
108
  success: {
109
- kjVXCG: "x8y33gb",
109
+ kjVXCG: "x88o7k4",
110
110
  $$css: true
111
111
  },
112
112
  warning: {
113
- kjVXCG: "x9ezeq1",
113
+ kjVXCG: "x16d96h5",
114
114
  $$css: true
115
115
  },
116
116
  error: {
117
- kjVXCG: "x1vco6zm",
117
+ kjVXCG: "xqb94c9",
118
118
  $$css: true
119
119
  },
120
120
  neutral: {
@@ -1,5 +1,6 @@
1
1
  import { type MouseEvent, type ReactNode, type Ref } from 'react';
2
2
  import type { BaseProps } from '@astryxdesign/core';
3
+ import { type CodeLanguage } from '@astryxdesign/core/CodeBlock';
3
4
  import { type SyntaxThemeDefinition } from '@astryxdesign/core/theme/syntax';
4
5
  import type { DiffViewerFile, DiffViewerLineRef } from './diffTypes.js';
5
6
  /** How hunks are laid out: one column, or old and new side by side. */
@@ -34,10 +35,20 @@ export interface DiffViewerProps extends BaseProps<HTMLDivElement> {
34
35
  */
35
36
  viewMode?: DiffViewerViewMode;
36
37
  /**
37
- * Syntax-highlighting language. Defaults to one inferred from the file's
38
- * extension; unknown extensions render as plain text.
38
+ * Syntax-highlighting language: a built-in identifier such as `'rust'`, or
39
+ * a language value — a module imported on its own, such as `graphql` from
40
+ * `@astryxdesign/core/CodeBlock/languages/graphql`, or one made with
41
+ * `createCodeLanguage`. Defaults to one inferred from the file's name or
42
+ * extension among the built-ins and `codeLanguages`; an unmatched file
43
+ * renders as plain text.
39
44
  */
40
- language?: string;
45
+ language?: string | CodeLanguage;
46
+ /**
47
+ * Language values the file's name or extension may infer, such as
48
+ * `[graphql, dockerfile]`; a later entry wins. Pass the same list to every
49
+ * DiffViewer on a review page.
50
+ */
51
+ codeLanguages?: ReadonlyArray<CodeLanguage>;
41
52
  /**
42
53
  * Show the old and new line-number gutters.
43
54
  * @default true
@@ -125,7 +136,7 @@ export interface DiffViewerProps extends BaseProps<HTMLDivElement> {
125
136
  * <DiffViewer file={file} viewMode="split" />
126
137
  * ```
127
138
  */
128
- export declare function DiffViewer({ ref, file, viewMode, language: languageProp, hasLineNumbers, isWrapped, changeIndicator, inlineHighlight, hasChangeBackground, isCollapsible, isCollapsed: isCollapsedProp, defaultIsCollapsed, onCollapsedChange, headerEnd, renderLineAnnotation, onLineNumberClick, maxHeight, syntaxTheme, xstyle, className, style, ...props }: DiffViewerProps): import("react").JSX.Element;
139
+ export declare function DiffViewer({ ref, file, viewMode, language: languageProp, codeLanguages, hasLineNumbers, isWrapped, changeIndicator, inlineHighlight, hasChangeBackground, isCollapsible, isCollapsed: isCollapsedProp, defaultIsCollapsed, onCollapsedChange, headerEnd, renderLineAnnotation, onLineNumberClick, maxHeight, syntaxTheme, xstyle, className, style, ...props }: DiffViewerProps): import("react").JSX.Element;
129
140
  export declare namespace DiffViewer {
130
141
  var displayName: string;
131
142
  }
@@ -1 +1 @@
1
- {"version":3,"file":"DiffViewer.d.ts","sourceRoot":"","sources":["../../src/DiffViewer/DiffViewer.tsx"],"names":[],"mappings":"AAqCA,OAAO,EAQL,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,GAAG,EAET,MAAM,OAAO,CAAC;AAGf,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,oBAAoB,CAAC;AAalD,OAAO,EAEL,KAAK,qBAAqB,EAC3B,MAAM,iCAAiC,CAAC;AAqBzC,OAAO,KAAK,EACV,cAAc,EAGd,iBAAiB,EAElB,MAAM,aAAa,CAAC;AAGrB,uEAAuE;AACvE,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,OAAO,CAAC;AAErD;;;;GAIG;AACH,MAAM,MAAM,yBAAyB,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,CAAC;AAEpE;;;GAGG;AACH,MAAM,MAAM,yBAAyB,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAEjE,MAAM,WAAW,eAAgB,SAAQ,SAAS,CAAC,cAAc,CAAC;IAChE,yCAAyC;IACzC,GAAG,CAAC,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC;IAC1B;;;OAGG;IACH,IAAI,EAAE,cAAc,CAAC;IACrB;;;;;;;;OAQG;IACH,QAAQ,CAAC,EAAE,kBAAkB,CAAC;IAC9B;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB;;;;;;;;OAQG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;OAGG;IACH,eAAe,CAAC,EAAE,yBAAyB,CAAC;IAC5C;;;;;OAKG;IACH,eAAe,CAAC,EAAE,yBAAyB,CAAC;IAC5C;;;;OAIG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B;;;;OAIG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,iEAAiE;IACjE,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;;OAGG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,uEAAuE;IACvE,iBAAiB,CAAC,EAAE,CAAC,WAAW,EAAE,OAAO,KAAK,IAAI,CAAC;IACnD;;;OAGG;IACH,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB;;;;;OAKG;IACH,oBAAoB,CAAC,EAAE,CAAC,GAAG,EAAE,iBAAiB,KAAK,SAAS,CAAC;IAC7D;;;;;;OAMG;IACH,iBAAiB,CAAC,EAAE,CAClB,GAAG,EAAE,iBAAiB,EACtB,KAAK,EAAE,UAAU,CAAC,iBAAiB,CAAC,KACjC,IAAI,CAAC;IACV,yDAAyD;IACzD,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B;;;OAGG;IACH,WAAW,CAAC,EAAE,qBAAqB,CAAC;CACrC;AAk0BD;;;;;;;;;;GAUG;AACH,wBAAgB,UAAU,CAAC,EACzB,GAAG,EACH,IAAI,EACJ,QAAoB,EACpB,QAAQ,EAAE,YAAY,EACtB,cAAqB,EACrB,SAAiB,EACjB,eAA2B,EAC3B,eAAwB,EACxB,mBAA0B,EAC1B,aAAoB,EACpB,WAAW,EAAE,eAAe,EAC5B,kBAA0B,EAC1B,iBAAiB,EACjB,SAAS,EACT,oBAAoB,EACpB,iBAAiB,EACjB,SAAS,EACT,WAAW,EACX,MAAM,EACN,SAAS,EACT,KAAK,EACL,GAAG,KAAK,EACT,EAAE,eAAe,+BAopBjB;yBA3qBe,UAAU"}
1
+ {"version":3,"file":"DiffViewer.d.ts","sourceRoot":"","sources":["../../src/DiffViewer/DiffViewer.tsx"],"names":[],"mappings":"AAqCA,OAAO,EAQL,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,GAAG,EAET,MAAM,OAAO,CAAC;AAGf,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAGL,KAAK,YAAY,EAGlB,MAAM,8BAA8B,CAAC;AAOtC,OAAO,EAEL,KAAK,qBAAqB,EAC3B,MAAM,iCAAiC,CAAC;AAqBzC,OAAO,KAAK,EACV,cAAc,EAGd,iBAAiB,EAElB,MAAM,aAAa,CAAC;AAGrB,uEAAuE;AACvE,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,OAAO,CAAC;AAErD;;;;GAIG;AACH,MAAM,MAAM,yBAAyB,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,CAAC;AAEpE;;;GAGG;AACH,MAAM,MAAM,yBAAyB,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAEjE,MAAM,WAAW,eAAgB,SAAQ,SAAS,CAAC,cAAc,CAAC;IAChE,yCAAyC;IACzC,GAAG,CAAC,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC;IAC1B;;;OAGG;IACH,IAAI,EAAE,cAAc,CAAC;IACrB;;;;;;;;OAQG;IACH,QAAQ,CAAC,EAAE,kBAAkB,CAAC;IAC9B;;;;;;;OAOG;IACH,QAAQ,CAAC,EAAE,MAAM,GAAG,YAAY,CAAC;IACjC;;;;OAIG;IACH,aAAa,CAAC,EAAE,aAAa,CAAC,YAAY,CAAC,CAAC;IAC5C;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB;;;;;;;;OAQG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;OAGG;IACH,eAAe,CAAC,EAAE,yBAAyB,CAAC;IAC5C;;;;;OAKG;IACH,eAAe,CAAC,EAAE,yBAAyB,CAAC;IAC5C;;;;OAIG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B;;;;OAIG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,iEAAiE;IACjE,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;;OAGG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,uEAAuE;IACvE,iBAAiB,CAAC,EAAE,CAAC,WAAW,EAAE,OAAO,KAAK,IAAI,CAAC;IACnD;;;OAGG;IACH,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB;;;;;OAKG;IACH,oBAAoB,CAAC,EAAE,CAAC,GAAG,EAAE,iBAAiB,KAAK,SAAS,CAAC;IAC7D;;;;;;OAMG;IACH,iBAAiB,CAAC,EAAE,CAClB,GAAG,EAAE,iBAAiB,EACtB,KAAK,EAAE,UAAU,CAAC,iBAAiB,CAAC,KACjC,IAAI,CAAC;IACV,yDAAyD;IACzD,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B;;;OAGG;IACH,WAAW,CAAC,EAAE,qBAAqB,CAAC;CACrC;AAi2BD;;;;;;;;;;GAUG;AACH,wBAAgB,UAAU,CAAC,EACzB,GAAG,EACH,IAAI,EACJ,QAAoB,EACpB,QAAQ,EAAE,YAAY,EACtB,aAAa,EACb,cAAqB,EACrB,SAAiB,EACjB,eAA2B,EAC3B,eAAwB,EACxB,mBAA0B,EAC1B,aAAoB,EACpB,WAAW,EAAE,eAAe,EAC5B,kBAA0B,EAC1B,iBAAiB,EACjB,SAAS,EACT,oBAAoB,EACpB,iBAAiB,EACjB,SAAS,EACT,WAAW,EACX,MAAM,EACN,SAAS,EACT,KAAK,EACL,GAAG,KAAK,EACT,EAAE,eAAe,+BAopBjB;yBA5qBe,UAAU"}
@@ -92,18 +92,42 @@ const EXTENSION_LANGUAGES = {
92
92
  yaml: 'yaml',
93
93
  yml: 'yaml',
94
94
  md: 'markdown',
95
- markdown: 'markdown'
95
+ markdown: 'markdown',
96
+ c: 'c',
97
+ h: 'c',
98
+ cpp: 'cpp',
99
+ cc: 'cpp',
100
+ cxx: 'cpp',
101
+ hpp: 'cpp',
102
+ hh: 'cpp',
103
+ sql: 'sql',
104
+ rs: 'rust',
105
+ kt: 'kotlin',
106
+ kts: 'kotlin',
107
+ swift: 'swift',
108
+ go: 'go'
96
109
  };
97
- function inferLanguage(path) {
110
+
111
+ /**
112
+ * The language a file's name or extension infers: a listed value first (a
113
+ * later entry wins), then a built-in, else plain text (CodeBlock FR13).
114
+ */
115
+ function inferLanguage(path, codeLanguages) {
98
116
  if (path == null) {
99
117
  return 'plaintext';
100
118
  }
101
119
  const base = path.slice(path.lastIndexOf('/') + 1);
102
120
  const dot = base.lastIndexOf('.');
103
- if (dot <= 0) {
104
- return 'plaintext';
121
+ const extension = dot > 0 ? base.slice(dot + 1).toLowerCase() : null;
122
+ if (codeLanguages != null) {
123
+ for (let i = codeLanguages.length - 1; i >= 0; i--) {
124
+ const language = codeLanguages[i];
125
+ if (language.fileNames.includes(base) || extension != null && language.fileExtensions.includes(extension)) {
126
+ return language;
127
+ }
128
+ }
105
129
  }
106
- return EXTENSION_LANGUAGES[base.slice(dot + 1).toLowerCase()] ?? 'plaintext';
130
+ return extension == null ? 'plaintext' : EXTENSION_LANGUAGES[extension] ?? 'plaintext';
107
131
  }
108
132
 
109
133
  // ---------------------------------------------------------------------------
@@ -698,6 +722,7 @@ export function DiffViewer({
698
722
  file,
699
723
  viewMode = 'unified',
700
724
  language: languageProp,
725
+ codeLanguages,
701
726
  hasLineNumbers = true,
702
727
  isWrapped = false,
703
728
  changeIndicator = 'classic',
@@ -723,7 +748,7 @@ export function DiffViewer({
723
748
  ensureHighlightStyles();
724
749
  }, []);
725
750
  const path = file.newPath ?? file.oldPath;
726
- const language = languageProp ?? inferLanguage(path);
751
+ const language = languageProp ?? inferLanguage(path, codeLanguages);
727
752
  const displayPath = file.status === 'renamed' && file.oldPath != null && file.newPath != null ? t('@astryx.diffViewer.renamedPath', {
728
753
  oldPath: file.oldPath,
729
754
  newPath: file.newPath
@@ -1 +1 @@
1
- {"version":3,"file":"ListInput.d.ts","sourceRoot":"","sources":["../../src/ListInput/ListInput.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ListInput.d.ts","sourceRoot":"","sources":["../../src/ListInput/ListInput.tsx"],"names":[],"mappings":"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"}
@@ -476,6 +476,25 @@ export function ListInput({
476
476
  announce(t('@astryx.listInput.announceReorderCancelled'));
477
477
  }
478
478
  }, [isDisabled, isLoading, announce, t]);
479
+
480
+ // A second pointer that lands anywhere during a pointer reorder (the second
481
+ // finger of a pinch) cancels the reorder. A pinch whose first finger slid
482
+ // first zooms without a pointercancel, so the drag would otherwise commit on
483
+ // release and drop the row at the end of the list.
484
+ useEffect(() => {
485
+ if (!isPointerReorderActive) {
486
+ return;
487
+ }
488
+ const onPointerDown = event => {
489
+ const activeState = reorderStateRef.current;
490
+ if (activeState?.mode === 'pointer' && activeState.pointerId !== event.pointerId) {
491
+ setReorderState(null);
492
+ announce(t('@astryx.listInput.announceReorderCancelled'));
493
+ }
494
+ };
495
+ document.addEventListener('pointerdown', onPointerDown, true);
496
+ return () => document.removeEventListener('pointerdown', onPointerDown, true);
497
+ }, [isPointerReorderActive, announce, t]);
479
498
  useEffect(() => {
480
499
  const activeAnimations = activeMutationAnimationsRef.current;
481
500
  return () => {
@@ -1 +1 @@
1
- {"version":3,"file":"LogStream.d.ts","sourceRoot":"","sources":["../../src/LogStream/LogStream.tsx"],"names":[],"mappings":"AAyBA,OAAO,EAML,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAGf,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,oBAAoB,CAAC;AAkBlD,iCAAiC;AACjC,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;AAEjE,0EAA0E;AAC1E,MAAM,WAAW,QAAQ;IACvB,4CAA4C;IAC5C,EAAE,EAAE,MAAM,CAAC;IACX,qEAAqE;IACrE,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,cAAc,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,wDAAwD;IACxD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oEAAoE;IACpE,MAAM,CAAC,EAAE,SAAS,CAAC;CACpB;AAED,MAAM,WAAW,cAAe,SAAQ,IAAI,CAC1C,SAAS,CAAC,cAAc,CAAC,EACzB,UAAU,CACX;IACC,wCAAwC;IACxC,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAChC,6DAA6D;IAC7D,OAAO,EAAE,QAAQ,EAAE,CAAC;IACpB;;;;;OAKG;IACH,OAAO,CAAC,EAAE,SAAS,GAAG,UAAU,CAAC;IACjC;;;;OAIG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,+EAA+E;IAC/E,cAAc,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI,CAAC;IAC9C,uDAAuD;IACvD,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B,+CAA+C;IAC/C,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,iEAAiE;IACjE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gEAAgE;IAChE,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,SAAS,CAAC;CAC9C;AAwOD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,SAAS,CAAC,EACxB,OAAO,EACP,OAAmB,EACnB,WAAW,EACX,cAAc,EACd,SAAS,EACT,aAAoB,EACpB,KAAoB,EACpB,WAAW,EACX,MAAM,EACN,SAAS,EACT,KAAK,EACL,GAAG,EACH,GAAG,IAAI,EACR,EAAE,cAAc,+BAqNhB;yBAnOe,SAAS"}
1
+ {"version":3,"file":"LogStream.d.ts","sourceRoot":"","sources":["../../src/LogStream/LogStream.tsx"],"names":[],"mappings":"AAyBA,OAAO,EAML,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAGf,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,oBAAoB,CAAC;AAkBlD,iCAAiC;AACjC,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;AAEjE,0EAA0E;AAC1E,MAAM,WAAW,QAAQ;IACvB,4CAA4C;IAC5C,EAAE,EAAE,MAAM,CAAC;IACX,qEAAqE;IACrE,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,cAAc,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,wDAAwD;IACxD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oEAAoE;IACpE,MAAM,CAAC,EAAE,SAAS,CAAC;CACpB;AAED,MAAM,WAAW,cAAe,SAAQ,IAAI,CAC1C,SAAS,CAAC,cAAc,CAAC,EACzB,UAAU,CACX;IACC,wCAAwC;IACxC,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAChC,6DAA6D;IAC7D,OAAO,EAAE,QAAQ,EAAE,CAAC;IACpB;;;;;OAKG;IACH,OAAO,CAAC,EAAE,SAAS,GAAG,UAAU,CAAC;IACjC;;;;OAIG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,+EAA+E;IAC/E,cAAc,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI,CAAC;IAC9C,uDAAuD;IACvD,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B,+CAA+C;IAC/C,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,iEAAiE;IACjE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gEAAgE;IAChE,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,SAAS,CAAC;CAC9C;AAsOD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,SAAS,CAAC,EACxB,OAAO,EACP,OAAmB,EACnB,WAAW,EACX,cAAc,EACd,SAAS,EACT,aAAoB,EACpB,KAAoB,EACpB,WAAW,EACX,MAAM,EACN,SAAS,EACT,KAAK,EACL,GAAG,EACH,GAAG,IAAI,EACR,EAAE,cAAc,+BAqNhB;yBAnOe,SAAS"}
@@ -164,11 +164,11 @@ const styles = {
164
164
  $$css: true
165
165
  },
166
166
  levelWarn: {
167
- kMwMTN: "xuj0v0c",
167
+ kMwMTN: "x10h9ou4",
168
168
  $$css: true
169
169
  },
170
170
  levelError: {
171
- kMwMTN: "x1lenag",
171
+ kMwMTN: "x1wj83wy",
172
172
  $$css: true
173
173
  },
174
174
  levelInfoTerminal: {
@@ -75,15 +75,15 @@ const colorStyles = {
75
75
  $$css: true
76
76
  },
77
77
  positive: {
78
- kMwMTN: "xtjic6",
78
+ kMwMTN: "x1vau044",
79
79
  $$css: true
80
80
  },
81
81
  negative: {
82
- kMwMTN: "xjt36v0",
82
+ kMwMTN: "xskb5cx",
83
83
  $$css: true
84
84
  },
85
85
  warning: {
86
- kMwMTN: "xs3pv69",
86
+ kMwMTN: "x4z9hng",
87
87
  $$css: true
88
88
  },
89
89
  inherit: {
package/dist/Stat/Stat.js CHANGED
@@ -78,11 +78,11 @@ const sizeStyles = {
78
78
  */
79
79
  const sentimentStyles = {
80
80
  positive: {
81
- kMwMTN: "xtjic6",
81
+ kMwMTN: "x1caiuuo",
82
82
  $$css: true
83
83
  },
84
84
  negative: {
85
- kMwMTN: "xjt36v0",
85
+ kMwMTN: "x1wj83wy",
86
86
  $$css: true
87
87
  },
88
88
  neutral: {
@@ -1 +1 @@
1
- {"version":3,"file":"TransferList.d.ts","sourceRoot":"","sources":["../../src/TransferList/TransferList.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"TransferList.d.ts","sourceRoot":"","sources":["../../src/TransferList/TransferList.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;GAUG;AAEH,OAAO,EAWL,KAAK,SAAS,EAEf,MAAM,OAAO,CAAC;AAGf,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,oBAAoB,CAAC;AAoElD,MAAM,WAAW,kBAAkB,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM;IAC3D,0DAA0D;IAC1D,KAAK,EAAE,CAAC,CAAC;IACT,0DAA0D;IAC1D,KAAK,EAAE,MAAM,CAAC;IACd,qEAAqE;IACrE,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,oDAAoD;IACpD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2EAA2E;IAC3E,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,4EAA4E;IAC5E,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,gEAAgE;IAChE,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,iBAAiB,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,CAAE,SAAQ,IAAI,CACxE,SAAS,CAAC,cAAc,CAAC,EACzB,UAAU,CACX;IACC,uCAAuC;IACvC,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAChC,gDAAgD;IAChD,KAAK,EAAE,MAAM,CAAC;IACd,oEAAoE;IACpE,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,iDAAiD;IACjD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,6DAA6D;IAC7D,OAAO,EAAE,SAAS,kBAAkB,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1C,yEAAyE;IACzE,KAAK,EAAE,SAAS,CAAC,EAAE,CAAC;IACpB,uEAAuE;IACvE,QAAQ,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,KAAK,IAAI,CAAC;IACxC,0DAA0D;IAC1D,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,4DAA4D;IAC5D,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,sEAAsE;IACtE,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,kEAAkE;IAClE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mDAAmD;IACnD,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,+EAA+E;IAC/E,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,8CAA8C;IAC9C,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,6EAA6E;IAC7E,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,yEAAyE;IACzE,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC;IAC5D,yCAAyC;IACzC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,0CAA0C;IAC1C,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,iDAAiD;IACjD,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAoND;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,YAAY,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,EAAE,EACtD,KAAK,EACL,aAAqB,EACrB,WAAW,EACX,OAAO,EACP,KAAK,EACL,QAAQ,EACR,aAAa,EAAE,sBAAsB,EACrC,cAAc,EAAE,uBAAuB,EACvC,SAAiB,EACjB,WAAW,EACX,iBAAiB,EAAE,0BAA0B,EAC7C,aAAoB,EACpB,YAAoB,EACpB,QAAgB,EAChB,YAAY,EACZ,iBAAiB,EAAE,0BAA0B,EAC7C,kBAAkB,EAAE,2BAA2B,EAC/C,aAAa,EAAE,sBAAsB,EACrC,MAAM,EACN,SAAS,EACT,KAAK,EACL,GAAG,EACH,IAAI,EACJ,iBAAiB,EAAE,cAAc,EACjC,kBAAkB,EAAE,eAAe,EACnC,GAAG,SAAS,EACb,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,SAAS,CA49BlC;yBAv/Be,YAAY"}
@@ -655,6 +655,26 @@ export function TransferList({
655
655
  event.currentTarget.releasePointerCapture?.(event.pointerId);
656
656
  }
657
657
  }, [finishReorder]);
658
+
659
+ // A second pointer that lands anywhere during a pointer reorder (the second
660
+ // finger of a pinch) cancels the reorder. A pinch whose first finger slid
661
+ // first zooms without a pointercancel, so the drag would otherwise commit on
662
+ // release and drop the row at the end of the list.
663
+ const isPointerReorderActive = previewCloneValue != null;
664
+ useEffect(() => {
665
+ if (!isPointerReorderActive) {
666
+ return;
667
+ }
668
+ const onPointerDown = event => {
669
+ const session = reorderSessionRef.current;
670
+ if (session?.mode === 'pointer' && session.pointerId !== event.pointerId) {
671
+ suppressClickRef.current = false;
672
+ finishReorder(true);
673
+ }
674
+ };
675
+ document.addEventListener('pointerdown', onPointerDown, true);
676
+ return () => document.removeEventListener('pointerdown', onPointerDown, true);
677
+ }, [isPointerReorderActive, finishReorder]);
658
678
  const handleSearch = useCallback(nextQuery => {
659
679
  setQuery(nextQuery);
660
680
  const normalized = nextQuery.trim().toLowerCase();
package/dist/lab.css CHANGED
@@ -337,16 +337,15 @@
337
337
  .x1s4jh2n:not(#\#):not(#\#):not(#\#){color:color-mix(in srgb,var(--color-text-teal) 52%,var(--color-text-secondary))}
338
338
  .x1wzna5w:not(#\#):not(#\#):not(#\#){color:color-mix(in srgb,var(--color-text-yellow) 52%,var(--color-text-secondary))}
339
339
  .x1heor9g:not(#\#):not(#\#):not(#\#){color:inherit}
340
- .xuj0v0c:not(#\#):not(#\#):not(#\#){color:light-dark(color-mix(in srgb,var(--color-warning) 58%,black),var(--color-warning))}
341
- .x1lenag:not(#\#):not(#\#):not(#\#){color:light-dark(var(--color-error),color-mix(in srgb,var(--color-error) 82%,white))}
342
340
  .x19co3pv:not(#\#):not(#\#):not(#\#){color:transparent}
343
341
  .xqwr325:not(#\#):not(#\#):not(#\#){color:var(--color-accent)}
344
- .xjt36v0:not(#\#):not(#\#):not(#\#){color:var(--color-error)}
345
342
  .xqa6c3m:not(#\#):not(#\#):not(#\#){color:var(--color-icon-disabled)}
343
+ .xskb5cx:not(#\#):not(#\#):not(#\#){color:var(--color-icon-error)}
346
344
  .xtbr613:not(#\#):not(#\#):not(#\#){color:var(--color-icon-primary)}
347
345
  .xv9yike:not(#\#):not(#\#):not(#\#){color:var(--color-icon-secondary)}
346
+ .x1vau044:not(#\#):not(#\#):not(#\#){color:var(--color-icon-success)}
347
+ .x4z9hng:not(#\#):not(#\#):not(#\#){color:var(--color-icon-warning)}
348
348
  .x17wrial:not(#\#):not(#\#):not(#\#){color:var(--color-on-accent)}
349
- .xtjic6:not(#\#):not(#\#):not(#\#){color:var(--color-success)}
350
349
  .x1wxerb0:not(#\#):not(#\#):not(#\#){color:var(--color-syntax-added-marker)}
351
350
  .xt5rlkq:not(#\#):not(#\#):not(#\#){color:var(--color-syntax-punctuation)}
352
351
  .x103bwea:not(#\#):not(#\#):not(#\#){color:var(--color-syntax-removed-marker)}
@@ -355,6 +354,7 @@
355
354
  .x1vvqiwl:not(#\#):not(#\#):not(#\#){color:var(--color-text-blue)}
356
355
  .x1txnczv:not(#\#):not(#\#):not(#\#){color:var(--color-text-cyan)}
357
356
  .xnbbluu:not(#\#):not(#\#):not(#\#){color:var(--color-text-disabled)}
357
+ .x1wj83wy:not(#\#):not(#\#):not(#\#){color:var(--color-text-error)}
358
358
  .xru1t7f:not(#\#):not(#\#):not(#\#){color:var(--color-text-gray)}
359
359
  .xltfdvo:not(#\#):not(#\#):not(#\#){color:var(--color-text-green)}
360
360
  .xm47u9q:not(#\#):not(#\#):not(#\#){color:var(--color-text-orange)}
@@ -363,9 +363,10 @@
363
363
  .x1m9wyeb:not(#\#):not(#\#):not(#\#){color:var(--color-text-purple)}
364
364
  .x1joocv1:not(#\#):not(#\#):not(#\#){color:var(--color-text-red)}
365
365
  .xv1l7n4:not(#\#):not(#\#):not(#\#){color:var(--color-text-secondary)}
366
+ .x1caiuuo:not(#\#):not(#\#):not(#\#){color:var(--color-text-success)}
366
367
  .x9x0lbs:not(#\#):not(#\#):not(#\#){color:var(--color-text-teal)}
368
+ .x10h9ou4:not(#\#):not(#\#):not(#\#){color:var(--color-text-warning)}
367
369
  .xdhq94a:not(#\#):not(#\#):not(#\#){color:var(--color-text-yellow)}
368
- .xs3pv69:not(#\#):not(#\#):not(#\#){color:var(--color-warning)}
369
370
  .x1kihgfc:not(#\#):not(#\#):not(#\#){column-gap:var(--spacing-0-5)}
370
371
  .x1lfs0n9:not(#\#):not(#\#):not(#\#){column-gap:var(--spacing-1)}
371
372
  .xak3so:not(#\#):not(#\#):not(#\#){column-gap:var(--spacing-2)}
@@ -528,13 +529,13 @@
528
529
  .ximx5ud:not(#\#):not(#\#):not(#\#){stroke:var(--color-accent-muted)}
529
530
  .xjsr54c:not(#\#):not(#\#):not(#\#){stroke:var(--color-accent)}
530
531
  .xjswp7v:not(#\#):not(#\#):not(#\#){stroke:var(--color-error-muted)}
531
- .x1vco6zm:not(#\#):not(#\#):not(#\#){stroke:var(--color-error)}
532
532
  .x1uro670:not(#\#):not(#\#):not(#\#){stroke:var(--color-success-muted)}
533
- .x8y33gb:not(#\#):not(#\#):not(#\#){stroke:var(--color-success)}
534
533
  .xuxf9kk:not(#\#):not(#\#):not(#\#){stroke:var(--color-text-disabled)}
534
+ .xqb94c9:not(#\#):not(#\#):not(#\#){stroke:var(--color-text-error)}
535
+ .x88o7k4:not(#\#):not(#\#):not(#\#){stroke:var(--color-text-success)}
536
+ .x16d96h5:not(#\#):not(#\#):not(#\#){stroke:var(--color-text-warning)}
535
537
  .xpi25hw:not(#\#):not(#\#):not(#\#){stroke:var(--color-track)}
536
538
  .x1wjzxuj:not(#\#):not(#\#):not(#\#){stroke:var(--color-warning-muted)}
537
- .x9ezeq1:not(#\#):not(#\#):not(#\#){stroke:var(--color-warning)}
538
539
  .xeq4nuv:not(#\#):not(#\#):not(#\#){tab-size:2}
539
540
  .x140o2bo:not(#\#):not(#\#):not(#\#){table-layout:fixed}
540
541
  .x2b8uid:not(#\#):not(#\#):not(#\#){text-align:center}
@@ -544,7 +545,7 @@
544
545
  .xkrqix3:not(#\#):not(#\#):not(#\#){text-decoration-line:none}
545
546
  .xlyipyv:not(#\#):not(#\#):not(#\#){text-overflow:ellipsis}
546
547
  .xtvhhri:not(#\#):not(#\#):not(#\#){text-transform:uppercase}
547
- .x5ve5x3:not(#\#):not(#\#):not(#\#){touch-action:none}
548
+ .x1j4r261:not(#\#):not(#\#):not(#\#){touch-action:pinch-zoom}
548
549
  .x1bd091l:not(#\#):not(#\#):not(#\#){transform-origin:left bottom}
549
550
  .x9tu13d:not(#\#):not(#\#):not(#\#){transform:rotate(-90deg)}
550
551
  .x19jd1h0:not(#\#):not(#\#):not(#\#){transform:rotate(180deg)}
@@ -59,11 +59,11 @@ export declare const reorderStyles: Readonly<{
59
59
  }>;
60
60
  readonly handle: Readonly<{
61
61
  readonly cursor: stylex.StyleXClassNameFor<"cursor", "default" | "grab">;
62
- readonly touchAction: stylex.StyleXClassNameFor<"touchAction", "none">;
62
+ readonly touchAction: stylex.StyleXClassNameFor<"touchAction", "pinch-zoom">;
63
63
  }>;
64
64
  readonly handleActive: Readonly<{
65
65
  readonly cursor: stylex.StyleXClassNameFor<"cursor", "default" | "grabbing">;
66
- readonly touchAction: stylex.StyleXClassNameFor<"touchAction", "none">;
66
+ readonly touchAction: stylex.StyleXClassNameFor<"touchAction", "pinch-zoom">;
67
67
  }>;
68
68
  }>;
69
69
  //# sourceMappingURL=reorderStyles.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"reorderStyles.d.ts","sourceRoot":"","sources":["../src/reorderStyles.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AAEH,OAAO,KAAK,MAAM,MAAM,kBAAkB,CAAC;AAoB3C;;;GAGG;AACH,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgDxB,CAAC"}
1
+ {"version":3,"file":"reorderStyles.d.ts","sourceRoot":"","sources":["../src/reorderStyles.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AAEH,OAAO,KAAK,MAAM,MAAM,kBAAkB,CAAC;AAoB3C;;;GAGG;AACH,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAqDxB,CAAC"}
@@ -71,12 +71,12 @@ export const reorderStyles = {
71
71
  },
72
72
  handle: {
73
73
  kkrTdU: "x1jm3nie x16khyan",
74
- kFalU9: "x5ve5x3",
74
+ kFalU9: "x1j4r261",
75
75
  $$css: true
76
76
  },
77
77
  handleActive: {
78
78
  kkrTdU: "xi9pz9s x16khyan",
79
- kFalU9: "x5ve5x3",
79
+ kFalU9: "x1j4r261",
80
80
  $$css: true
81
81
  }
82
82
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@astryxdesign/lab",
3
- "version": "0.7.5-canary.d76a228",
3
+ "version": "0.7.5-canary.dbcfc30",
4
4
  "description": "Experimental Astryx components — published to npm only under the @canary dist-tag for early testing; never released as a stable (latest) version.",
5
5
  "author": "Meta Open Source",
6
6
  "license": "MIT",
@@ -49,7 +49,7 @@
49
49
  },
50
50
  "peerDependencies": {
51
51
  "@stylexjs/stylex": ">=0.10.0",
52
- "@astryxdesign/core": "0.7.5-canary.d76a228",
52
+ "@astryxdesign/core": "0.7.5-canary.dbcfc30",
53
53
  "react": ">=19.0.0",
54
54
  "react-dom": ">=19.0.0"
55
55
  },
@@ -59,8 +59,8 @@
59
59
  "d3-shape": "^3.2.0"
60
60
  },
61
61
  "devDependencies": {
62
- "@astryxdesign/a11y-spec": "0.7.5-canary.d76a228",
63
- "@astryxdesign/cli": "0.7.5-canary.d76a228",
62
+ "@astryxdesign/a11y-spec": "0.7.5-canary.dbcfc30",
63
+ "@astryxdesign/cli": "0.7.5-canary.dbcfc30",
64
64
  "@babel/cli": "^7.29.7",
65
65
  "@babel/core": "^7.29.7",
66
66
  "@babel/preset-react": "^7.29.7",
@@ -74,14 +74,14 @@
74
74
  },
75
75
  "scripts": {
76
76
  "build": "node ../../scripts/clean-dist.mjs && pnpm build:esm && tsc --project tsconfig.build.json && node ../../scripts/add-declaration-extensions.mjs && pnpm build:css && node ../../scripts/check-no-dev-jsx.mjs && node ../../scripts/check-fully-specified.mjs",
77
- "build:esm": "babel src --out-dir dist --extensions .ts,.tsx --out-file-extension .js --ignore \"**/*.test.ts,**/*.test.tsx,**/__tests__/**,**/*.perf.test.*,**/*.doc.mjs,**/*.d.ts,**/*.css,**/*.css.d.ts\" --config-file ./babel.config.json",
77
+ "build:esm": "babel src --out-dir dist --extensions .ts,.tsx --out-file-extension .js --ignore \"**/*.test.ts,**/*.test.tsx,**/__tests__/**,**/*.perf.test.*,**/*.doc.mjs,**/*.d.ts,**/*.css,**/*.css.d.ts\" --config-file ./babel.config.cjs",
78
78
  "build:css": "node ../../scripts/build-css.mjs --package lab",
79
- "dev": "babel src --watch --out-dir dist --extensions .ts,.tsx --out-file-extension .js --ignore \"**/*.test.*,**/*.doc.mjs,**/*.d.ts,**/*.css*\" --config-file ./babel.config.json",
79
+ "dev": "babel src --watch --out-dir dist --extensions .ts,.tsx --out-file-extension .js --ignore \"**/*.test.*,**/*.doc.mjs,**/*.d.ts,**/*.css*\" --config-file ./babel.config.cjs",
80
80
  "test": "vitest run --root ../..",
81
81
  "test:watch": "vitest --root ../..",
82
82
  "lint": "eslint src",
83
83
  "typecheck:docs": "tsc --project tsconfig.docs.json",
84
- "typecheck": "tsc --project tsconfig.json --noEmit",
84
+ "typecheck": "tsc --project tsconfig.json --noEmit && pnpm typecheck:docs",
85
85
  "generate:emoji-data": "node scripts/generate-emoji-data.mjs"
86
86
  }
87
87
  }
@@ -63,7 +63,7 @@ const styles = stylex.create({
63
63
  fontFamily: typographyVars['--font-family-body'],
64
64
  fontSize: typeScaleVars['--text-supporting-size'],
65
65
  fontWeight: fontWeightVars['--font-weight-bold'],
66
- color: colorVars['--color-error'],
66
+ color: colorVars['--color-text-error'],
67
67
  lineHeight: typeScaleVars['--text-supporting-leading'],
68
68
  },
69
69
  });
@@ -1,4 +1,5 @@
1
1
  // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+ // @pr-a11y release-only
2
3
 
3
4
  /** Real-browser and accessibility-tree binding for ChatTypingIndicator. */
4
5
 
@@ -260,13 +260,13 @@ const variantStyles = stylex.create({
260
260
  stroke: colorVars['--color-accent'],
261
261
  },
262
262
  success: {
263
- stroke: colorVars['--color-success'],
263
+ stroke: colorVars['--color-text-success'],
264
264
  },
265
265
  warning: {
266
- stroke: colorVars['--color-warning'],
266
+ stroke: colorVars['--color-text-warning'],
267
267
  },
268
268
  error: {
269
- stroke: colorVars['--color-error'],
269
+ stroke: colorVars['--color-text-error'],
270
270
  },
271
271
  neutral: {
272
272
  stroke: colorVars['--color-text-disabled'],
@@ -1,4 +1,5 @@
1
1
  // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+ // @pr-a11y scope ^(internal/a11y-spec/src/patterns/progressbar\.|packages/core/src/ProgressBar/|packages/lab/src/CircularProgress/|apps/storybook/stories/ProgressbarA11y)
2
3
 
3
4
  /**
4
5
  * @file CircularProgress.a11y.chromium.spec.ts
@@ -82,6 +82,12 @@ import type {
82
82
  CommentUser,
83
83
  } from './types';
84
84
 
85
+ // The page's shared live regions are not the component's error Banner.
86
+ const errorBanner = () =>
87
+ screen
88
+ .queryAllByRole('alert')
89
+ .find(element => !element.hasAttribute('data-astryx-live-region'));
90
+
85
91
  const VIEWER: CommentUser = {id: 'avery', name: 'Avery Kim'};
86
92
  const OTHER: CommentUser = {id: 'maya', name: 'Maya Chen'};
87
93
  const AGENT: CommentUser = {
@@ -900,12 +906,12 @@ describe('Comments threads', () => {
900
906
  }),
901
907
  );
902
908
  await flush();
903
- const banner = screen.getByRole('alert');
909
+ const banner = errorBanner()!;
904
910
  expect(banner.textContent).toContain("Your reaction couldn't be saved.");
905
911
  await click(within(banner).getByRole('button', {name: 'Retry'}));
906
912
  await flush();
907
913
  expect(onReact).toHaveBeenCalledTimes(2);
908
- expect(screen.queryByRole('alert')).toBeNull();
914
+ expect(errorBanner()).toBeUndefined();
909
915
  });
910
916
 
911
917
  it('copies a link to the comment', async () => {
@@ -999,7 +1005,7 @@ describe('Comments threads', () => {
999
1005
  />
1000
1006
  </Sized>,
1001
1007
  );
1002
- const banner = screen.getByRole('alert');
1008
+ const banner = errorBanner()!;
1003
1009
  expect(banner.textContent).toContain("Couldn't post this comment.");
1004
1010
  await click(within(banner).getByRole('button', {name: 'Retry'}));
1005
1011
  await flush();
@@ -1022,7 +1028,7 @@ describe('Comments threads', () => {
1022
1028
  );
1023
1029
  await click(screen.getByRole('button', {name: 'Load earlier comments'}));
1024
1030
  await flush();
1025
- const banner = screen.getByRole('alert');
1031
+ const banner = errorBanner()!;
1026
1032
  expect(banner.textContent).toContain("Earlier comments couldn't load");
1027
1033
  await click(within(banner).getByRole('button', {name: 'Retry'}));
1028
1034
  await flush();
@@ -112,9 +112,15 @@ export const docs = {
112
112
  },
113
113
  {
114
114
  name: 'language',
115
- type: 'string',
115
+ type: 'string | CodeLanguage',
116
116
  description:
117
- 'Syntax-highlighting language. Defaults to one inferred from the file extension; unknown extensions render as plain text.',
117
+ 'Syntax-highlighting language: a built-in identifier, or a CodeBlock language value imported on its own (e.g. graphql from @astryxdesign/core/CodeBlock/languages/graphql) or made with createCodeLanguage. Defaults to one inferred from the file name or extension among the built-ins and codeLanguages; an unmatched file renders as plain text.',
118
+ },
119
+ {
120
+ name: 'codeLanguages',
121
+ type: 'ReadonlyArray<CodeLanguage>',
122
+ description:
123
+ 'Language values the file name or extension may infer, such as [graphql, dockerfile]; a later entry wins. Pass the same list to every DiffViewer on a review page.',
118
124
  },
119
125
  {
120
126
  name: 'hasLineNumbers',
@@ -7,6 +7,10 @@ import {createRef} from 'react';
7
7
  import {DiffViewer} from './DiffViewer';
8
8
  import {parseUnifiedDiff} from './parseUnifiedDiff';
9
9
  import type {DiffViewerLineRef} from './diffTypes';
10
+ import {createDiffFile} from './createDiffFile';
11
+ import {dockerfile} from '@astryxdesign/core/CodeBlock/languages/dockerfile';
12
+ import {graphql} from '@astryxdesign/core/CodeBlock/languages/graphql';
13
+ import {createCodeLanguage} from '@astryxdesign/core/CodeBlock';
10
14
 
11
15
  const PATCH = `diff --git a/src/greet.ts b/src/greet.ts
12
16
  --- a/src/greet.ts
@@ -72,6 +76,73 @@ describe('DiffViewer', () => {
72
76
  expect(container.querySelector('.astryx-token-keyword')).not.toBeNull();
73
77
  });
74
78
 
79
+ describe('language values (CodeBlock FR13)', () => {
80
+ const keywords = (root: ParentNode) =>
81
+ Array.from(root.querySelectorAll('.astryx-token-keyword')).map(
82
+ node => node.textContent,
83
+ );
84
+ const schema = createDiffFile({
85
+ oldValue: 'type User {}\n',
86
+ newValue: 'type User { name: String }\n',
87
+ newPath: 'api/schema.graphql',
88
+ });
89
+
90
+ it('takes a language value as language', () => {
91
+ const plain = render(<DiffViewer file={schema} language="graphql" />);
92
+ expect(keywords(plain.container)).toEqual([]);
93
+ const {container} = render(
94
+ <DiffViewer file={schema} language={graphql} />,
95
+ );
96
+ expect(keywords(container)).toContain('type');
97
+ });
98
+
99
+ it('infers a listed value from the file extension or name', () => {
100
+ const unlisted = render(<DiffViewer file={schema} />);
101
+ expect(keywords(unlisted.container)).toEqual([]);
102
+ const listed = render(
103
+ <DiffViewer file={schema} codeLanguages={[dockerfile, graphql]} />,
104
+ );
105
+ expect(keywords(listed.container)).toContain('type');
106
+ const docker = createDiffFile({
107
+ oldValue: 'FROM node:20\n',
108
+ newValue: 'FROM node:22\n',
109
+ newPath: 'Dockerfile',
110
+ });
111
+ const byName = render(
112
+ <DiffViewer file={docker} codeLanguages={[graphql, dockerfile]} />,
113
+ );
114
+ expect(keywords(byName.container)).toContain('FROM');
115
+ });
116
+
117
+ it('infers a custom language from its extension', () => {
118
+ const zig = createCodeLanguage({
119
+ name: 'zig',
120
+ identifiers: ['zig'],
121
+ fileExtensions: ['zig'],
122
+ tokenize: () => [{type: 'keyword', start: 0, end: 3}],
123
+ });
124
+ const file = createDiffFile({
125
+ oldValue: 'pub a\n',
126
+ newValue: 'pub b\n',
127
+ newPath: 'src/main.zig',
128
+ });
129
+ const {container} = render(
130
+ <DiffViewer file={file} codeLanguages={[zig]} />,
131
+ );
132
+ expect(keywords(container)).toContain('pub');
133
+ });
134
+
135
+ it('infers the newer built-ins from their extensions', () => {
136
+ const rust = createDiffFile({
137
+ oldValue: 'fn a() {}\n',
138
+ newValue: 'fn b() {}\n',
139
+ newPath: 'src/lib.rs',
140
+ });
141
+ const {container} = render(<DiffViewer file={rust} />);
142
+ expect(keywords(container)).toContain('fn');
143
+ });
144
+ });
145
+
75
146
  it('marks changed lines for assistive technology', () => {
76
147
  const {container} = render(<DiffViewer file={FILE} />);
77
148
  const addedCells = container.querySelectorAll('td[data-diff="added"]');