twico-ui 1.22.0 → 1.22.2

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/CHANGELOG.md CHANGED
@@ -2,6 +2,21 @@
2
2
 
3
3
  All notable changes to Twico UI are documented here (newest first). This file is generated automatically on each release by [semantic-release](https://semantic-release.gitbook.io/) from [Conventional Commits](https://www.conventionalcommits.org/) — do not edit it by hand. The same notes appear on each [GitHub Release](https://github.com/EncryptionL/twico-ui/releases).
4
4
 
5
+ ## [1.22.2](https://github.com/EncryptionL/twico-ui/compare/v1.22.1...v1.22.2) (2026-07-29)
6
+
7
+
8
+ ### Bug Fixes
9
+
10
+ * **datatable:** reset optimistic rowReorder overlay when rows change in server mode ([#296](https://github.com/EncryptionL/twico-ui/issues/296)) ([600cb16](https://github.com/EncryptionL/twico-ui/commit/600cb16099faf0f5498c11430773d8375dc593ac))
11
+
12
+ ## [1.22.1](https://github.com/EncryptionL/twico-ui/compare/v1.22.0...v1.22.1) (2026-07-29)
13
+
14
+
15
+ ### Bug Fixes
16
+
17
+ * **datatable:** keep the Filters popover position:fixed (regression from [#292](https://github.com/EncryptionL/twico-ui/issues/292)) ([0d53d05](https://github.com/EncryptionL/twico-ui/commit/0d53d057e861f5327af7b43730b3f143a937205e)), closes [#294](https://github.com/EncryptionL/twico-ui/issues/294)
18
+ * **inputs:** portaled dropdown menu re-tracks its trigger's resize ([b6e6843](https://github.com/EncryptionL/twico-ui/commit/b6e6843f2345f60db0719f7e12bef504393e3189)), closes [#292](https://github.com/EncryptionL/twico-ui/issues/292)
19
+
5
20
  # [1.22.0](https://github.com/EncryptionL/twico-ui/compare/v1.21.1...v1.22.0) (2026-07-29)
6
21
 
7
22
 
package/dist/index.cjs CHANGED
@@ -5345,9 +5345,16 @@ function ColorPicker({
5345
5345
  const onMove = () => place();
5346
5346
  window.addEventListener("scroll", onMove, true);
5347
5347
  window.addEventListener("resize", onMove);
5348
+ let ro;
5349
+ const rt = triggerRef.current;
5350
+ if (rt && typeof ResizeObserver !== "undefined") {
5351
+ ro = new ResizeObserver(onMove);
5352
+ ro.observe(rt);
5353
+ }
5348
5354
  return () => {
5349
5355
  window.removeEventListener("scroll", onMove, true);
5350
5356
  window.removeEventListener("resize", onMove);
5357
+ ro?.disconnect();
5351
5358
  };
5352
5359
  }, [open, place]);
5353
5360
  const labelId = React51__namespace.default.useId();
@@ -5807,9 +5814,16 @@ function Combobox({
5807
5814
  const onMove = () => place();
5808
5815
  window.addEventListener("scroll", onMove, true);
5809
5816
  window.addEventListener("resize", onMove);
5817
+ let ro;
5818
+ const rt = controlRef.current;
5819
+ if (rt && typeof ResizeObserver !== "undefined") {
5820
+ ro = new ResizeObserver(onMove);
5821
+ ro.observe(rt);
5822
+ }
5810
5823
  return () => {
5811
5824
  window.removeEventListener("scroll", onMove, true);
5812
5825
  window.removeEventListener("resize", onMove);
5826
+ ro?.disconnect();
5813
5827
  };
5814
5828
  }, [open, portal, place]);
5815
5829
  React51__namespace.default.useEffect(() => {
@@ -6634,9 +6648,16 @@ function Select({
6634
6648
  const onMove = () => place();
6635
6649
  window.addEventListener("scroll", onMove, true);
6636
6650
  window.addEventListener("resize", onMove);
6651
+ let ro;
6652
+ const rt = triggerRef.current;
6653
+ if (rt && typeof ResizeObserver !== "undefined") {
6654
+ ro = new ResizeObserver(onMove);
6655
+ ro.observe(rt);
6656
+ }
6637
6657
  return () => {
6638
6658
  window.removeEventListener("scroll", onMove, true);
6639
6659
  window.removeEventListener("resize", onMove);
6660
+ ro?.disconnect();
6640
6661
  };
6641
6662
  }, [open, portal, place]);
6642
6663
  React51__namespace.default.useEffect(() => {
@@ -7463,9 +7484,16 @@ function MultiSelect({
7463
7484
  const onMove = () => place();
7464
7485
  window.addEventListener("scroll", onMove, true);
7465
7486
  window.addEventListener("resize", onMove);
7487
+ let ro;
7488
+ const rt = controlRef.current;
7489
+ if (rt && typeof ResizeObserver !== "undefined") {
7490
+ ro = new ResizeObserver(onMove);
7491
+ ro.observe(rt);
7492
+ }
7466
7493
  return () => {
7467
7494
  window.removeEventListener("scroll", onMove, true);
7468
7495
  window.removeEventListener("resize", onMove);
7496
+ ro?.disconnect();
7469
7497
  };
7470
7498
  }, [open, portal, place]);
7471
7499
  React51__namespace.default.useEffect(() => {
@@ -8529,7 +8557,10 @@ th.twc-dt__rownum .twc-dt__th-inner { padding-inline: 8px; gap: 2px; justify-con
8529
8557
  cascade \u2014 user drag (-usr) > #289 measured auto-fit (-fit) > 118px fallback \u2014 entirely in clamp(), so
8530
8558
  neither writer reads the other (reset = remove the -usr var and auto-fit instantly re-wins). */
8531
8559
  .twc-dt__filters {
8532
- position: relative;
8560
+ /* #294: do NOT set 'position' here \u2014 this element also carries .twc-dt__pop (position: fixed), and an
8561
+ equal-specificity 'position: relative' defined later would clobber it, dropping the popover into normal
8562
+ flow below the table. The panel stays position: fixed, which already anchors the absolutely-positioned
8563
+ .twc-dt__pop-grip; per-field handles anchor to their own position: relative .twc-dt__f-* fields. */
8533
8564
  width: var(--twc-dt-panel-w, 580px); max-width: calc(100vw - 32px);
8534
8565
  height: var(--twc-dt-panel-h, auto); max-height: calc(100vh - 32px);
8535
8566
  display: flex; flex-direction: column;
@@ -9268,6 +9299,9 @@ function Datatable({
9268
9299
  const [headH, setHeadH] = React51__namespace.default.useState(41);
9269
9300
  const theadRef = React51__namespace.default.useRef(null);
9270
9301
  const [rowOrder, setRowOrder] = React51__namespace.default.useState(null);
9302
+ React51__namespace.default.useEffect(() => {
9303
+ if (serverMode) setRowOrder(null);
9304
+ }, [rows, serverMode]);
9271
9305
  const [rowHeights, setRowHeights] = React51__namespace.default.useState({});
9272
9306
  const [rowDrag, setRowDrag] = React51__namespace.default.useState({ from: null, over: null, after: false });
9273
9307
  const [rowGrab, setRowGrab] = React51__namespace.default.useState(null);
@@ -12606,9 +12640,16 @@ function DatePicker({
12606
12640
  const onMove = () => place();
12607
12641
  window.addEventListener("scroll", onMove, true);
12608
12642
  window.addEventListener("resize", onMove);
12643
+ let ro;
12644
+ const rt = triggerRef.current;
12645
+ if (rt && typeof ResizeObserver !== "undefined") {
12646
+ ro = new ResizeObserver(onMove);
12647
+ ro.observe(rt);
12648
+ }
12609
12649
  return () => {
12610
12650
  window.removeEventListener("scroll", onMove, true);
12611
12651
  window.removeEventListener("resize", onMove);
12652
+ ro?.disconnect();
12612
12653
  };
12613
12654
  }, [open, place]);
12614
12655
  React51__namespace.default.useEffect(() => {
@@ -13150,9 +13191,16 @@ function DateRangePicker({
13150
13191
  const onMove = () => place();
13151
13192
  window.addEventListener("scroll", onMove, true);
13152
13193
  window.addEventListener("resize", onMove);
13194
+ let ro;
13195
+ const rt = triggerRef.current;
13196
+ if (rt && typeof ResizeObserver !== "undefined") {
13197
+ ro = new ResizeObserver(onMove);
13198
+ ro.observe(rt);
13199
+ }
13153
13200
  return () => {
13154
13201
  window.removeEventListener("scroll", onMove, true);
13155
13202
  window.removeEventListener("resize", onMove);
13203
+ ro?.disconnect();
13156
13204
  };
13157
13205
  }, [open, place]);
13158
13206
  React51__namespace.default.useEffect(() => {
@@ -13703,9 +13751,16 @@ function TimePicker({
13703
13751
  const onMove = () => place();
13704
13752
  window.addEventListener("scroll", onMove, true);
13705
13753
  window.addEventListener("resize", onMove);
13754
+ let ro;
13755
+ const rt = triggerRef.current;
13756
+ if (rt && typeof ResizeObserver !== "undefined") {
13757
+ ro = new ResizeObserver(onMove);
13758
+ ro.observe(rt);
13759
+ }
13706
13760
  return () => {
13707
13761
  window.removeEventListener("scroll", onMove, true);
13708
13762
  window.removeEventListener("resize", onMove);
13763
+ ro?.disconnect();
13709
13764
  };
13710
13765
  }, [open, place]);
13711
13766
  React51__namespace.default.useEffect(() => {