twico-ui 1.22.0 → 1.22.1

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,14 @@
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.1](https://github.com/EncryptionL/twico-ui/compare/v1.22.0...v1.22.1) (2026-07-29)
6
+
7
+
8
+ ### Bug Fixes
9
+
10
+ * **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)
11
+ * **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)
12
+
5
13
  # [1.22.0](https://github.com/EncryptionL/twico-ui/compare/v1.21.1...v1.22.0) (2026-07-29)
6
14
 
7
15
 
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;
@@ -12606,9 +12637,16 @@ function DatePicker({
12606
12637
  const onMove = () => place();
12607
12638
  window.addEventListener("scroll", onMove, true);
12608
12639
  window.addEventListener("resize", onMove);
12640
+ let ro;
12641
+ const rt = triggerRef.current;
12642
+ if (rt && typeof ResizeObserver !== "undefined") {
12643
+ ro = new ResizeObserver(onMove);
12644
+ ro.observe(rt);
12645
+ }
12609
12646
  return () => {
12610
12647
  window.removeEventListener("scroll", onMove, true);
12611
12648
  window.removeEventListener("resize", onMove);
12649
+ ro?.disconnect();
12612
12650
  };
12613
12651
  }, [open, place]);
12614
12652
  React51__namespace.default.useEffect(() => {
@@ -13150,9 +13188,16 @@ function DateRangePicker({
13150
13188
  const onMove = () => place();
13151
13189
  window.addEventListener("scroll", onMove, true);
13152
13190
  window.addEventListener("resize", onMove);
13191
+ let ro;
13192
+ const rt = triggerRef.current;
13193
+ if (rt && typeof ResizeObserver !== "undefined") {
13194
+ ro = new ResizeObserver(onMove);
13195
+ ro.observe(rt);
13196
+ }
13153
13197
  return () => {
13154
13198
  window.removeEventListener("scroll", onMove, true);
13155
13199
  window.removeEventListener("resize", onMove);
13200
+ ro?.disconnect();
13156
13201
  };
13157
13202
  }, [open, place]);
13158
13203
  React51__namespace.default.useEffect(() => {
@@ -13703,9 +13748,16 @@ function TimePicker({
13703
13748
  const onMove = () => place();
13704
13749
  window.addEventListener("scroll", onMove, true);
13705
13750
  window.addEventListener("resize", onMove);
13751
+ let ro;
13752
+ const rt = triggerRef.current;
13753
+ if (rt && typeof ResizeObserver !== "undefined") {
13754
+ ro = new ResizeObserver(onMove);
13755
+ ro.observe(rt);
13756
+ }
13706
13757
  return () => {
13707
13758
  window.removeEventListener("scroll", onMove, true);
13708
13759
  window.removeEventListener("resize", onMove);
13760
+ ro?.disconnect();
13709
13761
  };
13710
13762
  }, [open, place]);
13711
13763
  React51__namespace.default.useEffect(() => {