chat-layout 1.2.0-3 → 1.2.0-4

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/example/chat.ts CHANGED
@@ -253,6 +253,13 @@ class ItemDetector extends Wrapper<C> {
253
253
  list.update(this.item, nextItem, {
254
254
  duration: REPLACE_ANIMATION_DURATION,
255
255
  });
256
+ } else if (test.type === "auxclick") {
257
+ if (!list.items.includes(this.item)) {
258
+ return true;
259
+ }
260
+ list.delete(this.item, {
261
+ duration: REPLACE_ANIMATION_DURATION,
262
+ });
256
263
  }
257
264
  return true;
258
265
  }
@@ -555,6 +562,19 @@ canvas.addEventListener("click", (e) => {
555
562
  }
556
563
  });
557
564
 
565
+ canvas.addEventListener("contextmenu", (e) => {
566
+ e.preventDefault();
567
+ const { top, left } = canvas.getBoundingClientRect();
568
+ const result = renderer.hittest({
569
+ x: e.clientX - left,
570
+ y: e.clientY - top,
571
+ type: "auxclick",
572
+ });
573
+ if (!result) {
574
+ currentHover = undefined;
575
+ }
576
+ });
577
+
558
578
  function randomEnglishText(words: number): string {
559
579
  const out: string[] = [];
560
580
  for (let i = 0; i < words; i += 1) {
package/index.d.mts CHANGED
@@ -513,6 +513,10 @@ interface UpdateListItemAnimationOptions {
513
513
  /** Animation duration in milliseconds. */
514
514
  duration?: number;
515
515
  }
516
+ interface DeleteListItemAnimationOptions {
517
+ /** Animation duration in milliseconds. */
518
+ duration?: number;
519
+ }
516
520
  declare class ListState<T extends {}> {
517
521
  #private;
518
522
  /** Pixel offset from the anchored item edge. */
@@ -539,6 +543,14 @@ declare class ListState<T extends {}> {
539
543
  * Updates an existing item by object identity.
540
544
  */
541
545
  update(targetItem: T, nextItem: T, animation?: UpdateListItemAnimationOptions): void;
546
+ /**
547
+ * Starts deleting an existing item by object identity.
548
+ */
549
+ delete(item: T, animation?: DeleteListItemAnimationOptions): void;
550
+ /**
551
+ * Finalizes a pending delete by removing the item from the list.
552
+ */
553
+ finalizeDelete(item: T): void;
542
554
  /**
543
555
  * Sets the current anchor item and pixel offset.
544
556
  */
@@ -570,6 +582,13 @@ declare function memoRenderItemBy<C extends CanvasRenderingContext2D, T, K>(keyO
570
582
  resetKey: (key: K) => boolean;
571
583
  };
572
584
  //#endregion
585
+ //#region src/renderer/virtualized/base-types.d.ts
586
+ /** Per-item draw/hittest callbacks produced by the resolver. */
587
+ type VirtualizedResolvedItem = {
588
+ draw: (y: number) => boolean;
589
+ hittest: (test: HitTest, y: number) => boolean;
590
+ };
591
+ //#endregion
573
592
  //#region src/renderer/virtualized/solver.d.ts
574
593
  interface VisibleListState {
575
594
  position?: number;
@@ -589,6 +608,10 @@ interface VisibleWindow<T> {
589
608
  drawList: VisibleWindowEntry<T>[];
590
609
  shift: number;
591
610
  }
611
+ interface VisibleWindowResult<T> {
612
+ normalizedState: NormalizedListState;
613
+ window: VisibleWindow<T>;
614
+ }
592
615
  //#endregion
593
616
  //#region src/renderer/virtualized/base.d.ts
594
617
  /**
@@ -604,10 +627,6 @@ interface JumpToOptions {
604
627
  /** Called after the jump completes or finishes animating. */
605
628
  onComplete?: () => void;
606
629
  }
607
- type VirtualizedResolvedItem<C extends CanvasRenderingContext2D> = {
608
- draw: (y: number) => boolean;
609
- hittest: (test: HitTest, y: number) => boolean;
610
- };
611
630
  /**
612
631
  * Shared base class for virtualized list renderers.
613
632
  */
@@ -636,9 +655,9 @@ declare abstract class VirtualizedRenderer<C extends CanvasRenderingContext2D, T
636
655
  /** Replaces the current item collection. */
637
656
  set items(value: T[]);
638
657
  /** Renders the current visible window. */
639
- abstract render(feedback?: RenderFeedback): boolean;
658
+ render(feedback?: RenderFeedback): boolean;
640
659
  /** Hit-tests the current visible window. */
641
- abstract hittest(test: {
660
+ hittest(test: {
642
661
  x: number;
643
662
  y: number;
644
663
  type: "click" | "auxclick" | "hover";
@@ -651,19 +670,26 @@ declare abstract class VirtualizedRenderer<C extends CanvasRenderingContext2D, T
651
670
  jumpTo(index: number, options?: JumpToOptions): void;
652
671
  protected _resetRenderFeedback(feedback?: RenderFeedback): void;
653
672
  protected _accumulateRenderFeedback(feedback: RenderFeedback, idx: number, top: number, height: number): void;
654
- protected _renderDrawList(list: VisibleWindow<VirtualizedResolvedItem<C>>["drawList"], shift: number, feedback?: RenderFeedback): boolean;
655
- protected _renderVisibleWindow(window: VisibleWindow<VirtualizedResolvedItem<C>>, feedback?: RenderFeedback): boolean;
656
- protected _hittestVisibleWindow(window: VisibleWindow<VirtualizedResolvedItem<C>>, test: HitTest): boolean;
657
- protected _prepareRender(): boolean;
673
+ protected _renderDrawList(list: VisibleWindow<VirtualizedResolvedItem>["drawList"], shift: number, feedback?: RenderFeedback): boolean;
674
+ protected _renderVisibleWindow(window: VisibleWindow<VirtualizedResolvedItem>, feedback?: RenderFeedback): boolean;
675
+ protected _readVisibleRange(top: number, height: number): {
676
+ top: number;
677
+ bottom: number;
678
+ } | undefined;
679
+ protected _pruneReplacementAnimations(_window: VisibleWindow<unknown>): boolean;
680
+ protected _hittestVisibleWindow(window: VisibleWindow<VirtualizedResolvedItem>, test: HitTest): boolean;
681
+ protected _captureVisibleItemSnapshot(window: VisibleWindow<unknown>): void;
682
+ protected _prepareRender(now: number): boolean;
658
683
  protected _finishRender(requestRedraw: boolean): boolean;
659
684
  protected _clampItemIndex(index: number): number;
660
685
  protected _getItemHeight(index: number): number;
661
686
  protected _resolveItem(item: T, _index: number, now: number): {
662
- value: VirtualizedResolvedItem<C>;
687
+ value: VirtualizedResolvedItem;
663
688
  height: number;
664
689
  };
665
690
  protected _getAnchorAtOffset(index: number, offset: number): number;
666
691
  protected abstract _normalizeListState(state: VisibleListState): NormalizedListState;
692
+ protected abstract _resolveVisibleWindow(now: number): VisibleWindowResult<VirtualizedResolvedItem>;
667
693
  protected abstract _readAnchor(state: NormalizedListState): number;
668
694
  protected abstract _applyAnchor(anchor: number): void;
669
695
  protected abstract _getDefaultJumpBlock(): NonNullable<JumpToOptions["block"]>;
@@ -676,15 +702,13 @@ declare abstract class VirtualizedRenderer<C extends CanvasRenderingContext2D, T
676
702
  * Virtualized renderer anchored to the bottom, suitable for chat-style UIs.
677
703
  */
678
704
  declare class ChatRenderer<C extends CanvasRenderingContext2D, T extends {}> extends VirtualizedRenderer<C, T> {
679
- #private;
705
+ protected _resolveVisibleWindow(now: number): VisibleWindowResult<VirtualizedResolvedItem>;
680
706
  protected _getDefaultJumpBlock(): NonNullable<JumpToOptions["block"]>;
681
707
  protected _normalizeListState(state: VisibleListState): NormalizedListState;
682
708
  protected _readAnchor(state: NormalizedListState): number;
683
709
  protected _applyAnchor(anchor: number): void;
684
710
  protected _getTargetAnchor(index: number, block: NonNullable<JumpToOptions["block"]>): number;
685
711
  protected _getAnimatedLayerOffset(slotHeight: number, nodeHeight: number): number;
686
- render(feedback?: RenderFeedback): boolean;
687
- hittest(test: HitTest): boolean;
688
712
  }
689
713
  //#endregion
690
714
  //#region src/renderer/virtualized/timeline.d.ts
@@ -692,16 +716,14 @@ declare class ChatRenderer<C extends CanvasRenderingContext2D, T extends {}> ext
692
716
  * Virtualized renderer anchored to the top, suitable for timeline-style UIs.
693
717
  */
694
718
  declare class TimelineRenderer<C extends CanvasRenderingContext2D, T extends {}> extends VirtualizedRenderer<C, T> {
695
- #private;
719
+ protected _resolveVisibleWindow(now: number): VisibleWindowResult<VirtualizedResolvedItem>;
696
720
  protected _getDefaultJumpBlock(): NonNullable<JumpToOptions["block"]>;
697
721
  protected _normalizeListState(state: VisibleListState): NormalizedListState;
698
722
  protected _readAnchor(state: NormalizedListState): number;
699
723
  protected _applyAnchor(anchor: number): void;
700
724
  protected _getTargetAnchor(index: number, block: NonNullable<JumpToOptions["block"]>): number;
701
725
  protected _getAnimatedLayerOffset(_slotHeight: number, _nodeHeight: number): number;
702
- render(feedback?: RenderFeedback): boolean;
703
- hittest(test: HitTest): boolean;
704
726
  }
705
727
  //#endregion
706
- export { Axis, BaseRenderer, Box, ChatRenderer, ChildLayoutResult, Context, CrossAxisAlignment, DebugRenderer, DynValue, Fixed, Flex, FlexContainerOptions, FlexItem, FlexItemOptions, FlexLayoutResult, Group, HitTest, InlineSpan, JumpToOptions, LayoutConstraints, LayoutRect, ListState, MainAxisAlignment, MainAxisSize, MultilineText, MultilineTextOptions, Node, PaddingBox, PhysicalTextAlign, Place, RenderFeedback, RendererOptions, ShrinkWrap, Text, TextAlign, TextEllipsisPosition, TextJustifyMode, TextJustifyOptions, TextOptions, TextOverflowMode, TextOverflowWrapMode, TextStyleOptions, TextWhiteSpaceMode, TextWordBreakMode, TimelineRenderer, UpdateListItemAnimationOptions, VirtualizedRenderer, Wrapper, memoRenderItem, memoRenderItemBy };
728
+ export { Axis, BaseRenderer, Box, ChatRenderer, ChildLayoutResult, Context, CrossAxisAlignment, DebugRenderer, DeleteListItemAnimationOptions, DynValue, Fixed, Flex, FlexContainerOptions, FlexItem, FlexItemOptions, FlexLayoutResult, Group, HitTest, InlineSpan, JumpToOptions, LayoutConstraints, LayoutRect, ListState, MainAxisAlignment, MainAxisSize, MultilineText, MultilineTextOptions, Node, PaddingBox, PhysicalTextAlign, Place, RenderFeedback, RendererOptions, ShrinkWrap, Text, TextAlign, TextEllipsisPosition, TextJustifyMode, TextJustifyOptions, TextOptions, TextOverflowMode, TextOverflowWrapMode, TextStyleOptions, TextWhiteSpaceMode, TextWordBreakMode, TimelineRenderer, UpdateListItemAnimationOptions, VirtualizedRenderer, Wrapper, memoRenderItem, memoRenderItemBy };
707
729
  //# sourceMappingURL=index.d.mts.map