@tcn/ui 0.12.2 → 0.12.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.
Files changed (165) hide show
  1. package/dist/actions/index.d.ts +0 -2
  2. package/dist/actions/index.d.ts.map +1 -1
  3. package/dist/actions/index.js +6 -10
  4. package/dist/actions/index.js.map +1 -1
  5. package/dist/group.css +1 -0
  6. package/dist/inputs/color_input/color_input.js +2 -4
  7. package/dist/inputs/color_input/color_input.js.map +1 -1
  8. package/dist/inputs/date_picker/date_picker_header.js +20 -22
  9. package/dist/inputs/date_picker/date_picker_header.js.map +1 -1
  10. package/dist/inputs/date_picker/date_picker_input.js +2 -4
  11. package/dist/inputs/date_picker/date_picker_input.js.map +1 -1
  12. package/dist/inputs/date_picker/date_picker_time_selector.js +9 -11
  13. package/dist/inputs/date_picker/date_picker_time_selector.js.map +1 -1
  14. package/dist/inputs/date_picker/date_picker_year_input.js +5 -7
  15. package/dist/inputs/date_picker/date_picker_year_input.js.map +1 -1
  16. package/dist/inputs/date_picker/date_picker_year_selector.js +2 -4
  17. package/dist/inputs/date_picker/date_picker_year_selector.js.map +1 -1
  18. package/dist/inputs/index.d.ts +2 -0
  19. package/dist/inputs/index.d.ts.map +1 -1
  20. package/dist/inputs/index.js +24 -20
  21. package/dist/inputs/index.js.map +1 -1
  22. package/dist/inputs/multiselect/multiselect_inline_values.js +7 -9
  23. package/dist/inputs/multiselect/multiselect_inline_values.js.map +1 -1
  24. package/dist/inputs/multiselect/multiselect_values.js +2 -4
  25. package/dist/inputs/multiselect/multiselect_values.js.map +1 -1
  26. package/dist/inputs/phone_number_input/phone_number_input_adapter.js +2 -4
  27. package/dist/inputs/phone_number_input/phone_number_input_adapter.js.map +1 -1
  28. package/dist/inputs/phone_number_input/sip_input.js +13 -15
  29. package/dist/inputs/phone_number_input/sip_input.js.map +1 -1
  30. package/dist/inputs/select/select.js +2 -4
  31. package/dist/inputs/select/select.js.map +1 -1
  32. package/dist/{actions/button → inputs}/select_group/select_group.d.ts +1 -1
  33. package/dist/inputs/select_group/select_group.d.ts.map +1 -0
  34. package/dist/{actions/button → inputs}/select_group/select_group.js +3 -3
  35. package/dist/inputs/select_group/select_group.js.map +1 -0
  36. package/dist/inputs/select_group/single_select_group.d.ts.map +1 -0
  37. package/dist/inputs/select_group/single_select_group.js.map +1 -0
  38. package/dist/inputs/suggestions/suggestion_list.js +2 -4
  39. package/dist/inputs/suggestions/suggestion_list.js.map +1 -1
  40. package/dist/layouts/group/group.d.ts +5 -0
  41. package/dist/layouts/group/group.d.ts.map +1 -0
  42. package/dist/layouts/group/group.js +26 -0
  43. package/dist/layouts/group/group.js.map +1 -0
  44. package/dist/layouts/index.d.ts +2 -0
  45. package/dist/layouts/index.d.ts.map +1 -1
  46. package/dist/layouts/index.js +36 -32
  47. package/dist/layouts/index.js.map +1 -1
  48. package/dist/overlay/popper/base/dismissal_decorator.js +6 -6
  49. package/dist/overlay/popper/base/dismissal_decorator.js.map +1 -1
  50. package/dist/overlay/popper/context_popper.d.ts.map +1 -1
  51. package/dist/overlay/popper/context_popper.js +34 -26
  52. package/dist/overlay/popper/context_popper.js.map +1 -1
  53. package/dist/overlay/popper/element_popper.d.ts.map +1 -1
  54. package/dist/overlay/popper/element_popper.js +43 -25
  55. package/dist/overlay/popper/element_popper.js.map +1 -1
  56. package/dist/overlay/tethered/hooks/use_ref_dimensions.d.ts +3 -0
  57. package/dist/overlay/tethered/hooks/use_ref_dimensions.d.ts.map +1 -0
  58. package/dist/overlay/tethered/hooks/use_ref_dimensions.js +26 -0
  59. package/dist/overlay/tethered/hooks/use_ref_dimensions.js.map +1 -0
  60. package/dist/overlay/tethered/hooks/{useTether.d.ts → use_tether.d.ts} +7 -4
  61. package/dist/overlay/tethered/hooks/use_tether.d.ts.map +1 -0
  62. package/dist/overlay/tethered/hooks/{useTether.js → use_tether.js} +19 -15
  63. package/dist/overlay/tethered/hooks/use_tether.js.map +1 -0
  64. package/dist/overlay/tethered/hooks/use_tether_origin.d.ts +10 -0
  65. package/dist/overlay/tethered/hooks/use_tether_origin.d.ts.map +1 -0
  66. package/dist/overlay/tethered/hooks/use_tether_origin.js +22 -0
  67. package/dist/overlay/tethered/hooks/use_tether_origin.js.map +1 -0
  68. package/dist/overlay/tethered/hooks/{calculate_origin.d.ts → utils/calculate_origin.d.ts} +4 -10
  69. package/dist/overlay/tethered/hooks/utils/calculate_origin.d.ts.map +1 -0
  70. package/dist/overlay/tethered/hooks/utils/calculate_origin.js +41 -0
  71. package/dist/overlay/tethered/hooks/utils/calculate_origin.js.map +1 -0
  72. package/dist/overlay/tethered/hooks/{calculate_position.d.ts → utils/calculate_position.d.ts} +2 -2
  73. package/dist/overlay/tethered/hooks/utils/calculate_position.d.ts.map +1 -0
  74. package/dist/overlay/tethered/hooks/utils/calculate_position.js.map +1 -0
  75. package/dist/overlay/tethered/tethered.d.ts.map +1 -1
  76. package/dist/overlay/tethered/tethered.js +63 -62
  77. package/dist/overlay/tethered/tethered.js.map +1 -1
  78. package/dist/select_group.css +1 -1
  79. package/dist/surfaces/alert/alert.d.ts +0 -2
  80. package/dist/surfaces/alert/alert.d.ts.map +1 -1
  81. package/dist/surfaces/alert/alert.js +5 -7
  82. package/dist/surfaces/alert/alert.js.map +1 -1
  83. package/dist/surfaces/confirm/confirm.d.ts +3 -3
  84. package/dist/surfaces/confirm/confirm.d.ts.map +1 -1
  85. package/dist/surfaces/confirm/confirm.js +46 -45
  86. package/dist/surfaces/confirm/confirm.js.map +1 -1
  87. package/dist/surfaces/pop_confirm/pop_confirm.js +11 -9
  88. package/dist/surfaces/pop_confirm/pop_confirm.js.map +1 -1
  89. package/dist/surfaces/tooltip/tooltip.d.ts.map +1 -1
  90. package/dist/surfaces/tooltip/tooltip.js +27 -28
  91. package/dist/surfaces/tooltip/tooltip.js.map +1 -1
  92. package/dist/themes/stories/button_showcase.d.ts.map +1 -1
  93. package/dist/themes/stylesheets/reset.css +1 -1
  94. package/dist/themes/stylesheets/reset.js +3 -3
  95. package/dist/themes/stylesheets/reset.js.map +1 -1
  96. package/dist/themes/themes/ergo/ergo_theme.css +1 -1
  97. package/dist/themes/themes/ergo/ergo_theme.js +128 -12
  98. package/dist/themes/themes/ergo/ergo_theme.js.map +1 -1
  99. package/package.json +3 -2
  100. package/src/actions/index.ts +0 -8
  101. package/src/inputs/index.ts +9 -0
  102. package/src/{actions/button/__stories__ → inputs/select_group}/select_group.stories.tsx +5 -26
  103. package/src/{actions/button → inputs}/select_group/select_group.tsx +3 -3
  104. package/src/layouts/bar/bar.stories.tsx +61 -0
  105. package/src/layouts/group/group.module.css +8 -0
  106. package/src/layouts/group/group.tsx +23 -0
  107. package/src/layouts/index.ts +2 -0
  108. package/src/overlay/popper/__stories__/element_popper.stories.tsx +1 -1
  109. package/src/overlay/popper/base/dismissal_decorator.tsx +1 -1
  110. package/src/overlay/popper/context_popper.tsx +7 -3
  111. package/src/overlay/popper/element_popper.tsx +14 -4
  112. package/src/overlay/tethered/__stories__/shared/base_story_config.ts +1 -1
  113. package/src/overlay/tethered/hooks/use_ref_dimensions.ts +32 -0
  114. package/src/overlay/tethered/hooks/{useTether.ts → use_tether.ts} +7 -2
  115. package/src/overlay/tethered/hooks/use_tether_origin.ts +46 -0
  116. package/src/overlay/tethered/hooks/{calculate_origin.ts → utils/calculate_origin.ts} +12 -12
  117. package/src/overlay/tethered/hooks/{calculate_position.ts → utils/calculate_position.ts} +3 -3
  118. package/src/overlay/tethered/tethered.tsx +22 -26
  119. package/src/surfaces/alert/alert.tsx +0 -2
  120. package/src/surfaces/confirm/confirm.tsx +24 -9
  121. package/src/surfaces/pop_confirm/pop_confirm.stories.tsx +206 -6
  122. package/src/surfaces/pop_confirm/pop_confirm.tsx +1 -1
  123. package/src/surfaces/tooltip/__stories__/tooltip.stories.tsx +136 -0
  124. package/src/surfaces/tooltip/__stories__/tooltip_stories.module.css +14 -0
  125. package/src/surfaces/tooltip/tooltip.tsx +6 -2
  126. package/src/themes/stories/button_showcase.tsx +19 -51
  127. package/src/themes/stylesheets/reset.css +3 -3
  128. package/src/themes/themes/ergo/ergo_theme.css +128 -12
  129. package/dist/actions/button/select_group/select_group.d.ts.map +0 -1
  130. package/dist/actions/button/select_group/select_group.js.map +0 -1
  131. package/dist/actions/button/select_group/single_select_group.d.ts.map +0 -1
  132. package/dist/actions/button/select_group/single_select_group.js.map +0 -1
  133. package/dist/overlay/tethered/hooks/calculate_origin.d.ts.map +0 -1
  134. package/dist/overlay/tethered/hooks/calculate_origin.js +0 -41
  135. package/dist/overlay/tethered/hooks/calculate_origin.js.map +0 -1
  136. package/dist/overlay/tethered/hooks/calculate_position.d.ts.map +0 -1
  137. package/dist/overlay/tethered/hooks/calculate_position.js.map +0 -1
  138. package/dist/overlay/tethered/hooks/useCaretRefDimensions.d.ts +0 -9
  139. package/dist/overlay/tethered/hooks/useCaretRefDimensions.d.ts.map +0 -1
  140. package/dist/overlay/tethered/hooks/useCaretRefDimensions.js +0 -14
  141. package/dist/overlay/tethered/hooks/useCaretRefDimensions.js.map +0 -1
  142. package/dist/overlay/tethered/hooks/useTether.d.ts.map +0 -1
  143. package/dist/overlay/tethered/hooks/useTether.js.map +0 -1
  144. package/dist/overlay/tethered/hooks/useTetherContentRect.d.ts +0 -3
  145. package/dist/overlay/tethered/hooks/useTetherContentRect.d.ts.map +0 -1
  146. package/dist/overlay/tethered/hooks/useTetherContentRect.js +0 -36
  147. package/dist/overlay/tethered/hooks/useTetherContentRect.js.map +0 -1
  148. package/dist/overlay/tethered/hooks/useTetherOrigin.d.ts +0 -14
  149. package/dist/overlay/tethered/hooks/useTetherOrigin.d.ts.map +0 -1
  150. package/dist/overlay/tethered/hooks/useTetherOrigin.js +0 -24
  151. package/dist/overlay/tethered/hooks/useTetherOrigin.js.map +0 -1
  152. package/dist/surfaces/popconfirm/pop_confirm.d.ts +0 -5
  153. package/dist/surfaces/popconfirm/pop_confirm.d.ts.map +0 -1
  154. package/dist/surfaces/popconfirm/pop_confirm.js +0 -13
  155. package/dist/surfaces/popconfirm/pop_confirm.js.map +0 -1
  156. package/src/overlay/tethered/hooks/useCaretRefDimensions.ts +0 -22
  157. package/src/overlay/tethered/hooks/useTetherContentRect.ts +0 -49
  158. package/src/overlay/tethered/hooks/useTetherOrigin.ts +0 -49
  159. package/src/surfaces/popconfirm/pop_confirm.tsx +0 -18
  160. package/src/surfaces/tooltip/tooltip.stories.tsx +0 -54
  161. /package/dist/{actions/button → inputs}/select_group/single_select_group.d.ts +0 -0
  162. /package/dist/{actions/button → inputs}/select_group/single_select_group.js +0 -0
  163. /package/dist/overlay/tethered/hooks/{calculate_position.js → utils/calculate_position.js} +0 -0
  164. /package/src/{actions/button → inputs}/select_group/select_group.module.css +0 -0
  165. /package/src/{actions/button → inputs}/select_group/single_select_group.tsx +0 -0
@@ -48,6 +48,7 @@
48
48
  --font-size: 12px;
49
49
 
50
50
  /* Spacing */
51
+ --gap-xs: 2px;
51
52
  --gap-small: 4px;
52
53
  --gap-medium: 8px;
53
54
  --gap-large: 16px;
@@ -89,6 +90,7 @@
89
90
  --shape-radius-small: 2px;
90
91
  --shape-radius-medium: 4px;
91
92
  --shape-radius-large: 8px;
93
+ --shape-triangle-medium: 12px;
92
94
 
93
95
  /* Palette */
94
96
  --primary-color-faint: #c0c0c0;
@@ -562,17 +564,21 @@
562
564
 
563
565
  /* Inline */
564
566
  .tcn-tabs-bar[data-variant="inline"] {
567
+ font-size: 12px;
565
568
  min-width: min-content;
566
569
  width: auto;
567
570
  flex-grow: 0;
568
571
  border-radius: var(--shape-radius-medium);
569
572
  border: 1px solid var(--on-material);
573
+ padding-block: 1px;
574
+ padding-inline: 2px;
570
575
 
571
576
  .tcn-tabs-list {
572
- gap: var(--gap-small);
573
- padding: var(--padding-small);
577
+ height: 20px;
578
+ gap: var(--gap-xs);
574
579
  .tcn-tab-item {
575
580
  border-radius: var(--shape-radius-medium);
581
+ min-height: 20px;
576
582
  }
577
583
  }
578
584
  }
@@ -607,12 +613,88 @@
607
613
  border: inherit;
608
614
  }
609
615
 
616
+ .tcn-tethered {
617
+ /* Managing offset of the indicator in relation for the tethered element
618
+ pad defaults to 0, but should be set depending on the surface */
619
+
620
+ --tether-pad-x: 0px;
621
+ --tether-pad-y: 0px;
622
+ --indicator-pad-x: 0px;
623
+ --indicator-pad-y: 0px;
624
+ --tether-pad-size: 0px;
625
+ --tether-pad-pos: var(--tether-pad-size);
626
+ --tether-pad-neg: calc(-1 * var(--tether-pad-size));
627
+ left: calc(
628
+ var(--tether-pad-x, 0) -
629
+ var(--indicator-pad-x, 0) +
630
+ var(--tethered-left, 0)
631
+ );
632
+ top: calc(var(--tether-pad-y, 0) + var(--tethered-top, 0));
633
+
634
+ :where(.tcn-tethered-origin-indicator) {
635
+ left: calc(var(--indicator-pad-x, 0) + var(--tethered-origin-delta-x, 0));
636
+ top: calc(var(--indicator-pad-y, 0) + var(--tethered-origin-delta-y, 0));
637
+ }
638
+
639
+ &[data-h-anchor="start"] {
640
+ --tether-pad-x: var(--tether-pad-pos);
641
+ }
642
+
643
+ &[data-h-anchor="end"] {
644
+ --tether-pad-x: var(--tether-pad-neg);
645
+ }
646
+
647
+ &[data-h-origin="start"] {
648
+ --indicator-pad-x: var(--tether-pad-pos);
649
+ }
650
+
651
+ &[data-h-origin="end"] {
652
+ --indicator-pad-x: var(--tether-pad-neg);
653
+ }
654
+
655
+ &[data-v-origin="center"] {
656
+ --indicator-pad-x: 0px;
657
+ --tether-pad-x: 0px;
658
+ &[data-v-anchor="top"] {
659
+ --tether-pad-y: var(--tether-pad-pos);
660
+ }
661
+
662
+ &[data-v-anchor="bottom"] {
663
+ --tether-pad-y: var(--tether-pad-neg);
664
+ }
665
+ }
666
+
667
+ &[data-anchor-direction="bottom"] {
668
+ padding-bottom: var(--shape-triangle-medium);
669
+ }
670
+
671
+ &[data-anchor-direction="top"] {
672
+ padding-top: var(--shape-triangle-medium);
673
+ }
674
+
675
+ &[data-anchor-direction="start"] {
676
+ padding-left: var(--shape-triangle-medium);
677
+ }
678
+
679
+ &[data-anchor-direction="end"] {
680
+ padding-right: var(--shape-triangle-medium);
681
+ }
682
+ }
683
+
610
684
  .tcn-tooltip {
611
- background: rgba(57, 85, 120, 0.85);
612
- box-shadow: 0px 4px 7px 0px rgba(65, 65, 65, 0.66);
613
- color: rgba(255, 255, 255, 1);
614
- border-radius: var(--shape-radius-medium);
615
- padding: var(--padding-medium);
685
+ --tether-pad-size: 16px;
686
+ background: transparent;
687
+ --material: var(--ergo-secondary-dark);
688
+ --on-material: var(--ergo-white);
689
+ --action: var(--ergo-tertiary);
690
+ --on-action: var(--ergo-secondary-dark);
691
+ .tcn-tooltip-label {
692
+ box-shadow: 0px 4px 7px 0px rgba(65, 65, 65, 0.66);
693
+ color: var(--on-material);
694
+ background: var(--material);
695
+ border-radius: var(--shape-radius-medium);
696
+ padding: var(--padding-medium);
697
+ }
616
698
  }
617
699
 
618
700
  .tcn-list {
@@ -635,6 +717,9 @@
635
717
  }
636
718
 
637
719
  .tcn-rail {
720
+ :where(.tcn-rail-stack) {
721
+ gap: var(--gap-medium);
722
+ }
638
723
  :where(.tcn-body) {
639
724
  gap: var(--gap-medium);
640
725
  }
@@ -738,6 +823,17 @@
738
823
 
739
824
  .tcn-pop-confirm {
740
825
  --divide-header: 0;
826
+ --tether-pad-size: 16px;
827
+ :where(.tcn-tethered-origin-indicator) {
828
+ --material: var(--ergo-white);
829
+ }
830
+
831
+ /* Set the indicator to match the header color */
832
+ &[data-v-origin="top"] {
833
+ :where(.tcn-tethered-origin-indicator) {
834
+ --material: var(--ergo-secondary-dark);
835
+ }
836
+ }
741
837
 
742
838
  :where(.tcn-scaffold) {
743
839
  --pad-inline: var(--padding-medium);
@@ -768,9 +864,25 @@
768
864
  background-color: var(--background-color-primary);
769
865
  }
770
866
 
867
+ .tcn-bar {
868
+ gap: var(--gap-medium);
869
+
870
+ /* Add a divider between groups unless there is a spacer after a group */
871
+ :where(.tcn-group:not(:last-child):not(:has(+ .tcn-spacer)))::after {
872
+ content: "";
873
+ display: block;
874
+ min-width: 2px;
875
+ height: 18px;
876
+ background: var(--ergo-grey);
877
+ border-radius: var(--shape-radius-small);
878
+ align-self: center;
879
+ }
880
+ }
881
+
771
882
  /* PANEL */
772
883
  .tcn-panel {
773
- background-color: var(--background-color-primary);
884
+ --material: var(--background-color-primary);
885
+ background-color: var(--material);
774
886
  border-radius: var(--shape-radius-medium);
775
887
  overflow: hidden;
776
888
  }
@@ -860,14 +972,16 @@
860
972
  }
861
973
 
862
974
  .tcn-caret {
863
- --caret-size: 12px;
975
+ --caret-size: var(--shape-triangle-medium);
864
976
  --caret-triangle-height: calc(var(--caret-size) / 2);
865
977
  --caret-triangle-width: var(--caret-size);
866
978
  --caret-triangle-base: var(--caret-triangle-height) solid transparent;
867
979
  --caret-triangle-peak: var(--caret-triangle-width) solid var(--material);
868
980
 
869
- width: 0;
870
- height: 0;
981
+ width: var(--caret-size);
982
+ height: var(--caret-size);
983
+ min-width: var(--caret-size);
984
+ min-height: var(--caret-size);
871
985
  flex-grow: 0;
872
986
  display: inline-block;
873
987
 
@@ -1189,7 +1303,9 @@
1189
1303
  .tcn-switch-wrapper,
1190
1304
  .tcn-date-picker,
1191
1305
  .tcn-date-picker-year-selector,
1192
- .tcn-radio {
1306
+ .tcn-radio,
1307
+ .tcn-suggestion-list-search-input,
1308
+ .tcn-suggestion-list {
1193
1309
  --accent-color: var(--ergo-primary);
1194
1310
  }
1195
1311
  }
@@ -1 +0,0 @@
1
- {"version":3,"file":"select_group.d.ts","sourceRoot":"","sources":["../../../../src/actions/button/select_group/select_group.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAEzE,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,MAAM,MAAM,yBAAyB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;AACnE,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,MAAM,gBAAgB,GAAG,IAAI,CACjC,qBAAqB,CAAC,mBAAmB,EAAE,KAAK,CAAC,EACjD,UAAU,CACX,GAAG;IACF,QAAQ,CAAC,EAAE,yBAAyB,CAAC;IACrC,QAAQ,EACJ,KAAK,CAAC,YAAY,CAAC,iBAAiB,CAAC,GACrC,KAAK,CAAC,YAAY,CAAC,iBAAiB,CAAC,EAAE,CAAC;CAC7C,CAAC;AAEF,eAAO,MAAM,WAAW,sGAsDtB,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"select_group.js","sources":["../../../../src/actions/button/select_group/select_group.tsx"],"sourcesContent":["import { HStack } from '../../../stacks/h_stack.js';\nimport type { WithDetailedHTMLProps } from '../../../stacks/types/as.js';\nimport { clsx } from 'clsx';\nimport React from 'react';\nimport { Button } from '../button/button.js';\nimport styles from './select_group.module.css';\n\nexport type SelectGroupChangeCallback = (values: string[]) => void;\nexport interface SelectGroupOwnProps {\n value: string[];\n disabled?: boolean;\n}\n\nexport type SelectGroupProps = Omit<\n WithDetailedHTMLProps<SelectGroupOwnProps, 'div'>,\n 'onChange'\n> & {\n onChange?: SelectGroupChangeCallback;\n children:\n | React.ReactElement<HTMLOptionElement>\n | React.ReactElement<HTMLOptionElement>[];\n};\n\nexport const SelectGroup = React.forwardRef(function ButtonGroup(\n { children, value, className, onChange, disabled = false, ...props }: SelectGroupProps,\n ref: React.Ref<HTMLDivElement>\n) {\n const options: React.ReactElement<any>[] = Array.isArray(children)\n ? children\n : [children];\n\n const handleChange = (option: string, isSelected: boolean) => {\n if (disabled) return;\n const next = [...value];\n if (isSelected) {\n const index = value.indexOf(option);\n index > -1 && next.splice(index, 1);\n } else {\n next.push(option);\n }\n onChange?.(next);\n };\n\n return (\n <HStack\n ref={ref}\n as=\"div\"\n inline\n width=\"auto\"\n height=\"auto\"\n data-is-disabled={disabled}\n className={clsx(styles['select-group'], 'tcn-select-group', className)}\n {...props}\n >\n {options.map((option, i) => {\n const isSelected = value.includes(option.props.value);\n const select = () => {\n handleChange(option.props.value, isSelected);\n };\n\n return (\n <React.Fragment key={i}>\n <Button\n disabled={disabled || option.props.disabled}\n data-is-disabled={disabled || option.props.disabled}\n className={clsx(styles['select-group-option'], 'tcn-select-group-option')}\n hierarchy={isSelected ? 'primary' : 'secondary'}\n onClick={select}\n value={option.props.value}\n >\n {option.props.children}\n </Button>\n </React.Fragment>\n );\n })}\n </HStack>\n );\n});\n"],"names":["SelectGroup","React","children","value","className","onChange","disabled","props","ref","options","handleChange","option","isSelected","next","index","jsx","HStack","clsx","styles","i","select","Button"],"mappings":";;;;;4LAuBaA,IAAcC,EAAM,WAAW,SAC1C,EAAE,UAAAC,GAAU,OAAAC,GAAO,WAAAC,GAAW,UAAAC,GAAU,UAAAC,IAAW,IAAO,GAAGC,EAAA,GAC7DC,GACA;AACA,QAAMC,IAAqC,MAAM,QAAQP,CAAQ,IAC7DA,IACA,CAACA,CAAQ,GAEPQ,IAAe,CAACC,GAAgBC,MAAwB;AAC5D,QAAIN,EAAU;AACd,UAAMO,IAAO,CAAC,GAAGV,CAAK;AACtB,QAAIS,GAAY;AACd,YAAME,IAAQX,EAAM,QAAQQ,CAAM;AAClC,MAAAG,IAAQ,MAAMD,EAAK,OAAOC,GAAO,CAAC;AAAA,IACpC;AACE,MAAAD,EAAK,KAAKF,CAAM;AAElB,IAAAN,IAAWQ,CAAI;AAAA,EACjB;AAEA,SACE,gBAAAE;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,KAAAR;AAAA,MACA,IAAG;AAAA,MACH,QAAM;AAAA,MACN,OAAM;AAAA,MACN,QAAO;AAAA,MACP,oBAAkBF;AAAA,MAClB,WAAWW,EAAKC,EAAO,cAAc,GAAG,oBAAoBd,CAAS;AAAA,MACpE,GAAGG;AAAA,MAEH,UAAAE,EAAQ,IAAI,CAACE,GAAQQ,MAAM;AAC1B,cAAMP,IAAaT,EAAM,SAASQ,EAAO,MAAM,KAAK,GAC9CS,IAAS,MAAM;AACnB,UAAAV,EAAaC,EAAO,MAAM,OAAOC,CAAU;AAAA,QAC7C;AAEA,eACE,gBAAAG,EAACd,EAAM,UAAN,EACC,UAAA,gBAAAc;AAAA,UAACM;AAAA,UAAA;AAAA,YACC,UAAUf,KAAYK,EAAO,MAAM;AAAA,YACnC,oBAAkBL,KAAYK,EAAO,MAAM;AAAA,YAC3C,WAAWM,EAAKC,EAAO,qBAAqB,GAAG,yBAAyB;AAAA,YACxE,WAAWN,IAAa,YAAY;AAAA,YACpC,SAASQ;AAAA,YACT,OAAOT,EAAO,MAAM;AAAA,YAEnB,YAAO,MAAM;AAAA,UAAA;AAAA,QAAA,KATGQ,CAWrB;AAAA,MAEJ,CAAC;AAAA,IAAA;AAAA,EAAA;AAGP,CAAC;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"single_select_group.d.ts","sourceRoot":"","sources":["../../../../src/actions/button/select_group/single_select_group.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAe,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAElE,MAAM,WAAW,yBAAyB;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACpC;AAED,MAAM,MAAM,sBAAsB,GAAG,IAAI,CACvC,gBAAgB,EAChB,OAAO,GAAG,UAAU,GAAG,mBAAmB,CAC3C,GACC,yBAAyB,CAAC;AAE5B,eAAO,MAAM,iBAAiB,4GAgC5B,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"single_select_group.js","sources":["../../../../src/actions/button/select_group/single_select_group.tsx"],"sourcesContent":["import React from 'react';\nimport { SelectGroup, SelectGroupProps } from './select_group.js';\n\nexport interface SingleSelectGroupOwnProps {\n value: string;\n disabled?: boolean;\n onChange?: (value: string) => void;\n}\n\nexport type SingleSelectGroupProps = Omit<\n SelectGroupProps,\n 'value' | 'onChange' | 'enableMultiselect'\n> &\n SingleSelectGroupOwnProps;\n\nexport const SingleSelectGroup = React.forwardRef(function SingleSelectGroup(\n {\n children,\n value,\n className,\n onChange,\n disabled = false,\n ...props\n }: SingleSelectGroupProps,\n ref: React.Ref<HTMLDivElement>\n) {\n const handleChange = (values: string[]) => {\n if (values.length === 0) {\n return;\n }\n // For single select, we take the last selected value or empty string if none selected\n const singleValue = values.length > 0 ? values[values.length - 1] : '';\n onChange?.(singleValue);\n };\n\n return (\n <SelectGroup\n ref={ref}\n value={value != null ? [value] : []}\n onChange={handleChange}\n disabled={disabled}\n className={className}\n {...props}\n >\n {children}\n </SelectGroup>\n );\n});\n"],"names":["SingleSelectGroup","React","children","value","className","onChange","disabled","props","ref","handleChange","values","singleValue","jsx","SelectGroup"],"mappings":";;;AAeO,MAAMA,IAAoBC,EAAM,WAAW,SAChD;AAAA,EACE,UAAAC;AAAA,EACA,OAAAC;AAAA,EACA,WAAAC;AAAA,EACA,UAAAC;AAAA,EACA,UAAAC,IAAW;AAAA,EACX,GAAGC;AACL,GACAC,GACA;AACA,QAAMC,IAAe,CAACC,MAAqB;AACzC,QAAIA,EAAO,WAAW;AACpB;AAGF,UAAMC,IAAcD,EAAO,SAAS,IAAIA,EAAOA,EAAO,SAAS,CAAC,IAAI;AACpE,IAAAL,IAAWM,CAAW;AAAA,EACxB;AAEA,SACE,gBAAAC;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,KAAAL;AAAA,MACA,OAAOL,KAAS,OAAO,CAACA,CAAK,IAAI,CAAA;AAAA,MACjC,UAAUM;AAAA,MACV,UAAAH;AAAA,MACA,WAAAF;AAAA,MACC,GAAGG;AAAA,MAEH,UAAAL;AAAA,IAAA;AAAA,EAAA;AAGP,CAAC;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"calculate_origin.d.ts","sourceRoot":"","sources":["../../../../src/overlay/tethered/hooks/calculate_origin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAEpE,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,QAAQ,GAAG,OAAO,GAAG,KAAK,GAAG,MAAM,CAAC;AAEzE;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,gBAAgB,EACzB,OAAO,EAAE,cAAc,GACtB;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CA+BtC;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,gBAAgB,EAAE,QAAQ,EAC1B,MAAM,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAC3C,QAAQ,CAKV;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,cAAc,EACvB,OAAO,EAAE,gBAAgB,GACxB,cAAc,CAQhB"}
@@ -1,41 +0,0 @@
1
- function r(e, t, s) {
2
- let n = 0, i = 0;
3
- switch (s) {
4
- case "top":
5
- n = 0;
6
- break;
7
- case "center":
8
- n = e.dimensions.height / 2;
9
- break;
10
- case "bottom":
11
- n = e.dimensions.height;
12
- break;
13
- }
14
- switch (t) {
15
- case "start":
16
- i = 0;
17
- break;
18
- case "center":
19
- i = e.dimensions.width / 2;
20
- break;
21
- case "end":
22
- i = e.dimensions.width;
23
- break;
24
- }
25
- return { yOffset: n, xOffset: i };
26
- }
27
- function c(e, t) {
28
- return {
29
- x: e.x + t.xOffset,
30
- y: e.y + t.yOffset
31
- };
32
- }
33
- function f(e, t) {
34
- return e !== "center" ? e : t !== "center" ? t : "none";
35
- }
36
- export {
37
- f as getOriginDirection,
38
- r as getOriginOffset,
39
- c as getOriginPosition
40
- };
41
- //# sourceMappingURL=calculate_origin.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"calculate_origin.js","sources":["../../../../src/overlay/tethered/hooks/calculate_origin.ts"],"sourcesContent":["import type { Position, Rectangle } from '../../../utils/index.js';\nimport type { HorizontalTether, VerticalTether } from '../types.js';\n\nexport type CaretDirection = 'top' | 'bottom' | 'start' | 'end' | 'none';\n\n/**\n * Calculates the offset from the tethered element's top-left corner to the origin point\n * based on tether dimensions and origin alignment.\n */\nexport function getOriginOffset(\n tether: Rectangle,\n hOrigin: HorizontalTether,\n vOrigin: VerticalTether\n): { yOffset: number; xOffset: number } {\n let yOffset = 0;\n let xOffset = 0;\n\n // Calculate vertical offset\n switch (vOrigin) {\n case 'top':\n yOffset = 0;\n break;\n case 'center':\n yOffset = tether.dimensions.height / 2;\n break;\n case 'bottom':\n yOffset = tether.dimensions.height;\n break;\n }\n\n // Calculate horizontal offset\n switch (hOrigin) {\n case 'start':\n xOffset = 0;\n break;\n case 'center':\n xOffset = tether.dimensions.width / 2;\n break;\n case 'end':\n xOffset = tether.dimensions.width;\n break;\n }\n\n return { yOffset, xOffset };\n}\n\n/**\n * Adds offset to baseline position to get absolute origin position.\n */\nexport function getOriginPosition(\n baselinePosition: Position,\n offset: { yOffset: number; xOffset: number }\n): Position {\n return {\n x: baselinePosition.x + offset.xOffset,\n y: baselinePosition.y + offset.yOffset,\n };\n}\n\n/**\n * Determines caret direction based on origin values.\n */\nexport function getOriginDirection(\n vOrigin: VerticalTether,\n hOrigin: HorizontalTether\n): CaretDirection {\n if (vOrigin !== 'center') {\n return vOrigin;\n } else if (hOrigin !== 'center') {\n return hOrigin;\n } else {\n return 'none';\n }\n}\n"],"names":["getOriginOffset","tether","hOrigin","vOrigin","yOffset","xOffset","getOriginPosition","baselinePosition","offset","getOriginDirection"],"mappings":"AASO,SAASA,EACdC,GACAC,GACAC,GACsC;AACtC,MAAIC,IAAU,GACVC,IAAU;AAGd,UAAQF,GAAA;AAAA,IACN,KAAK;AACH,MAAAC,IAAU;AACV;AAAA,IACF,KAAK;AACH,MAAAA,IAAUH,EAAO,WAAW,SAAS;AACrC;AAAA,IACF,KAAK;AACH,MAAAG,IAAUH,EAAO,WAAW;AAC5B;AAAA,EAAA;AAIJ,UAAQC,GAAA;AAAA,IACN,KAAK;AACH,MAAAG,IAAU;AACV;AAAA,IACF,KAAK;AACH,MAAAA,IAAUJ,EAAO,WAAW,QAAQ;AACpC;AAAA,IACF,KAAK;AACH,MAAAI,IAAUJ,EAAO,WAAW;AAC5B;AAAA,EAAA;AAGJ,SAAO,EAAE,SAAAG,GAAS,SAAAC,EAAA;AACpB;AAKO,SAASC,EACdC,GACAC,GACU;AACV,SAAO;AAAA,IACL,GAAGD,EAAiB,IAAIC,EAAO;AAAA,IAC/B,GAAGD,EAAiB,IAAIC,EAAO;AAAA,EAAA;AAEnC;AAKO,SAASC,EACdN,GACAD,GACgB;AAChB,SAAIC,MAAY,WACPA,IACED,MAAY,WACdA,IAEA;AAEX;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"calculate_position.d.ts","sourceRoot":"","sources":["../../../../src/overlay/tethered/hooks/calculate_position.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACpE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAE1D,MAAM,WAAW,+BAA+B;IAC9C,MAAM,EAAE,SAAS,CAAC;IAClB,MAAM,EAAE,SAAS,CAAC;IAClB,SAAS,EAAE,KAAK,GAAG,KAAK,CAAC;IACzB,cAAc,EAAE,cAAc,CAAC;IAC/B,cAAc,EAAE,cAAc,CAAC;IAC/B,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,UAAU,CAAC;CACtB;AAED,eAAO,MAAM,yBAAyB,GAAI,gJAWvC,+BAA+B;;;CAiFjC,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"calculate_position.js","sources":["../../../../src/overlay/tethered/hooks/calculate_position.ts"],"sourcesContent":["import type { HorizontalTether, VerticalTether } from '../types.js';\nimport type { Rectangle } from '../../../utils/index.js';\nimport type { Dimensions } from '../../../utils/index.js';\n\nexport interface CalculateTetheredPositionParams {\n anchor: Rectangle;\n tether: Rectangle;\n direction: 'ltr' | 'rtl';\n verticalAnchor: VerticalTether;\n verticalOrigin: VerticalTether;\n horizontalAnchor: HorizontalTether;\n horizontalOrigin: HorizontalTether;\n verticalOffset: number;\n horizontalOffset: number;\n viewport: Dimensions;\n}\n\nexport const calculateTetheredPosition = ({\n anchor,\n tether,\n direction,\n verticalAnchor,\n verticalOrigin,\n horizontalAnchor,\n horizontalOrigin,\n verticalOffset,\n horizontalOffset,\n viewport,\n}: CalculateTetheredPositionParams) => {\n const isRtl = direction === 'rtl';\n\n let top = anchor.position.y;\n let left = anchor.position.x;\n\n // Calculate vertical position\n switch (verticalAnchor) {\n case 'top':\n top += verticalOffset;\n break;\n case 'center':\n top += anchor.dimensions.height / 2;\n break;\n case 'bottom':\n top += anchor.dimensions.height - verticalOffset;\n break;\n }\n\n switch (verticalOrigin) {\n case 'top':\n break;\n case 'center':\n top -= tether.dimensions.height / 2;\n break;\n case 'bottom':\n top -= tether.dimensions.height;\n break;\n }\n\n // Calculate horizontal position with direction sensitivity\n if (horizontalAnchor === 'start') {\n left += isRtl ? anchor.dimensions.width + horizontalOffset : horizontalOffset;\n } else if (horizontalAnchor === 'center') {\n left += anchor.dimensions.width / 2;\n } else if (horizontalAnchor === 'end') {\n left += isRtl ? -horizontalOffset : anchor.dimensions.width + horizontalOffset;\n }\n\n // Adjust the origin based on RTL direction\n let adjustedHorizontalOrigin = horizontalOrigin;\n if (isRtl) {\n if (horizontalOrigin === 'start') {\n adjustedHorizontalOrigin = 'end';\n } else if (horizontalOrigin === 'end') {\n adjustedHorizontalOrigin = 'start';\n }\n }\n\n // Apply adjusted origin to the position calculation\n if (adjustedHorizontalOrigin === 'start') {\n // No adjustment needed\n } else if (adjustedHorizontalOrigin === 'center') {\n left -= tether.dimensions.width / 2;\n } else if (adjustedHorizontalOrigin === 'end') {\n left -= tether.dimensions.width;\n }\n\n // Ensure the popover stays within the viewport\n // Prevent overflow to the right\n if (left + tether.dimensions.width > viewport.width) {\n left = viewport.width - tether.dimensions.width;\n }\n\n // Prevent overflow to the left\n if (left < 0) {\n left = 0;\n }\n\n // Prevent overflow to the bottom\n // FIXME: doesn't account for padding.\n if (top + tether.dimensions.height > viewport.height) {\n top = viewport.height - tether.dimensions.height;\n }\n\n // Prevent overflow to the top\n if (top < 0) {\n top = 0;\n }\n\n return { top, left };\n};\n"],"names":["calculateTetheredPosition","anchor","tether","direction","verticalAnchor","verticalOrigin","horizontalAnchor","horizontalOrigin","verticalOffset","horizontalOffset","viewport","isRtl","top","left","adjustedHorizontalOrigin"],"mappings":"AAiBO,MAAMA,IAA4B,CAAC;AAAA,EACxC,QAAAC;AAAA,EACA,QAAAC;AAAA,EACA,WAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,kBAAAC;AAAA,EACA,kBAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,kBAAAC;AAAA,EACA,UAAAC;AACF,MAAuC;AACrC,QAAMC,IAAQR,MAAc;AAE5B,MAAIS,IAAMX,EAAO,SAAS,GACtBY,IAAOZ,EAAO,SAAS;AAG3B,UAAQG,GAAA;AAAA,IACN,KAAK;AACH,MAAAQ,KAAOJ;AACP;AAAA,IACF,KAAK;AACH,MAAAI,KAAOX,EAAO,WAAW,SAAS;AAClC;AAAA,IACF,KAAK;AACH,MAAAW,KAAOX,EAAO,WAAW,SAASO;AAClC;AAAA,EAAA;AAGJ,UAAQH,GAAA;AAAA,IACN,KAAK;AACH;AAAA,IACF,KAAK;AACH,MAAAO,KAAOV,EAAO,WAAW,SAAS;AAClC;AAAA,IACF,KAAK;AACH,MAAAU,KAAOV,EAAO,WAAW;AACzB;AAAA,EAAA;AAIJ,EAAII,MAAqB,UACvBO,KAAQF,IAAQV,EAAO,WAAW,QAAQQ,IAAmBA,IACpDH,MAAqB,WAC9BO,KAAQZ,EAAO,WAAW,QAAQ,IACzBK,MAAqB,UAC9BO,KAAQF,IAAQ,CAACF,IAAmBR,EAAO,WAAW,QAAQQ;AAIhE,MAAIK,IAA2BP;AAC/B,SAAII,MACEJ,MAAqB,UACvBO,IAA2B,QAClBP,MAAqB,UAC9BO,IAA2B,WAK3BA,MAA6B,YAEtBA,MAA6B,WACtCD,KAAQX,EAAO,WAAW,QAAQ,IACzBY,MAA6B,UACtCD,KAAQX,EAAO,WAAW,SAKxBW,IAAOX,EAAO,WAAW,QAAQQ,EAAS,UAC5CG,IAAOH,EAAS,QAAQR,EAAO,WAAW,QAIxCW,IAAO,MACTA,IAAO,IAKLD,IAAMV,EAAO,WAAW,SAASQ,EAAS,WAC5CE,IAAMF,EAAS,SAASR,EAAO,WAAW,SAIxCU,IAAM,MACRA,IAAM,IAGD,EAAE,KAAAA,GAAK,MAAAC,EAAA;AAChB;"}
@@ -1,9 +0,0 @@
1
- import { CaretDirection } from './calculate_origin.js';
2
- export declare function useCaretRefDimensions(precision: 'high' | 'low', originDirection: CaretDirection): {
3
- caretElementRef: (element: HTMLElement | null) => void;
4
- caretSize: {
5
- width: number;
6
- height: number;
7
- };
8
- };
9
- //# sourceMappingURL=useCaretRefDimensions.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useCaretRefDimensions.d.ts","sourceRoot":"","sources":["../../../../src/overlay/tethered/hooks/useCaretRefDimensions.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,MAAM,GAAG,KAAK,EACzB,eAAe,EAAE,cAAc,GAC9B;IACD,eAAe,EAAE,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,KAAK,IAAI,CAAC;IACvD,SAAS,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CAC9C,CAYA"}
@@ -1,14 +0,0 @@
1
- import { useState as i, useLayoutEffect as c } from "react";
2
- function u(t, n) {
3
- const [e, r] = i(null), [s, a] = i({ width: 0, height: 0 });
4
- return c(() => {
5
- if (t === "high" && n !== "none" && e) {
6
- const h = e.getBoundingClientRect();
7
- a({ width: h.width, height: h.height });
8
- }
9
- }, [t, n, e]), { caretElementRef: r, caretSize: s };
10
- }
11
- export {
12
- u as useCaretRefDimensions
13
- };
14
- //# sourceMappingURL=useCaretRefDimensions.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useCaretRefDimensions.js","sources":["../../../../src/overlay/tethered/hooks/useCaretRefDimensions.ts"],"sourcesContent":["import { useLayoutEffect, useState } from 'react';\nimport type { CaretDirection } from './calculate_origin.js';\n\nexport function useCaretRefDimensions(\n precision: 'high' | 'low',\n originDirection: CaretDirection\n): {\n caretElementRef: (element: HTMLElement | null) => void;\n caretSize: { width: number; height: number };\n} {\n const [caretElement, setCaretElement] = useState<HTMLElement | null>(null);\n const [caretSize, setCaretSize] = useState({ width: 0, height: 0 });\n\n useLayoutEffect(() => {\n if (precision === 'high' && originDirection !== 'none' && caretElement) {\n const rect = caretElement.getBoundingClientRect();\n setCaretSize({ width: rect.width, height: rect.height });\n }\n }, [precision, originDirection, caretElement]);\n\n return { caretElementRef: setCaretElement, caretSize };\n}\n"],"names":["useCaretRefDimensions","precision","originDirection","caretElement","setCaretElement","useState","caretSize","setCaretSize","useLayoutEffect","rect"],"mappings":";AAGO,SAASA,EACdC,GACAC,GAIA;AACA,QAAM,CAACC,GAAcC,CAAe,IAAIC,EAA6B,IAAI,GACnE,CAACC,GAAWC,CAAY,IAAIF,EAAS,EAAE,OAAO,GAAG,QAAQ,GAAG;AAElE,SAAAG,EAAgB,MAAM;AACpB,QAAIP,MAAc,UAAUC,MAAoB,UAAUC,GAAc;AACtE,YAAMM,IAAON,EAAa,sBAAA;AAC1B,MAAAI,EAAa,EAAE,OAAOE,EAAK,OAAO,QAAQA,EAAK,QAAQ;AAAA,IACzD;AAAA,EACF,GAAG,CAACR,GAAWC,GAAiBC,CAAY,CAAC,GAEtC,EAAE,iBAAiBC,GAAiB,WAAAE,EAAA;AAC7C;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"useTether.d.ts","sourceRoot":"","sources":["../../../../src/overlay/tethered/hooks/useTether.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAGpE,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,SAAS,GAAG,IAAI,CAAC;IACzB,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,wBAAgB,SAAS,CAAC,EACxB,MAAM,EACN,cAAyB,EACzB,cAAsB,EACtB,gBAA0B,EAC1B,gBAA0B,EAC1B,cAAkB,EAClB,gBAAoB,GACrB,EAAE,eAAe;;;;;;EA8DjB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"useTether.js","sources":["../../../../src/overlay/tethered/hooks/useTether.ts"],"sourcesContent":["import { useCallback, useLayoutEffect, useRef, useState } from 'react';\nimport { type Rectangle } from '../../../utils/index.js';\nimport type { HorizontalTether, VerticalTether } from '../types.js';\nimport { calculateTetheredPosition } from './calculate_position.js';\n\nexport interface UseTetherParams {\n anchor: Rectangle | null;\n verticalAnchor?: VerticalTether;\n verticalOrigin?: VerticalTether;\n horizontalOrigin?: HorizontalTether;\n horizontalAnchor?: HorizontalTether;\n verticalOffset?: number;\n horizontalOffset?: number;\n}\n\nexport function useTether({\n anchor,\n verticalAnchor = 'bottom',\n verticalOrigin = 'top',\n horizontalAnchor = 'start',\n horizontalOrigin = 'start',\n verticalOffset = 0,\n horizontalOffset = 0,\n}: UseTetherParams) {\n const [position, setPosition] = useState({ top: 0, left: 0 });\n const tetherRef = useRef<HTMLDivElement>(null);\n\n const getPosition = useCallback(() => {\n if (!anchor || !tetherRef.current) return;\n\n const tether = tetherRef.current.getBoundingClientRect();\n const computedStyle = getComputedStyle(tetherRef.current);\n\n return calculateTetheredPosition({\n anchor: anchor,\n tether: {\n dimensions: {\n width: tether.width,\n height: tether.height,\n },\n position: {\n x: tether.left,\n y: tether.top,\n },\n },\n direction: computedStyle.direction as 'ltr' | 'rtl',\n verticalAnchor: verticalAnchor,\n verticalOrigin: verticalOrigin,\n horizontalAnchor: horizontalAnchor,\n horizontalOrigin: horizontalOrigin,\n verticalOffset: verticalOffset,\n horizontalOffset: horizontalOffset,\n viewport: {\n width: window.innerWidth,\n height: window.innerHeight,\n },\n });\n }, [\n anchor,\n verticalAnchor,\n verticalOrigin,\n horizontalAnchor,\n horizontalOrigin,\n verticalOffset,\n horizontalOffset,\n ]);\n\n useLayoutEffect(() => {\n const update = () => {\n const newPosition = getPosition();\n if (!newPosition) return;\n const hasChanged =\n position.top !== newPosition.top || position.left !== newPosition.left;\n if (hasChanged) {\n setPosition(newPosition);\n }\n };\n update();\n window.addEventListener('resize', update);\n return () => {\n window.removeEventListener('resize', update);\n };\n });\n\n return { position, tetherRef };\n}\n"],"names":["useTether","anchor","verticalAnchor","verticalOrigin","horizontalAnchor","horizontalOrigin","verticalOffset","horizontalOffset","position","setPosition","useState","tetherRef","useRef","getPosition","useCallback","tether","computedStyle","calculateTetheredPosition","useLayoutEffect","update","newPosition"],"mappings":";;AAeO,SAASA,EAAU;AAAA,EACxB,QAAAC;AAAA,EACA,gBAAAC,IAAiB;AAAA,EACjB,gBAAAC,IAAiB;AAAA,EACjB,kBAAAC,IAAmB;AAAA,EACnB,kBAAAC,IAAmB;AAAA,EACnB,gBAAAC,IAAiB;AAAA,EACjB,kBAAAC,IAAmB;AACrB,GAAoB;AAClB,QAAM,CAACC,GAAUC,CAAW,IAAIC,EAAS,EAAE,KAAK,GAAG,MAAM,GAAG,GACtDC,IAAYC,EAAuB,IAAI,GAEvCC,IAAcC,EAAY,MAAM;AACpC,QAAI,CAACb,KAAU,CAACU,EAAU,QAAS;AAEnC,UAAMI,IAASJ,EAAU,QAAQ,sBAAA,GAC3BK,IAAgB,iBAAiBL,EAAU,OAAO;AAExD,WAAOM,EAA0B;AAAA,MAC/B,QAAAhB;AAAA,MACA,QAAQ;AAAA,QACN,YAAY;AAAA,UACV,OAAOc,EAAO;AAAA,UACd,QAAQA,EAAO;AAAA,QAAA;AAAA,QAEjB,UAAU;AAAA,UACR,GAAGA,EAAO;AAAA,UACV,GAAGA,EAAO;AAAA,QAAA;AAAA,MACZ;AAAA,MAEF,WAAWC,EAAc;AAAA,MACzB,gBAAAd;AAAA,MACA,gBAAAC;AAAA,MACA,kBAAAC;AAAA,MACA,kBAAAC;AAAA,MACA,gBAAAC;AAAA,MACA,kBAAAC;AAAA,MACA,UAAU;AAAA,QACR,OAAO,OAAO;AAAA,QACd,QAAQ,OAAO;AAAA,MAAA;AAAA,IACjB,CACD;AAAA,EACH,GAAG;AAAA,IACDN;AAAA,IACAC;AAAA,IACAC;AAAA,IACAC;AAAA,IACAC;AAAA,IACAC;AAAA,IACAC;AAAA,EAAA,CACD;AAED,SAAAW,EAAgB,MAAM;AACpB,UAAMC,IAAS,MAAM;AACnB,YAAMC,IAAcP,EAAA;AACpB,UAAI,CAACO,EAAa;AAGlB,OADEZ,EAAS,QAAQY,EAAY,OAAOZ,EAAS,SAASY,EAAY,SAElEX,EAAYW,CAAW;AAAA,IAE3B;AACA,WAAAD,EAAA,GACA,OAAO,iBAAiB,UAAUA,CAAM,GACjC,MAAM;AACX,aAAO,oBAAoB,UAAUA,CAAM;AAAA,IAC7C;AAAA,EACF,CAAC,GAEM,EAAE,UAAAX,GAAU,WAAAG,EAAA;AACrB;"}
@@ -1,3 +0,0 @@
1
- import { Rectangle } from '../../../utils/index.js';
2
- export declare function useTetherContentRect(ref: React.RefObject<HTMLElement>): Rectangle;
3
- //# sourceMappingURL=useTetherContentRect.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useTetherContentRect.d.ts","sourceRoot":"","sources":["../../../../src/overlay/tethered/hooks/useTetherContentRect.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAuBzD,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,GAAG,SAAS,CAwBjF"}
@@ -1,36 +0,0 @@
1
- import { useState as r, useLayoutEffect as s } from "react";
2
- function i(t) {
3
- if (!t)
4
- return {
5
- dimensions: { width: 0, height: 0 },
6
- position: { x: 0, y: 0 }
7
- };
8
- const e = t.getBoundingClientRect();
9
- return {
10
- dimensions: {
11
- width: e.width,
12
- height: e.height
13
- },
14
- position: {
15
- x: e.left,
16
- y: e.top
17
- }
18
- };
19
- }
20
- function u(t) {
21
- const [e, o] = r(
22
- () => i(t.current)
23
- );
24
- return s(() => {
25
- const n = () => {
26
- o(i(t.current));
27
- };
28
- return n(), window.addEventListener("resize", n), window.addEventListener("scroll", n, !0), () => {
29
- window.removeEventListener("resize", n), window.removeEventListener("scroll", n, !0);
30
- };
31
- }, [t]), e;
32
- }
33
- export {
34
- u as useTetherContentRect
35
- };
36
- //# sourceMappingURL=useTetherContentRect.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useTetherContentRect.js","sources":["../../../../src/overlay/tethered/hooks/useTetherContentRect.ts"],"sourcesContent":["import { useLayoutEffect, useState } from 'react';\nimport type { Rectangle } from '../../../utils/index.js';\n\nfunction getTetherContentRect(element: HTMLElement | null): Rectangle {\n if (!element) {\n return {\n dimensions: { width: 0, height: 0 },\n position: { x: 0, y: 0 },\n };\n }\n\n const rect = element.getBoundingClientRect();\n return {\n dimensions: {\n width: rect.width,\n height: rect.height,\n },\n position: {\n x: rect.left,\n y: rect.top,\n },\n };\n}\n\nexport function useTetherContentRect(ref: React.RefObject<HTMLElement>): Rectangle {\n const [contentRect, setContentRect] = useState<Rectangle>(() =>\n getTetherContentRect(ref.current)\n );\n\n useLayoutEffect(() => {\n const update = () => {\n setContentRect(getTetherContentRect(ref.current));\n };\n\n update();\n\n // Track resize events\n window.addEventListener('resize', update);\n // Track scroll events\n window.addEventListener('scroll', update, true);\n\n return () => {\n window.removeEventListener('resize', update);\n window.removeEventListener('scroll', update, true);\n };\n }, [ref]);\n\n return contentRect;\n}\n"],"names":["getTetherContentRect","element","rect","useTetherContentRect","ref","contentRect","setContentRect","useState","useLayoutEffect","update"],"mappings":";AAGA,SAASA,EAAqBC,GAAwC;AACpE,MAAI,CAACA;AACH,WAAO;AAAA,MACL,YAAY,EAAE,OAAO,GAAG,QAAQ,EAAA;AAAA,MAChC,UAAU,EAAE,GAAG,GAAG,GAAG,EAAA;AAAA,IAAE;AAI3B,QAAMC,IAAOD,EAAQ,sBAAA;AACrB,SAAO;AAAA,IACL,YAAY;AAAA,MACV,OAAOC,EAAK;AAAA,MACZ,QAAQA,EAAK;AAAA,IAAA;AAAA,IAEf,UAAU;AAAA,MACR,GAAGA,EAAK;AAAA,MACR,GAAGA,EAAK;AAAA,IAAA;AAAA,EACV;AAEJ;AAEO,SAASC,EAAqBC,GAA8C;AACjF,QAAM,CAACC,GAAaC,CAAc,IAAIC;AAAA,IAAoB,MACxDP,EAAqBI,EAAI,OAAO;AAAA,EAAA;AAGlC,SAAAI,EAAgB,MAAM;AACpB,UAAMC,IAAS,MAAM;AACnB,MAAAH,EAAeN,EAAqBI,EAAI,OAAO,CAAC;AAAA,IAClD;AAEA,WAAAK,EAAA,GAGA,OAAO,iBAAiB,UAAUA,CAAM,GAExC,OAAO,iBAAiB,UAAUA,GAAQ,EAAI,GAEvC,MAAM;AACX,aAAO,oBAAoB,UAAUA,CAAM,GAC3C,OAAO,oBAAoB,UAAUA,GAAQ,EAAI;AAAA,IACnD;AAAA,EACF,GAAG,CAACL,CAAG,CAAC,GAEDC;AACT;"}
@@ -1,14 +0,0 @@
1
- import { Position } from '../../../utils/index.js';
2
- import { HorizontalTether, VerticalTether } from '../types.js';
3
- import { CaretDirection } from './calculate_origin.js';
4
- export interface UseTetherOriginResult {
5
- originPosition: Position;
6
- originOffset: {
7
- yOffset: number;
8
- xOffset: number;
9
- };
10
- containerRef: React.RefObject<HTMLDivElement>;
11
- originDirection: CaretDirection;
12
- }
13
- export declare function useTetherOrigin(tetherPosition: Position, hOrigin: HorizontalTether, vOrigin: VerticalTether, precision: 'high' | 'low'): UseTetherOriginResult;
14
- //# sourceMappingURL=useTetherOrigin.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useTetherOrigin.d.ts","sourceRoot":"","sources":["../../../../src/overlay/tethered/hooks/useTetherOrigin.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACpE,OAAO,EAIL,KAAK,cAAc,EACpB,MAAM,uBAAuB,CAAC;AAG/B,MAAM,WAAW,qBAAqB;IACpC,cAAc,EAAE,QAAQ,CAAC;IACzB,YAAY,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IACnD,YAAY,EAAE,KAAK,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;IAC9C,eAAe,EAAE,cAAc,CAAC;CACjC;AAED,wBAAgB,eAAe,CAC7B,cAAc,EAAE,QAAQ,EACxB,OAAO,EAAE,gBAAgB,EACzB,OAAO,EAAE,cAAc,EACvB,SAAS,EAAE,MAAM,GAAG,KAAK,GACxB,qBAAqB,CAyBvB"}
@@ -1,24 +0,0 @@
1
- import { useRef as g } from "react";
2
- import { getOriginOffset as u, getOriginPosition as O, getOriginDirection as m } from "./calculate_origin.js";
3
- import { useTetherContentRect as p } from "./useTetherContentRect.js";
4
- function P(r, o, t, f) {
5
- const i = g(null), n = p(i);
6
- if (f === "low")
7
- return {
8
- originPosition: r,
9
- originOffset: { yOffset: 0, xOffset: 0 },
10
- containerRef: i,
11
- originDirection: "none"
12
- };
13
- const e = u(n, o, t), s = O(n.position, e), c = m(t, o);
14
- return {
15
- originPosition: s,
16
- originOffset: e,
17
- containerRef: i,
18
- originDirection: c
19
- };
20
- }
21
- export {
22
- P as useTetherOrigin
23
- };
24
- //# sourceMappingURL=useTetherOrigin.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useTetherOrigin.js","sources":["../../../../src/overlay/tethered/hooks/useTetherOrigin.ts"],"sourcesContent":["import { useRef } from 'react';\nimport type { Position } from '../../../utils/index.js';\nimport type { HorizontalTether, VerticalTether } from '../types.js';\nimport {\n getOriginDirection,\n getOriginOffset,\n getOriginPosition,\n type CaretDirection,\n} from './calculate_origin.js';\nimport { useTetherContentRect } from './useTetherContentRect.js';\n\nexport interface UseTetherOriginResult {\n originPosition: Position;\n originOffset: { yOffset: number; xOffset: number };\n containerRef: React.RefObject<HTMLDivElement>;\n originDirection: CaretDirection;\n}\n\nexport function useTetherOrigin(\n tetherPosition: Position,\n hOrigin: HorizontalTether,\n vOrigin: VerticalTether,\n precision: 'high' | 'low'\n): UseTetherOriginResult {\n const containerRef = useRef<HTMLDivElement>(null);\n const containerRect = useTetherContentRect(containerRef);\n\n // If precision is low, return default values\n if (precision === 'low') {\n return {\n originPosition: tetherPosition,\n originOffset: { yOffset: 0, xOffset: 0 },\n containerRef,\n originDirection: 'none',\n };\n }\n\n // Calculate origin values for high precision\n const originOffset = getOriginOffset(containerRect, hOrigin, vOrigin);\n const originPosition = getOriginPosition(containerRect.position, originOffset);\n const originDirection = getOriginDirection(vOrigin, hOrigin);\n\n return {\n originPosition,\n originOffset,\n containerRef,\n originDirection,\n };\n}\n"],"names":["useTetherOrigin","tetherPosition","hOrigin","vOrigin","precision","containerRef","useRef","containerRect","useTetherContentRect","originOffset","getOriginOffset","originPosition","getOriginPosition","originDirection","getOriginDirection"],"mappings":";;;AAkBO,SAASA,EACdC,GACAC,GACAC,GACAC,GACuB;AACvB,QAAMC,IAAeC,EAAuB,IAAI,GAC1CC,IAAgBC,EAAqBH,CAAY;AAGvD,MAAID,MAAc;AAChB,WAAO;AAAA,MACL,gBAAgBH;AAAA,MAChB,cAAc,EAAE,SAAS,GAAG,SAAS,EAAA;AAAA,MACrC,cAAAI;AAAA,MACA,iBAAiB;AAAA,IAAA;AAKrB,QAAMI,IAAeC,EAAgBH,GAAeL,GAASC,CAAO,GAC9DQ,IAAiBC,EAAkBL,EAAc,UAAUE,CAAY,GACvEI,IAAkBC,EAAmBX,GAASD,CAAO;AAE3D,SAAO;AAAA,IACL,gBAAAS;AAAA,IACA,cAAAF;AAAA,IACA,cAAAJ;AAAA,IACA,iBAAAQ;AAAA,EAAA;AAEJ;"}
@@ -1,5 +0,0 @@
1
- import { default as React } from 'react';
2
- import { ElementPopperProps } from '../../overlay/popper/element_popper.js';
3
- export type PopConfirmProps = ElementPopperProps;
4
- export declare const PopConfirm: React.ForwardRefExoticComponent<import('../../overlay/index.js').BasePopperProps & import('../../overlay/index.js').ElementTetheredProps & React.RefAttributes<HTMLDivElement>>;
5
- //# sourceMappingURL=pop_confirm.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pop_confirm.d.ts","sourceRoot":"","sources":["../../../src/surfaces/popconfirm/pop_confirm.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAEL,KAAK,kBAAkB,EACxB,MAAM,wCAAwC,CAAC;AAEhD,MAAM,MAAM,eAAe,GAAG,kBAAkB,CAAC;AAEjD,eAAO,MAAM,UAAU,iLAQtB,CAAC"}
@@ -1,13 +0,0 @@
1
- import { jsx as f } from "react/jsx-runtime";
2
- import p from "react";
3
- import { clsx as e } from "clsx";
4
- import { ElementPopper as n } from "../../overlay/popper/element_popper.js";
5
- const u = p.forwardRef(
6
- function({ children: o, className: r, ...m }, t) {
7
- return /* @__PURE__ */ f(n, { ref: t, className: e(r, "tcn-popconfirm"), ...m, children: o });
8
- }
9
- );
10
- export {
11
- u as PopConfirm
12
- };
13
- //# sourceMappingURL=pop_confirm.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pop_confirm.js","sources":["../../../src/surfaces/popconfirm/pop_confirm.tsx"],"sourcesContent":["import React from 'react';\nimport { clsx } from 'clsx';\nimport {\n ElementPopper,\n type ElementPopperProps,\n} from '../../overlay/popper/element_popper.js';\n\nexport type PopConfirmProps = ElementPopperProps;\n\nexport const PopConfirm = React.forwardRef<HTMLDivElement, PopConfirmProps>(\n function PopConfirm({ children, className, ...props }, ref) {\n return (\n <ElementPopper ref={ref} className={clsx(className, 'tcn-popconfirm')} {...props}>\n {children}\n </ElementPopper>\n );\n }\n);\n"],"names":["PopConfirm","React","children","className","props","ref","jsx","ElementPopper","clsx"],"mappings":";;;;AASO,MAAMA,IAAaC,EAAM;AAAA,EAC9B,SAAoB,EAAE,UAAAC,GAAU,WAAAC,GAAW,GAAGC,EAAA,GAASC,GAAK;AAC1D,WACE,gBAAAC,EAACC,GAAA,EAAc,KAAAF,GAAU,WAAWG,EAAKL,GAAW,gBAAgB,GAAI,GAAGC,GACxE,UAAAF,EAAA,CACH;AAAA,EAEJ;AACF;"}
@@ -1,22 +0,0 @@
1
- import { useLayoutEffect, useState } from 'react';
2
- import type { CaretDirection } from './calculate_origin.js';
3
-
4
- export function useCaretRefDimensions(
5
- precision: 'high' | 'low',
6
- originDirection: CaretDirection
7
- ): {
8
- caretElementRef: (element: HTMLElement | null) => void;
9
- caretSize: { width: number; height: number };
10
- } {
11
- const [caretElement, setCaretElement] = useState<HTMLElement | null>(null);
12
- const [caretSize, setCaretSize] = useState({ width: 0, height: 0 });
13
-
14
- useLayoutEffect(() => {
15
- if (precision === 'high' && originDirection !== 'none' && caretElement) {
16
- const rect = caretElement.getBoundingClientRect();
17
- setCaretSize({ width: rect.width, height: rect.height });
18
- }
19
- }, [precision, originDirection, caretElement]);
20
-
21
- return { caretElementRef: setCaretElement, caretSize };
22
- }
@@ -1,49 +0,0 @@
1
- import { useLayoutEffect, useState } from 'react';
2
- import type { Rectangle } from '../../../utils/index.js';
3
-
4
- function getTetherContentRect(element: HTMLElement | null): Rectangle {
5
- if (!element) {
6
- return {
7
- dimensions: { width: 0, height: 0 },
8
- position: { x: 0, y: 0 },
9
- };
10
- }
11
-
12
- const rect = element.getBoundingClientRect();
13
- return {
14
- dimensions: {
15
- width: rect.width,
16
- height: rect.height,
17
- },
18
- position: {
19
- x: rect.left,
20
- y: rect.top,
21
- },
22
- };
23
- }
24
-
25
- export function useTetherContentRect(ref: React.RefObject<HTMLElement>): Rectangle {
26
- const [contentRect, setContentRect] = useState<Rectangle>(() =>
27
- getTetherContentRect(ref.current)
28
- );
29
-
30
- useLayoutEffect(() => {
31
- const update = () => {
32
- setContentRect(getTetherContentRect(ref.current));
33
- };
34
-
35
- update();
36
-
37
- // Track resize events
38
- window.addEventListener('resize', update);
39
- // Track scroll events
40
- window.addEventListener('scroll', update, true);
41
-
42
- return () => {
43
- window.removeEventListener('resize', update);
44
- window.removeEventListener('scroll', update, true);
45
- };
46
- }, [ref]);
47
-
48
- return contentRect;
49
- }
@@ -1,49 +0,0 @@
1
- import { useRef } from 'react';
2
- import type { Position } from '../../../utils/index.js';
3
- import type { HorizontalTether, VerticalTether } from '../types.js';
4
- import {
5
- getOriginDirection,
6
- getOriginOffset,
7
- getOriginPosition,
8
- type CaretDirection,
9
- } from './calculate_origin.js';
10
- import { useTetherContentRect } from './useTetherContentRect.js';
11
-
12
- export interface UseTetherOriginResult {
13
- originPosition: Position;
14
- originOffset: { yOffset: number; xOffset: number };
15
- containerRef: React.RefObject<HTMLDivElement>;
16
- originDirection: CaretDirection;
17
- }
18
-
19
- export function useTetherOrigin(
20
- tetherPosition: Position,
21
- hOrigin: HorizontalTether,
22
- vOrigin: VerticalTether,
23
- precision: 'high' | 'low'
24
- ): UseTetherOriginResult {
25
- const containerRef = useRef<HTMLDivElement>(null);
26
- const containerRect = useTetherContentRect(containerRef);
27
-
28
- // If precision is low, return default values
29
- if (precision === 'low') {
30
- return {
31
- originPosition: tetherPosition,
32
- originOffset: { yOffset: 0, xOffset: 0 },
33
- containerRef,
34
- originDirection: 'none',
35
- };
36
- }
37
-
38
- // Calculate origin values for high precision
39
- const originOffset = getOriginOffset(containerRect, hOrigin, vOrigin);
40
- const originPosition = getOriginPosition(containerRect.position, originOffset);
41
- const originDirection = getOriginDirection(vOrigin, hOrigin);
42
-
43
- return {
44
- originPosition,
45
- originOffset,
46
- containerRef,
47
- originDirection,
48
- };
49
- }