@astryxdesign/lab 0.7.6-canary.cdc5ec0 → 0.7.6-canary.ce052bf

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.
@@ -1 +1 @@
1
- {"version":3,"file":"CodeEditor.d.ts","sourceRoot":"","sources":["../../src/CodeEditor/CodeEditor.tsx"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,oBAAoB,CAAC;AAkBlD,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,8BAA8B,CAAC;AAuF5D,MAAM,WAAW,eAAgB,SAAQ,IAAI,CAC3C,SAAS,CAAC,cAAc,CAAC,EACzB,UAAU,CACX;IACC,wCAAwC;IACxC,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAChC,uBAAuB;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,qBAAqB;IACrB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,sDAAsD;IACtD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,sFAAsF;IACtF,KAAK,EAAE,MAAM,CAAC;IACd,wCAAwC;IACxC,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,qCAAqC;IACrC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,6BAA6B;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kCAAkC;IAClC,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B,+BAA+B;IAC/B,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACnB,uBAAuB;IACvB,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,SAAS,EAAE,CAAC;IAC5D;;;;;OAKG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAsED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,UAAU,CAAC,EACzB,KAAK,EACL,QAAQ,EACR,QAAsB,EACtB,cAAsB,EACtB,UAAkB,EAClB,WAAW,EACX,SAAS,EACT,IAAW,EACX,SAAS,EAAE,eAAe,EAC1B,KAAK,EACL,UAAqE,EACrE,MAAM,EACN,SAAS,EACT,KAAK,EACL,GAAG,EACH,GAAG,KAAK,EACT,EAAE,eAAe,+BA8UjB;yBA/Ve,UAAU"}
1
+ {"version":3,"file":"CodeEditor.d.ts","sourceRoot":"","sources":["../../src/CodeEditor/CodeEditor.tsx"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,oBAAoB,CAAC;AAkBlD,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,8BAA8B,CAAC;AA2F5D,MAAM,WAAW,eAAgB,SAAQ,IAAI,CAC3C,SAAS,CAAC,cAAc,CAAC,EACzB,UAAU,CACX;IACC,wCAAwC;IACxC,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAChC,uBAAuB;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,qBAAqB;IACrB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,sDAAsD;IACtD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,sFAAsF;IACtF,KAAK,EAAE,MAAM,CAAC;IACd,wCAAwC;IACxC,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,qCAAqC;IACrC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,6BAA6B;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kCAAkC;IAClC,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B,+BAA+B;IAC/B,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACnB,uBAAuB;IACvB,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,SAAS,EAAE,CAAC;IAC5D;;;;;OAKG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAsED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,UAAU,CAAC,EACzB,KAAK,EACL,QAAQ,EACR,QAAsB,EACtB,cAAsB,EACtB,UAAkB,EAClB,WAAW,EACX,SAAS,EACT,IAAW,EACX,SAAS,EAAE,eAAe,EAC1B,KAAK,EACL,UAAqE,EACrE,MAAM,EACN,SAAS,EACT,KAAK,EACL,GAAG,EACH,GAAG,KAAK,EACT,EAAE,eAAe,+BAsVjB;yBAvWe,UAAU"}
@@ -35,6 +35,9 @@ const styles = {
35
35
  k1xSpc: "x78zum5",
36
36
  kaIpWk: "xh6dtrn",
37
37
  kWkggS: "xwmxj5m",
38
+ kMzoRj: "x1litavf",
39
+ ksu8eU: "x1y0btm7",
40
+ kVAM5u: "x14i3s5s",
38
41
  kVQacm: "xb3r6kr",
39
42
  $$css: true
40
43
  },
@@ -51,6 +54,9 @@ const styles = {
51
54
  k9WMMc: "xp4054r",
52
55
  kfSwDN: "x87ps6o",
53
56
  kMwMTN: "xnbbluu",
57
+ kWqL5O: "x1pcaw5z",
58
+ kSWEuD: "x32b0ac",
59
+ k26BEO: "xtgwc6q",
54
60
  $$css: true
55
61
  },
56
62
  editor: {
@@ -450,6 +456,7 @@ export function CodeEditor({
450
456
  }), stylex.props(styles.root, focused && styles.rootFocused, xstyle), className, style),
451
457
  ...props,
452
458
  children: /*#__PURE__*/_jsxs("div", {
459
+ dir: "ltr",
453
460
  ...{
454
461
  className: "x78zum5 x98rzlu xysyzu8"
455
462
  },
@@ -468,7 +475,12 @@ export function CodeEditor({
468
475
  position: 'relative',
469
476
  flex: 1
470
477
  },
471
- children: [showPlaceholder && /*#__PURE__*/_jsx("div", {
478
+ children: [showPlaceholder &&
479
+ /*#__PURE__*/
480
+ // The placeholder is prose, not code: it takes its own text's
481
+ // direction, so an Arabic or Hebrew hint still reads correctly.
482
+ _jsx("div", {
483
+ dir: "auto",
472
484
  ...stylex.props(styles.placeholder, sizeStyle),
473
485
  children: placeholder
474
486
  }), /*#__PURE__*/_jsx("code", {
@@ -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;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"}
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;AAq2BD;;;;;;;;;;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"}
@@ -524,6 +524,7 @@ const styles = {
524
524
  khDVqt: "x126k92a",
525
525
  kTgw9: "x1lldw8n",
526
526
  kHjlTd: "xj0a0fe",
527
+ "--_astryx-text-overflow-wrap": "x5ujdhh",
527
528
  $$css: true
528
529
  },
529
530
  added: {
@@ -966,7 +967,7 @@ export function DiffViewer({
966
967
  },
967
968
  children: /*#__PURE__*/_jsx("div", {
968
969
  ...{
969
- className: "x1q06l6i xj0a0fe x41o525"
970
+ className: "x1q06l6i xj0a0fe x5ujdhh x41o525"
970
971
  },
971
972
  children: note
972
973
  })
@@ -1065,7 +1066,7 @@ export function DiffViewer({
1065
1066
  className: "xu0wf1k xrrkdod x1yc453h x11ds9ch xt5rlkq x1sdyfia xszpfcc xykt701 xgtxpae x1osaytk"
1066
1067
  },
1067
1068
  1: {
1068
- className: "xu0wf1k xrrkdod x1yc453h x11ds9ch xt5rlkq xszpfcc xykt701 xgtxpae x1osaytk x126k92a x1lldw8n xj0a0fe"
1069
+ className: "xu0wf1k xrrkdod x1yc453h x11ds9ch xt5rlkq xszpfcc xykt701 xgtxpae x1osaytk x126k92a x1lldw8n xj0a0fe x5ujdhh"
1069
1070
  }
1070
1071
  }[!!isWrapped << 0],
1071
1072
  children: isOld ? renderHunkText(row.header) : /*#__PURE__*/_jsxs(_Fragment, {
@@ -1109,7 +1110,7 @@ export function DiffViewer({
1109
1110
  },
1110
1111
  children: note != null && /*#__PURE__*/_jsx("div", {
1111
1112
  ...{
1112
- className: "x1q06l6i xj0a0fe x41o525"
1113
+ className: "x1q06l6i xj0a0fe x5ujdhh x41o525"
1113
1114
  },
1114
1115
  children: note
1115
1116
  })
@@ -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;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"}
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"}
@@ -364,28 +364,28 @@ export function LogStream({
364
364
  }), /*#__PURE__*/_jsx("span", {
365
365
  ...{
366
366
  0: {
367
- className: "xeuugli xj0a0fe x126k92a"
367
+ className: "xeuugli xj0a0fe x5ujdhh x126k92a"
368
368
  },
369
369
  4: {
370
- className: "xeuugli xj0a0fe x126k92a x45uw2j"
370
+ className: "xeuugli xj0a0fe x5ujdhh x126k92a x45uw2j"
371
371
  },
372
372
  2: {
373
- className: "xeuugli xj0a0fe x126k92a xbz8ry5"
373
+ className: "xeuugli xj0a0fe x5ujdhh x126k92a xbz8ry5"
374
374
  },
375
375
  6: {
376
- className: "xeuugli xj0a0fe x126k92a xbz8ry5"
376
+ className: "xeuugli xj0a0fe x5ujdhh x126k92a xbz8ry5"
377
377
  },
378
378
  1: {
379
- className: "xeuugli xj0a0fe x126k92a x1gnejgv"
379
+ className: "xeuugli xj0a0fe x5ujdhh x126k92a x1gnejgv"
380
380
  },
381
381
  5: {
382
- className: "xeuugli xj0a0fe x126k92a x1gnejgv"
382
+ className: "xeuugli xj0a0fe x5ujdhh x126k92a x1gnejgv"
383
383
  },
384
384
  3: {
385
- className: "xeuugli xj0a0fe x126k92a x1gnejgv"
385
+ className: "xeuugli xj0a0fe x5ujdhh x126k92a x1gnejgv"
386
386
  },
387
387
  7: {
388
- className: "xeuugli xj0a0fe x126k92a x1gnejgv"
388
+ className: "xeuugli xj0a0fe x5ujdhh x126k92a x1gnejgv"
389
389
  }
390
390
  }[!!isTerminal << 2 | !!(isTerminal && entry.level === 'error') << 1 | !!(isTerminal && entry.level === 'warn') << 0],
391
391
  children: entry.message
package/dist/lab.css CHANGED
@@ -30,6 +30,7 @@
30
30
  @keyframes x17t2jll-B{0%{transform:translateY(0);opacity:.35;}30%{transform:translateY(-3px);opacity:1;}60%{transform:translateY(0);opacity:.35;}100%{transform:translateY(0);opacity:.35;}}
31
31
  :root, .x1ucsbpz{--icon-layer-primary-fill:none;--icon-layer-primary-stroke:currentColor;--icon-layer-primary-opacity:1;--icon-layer-primary-stroke-role-fill:none;--icon-layer-primary-stroke-role-stroke:currentColor;--icon-layer-primary-stroke-role-opacity:1;--icon-layer-primary-stroke-role-width:1.5;--icon-layer-secondary-fill:none;--icon-layer-secondary-stroke:currentColor;--icon-layer-secondary-opacity:1;--icon-layer-secondary-stroke-role-fill:none;--icon-layer-secondary-stroke-role-stroke:currentColor;--icon-layer-secondary-stroke-role-opacity:1;--icon-layer-secondary-stroke-role-width:1.5;--icon-size:24px;--icon-stroke-width:1.5;--icon-stroke-linecap:round;--icon-stroke-linejoin:round;--icon-padding:0px;--icon-inline-offset:0px;--icon-block-offset:0px;--icon-bold-stroke-boost:0.5;--icon-gap:0.75;--icon-gap-linejoin:round;}
32
32
  :root, .xc6kv0w{--transfer-list-panel-min-block-size:12rem;--transfer-list-panel-max-block-size:20rem;}
33
+ .x5ujdhh{--_astryx-text-overflow-wrap:anywhere}
33
34
  .x1eijsz{--icon-layer-primary-fill:currentColor}
34
35
  .xawlqpt{--icon-layer-primary-fill:none}
35
36
  .xgmpc9a{--icon-layer-primary-opacity:1}
@@ -649,6 +650,9 @@
649
650
  .x1q0q8m5:not(#\#):not(#\#):not(#\#):not(#\#){border-bottom-style:solid}
650
651
  .x1qhh985:not(#\#):not(#\#):not(#\#):not(#\#){border-bottom-width:0}
651
652
  .x92x3c3:not(#\#):not(#\#):not(#\#):not(#\#){border-bottom-width:var(--border-width)}
653
+ .xtgwc6q:not(#\#):not(#\#):not(#\#):not(#\#){border-right-color:var(--color-border)}
654
+ .x32b0ac:not(#\#):not(#\#):not(#\#):not(#\#){border-right-style:solid}
655
+ .x1pcaw5z:not(#\#):not(#\#):not(#\#):not(#\#){border-right-width:var(--border-width)}
652
656
  .x5mp61g:not(#\#):not(#\#):not(#\#):not(#\#){border-top-color:var(--color-border-orange)}
653
657
  .x1pc3f07:not(#\#):not(#\#):not(#\#):not(#\#){border-top-color:var(--color-border)}
654
658
  .x13fuv20:not(#\#):not(#\#):not(#\#):not(#\#){border-top-style:solid}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@astryxdesign/lab",
3
- "version": "0.7.6-canary.cdc5ec0",
3
+ "version": "0.7.6-canary.ce052bf",
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.6-canary.cdc5ec0",
52
+ "@astryxdesign/core": "0.7.6-canary.ce052bf",
53
53
  "react": ">=19.0.0",
54
54
  "react-dom": ">=19.0.0"
55
55
  },
@@ -59,8 +59,9 @@
59
59
  "d3-shape": "^3.2.0"
60
60
  },
61
61
  "devDependencies": {
62
- "@astryxdesign/a11y-spec": "0.7.6-canary.cdc5ec0",
63
- "@astryxdesign/cli": "0.7.6-canary.cdc5ec0",
62
+ "@astryxdesign/a11y-spec": "0.7.6-canary.ce052bf",
63
+ "@astryxdesign/cli": "0.7.6-canary.ce052bf",
64
+ "@astryxdesign/interaction-harness": "0.7.6-canary.ce052bf",
64
65
  "@babel/cli": "^7.29.7",
65
66
  "@babel/core": "^7.29.7",
66
67
  "@babel/preset-react": "^7.29.7",
@@ -3,7 +3,8 @@
3
3
  /**
4
4
  * @file CircularProgressMotion.a11y.chromium.spec.ts
5
5
  * @input Built CircularProgress stories in real Chromium (Web Animations
6
- * seeking, CDP screencast, tracing)
6
+ * seeking, CDP screencast, tracing), the interaction harness's busy-window
7
+ * control and proof
7
8
  * @output Browser evidence that a determinate value change keeps moving while
8
9
  * a script holds the main thread and paints nothing per frame, that the
9
10
  * ring at rest draws what the stroked circle drew, and that the arc stays
@@ -24,6 +25,14 @@ import {
24
25
  serveStorybook,
25
26
  type StaticServer,
26
27
  } from '@astryxdesign/a11y-spec/storybook';
28
+ import {
29
+ busyWindowProof,
30
+ CONTROL_RGB,
31
+ inPresentationOrder,
32
+ startBusyControl,
33
+ trackMarker,
34
+ type TrackedFrame,
35
+ } from '@astryxdesign/interaction-harness';
27
36
 
28
37
  let storybook: StaticServer;
29
38
  test.beforeAll(async () => {
@@ -151,35 +160,59 @@ async function colors(page: Page) {
151
160
 
152
161
  /**
153
162
  * For each degree clockwise from 12 o'clock, whether the ring's centerline is
154
- * drawn in the fill color in the given screenshot (PNGs of the ring box).
163
+ * drawn in the fill color in the given screenshot: PNGs of the ring box, or,
164
+ * with `frame`, PNGs of the whole viewport (`viewportWidth` CSS px wide) read
165
+ * at the ring box, the same pixels a crop to that box would hold.
155
166
  */
156
167
  async function inkByDegree(
157
168
  page: Page,
158
169
  shots: string[],
159
170
  palette: {fill: number[]; track: number[]},
171
+ frame?: {ring: Box; viewportWidth: number},
160
172
  ): Promise<boolean[][]> {
161
173
  const scratch = await page.context().newPage();
162
174
  try {
163
175
  return await scratch.evaluate(
164
- async ({items, fill, track, diameter, stroke}) => {
176
+ async ({items, fill, track, diameter, stroke, region}) => {
165
177
  const out: boolean[][] = [];
166
178
  for (const item of items) {
167
179
  const bitmap = await createImageBitmap(
168
180
  await (await fetch(`data:image/png;base64,${item}`)).blob(),
169
181
  );
170
- const canvas = new OffscreenCanvas(bitmap.width, bitmap.height);
182
+ // The ring box in the shot's pixels: the whole shot, or the box's
183
+ // pixels in a viewport frame.
184
+ const frameScale =
185
+ region == null ? 1 : bitmap.width / region.viewportWidth;
186
+ const x0 =
187
+ region == null ? 0 : Math.round(region.ring.x * frameScale);
188
+ const y0 =
189
+ region == null ? 0 : Math.round(region.ring.y * frameScale);
190
+ const boxWidth =
191
+ region == null
192
+ ? bitmap.width
193
+ : Math.round(region.ring.width * frameScale);
194
+ const boxHeight =
195
+ region == null
196
+ ? bitmap.height
197
+ : Math.round(region.ring.height * frameScale);
198
+ const canvas = new OffscreenCanvas(boxWidth, boxHeight);
171
199
  const context = canvas.getContext('2d');
172
200
  if (context == null) {
173
201
  throw new Error('no 2d context');
174
202
  }
175
- context.drawImage(bitmap, 0, 0);
176
- const {data, width} = context.getImageData(
203
+ context.drawImage(
204
+ bitmap,
205
+ x0,
206
+ y0,
207
+ boxWidth,
208
+ boxHeight,
177
209
  0,
178
210
  0,
179
- bitmap.width,
180
- bitmap.height,
211
+ boxWidth,
212
+ boxHeight,
181
213
  );
182
- const scale = bitmap.width / diameter;
214
+ const {data, width} = context.getImageData(0, 0, boxWidth, boxHeight);
215
+ const scale = boxWidth / diameter;
183
216
  const r = ((diameter - stroke) / 2) * scale;
184
217
  const c = (diameter / 2) * scale;
185
218
  const d = (a: number[], b: number[]) =>
@@ -199,7 +232,13 @@ async function inkByDegree(
199
232
  }
200
233
  return out;
201
234
  },
202
- {items: shots, ...palette, diameter: DIAMETER, stroke: STROKE},
235
+ {
236
+ items: shots,
237
+ ...palette,
238
+ diameter: DIAMETER,
239
+ stroke: STROKE,
240
+ region: frame ?? null,
241
+ },
203
242
  );
204
243
  } finally {
205
244
  await scratch.close();
@@ -262,6 +301,10 @@ test('a value change keeps moving while a script holds the main thread', async (
262
301
  everyNthFrame: 1,
263
302
  });
264
303
  await page.waitForTimeout(300);
304
+ // The harness's busy-window control, through the block: a box the
305
+ // compositor moves along the top edge, clear of the ring, in the same
306
+ // screencast.
307
+ const control = await startBusyControl(page);
265
308
  // A value change, one presented frame, then 700 ms of script.
266
309
  const busy = await page.evaluate(
267
310
  async ({storyId}) =>
@@ -297,67 +340,68 @@ test('a value change keeps moving while a script holds the main thread', async (
297
340
  }),
298
341
  {storyId: STORY},
299
342
  );
343
+ // Gone once the block ends, so the page is still again when the
344
+ // screencast stops.
345
+ await control.remove();
300
346
  await page.waitForTimeout(300);
301
347
  await cdp.send('Page.stopScreencast');
302
348
  await Promise.all(acks);
303
349
  await cdp.detach();
304
350
  // A lost acknowledgement stalls the screencast and thins the frames.
305
351
  expect(ackFailures).toEqual([]);
306
- // Crop each frame to the ring, then read how far the arc reaches.
307
- const scratch = await page.context().newPage();
308
- let crops: string[];
309
- try {
310
- crops = await scratch.evaluate(
311
- async ({items, ring}) => {
312
- const out: string[] = [];
313
- for (const item of items) {
314
- const bitmap = await createImageBitmap(
315
- await (await fetch(`data:image/png;base64,${item}`)).blob(),
316
- );
317
- const scale = bitmap.width / 240;
318
- const canvas = new OffscreenCanvas(
319
- Math.round(ring.width * scale),
320
- Math.round(ring.height * scale),
321
- );
322
- const context = canvas.getContext('2d');
323
- if (context == null) {
324
- throw new Error('no 2d context');
325
- }
326
- context.drawImage(
327
- bitmap,
328
- Math.round(ring.x * scale),
329
- Math.round(ring.y * scale),
330
- canvas.width,
331
- canvas.height,
332
- 0,
333
- 0,
334
- canvas.width,
335
- canvas.height,
336
- );
337
- const blob = await canvas.convertToBlob({type: 'image/png'});
338
- const bytes = new Uint8Array(await blob.arrayBuffer());
339
- let binary = '';
340
- for (const byte of bytes) {
341
- binary += String.fromCharCode(byte);
342
- }
343
- out.push(btoa(binary));
344
- }
345
- return out;
346
- },
347
- {items: raw.map(f => f.data), ring: box},
348
- );
349
- } finally {
350
- await scratch.close();
351
- }
352
- const rows = await inkByDegree(page, crops, palette);
353
- const frames = rows.map((row, i) => ({t: raw[i].t, ...span(row)}));
352
+ // Chromium encodes each frame off its main thread and can send a slow one
353
+ // after the next: frames go by the swap timestamp each one carries. A frame
354
+ // that shows the arc behind an earlier one still has its own later
355
+ // timestamp, so it stays in place.
356
+ const presented = inPresentationOrder(raw);
357
+ // How far the arc reaches in each frame, read at the ring.
358
+ const rows = await inkByDegree(
359
+ page,
360
+ presented.map(f => f.data),
361
+ palette,
362
+ {ring: box, viewportWidth: 240},
363
+ );
364
+ const frames = rows.map((row, i) => ({t: presented[i].t, ...span(row)}));
354
365
  const inside = frames.filter(
355
366
  f => f.t >= busy.from + 20 && f.t <= busy.to - 20,
356
367
  );
357
- // The change lasts the theme's 410 ms, so it moves through most of the
358
- // block, one piece the whole way, and lands at 90%.
359
- const reaches = new Set(inside.map(f => f.last));
360
- expect(reaches.size).toBeGreaterThanOrEqual(10);
368
+ // The control, in the frames around the block (the proof reads it from the
369
+ // last frame before the block through the block's end).
370
+ const controlFrames = await trackMarker(
371
+ page,
372
+ presented
373
+ .filter(f => f.t >= busy.from - 250 && f.t <= busy.to)
374
+ .map(f => ({
375
+ t: f.t,
376
+ data: f.data,
377
+ format: 'png' as const,
378
+ viewportWidth: 240,
379
+ viewportHeight: 160,
380
+ })),
381
+ {rgb: CONTROL_RGB},
382
+ );
383
+ // The change runs through the block: the arc's reach shows a new degree on
384
+ // every frame the control moved on, and stalls no longer than the control,
385
+ // until it settles (the harness's busy proof: the screencast's capture rate
386
+ // thins both alike). It settles 3 degrees short of its end: on the change's
387
+ // own clock each 1-degree step of the reading takes 2 to 8 ms up to 324,
388
+ // then 12, 12 and 18 ms for 325, 326 and 327 before it rests at 328, so
389
+ // from 325 two frames can read the same degree while the arc still moves.
390
+ // It stays one piece the whole way, and lands at 90%.
391
+ const arc: TrackedFrame[] = frames.map(f => ({
392
+ t: f.t,
393
+ box: {x: f.last, y: 0, width: 1, height: 1},
394
+ pixels: 1,
395
+ }));
396
+ const proof = busyWindowProof(arc, busy, {
397
+ axis: 'x',
398
+ settledWithin: 3,
399
+ control: controlFrames,
400
+ });
401
+ test
402
+ .info()
403
+ .annotations.push({type: 'busy window', description: proof.summary});
404
+ expect(proof.verdict.failures, proof.summary).toEqual([]);
361
405
  for (const frame of inside) {
362
406
  expect(frame.pieces, `pieces at ${frame.t}`).toBe(1);
363
407
  }
@@ -51,6 +51,33 @@ function renderEditor(value = '', props: {escapeHint?: string} = {}) {
51
51
  }
52
52
 
53
53
  describe('CodeEditor', () => {
54
+ it('keeps the code left-to-right inside a right-to-left page', () => {
55
+ render(
56
+ <div dir="rtl">
57
+ <CodeEditor label="Code" value="const a = 1;" onChange={() => {}} />
58
+ </div>,
59
+ );
60
+ const editor = screen.getByRole('textbox', {name: 'Code'});
61
+ expect(editor.closest('[dir]')).toHaveAttribute('dir', 'ltr');
62
+ });
63
+
64
+ it('lets the placeholder take its own text direction', () => {
65
+ render(
66
+ <div dir="rtl">
67
+ <CodeEditor
68
+ label="Code"
69
+ value=""
70
+ onChange={() => {}}
71
+ placeholder="اكتب الكود هنا..."
72
+ />
73
+ </div>,
74
+ );
75
+ expect(screen.getByText('اكتب الكود هنا...')).toHaveAttribute(
76
+ 'dir',
77
+ 'auto',
78
+ );
79
+ });
80
+
54
81
  it('uses the label prop as the accessible name', () => {
55
82
  render(
56
83
  <CodeEditor
@@ -58,7 +58,9 @@ const styles = stylex.create({
58
58
  display: 'flex',
59
59
  borderRadius: radiusVars['--radius-element'],
60
60
  backgroundColor: colorVars['--color-background-muted'],
61
- border: `${borderVars['--border-width']} solid ${colorVars['--color-border']}`,
61
+ borderWidth: borderVars['--border-width'],
62
+ borderStyle: 'solid',
63
+ borderColor: colorVars['--color-border'],
62
64
  overflow: 'hidden',
63
65
  },
64
66
  rootFocused: {
@@ -73,7 +75,9 @@ const styles = stylex.create({
73
75
  textAlign: 'end',
74
76
  userSelect: 'none',
75
77
  color: colorVars['--color-text-disabled'],
76
- borderRight: `${borderVars['--border-width']} solid ${colorVars['--color-border']}`,
78
+ borderRightWidth: borderVars['--border-width'],
79
+ borderRightStyle: 'solid',
80
+ borderRightColor: colorVars['--color-border'],
77
81
  },
78
82
  gutterLine: {
79
83
  fontFamily: typographyVars['--font-family-code'],
@@ -556,7 +560,13 @@ export function CodeEditor({
556
560
  style,
557
561
  )}
558
562
  {...props}>
559
- <div {...stylex.props(styles.editorContainer)} style={containerStyle}>
563
+ {/* Code, with its line numbers, keeps its own left-to-right direction
564
+ inside a right-to-left page (design:bidirectionality DR2): lines read
565
+ and indent correctly, and a long line scrolls from its start. */}
566
+ <div
567
+ dir="ltr"
568
+ {...stylex.props(styles.editorContainer)}
569
+ style={containerStyle}>
560
570
  {hasLineNumbers && (
561
571
  <div
562
572
  {...stylex.props(styles.gutter, gutterSizeStyle)}
@@ -570,7 +580,9 @@ export function CodeEditor({
570
580
  )}
571
581
  <div style={{position: 'relative', flex: 1}}>
572
582
  {showPlaceholder && (
573
- <div {...stylex.props(styles.placeholder, sizeStyle)}>
583
+ // The placeholder is prose, not code: it takes its own text's
584
+ // direction, so an Arabic or Hebrew hint still reads correctly.
585
+ <div dir="auto" {...stylex.props(styles.placeholder, sizeStyle)}>
574
586
  {placeholder}
575
587
  </div>
576
588
  )}
@@ -822,6 +822,8 @@ const styles = stylex.create({
822
822
  whiteSpace: 'pre-wrap',
823
823
  wordBreak: 'normal',
824
824
  overflowWrap: 'anywhere',
825
+ // Text inside keeps `anywhere` too (Text FR3).
826
+ '--_astryx-text-overflow-wrap': 'anywhere',
825
827
  },
826
828
  // Row tints are a background-image layer so a pinned (sticky) cell can lay
827
829
  // them over an opaque syntax background.
@@ -960,6 +962,8 @@ const annotationStyles = stylex.create({
960
962
  content: {
961
963
  direction: {default: null, ':is([dir="rtl"] *)': 'rtl'},
962
964
  overflowWrap: 'anywhere',
965
+ // Text inside keeps `anywhere` too (Text FR3).
966
+ '--_astryx-text-overflow-wrap': 'anywhere',
963
967
  contain: 'inline-size',
964
968
  },
965
969
  });
@@ -257,6 +257,8 @@ const styles = stylex.create({
257
257
  message: {
258
258
  minWidth: 0,
259
259
  overflowWrap: 'anywhere',
260
+ // Text inside keeps `anywhere` too (Text FR3).
261
+ '--_astryx-text-overflow-wrap': 'anywhere',
260
262
  whiteSpace: 'pre-wrap',
261
263
  },
262
264
  messageTerminal: {