@tcn/ui 0.15.0 → 0.17.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.
Files changed (204) hide show
  1. package/dist/card.css +1 -0
  2. package/dist/column.css +1 -1
  3. package/dist/containers.css +1 -1
  4. package/dist/containers.module-BmICKsOK.js +5 -0
  5. package/dist/containers.module-BmICKsOK.js.map +1 -0
  6. package/dist/form/field/field.js +11 -8
  7. package/dist/form/field/field.js.map +1 -1
  8. package/dist/inputs/color_input/color_picker.js +5 -2
  9. package/dist/inputs/color_input/color_picker.js.map +1 -1
  10. package/dist/inputs/combo_box/combo_box.js +18 -15
  11. package/dist/inputs/combo_box/combo_box.js.map +1 -1
  12. package/dist/inputs/date_picker/date_picker.js +13 -10
  13. package/dist/inputs/date_picker/date_picker.js.map +1 -1
  14. package/dist/inputs/date_picker/date_picker_input.js +20 -17
  15. package/dist/inputs/date_picker/date_picker_input.js.map +1 -1
  16. package/dist/inputs/date_picker/date_picker_year_selector.js +5 -2
  17. package/dist/inputs/date_picker/date_picker_year_selector.js.map +1 -1
  18. package/dist/inputs/mask_input/key_capture_input.js +26 -23
  19. package/dist/inputs/mask_input/key_capture_input.js.map +1 -1
  20. package/dist/inputs/mask_input/mask_input.js +5 -2
  21. package/dist/inputs/mask_input/mask_input.js.map +1 -1
  22. package/dist/inputs/multiselect/multiselect.js +22 -19
  23. package/dist/inputs/multiselect/multiselect.js.map +1 -1
  24. package/dist/inputs/phone_number_input/phone_number_context.js +7 -4
  25. package/dist/inputs/phone_number_input/phone_number_context.js.map +1 -1
  26. package/dist/inputs/select/select.js +5 -2
  27. package/dist/inputs/select/select.js.map +1 -1
  28. package/dist/inputs/slider/slider.js +19 -16
  29. package/dist/inputs/slider/slider.js.map +1 -1
  30. package/dist/inputs/suggestions/suggestion_list.js +5 -2
  31. package/dist/inputs/suggestions/suggestion_list.js.map +1 -1
  32. package/dist/inputs/switch/switch.js +18 -15
  33. package/dist/inputs/switch/switch.js.map +1 -1
  34. package/dist/inputs/unit_input/unit_input.js +15 -12
  35. package/dist/inputs/unit_input/unit_input.js.map +1 -1
  36. package/dist/layouts/containers/columns/column.d.ts +6 -0
  37. package/dist/layouts/containers/columns/column.d.ts.map +1 -0
  38. package/dist/layouts/containers/columns/column.js +20 -0
  39. package/dist/layouts/containers/columns/column.js.map +1 -0
  40. package/dist/layouts/containers/columns/columns.d.ts +11 -0
  41. package/dist/layouts/containers/columns/columns.d.ts.map +1 -0
  42. package/dist/layouts/containers/columns/columns.js +34 -0
  43. package/dist/layouts/containers/columns/columns.js.map +1 -0
  44. package/dist/layouts/containers/rail.d.ts +2 -5
  45. package/dist/layouts/containers/rail.d.ts.map +1 -1
  46. package/dist/layouts/containers/rail.js +17 -55
  47. package/dist/layouts/containers/rail.js.map +1 -1
  48. package/dist/layouts/containers/rows/index.d.ts +3 -0
  49. package/dist/layouts/containers/rows/index.d.ts.map +1 -0
  50. package/dist/layouts/containers/rows/index.js +7 -0
  51. package/dist/layouts/containers/rows/index.js.map +1 -0
  52. package/dist/layouts/containers/rows/row.d.ts +6 -0
  53. package/dist/layouts/containers/rows/row.d.ts.map +1 -0
  54. package/dist/layouts/containers/rows/row.js +20 -0
  55. package/dist/layouts/containers/rows/row.js.map +1 -0
  56. package/dist/layouts/containers/rows/rows.d.ts +11 -0
  57. package/dist/layouts/containers/rows/rows.d.ts.map +1 -0
  58. package/dist/layouts/containers/rows/rows.js +34 -0
  59. package/dist/layouts/containers/rows/rows.js.map +1 -0
  60. package/dist/layouts/containers/scaffold.d.ts +2 -5
  61. package/dist/layouts/containers/scaffold.d.ts.map +1 -1
  62. package/dist/layouts/containers/scaffold.js +17 -55
  63. package/dist/layouts/containers/scaffold.js.map +1 -1
  64. package/dist/layouts/index.d.ts +4 -2
  65. package/dist/layouts/index.d.ts.map +1 -1
  66. package/dist/layouts/index.js +35 -31
  67. package/dist/layouts/index.js.map +1 -1
  68. package/dist/mobile/inputs/date_picker/mobile_date_picker_header.js +5 -2
  69. package/dist/mobile/inputs/date_picker/mobile_date_picker_header.js.map +1 -1
  70. package/dist/mobile/inputs/date_picker/mobile_date_picker_input.js +5 -2
  71. package/dist/mobile/inputs/date_picker/mobile_date_picker_input.js.map +1 -1
  72. package/dist/mobile/inputs/date_picker/mobile_date_picker_year_selector.js +8 -5
  73. package/dist/mobile/inputs/date_picker/mobile_date_picker_year_selector.js.map +1 -1
  74. package/dist/navigation/tabs/state/link/tab_link.js +9 -6
  75. package/dist/navigation/tabs/state/link/tab_link.js.map +1 -1
  76. package/dist/overlay/menu/menu.js +3 -0
  77. package/dist/overlay/menu/menu.js.map +1 -1
  78. package/dist/overlay/popper/context_popper.js +8 -5
  79. package/dist/overlay/popper/context_popper.js.map +1 -1
  80. package/dist/overlay/popper/element_popper.js +9 -6
  81. package/dist/overlay/popper/element_popper.js.map +1 -1
  82. package/dist/overlay/popper/legacy/popper.js +13 -10
  83. package/dist/overlay/popper/legacy/popper.js.map +1 -1
  84. package/dist/overlay/popper/preview_popper.js +10 -7
  85. package/dist/overlay/popper/preview_popper.js.map +1 -1
  86. package/dist/overlay/tethered/tethered.js +11 -8
  87. package/dist/overlay/tethered/tethered.js.map +1 -1
  88. package/dist/resizable.css +1 -0
  89. package/dist/resizable.module-I6iyBAvM.js +5 -0
  90. package/dist/resizable.module-I6iyBAvM.js.map +1 -0
  91. package/dist/resize_handle.css +1 -0
  92. package/dist/row.css +1 -0
  93. package/dist/stacks/box/box.js +12 -9
  94. package/dist/stacks/box/box.js.map +1 -1
  95. package/dist/stacks/box/detect_resize_bounds.d.ts +1 -0
  96. package/dist/stacks/box/detect_resize_bounds.d.ts.map +1 -1
  97. package/dist/stacks/box/detect_resize_bounds.js +22 -20
  98. package/dist/stacks/box/detect_resize_bounds.js.map +1 -1
  99. package/dist/stacks/h_collapsible_box.js +17 -14
  100. package/dist/stacks/h_collapsible_box.js.map +1 -1
  101. package/dist/stacks/v_collapsible_box.js +19 -16
  102. package/dist/stacks/v_collapsible_box.js.map +1 -1
  103. package/dist/surfaces/card/card.d.ts.map +1 -1
  104. package/dist/surfaces/card/card.js +14 -6
  105. package/dist/surfaces/card/card.js.map +1 -1
  106. package/dist/surfaces/pop_confirm/pop_confirm.js +6 -4
  107. package/dist/surfaces/pop_confirm/pop_confirm.js.map +1 -1
  108. package/dist/test-setup.d.ts +2 -0
  109. package/dist/test-setup.d.ts.map +1 -0
  110. package/dist/test-setup.js +10 -0
  111. package/dist/test-setup.js.map +1 -0
  112. package/dist/themes/theme.d.ts.map +1 -1
  113. package/dist/themes/theme.js +17 -22
  114. package/dist/themes/theme.js.map +1 -1
  115. package/dist/themes/themes/ergo/ergo_theme.css +1 -1
  116. package/dist/themes/themes/ergo/ergo_theme.js +225 -27
  117. package/dist/themes/themes/ergo/ergo_theme.js.map +1 -1
  118. package/dist/utils/index.d.ts +1 -0
  119. package/dist/utils/index.d.ts.map +1 -1
  120. package/dist/utils/index.js +39 -26
  121. package/dist/utils/index.js.map +1 -1
  122. package/dist/utils/resize/context.d.ts +4 -0
  123. package/dist/utils/resize/context.d.ts.map +1 -0
  124. package/dist/utils/resize/context.js +10 -0
  125. package/dist/utils/resize/context.js.map +1 -0
  126. package/dist/utils/resize/handle_config.d.ts +32 -0
  127. package/dist/utils/resize/handle_config.d.ts.map +1 -0
  128. package/dist/utils/resize/handle_config.js +85 -0
  129. package/dist/utils/resize/handle_config.js.map +1 -0
  130. package/dist/utils/resize/index.d.ts +10 -0
  131. package/dist/utils/resize/index.d.ts.map +1 -0
  132. package/dist/utils/resize/index.js +16 -0
  133. package/dist/utils/resize/index.js.map +1 -0
  134. package/dist/utils/resize/resizable.d.ts +11 -0
  135. package/dist/utils/resize/resizable.d.ts.map +1 -0
  136. package/dist/utils/resize/resizable.js +52 -0
  137. package/dist/utils/resize/resizable.js.map +1 -0
  138. package/dist/utils/resize/resize_handle.d.ts +7 -0
  139. package/dist/utils/resize/resize_handle.d.ts.map +1 -0
  140. package/dist/utils/resize/resize_handle.js +100 -0
  141. package/dist/utils/resize/resize_handle.js.map +1 -0
  142. package/dist/utils/resize/resize_strategy.d.ts +47 -0
  143. package/dist/utils/resize/resize_strategy.d.ts.map +1 -0
  144. package/dist/utils/resize/resize_strategy.js +108 -0
  145. package/dist/utils/resize/resize_strategy.js.map +1 -0
  146. package/dist/utils/resize/types.d.ts +28 -0
  147. package/dist/utils/resize/types.d.ts.map +1 -0
  148. package/dist/utils/resize/types.js +2 -0
  149. package/dist/utils/resize/types.js.map +1 -0
  150. package/package.json +3 -3
  151. package/src/layouts/__stories__/columns.stories.tsx +77 -0
  152. package/src/layouts/__stories__/composed.stories.tsx +77 -8
  153. package/src/layouts/__stories__/rail.stories.tsx +4 -4
  154. package/src/layouts/__stories__/rows.stories.tsx +77 -0
  155. package/src/layouts/__stories__/utils.tsx +2 -84
  156. package/src/layouts/containers/columns/column.module.css +15 -0
  157. package/src/layouts/containers/columns/column.tsx +22 -0
  158. package/src/layouts/containers/columns/columns.tsx +42 -0
  159. package/src/layouts/containers/containers.module.css +27 -29
  160. package/src/layouts/containers/rail.tsx +9 -51
  161. package/src/layouts/containers/rows/index.ts +2 -0
  162. package/src/layouts/containers/rows/row.module.css +15 -0
  163. package/src/layouts/containers/rows/row.tsx +22 -0
  164. package/src/layouts/containers/rows/rows.tsx +42 -0
  165. package/src/layouts/containers/scaffold.tsx +9 -49
  166. package/src/layouts/index.ts +4 -2
  167. package/src/stacks/box/detect_resize_bounds.ts +5 -1
  168. package/src/surfaces/card/card.module.css +5 -0
  169. package/src/surfaces/card/card.stories.tsx +66 -8
  170. package/src/surfaces/card/card.tsx +6 -2
  171. package/src/surfaces/page/page.stories.tsx +109 -25
  172. package/src/surfaces/panel/__stories__/panel.stories.tsx +139 -1
  173. package/src/test-setup.ts +11 -0
  174. package/src/themes/theme.tsx +6 -16
  175. package/src/themes/themes/ergo/ergo_theme.css +223 -25
  176. package/src/utils/index.ts +2 -0
  177. package/src/utils/resize/__stories__/resizable.stories.tsx +214 -0
  178. package/src/utils/resize/__stories__/resizable_stories.module.css +47 -0
  179. package/src/utils/resize/__tests__/handle_config.test.ts +269 -0
  180. package/src/utils/resize/__tests__/resize_strategy.test.ts +163 -0
  181. package/src/utils/resize/context.ts +9 -0
  182. package/src/utils/resize/handle_config.ts +142 -0
  183. package/src/utils/resize/index.ts +37 -0
  184. package/src/utils/resize/resizable.module.css +5 -0
  185. package/src/utils/resize/resizable.tsx +97 -0
  186. package/src/utils/resize/resize_handle.module.css +146 -0
  187. package/src/utils/resize/resize_handle.tsx +165 -0
  188. package/src/utils/resize/resize_strategy.ts +190 -0
  189. package/src/utils/resize/types.ts +64 -0
  190. package/dist/containers.module-DlGySre0.js +0 -5
  191. package/dist/containers.module-DlGySre0.js.map +0 -1
  192. package/dist/layouts/column/column.d.ts +0 -10
  193. package/dist/layouts/column/column.d.ts.map +0 -1
  194. package/dist/layouts/column/column.js +0 -52
  195. package/dist/layouts/column/column.js.map +0 -1
  196. package/dist/layouts/containers/side/side.d.ts +0 -6
  197. package/dist/layouts/containers/side/side.d.ts.map +0 -1
  198. package/dist/layouts/containers/side/side.js +0 -22
  199. package/dist/layouts/containers/side/side.js.map +0 -1
  200. package/dist/side.css +0 -1
  201. package/src/layouts/column/column.module.css +0 -35
  202. package/src/layouts/column/column.tsx +0 -57
  203. package/src/layouts/containers/side/side.module.css +0 -7
  204. package/src/layouts/containers/side/side.tsx +0 -25
package/dist/card.css ADDED
@@ -0,0 +1 @@
1
+ @layer tcn-system{._card_a3c9492{height:auto}}
package/dist/column.css CHANGED
@@ -1 +1 @@
1
- @layer tcn-system{:where(._column_ce05462){min-width:250px;height:100%;min-height:100%}:where(._column-stack_80b940b){gap:8px;padding:8px;width:100%;height:100%}:where(._column_ce05462:after){content:"";position:absolute;bottom:var(--padding);top:var(--padding);right:0;width:1px;background-color:#ddd}:where(._column_ce05462:last-child:after){display:none}:where(.h-stack>._column_ce05462[data-width=default]){width:auto;flex-basis:auto;flex-grow:0;flex-shrink:0}}
1
+ @layer tcn-system{:where(._column_f14ce93){height:100%;min-height:100%;width:var(--columns-width, auto);min-width:var(--columns-min-width, 0);max-width:var(--columns-max-width, none);flex-grow:0}:where(._column_f14ce93[data-width=fill]){flex-grow:1;width:0}}
@@ -1 +1 @@
1
- @layer tcn-system{:where(._scaffold_7e9ff51){max-height:100%;width:100%;height:auto}:where(._rail_9474c96){max-width:100%;height:100%;width:auto}:where(._container_336e83e)>:where(._container-stack_0d2e80a){width:100%;height:100%}:where(._scaffold_7e9ff51)>:where(._scaffold-stack_3a72ba8){overflow-y:auto}:where(._scaffold_7e9ff51)>:where(._scaffold-stack_3a72ba8)>:where(._rail_9474c96){width:100%}:where(._rail_9474c96)>:where(._rail-stack_2e4d934)>:where(._scaffold_7e9ff51){height:100%}:where(._rail_9474c96)>:where(._rail-stack_2e4d934){overflow-x:auto}:where(._container-stack_0d2e80a)>:where(._container_336e83e){flex-grow:1}:where(._container-stack_0d2e80a)>:where(._scaffold_7e9ff51){min-height:0;overflow-y:auto}:where(._container-stack_0d2e80a)>:where(._rail_9474c96){min-width:0;overflow-x:auto}}
1
+ @layer tcn-system{:where(._scaffold_7e9ff51){height:100%;width:100%;max-height:100%;overflow:auto}:where(._rail_9474c96){max-width:100%;height:100%;width:100%;overflow:auto}:where(._container_336e83e)>._container_336e83e{flex-grow:1;flex-shrink:unset}:where(._container_336e83e)>._scaffold_7e9ff51{overflow-y:auto;min-height:0}:where(._scaffold_7e9ff51)>._scaffold_7e9ff51{height:auto}:where(._container_336e83e)>._rail_9474c96{overflow-x:auto;min-width:0}:where(._rail_9474c96)>._rail_9474c96{width:auto}:where(._rail_9474c96)>._container_336e83e{height:100%}:where(._scaffold_7e9ff51)>._container_336e83e{width:100%}}
@@ -0,0 +1,5 @@
1
+ import './containers.css';const s = "_scaffold_7e9ff51", c = "_rail_9474c96", o = "_container_336e83e", n = { scaffold: s, rail: c, container: o };
2
+ export {
3
+ n as s
4
+ };
5
+ //# sourceMappingURL=containers.module-BmICKsOK.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"containers.module-BmICKsOK.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -1,5 +1,5 @@
1
- import { jsx as r, Fragment as a } from "react/jsx-runtime";
2
- import c, { useState as p } from "react";
1
+ import { jsx as t, Fragment as d } from "react/jsx-runtime";
2
+ import a, { useState as c } from "react";
3
3
  import { HField as u } from "./h_field/h_field.js";
4
4
  import { VField as F } from "./v_field/v_field.js";
5
5
  import "../../utils/click_away_listener.js";
@@ -10,13 +10,16 @@ import { useResizeObserver as l } from "../../utils/hooks/use_resize_observer.js
10
10
  import "../../utils/dnd/context.js";
11
11
  import "clsx";
12
12
  import "../../draggable.module-BgelQsuJ.js";
13
- const O = c.forwardRef(function({ children: t, breakpointPixels: i = 500, ...e }, m) {
14
- const [f, n] = p(!0), s = l((d) => {
15
- n(d >= i);
16
- }), o = R(m, s);
17
- return /* @__PURE__ */ r(a, { children: f ? /* @__PURE__ */ r(u, { ...e, ref: o, ...e, children: t }) : /* @__PURE__ */ r(F, { ...e, ref: o, ...e, children: t }) });
13
+ import "../../utils/resize/context.js";
14
+ import "../../resizable.module-I6iyBAvM.js";
15
+ import "../../utils/resize/resize_handle.js";
16
+ const h = a.forwardRef(function({ children: e, breakpointPixels: i = 500, ...r }, m) {
17
+ const [f, n] = c(!0), p = l((s) => {
18
+ n(s >= i);
19
+ }), o = R(m, p);
20
+ return /* @__PURE__ */ t(d, { children: f ? /* @__PURE__ */ t(u, { ...r, ref: o, ...r, children: e }) : /* @__PURE__ */ t(F, { ...r, ref: o, ...r, children: e }) });
18
21
  });
19
22
  export {
20
- O as Field
23
+ h as Field
21
24
  };
22
25
  //# sourceMappingURL=field.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"field.js","sources":["../../../src/form/field/field.tsx"],"sourcesContent":["import React, { useState } from 'react';\nimport type { FieldInput } from './common/types.js';\nimport { HField } from './h_field/h_field.js';\nimport { VField } from './v_field/v_field.js';\nimport { useForkRef, useResizeObserver } from '../../utils/index.js';\nimport type { StackStyleProps } from '../../stacks/types/styles.js';\n\nexport interface FieldProps extends FieldInput, StackStyleProps {\n children: React.ReactNode;\n breakpointPixels?: number;\n labelWidth?: string;\n}\n\nexport const Field = React.forwardRef(function Field(\n { children, breakpointPixels = 500, ...props }: FieldProps,\n ref: React.Ref<HTMLDivElement>\n) {\n const [isWideContainer, setIsWideContainer] = useState(true);\n const containerRef = useResizeObserver(newWidth => {\n setIsWideContainer(newWidth >= breakpointPixels);\n });\n const forkedRef = useForkRef(ref, containerRef);\n\n return (\n <>\n {isWideContainer ? (\n <HField {...props} ref={forkedRef} {...props}>\n {children}\n </HField>\n ) : (\n <VField {...props} ref={forkedRef} {...props}>\n {children}\n </VField>\n )}\n </>\n );\n});\n"],"names":["Field","React","children","breakpointPixels","props","ref","isWideContainer","setIsWideContainer","useState","containerRef","useResizeObserver","newWidth","forkedRef","useForkRef","jsx","Fragment","HField","VField"],"mappings":";;;;;;;;;;;;AAaO,MAAMA,IAAQC,EAAM,WAAW,SACpC,EAAE,UAAAC,GAAU,kBAAAC,IAAmB,KAAK,GAAGC,EAAA,GACvCC,GACA;AACA,QAAM,CAACC,GAAiBC,CAAkB,IAAIC,EAAS,EAAI,GACrDC,IAAeC,EAAkB,CAAAC,MAAY;AACjD,IAAAJ,EAAmBI,KAAYR,CAAgB;AAAA,EACjD,CAAC,GACKS,IAAYC,EAAWR,GAAKI,CAAY;AAE9C,SACE,gBAAAK,EAAAC,GAAA,EACG,cACC,gBAAAD,EAACE,GAAA,EAAQ,GAAGZ,GAAO,KAAKQ,GAAY,GAAGR,GACpC,UAAAF,GACH,IAEA,gBAAAY,EAACG,KAAQ,GAAGb,GAAO,KAAKQ,GAAY,GAAGR,GACpC,UAAAF,EAAA,CACH,EAAA,CAEJ;AAEJ,CAAC;"}
1
+ {"version":3,"file":"field.js","sources":["../../../src/form/field/field.tsx"],"sourcesContent":["import React, { useState } from 'react';\nimport type { FieldInput } from './common/types.js';\nimport { HField } from './h_field/h_field.js';\nimport { VField } from './v_field/v_field.js';\nimport { useForkRef, useResizeObserver } from '../../utils/index.js';\nimport type { StackStyleProps } from '../../stacks/types/styles.js';\n\nexport interface FieldProps extends FieldInput, StackStyleProps {\n children: React.ReactNode;\n breakpointPixels?: number;\n labelWidth?: string;\n}\n\nexport const Field = React.forwardRef(function Field(\n { children, breakpointPixels = 500, ...props }: FieldProps,\n ref: React.Ref<HTMLDivElement>\n) {\n const [isWideContainer, setIsWideContainer] = useState(true);\n const containerRef = useResizeObserver(newWidth => {\n setIsWideContainer(newWidth >= breakpointPixels);\n });\n const forkedRef = useForkRef(ref, containerRef);\n\n return (\n <>\n {isWideContainer ? (\n <HField {...props} ref={forkedRef} {...props}>\n {children}\n </HField>\n ) : (\n <VField {...props} ref={forkedRef} {...props}>\n {children}\n </VField>\n )}\n </>\n );\n});\n"],"names":["Field","React","children","breakpointPixels","props","ref","isWideContainer","setIsWideContainer","useState","containerRef","useResizeObserver","newWidth","forkedRef","useForkRef","jsx","Fragment","HField","VField"],"mappings":";;;;;;;;;;;;;;;AAaO,MAAMA,IAAQC,EAAM,WAAW,SACpC,EAAE,UAAAC,GAAU,kBAAAC,IAAmB,KAAK,GAAGC,EAAA,GACvCC,GACA;AACA,QAAM,CAACC,GAAiBC,CAAkB,IAAIC,EAAS,EAAI,GACrDC,IAAeC,EAAkB,CAAAC,MAAY;AACjD,IAAAJ,EAAmBI,KAAYR,CAAgB;AAAA,EACjD,CAAC,GACKS,IAAYC,EAAWR,GAAKI,CAAY;AAE9C,SACE,gBAAAK,EAAAC,GAAA,EACG,cACC,gBAAAD,EAACE,GAAA,EAAQ,GAAGZ,GAAO,KAAKQ,GAAY,GAAGR,GACpC,UAAAF,GACH,IAEA,gBAAAY,EAACG,KAAQ,GAAGb,GAAO,KAAKQ,GAAY,GAAGR,GACpC,UAAAF,EAAA,CACH,EAAA,CAEJ;AAEJ,CAAC;"}
@@ -8,9 +8,12 @@ import "../../utils/hooks/use_resize_observer.js";
8
8
  import "../../utils/dnd/context.js";
9
9
  import { clsx as e } from "clsx";
10
10
  import "../../draggable.module-BgelQsuJ.js";
11
+ import "../../utils/resize/context.js";
12
+ import "../../resizable.module-I6iyBAvM.js";
13
+ import "../../utils/resize/resize_handle.js";
11
14
  import { ZStack as u } from "../../stacks/z_stack.js";
12
15
  import { ChromePicker as h } from "react-color";
13
- import '../../color_picker.css';const d = "_color-picker_4757d5a", R = "_chrome-picker_2f64060", c = { "color-picker": d, "chrome-picker": R }, L = s.forwardRef(function({ color: t, onColorChange: i, className: m, ...p }, f) {
16
+ import '../../color_picker.css';const d = "_color-picker_4757d5a", R = "_chrome-picker_2f64060", c = { "color-picker": d, "chrome-picker": R }, q = s.forwardRef(function({ color: t, onColorChange: i, className: m, ...p }, f) {
14
17
  const r = a(null), n = l(r, f);
15
18
  return k(() => {
16
19
  r.current && r.current.focus();
@@ -36,6 +39,6 @@ import '../../color_picker.css';const d = "_color-picker_4757d5a", R = "_chrome-
36
39
  );
37
40
  });
38
41
  export {
39
- L as ColorPicker
42
+ q as ColorPicker
40
43
  };
41
44
  //# sourceMappingURL=color_picker.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"color_picker.js","sources":["../../../src/inputs/color_input/color_picker.tsx"],"sourcesContent":["import { useForkRef } from '../../utils/index.js';\nimport { ZStack } from '../../stacks/z_stack.js';\nimport { clsx } from 'clsx';\nimport React, { HTMLAttributes, useLayoutEffect, useRef } from 'react';\nimport { ChromePicker, Color, type ColorResult } from 'react-color';\nimport styles from './color_picker.module.css';\n\nexport interface ColorPickerProps extends Omit<HTMLAttributes<HTMLDivElement>, 'color'> {\n color: Color;\n onColorChange: (color: ColorResult) => void;\n}\n\nexport const ColorPicker = React.forwardRef(function ColorPicker(\n { color, onColorChange, className, ...props }: ColorPickerProps,\n ref: React.Ref<HTMLDivElement>\n) {\n const padRef = useRef<HTMLDivElement | null>(null);\n const forkedRef = useForkRef(padRef, ref);\n\n useLayoutEffect(() => {\n padRef.current && padRef.current.focus();\n }, []);\n\n return (\n <ZStack\n tabIndex={0}\n ref={forkedRef}\n padding=\"8px\"\n height=\"auto\"\n width=\"auto\"\n className={clsx(styles['color-picker'], 'tcn-color-picker', className)}\n {...props}\n >\n <ChromePicker\n className={clsx(styles['chrome-picker'], 'tcn-chrome-picker')}\n color={color}\n onChange={onColorChange}\n />\n </ZStack>\n );\n});\n"],"names":["ColorPicker","React","color","onColorChange","className","props","ref","padRef","useRef","forkedRef","useForkRef","useLayoutEffect","jsx","ZStack","clsx","styles","ChromePicker"],"mappings":";;;;;;;;;;;;gHAYaA,IAAcC,EAAM,WAAW,SAC1C,EAAE,OAAAC,GAAO,eAAAC,GAAe,WAAAC,GAAW,GAAGC,EAAA,GACtCC,GACA;AACA,QAAMC,IAASC,EAA8B,IAAI,GAC3CC,IAAYC,EAAWH,GAAQD,CAAG;AAExC,SAAAK,EAAgB,MAAM;AACpB,IAAAJ,EAAO,WAAWA,EAAO,QAAQ,MAAA;AAAA,EACnC,GAAG,CAAA,CAAE,GAGH,gBAAAK;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,UAAU;AAAA,MACV,KAAKJ;AAAA,MACL,SAAQ;AAAA,MACR,QAAO;AAAA,MACP,OAAM;AAAA,MACN,WAAWK,EAAKC,EAAO,cAAc,GAAG,oBAAoBX,CAAS;AAAA,MACpE,GAAGC;AAAA,MAEJ,UAAA,gBAAAO;AAAA,QAACI;AAAA,QAAA;AAAA,UACC,WAAWF,EAAKC,EAAO,eAAe,GAAG,mBAAmB;AAAA,UAC5D,OAAAb;AAAA,UACA,UAAUC;AAAA,QAAA;AAAA,MAAA;AAAA,IACZ;AAAA,EAAA;AAGN,CAAC;"}
1
+ {"version":3,"file":"color_picker.js","sources":["../../../src/inputs/color_input/color_picker.tsx"],"sourcesContent":["import { useForkRef } from '../../utils/index.js';\nimport { ZStack } from '../../stacks/z_stack.js';\nimport { clsx } from 'clsx';\nimport React, { HTMLAttributes, useLayoutEffect, useRef } from 'react';\nimport { ChromePicker, Color, type ColorResult } from 'react-color';\nimport styles from './color_picker.module.css';\n\nexport interface ColorPickerProps extends Omit<HTMLAttributes<HTMLDivElement>, 'color'> {\n color: Color;\n onColorChange: (color: ColorResult) => void;\n}\n\nexport const ColorPicker = React.forwardRef(function ColorPicker(\n { color, onColorChange, className, ...props }: ColorPickerProps,\n ref: React.Ref<HTMLDivElement>\n) {\n const padRef = useRef<HTMLDivElement | null>(null);\n const forkedRef = useForkRef(padRef, ref);\n\n useLayoutEffect(() => {\n padRef.current && padRef.current.focus();\n }, []);\n\n return (\n <ZStack\n tabIndex={0}\n ref={forkedRef}\n padding=\"8px\"\n height=\"auto\"\n width=\"auto\"\n className={clsx(styles['color-picker'], 'tcn-color-picker', className)}\n {...props}\n >\n <ChromePicker\n className={clsx(styles['chrome-picker'], 'tcn-chrome-picker')}\n color={color}\n onChange={onColorChange}\n />\n </ZStack>\n );\n});\n"],"names":["ColorPicker","React","color","onColorChange","className","props","ref","padRef","useRef","forkedRef","useForkRef","useLayoutEffect","jsx","ZStack","clsx","styles","ChromePicker"],"mappings":";;;;;;;;;;;;;;;gHAYaA,IAAcC,EAAM,WAAW,SAC1C,EAAE,OAAAC,GAAO,eAAAC,GAAe,WAAAC,GAAW,GAAGC,EAAA,GACtCC,GACA;AACA,QAAMC,IAASC,EAA8B,IAAI,GAC3CC,IAAYC,EAAWH,GAAQD,CAAG;AAExC,SAAAK,EAAgB,MAAM;AACpB,IAAAJ,EAAO,WAAWA,EAAO,QAAQ,MAAA;AAAA,EACnC,GAAG,CAAA,CAAE,GAGH,gBAAAK;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,UAAU;AAAA,MACV,KAAKJ;AAAA,MACL,SAAQ;AAAA,MACR,QAAO;AAAA,MACP,OAAM;AAAA,MACN,WAAWK,EAAKC,EAAO,cAAc,GAAG,oBAAoBX,CAAS;AAAA,MACpE,GAAGC;AAAA,MAEJ,UAAA,gBAAAO;AAAA,QAACI;AAAA,QAAA;AAAA,UACC,WAAWF,EAAKC,EAAO,eAAe,GAAG,mBAAmB;AAAA,UAC5D,OAAAb;AAAA,UACA,UAAUC;AAAA,QAAA;AAAA,MAAA;AAAA,IACZ;AAAA,EAAA;AAGN,CAAC;"}
@@ -8,9 +8,12 @@ import "../../utils/hooks/use_resize_observer.js";
8
8
  import "../../utils/dnd/context.js";
9
9
  import { clsx as G } from "clsx";
10
10
  import "../../draggable.module-BgelQsuJ.js";
11
+ import "../../utils/resize/context.js";
12
+ import "../../resizable.module-I6iyBAvM.js";
13
+ import "../../utils/resize/resize_handle.js";
11
14
  import { SuggestionList as H } from "../suggestions/suggestion_list.js";
12
15
  import { Input as J } from "../input/input.js";
13
- const oe = N.forwardRef(function({
16
+ const ce = N.forwardRef(function({
14
17
  onOptionSelect: m,
15
18
  children: O = [],
16
19
  onKeyDown: r,
@@ -23,41 +26,41 @@ const oe = N.forwardRef(function({
23
26
  onMouseUp: h,
24
27
  ...i
25
28
  }, A) {
26
- const E = c(!1), [F, d] = f(o), S = c(o), n = c(!1), [V, y] = f(null), a = c(null), [R, x] = f(!1), I = z(A, a);
29
+ const E = c(!1), [F, d] = f(o), S = c(o), t = c(!1), [V, y] = f(null), a = c(null), [R, x] = f(!1), I = z(A, a);
27
30
  function l() {
28
31
  x(!0);
29
32
  }
30
33
  function u() {
31
- n.current = !1, d(""), x(!1);
34
+ t.current = !1, d(""), x(!1);
32
35
  }
33
- function M(e, t, w) {
34
- n.current = !0;
36
+ function M(e, n, w) {
37
+ t.current = !0;
35
38
  const s = a.current;
36
39
  requestAnimationFrame(() => {
37
- s != null && (s.value = e, s.focus(), s.setSelectionRange(t, w));
40
+ s != null && (s.value = e, s.focus(), s.setSelectionRange(n, w));
38
41
  }), i.onChange && i.onChange(e), u();
39
42
  }
40
43
  function j(e) {
41
- n.current = !0;
42
- const t = a.current;
43
- t?.focus(), u(), m && m(e);
44
+ t.current = !0;
45
+ const n = a.current;
46
+ n?.focus(), u(), m && m(e);
44
47
  }
45
48
  function B(e) {
46
- if (S.current = e.currentTarget.value, n.current) {
47
- n.current = !1, r && r(e);
49
+ if (S.current = e.currentTarget.value, t.current) {
50
+ t.current = !1, r && r(e);
48
51
  return;
49
52
  }
50
53
  r && r(e);
51
54
  }
52
55
  function U(e) {
53
- const t = e.key;
54
- d(e.currentTarget.value), t === "Enter" && (R ? u() : (l(), e.preventDefault())), S.current !== e.currentTarget.value && l(), p && p(e);
56
+ const n = e.key;
57
+ d(e.currentTarget.value), n === "Enter" && (R ? u() : (l(), e.preventDefault())), S.current !== e.currentTarget.value && l(), p && p(e);
55
58
  }
56
59
  function _(e) {
57
60
  y(e.currentTarget), E.current = document.activeElement === e.currentTarget, g && g(e);
58
61
  }
59
62
  function q(e) {
60
- n.current && (n.current = !1, u()), l(), h && h(e);
63
+ t.current && (t.current = !1, u()), l(), h && h(e);
61
64
  }
62
65
  return /* @__PURE__ */ D(L, { children: [
63
66
  /* @__PURE__ */ C(
@@ -91,6 +94,6 @@ const oe = N.forwardRef(function({
91
94
  ] });
92
95
  });
93
96
  export {
94
- oe as ComboBox
97
+ ce as ComboBox
95
98
  };
96
99
  //# sourceMappingURL=combo_box.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"combo_box.js","sources":["../../../src/inputs/combo_box/combo_box.tsx"],"sourcesContent":["import { useForkRef } from '../../utils/index.js';\nimport { clsx } from 'clsx';\nimport React, { useRef, useState } from 'react';\nimport { SuggestionList } from '../suggestions/suggestion_list.js';\nimport { Input, InputProps } from '../input/input.js';\nimport { OptionProps } from '../options/option.js';\n\nexport interface ComboBoxProps extends InputProps {\n children?: React.ReactElement<OptionProps>[] | React.ReactElement<OptionProps>;\n onOptionSelect?: (value: string) => void;\n noOptionMatchedMessage?: React.ReactNode;\n trimCustomInput?: boolean;\n}\n\nexport const ComboBox = React.forwardRef(function ComboBox(\n {\n onOptionSelect: onSuggestionSelect,\n children = [],\n onKeyDown,\n onKeyUp,\n value,\n noOptionMatchedMessage,\n trimCustomInput = false,\n className,\n onMouseDown,\n onMouseUp,\n ...props\n }: ComboBoxProps,\n ref: React.Ref<HTMLInputElement>\n) {\n const isAlreadyFocusedRef = useRef(false);\n const [searchValue, setSearchValue] = useState(value);\n const valueRef = useRef(value);\n const isClosingRef = useRef(false);\n const [anchorElement, setAnchorElement] = useState<HTMLInputElement | null>(null);\n const internalInputRef = useRef<HTMLInputElement | null>(null);\n const [isSuggestionsOpen, setIsSuggestionsOpen] = useState(false);\n const forkedRef = useForkRef(ref, internalInputRef);\n\n function openSuggestions() {\n setIsSuggestionsOpen(true);\n }\n\n function closeSuggestions() {\n isClosingRef.current = false;\n setSearchValue('');\n setIsSuggestionsOpen(false);\n }\n\n function handleClose(\n value: string,\n selectionStart: number | null,\n selectionEnd: number | null\n ) {\n isClosingRef.current = true;\n const input = internalInputRef.current;\n\n requestAnimationFrame(() => {\n if (input != null) {\n input.value = value;\n input.focus();\n input.setSelectionRange(selectionStart, selectionEnd);\n }\n });\n props.onChange && props.onChange(value);\n closeSuggestions();\n }\n\n function handleSelection(value: string) {\n isClosingRef.current = true;\n const input = internalInputRef.current;\n\n if (input != null) {\n input.focus();\n }\n\n closeSuggestions();\n onSuggestionSelect && onSuggestionSelect(value);\n }\n\n function handleKeyDown(event: React.KeyboardEvent<HTMLInputElement>) {\n valueRef.current = event.currentTarget.value;\n\n if (isClosingRef.current) {\n isClosingRef.current = false;\n onKeyDown && onKeyDown(event);\n return;\n }\n\n onKeyDown && onKeyDown(event);\n }\n\n function handleKeyUp(event: React.KeyboardEvent<HTMLInputElement>) {\n const key = event.key;\n\n setSearchValue(event.currentTarget.value);\n\n if (key === 'Enter') {\n if (isSuggestionsOpen) {\n closeSuggestions();\n } else {\n openSuggestions();\n event.preventDefault();\n }\n }\n\n if (valueRef.current !== event.currentTarget.value) {\n openSuggestions();\n }\n\n onKeyUp && onKeyUp(event);\n }\n\n function handlMouseDown(event: React.MouseEvent<HTMLInputElement>) {\n setAnchorElement(event.currentTarget);\n isAlreadyFocusedRef.current = document.activeElement === event.currentTarget;\n onMouseDown && onMouseDown(event);\n }\n\n function handleMouseUp(event: React.MouseEvent<HTMLInputElement>) {\n if (isClosingRef.current) {\n isClosingRef.current = false;\n closeSuggestions();\n }\n\n openSuggestions();\n onMouseUp && onMouseUp(event);\n }\n\n return (\n <>\n <Input\n ref={forkedRef}\n className={clsx(className, 'tcn-combo-box-input')}\n {...props}\n value={value}\n onKeyDown={handleKeyDown}\n onKeyUp={handleKeyUp}\n onMouseDown={handlMouseDown}\n onMouseUp={handleMouseUp}\n />\n <SuggestionList\n open={isSuggestionsOpen}\n anchorElement={anchorElement}\n onClose={handleClose}\n value={value}\n initialSearchValue={searchValue}\n trimCustomInput={trimCustomInput}\n onOptionSelect={handleSelection}\n noSuggestionMessage={noOptionMatchedMessage}\n haveValueAsOption={true}\n >\n {children}\n </SuggestionList>\n </>\n );\n});\n"],"names":["ComboBox","React","onSuggestionSelect","children","onKeyDown","onKeyUp","value","noOptionMatchedMessage","trimCustomInput","className","onMouseDown","onMouseUp","props","ref","isAlreadyFocusedRef","useRef","searchValue","setSearchValue","useState","valueRef","isClosingRef","anchorElement","setAnchorElement","internalInputRef","isSuggestionsOpen","setIsSuggestionsOpen","forkedRef","useForkRef","openSuggestions","closeSuggestions","handleClose","selectionStart","selectionEnd","input","handleSelection","handleKeyDown","event","handleKeyUp","key","handlMouseDown","handleMouseUp","jsxs","Fragment","jsx","Input","clsx","SuggestionList"],"mappings":"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"}
1
+ {"version":3,"file":"combo_box.js","sources":["../../../src/inputs/combo_box/combo_box.tsx"],"sourcesContent":["import { useForkRef } from '../../utils/index.js';\nimport { clsx } from 'clsx';\nimport React, { useRef, useState } from 'react';\nimport { SuggestionList } from '../suggestions/suggestion_list.js';\nimport { Input, InputProps } from '../input/input.js';\nimport { OptionProps } from '../options/option.js';\n\nexport interface ComboBoxProps extends InputProps {\n children?: React.ReactElement<OptionProps>[] | React.ReactElement<OptionProps>;\n onOptionSelect?: (value: string) => void;\n noOptionMatchedMessage?: React.ReactNode;\n trimCustomInput?: boolean;\n}\n\nexport const ComboBox = React.forwardRef(function ComboBox(\n {\n onOptionSelect: onSuggestionSelect,\n children = [],\n onKeyDown,\n onKeyUp,\n value,\n noOptionMatchedMessage,\n trimCustomInput = false,\n className,\n onMouseDown,\n onMouseUp,\n ...props\n }: ComboBoxProps,\n ref: React.Ref<HTMLInputElement>\n) {\n const isAlreadyFocusedRef = useRef(false);\n const [searchValue, setSearchValue] = useState(value);\n const valueRef = useRef(value);\n const isClosingRef = useRef(false);\n const [anchorElement, setAnchorElement] = useState<HTMLInputElement | null>(null);\n const internalInputRef = useRef<HTMLInputElement | null>(null);\n const [isSuggestionsOpen, setIsSuggestionsOpen] = useState(false);\n const forkedRef = useForkRef(ref, internalInputRef);\n\n function openSuggestions() {\n setIsSuggestionsOpen(true);\n }\n\n function closeSuggestions() {\n isClosingRef.current = false;\n setSearchValue('');\n setIsSuggestionsOpen(false);\n }\n\n function handleClose(\n value: string,\n selectionStart: number | null,\n selectionEnd: number | null\n ) {\n isClosingRef.current = true;\n const input = internalInputRef.current;\n\n requestAnimationFrame(() => {\n if (input != null) {\n input.value = value;\n input.focus();\n input.setSelectionRange(selectionStart, selectionEnd);\n }\n });\n props.onChange && props.onChange(value);\n closeSuggestions();\n }\n\n function handleSelection(value: string) {\n isClosingRef.current = true;\n const input = internalInputRef.current;\n\n if (input != null) {\n input.focus();\n }\n\n closeSuggestions();\n onSuggestionSelect && onSuggestionSelect(value);\n }\n\n function handleKeyDown(event: React.KeyboardEvent<HTMLInputElement>) {\n valueRef.current = event.currentTarget.value;\n\n if (isClosingRef.current) {\n isClosingRef.current = false;\n onKeyDown && onKeyDown(event);\n return;\n }\n\n onKeyDown && onKeyDown(event);\n }\n\n function handleKeyUp(event: React.KeyboardEvent<HTMLInputElement>) {\n const key = event.key;\n\n setSearchValue(event.currentTarget.value);\n\n if (key === 'Enter') {\n if (isSuggestionsOpen) {\n closeSuggestions();\n } else {\n openSuggestions();\n event.preventDefault();\n }\n }\n\n if (valueRef.current !== event.currentTarget.value) {\n openSuggestions();\n }\n\n onKeyUp && onKeyUp(event);\n }\n\n function handlMouseDown(event: React.MouseEvent<HTMLInputElement>) {\n setAnchorElement(event.currentTarget);\n isAlreadyFocusedRef.current = document.activeElement === event.currentTarget;\n onMouseDown && onMouseDown(event);\n }\n\n function handleMouseUp(event: React.MouseEvent<HTMLInputElement>) {\n if (isClosingRef.current) {\n isClosingRef.current = false;\n closeSuggestions();\n }\n\n openSuggestions();\n onMouseUp && onMouseUp(event);\n }\n\n return (\n <>\n <Input\n ref={forkedRef}\n className={clsx(className, 'tcn-combo-box-input')}\n {...props}\n value={value}\n onKeyDown={handleKeyDown}\n onKeyUp={handleKeyUp}\n onMouseDown={handlMouseDown}\n onMouseUp={handleMouseUp}\n />\n <SuggestionList\n open={isSuggestionsOpen}\n anchorElement={anchorElement}\n onClose={handleClose}\n value={value}\n initialSearchValue={searchValue}\n trimCustomInput={trimCustomInput}\n onOptionSelect={handleSelection}\n noSuggestionMessage={noOptionMatchedMessage}\n haveValueAsOption={true}\n >\n {children}\n </SuggestionList>\n </>\n );\n});\n"],"names":["ComboBox","React","onSuggestionSelect","children","onKeyDown","onKeyUp","value","noOptionMatchedMessage","trimCustomInput","className","onMouseDown","onMouseUp","props","ref","isAlreadyFocusedRef","useRef","searchValue","setSearchValue","useState","valueRef","isClosingRef","anchorElement","setAnchorElement","internalInputRef","isSuggestionsOpen","setIsSuggestionsOpen","forkedRef","useForkRef","openSuggestions","closeSuggestions","handleClose","selectionStart","selectionEnd","input","handleSelection","handleKeyDown","event","handleKeyUp","key","handlMouseDown","handleMouseUp","jsxs","Fragment","jsx","Input","clsx","SuggestionList"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { jsxs as l, jsx as n, Fragment as T } from "react/jsx-runtime";
1
+ import { jsxs as m, jsx as n, Fragment as T } from "react/jsx-runtime";
2
2
  import { useSignalValue as y, useSignalValueEffect as _ } from "@tcn/state";
3
3
  import "../../utils/click_away_listener.js";
4
4
  import "../../utils/focus_redirect.js";
@@ -8,6 +8,9 @@ import { useResizeObserver as O } from "../../utils/hooks/use_resize_observer.js
8
8
  import "../../utils/dnd/context.js";
9
9
  import { clsx as R } from "clsx";
10
10
  import "../../draggable.module-BgelQsuJ.js";
11
+ import "../../utils/resize/context.js";
12
+ import "../../resizable.module-I6iyBAvM.js";
13
+ import "../../utils/resize/resize_handle.js";
11
14
  import { HStack as U } from "../../stacks/h_stack.js";
12
15
  import { Spacer as V } from "../../stacks/spacer.js";
13
16
  import { VStack as u } from "../../stacks/v_stack.js";
@@ -15,7 +18,7 @@ import { DatePickerBody as $ } from "./date_picker_body.js";
15
18
  import { DatePickerHeader as q } from "./date_picker_header.js";
16
19
  import { DatePickerPresenter as E } from "./date_picker_presenter.js";
17
20
  import { DatePickerTimeSelector as G } from "./date_picker_time_selector.js";
18
- import '../../date_picker.css';const J = "_date-picker_0a0d8e4", K = "_date-picker-box_4da3776", w = { "date-picker": J, "date-picker-box": K }, pe = Y.forwardRef(function({
21
+ import '../../date_picker.css';const J = "_date-picker_0a0d8e4", K = "_date-picker-box_4da3776", w = { "date-picker": J, "date-picker-box": K }, ue = Y.forwardRef(function({
19
22
  value: i,
20
23
  disabled: h,
21
24
  onChange: k,
@@ -23,7 +26,7 @@ import '../../date_picker.css';const J = "_date-picker_0a0d8e4", K = "_date-pick
23
26
  showTime: c = !1,
24
27
  min: g = null,
25
28
  max: b = null,
26
- minVisibleTimeInMilliseconds: m,
29
+ minVisibleTimeInMilliseconds: l,
27
30
  maxVisibleTimeInMilliseconds: p,
28
31
  disabledDates: f,
29
32
  countryCode: D = "en-US",
@@ -52,14 +55,14 @@ import '../../date_picker.css';const J = "_date-picker_0a0d8e4", K = "_date-pick
52
55
  }, [e, b]), r(() => {
53
56
  f == null ? e.setDisabledDates([]) : e.setDisabledDates(f);
54
57
  }, [e, f]), r(() => {
55
- typeof m == "number" && e.setMinVisibleTime(m);
56
- }, [e, m]), r(() => {
58
+ typeof l == "number" && e.setMinVisibleTime(l);
59
+ }, [e, l]), r(() => {
57
60
  typeof p == "number" && e.setMaxVisibleTime(p);
58
61
  }, [e, p]), r(() => {
59
62
  typeof d == "number" && e.setTimeIntervalInMinutes(d);
60
63
  }, [e, d]), r(() => {
61
64
  e.selectDate(i);
62
- }, [e, i]), /* @__PURE__ */ l(
65
+ }, [e, i]), /* @__PURE__ */ m(
63
66
  U,
64
67
  {
65
68
  ref: H,
@@ -68,7 +71,7 @@ import '../../date_picker.css';const J = "_date-picker_0a0d8e4", K = "_date-pick
68
71
  className: R(w["date-picker"], "tcn-date-picker"),
69
72
  tabIndex: 0,
70
73
  children: [
71
- /* @__PURE__ */ l(
74
+ /* @__PURE__ */ m(
72
75
  u,
73
76
  {
74
77
  ref: j,
@@ -78,7 +81,7 @@ import '../../date_picker.css';const J = "_date-picker_0a0d8e4", K = "_date-pick
78
81
  className: R(w["date-picker-box"], "tcn-date-picker-box"),
79
82
  "data-is-disabled": h,
80
83
  children: [
81
- /* @__PURE__ */ l(u, { height: "auto", children: [
84
+ /* @__PURE__ */ m(u, { height: "auto", children: [
82
85
  /* @__PURE__ */ n(q, { countryCode: D, presenter: e }),
83
86
  /* @__PURE__ */ n($, { countryCode: D, presenter: e })
84
87
  ] }),
@@ -87,7 +90,7 @@ import '../../date_picker.css';const J = "_date-picker_0a0d8e4", K = "_date-pick
87
90
  ]
88
91
  }
89
92
  ),
90
- c && /* @__PURE__ */ l(T, { children: [
93
+ c && /* @__PURE__ */ m(T, { children: [
91
94
  /* @__PURE__ */ n(V, { width: "8px" }),
92
95
  /* @__PURE__ */ n(
93
96
  G,
@@ -111,6 +114,6 @@ import '../../date_picker.css';const J = "_date-picker_0a0d8e4", K = "_date-pick
111
114
  );
112
115
  });
113
116
  export {
114
- pe as DatePicker
117
+ ue as DatePicker
115
118
  };
116
119
  //# sourceMappingURL=date_picker.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"date_picker.js","sources":["../../../src/inputs/date_picker/date_picker.tsx"],"sourcesContent":["import { useSignalValue, useSignalValueEffect } from '@tcn/state';\nimport { useResizeObserver } from '../../utils/index.js';\nimport { HStack } from '../../stacks/h_stack.js';\nimport { Spacer } from '../../stacks/spacer.js';\nimport { VStack } from '../../stacks/v_stack.js';\nimport { clsx } from 'clsx';\nimport React, { useLayoutEffect, useRef, useState } from 'react';\nimport { DatePickerBody } from './date_picker_body.js';\nimport { DatePickerHeader } from './date_picker_header.js';\nimport { DatePickerPresenter } from './date_picker_presenter.js';\nimport { DatePickerTimeSelector } from './date_picker_time_selector.js';\nimport styles from './date_picker.module.css';\n\nexport interface DatePickerProps {\n value: Date | null;\n disabled?: boolean;\n onChange?: (value: Date | null) => void;\n onError?: (error: string | null) => void;\n showTime?: boolean;\n min?: Date | null;\n max?: Date | null;\n minVisibleTimeInMilliseconds?: number;\n maxVisibleTimeInMilliseconds?: number;\n disabledDates?: Date[];\n countryCode?: string;\n onTimeSelected?: (hour: number, minutes: number, seconds: number) => void;\n timeIntervalInMinutes?: number;\n renderActions?: (datePickerPresenter: DatePickerPresenter) => React.ReactNode;\n}\n\nexport const DatePicker = React.forwardRef(function DatePicker(\n {\n value,\n disabled,\n onChange,\n onError,\n showTime = false,\n min: minDate = null,\n max: maxDate = null,\n minVisibleTimeInMilliseconds,\n maxVisibleTimeInMilliseconds,\n disabledDates,\n countryCode = 'en-US',\n renderActions,\n onTimeSelected,\n timeIntervalInMinutes,\n }: DatePickerProps,\n ref: React.Ref<HTMLDivElement>\n) {\n const [calendarHeight, setCalendarHeight] = useState(0);\n const isMountedRef = useRef(false);\n const calendarRef = useResizeObserver((_, height) => {\n setCalendarHeight(height);\n });\n const [presenter] = useState(() => {\n const today = new Date();\n\n const year = value == null ? today.getFullYear() : value.getFullYear();\n const month = value == null ? today.getMonth() : value.getMonth();\n\n return new DatePickerPresenter(value, year, month, showTime);\n });\n\n const state = useSignalValue(presenter.stateBroadcast);\n const innerValue = useSignalValue(presenter.valueBroadcast);\n const error = state.error;\n\n useSignalValueEffect<string | null>(innerError => {\n error !== innerError && onError && onError(innerError);\n }, presenter.errorBroadcast);\n\n useSignalValueEffect<Date | null>(value => {\n if (isMountedRef.current) {\n onChange && onChange(value);\n } else {\n isMountedRef.current = true;\n }\n }, presenter.valueBroadcast);\n\n useLayoutEffect(() => {\n presenter.initialize();\n }, [presenter]);\n\n useLayoutEffect(() => {\n presenter.setShowTime(showTime);\n }, [presenter, showTime]);\n\n useLayoutEffect(() => {\n presenter.setMinDate(minDate);\n }, [presenter, minDate]);\n\n useLayoutEffect(() => {\n presenter.setMaxDate(maxDate);\n }, [presenter, maxDate]);\n\n useLayoutEffect(() => {\n if (disabledDates == null) {\n presenter.setDisabledDates([]);\n } else {\n presenter.setDisabledDates(disabledDates);\n }\n }, [presenter, disabledDates]);\n\n useLayoutEffect(() => {\n if (typeof minVisibleTimeInMilliseconds === 'number') {\n presenter.setMinVisibleTime(minVisibleTimeInMilliseconds);\n }\n }, [presenter, minVisibleTimeInMilliseconds]);\n\n useLayoutEffect(() => {\n if (typeof maxVisibleTimeInMilliseconds === 'number') {\n presenter.setMaxVisibleTime(maxVisibleTimeInMilliseconds);\n }\n }, [presenter, maxVisibleTimeInMilliseconds]);\n\n useLayoutEffect(() => {\n if (typeof timeIntervalInMinutes === 'number') {\n presenter.setTimeIntervalInMinutes(timeIntervalInMinutes);\n }\n }, [presenter, timeIntervalInMinutes]);\n\n useLayoutEffect(() => {\n presenter.selectDate(value);\n }, [presenter, value]);\n\n return (\n <HStack\n ref={ref}\n width=\"auto\"\n height=\"auto\"\n className={clsx(styles['date-picker'], 'tcn-date-picker')}\n tabIndex={0}\n >\n <VStack\n ref={calendarRef}\n inline\n height=\"auto\"\n width=\"auto\"\n className={clsx(styles['date-picker-box'], 'tcn-date-picker-box')}\n data-is-disabled={disabled}\n >\n <VStack height=\"auto\">\n <DatePickerHeader countryCode={countryCode} presenter={presenter} />\n <DatePickerBody countryCode={countryCode} presenter={presenter} />\n </VStack>\n {renderActions && <VStack paddingInline=\"8px\">{renderActions(presenter)}</VStack>}\n <Spacer height=\"8px\" />\n </VStack>\n {showTime && (\n <>\n <Spacer width=\"8px\" />\n <DatePickerTimeSelector\n height={`${calendarHeight}px`}\n origin={innerValue}\n max={state.max}\n min={state.min}\n minVisibleTimeInMilliseconds={state.minVisibleTimeInMilliseconds}\n maxVisibleTimeInMilliseconds={state.maxVisibleTimeInMilliseconds}\n intervalInMinutes={state.timeIntervalInMinutes}\n disabled={disabled}\n onSelect={(hour, minutes, seconds) => {\n presenter.setTime(hour, minutes, seconds);\n onTimeSelected && onTimeSelected(hour, minutes, seconds);\n }}\n />\n </>\n )}\n </HStack>\n );\n});\n"],"names":["DatePicker","React","value","disabled","onChange","onError","showTime","minDate","maxDate","minVisibleTimeInMilliseconds","maxVisibleTimeInMilliseconds","disabledDates","countryCode","renderActions","onTimeSelected","timeIntervalInMinutes","ref","calendarHeight","setCalendarHeight","useState","isMountedRef","useRef","calendarRef","useResizeObserver","_","height","presenter","today","year","month","DatePickerPresenter","state","useSignalValue","innerValue","error","useSignalValueEffect","innerError","useLayoutEffect","jsxs","HStack","clsx","styles","VStack","jsx","DatePickerHeader","DatePickerBody","Spacer","Fragment","DatePickerTimeSelector","hour","minutes","seconds"],"mappings":"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"}
1
+ {"version":3,"file":"date_picker.js","sources":["../../../src/inputs/date_picker/date_picker.tsx"],"sourcesContent":["import { useSignalValue, useSignalValueEffect } from '@tcn/state';\nimport { useResizeObserver } from '../../utils/index.js';\nimport { HStack } from '../../stacks/h_stack.js';\nimport { Spacer } from '../../stacks/spacer.js';\nimport { VStack } from '../../stacks/v_stack.js';\nimport { clsx } from 'clsx';\nimport React, { useLayoutEffect, useRef, useState } from 'react';\nimport { DatePickerBody } from './date_picker_body.js';\nimport { DatePickerHeader } from './date_picker_header.js';\nimport { DatePickerPresenter } from './date_picker_presenter.js';\nimport { DatePickerTimeSelector } from './date_picker_time_selector.js';\nimport styles from './date_picker.module.css';\n\nexport interface DatePickerProps {\n value: Date | null;\n disabled?: boolean;\n onChange?: (value: Date | null) => void;\n onError?: (error: string | null) => void;\n showTime?: boolean;\n min?: Date | null;\n max?: Date | null;\n minVisibleTimeInMilliseconds?: number;\n maxVisibleTimeInMilliseconds?: number;\n disabledDates?: Date[];\n countryCode?: string;\n onTimeSelected?: (hour: number, minutes: number, seconds: number) => void;\n timeIntervalInMinutes?: number;\n renderActions?: (datePickerPresenter: DatePickerPresenter) => React.ReactNode;\n}\n\nexport const DatePicker = React.forwardRef(function DatePicker(\n {\n value,\n disabled,\n onChange,\n onError,\n showTime = false,\n min: minDate = null,\n max: maxDate = null,\n minVisibleTimeInMilliseconds,\n maxVisibleTimeInMilliseconds,\n disabledDates,\n countryCode = 'en-US',\n renderActions,\n onTimeSelected,\n timeIntervalInMinutes,\n }: DatePickerProps,\n ref: React.Ref<HTMLDivElement>\n) {\n const [calendarHeight, setCalendarHeight] = useState(0);\n const isMountedRef = useRef(false);\n const calendarRef = useResizeObserver((_, height) => {\n setCalendarHeight(height);\n });\n const [presenter] = useState(() => {\n const today = new Date();\n\n const year = value == null ? today.getFullYear() : value.getFullYear();\n const month = value == null ? today.getMonth() : value.getMonth();\n\n return new DatePickerPresenter(value, year, month, showTime);\n });\n\n const state = useSignalValue(presenter.stateBroadcast);\n const innerValue = useSignalValue(presenter.valueBroadcast);\n const error = state.error;\n\n useSignalValueEffect<string | null>(innerError => {\n error !== innerError && onError && onError(innerError);\n }, presenter.errorBroadcast);\n\n useSignalValueEffect<Date | null>(value => {\n if (isMountedRef.current) {\n onChange && onChange(value);\n } else {\n isMountedRef.current = true;\n }\n }, presenter.valueBroadcast);\n\n useLayoutEffect(() => {\n presenter.initialize();\n }, [presenter]);\n\n useLayoutEffect(() => {\n presenter.setShowTime(showTime);\n }, [presenter, showTime]);\n\n useLayoutEffect(() => {\n presenter.setMinDate(minDate);\n }, [presenter, minDate]);\n\n useLayoutEffect(() => {\n presenter.setMaxDate(maxDate);\n }, [presenter, maxDate]);\n\n useLayoutEffect(() => {\n if (disabledDates == null) {\n presenter.setDisabledDates([]);\n } else {\n presenter.setDisabledDates(disabledDates);\n }\n }, [presenter, disabledDates]);\n\n useLayoutEffect(() => {\n if (typeof minVisibleTimeInMilliseconds === 'number') {\n presenter.setMinVisibleTime(minVisibleTimeInMilliseconds);\n }\n }, [presenter, minVisibleTimeInMilliseconds]);\n\n useLayoutEffect(() => {\n if (typeof maxVisibleTimeInMilliseconds === 'number') {\n presenter.setMaxVisibleTime(maxVisibleTimeInMilliseconds);\n }\n }, [presenter, maxVisibleTimeInMilliseconds]);\n\n useLayoutEffect(() => {\n if (typeof timeIntervalInMinutes === 'number') {\n presenter.setTimeIntervalInMinutes(timeIntervalInMinutes);\n }\n }, [presenter, timeIntervalInMinutes]);\n\n useLayoutEffect(() => {\n presenter.selectDate(value);\n }, [presenter, value]);\n\n return (\n <HStack\n ref={ref}\n width=\"auto\"\n height=\"auto\"\n className={clsx(styles['date-picker'], 'tcn-date-picker')}\n tabIndex={0}\n >\n <VStack\n ref={calendarRef}\n inline\n height=\"auto\"\n width=\"auto\"\n className={clsx(styles['date-picker-box'], 'tcn-date-picker-box')}\n data-is-disabled={disabled}\n >\n <VStack height=\"auto\">\n <DatePickerHeader countryCode={countryCode} presenter={presenter} />\n <DatePickerBody countryCode={countryCode} presenter={presenter} />\n </VStack>\n {renderActions && <VStack paddingInline=\"8px\">{renderActions(presenter)}</VStack>}\n <Spacer height=\"8px\" />\n </VStack>\n {showTime && (\n <>\n <Spacer width=\"8px\" />\n <DatePickerTimeSelector\n height={`${calendarHeight}px`}\n origin={innerValue}\n max={state.max}\n min={state.min}\n minVisibleTimeInMilliseconds={state.minVisibleTimeInMilliseconds}\n maxVisibleTimeInMilliseconds={state.maxVisibleTimeInMilliseconds}\n intervalInMinutes={state.timeIntervalInMinutes}\n disabled={disabled}\n onSelect={(hour, minutes, seconds) => {\n presenter.setTime(hour, minutes, seconds);\n onTimeSelected && onTimeSelected(hour, minutes, seconds);\n }}\n />\n </>\n )}\n </HStack>\n );\n});\n"],"names":["DatePicker","React","value","disabled","onChange","onError","showTime","minDate","maxDate","minVisibleTimeInMilliseconds","maxVisibleTimeInMilliseconds","disabledDates","countryCode","renderActions","onTimeSelected","timeIntervalInMinutes","ref","calendarHeight","setCalendarHeight","useState","isMountedRef","useRef","calendarRef","useResizeObserver","_","height","presenter","today","year","month","DatePickerPresenter","state","useSignalValue","innerValue","error","useSignalValueEffect","innerError","useLayoutEffect","jsxs","HStack","clsx","styles","VStack","jsx","DatePickerHeader","DatePickerBody","Spacer","Fragment","DatePickerTimeSelector","hour","minutes","seconds"],"mappings":";;;;;;;;;;;;;;;;;;;;kHA8BaA,KAAaC,EAAM,WAAW,SACzC;AAAA,EACE,OAAAC;AAAA,EACA,UAAAC;AAAA,EACA,UAAAC;AAAA,EACA,SAAAC;AAAA,EACA,UAAAC,IAAW;AAAA,EACX,KAAKC,IAAU;AAAA,EACf,KAAKC,IAAU;AAAA,EACf,8BAAAC;AAAA,EACA,8BAAAC;AAAA,EACA,eAAAC;AAAA,EACA,aAAAC,IAAc;AAAA,EACd,eAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,uBAAAC;AACF,GACAC,GACA;AACA,QAAM,CAACC,GAAgBC,CAAiB,IAAIC,EAAS,CAAC,GAChDC,IAAeC,EAAO,EAAK,GAC3BC,IAAcC,EAAkB,CAACC,GAAGC,MAAW;AACnD,IAAAP,EAAkBO,CAAM;AAAA,EAC1B,CAAC,GACK,CAACC,CAAS,IAAIP,EAAS,MAAM;AACjC,UAAMQ,wBAAY,KAAA,GAEZC,IAAO1B,KAAS,OAAOyB,EAAM,YAAA,IAAgBzB,EAAM,YAAA,GACnD2B,IAAQ3B,KAAS,OAAOyB,EAAM,SAAA,IAAazB,EAAM,SAAA;AAEvD,WAAO,IAAI4B,EAAoB5B,GAAO0B,GAAMC,GAAOvB,CAAQ;AAAA,EAC7D,CAAC,GAEKyB,IAAQC,EAAeN,EAAU,cAAc,GAC/CO,IAAaD,EAAeN,EAAU,cAAc,GACpDQ,IAAQH,EAAM;AAEpB,SAAAI,EAAoC,CAAAC,MAAc;AAChD,IAAAF,MAAUE,KAAc/B,KAAWA,EAAQ+B,CAAU;AAAA,EACvD,GAAGV,EAAU,cAAc,GAE3BS,EAAkC,CAAAjC,MAAS;AACzC,IAAIkB,EAAa,UACfhB,KAAYA,EAASF,CAAK,IAE1BkB,EAAa,UAAU;AAAA,EAE3B,GAAGM,EAAU,cAAc,GAE3BW,EAAgB,MAAM;AACpB,IAAAX,EAAU,WAAA;AAAA,EACZ,GAAG,CAACA,CAAS,CAAC,GAEdW,EAAgB,MAAM;AACpB,IAAAX,EAAU,YAAYpB,CAAQ;AAAA,EAChC,GAAG,CAACoB,GAAWpB,CAAQ,CAAC,GAExB+B,EAAgB,MAAM;AACpB,IAAAX,EAAU,WAAWnB,CAAO;AAAA,EAC9B,GAAG,CAACmB,GAAWnB,CAAO,CAAC,GAEvB8B,EAAgB,MAAM;AACpB,IAAAX,EAAU,WAAWlB,CAAO;AAAA,EAC9B,GAAG,CAACkB,GAAWlB,CAAO,CAAC,GAEvB6B,EAAgB,MAAM;AACpB,IAAI1B,KAAiB,OACnBe,EAAU,iBAAiB,EAAE,IAE7BA,EAAU,iBAAiBf,CAAa;AAAA,EAE5C,GAAG,CAACe,GAAWf,CAAa,CAAC,GAE7B0B,EAAgB,MAAM;AACpB,IAAI,OAAO5B,KAAiC,YAC1CiB,EAAU,kBAAkBjB,CAA4B;AAAA,EAE5D,GAAG,CAACiB,GAAWjB,CAA4B,CAAC,GAE5C4B,EAAgB,MAAM;AACpB,IAAI,OAAO3B,KAAiC,YAC1CgB,EAAU,kBAAkBhB,CAA4B;AAAA,EAE5D,GAAG,CAACgB,GAAWhB,CAA4B,CAAC,GAE5C2B,EAAgB,MAAM;AACpB,IAAI,OAAOtB,KAA0B,YACnCW,EAAU,yBAAyBX,CAAqB;AAAA,EAE5D,GAAG,CAACW,GAAWX,CAAqB,CAAC,GAErCsB,EAAgB,MAAM;AACpB,IAAAX,EAAU,WAAWxB,CAAK;AAAA,EAC5B,GAAG,CAACwB,GAAWxB,CAAK,CAAC,GAGnB,gBAAAoC;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,KAAAvB;AAAA,MACA,OAAM;AAAA,MACN,QAAO;AAAA,MACP,WAAWwB,EAAKC,EAAO,aAAa,GAAG,iBAAiB;AAAA,MACxD,UAAU;AAAA,MAEV,UAAA;AAAA,QAAA,gBAAAH;AAAA,UAACI;AAAA,UAAA;AAAA,YACC,KAAKpB;AAAA,YACL,QAAM;AAAA,YACN,QAAO;AAAA,YACP,OAAM;AAAA,YACN,WAAWkB,EAAKC,EAAO,iBAAiB,GAAG,qBAAqB;AAAA,YAChE,oBAAkBtC;AAAA,YAElB,UAAA;AAAA,cAAA,gBAAAmC,EAACI,GAAA,EAAO,QAAO,QACb,UAAA;AAAA,gBAAA,gBAAAC,EAACC,GAAA,EAAiB,aAAAhC,GAA0B,WAAAc,EAAA,CAAsB;AAAA,gBAClE,gBAAAiB,EAACE,GAAA,EAAe,aAAAjC,GAA0B,WAAAc,EAAA,CAAsB;AAAA,cAAA,GAClE;AAAA,cACCb,KAAiB,gBAAA8B,EAACD,GAAA,EAAO,eAAc,OAAO,UAAA7B,EAAca,CAAS,GAAE;AAAA,cACxE,gBAAAiB,EAACG,GAAA,EAAO,QAAO,MAAA,CAAM;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,QAEtBxC,KACC,gBAAAgC,EAAAS,GAAA,EACE,UAAA;AAAA,UAAA,gBAAAJ,EAACG,GAAA,EAAO,OAAM,MAAA,CAAM;AAAA,UACpB,gBAAAH;AAAA,YAACK;AAAA,YAAA;AAAA,cACC,QAAQ,GAAG/B,CAAc;AAAA,cACzB,QAAQgB;AAAA,cACR,KAAKF,EAAM;AAAA,cACX,KAAKA,EAAM;AAAA,cACX,8BAA8BA,EAAM;AAAA,cACpC,8BAA8BA,EAAM;AAAA,cACpC,mBAAmBA,EAAM;AAAA,cACzB,UAAA5B;AAAA,cACA,UAAU,CAAC8C,GAAMC,GAASC,MAAY;AACpC,gBAAAzB,EAAU,QAAQuB,GAAMC,GAASC,CAAO,GACxCrC,KAAkBA,EAAemC,GAAMC,GAASC,CAAO;AAAA,cACzD;AAAA,YAAA;AAAA,UAAA;AAAA,QACF,EAAA,CACF;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAIR,CAAC;"}
@@ -1,8 +1,8 @@
1
- import { jsxs as u, Fragment as q, jsx as r } from "react/jsx-runtime";
1
+ import { jsxs as m, Fragment as q, jsx as r } from "react/jsx-runtime";
2
2
  import B, { useState as L, useRef as M, useCallback as V, useMemo as W, useLayoutEffect as Z } from "react";
3
3
  import { ZStack as G } from "../../stacks/z_stack.js";
4
4
  import { Popper as H } from "../../overlay/popper/legacy/popper.js";
5
- import { clsx as m } from "clsx";
5
+ import { clsx as u } from "clsx";
6
6
  import "../../actions/button/base_button/base_button.js";
7
7
  import "../../actions/button/button_group/button_group.js";
8
8
  import "../../actions/button/slim_button/slim_button.js";
@@ -15,7 +15,10 @@ import "../../utils/scroll_away_listener.js";
15
15
  import "../../utils/hooks/use_resize_observer.js";
16
16
  import "../../utils/dnd/context.js";
17
17
  import "../../draggable.module-BgelQsuJ.js";
18
- import '../../date_picker_input.css';const U = "_button_f404820", X = "_popover_708f951", f = { button: U, popover: X }, kt = B.forwardRef(
18
+ import "../../utils/resize/context.js";
19
+ import "../../resizable.module-I6iyBAvM.js";
20
+ import "../../utils/resize/resize_handle.js";
21
+ import '../../date_picker_input.css';const U = "_button_f404820", X = "_popover_708f951", f = { button: U, popover: X }, Dt = B.forwardRef(
19
22
  ({
20
23
  value: c = /* @__PURE__ */ new Date(),
21
24
  onChange: d,
@@ -26,7 +29,7 @@ import '../../date_picker_input.css';const U = "_button_f404820", X = "_popover_
26
29
  width: y = "100%",
27
30
  maxWidth: D,
28
31
  minWidth: Y,
29
- showTime: n = !1,
32
+ showTime: o = !1,
30
33
  timeIntervalInMinutes: x = 15,
31
34
  hierarchy: A = "secondary",
32
35
  disabledDates: E,
@@ -36,14 +39,14 @@ import '../../date_picker_input.css';const U = "_button_f404820", X = "_popover_
36
39
  onTimeSelected: w,
37
40
  ..._
38
41
  }, b) => {
39
- const [o, a] = L(null), v = o != null, i = M(null), p = V((t) => t.closest(".tcn-suggestion-list") != null, []), C = W(() => {
42
+ const [n, a] = L(null), v = n != null, i = M(null), p = V((t) => t.closest(".tcn-suggestion-list") != null, []), C = W(() => {
40
43
  const t = {
41
44
  year: "numeric",
42
45
  month: "short",
43
46
  day: "numeric"
44
47
  };
45
- return n && (t.hour = "numeric", t.minute = "2-digit", t.hour12 = !0), new Intl.DateTimeFormat(s, t);
46
- }, [s, n]), F = c != null ? C.format(c) : R;
48
+ return o && (t.hour = "numeric", t.minute = "2-digit", t.hour12 = !0), new Intl.DateTimeFormat(s, t);
49
+ }, [s, o]), F = c != null ? C.format(c) : R;
47
50
  function P(t) {
48
51
  a(t.currentTarget);
49
52
  }
@@ -52,9 +55,9 @@ import '../../date_picker_input.css';const U = "_button_f404820", X = "_popover_
52
55
  }
53
56
  Z(() => {
54
57
  requestAnimationFrame(() => {
55
- o != null && i.current && i.current.focus();
58
+ n != null && i.current && i.current.focus();
56
59
  });
57
- }, [o]);
60
+ }, [n]);
58
61
  function O(t) {
59
62
  t.key === "Escape" && e();
60
63
  }
@@ -63,17 +66,17 @@ import '../../date_picker_input.css';const U = "_button_f404820", X = "_popover_
63
66
  t?.focus();
64
67
  }
65
68
  function N(t) {
66
- d?.(t), !n && e();
69
+ d?.(t), !o && e();
67
70
  }
68
71
  function j(t, z, K) {
69
72
  w?.(t, z, K), e();
70
73
  }
71
- return /* @__PURE__ */ u(q, { children: [
74
+ return /* @__PURE__ */ m(q, { children: [
72
75
  /* @__PURE__ */ r(
73
76
  J,
74
77
  {
75
78
  ref: b,
76
- className: m(f.button, "tcn-entry", "tcn-date-picker-input"),
79
+ className: u(f.button, "tcn-entry", "tcn-date-picker-input"),
77
80
  hAlign: "start",
78
81
  disabled: l,
79
82
  hierarchy: A,
@@ -87,7 +90,7 @@ import '../../date_picker_input.css';const U = "_button_f404820", X = "_popover_
87
90
  /* @__PURE__ */ r(
88
91
  H,
89
92
  {
90
- anchorElement: o,
93
+ anchorElement: n,
91
94
  disableClickAway: !0,
92
95
  veil: !0,
93
96
  onVeilClick: e,
@@ -100,11 +103,11 @@ import '../../date_picker_input.css';const U = "_button_f404820", X = "_popover_
100
103
  isClickAwayException: p,
101
104
  isScrollAwayException: p,
102
105
  restoreFocus: !0,
103
- children: /* @__PURE__ */ u(
106
+ children: /* @__PURE__ */ m(
104
107
  G,
105
108
  {
106
109
  padding: "8px",
107
- className: m(f.popover, "tcn-date-picker-popover"),
110
+ className: u(f.popover, "tcn-date-picker-popover"),
108
111
  onKeyDown: O,
109
112
  children: [
110
113
  /* @__PURE__ */ r(
@@ -115,7 +118,7 @@ import '../../date_picker_input.css';const U = "_button_f404820", X = "_popover_
115
118
  onChange: N,
116
119
  min: k,
117
120
  max: g,
118
- showTime: n,
121
+ showTime: o,
119
122
  onError: h,
120
123
  disabled: l,
121
124
  disabledDates: E,
@@ -135,6 +138,6 @@ import '../../date_picker_input.css';const U = "_button_f404820", X = "_popover_
135
138
  }
136
139
  );
137
140
  export {
138
- kt as DatePickerInput
141
+ Dt as DatePickerInput
139
142
  };
140
143
  //# sourceMappingURL=date_picker_input.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"date_picker_input.js","sources":["../../../src/inputs/date_picker/date_picker_input.tsx"],"sourcesContent":["import React, { useCallback, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport { Hierarchy } from '../../utils/index.js';\nimport { ZStack } from '../../stacks/z_stack.js';\nimport { Popper } from '../../overlay/popper/legacy/popper.js';\nimport { clsx } from 'clsx';\nimport { HTMLAttributes } from 'react';\nimport { Button } from '../../actions/index.js';\nimport { DatePicker } from './date_picker.js';\nimport { DatePickerPresenter } from './date_picker_presenter.js';\nimport { FocusRedirect } from '../../utils/index.js';\nimport styles from './date_picker_input.module.css';\n\nexport interface DatePickerInputProps\n extends Omit<HTMLAttributes<HTMLButtonElement>, 'onChange' | 'onError'> {\n value?: Date | null;\n disabled?: boolean;\n onChange?: (date: Date | null) => void;\n onError?: (error: string | null) => void;\n width?: string;\n maxWidth?: string;\n minWidth?: string;\n showTime?: boolean;\n timeIntervalInMinutes?: number;\n disabledDates?: Date[] | undefined;\n countryCode?: string;\n renderActions?: (datePickerPresenter: DatePickerPresenter) => React.ReactNode;\n min?: Date;\n max?: Date;\n hierarchy?: Hierarchy;\n selectDateMessage?: string;\n onTimeSelected?: (hour: number, minutes: number, seconds: number) => void;\n}\n\nexport const DatePickerInput = React.forwardRef<HTMLButtonElement, DatePickerInputProps>(\n (\n {\n value = new Date(),\n onChange,\n onError,\n min = new Date('01/01/1924'),\n max = new Date('01/01/2124'),\n disabled,\n width = '100%',\n maxWidth,\n minWidth,\n showTime = false,\n timeIntervalInMinutes = 15,\n hierarchy = 'secondary',\n disabledDates,\n selectDateMessage = 'Select Date',\n countryCode,\n renderActions,\n onTimeSelected,\n ...props\n }: DatePickerInputProps,\n ref: React.Ref<HTMLButtonElement>\n ) => {\n const [anchorElement, setAnchorElement] = useState<HTMLButtonElement | null>(null);\n const isOpen = anchorElement != null;\n const pickerRef = useRef<HTMLDivElement | null>(null);\n\n const isException = useCallback((target: HTMLElement) => {\n return target.closest('.tcn-suggestion-list') != null;\n }, []);\n\n const formatter = useMemo(() => {\n const formatOptions: Intl.DateTimeFormatOptions = {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n };\n\n if (showTime) {\n formatOptions.hour = 'numeric';\n formatOptions.minute = '2-digit';\n formatOptions.hour12 = true;\n }\n\n return new Intl.DateTimeFormat(countryCode, formatOptions);\n }, [countryCode, showTime]);\n\n const formattedDate = value != null ? formatter.format(value) : selectDateMessage;\n\n function openPicker(e: React.MouseEvent<HTMLButtonElement>) {\n setAnchorElement(e.currentTarget);\n }\n\n function closePicker() {\n setAnchorElement(null);\n }\n\n useLayoutEffect(() => {\n requestAnimationFrame(() => {\n if (anchorElement != null) {\n pickerRef.current && pickerRef.current.focus();\n }\n });\n }, [anchorElement]);\n\n function processKeyInput(event: React.KeyboardEvent) {\n if (event.key === 'Escape') {\n closePicker();\n }\n }\n\n function handleRedirect() {\n const picker = pickerRef.current;\n\n if (picker != null) {\n picker.focus();\n }\n }\n\n function dateSelected(date: Date | null) {\n onChange?.(date);\n !showTime && closePicker();\n }\n\n function timeSelected(hour: number, minutes: number, seconds: number) {\n onTimeSelected?.(hour, minutes, seconds);\n closePicker();\n }\n\n return (\n <>\n <Button\n ref={ref}\n className={clsx(styles.button, 'tcn-entry', 'tcn-date-picker-input')}\n hAlign=\"start\"\n disabled={disabled}\n hierarchy={hierarchy}\n onClick={openPicker}\n width={width}\n maxWidth={maxWidth}\n {...props}\n >\n <span className=\"ellipsis\">{formattedDate}</span>\n </Button>\n <Popper\n anchorElement={anchorElement}\n disableClickAway\n veil\n onVeilClick={closePicker}\n onClose={closePicker}\n verticalAnchor=\"bottom\"\n horizontalAnchor=\"start\"\n verticalOrigin=\"top\"\n horizontalOrigin=\"start\"\n open={isOpen}\n isClickAwayException={isException}\n isScrollAwayException={isException}\n restoreFocus\n >\n <ZStack\n padding=\"8px\"\n className={clsx(styles.popover, 'tcn-date-picker-popover')}\n onKeyDown={processKeyInput}\n >\n <DatePicker\n ref={pickerRef}\n value={value}\n onChange={dateSelected}\n min={min}\n max={max}\n showTime={showTime}\n onError={onError}\n disabled={disabled}\n disabledDates={disabledDates}\n countryCode={countryCode}\n renderActions={renderActions}\n onTimeSelected={timeSelected}\n timeIntervalInMinutes={timeIntervalInMinutes}\n />\n <FocusRedirect onRedirect={handleRedirect} />\n </ZStack>\n </Popper>\n </>\n );\n }\n);\n"],"names":["DatePickerInput","React","value","onChange","onError","min","max","disabled","width","maxWidth","minWidth","showTime","timeIntervalInMinutes","hierarchy","disabledDates","selectDateMessage","countryCode","renderActions","onTimeSelected","props","ref","anchorElement","setAnchorElement","useState","isOpen","pickerRef","useRef","isException","useCallback","target","formatter","useMemo","formatOptions","formattedDate","openPicker","e","closePicker","useLayoutEffect","processKeyInput","event","handleRedirect","picker","dateSelected","date","timeSelected","hour","minutes","seconds","jsxs","Fragment","jsx","Button","clsx","styles","Popper","ZStack","DatePicker","FocusRedirect"],"mappings":";;;;;;;;;;;;;;;;;oFAiCaA,KAAkBC,EAAM;AAAA,EACnC,CACE;AAAA,IACE,OAAAC,wBAAY,KAAA;AAAA,IACZ,UAAAC;AAAA,IACA,SAAAC;AAAA,IACA,KAAAC,IAAM,oBAAI,KAAK,YAAY;AAAA,IAC3B,KAAAC,IAAM,oBAAI,KAAK,YAAY;AAAA,IAC3B,UAAAC;AAAA,IACA,OAAAC,IAAQ;AAAA,IACR,UAAAC;AAAA,IACA,UAAAC;AAAA,IACA,UAAAC,IAAW;AAAA,IACX,uBAAAC,IAAwB;AAAA,IACxB,WAAAC,IAAY;AAAA,IACZ,eAAAC;AAAA,IACA,mBAAAC,IAAoB;AAAA,IACpB,aAAAC;AAAA,IACA,eAAAC;AAAA,IACA,gBAAAC;AAAA,IACA,GAAGC;AAAA,EAAA,GAELC,MACG;AACH,UAAM,CAACC,GAAeC,CAAgB,IAAIC,EAAmC,IAAI,GAC3EC,IAASH,KAAiB,MAC1BI,IAAYC,EAA8B,IAAI,GAE9CC,IAAcC,EAAY,CAACC,MACxBA,EAAO,QAAQ,sBAAsB,KAAK,MAChD,CAAA,CAAE,GAECC,IAAYC,EAAQ,MAAM;AAC9B,YAAMC,IAA4C;AAAA,QAChD,MAAM;AAAA,QACN,OAAO;AAAA,QACP,KAAK;AAAA,MAAA;AAGP,aAAIrB,MACFqB,EAAc,OAAO,WACrBA,EAAc,SAAS,WACvBA,EAAc,SAAS,KAGlB,IAAI,KAAK,eAAehB,GAAagB,CAAa;AAAA,IAC3D,GAAG,CAAChB,GAAaL,CAAQ,CAAC,GAEpBsB,IAAgB/B,KAAS,OAAO4B,EAAU,OAAO5B,CAAK,IAAIa;AAEhE,aAASmB,EAAWC,GAAwC;AAC1D,MAAAb,EAAiBa,EAAE,aAAa;AAAA,IAClC;AAEA,aAASC,IAAc;AACrB,MAAAd,EAAiB,IAAI;AAAA,IACvB;AAEA,IAAAe,EAAgB,MAAM;AACpB,4BAAsB,MAAM;AAC1B,QAAIhB,KAAiB,QACnBI,EAAU,WAAWA,EAAU,QAAQ,MAAA;AAAA,MAE3C,CAAC;AAAA,IACH,GAAG,CAACJ,CAAa,CAAC;AAElB,aAASiB,EAAgBC,GAA4B;AACnD,MAAIA,EAAM,QAAQ,YAChBH,EAAA;AAAA,IAEJ;AAEA,aAASI,IAAiB;AACxB,YAAMC,IAAShB,EAAU;AAEzB,MACEgB,GAAO,MAAA;AAAA,IAEX;AAEA,aAASC,EAAaC,GAAmB;AACvC,MAAAxC,IAAWwC,CAAI,GACf,CAAChC,KAAYyB,EAAA;AAAA,IACf;AAEA,aAASQ,EAAaC,GAAcC,GAAiBC,GAAiB;AACpE,MAAA7B,IAAiB2B,GAAMC,GAASC,CAAO,GACvCX,EAAA;AAAA,IACF;AAEA,WACE,gBAAAY,EAAAC,GAAA,EACE,UAAA;AAAA,MAAA,gBAAAC;AAAA,QAACC;AAAA,QAAA;AAAA,UACC,KAAA/B;AAAA,UACA,WAAWgC,EAAKC,EAAO,QAAQ,aAAa,uBAAuB;AAAA,UACnE,QAAO;AAAA,UACP,UAAA9C;AAAA,UACA,WAAAM;AAAA,UACA,SAASqB;AAAA,UACT,OAAA1B;AAAA,UACA,UAAAC;AAAA,UACC,GAAGU;AAAA,UAEJ,UAAA,gBAAA+B,EAAC,QAAA,EAAK,WAAU,YAAY,UAAAjB,EAAA,CAAc;AAAA,QAAA;AAAA,MAAA;AAAA,MAE5C,gBAAAiB;AAAA,QAACI;AAAA,QAAA;AAAA,UACC,eAAAjC;AAAA,UACA,kBAAgB;AAAA,UAChB,MAAI;AAAA,UACJ,aAAae;AAAA,UACb,SAASA;AAAA,UACT,gBAAe;AAAA,UACf,kBAAiB;AAAA,UACjB,gBAAe;AAAA,UACf,kBAAiB;AAAA,UACjB,MAAMZ;AAAA,UACN,sBAAsBG;AAAA,UACtB,uBAAuBA;AAAA,UACvB,cAAY;AAAA,UAEZ,UAAA,gBAAAqB;AAAA,YAACO;AAAA,YAAA;AAAA,cACC,SAAQ;AAAA,cACR,WAAWH,EAAKC,EAAO,SAAS,yBAAyB;AAAA,cACzD,WAAWf;AAAA,cAEX,UAAA;AAAA,gBAAA,gBAAAY;AAAA,kBAACM;AAAA,kBAAA;AAAA,oBACC,KAAK/B;AAAA,oBACL,OAAAvB;AAAA,oBACA,UAAUwC;AAAA,oBACV,KAAArC;AAAA,oBACA,KAAAC;AAAA,oBACA,UAAAK;AAAA,oBACA,SAAAP;AAAA,oBACA,UAAAG;AAAA,oBACA,eAAAO;AAAA,oBACA,aAAAE;AAAA,oBACA,eAAAC;AAAA,oBACA,gBAAgB2B;AAAA,oBAChB,uBAAAhC;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAEF,gBAAAsC,EAACO,GAAA,EAAc,YAAYjB,EAAA,CAAgB;AAAA,cAAA;AAAA,YAAA;AAAA,UAAA;AAAA,QAC7C;AAAA,MAAA;AAAA,IACF,GACF;AAAA,EAEJ;AACF;"}
1
+ {"version":3,"file":"date_picker_input.js","sources":["../../../src/inputs/date_picker/date_picker_input.tsx"],"sourcesContent":["import React, { useCallback, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport { Hierarchy } from '../../utils/index.js';\nimport { ZStack } from '../../stacks/z_stack.js';\nimport { Popper } from '../../overlay/popper/legacy/popper.js';\nimport { clsx } from 'clsx';\nimport { HTMLAttributes } from 'react';\nimport { Button } from '../../actions/index.js';\nimport { DatePicker } from './date_picker.js';\nimport { DatePickerPresenter } from './date_picker_presenter.js';\nimport { FocusRedirect } from '../../utils/index.js';\nimport styles from './date_picker_input.module.css';\n\nexport interface DatePickerInputProps\n extends Omit<HTMLAttributes<HTMLButtonElement>, 'onChange' | 'onError'> {\n value?: Date | null;\n disabled?: boolean;\n onChange?: (date: Date | null) => void;\n onError?: (error: string | null) => void;\n width?: string;\n maxWidth?: string;\n minWidth?: string;\n showTime?: boolean;\n timeIntervalInMinutes?: number;\n disabledDates?: Date[] | undefined;\n countryCode?: string;\n renderActions?: (datePickerPresenter: DatePickerPresenter) => React.ReactNode;\n min?: Date;\n max?: Date;\n hierarchy?: Hierarchy;\n selectDateMessage?: string;\n onTimeSelected?: (hour: number, minutes: number, seconds: number) => void;\n}\n\nexport const DatePickerInput = React.forwardRef<HTMLButtonElement, DatePickerInputProps>(\n (\n {\n value = new Date(),\n onChange,\n onError,\n min = new Date('01/01/1924'),\n max = new Date('01/01/2124'),\n disabled,\n width = '100%',\n maxWidth,\n minWidth,\n showTime = false,\n timeIntervalInMinutes = 15,\n hierarchy = 'secondary',\n disabledDates,\n selectDateMessage = 'Select Date',\n countryCode,\n renderActions,\n onTimeSelected,\n ...props\n }: DatePickerInputProps,\n ref: React.Ref<HTMLButtonElement>\n ) => {\n const [anchorElement, setAnchorElement] = useState<HTMLButtonElement | null>(null);\n const isOpen = anchorElement != null;\n const pickerRef = useRef<HTMLDivElement | null>(null);\n\n const isException = useCallback((target: HTMLElement) => {\n return target.closest('.tcn-suggestion-list') != null;\n }, []);\n\n const formatter = useMemo(() => {\n const formatOptions: Intl.DateTimeFormatOptions = {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n };\n\n if (showTime) {\n formatOptions.hour = 'numeric';\n formatOptions.minute = '2-digit';\n formatOptions.hour12 = true;\n }\n\n return new Intl.DateTimeFormat(countryCode, formatOptions);\n }, [countryCode, showTime]);\n\n const formattedDate = value != null ? formatter.format(value) : selectDateMessage;\n\n function openPicker(e: React.MouseEvent<HTMLButtonElement>) {\n setAnchorElement(e.currentTarget);\n }\n\n function closePicker() {\n setAnchorElement(null);\n }\n\n useLayoutEffect(() => {\n requestAnimationFrame(() => {\n if (anchorElement != null) {\n pickerRef.current && pickerRef.current.focus();\n }\n });\n }, [anchorElement]);\n\n function processKeyInput(event: React.KeyboardEvent) {\n if (event.key === 'Escape') {\n closePicker();\n }\n }\n\n function handleRedirect() {\n const picker = pickerRef.current;\n\n if (picker != null) {\n picker.focus();\n }\n }\n\n function dateSelected(date: Date | null) {\n onChange?.(date);\n !showTime && closePicker();\n }\n\n function timeSelected(hour: number, minutes: number, seconds: number) {\n onTimeSelected?.(hour, minutes, seconds);\n closePicker();\n }\n\n return (\n <>\n <Button\n ref={ref}\n className={clsx(styles.button, 'tcn-entry', 'tcn-date-picker-input')}\n hAlign=\"start\"\n disabled={disabled}\n hierarchy={hierarchy}\n onClick={openPicker}\n width={width}\n maxWidth={maxWidth}\n {...props}\n >\n <span className=\"ellipsis\">{formattedDate}</span>\n </Button>\n <Popper\n anchorElement={anchorElement}\n disableClickAway\n veil\n onVeilClick={closePicker}\n onClose={closePicker}\n verticalAnchor=\"bottom\"\n horizontalAnchor=\"start\"\n verticalOrigin=\"top\"\n horizontalOrigin=\"start\"\n open={isOpen}\n isClickAwayException={isException}\n isScrollAwayException={isException}\n restoreFocus\n >\n <ZStack\n padding=\"8px\"\n className={clsx(styles.popover, 'tcn-date-picker-popover')}\n onKeyDown={processKeyInput}\n >\n <DatePicker\n ref={pickerRef}\n value={value}\n onChange={dateSelected}\n min={min}\n max={max}\n showTime={showTime}\n onError={onError}\n disabled={disabled}\n disabledDates={disabledDates}\n countryCode={countryCode}\n renderActions={renderActions}\n onTimeSelected={timeSelected}\n timeIntervalInMinutes={timeIntervalInMinutes}\n />\n <FocusRedirect onRedirect={handleRedirect} />\n </ZStack>\n </Popper>\n </>\n );\n }\n);\n"],"names":["DatePickerInput","React","value","onChange","onError","min","max","disabled","width","maxWidth","minWidth","showTime","timeIntervalInMinutes","hierarchy","disabledDates","selectDateMessage","countryCode","renderActions","onTimeSelected","props","ref","anchorElement","setAnchorElement","useState","isOpen","pickerRef","useRef","isException","useCallback","target","formatter","useMemo","formatOptions","formattedDate","openPicker","e","closePicker","useLayoutEffect","processKeyInput","event","handleRedirect","picker","dateSelected","date","timeSelected","hour","minutes","seconds","jsxs","Fragment","jsx","Button","clsx","styles","Popper","ZStack","DatePicker","FocusRedirect"],"mappings":"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"}
@@ -25,8 +25,11 @@ import "../../utils/hooks/use_resize_observer.js";
25
25
  import "../../utils/dnd/context.js";
26
26
  import { clsx as y } from "clsx";
27
27
  import "../../draggable.module-BgelQsuJ.js";
28
+ import "../../utils/resize/context.js";
29
+ import "../../resizable.module-I6iyBAvM.js";
30
+ import "../../utils/resize/resize_handle.js";
28
31
  import '../../date_picker_year_selector.css';const q = "_date-picker-year-selector_ab05e1f", A = "_date-picker-year-button_fded757", Y = { "date-picker-year-selector": q, "date-picker-year-button": A };
29
- function Ye({
32
+ function Re({
30
33
  presenter: s,
31
34
  onClose: k
32
35
  }) {
@@ -109,6 +112,6 @@ function Ye({
109
112
  );
110
113
  }
111
114
  export {
112
- Ye as DatePickerYearSelector
115
+ Re as DatePickerYearSelector
113
116
  };
114
117
  //# sourceMappingURL=date_picker_year_selector.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"date_picker_year_selector.js","sources":["../../../src/inputs/date_picker/date_picker_year_selector.tsx"],"sourcesContent":["import React, { useEffect, useRef, useState } from 'react';\nimport { ChevronLeftIcon } from '@tcn/icons/chevron_left_icon.js';\nimport { ChevronRightIcon } from '@tcn/icons/chevron_right_icon.js';\nimport { useSignalValue } from '@tcn/state';\nimport { SlimButton } from '../../actions/index.js';\nimport { HStack } from '../../stacks/h_stack.js';\nimport { Spacer } from '../../stacks/spacer.js';\nimport { VStack } from '../../stacks/v_stack.js';\nimport { BodyText, Headline } from '../../typography/index.js';\nimport { DatePickerPresenter } from './date_picker_presenter.js';\nimport styles from './date_picker_year_selector.module.css';\nimport { FocusRedirect } from '../../utils/index.js';\nimport { clsx } from 'clsx';\n\nexport interface DatePickerYearSelectorProps {\n presenter: DatePickerPresenter;\n onClose: () => void;\n}\n\nexport function DatePickerYearSelector({\n presenter,\n onClose,\n}: DatePickerYearSelectorProps) {\n const { min, max, visibleYear, visibleMonth } = useSignalValue(\n presenter.stateBroadcast\n );\n\n const [offset, setOffset] = useState(0);\n const containerRef = useRef<HTMLDivElement | null>(null);\n const minYear = min == null ? -Infinity : min.getFullYear();\n const maxYear = max == null ? Infinity : max.getFullYear();\n const years: React.ReactNode[] = [];\n const remainder = visibleYear % 20;\n let firstYear = visibleYear - remainder + offset;\n let lastYear = firstYear + 19;\n\n for (let x = 0; x < 20; x++) {\n let disabled = false;\n const date = new Date(visibleYear, visibleMonth, 1);\n date.setFullYear(visibleYear - remainder + x + offset);\n\n if (date.getFullYear() > maxYear || date.getFullYear() < minYear) {\n disabled = true;\n }\n\n const Button: any = HStack;\n\n years.push(\n <Button\n as=\"button\"\n key={x}\n width=\"flex\"\n disabled={disabled}\n className={clsx(styles['date-picker-year-button'], 'tcn-date-picker-year-button')}\n data-is-disabled={String(disabled)}\n data-is-selected={String(date.getFullYear() === visibleYear)}\n onClick={() => {\n presenter.setVisibleYear(date.getFullYear());\n onClose();\n }}\n >\n <BodyText>{date.getFullYear()}</BodyText>\n </Button>\n );\n }\n\n function focus() {\n if (containerRef.current != null) {\n containerRef.current.focus();\n }\n }\n\n useEffect(() => {\n if (containerRef.current != null) {\n containerRef.current.focus();\n }\n }, []);\n\n const firstRow = years.slice(0, 4);\n const secondRow = years.slice(4, 8);\n const thirdRow = years.slice(8, 12);\n const fourthRow = years.slice(12, 16);\n const fifthRow = years.slice(16, 20);\n\n function prev() {\n setOffset(offset - 20);\n }\n\n function next() {\n setOffset(offset + 20);\n }\n\n return (\n <VStack\n ref={containerRef}\n tabIndex={0}\n padding=\"8px\"\n className={clsx(\n styles['date-picker-year-selector'],\n 'tcn-date-picker-year-selector'\n )}\n gap=\"4px\"\n >\n <HStack gap=\"4px\">\n <SlimButton onClick={prev} hierarchy=\"tertiary\">\n <ChevronLeftIcon flipOnRtl size=\"md\" />\n </SlimButton>\n <Spacer />\n <Headline\n selectable={false}\n emphasis=\"faint\"\n hierarchy=\"tertiary\"\n >{`${firstYear}-${lastYear}`}</Headline>\n <Spacer />\n <SlimButton hierarchy=\"tertiary\" onClick={next}>\n <ChevronRightIcon size=\"md\" />\n </SlimButton>\n </HStack>\n <HStack gap=\"4px\">{firstRow}</HStack>\n <HStack gap=\"4px\">{secondRow}</HStack>\n <HStack gap=\"4px\">{thirdRow}</HStack>\n <HStack gap=\"4px\">{fourthRow}</HStack>\n <HStack gap=\"4px\">{fifthRow}</HStack>\n <FocusRedirect onRedirect={focus} />\n </VStack>\n );\n}\n"],"names":["DatePickerYearSelector","presenter","onClose","min","max","visibleYear","visibleMonth","useSignalValue","offset","setOffset","useState","containerRef","useRef","minYear","maxYear","years","remainder","firstYear","lastYear","x","disabled","date","Button","HStack","jsx","clsx","styles","BodyText","focus","useEffect","firstRow","secondRow","thirdRow","fourthRow","fifthRow","prev","next","jsxs","VStack","SlimButton","ChevronLeftIcon","Spacer","Headline","ChevronRightIcon","FocusRedirect"],"mappings":"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"}
1
+ {"version":3,"file":"date_picker_year_selector.js","sources":["../../../src/inputs/date_picker/date_picker_year_selector.tsx"],"sourcesContent":["import React, { useEffect, useRef, useState } from 'react';\nimport { ChevronLeftIcon } from '@tcn/icons/chevron_left_icon.js';\nimport { ChevronRightIcon } from '@tcn/icons/chevron_right_icon.js';\nimport { useSignalValue } from '@tcn/state';\nimport { SlimButton } from '../../actions/index.js';\nimport { HStack } from '../../stacks/h_stack.js';\nimport { Spacer } from '../../stacks/spacer.js';\nimport { VStack } from '../../stacks/v_stack.js';\nimport { BodyText, Headline } from '../../typography/index.js';\nimport { DatePickerPresenter } from './date_picker_presenter.js';\nimport styles from './date_picker_year_selector.module.css';\nimport { FocusRedirect } from '../../utils/index.js';\nimport { clsx } from 'clsx';\n\nexport interface DatePickerYearSelectorProps {\n presenter: DatePickerPresenter;\n onClose: () => void;\n}\n\nexport function DatePickerYearSelector({\n presenter,\n onClose,\n}: DatePickerYearSelectorProps) {\n const { min, max, visibleYear, visibleMonth } = useSignalValue(\n presenter.stateBroadcast\n );\n\n const [offset, setOffset] = useState(0);\n const containerRef = useRef<HTMLDivElement | null>(null);\n const minYear = min == null ? -Infinity : min.getFullYear();\n const maxYear = max == null ? Infinity : max.getFullYear();\n const years: React.ReactNode[] = [];\n const remainder = visibleYear % 20;\n let firstYear = visibleYear - remainder + offset;\n let lastYear = firstYear + 19;\n\n for (let x = 0; x < 20; x++) {\n let disabled = false;\n const date = new Date(visibleYear, visibleMonth, 1);\n date.setFullYear(visibleYear - remainder + x + offset);\n\n if (date.getFullYear() > maxYear || date.getFullYear() < minYear) {\n disabled = true;\n }\n\n const Button: any = HStack;\n\n years.push(\n <Button\n as=\"button\"\n key={x}\n width=\"flex\"\n disabled={disabled}\n className={clsx(styles['date-picker-year-button'], 'tcn-date-picker-year-button')}\n data-is-disabled={String(disabled)}\n data-is-selected={String(date.getFullYear() === visibleYear)}\n onClick={() => {\n presenter.setVisibleYear(date.getFullYear());\n onClose();\n }}\n >\n <BodyText>{date.getFullYear()}</BodyText>\n </Button>\n );\n }\n\n function focus() {\n if (containerRef.current != null) {\n containerRef.current.focus();\n }\n }\n\n useEffect(() => {\n if (containerRef.current != null) {\n containerRef.current.focus();\n }\n }, []);\n\n const firstRow = years.slice(0, 4);\n const secondRow = years.slice(4, 8);\n const thirdRow = years.slice(8, 12);\n const fourthRow = years.slice(12, 16);\n const fifthRow = years.slice(16, 20);\n\n function prev() {\n setOffset(offset - 20);\n }\n\n function next() {\n setOffset(offset + 20);\n }\n\n return (\n <VStack\n ref={containerRef}\n tabIndex={0}\n padding=\"8px\"\n className={clsx(\n styles['date-picker-year-selector'],\n 'tcn-date-picker-year-selector'\n )}\n gap=\"4px\"\n >\n <HStack gap=\"4px\">\n <SlimButton onClick={prev} hierarchy=\"tertiary\">\n <ChevronLeftIcon flipOnRtl size=\"md\" />\n </SlimButton>\n <Spacer />\n <Headline\n selectable={false}\n emphasis=\"faint\"\n hierarchy=\"tertiary\"\n >{`${firstYear}-${lastYear}`}</Headline>\n <Spacer />\n <SlimButton hierarchy=\"tertiary\" onClick={next}>\n <ChevronRightIcon size=\"md\" />\n </SlimButton>\n </HStack>\n <HStack gap=\"4px\">{firstRow}</HStack>\n <HStack gap=\"4px\">{secondRow}</HStack>\n <HStack gap=\"4px\">{thirdRow}</HStack>\n <HStack gap=\"4px\">{fourthRow}</HStack>\n <HStack gap=\"4px\">{fifthRow}</HStack>\n <FocusRedirect onRedirect={focus} />\n </VStack>\n );\n}\n"],"names":["DatePickerYearSelector","presenter","onClose","min","max","visibleYear","visibleMonth","useSignalValue","offset","setOffset","useState","containerRef","useRef","minYear","maxYear","years","remainder","firstYear","lastYear","x","disabled","date","Button","HStack","jsx","clsx","styles","BodyText","focus","useEffect","firstRow","secondRow","thirdRow","fourthRow","fifthRow","prev","next","jsxs","VStack","SlimButton","ChevronLeftIcon","Spacer","Headline","ChevronRightIcon","FocusRedirect"],"mappings":"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"}