gridsmith-ui 0.22.0 → 0.23.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/editor.js CHANGED
@@ -1,3 +1,4 @@
1
+ import { useScrollEdges } from './chunk-3BRQRKDO.js';
1
2
  import { useBreakpoint } from './chunk-CRQ6KCRD.js';
2
3
  import { FormChangeCtx, useOverlayLayer, useCloseOnFocusOut } from './chunk-RT7RYGC3.js';
3
4
  import { useLatest } from './chunk-WH2FUFAC.js';
@@ -200,7 +201,8 @@ function RichTextEditor({
200
201
  ref,
201
202
  className: cn(
202
203
  "flex flex-col rounded-[var(--ds-radius-md)] overflow-hidden",
203
- "border-[length:var(--ds-border-width)] border-[var(--ds-border-default)]",
204
+ // Sprint 25.14 A20: a field's edge, at 3:1 like every other control's
205
+ "border-[length:var(--ds-border-width)] border-[var(--ds-input-border)]",
204
206
  "bg-[var(--ds-bg-surface)]",
205
207
  className
206
208
  ),
@@ -268,6 +270,8 @@ function Toolbar({ editor, groups, onImageRequest }) {
268
270
  }, [editor]);
269
271
  const inTable = editor.isActive("table");
270
272
  const has = (g) => groups.includes(g);
273
+ const { ref: toolbarRef, measure: measureToolbar, fadeProps: toolbarFade } = useScrollEdges({ enabled: isMobile });
274
+ const { ref: tableBarRef, measure: measureTableBar, fadeProps: tableBarFade } = useScrollEdges({ enabled: isMobile && inTable });
271
275
  const groupElements = [];
272
276
  if (has("blockType")) groupElements.push(/* @__PURE__ */ jsx(BlockTypeSelect, { editor }, "blockType"));
273
277
  if (has("fontFamily")) groupElements.push(/* @__PURE__ */ jsx(FontFamilySelect, { editor }, "fontFamily"));
@@ -375,6 +379,9 @@ function Toolbar({ editor, groups, onImageRequest }) {
375
379
  /* @__PURE__ */ jsx(
376
380
  "div",
377
381
  {
382
+ ref: toolbarRef,
383
+ onScroll: measureToolbar,
384
+ ...toolbarFade,
378
385
  className: cn(
379
386
  "flex items-center gap-ds-0.5 px-ds-2 py-ds-1",
380
387
  isMobile ? "overflow-x-auto flex-nowrap gs-scrollbar-none" : "flex-wrap"
@@ -382,7 +389,7 @@ function Toolbar({ editor, groups, onImageRequest }) {
382
389
  children: withDividers
383
390
  }
384
391
  ),
385
- inTable && /* @__PURE__ */ jsxs("div", { className: cn(
392
+ inTable && /* @__PURE__ */ jsxs("div", { ref: tableBarRef, onScroll: measureTableBar, ...tableBarFade, className: cn(
386
393
  "flex items-center gap-ds-0.5 px-ds-2 py-ds-1 border-t-[length:var(--ds-border-width)] border-[var(--ds-border-subtle)]",
387
394
  isMobile && "overflow-x-auto flex-nowrap gs-scrollbar-none"
388
395
  ), children: [
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../showcase/src/components/RichTextEditor.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BA,IAAM,QAAA,GAAW,eAAe,GAAG,CAAA;AAenC,IAAM,eAAA,GAAkC;AAAA,EACtC,WAAA;AAAA,EAAa,YAAA;AAAA,EAAc,UAAA;AAAA,EAC3B,YAAA;AAAA,EAAc,QAAA;AAAA,EAAU,WAAA;AAAA,EACxB,OAAA;AAAA,EAAS,QAAA;AAAA,EAAU,QAAA;AAAA,EAAU,QAAA;AAAA,EAAU;AACzC,CAAA;AAEA,IAAM,eAAA,GAAkC;AAAA,EACtC,YAAA;AAAA,EAAc,OAAA;AAAA,EAAS,QAAA;AAAA,EAAU;AACnC,CAAA;AAmDA,IAAM,WAAA,GAAc,GAAA;AACpB,IAAM,gBAAA,GAAmB,GAAA;AACzB,IAAM,cAAA,GAAiB,EAAA;AAMvB,SAAS,YAAA,CAAa,QAAgB,QAAA,EAAe;AACnD,EAAA,MAAM,EAAE,OAAM,GAAI,MAAA;AAClB,EAAA,MAAM,QAAQ,KAAA,CAAM,GAAA,CAAI,OAAA,CAAQ,aAAA,CAAc,SAAS,OAAO,CAAA;AAC9D,EAAA,IAAI,SAAS,IAAA,EAAM;AACnB,EAAA,IAAI,EAAE,GAAG,IAAA,EAAM,CAAA,EAAG,MAAK,GAAI,KAAA,CAAM,GAAA,CAAI,OAAA,CAAQ,WAAA,CAAY,QAAA,CAAS,OAAO,CAAA,IAAK,EAAE,GAAG,KAAA,CAAM,GAAA,CAAI,QAAQ,IAAA,EAAM,CAAA,EAAG,QAAA,CAAS,OAAA,CAAQ,IAAA,EAAK;AAEpI,EAAA,MAAM,OAAA,GAAU,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,MAAM,IAAI,CAAA;AAC3C,EAAA,IAAI,UAAU,CAAA,EAAG;AAAE,IAAA,IAAA,IAAQ,OAAA;AAAS,IAAA,IAAA,IAAQ,OAAA;AAAA,EAAS;AACrD,EAAA,IAAI,KAAK,KAAA,CAAM,EAAA;AACf,EAAA,IAAI;AACF,IAAA,EAAA,GAAK,EAAA,CAAG,QAAQ,KAAA,EAAO,IAAA,EAAM,SAAS,KAAA,CAAM,KAAA,EAAO,IAAI,CAAC,CAAA;AAAA,EAC1D,CAAA,CAAA,MAAQ;AACN,IAAA,EAAA,GAAK,KAAA,CAAM,GAAG,WAAA,CAAY,CAAA,EAAG,MAAM,GAAA,CAAI,OAAA,CAAQ,IAAA,EAAM,QAAA,CAAS,OAAO,CAAA;AAAA,EACvE;AACA,EAAA,MAAA,CAAO,IAAA,CAAK,QAAA,CAAS,EAAA,CAAG,OAAA,CAAQ,cAAA,EAAgB,KAAK,CAAA,CAAE,OAAA,CAAQ,eAAA,EAAiB,IAAI,CAAC,CAAA;AACvF;AAEO,SAAS,cAAA,CAAe;AAAA,EAC7B,OAAA,GAAU,EAAA;AAAA,EACV,WAAA,GAAc,kBAAA;AAAA,EACd,QAAA;AAAA,EACA,QAAA,GAAW,IAAA;AAAA,EACX,OAAA,GAAU,MAAA;AAAA,EACV,SAAA;AAAA,EACA,GAAA;AAAA,EAAK,MAAA;AAAA,EAAQ,cAAA;AAAA,EAAgB,KAAA,GAAQ;AAAmB,CAAA,EAAwB;AAChF,EAAA,MAAM,kBAAkB,OAAA,KAAY,MAAA,GAAS,eAAA,GAAkB,OAAA,KAAY,YAAY,eAAA,GAAkB,OAAA;AAEzG,EAAA,MAAM,YAAA,GAAe,SAAA,CAAU,UAAA,CAAW,aAAa,CAAC,CAAA;AAIxD,EAAA,MAAM,UAAA,GAAa,MAAA,CAA2C,EAAE,CAAA;AAChE,EAAA,MAAM,SAAS,SAAA,CAAU;AAAA,IACvB,UAAA,EAAY;AAAA,MACV,WAAW,SAAA,CAAU;AAAA,QACnB,SAAA,EAAW,KAAA;AAAA,QACX,IAAA,EAAM,EAAE,WAAA,EAAa,KAAA,EAAO,gBAAgB,EAAE,KAAA,EAAO,YAAW;AAAE,OACnE,CAAA;AAAA,MACD,MAAM,SAAA,CAAU,EAAE,QAAQ,KAAA,EAAO,WAAA,EAAa,MAAM,CAAA;AAAA,MACpD,iBAAA,CAAkB,SAAA,CAAU,EAAE,QAAA,EAAU,CAAA;AAAA,MACxC,KAAA,CAAM,SAAA,CAAU,EAAE,SAAA,EAAW,OAAO,CAAA;AAAA,MACpC,QAAA;AAAA,MACA,SAAA;AAAA,MACA,WAAA;AAAA,MACA,WAAA,CAAY,SAAA,CAAU,EAAE,WAAA,EAAa,CAAA;AAAA,MACrC,SAAA;AAAA,MACA,QAAA;AAAA,MACA,KAAA;AAAA,MACA,SAAA,CAAU,SAAA,CAAU,EAAE,UAAA,EAAY,MAAM,CAAA;AAAA,MACxC,SAAA,CAAU,UAAU,EAAE,KAAA,EAAO,CAAC,SAAA,EAAW,WAAW,GAAG,CAAA;AAAA,MACvD,QAAA;AAAA,MACA,QAAA,CAAS,SAAA,CAAU,EAAE,MAAA,EAAQ,MAAM,CAAA;AAAA,MACnC,SAAA;AAAA,MACA,WAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,OAAA;AAAA,IACA,QAAA;AAAA;AAAA,IAEA,WAAA,EAAa,EAAE,UAAA,EAAY,EAAE,IAAA,EAAM,WAAW,YAAA,EAAc,KAAA,EAAO,gBAAA,EAAkB,MAAA,EAAO,EAAE;AAAA,IAC9F,QAAA,EAAU,CAAC,EAAE,MAAA,EAAQ,GAAE,KAAM;AAC3B,MAAA,MAAM,IAAA,GAAO,EAAE,OAAA,EAAQ;AACvB,MAAA,MAAM,UAAU,UAAA,CAAW,OAAA;AAC3B,MAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,IAAA,EAAM,CAAA;AACrB,MAAA,IAAI,KAAA,GAAQ,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,EAAG,MAAM,CAAA,GAAI,CAAA,CAAE,IAAA,CAAK,MAAA,EAAQ,CAAC,CAAA;AACzD,MAAA,OAAO,OAAA,CAAQ,MAAA,GAAS,CAAA,KAAM,OAAA,CAAQ,MAAA,GAAS,WAAA,IAAe,KAAA,GAAQ,gBAAA,CAAA,EAAmB,KAAA,IAAS,OAAA,CAAQ,KAAA,EAAM,CAAG,IAAA,CAAK,MAAA;AACxH,MAAA,YAAA,CAAa,OAAA,IAAU;AACvB,MAAA,QAAA,GAAW,IAAI,CAAA;AAAA,IACjB;AAAA,GACD,CAAA;AAQD,EAAA,MAAM,UAAA,GAAa,UAAU,OAAO,CAAA;AACpC,EAAA,MAAM,cAAA,GAAiB,OAAO,KAAK,CAAA;AACnC,EAAA,MAAM,MAAA,GAAS,WAAA,CAAY,CAAC,EAAA,KAAe;AACzC,IAAA,IAAI,GAAG,WAAA,EAAa;AACpB,IAAA,MAAM,OAAO,UAAA,CAAW,OAAA;AACxB,IAAA,MAAM,OAAA,GAAU,GAAG,OAAA,EAAQ;AAC3B,IAAA,MAAM,UAAU,UAAA,CAAW,OAAA;AAE3B,IAAA,IAAI,SAAS,OAAA,EAAS;AAAE,MAAA,OAAA,CAAQ,MAAA,GAAS,CAAA;AAAG,MAAA;AAAA,IAAQ;AAEpD,IAAA,MAAM,MAAA,GAAS,QAAQ,GAAA,CAAI,CAAC,MAAM,CAAA,CAAE,IAAI,CAAA,CAAE,WAAA,CAAY,IAAI,CAAA;AAC1D,IAAA,IAAI,WAAW,EAAA,EAAI;AAAE,MAAA,OAAA,CAAQ,MAAA,CAAO,GAAG,MAAM,CAAA;AAAG,MAAA;AAAA,IAAQ;AACxD,IAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAAmB,cAAA,CAAe,CAAA,EAAG,EAAA,CAAG,MAAA,EAAQ,EAAC,EAAG,EAAE,qBAAA,EAAuB,KAAA,EAAO,CAAA;AACnG,IAAA,IAAI,QAAA;AACJ,IAAA,IAAI;AACF,MAAA,QAAA,GAAW,MAAM,IAAI,CAAA;AACrB,MAAA,IAAI,QAAA,CAAS,EAAA,CAAG,KAAA,CAAM,OAAO,CAAC,CAAA,EAAG;AAAE,QAAA,OAAA,CAAQ,MAAA,GAAS,CAAA;AAAG,QAAA;AAAA,MAAQ;AAC/D,MAAA,KAAA,IAAS,CAAA,GAAI,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG,CAAA,IAAK,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,OAAA,CAAQ,MAAA,GAAS,cAAc,CAAA,EAAG,CAAA,EAAA,EAAK;AACvF,QAAA,MAAM,GAAA,GAAM,QAAQ,CAAC,CAAA;AACrB,QAAA,GAAA,CAAI,GAAA,KAAQ,KAAA,CAAM,GAAA,CAAI,IAAI,CAAA;AAC1B,QAAA,IAAI,GAAA,CAAI,GAAA,CAAI,EAAA,CAAG,QAAQ,CAAA,EAAG;AAAE,UAAA,OAAA,CAAQ,MAAA,CAAO,GAAG,CAAC,CAAA;AAAG,UAAA;AAAA,QAAQ;AAAA,MAC5D;AAAA,IACF,CAAA,CAAA,MAAQ;AACN,MAAA;AAAA,IACF;AACA,IAAA,IAAI,EAAA,CAAG,KAAK,SAAA,EAAW;AACrB,MAAA,cAAA,CAAe,OAAA,GAAU,IAAA;AACzB,MAAA;AAAA,IACF;AACA,IAAA,OAAA,CAAQ,MAAA,GAAS,CAAA;AACjB,IAAA,YAAA,CAAa,IAAI,QAAQ,CAAA;AAAA,EAC3B,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAEf,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,MAAA,SAAe,MAAM,CAAA;AAAA,EAC3B,CAAA,EAAG,CAAC,MAAA,EAAQ,OAAA,EAAS,MAAM,CAAC,CAAA;AAE5B,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,MAAM,GAAA,GAAM,OAAO,IAAA,CAAK,GAAA;AACxB,IAAA,MAAM,QAAQ,MAAM;AAClB,MAAA,IAAI,CAAC,eAAe,OAAA,EAAS;AAC7B,MAAA,cAAA,CAAe,OAAA,GAAU,KAAA;AAEzB,MAAA,UAAA,CAAW,MAAM,MAAA,CAAO,MAAM,CAAC,CAAA;AAAA,IACjC,CAAA;AACA,IAAA,GAAA,CAAI,gBAAA,CAAiB,kBAAkB,KAAK,CAAA;AAC5C,IAAA,OAAO,MAAM,GAAA,CAAI,mBAAA,CAAoB,gBAAA,EAAkB,KAAK,CAAA;AAAA,EAC9D,CAAA,EAAG,CAAC,MAAA,EAAQ,MAAM,CAAC,CAAA;AAGnB,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,MAAA,IAAU,CAAC,MAAA,CAAO,WAAA,IAAe,MAAA,CAAO,eAAe,QAAA,EAAU,MAAA,CAAO,WAAA,CAAY,QAAA,EAAU,KAAK,CAAA;AAAA,EACzG,CAAA,EAAG,CAAC,MAAA,EAAQ,QAAQ,CAAC,CAAA;AAErB,EAAA,mBAAA,CAAoB,QAAQ,OAAO;AAAA,IACjC,UAAA,EAAY,CAAC,IAAA,KAAS;AAAE,MAAA,IAAI,UAAU,CAAC,MAAA,CAAO,aAAa,MAAA,CAAO,QAAA,CAAS,WAAW,IAAI,CAAA;AAAA,IAAG,CAAA;AAAA,IAC7F,aAAA,EAAe,CAAC,IAAA,KAAS;AAAE,MAAA,MAAA,EAAQ,OAAM,CAAE,KAAA,GAAQ,aAAA,CAAc,IAAI,EAAE,GAAA,EAAI;AAAA,IAAG,CAAA;AAAA,IAC9E,WAAA,EAAa,CAAC,EAAE,GAAA,EAAK,KAAI,KAAM;AAAE,MAAA,MAAA,EAAQ,KAAA,EAAM,CAAE,KAAA,EAAM,CAAE,QAAA,CAAS,EAAE,GAAA,EAAK,GAAA,EAAK,GAAA,IAAO,MAAA,EAAW,CAAA,CAAE,GAAA,EAAI;AAAA,IAAG,CAAA;AAAA,IACzG,OAAO,MAAM;AAAE,MAAA,MAAA,EAAQ,SAAS,KAAA,EAAM;AAAA,IAAG,CAAA;AAAA,IACzC,OAAA,EAAS,MAAM,MAAA,EAAQ,OAAA,EAAQ,IAAK;AAAA,GACtC,CAAA,EAAI,CAAC,MAAM,CAAC,CAAA;AAEZ,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AAEpB,EAAA,uBACE,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,SAAA,EAAW,EAAA;AAAA,QACT,6DAAA;AAAA,QACA,0EAAA;AAAA,QACA,2BAAA;AAAA,QACA;AAAA,OACF;AAAA,MAEC,QAAA,EAAA;AAAA,QAAA,QAAA,oBAAY,GAAA,CAAC,OAAA,EAAA,EAAQ,MAAA,EAAgB,MAAA,EAAQ,iBAAiB,cAAA,EAAgC,CAAA;AAAA,wBAE/F,GAAA;AAAA,UAAC,aAAA;AAAA,UAAA;AAAA,YACC,MAAA;AAAA,YACA,SAAA,EAAW,EAAA;AAAA,cACT,aAAA;AAAA,cACA,wCAAA;AAAA,cACA,uCAAA;AAAA,cACA;AAAA;AACF;AAAA;AACF;AAAA;AAAA,GACF;AAEJ;AAIA,IAAM,WAAA,GAAc;AAAA,EAClB,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,EAAA,EAAG;AAAA,EAC9B,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,SAAA,EAAU;AAAA,EACjC,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,SAAA,EAAU;AAAA,EACpC,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,SAAA,EAAU;AAAA,EACpC,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,SAAA,EAAU;AAAA,EACnC,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,SAAA,EAAU;AAAA,EAClC,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,SAAA,EAAU;AAAA,EACpC,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,SAAA;AAC1B,CAAA;AAEA,IAAM,gBAAA,GAAmB;AAAA,EACvB,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,EAAA,EAAG;AAAA,EAC3B,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,SAAA,EAAU;AAAA,EACpC,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,SAAA,EAAU;AAAA,EACnC,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,SAAA,EAAU;AAAA,EAClC,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,SAAA,EAAU;AAAA,EAClC,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,SAAA,EAAU;AAAA,EACpC,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,SAAA;AAC5B,CAAA;AAEA,IAAM,aAAA,GAAgB;AAAA,EACpB,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,EAAA,EAAG;AAAA,EAC9B,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,qBAAA,EAAsB;AAAA,EAC9C,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,qBAAA,EAAsB;AAAA,EAC9C,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,wBAAA,EAAyB;AAAA,EACpD,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,gBAAA;AAC3B,CAAA;AAEA,IAAM,UAAA,GAAa;AAAA,EACjB,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,QAAA,EAAS;AAAA,EAClC,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,EAAA,EAAG;AAAA,EAC7B,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,OAAA,EAAQ;AAAA,EACjC,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,OAAA;AAC1B,CAAA;AAEA,SAAS,OAAA,CAAQ,EAAE,MAAA,EAAQ,MAAA,EAAQ,gBAAe,EAAuG;AACvJ,EAAA,MAAM,GAAG,WAAW,CAAA,GAAI,SAAS,CAAC,CAAA;AAClC,EAAA,MAAM,QAAA,GAAW,cAAc,IAAI,CAAA;AAEnC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,UAAU,MAAM,WAAA,CAAY,CAAC,CAAA,KAAM,IAAI,CAAC,CAAA;AAC9C,IAAA,MAAA,CAAO,EAAA,CAAG,mBAAmB,OAAO,CAAA;AACpC,IAAA,MAAA,CAAO,EAAA,CAAG,eAAe,OAAO,CAAA;AAChC,IAAA,OAAO,MAAM;AACX,MAAA,MAAA,CAAO,GAAA,CAAI,mBAAmB,OAAO,CAAA;AACrC,MAAA,MAAA,CAAO,GAAA,CAAI,eAAe,OAAO,CAAA;AAAA,IACnC,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,QAAA,CAAS,OAAO,CAAA;AACvC,EAAA,MAAM,GAAA,GAAM,CAAC,CAAA,KAAoB,MAAA,CAAO,SAAS,CAAC,CAAA;AAElD,EAAA,MAAM,gBAAmC,EAAC;AAE1C,EAAA,IAAI,GAAA,CAAI,WAAW,CAAA,EAAG,aAAA,CAAc,qBAAK,GAAA,CAAC,eAAA,EAAA,EAAgC,MAAA,EAAA,EAAZ,WAA4B,CAAE,CAAA;AAC5F,EAAA,IAAI,GAAA,CAAI,YAAY,CAAA,EAAG,aAAA,CAAc,qBAAK,GAAA,CAAC,gBAAA,EAAA,EAAkC,MAAA,EAAA,EAAb,YAA6B,CAAE,CAAA;AAC/F,EAAA,IAAI,GAAA,CAAI,UAAU,CAAA,EAAG,aAAA,CAAc,qBAAK,GAAA,CAAC,gBAAA,EAAA,EAAgC,MAAA,EAAA,EAAX,UAA2B,CAAE,CAAA;AAE3F,EAAA,IAAI,GAAA,CAAI,YAAY,CAAA,EAAG;AACrB,IAAA,aAAA,CAAc,IAAA;AAAA,2BACX,SAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,OAAA,EAAA,EAAQ,MAAA,EAAQ,MAAA,CAAO,QAAA,CAAS,MAAM,GAAG,OAAA,EAAS,MAAM,MAAA,CAAO,KAAA,EAAM,CAAE,KAAA,GAAQ,UAAA,EAAW,CAAE,GAAA,EAAI,EAAG,KAAA,EAAM,eAAA,EACxG,QAAA,kBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAK,MAAA,EAAO,IAAA,EAAM,EAAA,EAAI,CAAA,EAC9B,CAAA;AAAA,wBACA,GAAA,CAAC,OAAA,EAAA,EAAQ,MAAA,EAAQ,MAAA,CAAO,QAAA,CAAS,QAAQ,CAAA,EAAG,OAAA,EAAS,MAAM,MAAA,CAAO,KAAA,EAAM,CAAE,KAAA,GAAQ,YAAA,EAAa,CAAE,GAAA,EAAI,EAAG,KAAA,EAAM,iBAAA,EAC5G,QAAA,kBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAK,QAAA,EAAS,IAAA,EAAM,EAAA,EAAI,CAAA,EAChC,CAAA;AAAA,wBACA,GAAA,CAAC,OAAA,EAAA,EAAQ,MAAA,EAAQ,MAAA,CAAO,QAAA,CAAS,WAAW,CAAA,EAAG,OAAA,EAAS,MAAM,MAAA,CAAO,KAAA,EAAM,CAAE,KAAA,GAAQ,eAAA,EAAgB,CAAE,GAAA,EAAI,EAAG,KAAA,EAAM,oBAAA,EAClH,QAAA,kBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAK,WAAA,EAAY,IAAA,EAAM,EAAA,EAAI,CAAA,EACnC,CAAA;AAAA,wBACA,GAAA,CAAC,OAAA,EAAA,EAAQ,MAAA,EAAQ,MAAA,CAAO,QAAA,CAAS,QAAQ,CAAA,EAAG,OAAA,EAAS,MAAM,MAAA,CAAO,KAAA,EAAM,CAAE,KAAA,GAAQ,YAAA,EAAa,CAAE,GAAA,EAAI,EAAG,KAAA,EAAM,eAAA,EAC5G,QAAA,kBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAK,eAAA,EAAgB,IAAA,EAAM,EAAA,EAAI,CAAA,EACvC;AAAA,OAAA,EAAA,EAZa,YAaf;AAAA,KACF;AAAA,EACF;AAEA,EAAA,IAAI,GAAA,CAAI,QAAQ,CAAA,EAAG;AACjB,IAAA,aAAA,CAAc,IAAA;AAAA,2BACX,SAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAAC,WAAA;AAAA,UAAA;AAAA,YACC,MAAA,EAAQ,WAAA;AAAA,YACR,WAAA,EAAa,MAAA,CAAO,aAAA,CAAc,WAAW,EAAE,KAAA,IAAS,EAAA;AAAA,YACxD,QAAA,EAAU,CAAC,CAAA,KAAM,CAAA,GAAI,OAAO,KAAA,EAAM,CAAE,OAAM,CAAE,QAAA,CAAS,CAAC,CAAA,CAAE,GAAA,KAAQ,MAAA,CAAO,KAAA,GAAQ,KAAA,EAAM,CAAE,UAAA,EAAW,CAAE,GAAA,EAAI;AAAA,YACxG,KAAA,EAAM,YAAA;AAAA,YACN,sBAAM,GAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAK,MAAA,EAAO,MAAM,EAAA,EAAI;AAAA;AAAA,SACpC;AAAA,wBACA,GAAA;AAAA,UAAC,WAAA;AAAA,UAAA;AAAA,YACC,MAAA,EAAQ,gBAAA;AAAA,YACR,WAAA,EAAa,MAAA,CAAO,aAAA,CAAc,WAAW,EAAE,KAAA,IAAS,EAAA;AAAA,YACxD,QAAA,EAAU,CAAC,CAAA,KAAM,CAAA,GAAI,MAAA,CAAO,OAAM,CAAE,KAAA,EAAM,CAAE,eAAA,CAAgB,EAAE,KAAA,EAAO,GAAG,CAAA,CAAE,GAAA,EAAI,GAAI,MAAA,CAAO,KAAA,GAAQ,KAAA,EAAM,CAAE,cAAA,EAAe,CAAE,GAAA,EAAI;AAAA,YAC9H,KAAA,EAAM,WAAA;AAAA,YACN,sBAAM,GAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAK,WAAA,EAAY,MAAM,EAAA,EAAI;AAAA;AAAA;AACzC,OAAA,EAAA,EAda,QAef;AAAA,KACF;AAAA,EACF;AAEA,EAAA,IAAI,GAAA,CAAI,WAAW,CAAA,EAAG;AACpB,IAAA,aAAA,CAAc,IAAA;AAAA,2BACX,SAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,OAAA,EAAA,EAAQ,MAAA,EAAQ,MAAA,CAAO,QAAA,CAAS,EAAE,SAAA,EAAW,MAAA,EAAQ,CAAA,EAAG,OAAA,EAAS,MAAM,MAAA,CAAO,KAAA,EAAM,CAAE,KAAA,EAAM,CAAE,YAAA,CAAa,MAAM,CAAA,CAAE,GAAA,EAAI,EAAG,KAAA,EAAM,YAAA,EAC/H,QAAA,kBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAK,YAAA,EAAa,IAAA,EAAM,IAAI,CAAA,EACpC,CAAA;AAAA,wBACA,GAAA,CAAC,OAAA,EAAA,EAAQ,MAAA,EAAQ,MAAA,CAAO,QAAA,CAAS,EAAE,SAAA,EAAW,QAAA,EAAU,CAAA,EAAG,OAAA,EAAS,MAAM,OAAO,KAAA,EAAM,CAAE,KAAA,EAAM,CAAE,YAAA,CAAa,QAAQ,CAAA,CAAE,GAAA,EAAI,EAAG,KAAA,EAAM,cAAA,EACnI,QAAA,kBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAK,cAAA,EAAe,IAAA,EAAM,IAAI,CAAA,EACtC,CAAA;AAAA,wBACA,GAAA,CAAC,OAAA,EAAA,EAAQ,MAAA,EAAQ,MAAA,CAAO,QAAA,CAAS,EAAE,SAAA,EAAW,OAAA,EAAS,CAAA,EAAG,OAAA,EAAS,MAAM,OAAO,KAAA,EAAM,CAAE,KAAA,EAAM,CAAE,YAAA,CAAa,OAAO,CAAA,CAAE,GAAA,EAAI,EAAG,KAAA,EAAM,aAAA,EACjI,QAAA,kBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAK,aAAA,EAAc,IAAA,EAAM,IAAI,CAAA,EACrC;AAAA,OAAA,EAAA,EATa,WAUf;AAAA,KACF;AAAA,EACF;AAEA,EAAA,IAAI,GAAA,CAAI,OAAO,CAAA,EAAG;AAChB,IAAA,aAAA,CAAc,IAAA;AAAA,2BACX,SAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,OAAA,EAAA,EAAQ,MAAA,EAAQ,MAAA,CAAO,QAAA,CAAS,YAAY,GAAG,OAAA,EAAS,MAAM,MAAA,CAAO,KAAA,EAAM,CAAE,KAAA,GAAQ,gBAAA,EAAiB,CAAE,GAAA,EAAI,EAAG,KAAA,EAAM,aAAA,EACpH,QAAA,kBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAK,MAAA,EAAO,IAAA,EAAM,EAAA,EAAI,CAAA,EAC9B,CAAA;AAAA,wBACA,GAAA,CAAC,OAAA,EAAA,EAAQ,MAAA,EAAQ,MAAA,CAAO,QAAA,CAAS,aAAa,CAAA,EAAG,OAAA,EAAS,MAAM,MAAA,CAAO,KAAA,EAAM,CAAE,KAAA,GAAQ,iBAAA,EAAkB,CAAE,GAAA,EAAI,EAAG,KAAA,EAAM,cAAA,EACtH,QAAA,kBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAK,cAAA,EAAe,IAAA,EAAM,EAAA,EAAI,CAAA,EACtC,CAAA;AAAA,wBACA,GAAA,CAAC,OAAA,EAAA,EAAQ,MAAA,EAAQ,MAAA,CAAO,QAAA,CAAS,UAAU,CAAA,EAAG,OAAA,EAAS,MAAM,MAAA,CAAO,KAAA,EAAM,CAAE,KAAA,GAAQ,cAAA,EAAe,CAAE,GAAA,EAAI,EAAG,KAAA,EAAM,WAAA,EAChH,QAAA,kBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAK,aAAA,EAAc,IAAA,EAAM,EAAA,EAAI,CAAA,EACrC;AAAA,OAAA,EAAA,EATa,OAUf;AAAA,KACF;AAAA,EACF;AAEA,EAAA,IAAI,GAAA,CAAI,QAAQ,CAAA,EAAG;AACjB,IAAA,aAAA,CAAc,IAAA;AAAA,2BACX,SAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,OAAA,EAAA,EAAQ,MAAA,EAAQ,MAAA,CAAO,QAAA,CAAS,YAAY,GAAG,OAAA,EAAS,MAAM,MAAA,CAAO,KAAA,EAAM,CAAE,KAAA,GAAQ,gBAAA,EAAiB,CAAE,GAAA,EAAI,EAAG,KAAA,EAAM,YAAA,EACpH,QAAA,kBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAK,OAAA,EAAQ,IAAA,EAAM,EAAA,EAAI,CAAA,EAC/B,CAAA;AAAA,wBACA,GAAA,CAAC,OAAA,EAAA,EAAQ,MAAA,EAAQ,MAAA,CAAO,QAAA,CAAS,WAAW,CAAA,EAAG,OAAA,EAAS,MAAM,MAAA,CAAO,KAAA,EAAM,CAAE,KAAA,GAAQ,eAAA,EAAgB,CAAE,GAAA,EAAI,EAAG,KAAA,EAAM,YAAA,EAClH,QAAA,kBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAK,MAAA,EAAO,IAAA,EAAM,EAAA,EAAI,CAAA,EAC9B;AAAA,OAAA,EAAA,EANa,QAOf;AAAA,KACF;AAAA,EACF;AAEA,EAAA,IAAI,GAAA,CAAI,QAAQ,CAAA,EAAG;AACjB,IAAA,aAAA,CAAc,IAAA;AAAA,2BACX,SAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,eAAY,MAAA,EAAgB,CAAA;AAAA,QAC5B,cAAA;AAAA;AAAA,8BAEE,OAAA,EAAA,EAAQ,OAAA,EAAS,MAAM,cAAA,CAAe,CAAC,KAAA,KAAU;AAAE,YAAA,MAAA,CAAO,KAAA,EAAM,CAAE,KAAA,EAAM,CAAE,SAAS,EAAE,GAAA,EAAK,KAAA,CAAM,GAAA,EAAK,KAAK,KAAA,CAAM,GAAA,IAAO,MAAA,EAAW,EAAE,GAAA,EAAI;AAAA,UAAG,CAAC,CAAA,EAAG,KAAA,EAAM,OAAA,EACpJ,QAAA,kBAAA,GAAA,CAAC,QAAK,IAAA,EAAK,OAAA,EAAQ,IAAA,EAAM,EAAA,EAAI,CAAA,EAC/B;AAAA,4BAEA,GAAA,CAAC,gBAAa,MAAA,EAAgB,CAAA;AAAA,wBAEhC,GAAA,CAAC,OAAA,EAAA,EAAQ,OAAA,EAAS,MAAM,MAAA,CAAO,KAAA,EAAM,CAAE,KAAA,EAAM,CAAE,WAAA,CAAY,EAAE,IAAA,EAAM,GAAG,IAAA,EAAM,CAAA,EAAG,aAAA,EAAe,IAAA,EAAM,CAAA,CAAE,GAAA,EAAI,EAAG,UAAU,OAAA,EAAS,KAAA,EAAM,cAAA,EACpI,QAAA,kBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAK,OAAA,EAAQ,IAAA,EAAM,IAAI,CAAA,EAC/B,CAAA;AAAA,wBACA,GAAA,CAAC,WAAQ,OAAA,EAAS,MAAM,OAAO,KAAA,EAAM,CAAE,OAAM,CAAE,iBAAA,GAAoB,GAAA,EAAI,EAAG,OAAM,iBAAA,EAC9E,QAAA,kBAAA,GAAA,CAAC,QAAK,IAAA,EAAK,OAAA,EAAQ,IAAA,EAAM,EAAA,EAAI,CAAA,EAC/B;AAAA,OAAA,EAAA,EAfa,QAgBf;AAAA,KACF;AAAA,EACF;AAEA,EAAA,IAAI,GAAA,CAAI,QAAQ,CAAA,EAAG;AACjB,IAAA,aAAA,CAAc,IAAA;AAAA,2BACX,SAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,OAAA,EAAA,EAAQ,MAAA,EAAQ,MAAA,CAAO,QAAA,CAAS,MAAM,GAAG,OAAA,EAAS,MAAM,MAAA,CAAO,KAAA,EAAM,CAAE,KAAA,GAAQ,UAAA,EAAW,CAAE,GAAA,EAAI,EAAG,KAAA,EAAM,aAAA,EACxG,QAAA,kBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAK,MAAA,EAAO,IAAA,EAAM,EAAA,EAAI,CAAA,EAC9B,CAAA;AAAA,wBACA,GAAA,CAAC,OAAA,EAAA,EAAQ,MAAA,EAAQ,MAAA,CAAO,QAAA,CAAS,aAAa,CAAA,EAAG,OAAA,EAAS,MAAM,MAAA,CAAO,KAAA,EAAM,CAAE,KAAA,GAAQ,iBAAA,EAAkB,CAAE,GAAA,EAAI,EAAG,KAAA,EAAM,aAAA,EACtH,QAAA,kBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAK,aAAA,EAAc,IAAA,EAAM,EAAA,EAAI,CAAA,EACrC,CAAA;AAAA,wBACA,GAAA,CAAC,OAAA,EAAA,EAAQ,MAAA,EAAQ,MAAA,CAAO,QAAA,CAAS,WAAW,CAAA,EAAG,OAAA,EAAS,MAAM,MAAA,CAAO,KAAA,EAAM,CAAE,KAAA,GAAQ,eAAA,EAAgB,CAAE,GAAA,EAAI,EAAG,KAAA,EAAM,WAAA,EAClH,QAAA,kBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAK,WAAA,EAAY,IAAA,EAAM,EAAA,EAAI,CAAA,EACnC;AAAA,OAAA,EAAA,EATa,QAUf;AAAA,KACF;AAAA,EACF;AAEA,EAAA,IAAI,GAAA,CAAI,SAAS,CAAA,EAAG;AAClB,IAAA,aAAA,CAAc,IAAA;AAAA,2BACX,SAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,OAAA,EAAA,EAAQ,OAAA,EAAS,MAAM,MAAA,CAAO,KAAA,EAAM,CAAE,KAAA,EAAM,CAAE,IAAA,EAAK,CAAE,GAAA,EAAI,EAAG,QAAA,EAAU,CAAC,MAAA,CAAO,GAAA,EAAI,CAAE,IAAA,EAAK,EAAG,KAAA,EAAM,eAAA,EACjG,QAAA,kBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAK,MAAA,EAAO,IAAA,EAAM,EAAA,EAAI,CAAA,EAC9B,CAAA;AAAA,wBACA,GAAA,CAAC,OAAA,EAAA,EAAQ,OAAA,EAAS,MAAM,MAAA,CAAO,KAAA,EAAM,CAAE,KAAA,EAAM,CAAE,IAAA,EAAK,CAAE,GAAA,EAAI,EAAG,QAAA,EAAU,CAAC,MAAA,CAAO,GAAA,EAAI,CAAE,IAAA,EAAK,EAAG,KAAA,EAAM,qBAAA,EACjG,QAAA,kBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAK,MAAA,EAAO,IAAA,EAAM,EAAA,EAAI,CAAA,EAC9B;AAAA,OAAA,EAAA,EANa,SAOf;AAAA,KACF;AAAA,EACF;AAEA,EAAA,MAAM,eAAe,aAAA,CAAc,MAAA,CAA0B,CAAC,GAAA,EAAK,IAAI,CAAA,KAAM;AAC3E,IAAA,IAAI,CAAA,GAAI,GAAG,GAAA,CAAI,IAAA,qBAAM,OAAA,EAAA,EAAA,EAAa,CAAA,EAAA,EAAK,CAAC,CAAA,CAAI,CAAE,CAAA;AAC9C,IAAA,GAAA,CAAI,KAAK,EAAE,CAAA;AACX,IAAA,OAAO,GAAA;AAAA,EACT,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mGAAA,EACb,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAW,EAAA;AAAA,UACT,8CAAA;AAAA,UACA,WAAW,+CAAA,GAAkD;AAAA,SAC/D;AAAA,QAEC,QAAA,EAAA;AAAA;AAAA,KACH;AAAA,IAEC,OAAA,oBACC,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,EAAA;AAAA,MACd,wHAAA;AAAA,MACA,QAAA,IAAY;AAAA,KACd,EACE,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gFAAA,EAAiF,QAAA,EAAA,OAAA,EAAK,CAAA;AAAA,sBACtG,GAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAS,MAAM,OAAO,KAAA,EAAM,CAAE,KAAA,EAAM,CAAE,WAAA,EAAY,CAAE,GAAA,EAAI,EAAG,OAAM,OAAA,EAAQ,CAAA;AAAA,sBACrF,GAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAS,MAAM,OAAO,KAAA,EAAM,CAAE,KAAA,EAAM,CAAE,cAAA,EAAe,CAAE,GAAA,EAAI,EAAG,OAAM,OAAA,EAAQ,CAAA;AAAA,0BACvF,OAAA,EAAA,EAAQ,CAAA;AAAA,sBACT,GAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAS,MAAM,OAAO,KAAA,EAAM,CAAE,KAAA,EAAM,CAAE,SAAA,EAAU,CAAE,GAAA,EAAI,EAAG,OAAM,YAAA,EAAQ,CAAA;AAAA,sBACnF,GAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAS,MAAM,OAAO,KAAA,EAAM,CAAE,KAAA,EAAM,CAAE,YAAA,EAAa,CAAE,GAAA,EAAI,EAAG,OAAM,YAAA,EAAQ,CAAA;AAAA,0BACrF,OAAA,EAAA,EAAQ,CAAA;AAAA,sBACT,GAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAS,MAAM,OAAO,KAAA,EAAM,CAAE,KAAA,EAAM,CAAE,UAAA,EAAW,CAAE,GAAA,EAAI,EAAG,OAAM,OAAA,EAAQ,CAAA;AAAA,sBACpF,GAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAS,MAAM,OAAO,KAAA,EAAM,CAAE,KAAA,EAAM,CAAE,SAAA,EAAU,CAAE,GAAA,EAAI,EAAG,OAAM,OAAA,EAAQ,CAAA;AAAA,0BAClF,OAAA,EAAA,EAAQ,CAAA;AAAA,sBACT,GAAA,CAAC,WAAQ,OAAA,EAAS,MAAM,OAAO,KAAA,EAAM,CAAE,OAAM,CAAE,WAAA,GAAc,GAAA,EAAI,EAAG,OAAM,cAAA,EAAe,QAAA,kBAAA,GAAA,CAAC,QAAK,IAAA,EAAK,OAAA,EAAQ,IAAA,EAAM,EAAA,EAAI,CAAA,EAAE;AAAA,KAAA,EAC1H;AAAA,GAAA,EAEJ,CAAA;AAEJ;AAIA,SAAS,eAAA,CAAgB,EAAE,MAAA,EAAO,EAAuB;AACvD,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,QAAA,CAAS,SAAA,EAAW,EAAE,KAAA,EAAO,CAAA,EAAG,CAAA,GAAI,IAAA,GACrD,MAAA,CAAO,QAAA,CAAS,SAAA,EAAW,EAAE,KAAA,EAAO,CAAA,EAAG,CAAA,GAAI,IAAA,GAC3C,MAAA,CAAO,QAAA,CAAS,SAAA,EAAW,EAAE,KAAA,EAAO,CAAA,EAAG,CAAA,GAAI,IAAA,GAC3C,GAAA;AAEJ,EAAA,uBACE,IAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,KAAA;AAAA,MACA,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,QAAA,MAAM,CAAA,GAAI,EAAE,MAAA,CAAO,KAAA;AACnB,QAAA,IAAI,CAAA,KAAM,KAAK,MAAA,CAAO,KAAA,GAAQ,KAAA,EAAM,CAAE,YAAA,EAAa,CAAE,GAAA,EAAI;AAAA,aAAA,IAChD,CAAA,KAAM,IAAA,EAAM,MAAA,CAAO,KAAA,EAAM,CAAE,KAAA,EAAM,CAAE,aAAA,CAAc,EAAE,KAAA,EAAO,CAAA,EAAG,EAAE,GAAA,EAAI;AAAA,aAAA,IACnE,CAAA,KAAM,IAAA,EAAM,MAAA,CAAO,KAAA,EAAM,CAAE,KAAA,EAAM,CAAE,aAAA,CAAc,EAAE,KAAA,EAAO,CAAA,EAAG,EAAE,GAAA,EAAI;AAAA,aAAA,IACnE,CAAA,KAAM,IAAA,EAAM,MAAA,CAAO,KAAA,EAAM,CAAE,KAAA,EAAM,CAAE,aAAA,CAAc,EAAE,KAAA,EAAO,CAAA,EAAG,EAAE,GAAA,EAAI;AAAA,MAC9E,CAAA;AAAA,MACA,KAAA,EAAM,YAAA;AAAA,MACN,YAAA,EAAW,YAAA;AAAA,MACX,SAAA,EAAW,EAAA;AAAA,QACT,oEAAA;AAAA,QACA,gFAAA;AAAA,QACA,0BAAA;AAAA,QACA;AAAA,OACF;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,QAAA,EAAA,EAAO,KAAA,EAAM,GAAA,EAAI,QAAA,EAAA,WAAA,EAAS,CAAA;AAAA,wBAC3B,GAAA,CAAC,QAAA,EAAA,EAAO,KAAA,EAAM,IAAA,EAAK,QAAA,EAAA,WAAA,EAAS,CAAA;AAAA,wBAC5B,GAAA,CAAC,QAAA,EAAA,EAAO,KAAA,EAAM,IAAA,EAAK,QAAA,EAAA,WAAA,EAAS,CAAA;AAAA,wBAC5B,GAAA,CAAC,QAAA,EAAA,EAAO,KAAA,EAAM,IAAA,EAAK,QAAA,EAAA,WAAA,EAAS;AAAA;AAAA;AAAA,GAC9B;AAEJ;AAIA,SAAS,gBAAA,CAAiB,EAAE,MAAA,EAAO,EAAuB;AACxD,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,aAAA,CAAc,WAAW,EAAE,QAAA,IAAY,EAAA;AAC9D,EAAA,MAAM,MAAM,UAAA,CAAW,SAAA,CAAU,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,OAAO,CAAA;AAC3D,EAAA,MAAM,UAAA,GAAa,GAAA,KAAQ,EAAA,GAAK,CAAA,GAAI,GAAA;AAEpC,EAAA,MAAM,WAAW,MAAM;AACrB,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,aAAa,CAAC,CAAA;AACvC,IAAA,MAAM,CAAA,GAAI,UAAA,CAAW,IAAI,CAAA,CAAE,KAAA;AAC3B,IAAA,IAAI,CAAA,SAAU,KAAA,EAAM,CAAE,OAAM,CAAE,WAAA,CAAY,CAAC,CAAA,CAAE,GAAA,EAAI;AAAA,gBACrC,KAAA,EAAM,CAAE,OAAM,CAAE,aAAA,GAAgB,GAAA,EAAI;AAAA,EAClD,CAAA;AAEA,EAAA,MAAM,WAAW,MAAM;AACrB,IAAA,MAAM,OAAO,IAAA,CAAK,GAAA,CAAI,WAAW,MAAA,GAAS,CAAA,EAAG,aAAa,CAAC,CAAA;AAC3D,IAAA,MAAM,CAAA,GAAI,UAAA,CAAW,IAAI,CAAA,CAAE,KAAA;AAC3B,IAAA,IAAI,CAAA,SAAU,KAAA,EAAM,CAAE,OAAM,CAAE,WAAA,CAAY,CAAC,CAAA,CAAE,GAAA,EAAI;AAAA,gBACrC,KAAA,EAAM,CAAE,OAAM,CAAE,aAAA,GAAgB,GAAA,EAAI;AAAA,EAClD,CAAA;AAEA,EAAA,4BACG,SAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,OAAA,EAAA,EAAQ,SAAS,QAAA,EAAU,QAAA,EAAU,cAAc,CAAA,EAAG,KAAA,EAAO,CAAA,oBAAA,EAAuB,UAAA,CAAW,IAAA,CAAK,GAAA,CAAI,GAAG,UAAA,GAAa,CAAC,CAAC,CAAA,EAAG,KAAK,CAAA,CAAA,CAAA,EACjI,8BAAC,MAAA,EAAA,EAAK,SAAA,EAAU,6CAAA,EAA8C,QAAA,EAAA,GAAA,EAAC,CAAA,EACjE,CAAA;AAAA,oBACA,GAAA,CAAC,OAAA,EAAA,EAAQ,OAAA,EAAS,QAAA,EAAU,QAAA,EAAU,UAAA,IAAc,UAAA,CAAW,MAAA,GAAS,CAAA,EAAG,KAAA,EAAO,CAAA,oBAAA,EAAuB,UAAA,CAAW,IAAA,CAAK,GAAA,CAAI,UAAA,CAAW,MAAA,GAAS,CAAA,EAAG,UAAA,GAAa,CAAC,CAAC,CAAA,EAAG,KAAK,CAAA,CAAA,CAAA,EACzK,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,8CAAA,EAA+C,QAAA,EAAA,GAAA,EAAC,CAAA,EAClE;AAAA,GAAA,EACF,CAAA;AAEJ;AAIA,SAAS,WAAA,CAAY;AAAA,EACnB,MAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAA,EAMG;AACD,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,SAAS,KAAK,CAAA;AACtC,EAAA,MAAM,UAAA,GAAa,gBAAgB,IAAI,CAAA;AACvC,EAAA,MAAM,GAAA,GAAM,OAAuB,IAAI,CAAA;AAEvC,EAAA,MAAM,QAAQ,WAAA,CAAY,MAAM,QAAQ,KAAK,CAAA,EAAG,EAAE,CAAA;AAIlD,EAAA,MAAM,aAAA,GAAgB,YAAY,MAAM;AACtC,IAAA,MAAM,SAAS,CAAC,CAAC,IAAI,OAAA,EAAS,QAAA,CAAS,SAAS,aAAa,CAAA;AAC7D,IAAA,KAAA,EAAM;AACN,IAAA,IAAI,QAAQ,GAAA,CAAI,OAAA,EAAS,aAAA,CAA2B,QAAQ,GAAG,KAAA,EAAM;AAAA,EACvE,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AACV,EAAA,kBAAA,CAAmB,IAAA,EAAM,GAAA,EAAK,GAAA,EAAK,KAAA,EAAO,UAAU,CAAA;AAEpD,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,MAAM,OAAA,GAAU,CAAC,CAAA,KAAkB;AAAE,MAAA,IAAI,CAAC,GAAA,CAAI,OAAA,EAAS,SAAS,CAAA,CAAE,MAAc,GAAG,KAAA,EAAM;AAAA,IAAG,CAAA;AAC5F,IAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAAqB;AAClC,MAAA,IAAI,EAAE,GAAA,KAAQ,QAAA,IAAY,EAAE,gBAAA,IAAoB,CAAC,YAAW,EAAG;AAC/D,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,aAAA,EAAc;AAAA,IAChB,CAAA;AACA,IAAA,QAAA,CAAS,gBAAA,CAAiB,aAAa,OAAO,CAAA;AAC9C,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,KAAK,CAAA;AAC1C,IAAA,OAAO,MAAM;AAAE,MAAA,QAAA,CAAS,mBAAA,CAAoB,aAAa,OAAO,CAAA;AAAG,MAAA,QAAA,CAAS,mBAAA,CAAoB,WAAW,KAAK,CAAA;AAAA,IAAG,CAAA;AAAA,EACrH,GAAG,CAAC,IAAA,EAAM,KAAA,EAAO,aAAA,EAAe,UAAU,CAAC,CAAA;AAE3C,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAU,SAAA,EAAU,UAAA,EACvB,QAAA,EAAA;AAAA,oBAAA,IAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,OAAA,EAAS,MAAM,OAAA,CAAQ,CAAC,IAAI,CAAA;AAAA,QAC5B,KAAA;AAAA,QACA,SAAA,EAAW,EAAA;AAAA,UACT,kHAAA;AAAA,UACA,0EAAA;AAAA,UACA,OACI,gEAAA,GACA;AAAA,SACN;AAAA,QAEC,QAAA,EAAA;AAAA,UAAA,IAAA;AAAA,UACA,WAAA,wBACE,MAAA,EAAA,EAAK,SAAA,EAAU,0DAAyD,KAAA,EAAO,EAAE,eAAA,EAAiB,WAAA,EAAY,EAAG;AAAA;AAAA;AAAA,KAEtH;AAAA,IAEC,IAAA,wBACE,KAAA,EAAA,EAAI,SAAA,EAAU,oRACZ,QAAA,EAAA,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,qBACX,GAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QAEC,IAAA,EAAK,QAAA;AAAA,QACL,OAAO,CAAA,CAAE,KAAA;AAAA,QACT,SAAS,MAAM;AAAE,UAAA,QAAA,CAAS,EAAE,KAAK,CAAA;AAAG,UAAA,KAAA,EAAM;AAAA,QAAG,CAAA;AAAA,QAC7C,SAAA,EAAW,EAAA;AAAA,UACT,kFAAA;AAAA,UACA,0EAAA;AAAA,UACA,WAAA,KAAgB,CAAA,CAAE,KAAA,GAAQ,CAAA,EAAG,WAAW,CAAA,UAAA,CAAA,GAAe;AAAA,SACzD;AAAA,QACA,KAAA,EAAO,EAAE,eAAA,EAAiB,CAAA,CAAE,SAAS,wBAAA,EAAyB;AAAA,QAE7D,WAAC,CAAA,CAAE,KAAA,oBAAS,GAAA,CAAC,MAAA,EAAA,EAAK,WAAU,qPAAA,EAAsP;AAAA,OAAA;AAAA,MAX9Q,CAAA,CAAE;AAAA,KAaV,CAAA,EACH;AAAA,GAAA,EAEJ,CAAA;AAEJ;AAIA,SAAS,WAAA,CAAY,EAAE,MAAA,EAAO,EAAuB;AACnD,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,SAAS,KAAK,CAAA;AACtC,EAAA,MAAM,UAAA,GAAa,gBAAgB,IAAI,CAAA;AACvC,EAAA,MAAM,CAAC,GAAA,EAAK,MAAM,CAAA,GAAI,SAAS,EAAE,CAAA;AACjC,EAAA,MAAM,GAAA,GAAM,OAAuB,IAAI,CAAA;AACvC,EAAA,MAAM,QAAA,GAAW,OAAyB,IAAI,CAAA;AAE9C,EAAA,MAAM,KAAA,GAAQ,YAAY,MAAM;AAAE,IAAA,OAAA,CAAQ,KAAK,CAAA;AAAG,IAAA,MAAA,CAAO,EAAE,CAAA;AAAA,EAAG,CAAA,EAAG,EAAE,CAAA;AAInE,EAAA,MAAM,aAAA,GAAgB,YAAY,MAAM;AACtC,IAAA,MAAM,SAAS,CAAC,CAAC,IAAI,OAAA,EAAS,QAAA,CAAS,SAAS,aAAa,CAAA;AAC7D,IAAA,KAAA,EAAM;AACN,IAAA,IAAI,QAAQ,GAAA,CAAI,OAAA,EAAS,aAAA,CAA2B,QAAQ,GAAG,KAAA,EAAM;AAAA,EACvE,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AACV,EAAA,kBAAA,CAAmB,IAAA,EAAM,GAAA,EAAK,GAAA,EAAK,KAAA,EAAO,UAAU,CAAA;AAEpD,EAAA,MAAM,MAAA,GAAS,YAAY,MAAM;AAC/B,IAAA,IAAI,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA,EAAG;AAC3B,MAAA,MAAA,CAAO,OAAM,CAAE,KAAA,EAAM,CAAE,SAAA,GAAY,GAAA,EAAI;AACvC,MAAA;AAAA,IACF;AACA,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,aAAA,CAAc,MAAM,EAAE,IAAA,IAAQ,EAAA;AACtD,IAAA,MAAA,CAAO,QAAQ,CAAA;AACf,IAAA,OAAA,CAAQ,CAAC,CAAA,KAAM,CAAC,CAAC,CAAA;AAAA,EACnB,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,MAAM,OAAA,GAAU,CAAC,CAAA,KAAkB;AAAE,MAAA,IAAI,CAAC,GAAA,CAAI,OAAA,EAAS,SAAS,CAAA,CAAE,MAAc,GAAG,KAAA,EAAM;AAAA,IAAG,CAAA;AAC5F,IAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAAqB;AAClC,MAAA,IAAI,EAAE,GAAA,KAAQ,QAAA,IAAY,EAAE,gBAAA,IAAoB,CAAC,YAAW,EAAG;AAC/D,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,aAAA,EAAc;AAAA,IAChB,CAAA;AACA,IAAA,QAAA,CAAS,gBAAA,CAAiB,aAAa,OAAO,CAAA;AAC9C,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,KAAK,CAAA;AAC1C,IAAA,qBAAA,CAAsB,MAAM,QAAA,CAAS,OAAA,EAAS,KAAA,EAAO,CAAA;AACrD,IAAA,OAAO,MAAM;AAAE,MAAA,QAAA,CAAS,mBAAA,CAAoB,aAAa,OAAO,CAAA;AAAG,MAAA,QAAA,CAAS,mBAAA,CAAoB,WAAW,KAAK,CAAA;AAAA,IAAG,CAAA;AAAA,EACrH,GAAG,CAAC,IAAA,EAAM,KAAA,EAAO,aAAA,EAAe,UAAU,CAAC,CAAA;AAE3C,EAAA,MAAM,QAAQ,MAAM;AAClB,IAAA,IAAI,GAAA,EAAK,MAAA,CAAO,KAAA,EAAM,CAAE,KAAA,EAAM,CAAE,OAAA,CAAQ,EAAE,IAAA,EAAM,GAAA,EAAK,CAAA,CAAE,GAAA,EAAI;AAC3D,IAAA,KAAA,EAAM;AAAA,EACR,CAAA;AAEA,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAU,SAAA,EAAU,UAAA,EACvB,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,WAAQ,MAAA,EAAQ,MAAA,CAAO,QAAA,CAAS,MAAM,GAAG,OAAA,EAAS,MAAA,EAAQ,KAAA,EAAM,MAAA,EAC/D,8BAAC,IAAA,EAAA,EAAK,IAAA,EAAK,MAAA,EAAO,IAAA,EAAM,IAAI,CAAA,EAC9B,CAAA;AAAA,IAEC,IAAA,oBACC,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oRAAA,EACb,QAAA,EAAA;AAAA,sBAAA,GAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,GAAA,EAAK,QAAA;AAAA,UACL,IAAA,EAAK,KAAA;AAAA,UACL,KAAA,EAAO,GAAA;AAAA,UACP,UAAU,CAAC,CAAA,KAAM,MAAA,CAAO,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,UACtC,SAAA,EAAW,CAAC,CAAA,KAAM;AAAE,YAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,OAAA,EAAS,KAAA,EAAM;AAAA,UAAG,CAAA;AAAA,UACpD,WAAA,EAAY,aAAA;AAAA,UACZ,SAAA,EAAW,EAAA;AAAA,YACT,0DAAA;AAAA,YACA,sFAAA;AAAA,YACA,yEAAA;AAAA,YACA;AAAA;AACF;AAAA,OACF;AAAA,sBACA,GAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,OAAA,EAAS,KAAA;AAAA,UACT,SAAA,EAAW,EAAA;AAAA,YACT,uFAAA;AAAA,YACA,gEAAA;AAAA,YACA,qCAAA;AAAA,YACA;AAAA,WACF;AAAA,UACD,QAAA,EAAA;AAAA;AAAA;AAED,KAAA,EACF;AAAA,GAAA,EAEJ,CAAA;AAEJ;AAIA,SAAS,YAAA,CAAa,EAAE,MAAA,EAAO,EAAuB;AACpD,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,SAAS,KAAK,CAAA;AACtC,EAAA,MAAM,UAAA,GAAa,gBAAgB,IAAI,CAAA;AACvC,EAAA,MAAM,CAAC,GAAA,EAAK,MAAM,CAAA,GAAI,SAAS,EAAE,CAAA;AACjC,EAAA,MAAM,CAAC,GAAA,EAAK,MAAM,CAAA,GAAI,SAAS,EAAE,CAAA;AACjC,EAAA,MAAM,GAAA,GAAM,OAAuB,IAAI,CAAA;AACvC,EAAA,MAAM,QAAA,GAAW,OAAyB,IAAI,CAAA;AAE9C,EAAA,MAAM,KAAA,GAAQ,YAAY,MAAM;AAAE,IAAA,OAAA,CAAQ,KAAK,CAAA;AAAG,IAAA,MAAA,CAAO,EAAE,CAAA;AAAG,IAAA,MAAA,CAAO,EAAE,CAAA;AAAA,EAAG,CAAA,EAAG,EAAE,CAAA;AAI/E,EAAA,MAAM,aAAA,GAAgB,YAAY,MAAM;AACtC,IAAA,MAAM,SAAS,CAAC,CAAC,IAAI,OAAA,EAAS,QAAA,CAAS,SAAS,aAAa,CAAA;AAC7D,IAAA,KAAA,EAAM;AACN,IAAA,IAAI,QAAQ,GAAA,CAAI,OAAA,EAAS,aAAA,CAA2B,QAAQ,GAAG,KAAA,EAAM;AAAA,EACvE,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AACV,EAAA,kBAAA,CAAmB,IAAA,EAAM,GAAA,EAAK,GAAA,EAAK,KAAA,EAAO,UAAU,CAAA;AAEpD,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,MAAM,OAAA,GAAU,CAAC,CAAA,KAAkB;AAAE,MAAA,IAAI,CAAC,GAAA,CAAI,OAAA,EAAS,SAAS,CAAA,CAAE,MAAc,GAAG,KAAA,EAAM;AAAA,IAAG,CAAA;AAC5F,IAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAAqB;AAClC,MAAA,IAAI,EAAE,GAAA,KAAQ,QAAA,IAAY,EAAE,gBAAA,IAAoB,CAAC,YAAW,EAAG;AAC/D,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,aAAA,EAAc;AAAA,IAChB,CAAA;AACA,IAAA,QAAA,CAAS,gBAAA,CAAiB,aAAa,OAAO,CAAA;AAC9C,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,KAAK,CAAA;AAC1C,IAAA,qBAAA,CAAsB,MAAM,QAAA,CAAS,OAAA,EAAS,KAAA,EAAO,CAAA;AACrD,IAAA,OAAO,MAAM;AAAE,MAAA,QAAA,CAAS,mBAAA,CAAoB,aAAa,OAAO,CAAA;AAAG,MAAA,QAAA,CAAS,mBAAA,CAAoB,WAAW,KAAK,CAAA;AAAA,IAAG,CAAA;AAAA,EACrH,GAAG,CAAC,IAAA,EAAM,KAAA,EAAO,aAAA,EAAe,UAAU,CAAC,CAAA;AAE3C,EAAA,MAAM,SAAS,MAAM;AACnB,IAAA,IAAI,GAAA,EAAK,MAAA,CAAO,KAAA,EAAM,CAAE,OAAM,CAAE,QAAA,CAAS,EAAE,GAAA,EAAK,KAAK,GAAA,EAAK,GAAA,IAAO,MAAA,EAAW,EAAE,GAAA,EAAI;AAClF,IAAA,KAAA,EAAM;AAAA,EACR,CAAA;AAEA,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAU,SAAA,EAAU,UAAA,EACvB,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,WAAQ,OAAA,EAAS,MAAM,OAAA,CAAQ,CAAC,MAAM,CAAC,CAAC,CAAA,EAAG,KAAA,EAAM,SAChD,QAAA,kBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,MAAK,OAAA,EAAQ,IAAA,EAAM,IAAI,CAAA,EAC/B,CAAA;AAAA,IAEC,IAAA,oBACC,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gRAAA,EACb,QAAA,EAAA;AAAA,sBAAA,GAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,GAAA,EAAK,QAAA;AAAA,UACL,IAAA,EAAK,KAAA;AAAA,UACL,KAAA,EAAO,GAAA;AAAA,UACP,UAAU,CAAC,CAAA,KAAM,MAAA,CAAO,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,UACtC,WAAA,EAAY,WAAA;AAAA,UACZ,SAAA,EAAW,EAAA;AAAA,YACT,mDAAA;AAAA,YACA,sFAAA;AAAA,YACA,yEAAA;AAAA,YACA;AAAA;AACF;AAAA,OACF;AAAA,sBACA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4BAAA,EACb,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,MAAA;AAAA,YACL,KAAA,EAAO,GAAA;AAAA,YACP,UAAU,CAAC,CAAA,KAAM,MAAA,CAAO,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,YACtC,SAAA,EAAW,CAAC,CAAA,KAAM;AAAE,cAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,OAAA,EAAS,MAAA,EAAO;AAAA,YAAG,CAAA;AAAA,YACrD,WAAA,EAAY,qBAAA;AAAA,YACZ,SAAA,EAAW,EAAA;AAAA,cACT,0DAAA;AAAA,cACA,sFAAA;AAAA,cACA,yEAAA;AAAA,cACA;AAAA;AACF;AAAA,SACF;AAAA,wBACA,GAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,OAAA,EAAS,MAAA;AAAA,YACT,SAAA,EAAW,EAAA;AAAA,cACT,uFAAA;AAAA,cACA,gEAAA;AAAA,cACA,qCAAA;AAAA,cACA;AAAA,aACF;AAAA,YACD,QAAA,EAAA;AAAA;AAAA;AAED,OAAA,EACF;AAAA,KAAA,EACF;AAAA,GAAA,EAEJ,CAAA;AAEJ;AAIA,SAAS,gBAAA,CAAiB,EAAE,MAAA,EAAO,EAAuB;AACxD,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,aAAA,CAAc,WAAW,EAAE,UAAA,IAAc,EAAA;AAEhE,EAAA,uBACE,GAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,OAAA;AAAA,MACP,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,QAAA,MAAM,CAAA,GAAI,EAAE,MAAA,CAAO,KAAA;AACnB,QAAA,IAAI,CAAA,SAAU,KAAA,EAAM,CAAE,OAAM,CAAE,aAAA,CAAc,CAAC,CAAA,CAAE,GAAA,EAAI;AAAA,oBACvC,KAAA,EAAM,CAAE,OAAM,CAAE,eAAA,GAAkB,GAAA,EAAI;AAAA,MACpD,CAAA;AAAA,MACA,KAAA,EAAM,aAAA;AAAA,MACN,YAAA,EAAW,aAAA;AAAA,MACX,SAAA,EAAW,EAAA;AAAA,QACT,oEAAA;AAAA,QACA,gFAAA;AAAA,QACA,0BAAA;AAAA,QACA;AAAA,OACF;AAAA,MAEC,QAAA,EAAA,aAAA,CAAc,GAAA,CAAI,CAAC,CAAA,qBAClB,GAAA,CAAC,QAAA,EAAA,EAAqB,KAAA,EAAO,CAAA,CAAE,KAAA,EAAQ,QAAA,EAAA,CAAA,CAAE,KAAA,EAAA,EAA5B,CAAA,CAAE,KAAgC,CAChD;AAAA;AAAA,GACH;AAEJ;AAIA,SAAS,SAAA,CAAU,EAAE,QAAA,EAAS,EAAkC;AAC9D,EAAA,uBAAO,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8BAAA,EAAgC,QAAA,EAAS,CAAA;AACjE;AAEA,SAAS,OAAA,GAAU;AACjB,EAAA,uBAAO,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+CAAA,EAAgD,CAAA;AACxE;AAEA,SAAS,UAAA,CAAW,EAAE,OAAA,EAAS,KAAA,EAAM,EAA2C;AAC9E,EAAA,uBACE,GAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,OAAA;AAAA,MACA,KAAA,EAAO,KAAA;AAAA,MACP,SAAA,EAAW,EAAA;AAAA,QACT,qHAAA;AAAA,QACA,0EAAA;AAAA,QACA;AAAA,OACF;AAAA,MAEC,QAAA,EAAA;AAAA;AAAA,GACH;AAEJ;AAEA,SAAS,QAAQ,EAAE,MAAA,EAAQ,UAAU,OAAA,EAAS,KAAA,EAAO,UAAS,EAA4G;AACxK,EAAA,uBACE,GAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,OAAA;AAAA,MACA,QAAA;AAAA,MACA,KAAA;AAAA,MACA,SAAA,EAAW,EAAA;AAAA,QACT,yGAAA;AAAA,QACA,0EAAA;AAAA,QACA,SACI,gEAAA,GACA,qGAAA;AAAA,QACJ,QAAA,IAAY;AAAA,OACd;AAAA,MAEC;AAAA;AAAA,GACH;AAEJ","file":"editor.js","sourcesContent":["import { useState, useCallback, useRef, useEffect, useContext, useImperativeHandle, type Ref } from \"react\";\nimport { useCloseOnFocusOut, useOverlayLayer } from \"../lib/focus\";\nimport { useEditor, EditorContent, createDocument, type Editor } from \"@tiptap/react\";\nimport StarterKit from \"@tiptap/starter-kit\";\nimport Image from \"@tiptap/extension-image\";\nimport { Table } from \"@tiptap/extension-table\";\nimport { TableRow } from \"@tiptap/extension-table-row\";\nimport { TableCell } from \"@tiptap/extension-table-cell\";\nimport { TableHeader } from \"@tiptap/extension-table-header\";\nimport Placeholder from \"@tiptap/extension-placeholder\";\nimport CodeBlockLowlight from \"@tiptap/extension-code-block-lowlight\";\nimport { TextStyle, FontSize } from \"@tiptap/extension-text-style\";\nimport Color from \"@tiptap/extension-color\";\nimport Highlight from \"@tiptap/extension-highlight\";\nimport TextAlign from \"@tiptap/extension-text-align\";\nimport TaskList from \"@tiptap/extension-task-list\";\nimport TaskItem from \"@tiptap/extension-task-item\";\nimport Subscript from \"@tiptap/extension-subscript\";\nimport Superscript from \"@tiptap/extension-superscript\";\nimport FontFamily from \"@tiptap/extension-font-family\";\nimport { all, createLowlight } from \"lowlight\";\nimport { cn, ACTIVE_RING, FOCUS_RING } from \"../lib/utils\";\nimport { Icon } from \"../lib/icons\";\nimport { useBreakpoint } from \"../lib/use-breakpoint\";\nimport { useLatest } from \"../lib/use-latest\";\nimport { FormChangeCtx } from \"../lib/form-context\";\n\nconst lowlight = createLowlight(all);\n\nexport type ToolbarGroup =\n | \"blockType\"\n | \"fontFamily\"\n | \"textSize\"\n | \"formatting\"\n | \"colors\"\n | \"alignment\"\n | \"lists\"\n | \"blocks\"\n | \"insert\"\n | \"extras\"\n | \"history\";\n\nconst DEFAULT_TOOLBAR: ToolbarGroup[] = [\n \"blockType\", \"fontFamily\", \"textSize\",\n \"formatting\", \"colors\", \"alignment\",\n \"lists\", \"blocks\", \"insert\", \"extras\", \"history\",\n];\n\nconst MINIMAL_TOOLBAR: ToolbarGroup[] = [\n \"formatting\", \"lists\", \"insert\", \"history\",\n];\n\n/** The editor's handle (Sprint 25.12 A16): what a page does to the document on purpose. */\nexport interface RichTextEditorHandle {\n /**\n * Replaces the whole document (a restore, a template). It always applies, even over text typed this session, and it's\n * a change like the user's own: onChange runs.\n */\n setContent: (html: string) => void;\n /** Inserts HTML where the cursor is (or was, when the editor lost focus), then focuses the editor. */\n insertContent: (html: string) => void;\n /** Inserts an image where the cursor is. */\n insertImage: (image: { src: string; alt?: string }) => void;\n focus: () => void;\n getHTML: () => string;\n}\n\nexport interface RichTextEditorProps {\n /**\n * The document, as HTML. The editor follows it (Sprint 25.12 A16): a new value from outside is applied at once, a\n * clear or a reset included, without calling onChange and outside the undo history (Ctrl+Z never takes it back), and\n * the cursor moves with the text around it. Its own output coming back late (an autosave's echo, markup a server\n * sanitised that parses the same) changes nothing. The editor follows a change of value: to put back the value the\n * page already holds (a Discard when the page stores only what was saved), call `handle.setContent`. A page that\n * switches records keys the editor by the record's id, so undo never crosses records.\n */\n content?: string;\n placeholder?: string;\n onChange?: (html: string) => void;\n /** false shows the document read-only, with no toolbar. Follows its prop. */\n editable?: boolean;\n toolbar?: ToolbarGroup[] | \"full\" | \"minimal\";\n className?: string;\n /** The root element. */\n ref?: Ref<HTMLDivElement>;\n /** The editor's handle: replace the document (a restore, a template) or insert at the cursor (an image, a link). */\n handle?: Ref<RichTextEditorHandle>;\n /**\n * The image button hands over to the page (a media library): call `insert` with the chosen image and it goes in at\n * the cursor. Without it, the button asks for an image URL.\n */\n onImageRequest?: (insert: (image: { src: string; alt?: string }) => void) => void;\n /** Accessible name for the editable area. Default \"Rich text editor\". */\n label?: string;\n}\n\ntype Doc = Editor[\"state\"][\"doc\"];\n/**\n * The editor's own outputs the page hasn't caught up with, which can still come back as late echoes: at most this many,\n * in at most this many characters (a large document with pasted images), and only the newest few parsed to compare.\n */\nconst OWN_OUTPUTS = 100;\nconst OWN_OUTPUT_CHARS = 4_000_000;\nconst PARSED_OUTPUTS = 10;\n\n/**\n * A value from outside, applied as the smallest replacement (0.21.0): the cursor maps through it, it isn't an undo\n * step, and it raises no update event, so neither onChange nor the form's mark hears of it.\n */\nfunction applyOutside(editor: Editor, incoming: Doc) {\n const { state } = editor;\n const start = state.doc.content.findDiffStart(incoming.content);\n if (start == null) return;\n let { a: endA, b: endB } = state.doc.content.findDiffEnd(incoming.content) ?? { a: state.doc.content.size, b: incoming.content.size };\n // repeated text around the change makes the ends overlap the start (ProseMirror's own reading of a DOM change)\n const overlap = start - Math.min(endA, endB);\n if (overlap > 0) { endA += overlap; endB += overlap; }\n let tr = state.tr;\n try {\n tr = tr.replace(start, endA, incoming.slice(start, endB));\n } catch {\n tr = state.tr.replaceWith(0, state.doc.content.size, incoming.content);\n }\n editor.view.dispatch(tr.setMeta(\"addToHistory\", false).setMeta(\"preventUpdate\", true));\n}\n\nexport function RichTextEditor({\n content = \"\",\n placeholder = \"Start writing...\",\n onChange,\n editable = true,\n toolbar = \"full\",\n className,\n ref, handle, onImageRequest, label = \"Rich text editor\" }: RichTextEditorProps) {\n const resolvedToolbar = toolbar === \"full\" ? DEFAULT_TOOLBAR : toolbar === \"minimal\" ? MINIMAL_TOOLBAR : toolbar;\n // A15: an edit is a change to the form the editor sits in (never a value the page sets)\n const reportChange = useLatest(useContext(FormChangeCtx));\n // The editor's own outputs the page hasn't caught up with, newest last: a value coming back that matches one is a late\n // echo, not a change. Once the page holds the newest, none of them can come back (0.21.0: an older one that matched\n // a clear or a reset swallowed it). Each is parsed only if a value needs comparing with it.\n const ownOutputs = useRef<Array<{ html: string; doc?: Doc }>>([]);\n const editor = useEditor({\n extensions: [\n StarterKit.configure({\n codeBlock: false,\n link: { openOnClick: false, HTMLAttributes: { class: \"rte-link\" } },\n }),\n Image.configure({ inline: false, allowBase64: true }),\n CodeBlockLowlight.configure({ lowlight }),\n Table.configure({ resizable: false }),\n TableRow,\n TableCell,\n TableHeader,\n Placeholder.configure({ placeholder }),\n TextStyle,\n FontSize,\n Color,\n Highlight.configure({ multicolor: true }),\n TextAlign.configure({ types: [\"heading\", \"paragraph\"] }),\n TaskList,\n TaskItem.configure({ nested: true }),\n Subscript,\n Superscript,\n FontFamily,\n ],\n content,\n editable,\n // Setting attributes replaces tiptap's defaults, so restore role=\"textbox\" alongside the name.\n editorProps: { attributes: { role: \"textbox\", \"aria-label\": label, \"aria-multiline\": \"true\" } },\n onUpdate: ({ editor: e }) => {\n const html = e.getHTML();\n const outputs = ownOutputs.current;\n outputs.push({ html });\n let chars = outputs.reduce((n, o) => n + o.html.length, 0);\n while (outputs.length > 1 && (outputs.length > OWN_OUTPUTS || chars > OWN_OUTPUT_CHARS)) chars -= outputs.shift()!.html.length;\n reportChange.current?.();\n onChange?.(html);\n },\n });\n\n // Following `content` (A16, R28-43): applied with no update event (so no onChange and no form mark), outside the undo\n // history, the cursor mapped through it (applyOutside). What counts as the same is decided like for like: a value\n // equal to the editor's own output, now or one the page hasn't caught up with, as text, else both sides parsed through\n // the editor's schema — never a parsed value against the live document, since parsing drops a paragraph's trailing\n // space the user just typed. Nothing is applied during an IME composition; a value that came during one is checked\n // again when it ends.\n const contentRef = useLatest(content);\n const outsideWaiting = useRef(false);\n const follow = useCallback((ed: Editor) => {\n if (ed.isDestroyed) return;\n const html = contentRef.current;\n const current = ed.getHTML();\n const outputs = ownOutputs.current;\n // the page holds what the editor shows: every output it could send back is older, and none will come now\n if (html === current) { outputs.length = 0; return; }\n // a late echo: nothing to apply, and the outputs before it are older still\n const echoed = outputs.map((o) => o.html).lastIndexOf(html);\n if (echoed !== -1) { outputs.splice(0, echoed); return; }\n const parse = (h: string): Doc => createDocument(h, ed.schema, {}, { errorOnInvalidContent: false });\n let incoming: Doc;\n try {\n incoming = parse(html);\n if (incoming.eq(parse(current))) { outputs.length = 0; return; }\n for (let i = outputs.length - 1; i >= Math.max(0, outputs.length - PARSED_OUTPUTS); i--) {\n const own = outputs[i];\n own.doc ??= parse(own.html);\n if (own.doc.eq(incoming)) { outputs.splice(0, i); return; }\n }\n } catch {\n return;\n }\n if (ed.view.composing) {\n outsideWaiting.current = true;\n return;\n }\n outputs.length = 0;\n applyOutside(ed, incoming);\n }, [contentRef]);\n\n useEffect(() => {\n if (editor) follow(editor);\n }, [editor, content, follow]);\n\n useEffect(() => {\n if (!editor) return;\n const dom = editor.view.dom;\n const onEnd = () => {\n if (!outsideWaiting.current) return;\n outsideWaiting.current = false;\n // ProseMirror reads the composition's last input after the event\n setTimeout(() => follow(editor));\n };\n dom.addEventListener(\"compositionend\", onEnd);\n return () => dom.removeEventListener(\"compositionend\", onEnd);\n }, [editor, follow]);\n\n // `editable` follows its prop (tiptap freezes it at creation); no update event, so no onChange\n useEffect(() => {\n if (editor && !editor.isDestroyed && editor.isEditable !== editable) editor.setEditable(editable, false);\n }, [editor, editable]);\n\n useImperativeHandle(handle, () => ({\n setContent: (html) => { if (editor && !editor.isDestroyed) editor.commands.setContent(html); },\n insertContent: (html) => { editor?.chain().focus().insertContent(html).run(); },\n insertImage: ({ src, alt }) => { editor?.chain().focus().setImage({ src, alt: alt || undefined }).run(); },\n focus: () => { editor?.commands.focus(); },\n getHTML: () => editor?.getHTML() ?? \"\",\n }), [editor]);\n\n if (!editor) return null;\n\n return (\n <div\n ref={ref}\n className={cn(\n \"flex flex-col rounded-[var(--ds-radius-md)] overflow-hidden\",\n \"border-[length:var(--ds-border-width)] border-[var(--ds-border-default)]\",\n \"bg-[var(--ds-bg-surface)]\",\n className,\n )}\n >\n {editable && <Toolbar editor={editor} groups={resolvedToolbar} onImageRequest={onImageRequest} />}\n\n <EditorContent\n editor={editor}\n className={cn(\n \"rte-content\",\n \"flex-1 overflow-y-auto px-ds-4 py-ds-3\",\n \"text-sm text-[var(--ds-text-primary)]\",\n \"focus-within:outline-none\",\n )}\n />\n </div>\n );\n}\n\n/* ── Toolbar ──────────────────────────────────────────────────────── */\n\nconst TEXT_COLORS = [\n { label: \"Default\", value: \"\" },\n { label: \"Red\", value: \"#ef4444\" },\n { label: \"Orange\", value: \"#f97316\" },\n { label: \"Yellow\", value: \"#eab308\" },\n { label: \"Green\", value: \"#22c55e\" },\n { label: \"Blue\", value: \"#3b82f6\" },\n { label: \"Purple\", value: \"#a855f7\" },\n { label: \"Pink\", value: \"#ec4899\" },\n];\n\nconst HIGHLIGHT_COLORS = [\n { label: \"None\", value: \"\" },\n { label: \"Yellow\", value: \"#fef08a\" },\n { label: \"Green\", value: \"#bbf7d0\" },\n { label: \"Blue\", value: \"#bfdbfe\" },\n { label: \"Pink\", value: \"#fbcfe8\" },\n { label: \"Orange\", value: \"#fed7aa\" },\n { label: \"Purple\", value: \"#e9d5ff\" },\n];\n\nconst FONT_FAMILIES = [\n { label: \"Default\", value: \"\" },\n { label: \"Sans\", value: \"var(--ds-font-sans)\" },\n { label: \"Mono\", value: \"var(--ds-font-mono)\" },\n { label: \"Display\", value: \"var(--ds-font-display)\" },\n { label: \"Serif\", value: \"Georgia, serif\" },\n];\n\nconst TEXT_SIZES = [\n { label: \"Small\", value: \"0.85em\" },\n { label: \"Normal\", value: \"\" },\n { label: \"Large\", value: \"1.2em\" },\n { label: \"Huge\", value: \"1.5em\" },\n];\n\nfunction Toolbar({ editor, groups, onImageRequest }: { editor: Editor; groups: ToolbarGroup[]; onImageRequest?: RichTextEditorProps[\"onImageRequest\"] }) {\n const [, forceUpdate] = useState(0);\n const isMobile = useBreakpoint(\"sm\");\n\n useEffect(() => {\n const handler = () => forceUpdate((n) => n + 1);\n editor.on(\"selectionUpdate\", handler);\n editor.on(\"transaction\", handler);\n return () => {\n editor.off(\"selectionUpdate\", handler);\n editor.off(\"transaction\", handler);\n };\n }, [editor]);\n\n const inTable = editor.isActive(\"table\");\n const has = (g: ToolbarGroup) => groups.includes(g);\n\n const groupElements: React.ReactNode[] = [];\n\n if (has(\"blockType\")) groupElements.push(<BlockTypeSelect key=\"blockType\" editor={editor} />);\n if (has(\"fontFamily\")) groupElements.push(<FontFamilySelect key=\"fontFamily\" editor={editor} />);\n if (has(\"textSize\")) groupElements.push(<TextSizeControls key=\"textSize\" editor={editor} />);\n\n if (has(\"formatting\")) {\n groupElements.push(\n <ToolGroup key=\"formatting\">\n <ToolBtn active={editor.isActive(\"bold\")} onClick={() => editor.chain().focus().toggleBold().run()} title=\"Bold (Ctrl+B)\">\n <Icon name=\"bold\" size={16} />\n </ToolBtn>\n <ToolBtn active={editor.isActive(\"italic\")} onClick={() => editor.chain().focus().toggleItalic().run()} title=\"Italic (Ctrl+I)\">\n <Icon name=\"italic\" size={16} />\n </ToolBtn>\n <ToolBtn active={editor.isActive(\"underline\")} onClick={() => editor.chain().focus().toggleUnderline().run()} title=\"Underline (Ctrl+U)\">\n <Icon name=\"underline\" size={16} />\n </ToolBtn>\n <ToolBtn active={editor.isActive(\"strike\")} onClick={() => editor.chain().focus().toggleStrike().run()} title=\"Strikethrough\">\n <Icon name=\"strikethrough\" size={16} />\n </ToolBtn>\n </ToolGroup>\n );\n }\n\n if (has(\"colors\")) {\n groupElements.push(\n <ToolGroup key=\"colors\">\n <ColorPicker\n colors={TEXT_COLORS}\n activeColor={editor.getAttributes(\"textStyle\").color ?? \"\"}\n onSelect={(c) => c ? editor.chain().focus().setColor(c).run() : editor.chain().focus().unsetColor().run()}\n title=\"Text color\"\n icon={<Icon name=\"type\" size={16} />}\n />\n <ColorPicker\n colors={HIGHLIGHT_COLORS}\n activeColor={editor.getAttributes(\"highlight\").color ?? \"\"}\n onSelect={(c) => c ? editor.chain().focus().toggleHighlight({ color: c }).run() : editor.chain().focus().unsetHighlight().run()}\n title=\"Highlight\"\n icon={<Icon name=\"highlight\" size={16} />}\n />\n </ToolGroup>\n );\n }\n\n if (has(\"alignment\")) {\n groupElements.push(\n <ToolGroup key=\"alignment\">\n <ToolBtn active={editor.isActive({ textAlign: \"left\" })} onClick={() => editor.chain().focus().setTextAlign(\"left\").run()} title=\"Align left\">\n <Icon name=\"align-left\" size={16} />\n </ToolBtn>\n <ToolBtn active={editor.isActive({ textAlign: \"center\" })} onClick={() => editor.chain().focus().setTextAlign(\"center\").run()} title=\"Align center\">\n <Icon name=\"align-center\" size={16} />\n </ToolBtn>\n <ToolBtn active={editor.isActive({ textAlign: \"right\" })} onClick={() => editor.chain().focus().setTextAlign(\"right\").run()} title=\"Align right\">\n <Icon name=\"align-right\" size={16} />\n </ToolBtn>\n </ToolGroup>\n );\n }\n\n if (has(\"lists\")) {\n groupElements.push(\n <ToolGroup key=\"lists\">\n <ToolBtn active={editor.isActive(\"bulletList\")} onClick={() => editor.chain().focus().toggleBulletList().run()} title=\"Bullet list\">\n <Icon name=\"list\" size={16} />\n </ToolBtn>\n <ToolBtn active={editor.isActive(\"orderedList\")} onClick={() => editor.chain().focus().toggleOrderedList().run()} title=\"Ordered list\">\n <Icon name=\"list-ordered\" size={16} />\n </ToolBtn>\n <ToolBtn active={editor.isActive(\"taskList\")} onClick={() => editor.chain().focus().toggleTaskList().run()} title=\"Task list\">\n <Icon name=\"list-checks\" size={16} />\n </ToolBtn>\n </ToolGroup>\n );\n }\n\n if (has(\"blocks\")) {\n groupElements.push(\n <ToolGroup key=\"blocks\">\n <ToolBtn active={editor.isActive(\"blockquote\")} onClick={() => editor.chain().focus().toggleBlockquote().run()} title=\"Blockquote\">\n <Icon name=\"quote\" size={16} />\n </ToolBtn>\n <ToolBtn active={editor.isActive(\"codeBlock\")} onClick={() => editor.chain().focus().toggleCodeBlock().run()} title=\"Code block\">\n <Icon name=\"code\" size={16} />\n </ToolBtn>\n </ToolGroup>\n );\n }\n\n if (has(\"insert\")) {\n groupElements.push(\n <ToolGroup key=\"insert\">\n <LinkPopover editor={editor} />\n {onImageRequest ? (\n // the page's media library is the one way in; its choice goes in at the cursor\n <ToolBtn onClick={() => onImageRequest((image) => { editor.chain().focus().setImage({ src: image.src, alt: image.alt || undefined }).run(); })} title=\"Image\">\n <Icon name=\"image\" size={16} />\n </ToolBtn>\n ) : (\n <ImagePopover editor={editor} />\n )}\n <ToolBtn onClick={() => editor.chain().focus().insertTable({ rows: 3, cols: 3, withHeaderRow: true }).run()} disabled={inTable} title=\"Insert table\">\n <Icon name=\"table\" size={16} />\n </ToolBtn>\n <ToolBtn onClick={() => editor.chain().focus().setHorizontalRule().run()} title=\"Horizontal rule\">\n <Icon name=\"minus\" size={16} />\n </ToolBtn>\n </ToolGroup>\n );\n }\n\n if (has(\"extras\")) {\n groupElements.push(\n <ToolGroup key=\"extras\">\n <ToolBtn active={editor.isActive(\"code\")} onClick={() => editor.chain().focus().toggleCode().run()} title=\"Inline code\">\n <Icon name=\"code\" size={16} />\n </ToolBtn>\n <ToolBtn active={editor.isActive(\"superscript\")} onClick={() => editor.chain().focus().toggleSuperscript().run()} title=\"Superscript\">\n <Icon name=\"superscript\" size={16} />\n </ToolBtn>\n <ToolBtn active={editor.isActive(\"subscript\")} onClick={() => editor.chain().focus().toggleSubscript().run()} title=\"Subscript\">\n <Icon name=\"subscript\" size={16} />\n </ToolBtn>\n </ToolGroup>\n );\n }\n\n if (has(\"history\")) {\n groupElements.push(\n <ToolGroup key=\"history\">\n <ToolBtn onClick={() => editor.chain().focus().undo().run()} disabled={!editor.can().undo()} title=\"Undo (Ctrl+Z)\">\n <Icon name=\"undo\" size={16} />\n </ToolBtn>\n <ToolBtn onClick={() => editor.chain().focus().redo().run()} disabled={!editor.can().redo()} title=\"Redo (Ctrl+Shift+Z)\">\n <Icon name=\"redo\" size={16} />\n </ToolBtn>\n </ToolGroup>\n );\n }\n\n const withDividers = groupElements.reduce<React.ReactNode[]>((acc, el, i) => {\n if (i > 0) acc.push(<Divider key={`d-${i}`} />);\n acc.push(el);\n return acc;\n }, []);\n\n return (\n <div className=\"border-b-[length:var(--ds-border-width)] border-[var(--ds-border-subtle)] bg-[var(--ds-bg-muted)]\">\n <div\n className={cn(\n \"flex items-center gap-ds-0.5 px-ds-2 py-ds-1\",\n isMobile ? \"overflow-x-auto flex-nowrap gs-scrollbar-none\" : \"flex-wrap\",\n )}\n >\n {withDividers}\n </div>\n\n {inTable && (\n <div className={cn(\n \"flex items-center gap-ds-0.5 px-ds-2 py-ds-1 border-t-[length:var(--ds-border-width)] border-[var(--ds-border-subtle)]\",\n isMobile && \"overflow-x-auto flex-nowrap gs-scrollbar-none\",\n )}>\n <span className=\"text-2xs text-[var(--ds-text-muted)] uppercase tracking-wider mr-ds-1 shrink-0\">Table</span>\n <TableOpBtn onClick={() => editor.chain().focus().addRowAfter().run()} label=\"+ Row\" />\n <TableOpBtn onClick={() => editor.chain().focus().addColumnAfter().run()} label=\"+ Col\" />\n <Divider />\n <TableOpBtn onClick={() => editor.chain().focus().deleteRow().run()} label=\"− Row\" />\n <TableOpBtn onClick={() => editor.chain().focus().deleteColumn().run()} label=\"− Col\" />\n <Divider />\n <TableOpBtn onClick={() => editor.chain().focus().mergeCells().run()} label=\"Merge\" />\n <TableOpBtn onClick={() => editor.chain().focus().splitCell().run()} label=\"Split\" />\n <Divider />\n <ToolBtn onClick={() => editor.chain().focus().deleteTable().run()} title=\"Delete table\"><Icon name=\"trash\" size={14} /></ToolBtn>\n </div>\n )}\n </div>\n );\n}\n\n/* ── Block type select (paragraph / headings) ─────────────────────── */\n\nfunction BlockTypeSelect({ editor }: { editor: Editor }) {\n const value = editor.isActive(\"heading\", { level: 1 }) ? \"h1\"\n : editor.isActive(\"heading\", { level: 2 }) ? \"h2\"\n : editor.isActive(\"heading\", { level: 3 }) ? \"h3\"\n : \"p\";\n\n return (\n <select\n value={value}\n onChange={(e) => {\n const v = e.target.value;\n if (v === \"p\") editor.chain().focus().setParagraph().run();\n else if (v === \"h1\") editor.chain().focus().toggleHeading({ level: 1 }).run();\n else if (v === \"h2\") editor.chain().focus().toggleHeading({ level: 2 }).run();\n else if (v === \"h3\") editor.chain().focus().toggleHeading({ level: 3 }).run();\n }}\n title=\"Block type\"\n aria-label=\"Block type\"\n className={cn(\n \"h-7 px-ds-1.5 text-xs rounded-[var(--ds-radius-sm)] cursor-pointer\",\n \"bg-transparent text-[var(--ds-text-secondary)] hover:bg-[var(--ds-bg-surface)]\",\n \"border-none outline-none\",\n \"focus-visible:shadow-[var(--ds-shadow-focus)]\",\n )}\n >\n <option value=\"p\">Paragraph</option>\n <option value=\"h1\">Heading 1</option>\n <option value=\"h2\">Heading 2</option>\n <option value=\"h3\">Heading 3</option>\n </select>\n );\n}\n\n/* ── Text size increase/decrease ──────────────────────────────────── */\n\nfunction TextSizeControls({ editor }: { editor: Editor }) {\n const current = editor.getAttributes(\"textStyle\").fontSize ?? \"\";\n const idx = TEXT_SIZES.findIndex((s) => s.value === current);\n const currentIdx = idx === -1 ? 1 : idx;\n\n const decrease = () => {\n const next = Math.max(0, currentIdx - 1);\n const v = TEXT_SIZES[next].value;\n if (v) editor.chain().focus().setFontSize(v).run();\n else editor.chain().focus().unsetFontSize().run();\n };\n\n const increase = () => {\n const next = Math.min(TEXT_SIZES.length - 1, currentIdx + 1);\n const v = TEXT_SIZES[next].value;\n if (v) editor.chain().focus().setFontSize(v).run();\n else editor.chain().focus().unsetFontSize().run();\n };\n\n return (\n <ToolGroup>\n <ToolBtn onClick={decrease} disabled={currentIdx <= 0} title={`Decrease text size (${TEXT_SIZES[Math.max(0, currentIdx - 1)]?.label})`}>\n <span className=\"text-2xs font-bold leading-none select-none\">A</span>\n </ToolBtn>\n <ToolBtn onClick={increase} disabled={currentIdx >= TEXT_SIZES.length - 1} title={`Increase text size (${TEXT_SIZES[Math.min(TEXT_SIZES.length - 1, currentIdx + 1)]?.label})`}>\n <span className=\"text-base font-bold leading-none select-none\">A</span>\n </ToolBtn>\n </ToolGroup>\n );\n}\n\n/* ── Color picker popover ─────────────────────────────────────────── */\n\nfunction ColorPicker({\n colors,\n activeColor,\n onSelect,\n title,\n icon,\n}: {\n colors: { label: string; value: string }[];\n activeColor: string;\n onSelect: (color: string) => void;\n title: string;\n icon: React.ReactNode;\n}) {\n const [open, setOpen] = useState(false);\n const isTopLayer = useOverlayLayer(open);\n const ref = useRef<HTMLDivElement>(null);\n\n const close = useCallback(() => setOpen(false), []);\n\n // Sprint 25.7: Escape puts focus back on the toolbar button (the popover renders in place, so Tab already moves\n // in page order); focus leaving the button and panel closes it.\n const closeToButton = useCallback(() => {\n const inside = !!ref.current?.contains(document.activeElement);\n close();\n if (inside) ref.current?.querySelector<HTMLElement>(\"button\")?.focus();\n }, [close]);\n useCloseOnFocusOut(open, ref, ref, close, isTopLayer);\n\n useEffect(() => {\n if (!open) return;\n const onClick = (e: MouseEvent) => { if (!ref.current?.contains(e.target as Node)) close(); };\n const onKey = (e: KeyboardEvent) => {\n if (e.key !== \"Escape\" || e.defaultPrevented || !isTopLayer()) return;\n e.preventDefault();\n closeToButton();\n };\n document.addEventListener(\"mousedown\", onClick);\n document.addEventListener(\"keydown\", onKey);\n return () => { document.removeEventListener(\"mousedown\", onClick); document.removeEventListener(\"keydown\", onKey); };\n }, [open, close, closeToButton, isTopLayer]);\n\n return (\n <div ref={ref} className=\"relative\">\n <button\n type=\"button\"\n onClick={() => setOpen(!open)}\n title={title}\n className={cn(\n \"flex flex-col items-center justify-center w-7 h-7 rounded-[var(--ds-radius-sm)] transition-colors cursor-pointer\",\n \"focus-visible:outline-none focus-visible:shadow-[var(--ds-shadow-focus)]\",\n open\n ? \"bg-[var(--ds-accent-primary)] text-[var(--ds-text-on-primary)]\"\n : \"text-[var(--ds-text-secondary)] hover:bg-[var(--ds-bg-surface)] hover:text-[var(--ds-text-primary)]\",\n )}\n >\n {icon}\n {activeColor && (\n <span className=\"w-3.5 h-0.5 rounded-[var(--ds-radius-full)] -mt-ds-0.5\" style={{ backgroundColor: activeColor }} />\n )}\n </button>\n\n {open && (\n <div className=\"absolute top-full left-0 mt-ds-1 z-[var(--ds-z-popover)] p-ds-1.5 rounded-[var(--ds-radius-md)] border-[length:var(--ds-border-width)] border-[var(--ds-border-default)] bg-[var(--ds-bg-surface-elevated)] shadow-[var(--ds-shadow-dropdown)] flex gap-ds-1 flex-wrap w-[140px]\">\n {colors.map((c) => (\n <button\n key={c.label}\n type=\"button\"\n title={c.label}\n onClick={() => { onSelect(c.value); close(); }}\n className={cn(\n \"w-6 h-6 rounded-[var(--ds-radius-sm)] border-[2px] transition-all cursor-pointer\",\n \"focus-visible:outline-none focus-visible:shadow-[var(--ds-shadow-focus)]\",\n activeColor === c.value ? `${ACTIVE_RING} scale-110` : \"border-transparent hover:scale-110\",\n )}\n style={{ backgroundColor: c.value || \"var(--ds-text-primary)\" }}\n >\n {!c.value && <span className=\"block w-full h-full rounded-[calc(var(--ds-radius-sm)-2px)] bg-[var(--ds-bg-surface)] relative after:absolute after:inset-0 after:rounded-[inherit] after:bg-gradient-to-br after:from-transparent after:to-[var(--ds-text-muted)] after:opacity-30\" />}\n </button>\n ))}\n </div>\n )}\n </div>\n );\n}\n\n/* ── Link popover ─────────────────────────────────────────────────── */\n\nfunction LinkPopover({ editor }: { editor: Editor }) {\n const [open, setOpen] = useState(false);\n const isTopLayer = useOverlayLayer(open);\n const [url, setUrl] = useState(\"\");\n const ref = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n\n const close = useCallback(() => { setOpen(false); setUrl(\"\"); }, []);\n\n // Sprint 25.7: Escape puts focus back on the toolbar button (the popover renders in place, so Tab already moves\n // in page order); focus leaving the button and panel closes it.\n const closeToButton = useCallback(() => {\n const inside = !!ref.current?.contains(document.activeElement);\n close();\n if (inside) ref.current?.querySelector<HTMLElement>(\"button\")?.focus();\n }, [close]);\n useCloseOnFocusOut(open, ref, ref, close, isTopLayer);\n\n const toggle = useCallback(() => {\n if (editor.isActive(\"link\")) {\n editor.chain().focus().unsetLink().run();\n return;\n }\n const existing = editor.getAttributes(\"link\").href ?? \"\";\n setUrl(existing);\n setOpen((o) => !o);\n }, [editor]);\n\n useEffect(() => {\n if (!open) return;\n const onClick = (e: MouseEvent) => { if (!ref.current?.contains(e.target as Node)) close(); };\n const onKey = (e: KeyboardEvent) => {\n if (e.key !== \"Escape\" || e.defaultPrevented || !isTopLayer()) return;\n e.preventDefault();\n closeToButton();\n };\n document.addEventListener(\"mousedown\", onClick);\n document.addEventListener(\"keydown\", onKey);\n requestAnimationFrame(() => inputRef.current?.focus());\n return () => { document.removeEventListener(\"mousedown\", onClick); document.removeEventListener(\"keydown\", onKey); };\n }, [open, close, closeToButton, isTopLayer]);\n\n const apply = () => {\n if (url) editor.chain().focus().setLink({ href: url }).run();\n close();\n };\n\n return (\n <div ref={ref} className=\"relative\">\n <ToolBtn active={editor.isActive(\"link\")} onClick={toggle} title=\"Link\">\n <Icon name=\"link\" size={16} />\n </ToolBtn>\n\n {open && (\n <div className=\"absolute top-full left-0 mt-ds-1 z-[var(--ds-z-popover)] p-ds-1.5 rounded-[var(--ds-radius-md)] border-[length:var(--ds-border-width)] border-[var(--ds-border-subtle)] bg-[var(--ds-bg-surface-elevated)] shadow-[var(--ds-shadow-dropdown)] flex items-center gap-ds-1 w-[240px]\">\n <input\n ref={inputRef}\n type=\"url\"\n value={url}\n onChange={(e) => setUrl(e.target.value)}\n onKeyDown={(e) => { if (e.key === \"Enter\") apply(); }}\n placeholder=\"https://...\"\n className={cn(\n \"flex-1 h-6 px-ds-2 text-xs rounded-[var(--ds-radius-sm)]\",\n \"bg-transparent text-[var(--ds-text-primary)] placeholder:text-[var(--ds-text-muted)]\",\n \"border-[length:var(--ds-border-width)] border-[var(--ds-border-subtle)]\",\n FOCUS_RING,\n )}\n />\n <button\n type=\"button\"\n onClick={apply}\n className={cn(\n \"shrink-0 h-6 px-ds-2 text-xs font-medium rounded-[var(--ds-radius-sm)] cursor-pointer\",\n \"bg-[var(--ds-accent-primary)] text-[var(--ds-text-on-primary)]\",\n \"hover:opacity-90 transition-opacity\",\n \"focus-visible:outline-none focus-visible:shadow-[var(--ds-shadow-focus)]\",\n )}\n >\n Apply\n </button>\n </div>\n )}\n </div>\n );\n}\n\n/* ── Image popover ────────────────────────────────────────────────── */\n\nfunction ImagePopover({ editor }: { editor: Editor }) {\n const [open, setOpen] = useState(false);\n const isTopLayer = useOverlayLayer(open);\n const [url, setUrl] = useState(\"\");\n const [alt, setAlt] = useState(\"\");\n const ref = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n\n const close = useCallback(() => { setOpen(false); setUrl(\"\"); setAlt(\"\"); }, []);\n\n // Sprint 25.7: Escape puts focus back on the toolbar button (the popover renders in place, so Tab already moves\n // in page order); focus leaving the button and panel closes it.\n const closeToButton = useCallback(() => {\n const inside = !!ref.current?.contains(document.activeElement);\n close();\n if (inside) ref.current?.querySelector<HTMLElement>(\"button\")?.focus();\n }, [close]);\n useCloseOnFocusOut(open, ref, ref, close, isTopLayer);\n\n useEffect(() => {\n if (!open) return;\n const onClick = (e: MouseEvent) => { if (!ref.current?.contains(e.target as Node)) close(); };\n const onKey = (e: KeyboardEvent) => {\n if (e.key !== \"Escape\" || e.defaultPrevented || !isTopLayer()) return;\n e.preventDefault();\n closeToButton();\n };\n document.addEventListener(\"mousedown\", onClick);\n document.addEventListener(\"keydown\", onKey);\n requestAnimationFrame(() => inputRef.current?.focus());\n return () => { document.removeEventListener(\"mousedown\", onClick); document.removeEventListener(\"keydown\", onKey); };\n }, [open, close, closeToButton, isTopLayer]);\n\n const insert = () => {\n if (url) editor.chain().focus().setImage({ src: url, alt: alt || undefined }).run();\n close();\n };\n\n return (\n <div ref={ref} className=\"relative\">\n <ToolBtn onClick={() => setOpen((o) => !o)} title=\"Image\">\n <Icon name=\"image\" size={16} />\n </ToolBtn>\n\n {open && (\n <div className=\"absolute top-full left-0 mt-ds-1 z-[var(--ds-z-popover)] p-ds-1.5 rounded-[var(--ds-radius-md)] border-[length:var(--ds-border-width)] border-[var(--ds-border-subtle)] bg-[var(--ds-bg-surface-elevated)] shadow-[var(--ds-shadow-dropdown)] flex flex-col gap-ds-1 w-[240px]\">\n <input\n ref={inputRef}\n type=\"url\"\n value={url}\n onChange={(e) => setUrl(e.target.value)}\n placeholder=\"Image URL\"\n className={cn(\n \"h-6 px-ds-2 text-xs rounded-[var(--ds-radius-sm)]\",\n \"bg-transparent text-[var(--ds-text-primary)] placeholder:text-[var(--ds-text-muted)]\",\n \"border-[length:var(--ds-border-width)] border-[var(--ds-border-subtle)]\",\n FOCUS_RING,\n )}\n />\n <div className=\"flex items-center gap-ds-1\">\n <input\n type=\"text\"\n value={alt}\n onChange={(e) => setAlt(e.target.value)}\n onKeyDown={(e) => { if (e.key === \"Enter\") insert(); }}\n placeholder=\"Alt text (optional)\"\n className={cn(\n \"flex-1 h-6 px-ds-2 text-xs rounded-[var(--ds-radius-sm)]\",\n \"bg-transparent text-[var(--ds-text-primary)] placeholder:text-[var(--ds-text-muted)]\",\n \"border-[length:var(--ds-border-width)] border-[var(--ds-border-subtle)]\",\n FOCUS_RING,\n )}\n />\n <button\n type=\"button\"\n onClick={insert}\n className={cn(\n \"shrink-0 h-6 px-ds-2 text-xs font-medium rounded-[var(--ds-radius-sm)] cursor-pointer\",\n \"bg-[var(--ds-accent-primary)] text-[var(--ds-text-on-primary)]\",\n \"hover:opacity-90 transition-opacity\",\n \"focus-visible:outline-none focus-visible:shadow-[var(--ds-shadow-focus)]\",\n )}\n >\n Insert\n </button>\n </div>\n </div>\n )}\n </div>\n );\n}\n\n/* ── Font family select ───────────────────────────────────────────── */\n\nfunction FontFamilySelect({ editor }: { editor: Editor }) {\n const current = editor.getAttributes(\"textStyle\").fontFamily ?? \"\";\n\n return (\n <select\n value={current}\n onChange={(e) => {\n const v = e.target.value;\n if (v) editor.chain().focus().setFontFamily(v).run();\n else editor.chain().focus().unsetFontFamily().run();\n }}\n title=\"Font family\"\n aria-label=\"Font family\"\n className={cn(\n \"h-7 px-ds-1.5 text-xs rounded-[var(--ds-radius-sm)] cursor-pointer\",\n \"bg-transparent text-[var(--ds-text-secondary)] hover:bg-[var(--ds-bg-surface)]\",\n \"border-none outline-none\",\n \"focus-visible:shadow-[var(--ds-shadow-focus)]\",\n )}\n >\n {FONT_FAMILIES.map((f) => (\n <option key={f.label} value={f.value}>{f.label}</option>\n ))}\n </select>\n );\n}\n\n/* ── Shared toolbar helpers ───────────────────────────────────────── */\n\nfunction ToolGroup({ children }: { children: React.ReactNode }) {\n return <div className=\"flex items-center gap-ds-0.5\">{children}</div>;\n}\n\nfunction Divider() {\n return <div className=\"w-px h-5 mx-ds-1 bg-[var(--ds-border-subtle)]\" />;\n}\n\nfunction TableOpBtn({ onClick, label }: { onClick: () => void; label: string }) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n title={label}\n className={cn(\n \"h-6 px-ds-1.5 text-2xs font-medium rounded-[var(--ds-radius-sm)] transition-colors cursor-pointer whitespace-nowrap\",\n \"focus-visible:outline-none focus-visible:shadow-[var(--ds-shadow-focus)]\",\n \"text-[var(--ds-text-secondary)] hover:bg-[var(--ds-bg-surface)] hover:text-[var(--ds-text-primary)]\",\n )}\n >\n {label}\n </button>\n );\n}\n\nfunction ToolBtn({ active, disabled, onClick, title, children }: { active?: boolean; disabled?: boolean; onClick: () => void; title: string; children: React.ReactNode }) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n disabled={disabled}\n title={title}\n className={cn(\n \"flex items-center justify-center w-7 h-7 rounded-[var(--ds-radius-sm)] transition-colors cursor-pointer\",\n \"focus-visible:outline-none focus-visible:shadow-[var(--ds-shadow-focus)]\",\n active\n ? \"bg-[var(--ds-accent-primary)] text-[var(--ds-text-on-primary)]\"\n : \"text-[var(--ds-text-secondary)] hover:bg-[var(--ds-bg-surface)] hover:text-[var(--ds-text-primary)]\",\n disabled && \"opacity-disabled pointer-events-none\",\n )}\n >\n {children}\n </button>\n );\n}\n\n"]}
1
+ {"version":3,"sources":["../../../showcase/src/components/RichTextEditor.tsx"],"names":[],"mappings":"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","file":"editor.js","sourcesContent":["import { useState, useCallback, useRef, useEffect, useContext, useImperativeHandle, type Ref } from \"react\";\nimport { useCloseOnFocusOut, useOverlayLayer } from \"../lib/focus\";\nimport { useEditor, EditorContent, createDocument, type Editor } from \"@tiptap/react\";\nimport StarterKit from \"@tiptap/starter-kit\";\nimport Image from \"@tiptap/extension-image\";\nimport { Table } from \"@tiptap/extension-table\";\nimport { TableRow } from \"@tiptap/extension-table-row\";\nimport { TableCell } from \"@tiptap/extension-table-cell\";\nimport { TableHeader } from \"@tiptap/extension-table-header\";\nimport Placeholder from \"@tiptap/extension-placeholder\";\nimport CodeBlockLowlight from \"@tiptap/extension-code-block-lowlight\";\nimport { TextStyle, FontSize } from \"@tiptap/extension-text-style\";\nimport Color from \"@tiptap/extension-color\";\nimport Highlight from \"@tiptap/extension-highlight\";\nimport TextAlign from \"@tiptap/extension-text-align\";\nimport TaskList from \"@tiptap/extension-task-list\";\nimport TaskItem from \"@tiptap/extension-task-item\";\nimport Subscript from \"@tiptap/extension-subscript\";\nimport Superscript from \"@tiptap/extension-superscript\";\nimport FontFamily from \"@tiptap/extension-font-family\";\nimport { all, createLowlight } from \"lowlight\";\nimport { cn, ACTIVE_RING, FOCUS_RING } from \"../lib/utils\";\nimport { Icon } from \"../lib/icons\";\nimport { useBreakpoint } from \"../lib/use-breakpoint\";\nimport { useScrollEdges } from \"../lib/use-scroll-edges\";\nimport { useLatest } from \"../lib/use-latest\";\nimport { FormChangeCtx } from \"../lib/form-context\";\n\nconst lowlight = createLowlight(all);\n\nexport type ToolbarGroup =\n | \"blockType\"\n | \"fontFamily\"\n | \"textSize\"\n | \"formatting\"\n | \"colors\"\n | \"alignment\"\n | \"lists\"\n | \"blocks\"\n | \"insert\"\n | \"extras\"\n | \"history\";\n\nconst DEFAULT_TOOLBAR: ToolbarGroup[] = [\n \"blockType\", \"fontFamily\", \"textSize\",\n \"formatting\", \"colors\", \"alignment\",\n \"lists\", \"blocks\", \"insert\", \"extras\", \"history\",\n];\n\nconst MINIMAL_TOOLBAR: ToolbarGroup[] = [\n \"formatting\", \"lists\", \"insert\", \"history\",\n];\n\n/** The editor's handle (Sprint 25.12 A16): what a page does to the document on purpose. */\nexport interface RichTextEditorHandle {\n /**\n * Replaces the whole document (a restore, a template). It always applies, even over text typed this session, and it's\n * a change like the user's own: onChange runs.\n */\n setContent: (html: string) => void;\n /** Inserts HTML where the cursor is (or was, when the editor lost focus), then focuses the editor. */\n insertContent: (html: string) => void;\n /** Inserts an image where the cursor is. */\n insertImage: (image: { src: string; alt?: string }) => void;\n focus: () => void;\n getHTML: () => string;\n}\n\nexport interface RichTextEditorProps {\n /**\n * The document, as HTML. The editor follows it (Sprint 25.12 A16): a new value from outside is applied at once, a\n * clear or a reset included, without calling onChange and outside the undo history (Ctrl+Z never takes it back), and\n * the cursor moves with the text around it. Its own output coming back late (an autosave's echo, markup a server\n * sanitised that parses the same) changes nothing. The editor follows a change of value: to put back the value the\n * page already holds (a Discard when the page stores only what was saved), call `handle.setContent`. A page that\n * switches records keys the editor by the record's id, so undo never crosses records.\n */\n content?: string;\n placeholder?: string;\n onChange?: (html: string) => void;\n /** false shows the document read-only, with no toolbar. Follows its prop. */\n editable?: boolean;\n toolbar?: ToolbarGroup[] | \"full\" | \"minimal\";\n className?: string;\n /** The root element. */\n ref?: Ref<HTMLDivElement>;\n /** The editor's handle: replace the document (a restore, a template) or insert at the cursor (an image, a link). */\n handle?: Ref<RichTextEditorHandle>;\n /**\n * The image button hands over to the page (a media library): call `insert` with the chosen image and it goes in at\n * the cursor. Without it, the button asks for an image URL.\n */\n onImageRequest?: (insert: (image: { src: string; alt?: string }) => void) => void;\n /** Accessible name for the editable area. Default \"Rich text editor\". */\n label?: string;\n}\n\ntype Doc = Editor[\"state\"][\"doc\"];\n/**\n * The editor's own outputs the page hasn't caught up with, which can still come back as late echoes: at most this many,\n * in at most this many characters (a large document with pasted images), and only the newest few parsed to compare.\n */\nconst OWN_OUTPUTS = 100;\nconst OWN_OUTPUT_CHARS = 4_000_000;\nconst PARSED_OUTPUTS = 10;\n\n/**\n * A value from outside, applied as the smallest replacement (0.21.0): the cursor maps through it, it isn't an undo\n * step, and it raises no update event, so neither onChange nor the form's mark hears of it.\n */\nfunction applyOutside(editor: Editor, incoming: Doc) {\n const { state } = editor;\n const start = state.doc.content.findDiffStart(incoming.content);\n if (start == null) return;\n let { a: endA, b: endB } = state.doc.content.findDiffEnd(incoming.content) ?? { a: state.doc.content.size, b: incoming.content.size };\n // repeated text around the change makes the ends overlap the start (ProseMirror's own reading of a DOM change)\n const overlap = start - Math.min(endA, endB);\n if (overlap > 0) { endA += overlap; endB += overlap; }\n let tr = state.tr;\n try {\n tr = tr.replace(start, endA, incoming.slice(start, endB));\n } catch {\n tr = state.tr.replaceWith(0, state.doc.content.size, incoming.content);\n }\n editor.view.dispatch(tr.setMeta(\"addToHistory\", false).setMeta(\"preventUpdate\", true));\n}\n\nexport function RichTextEditor({\n content = \"\",\n placeholder = \"Start writing...\",\n onChange,\n editable = true,\n toolbar = \"full\",\n className,\n ref, handle, onImageRequest, label = \"Rich text editor\" }: RichTextEditorProps) {\n const resolvedToolbar = toolbar === \"full\" ? DEFAULT_TOOLBAR : toolbar === \"minimal\" ? MINIMAL_TOOLBAR : toolbar;\n // A15: an edit is a change to the form the editor sits in (never a value the page sets)\n const reportChange = useLatest(useContext(FormChangeCtx));\n // The editor's own outputs the page hasn't caught up with, newest last: a value coming back that matches one is a late\n // echo, not a change. Once the page holds the newest, none of them can come back (0.21.0: an older one that matched\n // a clear or a reset swallowed it). Each is parsed only if a value needs comparing with it.\n const ownOutputs = useRef<Array<{ html: string; doc?: Doc }>>([]);\n const editor = useEditor({\n extensions: [\n StarterKit.configure({\n codeBlock: false,\n link: { openOnClick: false, HTMLAttributes: { class: \"rte-link\" } },\n }),\n Image.configure({ inline: false, allowBase64: true }),\n CodeBlockLowlight.configure({ lowlight }),\n Table.configure({ resizable: false }),\n TableRow,\n TableCell,\n TableHeader,\n Placeholder.configure({ placeholder }),\n TextStyle,\n FontSize,\n Color,\n Highlight.configure({ multicolor: true }),\n TextAlign.configure({ types: [\"heading\", \"paragraph\"] }),\n TaskList,\n TaskItem.configure({ nested: true }),\n Subscript,\n Superscript,\n FontFamily,\n ],\n content,\n editable,\n // Setting attributes replaces tiptap's defaults, so restore role=\"textbox\" alongside the name.\n editorProps: { attributes: { role: \"textbox\", \"aria-label\": label, \"aria-multiline\": \"true\" } },\n onUpdate: ({ editor: e }) => {\n const html = e.getHTML();\n const outputs = ownOutputs.current;\n outputs.push({ html });\n let chars = outputs.reduce((n, o) => n + o.html.length, 0);\n while (outputs.length > 1 && (outputs.length > OWN_OUTPUTS || chars > OWN_OUTPUT_CHARS)) chars -= outputs.shift()!.html.length;\n reportChange.current?.();\n onChange?.(html);\n },\n });\n\n // Following `content` (A16, R28-43): applied with no update event (so no onChange and no form mark), outside the undo\n // history, the cursor mapped through it (applyOutside). What counts as the same is decided like for like: a value\n // equal to the editor's own output, now or one the page hasn't caught up with, as text, else both sides parsed through\n // the editor's schema — never a parsed value against the live document, since parsing drops a paragraph's trailing\n // space the user just typed. Nothing is applied during an IME composition; a value that came during one is checked\n // again when it ends.\n const contentRef = useLatest(content);\n const outsideWaiting = useRef(false);\n const follow = useCallback((ed: Editor) => {\n if (ed.isDestroyed) return;\n const html = contentRef.current;\n const current = ed.getHTML();\n const outputs = ownOutputs.current;\n // the page holds what the editor shows: every output it could send back is older, and none will come now\n if (html === current) { outputs.length = 0; return; }\n // a late echo: nothing to apply, and the outputs before it are older still\n const echoed = outputs.map((o) => o.html).lastIndexOf(html);\n if (echoed !== -1) { outputs.splice(0, echoed); return; }\n const parse = (h: string): Doc => createDocument(h, ed.schema, {}, { errorOnInvalidContent: false });\n let incoming: Doc;\n try {\n incoming = parse(html);\n if (incoming.eq(parse(current))) { outputs.length = 0; return; }\n for (let i = outputs.length - 1; i >= Math.max(0, outputs.length - PARSED_OUTPUTS); i--) {\n const own = outputs[i];\n own.doc ??= parse(own.html);\n if (own.doc.eq(incoming)) { outputs.splice(0, i); return; }\n }\n } catch {\n return;\n }\n if (ed.view.composing) {\n outsideWaiting.current = true;\n return;\n }\n outputs.length = 0;\n applyOutside(ed, incoming);\n }, [contentRef]);\n\n useEffect(() => {\n if (editor) follow(editor);\n }, [editor, content, follow]);\n\n useEffect(() => {\n if (!editor) return;\n const dom = editor.view.dom;\n const onEnd = () => {\n if (!outsideWaiting.current) return;\n outsideWaiting.current = false;\n // ProseMirror reads the composition's last input after the event\n setTimeout(() => follow(editor));\n };\n dom.addEventListener(\"compositionend\", onEnd);\n return () => dom.removeEventListener(\"compositionend\", onEnd);\n }, [editor, follow]);\n\n // `editable` follows its prop (tiptap freezes it at creation); no update event, so no onChange\n useEffect(() => {\n if (editor && !editor.isDestroyed && editor.isEditable !== editable) editor.setEditable(editable, false);\n }, [editor, editable]);\n\n useImperativeHandle(handle, () => ({\n setContent: (html) => { if (editor && !editor.isDestroyed) editor.commands.setContent(html); },\n insertContent: (html) => { editor?.chain().focus().insertContent(html).run(); },\n insertImage: ({ src, alt }) => { editor?.chain().focus().setImage({ src, alt: alt || undefined }).run(); },\n focus: () => { editor?.commands.focus(); },\n getHTML: () => editor?.getHTML() ?? \"\",\n }), [editor]);\n\n if (!editor) return null;\n\n return (\n <div\n ref={ref}\n className={cn(\n \"flex flex-col rounded-[var(--ds-radius-md)] overflow-hidden\",\n // Sprint 25.14 A20: a field's edge, at 3:1 like every other control's\n \"border-[length:var(--ds-border-width)] border-[var(--ds-input-border)]\",\n \"bg-[var(--ds-bg-surface)]\",\n className,\n )}\n >\n {editable && <Toolbar editor={editor} groups={resolvedToolbar} onImageRequest={onImageRequest} />}\n\n <EditorContent\n editor={editor}\n className={cn(\n \"rte-content\",\n \"flex-1 overflow-y-auto px-ds-4 py-ds-3\",\n \"text-sm text-[var(--ds-text-primary)]\",\n \"focus-within:outline-none\",\n )}\n />\n </div>\n );\n}\n\n/* ── Toolbar ──────────────────────────────────────────────────────── */\n\nconst TEXT_COLORS = [\n { label: \"Default\", value: \"\" },\n { label: \"Red\", value: \"#ef4444\" },\n { label: \"Orange\", value: \"#f97316\" },\n { label: \"Yellow\", value: \"#eab308\" },\n { label: \"Green\", value: \"#22c55e\" },\n { label: \"Blue\", value: \"#3b82f6\" },\n { label: \"Purple\", value: \"#a855f7\" },\n { label: \"Pink\", value: \"#ec4899\" },\n];\n\nconst HIGHLIGHT_COLORS = [\n { label: \"None\", value: \"\" },\n { label: \"Yellow\", value: \"#fef08a\" },\n { label: \"Green\", value: \"#bbf7d0\" },\n { label: \"Blue\", value: \"#bfdbfe\" },\n { label: \"Pink\", value: \"#fbcfe8\" },\n { label: \"Orange\", value: \"#fed7aa\" },\n { label: \"Purple\", value: \"#e9d5ff\" },\n];\n\nconst FONT_FAMILIES = [\n { label: \"Default\", value: \"\" },\n { label: \"Sans\", value: \"var(--ds-font-sans)\" },\n { label: \"Mono\", value: \"var(--ds-font-mono)\" },\n { label: \"Display\", value: \"var(--ds-font-display)\" },\n { label: \"Serif\", value: \"Georgia, serif\" },\n];\n\nconst TEXT_SIZES = [\n { label: \"Small\", value: \"0.85em\" },\n { label: \"Normal\", value: \"\" },\n { label: \"Large\", value: \"1.2em\" },\n { label: \"Huge\", value: \"1.5em\" },\n];\n\nfunction Toolbar({ editor, groups, onImageRequest }: { editor: Editor; groups: ToolbarGroup[]; onImageRequest?: RichTextEditorProps[\"onImageRequest\"] }) {\n const [, forceUpdate] = useState(0);\n const isMobile = useBreakpoint(\"sm\");\n\n useEffect(() => {\n const handler = () => forceUpdate((n) => n + 1);\n editor.on(\"selectionUpdate\", handler);\n editor.on(\"transaction\", handler);\n return () => {\n editor.off(\"selectionUpdate\", handler);\n editor.off(\"transaction\", handler);\n };\n }, [editor]);\n\n const inTable = editor.isActive(\"table\");\n const has = (g: ToolbarGroup) => groups.includes(g);\n // Sprint 25.14 A22: on a phone the toolbars scroll sideways with no scrollbar, so their edges fade where more waits,\n // as the Tabs strip and the Table do\n const { ref: toolbarRef, measure: measureToolbar, fadeProps: toolbarFade } = useScrollEdges<HTMLDivElement>({ enabled: isMobile });\n const { ref: tableBarRef, measure: measureTableBar, fadeProps: tableBarFade } = useScrollEdges<HTMLDivElement>({ enabled: isMobile && inTable });\n\n const groupElements: React.ReactNode[] = [];\n\n if (has(\"blockType\")) groupElements.push(<BlockTypeSelect key=\"blockType\" editor={editor} />);\n if (has(\"fontFamily\")) groupElements.push(<FontFamilySelect key=\"fontFamily\" editor={editor} />);\n if (has(\"textSize\")) groupElements.push(<TextSizeControls key=\"textSize\" editor={editor} />);\n\n if (has(\"formatting\")) {\n groupElements.push(\n <ToolGroup key=\"formatting\">\n <ToolBtn active={editor.isActive(\"bold\")} onClick={() => editor.chain().focus().toggleBold().run()} title=\"Bold (Ctrl+B)\">\n <Icon name=\"bold\" size={16} />\n </ToolBtn>\n <ToolBtn active={editor.isActive(\"italic\")} onClick={() => editor.chain().focus().toggleItalic().run()} title=\"Italic (Ctrl+I)\">\n <Icon name=\"italic\" size={16} />\n </ToolBtn>\n <ToolBtn active={editor.isActive(\"underline\")} onClick={() => editor.chain().focus().toggleUnderline().run()} title=\"Underline (Ctrl+U)\">\n <Icon name=\"underline\" size={16} />\n </ToolBtn>\n <ToolBtn active={editor.isActive(\"strike\")} onClick={() => editor.chain().focus().toggleStrike().run()} title=\"Strikethrough\">\n <Icon name=\"strikethrough\" size={16} />\n </ToolBtn>\n </ToolGroup>\n );\n }\n\n if (has(\"colors\")) {\n groupElements.push(\n <ToolGroup key=\"colors\">\n <ColorPicker\n colors={TEXT_COLORS}\n activeColor={editor.getAttributes(\"textStyle\").color ?? \"\"}\n onSelect={(c) => c ? editor.chain().focus().setColor(c).run() : editor.chain().focus().unsetColor().run()}\n title=\"Text color\"\n icon={<Icon name=\"type\" size={16} />}\n />\n <ColorPicker\n colors={HIGHLIGHT_COLORS}\n activeColor={editor.getAttributes(\"highlight\").color ?? \"\"}\n onSelect={(c) => c ? editor.chain().focus().toggleHighlight({ color: c }).run() : editor.chain().focus().unsetHighlight().run()}\n title=\"Highlight\"\n icon={<Icon name=\"highlight\" size={16} />}\n />\n </ToolGroup>\n );\n }\n\n if (has(\"alignment\")) {\n groupElements.push(\n <ToolGroup key=\"alignment\">\n <ToolBtn active={editor.isActive({ textAlign: \"left\" })} onClick={() => editor.chain().focus().setTextAlign(\"left\").run()} title=\"Align left\">\n <Icon name=\"align-left\" size={16} />\n </ToolBtn>\n <ToolBtn active={editor.isActive({ textAlign: \"center\" })} onClick={() => editor.chain().focus().setTextAlign(\"center\").run()} title=\"Align center\">\n <Icon name=\"align-center\" size={16} />\n </ToolBtn>\n <ToolBtn active={editor.isActive({ textAlign: \"right\" })} onClick={() => editor.chain().focus().setTextAlign(\"right\").run()} title=\"Align right\">\n <Icon name=\"align-right\" size={16} />\n </ToolBtn>\n </ToolGroup>\n );\n }\n\n if (has(\"lists\")) {\n groupElements.push(\n <ToolGroup key=\"lists\">\n <ToolBtn active={editor.isActive(\"bulletList\")} onClick={() => editor.chain().focus().toggleBulletList().run()} title=\"Bullet list\">\n <Icon name=\"list\" size={16} />\n </ToolBtn>\n <ToolBtn active={editor.isActive(\"orderedList\")} onClick={() => editor.chain().focus().toggleOrderedList().run()} title=\"Ordered list\">\n <Icon name=\"list-ordered\" size={16} />\n </ToolBtn>\n <ToolBtn active={editor.isActive(\"taskList\")} onClick={() => editor.chain().focus().toggleTaskList().run()} title=\"Task list\">\n <Icon name=\"list-checks\" size={16} />\n </ToolBtn>\n </ToolGroup>\n );\n }\n\n if (has(\"blocks\")) {\n groupElements.push(\n <ToolGroup key=\"blocks\">\n <ToolBtn active={editor.isActive(\"blockquote\")} onClick={() => editor.chain().focus().toggleBlockquote().run()} title=\"Blockquote\">\n <Icon name=\"quote\" size={16} />\n </ToolBtn>\n <ToolBtn active={editor.isActive(\"codeBlock\")} onClick={() => editor.chain().focus().toggleCodeBlock().run()} title=\"Code block\">\n <Icon name=\"code\" size={16} />\n </ToolBtn>\n </ToolGroup>\n );\n }\n\n if (has(\"insert\")) {\n groupElements.push(\n <ToolGroup key=\"insert\">\n <LinkPopover editor={editor} />\n {onImageRequest ? (\n // the page's media library is the one way in; its choice goes in at the cursor\n <ToolBtn onClick={() => onImageRequest((image) => { editor.chain().focus().setImage({ src: image.src, alt: image.alt || undefined }).run(); })} title=\"Image\">\n <Icon name=\"image\" size={16} />\n </ToolBtn>\n ) : (\n <ImagePopover editor={editor} />\n )}\n <ToolBtn onClick={() => editor.chain().focus().insertTable({ rows: 3, cols: 3, withHeaderRow: true }).run()} disabled={inTable} title=\"Insert table\">\n <Icon name=\"table\" size={16} />\n </ToolBtn>\n <ToolBtn onClick={() => editor.chain().focus().setHorizontalRule().run()} title=\"Horizontal rule\">\n <Icon name=\"minus\" size={16} />\n </ToolBtn>\n </ToolGroup>\n );\n }\n\n if (has(\"extras\")) {\n groupElements.push(\n <ToolGroup key=\"extras\">\n <ToolBtn active={editor.isActive(\"code\")} onClick={() => editor.chain().focus().toggleCode().run()} title=\"Inline code\">\n <Icon name=\"code\" size={16} />\n </ToolBtn>\n <ToolBtn active={editor.isActive(\"superscript\")} onClick={() => editor.chain().focus().toggleSuperscript().run()} title=\"Superscript\">\n <Icon name=\"superscript\" size={16} />\n </ToolBtn>\n <ToolBtn active={editor.isActive(\"subscript\")} onClick={() => editor.chain().focus().toggleSubscript().run()} title=\"Subscript\">\n <Icon name=\"subscript\" size={16} />\n </ToolBtn>\n </ToolGroup>\n );\n }\n\n if (has(\"history\")) {\n groupElements.push(\n <ToolGroup key=\"history\">\n <ToolBtn onClick={() => editor.chain().focus().undo().run()} disabled={!editor.can().undo()} title=\"Undo (Ctrl+Z)\">\n <Icon name=\"undo\" size={16} />\n </ToolBtn>\n <ToolBtn onClick={() => editor.chain().focus().redo().run()} disabled={!editor.can().redo()} title=\"Redo (Ctrl+Shift+Z)\">\n <Icon name=\"redo\" size={16} />\n </ToolBtn>\n </ToolGroup>\n );\n }\n\n const withDividers = groupElements.reduce<React.ReactNode[]>((acc, el, i) => {\n if (i > 0) acc.push(<Divider key={`d-${i}`} />);\n acc.push(el);\n return acc;\n }, []);\n\n return (\n <div className=\"border-b-[length:var(--ds-border-width)] border-[var(--ds-border-subtle)] bg-[var(--ds-bg-muted)]\">\n <div\n ref={toolbarRef}\n onScroll={measureToolbar}\n {...toolbarFade}\n className={cn(\n \"flex items-center gap-ds-0.5 px-ds-2 py-ds-1\",\n isMobile ? \"overflow-x-auto flex-nowrap gs-scrollbar-none\" : \"flex-wrap\",\n )}\n >\n {withDividers}\n </div>\n\n {inTable && (\n <div ref={tableBarRef} onScroll={measureTableBar} {...tableBarFade} className={cn(\n \"flex items-center gap-ds-0.5 px-ds-2 py-ds-1 border-t-[length:var(--ds-border-width)] border-[var(--ds-border-subtle)]\",\n isMobile && \"overflow-x-auto flex-nowrap gs-scrollbar-none\",\n )}>\n <span className=\"text-2xs text-[var(--ds-text-muted)] uppercase tracking-wider mr-ds-1 shrink-0\">Table</span>\n <TableOpBtn onClick={() => editor.chain().focus().addRowAfter().run()} label=\"+ Row\" />\n <TableOpBtn onClick={() => editor.chain().focus().addColumnAfter().run()} label=\"+ Col\" />\n <Divider />\n <TableOpBtn onClick={() => editor.chain().focus().deleteRow().run()} label=\"− Row\" />\n <TableOpBtn onClick={() => editor.chain().focus().deleteColumn().run()} label=\"− Col\" />\n <Divider />\n <TableOpBtn onClick={() => editor.chain().focus().mergeCells().run()} label=\"Merge\" />\n <TableOpBtn onClick={() => editor.chain().focus().splitCell().run()} label=\"Split\" />\n <Divider />\n <ToolBtn onClick={() => editor.chain().focus().deleteTable().run()} title=\"Delete table\"><Icon name=\"trash\" size={14} /></ToolBtn>\n </div>\n )}\n </div>\n );\n}\n\n/* ── Block type select (paragraph / headings) ─────────────────────── */\n\nfunction BlockTypeSelect({ editor }: { editor: Editor }) {\n const value = editor.isActive(\"heading\", { level: 1 }) ? \"h1\"\n : editor.isActive(\"heading\", { level: 2 }) ? \"h2\"\n : editor.isActive(\"heading\", { level: 3 }) ? \"h3\"\n : \"p\";\n\n return (\n <select\n value={value}\n onChange={(e) => {\n const v = e.target.value;\n if (v === \"p\") editor.chain().focus().setParagraph().run();\n else if (v === \"h1\") editor.chain().focus().toggleHeading({ level: 1 }).run();\n else if (v === \"h2\") editor.chain().focus().toggleHeading({ level: 2 }).run();\n else if (v === \"h3\") editor.chain().focus().toggleHeading({ level: 3 }).run();\n }}\n title=\"Block type\"\n aria-label=\"Block type\"\n className={cn(\n \"h-7 px-ds-1.5 text-xs rounded-[var(--ds-radius-sm)] cursor-pointer\",\n \"bg-transparent text-[var(--ds-text-secondary)] hover:bg-[var(--ds-bg-surface)]\",\n \"border-none outline-none\",\n \"focus-visible:shadow-[var(--ds-shadow-focus)]\",\n )}\n >\n <option value=\"p\">Paragraph</option>\n <option value=\"h1\">Heading 1</option>\n <option value=\"h2\">Heading 2</option>\n <option value=\"h3\">Heading 3</option>\n </select>\n );\n}\n\n/* ── Text size increase/decrease ──────────────────────────────────── */\n\nfunction TextSizeControls({ editor }: { editor: Editor }) {\n const current = editor.getAttributes(\"textStyle\").fontSize ?? \"\";\n const idx = TEXT_SIZES.findIndex((s) => s.value === current);\n const currentIdx = idx === -1 ? 1 : idx;\n\n const decrease = () => {\n const next = Math.max(0, currentIdx - 1);\n const v = TEXT_SIZES[next].value;\n if (v) editor.chain().focus().setFontSize(v).run();\n else editor.chain().focus().unsetFontSize().run();\n };\n\n const increase = () => {\n const next = Math.min(TEXT_SIZES.length - 1, currentIdx + 1);\n const v = TEXT_SIZES[next].value;\n if (v) editor.chain().focus().setFontSize(v).run();\n else editor.chain().focus().unsetFontSize().run();\n };\n\n return (\n <ToolGroup>\n <ToolBtn onClick={decrease} disabled={currentIdx <= 0} title={`Decrease text size (${TEXT_SIZES[Math.max(0, currentIdx - 1)]?.label})`}>\n <span className=\"text-2xs font-bold leading-none select-none\">A</span>\n </ToolBtn>\n <ToolBtn onClick={increase} disabled={currentIdx >= TEXT_SIZES.length - 1} title={`Increase text size (${TEXT_SIZES[Math.min(TEXT_SIZES.length - 1, currentIdx + 1)]?.label})`}>\n <span className=\"text-base font-bold leading-none select-none\">A</span>\n </ToolBtn>\n </ToolGroup>\n );\n}\n\n/* ── Color picker popover ─────────────────────────────────────────── */\n\nfunction ColorPicker({\n colors,\n activeColor,\n onSelect,\n title,\n icon,\n}: {\n colors: { label: string; value: string }[];\n activeColor: string;\n onSelect: (color: string) => void;\n title: string;\n icon: React.ReactNode;\n}) {\n const [open, setOpen] = useState(false);\n const isTopLayer = useOverlayLayer(open);\n const ref = useRef<HTMLDivElement>(null);\n\n const close = useCallback(() => setOpen(false), []);\n\n // Sprint 25.7: Escape puts focus back on the toolbar button (the popover renders in place, so Tab already moves\n // in page order); focus leaving the button and panel closes it.\n const closeToButton = useCallback(() => {\n const inside = !!ref.current?.contains(document.activeElement);\n close();\n if (inside) ref.current?.querySelector<HTMLElement>(\"button\")?.focus();\n }, [close]);\n useCloseOnFocusOut(open, ref, ref, close, isTopLayer);\n\n useEffect(() => {\n if (!open) return;\n const onClick = (e: MouseEvent) => { if (!ref.current?.contains(e.target as Node)) close(); };\n const onKey = (e: KeyboardEvent) => {\n if (e.key !== \"Escape\" || e.defaultPrevented || !isTopLayer()) return;\n e.preventDefault();\n closeToButton();\n };\n document.addEventListener(\"mousedown\", onClick);\n document.addEventListener(\"keydown\", onKey);\n return () => { document.removeEventListener(\"mousedown\", onClick); document.removeEventListener(\"keydown\", onKey); };\n }, [open, close, closeToButton, isTopLayer]);\n\n return (\n <div ref={ref} className=\"relative\">\n <button\n type=\"button\"\n onClick={() => setOpen(!open)}\n title={title}\n className={cn(\n \"flex flex-col items-center justify-center w-7 h-7 rounded-[var(--ds-radius-sm)] transition-colors cursor-pointer\",\n \"focus-visible:outline-none focus-visible:shadow-[var(--ds-shadow-focus)]\",\n open\n ? \"bg-[var(--ds-accent-primary)] text-[var(--ds-text-on-primary)]\"\n : \"text-[var(--ds-text-secondary)] hover:bg-[var(--ds-bg-surface)] hover:text-[var(--ds-text-primary)]\",\n )}\n >\n {icon}\n {activeColor && (\n <span className=\"w-3.5 h-0.5 rounded-[var(--ds-radius-full)] -mt-ds-0.5\" style={{ backgroundColor: activeColor }} />\n )}\n </button>\n\n {open && (\n <div className=\"absolute top-full left-0 mt-ds-1 z-[var(--ds-z-popover)] p-ds-1.5 rounded-[var(--ds-radius-md)] border-[length:var(--ds-border-width)] border-[var(--ds-border-default)] bg-[var(--ds-bg-surface-elevated)] shadow-[var(--ds-shadow-dropdown)] flex gap-ds-1 flex-wrap w-[140px]\">\n {colors.map((c) => (\n <button\n key={c.label}\n type=\"button\"\n title={c.label}\n onClick={() => { onSelect(c.value); close(); }}\n className={cn(\n \"w-6 h-6 rounded-[var(--ds-radius-sm)] border-[2px] transition-all cursor-pointer\",\n \"focus-visible:outline-none focus-visible:shadow-[var(--ds-shadow-focus)]\",\n activeColor === c.value ? `${ACTIVE_RING} scale-110` : \"border-transparent hover:scale-110\",\n )}\n style={{ backgroundColor: c.value || \"var(--ds-text-primary)\" }}\n >\n {!c.value && <span className=\"block w-full h-full rounded-[calc(var(--ds-radius-sm)-2px)] bg-[var(--ds-bg-surface)] relative after:absolute after:inset-0 after:rounded-[inherit] after:bg-gradient-to-br after:from-transparent after:to-[var(--ds-text-muted)] after:opacity-30\" />}\n </button>\n ))}\n </div>\n )}\n </div>\n );\n}\n\n/* ── Link popover ─────────────────────────────────────────────────── */\n\nfunction LinkPopover({ editor }: { editor: Editor }) {\n const [open, setOpen] = useState(false);\n const isTopLayer = useOverlayLayer(open);\n const [url, setUrl] = useState(\"\");\n const ref = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n\n const close = useCallback(() => { setOpen(false); setUrl(\"\"); }, []);\n\n // Sprint 25.7: Escape puts focus back on the toolbar button (the popover renders in place, so Tab already moves\n // in page order); focus leaving the button and panel closes it.\n const closeToButton = useCallback(() => {\n const inside = !!ref.current?.contains(document.activeElement);\n close();\n if (inside) ref.current?.querySelector<HTMLElement>(\"button\")?.focus();\n }, [close]);\n useCloseOnFocusOut(open, ref, ref, close, isTopLayer);\n\n const toggle = useCallback(() => {\n if (editor.isActive(\"link\")) {\n editor.chain().focus().unsetLink().run();\n return;\n }\n const existing = editor.getAttributes(\"link\").href ?? \"\";\n setUrl(existing);\n setOpen((o) => !o);\n }, [editor]);\n\n useEffect(() => {\n if (!open) return;\n const onClick = (e: MouseEvent) => { if (!ref.current?.contains(e.target as Node)) close(); };\n const onKey = (e: KeyboardEvent) => {\n if (e.key !== \"Escape\" || e.defaultPrevented || !isTopLayer()) return;\n e.preventDefault();\n closeToButton();\n };\n document.addEventListener(\"mousedown\", onClick);\n document.addEventListener(\"keydown\", onKey);\n requestAnimationFrame(() => inputRef.current?.focus());\n return () => { document.removeEventListener(\"mousedown\", onClick); document.removeEventListener(\"keydown\", onKey); };\n }, [open, close, closeToButton, isTopLayer]);\n\n const apply = () => {\n if (url) editor.chain().focus().setLink({ href: url }).run();\n close();\n };\n\n return (\n <div ref={ref} className=\"relative\">\n <ToolBtn active={editor.isActive(\"link\")} onClick={toggle} title=\"Link\">\n <Icon name=\"link\" size={16} />\n </ToolBtn>\n\n {open && (\n <div className=\"absolute top-full left-0 mt-ds-1 z-[var(--ds-z-popover)] p-ds-1.5 rounded-[var(--ds-radius-md)] border-[length:var(--ds-border-width)] border-[var(--ds-border-subtle)] bg-[var(--ds-bg-surface-elevated)] shadow-[var(--ds-shadow-dropdown)] flex items-center gap-ds-1 w-[240px]\">\n <input\n ref={inputRef}\n type=\"url\"\n value={url}\n onChange={(e) => setUrl(e.target.value)}\n onKeyDown={(e) => { if (e.key === \"Enter\") apply(); }}\n placeholder=\"https://...\"\n className={cn(\n \"flex-1 h-6 px-ds-2 text-xs rounded-[var(--ds-radius-sm)]\",\n \"bg-transparent text-[var(--ds-text-primary)] placeholder:text-[var(--ds-text-muted)]\",\n \"border-[length:var(--ds-border-width)] border-[var(--ds-border-subtle)]\",\n FOCUS_RING,\n )}\n />\n <button\n type=\"button\"\n onClick={apply}\n className={cn(\n \"shrink-0 h-6 px-ds-2 text-xs font-medium rounded-[var(--ds-radius-sm)] cursor-pointer\",\n \"bg-[var(--ds-accent-primary)] text-[var(--ds-text-on-primary)]\",\n \"hover:opacity-90 transition-opacity\",\n \"focus-visible:outline-none focus-visible:shadow-[var(--ds-shadow-focus)]\",\n )}\n >\n Apply\n </button>\n </div>\n )}\n </div>\n );\n}\n\n/* ── Image popover ────────────────────────────────────────────────── */\n\nfunction ImagePopover({ editor }: { editor: Editor }) {\n const [open, setOpen] = useState(false);\n const isTopLayer = useOverlayLayer(open);\n const [url, setUrl] = useState(\"\");\n const [alt, setAlt] = useState(\"\");\n const ref = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n\n const close = useCallback(() => { setOpen(false); setUrl(\"\"); setAlt(\"\"); }, []);\n\n // Sprint 25.7: Escape puts focus back on the toolbar button (the popover renders in place, so Tab already moves\n // in page order); focus leaving the button and panel closes it.\n const closeToButton = useCallback(() => {\n const inside = !!ref.current?.contains(document.activeElement);\n close();\n if (inside) ref.current?.querySelector<HTMLElement>(\"button\")?.focus();\n }, [close]);\n useCloseOnFocusOut(open, ref, ref, close, isTopLayer);\n\n useEffect(() => {\n if (!open) return;\n const onClick = (e: MouseEvent) => { if (!ref.current?.contains(e.target as Node)) close(); };\n const onKey = (e: KeyboardEvent) => {\n if (e.key !== \"Escape\" || e.defaultPrevented || !isTopLayer()) return;\n e.preventDefault();\n closeToButton();\n };\n document.addEventListener(\"mousedown\", onClick);\n document.addEventListener(\"keydown\", onKey);\n requestAnimationFrame(() => inputRef.current?.focus());\n return () => { document.removeEventListener(\"mousedown\", onClick); document.removeEventListener(\"keydown\", onKey); };\n }, [open, close, closeToButton, isTopLayer]);\n\n const insert = () => {\n if (url) editor.chain().focus().setImage({ src: url, alt: alt || undefined }).run();\n close();\n };\n\n return (\n <div ref={ref} className=\"relative\">\n <ToolBtn onClick={() => setOpen((o) => !o)} title=\"Image\">\n <Icon name=\"image\" size={16} />\n </ToolBtn>\n\n {open && (\n <div className=\"absolute top-full left-0 mt-ds-1 z-[var(--ds-z-popover)] p-ds-1.5 rounded-[var(--ds-radius-md)] border-[length:var(--ds-border-width)] border-[var(--ds-border-subtle)] bg-[var(--ds-bg-surface-elevated)] shadow-[var(--ds-shadow-dropdown)] flex flex-col gap-ds-1 w-[240px]\">\n <input\n ref={inputRef}\n type=\"url\"\n value={url}\n onChange={(e) => setUrl(e.target.value)}\n placeholder=\"Image URL\"\n className={cn(\n \"h-6 px-ds-2 text-xs rounded-[var(--ds-radius-sm)]\",\n \"bg-transparent text-[var(--ds-text-primary)] placeholder:text-[var(--ds-text-muted)]\",\n \"border-[length:var(--ds-border-width)] border-[var(--ds-border-subtle)]\",\n FOCUS_RING,\n )}\n />\n <div className=\"flex items-center gap-ds-1\">\n <input\n type=\"text\"\n value={alt}\n onChange={(e) => setAlt(e.target.value)}\n onKeyDown={(e) => { if (e.key === \"Enter\") insert(); }}\n placeholder=\"Alt text (optional)\"\n className={cn(\n \"flex-1 h-6 px-ds-2 text-xs rounded-[var(--ds-radius-sm)]\",\n \"bg-transparent text-[var(--ds-text-primary)] placeholder:text-[var(--ds-text-muted)]\",\n \"border-[length:var(--ds-border-width)] border-[var(--ds-border-subtle)]\",\n FOCUS_RING,\n )}\n />\n <button\n type=\"button\"\n onClick={insert}\n className={cn(\n \"shrink-0 h-6 px-ds-2 text-xs font-medium rounded-[var(--ds-radius-sm)] cursor-pointer\",\n \"bg-[var(--ds-accent-primary)] text-[var(--ds-text-on-primary)]\",\n \"hover:opacity-90 transition-opacity\",\n \"focus-visible:outline-none focus-visible:shadow-[var(--ds-shadow-focus)]\",\n )}\n >\n Insert\n </button>\n </div>\n </div>\n )}\n </div>\n );\n}\n\n/* ── Font family select ───────────────────────────────────────────── */\n\nfunction FontFamilySelect({ editor }: { editor: Editor }) {\n const current = editor.getAttributes(\"textStyle\").fontFamily ?? \"\";\n\n return (\n <select\n value={current}\n onChange={(e) => {\n const v = e.target.value;\n if (v) editor.chain().focus().setFontFamily(v).run();\n else editor.chain().focus().unsetFontFamily().run();\n }}\n title=\"Font family\"\n aria-label=\"Font family\"\n className={cn(\n \"h-7 px-ds-1.5 text-xs rounded-[var(--ds-radius-sm)] cursor-pointer\",\n \"bg-transparent text-[var(--ds-text-secondary)] hover:bg-[var(--ds-bg-surface)]\",\n \"border-none outline-none\",\n \"focus-visible:shadow-[var(--ds-shadow-focus)]\",\n )}\n >\n {FONT_FAMILIES.map((f) => (\n <option key={f.label} value={f.value}>{f.label}</option>\n ))}\n </select>\n );\n}\n\n/* ── Shared toolbar helpers ───────────────────────────────────────── */\n\nfunction ToolGroup({ children }: { children: React.ReactNode }) {\n return <div className=\"flex items-center gap-ds-0.5\">{children}</div>;\n}\n\nfunction Divider() {\n return <div className=\"w-px h-5 mx-ds-1 bg-[var(--ds-border-subtle)]\" />;\n}\n\nfunction TableOpBtn({ onClick, label }: { onClick: () => void; label: string }) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n title={label}\n className={cn(\n \"h-6 px-ds-1.5 text-2xs font-medium rounded-[var(--ds-radius-sm)] transition-colors cursor-pointer whitespace-nowrap\",\n \"focus-visible:outline-none focus-visible:shadow-[var(--ds-shadow-focus)]\",\n \"text-[var(--ds-text-secondary)] hover:bg-[var(--ds-bg-surface)] hover:text-[var(--ds-text-primary)]\",\n )}\n >\n {label}\n </button>\n );\n}\n\nfunction ToolBtn({ active, disabled, onClick, title, children }: { active?: boolean; disabled?: boolean; onClick: () => void; title: string; children: React.ReactNode }) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n disabled={disabled}\n title={title}\n className={cn(\n \"flex items-center justify-center w-7 h-7 rounded-[var(--ds-radius-sm)] transition-colors cursor-pointer\",\n \"focus-visible:outline-none focus-visible:shadow-[var(--ds-shadow-focus)]\",\n active\n ? \"bg-[var(--ds-accent-primary)] text-[var(--ds-text-on-primary)]\"\n : \"text-[var(--ds-text-secondary)] hover:bg-[var(--ds-bg-surface)] hover:text-[var(--ds-text-primary)]\",\n disabled && \"opacity-disabled pointer-events-none\",\n )}\n >\n {children}\n </button>\n );\n}\n\n"]}
package/dist/index.d.ts CHANGED
@@ -1060,6 +1060,10 @@ interface AvatarGroupItem {
1060
1060
  initials?: string;
1061
1061
  src?: string;
1062
1062
  alt?: string;
1063
+ /**
1064
+ * @deprecated Ignored: a group draws no status (the owner, 30 September 2026: dots on overlapping avatars read as
1065
+ * broken). Show someone's status with a single Avatar.
1066
+ */
1063
1067
  status?: AvatarStatus;
1064
1068
  color?: AvatarColor;
1065
1069
  }
@@ -1077,7 +1081,8 @@ interface AvatarGroupProps {
1077
1081
  /**
1078
1082
  * Overlapping row of avatars with a "+N" counter for the rest. Use for
1079
1083
  * members, assignees, participants — anywhere several people share one
1080
- * slot. Do not hand-roll this with -space-x and ring classes.
1084
+ * slot. Do not hand-roll this with -space-x and ring classes. A group shows
1085
+ * no status; a single Avatar does.
1081
1086
  */
1082
1087
  declare function AvatarGroup({ items, max, size, ring, onOverflowClick, className }: AvatarGroupProps): react_jsx_runtime.JSX.Element;
1083
1088
 
@@ -2490,6 +2495,11 @@ interface PageHeaderProps {
2490
2495
  onBack?: () => void;
2491
2496
  actions?: ReactNode;
2492
2497
  avatar?: ReactNode;
2498
+ /**
2499
+ * Controls that filter the page (Dropdown, DatePicker, SegmentedControl, Input), in one row at the small size; a text
2500
+ * field takes a search field's width, not a line of its own. On a bold colourful header the row sits on a strip drawn
2501
+ * as the cards are, that hugs its controls, as the tab row does.
2502
+ */
2493
2503
  filters?: ReactNode;
2494
2504
  bannerImage?: string;
2495
2505
  as?: HeadingLevel;
@@ -2611,12 +2621,12 @@ interface NavMenuProps {
2611
2621
  items: NavMenuItem[];
2612
2622
  /** Whether any child route is currently active (highlights the trigger) */
2613
2623
  active?: boolean;
2614
- /** Matches the parent Navbar type for consistent styling (`default` is the deprecated name for `tint`) */
2624
+ /** The navbar's style; by default the one the Navbar gives its items (`default` is the deprecated name for `tint`) */
2615
2625
  type?: NavbarType;
2616
2626
  onItemClick?: (item: NavMenuItem) => void;
2617
2627
  className?: string;
2618
2628
  }
2619
- declare function NavMenu({ label, items, active, type, onItemClick, className, }: NavMenuProps): react_jsx_runtime.JSX.Element;
2629
+ declare function NavMenu({ label, items, active, type: typeProp, onItemClick, className, }: NavMenuProps): react_jsx_runtime.JSX.Element;
2620
2630
 
2621
2631
  /** Mirrors NavbarType. `default` is the deprecated pre-20.8 name for `tint`. */
2622
2632
  type MobileHeaderMenuType = "tint" | "underline" | "minimal" | "pill" | "default";
@@ -2667,6 +2677,7 @@ interface DrawerProps {
2667
2677
  open: boolean;
2668
2678
  onClose: () => void;
2669
2679
  position?: "left" | "right" | "bottom";
2680
+ /** Pass none: the Drawer takes the app's width, which the shell carries (AppShell's drawerWidth, 520 px by default; 400 px outside a shell). For a deliberate wide or narrow drawer only. A non-modal side panel (modal={false}, such as the shell's assistant) keeps the width it is given. */
2670
2681
  width?: string;
2671
2682
  title?: ReactNode;
2672
2683
  children: ReactNode;
@@ -2691,7 +2702,8 @@ interface DrawerProps {
2691
2702
  * Default true. false makes the drawer a persistent, non-modal panel the user works alongside
2692
2703
  * (an assistant, help): no backdrop, no scroll lock, no focus trap — the page stays operable.
2693
2704
  * It closes only on Escape while focus is inside it, its close control, or onClose from the
2694
- * consumer; an outside click does nothing. At phone width the Sheet is always modal.
2705
+ * consumer; an outside click does nothing. At phone width the sheet it becomes is modal: a backdrop, the focus trap,
2706
+ * the scroll lock and Escape from anywhere, and focus moves in if the window narrows while it is open.
2695
2707
  */
2696
2708
  modal?: boolean;
2697
2709
  /**
@@ -2809,8 +2821,6 @@ interface SheetProps {
2809
2821
  title?: ReactNode;
2810
2822
  children: ReactNode;
2811
2823
  footer?: ReactNode;
2812
- /** A strip between the content and the footer (the Drawer's unsaved-changes question). */
2813
- confirm?: ReactNode;
2814
2824
  /**
2815
2825
  * The content has unsaved changes: every close path — Escape, the backdrop, dragging it down, the close control and a
2816
2826
  * FormWrapper's Cancel — asks before discarding them, inside the sheet, as a Drawer and a Dialog do (the review of
@@ -2832,7 +2842,11 @@ interface SheetProps {
2832
2842
  /** id of the element that names the dialog when no title is rendered. */
2833
2843
  labelledBy?: string;
2834
2844
  }
2835
- declare function Sheet({ open, onClose: onCloseProp, title, children, footer, confirm, dirty, onDiscard, snapPoints, container, flush, keepMounted, id, labelledBy }: SheetProps): react.ReactPortal | null;
2845
+ /**
2846
+ * A bottom sheet with snap heights. It is the Drawer's phone form, drawn by the same panel (Sprint 25.14 A50), so a
2847
+ * sheet and a drawer share their inset, their drag and their focus handling.
2848
+ */
2849
+ declare function Sheet({ open, onClose: onCloseProp, title, children, footer, dirty, onDiscard, snapPoints, container, flush, keepMounted, id, labelledBy }: SheetProps): react_jsx_runtime.JSX.Element;
2836
2850
 
2837
2851
  interface Notification {
2838
2852
  id: string;
@@ -3119,6 +3133,8 @@ interface AppShellContextValue {
3119
3133
  hasUnsavedChanges: boolean;
3120
3134
  /** Set by useUnsavedChanges; not for pages to call. Returns the release. */
3121
3135
  addUnsavedChanges: () => () => void;
3136
+ /** The width every Drawer in the app takes when it is given none (Sprint 25.14 A24): AppShell's drawerWidth, 520 px by default. */
3137
+ drawerWidth: string;
3122
3138
  }
3123
3139
  /**
3124
3140
  * Focus mode (Sprint 25.7, C1): a task flow the user completes before or outside the app — setup, onboarding,
@@ -3181,6 +3197,11 @@ interface AppShellProps {
3181
3197
  theme?: AppShellTheme;
3182
3198
  /** The customer's UX preferences, passed once by the generated shell so pages and components carry nothing (Sprint 25.6). */
3183
3199
  preferences?: AppShellPreferences;
3200
+ /**
3201
+ * The width of every Drawer in the app that is given none (Sprint 25.14 A24): pages pass no width, so the app's
3202
+ * drawers share one. Default "520px". A Drawer's own width prop still wins, for a deliberate wide or narrow one.
3203
+ */
3204
+ drawerWidth?: string;
3184
3205
  /** The current route's path, so the shell knows which page is home. */
3185
3206
  currentPath?: string;
3186
3207
  /** The home page's path. Default "/". */