@accelint/design-toolkit 9.11.2 → 9.12.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 (258) hide show
  1. package/catalog-info.yaml +2 -2
  2. package/dist/components/accordion/context.d.ts +2 -2
  3. package/dist/components/accordion/group.d.ts +2 -2
  4. package/dist/components/accordion/header.d.ts +2 -2
  5. package/dist/components/accordion/index.d.ts +2 -2
  6. package/dist/components/accordion/panel.d.ts +2 -2
  7. package/dist/components/accordion/trigger.d.ts +2 -2
  8. package/dist/components/action-bar/index.d.ts +2 -2
  9. package/dist/components/audio/index.d.ts +2 -2
  10. package/dist/components/avatar/context.d.ts +4 -4
  11. package/dist/components/avatar/index.d.ts +2 -2
  12. package/dist/components/badge/context.d.ts +4 -4
  13. package/dist/components/badge/index.d.ts +2 -2
  14. package/dist/components/breadcrumbs/index.d.ts +2 -2
  15. package/dist/components/breadcrumbs/item.d.ts +2 -2
  16. package/dist/components/button/context.d.ts +8 -8
  17. package/dist/components/button/index.d.ts +2 -2
  18. package/dist/components/button/link.d.ts +2 -2
  19. package/dist/components/button/styles.module.css +1 -1
  20. package/dist/components/button/toggle.d.ts +2 -2
  21. package/dist/components/carousel/context.d.ts +4 -4
  22. package/dist/components/carousel/gallery.d.ts +2 -2
  23. package/dist/components/carousel/index.d.ts +2 -2
  24. package/dist/components/carousel/navigation.d.ts +3 -3
  25. package/dist/components/carousel/position.d.ts +2 -2
  26. package/dist/components/carousel/select.d.ts +2 -2
  27. package/dist/components/carousel/viewer.d.ts +2 -2
  28. package/dist/components/checkbox/context.d.ts +3 -3
  29. package/dist/components/checkbox/group.d.ts +2 -2
  30. package/dist/components/checkbox/index.d.ts +2 -2
  31. package/dist/components/chip/context.d.ts +4 -4
  32. package/dist/components/chip/deletable.d.ts +2 -2
  33. package/dist/components/chip/index.d.ts +2 -2
  34. package/dist/components/chip/list.d.ts +4 -4
  35. package/dist/components/chip/selectable.d.ts +2 -2
  36. package/dist/components/classification-badge/context.d.ts +4 -4
  37. package/dist/components/classification-badge/index.d.ts +2 -2
  38. package/dist/components/classification-banner/context.d.ts +4 -4
  39. package/dist/components/classification-banner/index.d.ts +2 -2
  40. package/dist/components/clock/index.d.ts +2 -2
  41. package/dist/components/color-picker/index.d.ts +2 -2
  42. package/dist/components/combobox-field/context.d.ts +4 -4
  43. package/dist/components/combobox-field/index.d.ts +2 -2
  44. package/dist/components/coordinate-field/context.d.ts +6 -6
  45. package/dist/components/coordinate-field/index.d.ts +2 -2
  46. package/dist/components/coordinate-field/segment.d.ts +2 -2
  47. package/dist/components/date-field/index.d.ts +2 -2
  48. package/dist/components/deferred-collection/index.d.ts +2 -2
  49. package/dist/components/details-list/context.d.ts +4 -4
  50. package/dist/components/details-list/index.d.ts +2 -2
  51. package/dist/components/details-list/label.d.ts +2 -2
  52. package/dist/components/details-list/value.d.ts +2 -2
  53. package/dist/components/dialog/content.d.ts +2 -2
  54. package/dist/components/dialog/context.d.ts +2 -2
  55. package/dist/components/dialog/footer.d.ts +2 -2
  56. package/dist/components/dialog/index.d.ts +2 -2
  57. package/dist/components/dialog/title.d.ts +2 -2
  58. package/dist/components/divider/context.d.ts +4 -4
  59. package/dist/components/divider/index.d.ts +2 -2
  60. package/dist/components/drawer/back.d.ts +2 -2
  61. package/dist/components/drawer/close.d.ts +2 -2
  62. package/dist/components/drawer/content.d.ts +2 -2
  63. package/dist/components/drawer/context.d.ts +2 -2
  64. package/dist/components/drawer/footer.d.ts +2 -2
  65. package/dist/components/drawer/header-title.d.ts +2 -2
  66. package/dist/components/drawer/header.d.ts +2 -2
  67. package/dist/components/drawer/index.d.ts +2 -2
  68. package/dist/components/drawer/layout-main.d.ts +2 -2
  69. package/dist/components/drawer/layout.d.ts +2 -2
  70. package/dist/components/drawer/menu-item.d.ts +2 -2
  71. package/dist/components/drawer/menu.d.ts +2 -2
  72. package/dist/components/drawer/panel.d.ts +2 -2
  73. package/dist/components/drawer/styles.module.css +18 -0
  74. package/dist/components/drawer/trigger.d.ts +2 -2
  75. package/dist/components/drawer/view.d.ts +2 -2
  76. package/dist/components/flashcard/index.d.ts +9 -9
  77. package/dist/components/floating-card/context.d.ts +2 -2
  78. package/dist/components/floating-card/index.d.ts +2 -2
  79. package/dist/components/floating-card/provider.d.ts +2 -2
  80. package/dist/components/gantt/components/base-elements/point.d.ts +2 -2
  81. package/dist/components/gantt/components/base-elements/range.d.ts +2 -2
  82. package/dist/components/gantt/components/containers/external/gantt-content-container/index.d.ts +2 -2
  83. package/dist/components/gantt/components/containers/external/gantt-panel-container/index.d.ts +2 -2
  84. package/dist/components/gantt/components/containers/internal/index.d.ts +2 -2
  85. package/dist/components/gantt/components/containers/internal/layout-container/index.d.ts +2 -2
  86. package/dist/components/gantt/components/containers/internal/virtualized-content-height-container/index.d.ts +2 -2
  87. package/dist/components/gantt/components/content-row/block.d.ts +2 -2
  88. package/dist/components/gantt/components/content-row/bracket.d.ts +3 -3
  89. package/dist/components/gantt/components/content-row/icon-marker.d.ts +2 -2
  90. package/dist/components/gantt/components/content-row/index.d.ts +2 -2
  91. package/dist/components/gantt/components/content-row/marker.d.ts +2 -2
  92. package/dist/components/gantt/components/content-row/spacer.d.ts +2 -2
  93. package/dist/components/gantt/components/current-time/index.d.ts +2 -2
  94. package/dist/components/gantt/components/header/index.d.ts +3 -3
  95. package/dist/components/gantt/components/panel-row/index.d.ts +2 -2
  96. package/dist/components/gantt/components/rows-virtualizer/index.d.ts +3 -3
  97. package/dist/components/gantt/components/timeline/index.d.ts +2 -2
  98. package/dist/components/gantt/components/timeline-chunk/index.d.ts +3 -3
  99. package/dist/components/gantt/context/index.d.ts +4 -4
  100. package/dist/components/gantt/context/store/index.d.ts +4 -4
  101. package/dist/components/gantt/context/temporal-data/index.d.ts +4 -4
  102. package/dist/components/hero/context.d.ts +2 -2
  103. package/dist/components/hero/index.d.ts +2 -2
  104. package/dist/components/hero/subtitle.d.ts +2 -2
  105. package/dist/components/hero/title.d.ts +2 -2
  106. package/dist/components/hotkey/context.d.ts +4 -4
  107. package/dist/components/hotkey/index.d.ts +2 -2
  108. package/dist/components/hotkey/set.d.ts +2 -2
  109. package/dist/components/icon/context.d.ts +4 -4
  110. package/dist/components/icon/index.d.ts +2 -2
  111. package/dist/components/input/context.d.ts +2 -2
  112. package/dist/components/input/index.d.ts +2 -2
  113. package/dist/components/kanban/card-body.d.ts +2 -2
  114. package/dist/components/kanban/card-header-actions.d.ts +2 -2
  115. package/dist/components/kanban/card-header-title.d.ts +2 -2
  116. package/dist/components/kanban/card-header.d.ts +2 -2
  117. package/dist/components/kanban/card.d.ts +2 -2
  118. package/dist/components/kanban/column-actions.d.ts +2 -2
  119. package/dist/components/kanban/column-container.d.ts +2 -2
  120. package/dist/components/kanban/column-content.d.ts +2 -2
  121. package/dist/components/kanban/column-header-actions.d.ts +2 -2
  122. package/dist/components/kanban/column-header-drag-handle.d.ts +2 -2
  123. package/dist/components/kanban/column-header-title.d.ts +2 -2
  124. package/dist/components/kanban/column-header.d.ts +2 -2
  125. package/dist/components/kanban/column.d.ts +2 -2
  126. package/dist/components/kanban/context.d.ts +2 -2
  127. package/dist/components/kanban/header-actions.d.ts +2 -2
  128. package/dist/components/kanban/header-search.d.ts +2 -2
  129. package/dist/components/kanban/header-title.d.ts +2 -2
  130. package/dist/components/kanban/header.d.ts +2 -2
  131. package/dist/components/kanban/kanban.d.ts +4 -4
  132. package/dist/components/label/context.d.ts +4 -4
  133. package/dist/components/label/index.d.ts +2 -2
  134. package/dist/components/lines/index.d.ts +2 -2
  135. package/dist/components/link/context.d.ts +2 -2
  136. package/dist/components/link/index.d.ts +2 -2
  137. package/dist/components/list/context.d.ts +2 -2
  138. package/dist/components/list/index.d.ts +2 -2
  139. package/dist/components/list/item-content.d.ts +2 -2
  140. package/dist/components/list/item-description.d.ts +2 -2
  141. package/dist/components/list/item-title.d.ts +2 -2
  142. package/dist/components/list/item.d.ts +2 -2
  143. package/dist/components/media-controls/context.d.ts +4 -4
  144. package/dist/components/media-controls/fullscreen-button.d.ts +2 -2
  145. package/dist/components/media-controls/index.d.ts +2 -2
  146. package/dist/components/media-controls/mute-button.d.ts +2 -2
  147. package/dist/components/media-controls/play-button.d.ts +2 -2
  148. package/dist/components/media-controls/playback-rate.d.ts +2 -2
  149. package/dist/components/media-controls/seek-button.d.ts +2 -2
  150. package/dist/components/media-controls/time-display.d.ts +2 -2
  151. package/dist/components/media-controls/time-range.d.ts +2 -2
  152. package/dist/components/media-controls/volume-slider.d.ts +2 -2
  153. package/dist/components/menu/context.d.ts +2 -2
  154. package/dist/components/menu/index.d.ts +2 -2
  155. package/dist/components/menu/item-description.d.ts +2 -2
  156. package/dist/components/menu/item-label.d.ts +2 -2
  157. package/dist/components/menu/item.d.ts +2 -2
  158. package/dist/components/menu/section.d.ts +2 -2
  159. package/dist/components/menu/separator.d.ts +2 -2
  160. package/dist/components/menu/submenu.d.ts +2 -2
  161. package/dist/components/notice/index.d.ts +2 -2
  162. package/dist/components/notice/list.d.ts +2 -2
  163. package/dist/components/notice/list.js +7 -9
  164. package/dist/components/notice/list.js.map +1 -1
  165. package/dist/components/notice/notice-icon.d.ts +2 -2
  166. package/dist/components/options/context.d.ts +2 -2
  167. package/dist/components/options/index.d.ts +2 -2
  168. package/dist/components/options/item-content.d.ts +2 -2
  169. package/dist/components/options/item-description.d.ts +2 -2
  170. package/dist/components/options/item-label.d.ts +2 -2
  171. package/dist/components/options/item.d.ts +2 -2
  172. package/dist/components/options/section.d.ts +2 -2
  173. package/dist/components/pagination/context.d.ts +2 -2
  174. package/dist/components/pagination/index.d.ts +2 -2
  175. package/dist/components/pagination/next.d.ts +2 -2
  176. package/dist/components/pagination/pages.d.ts +2 -2
  177. package/dist/components/pagination/prev.d.ts +2 -2
  178. package/dist/components/popover/content.d.ts +2 -2
  179. package/dist/components/popover/footer.d.ts +2 -2
  180. package/dist/components/popover/index.d.ts +2 -2
  181. package/dist/components/popover/title.d.ts +2 -2
  182. package/dist/components/popover/trigger.d.ts +2 -2
  183. package/dist/components/query-builder/action-element.d.ts +2 -2
  184. package/dist/components/query-builder/actions.d.ts +4 -4
  185. package/dist/components/query-builder/combinator-selector.d.ts +2 -2
  186. package/dist/components/query-builder/index.d.ts +2 -2
  187. package/dist/components/query-builder/rule-group.d.ts +4 -4
  188. package/dist/components/query-builder/rule.d.ts +2 -2
  189. package/dist/components/query-builder/value-editor.d.ts +2 -2
  190. package/dist/components/query-builder/value-selector.d.ts +2 -2
  191. package/dist/components/radio/context.d.ts +3 -3
  192. package/dist/components/radio/group.d.ts +2 -2
  193. package/dist/components/radio/index.d.ts +2 -2
  194. package/dist/components/search-field/context.d.ts +4 -4
  195. package/dist/components/search-field/index.d.ts +2 -2
  196. package/dist/components/select-field/context.d.ts +4 -4
  197. package/dist/components/select-field/index.d.ts +2 -2
  198. package/dist/components/select-field/styles.module.css +5 -1
  199. package/dist/components/sidenav/avatar.d.ts +2 -2
  200. package/dist/components/sidenav/content.d.ts +2 -2
  201. package/dist/components/sidenav/context.d.ts +2 -2
  202. package/dist/components/sidenav/footer.d.ts +2 -2
  203. package/dist/components/sidenav/header.d.ts +2 -2
  204. package/dist/components/sidenav/index.d.ts +2 -2
  205. package/dist/components/sidenav/item.d.ts +2 -2
  206. package/dist/components/sidenav/link.d.ts +2 -2
  207. package/dist/components/sidenav/menu-item.d.ts +2 -2
  208. package/dist/components/sidenav/menu.d.ts +2 -2
  209. package/dist/components/sidenav/styles.module.css +14 -8
  210. package/dist/components/sidenav/trigger.d.ts +2 -2
  211. package/dist/components/skeleton/index.d.ts +2 -2
  212. package/dist/components/slider/index.d.ts +2 -2
  213. package/dist/components/status-indicator/index.d.ts +10 -4
  214. package/dist/components/status-indicator/index.js +18 -5
  215. package/dist/components/status-indicator/index.js.map +1 -1
  216. package/dist/components/status-indicator/styles.module.css +8 -0
  217. package/dist/components/status-indicator/types.d.ts +2 -1
  218. package/dist/components/switch/context.d.ts +4 -4
  219. package/dist/components/switch/index.d.ts +2 -2
  220. package/dist/components/table/body.d.ts +2 -2
  221. package/dist/components/table/cell.d.ts +2 -2
  222. package/dist/components/table/context.d.ts +2 -2
  223. package/dist/components/table/header-cell.d.ts +2 -2
  224. package/dist/components/table/header.d.ts +2 -2
  225. package/dist/components/table/index.d.ts +2 -2
  226. package/dist/components/table/row.d.ts +2 -2
  227. package/dist/components/tabs/context.d.ts +6 -6
  228. package/dist/components/tabs/index.d.ts +2 -2
  229. package/dist/components/tabs/list.d.ts +2 -2
  230. package/dist/components/tabs/panel.d.ts +2 -2
  231. package/dist/components/tabs/tab.d.ts +2 -2
  232. package/dist/components/text-area-field/context.d.ts +4 -4
  233. package/dist/components/text-area-field/index.d.ts +2 -2
  234. package/dist/components/text-field/context.d.ts +4 -4
  235. package/dist/components/text-field/index.d.ts +2 -2
  236. package/dist/components/time-field/index.d.ts +2 -2
  237. package/dist/components/tooltip/context.d.ts +2 -2
  238. package/dist/components/tooltip/index.d.ts +2 -2
  239. package/dist/components/tooltip/trigger.d.ts +2 -2
  240. package/dist/components/tree/context.d.ts +3 -3
  241. package/dist/components/tree/index.d.ts +2 -2
  242. package/dist/components/tree/item-actions.d.ts +2 -2
  243. package/dist/components/tree/item-content.d.ts +2 -2
  244. package/dist/components/tree/item-description.d.ts +2 -2
  245. package/dist/components/tree/item-label.d.ts +2 -2
  246. package/dist/components/tree/item-prefix-icon.d.ts +2 -2
  247. package/dist/components/tree/item.d.ts +2 -2
  248. package/dist/components/tree/lines.d.ts +2 -2
  249. package/dist/components/video/index.d.ts +2 -2
  250. package/dist/components/view-stack/context.d.ts +2 -2
  251. package/dist/components/view-stack/index.d.ts +2 -2
  252. package/dist/components/view-stack/trigger.d.ts +2 -2
  253. package/dist/components/view-stack/view.d.ts +2 -2
  254. package/dist/hooks/coordinate-field/use-coordinate-field-state.js +5 -1
  255. package/dist/hooks/coordinate-field/use-coordinate-field-state.js.map +1 -1
  256. package/dist/providers/portal.d.ts +2 -2
  257. package/dist/providers/theme-provider.d.ts +2 -2
  258. package/package.json +7 -7
@@ -12,12 +12,12 @@
12
12
 
13
13
  import { ViewStackContextValue } from "./types.js";
14
14
  import "client-only";
15
- import * as react43 from "react";
15
+ import * as react53 from "react";
16
16
  import { UniqueId } from "@accelint/core";
17
17
 
18
18
  //#region src/components/view-stack/context.d.ts
19
19
  /** Context for sharing state across ViewStack components */
20
- declare const ViewStackContext: react43.Context<ViewStackContextValue>;
20
+ declare const ViewStackContext: react53.Context<ViewStackContextValue>;
21
21
  /** Event handlers for ViewStack events */
22
22
  declare const ViewStackEventHandlers: {
23
23
  readonly back: (stack: UniqueId) => void;
@@ -12,7 +12,7 @@
12
12
 
13
13
  import { ViewStackProps } from "./types.js";
14
14
  import "client-only";
15
- import * as react_jsx_runtime180 from "react/jsx-runtime";
15
+ import * as react_jsx_runtime211 from "react/jsx-runtime";
16
16
 
17
17
  //#region src/components/view-stack/index.d.ts
18
18
 
@@ -47,7 +47,7 @@ declare function ViewStack({
47
47
  children,
48
48
  defaultView,
49
49
  onChange
50
- }: ViewStackProps): react_jsx_runtime180.JSX.Element;
50
+ }: ViewStackProps): react_jsx_runtime211.JSX.Element;
51
51
  //#endregion
52
52
  export { ViewStack };
53
53
  //# sourceMappingURL=index.d.ts.map
@@ -12,7 +12,7 @@
12
12
 
13
13
  import { ViewStackTriggerProps } from "./types.js";
14
14
  import "client-only";
15
- import * as react_jsx_runtime181 from "react/jsx-runtime";
15
+ import * as react_jsx_runtime212 from "react/jsx-runtime";
16
16
 
17
17
  //#region src/components/view-stack/trigger.d.ts
18
18
 
@@ -45,7 +45,7 @@ import * as react_jsx_runtime181 from "react/jsx-runtime";
45
45
  declare function ViewStackTrigger({
46
46
  children,
47
47
  for: types
48
- }: ViewStackTriggerProps): react_jsx_runtime181.JSX.Element;
48
+ }: ViewStackTriggerProps): react_jsx_runtime212.JSX.Element;
49
49
  //#endregion
50
50
  export { ViewStackTrigger };
51
51
  //# sourceMappingURL=trigger.d.ts.map
@@ -12,7 +12,7 @@
12
12
 
13
13
  import { ViewStackViewProps } from "./types.js";
14
14
  import "client-only";
15
- import * as react_jsx_runtime182 from "react/jsx-runtime";
15
+ import * as react_jsx_runtime213 from "react/jsx-runtime";
16
16
 
17
17
  //#region src/components/view-stack/view.d.ts
18
18
 
@@ -43,7 +43,7 @@ import * as react_jsx_runtime182 from "react/jsx-runtime";
43
43
  declare function ViewStackView({
44
44
  id,
45
45
  children
46
- }: ViewStackViewProps): react_jsx_runtime182.JSX.Element | null;
46
+ }: ViewStackViewProps): react_jsx_runtime213.JSX.Element | null;
47
47
  //#endregion
48
48
  export { ViewStackView };
49
49
  //# sourceMappingURL=view.d.ts.map
@@ -70,6 +70,7 @@ function useCoordinateFieldState({ value, defaultValue, format, onChange, onErro
70
70
  const [internalValue, setInternalValue] = useState(defaultValue || null);
71
71
  const [validationErrors, setValidationErrors] = useState([]);
72
72
  const validationTimeoutRef = useRef(null);
73
+ const lastEmittedValueRef = useRef(void 0);
73
74
  const currentValue = value !== void 0 ? value : internalValue;
74
75
  const clearValidationTimeout = () => {
75
76
  if (validationTimeoutRef.current) {
@@ -78,6 +79,7 @@ function useCoordinateFieldState({ value, defaultValue, format, onChange, onErro
78
79
  }
79
80
  };
80
81
  const handleChange = (newValue) => {
82
+ lastEmittedValueRef.current = newValue;
81
83
  if (value === void 0) setInternalValue(newValue);
82
84
  onChange?.(newValue);
83
85
  };
@@ -108,7 +110,9 @@ function useCoordinateFieldState({ value, defaultValue, format, onChange, onErro
108
110
  convertValueToSegmentsOrClear
109
111
  ]);
110
112
  useEffect(() => {
111
- if (value !== void 0) convertValueToSegmentsOrClear(value);
113
+ if (value === void 0) return;
114
+ const lastEmitted = lastEmittedValueRef.current;
115
+ if (!(lastEmitted !== void 0 && (value === lastEmitted || value !== null && lastEmitted !== null && value.lat === lastEmitted.lat && value.lon === lastEmitted.lon))) convertValueToSegmentsOrClear(value);
112
116
  }, [value, convertValueToSegmentsOrClear]);
113
117
  /**
114
118
  * Validates segment values and updates the coordinate state
@@ -1 +1 @@
1
- {"version":3,"file":"use-coordinate-field-state.js","names":[],"sources":["../../../src/hooks/coordinate-field/use-coordinate-field-state.ts"],"sourcesContent":["/*\n * Copyright 2026 Hypergiant Galactic Systems Inc. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {\n type Dispatch,\n type SetStateAction,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport {\n areAllSegmentsFilled,\n convertDDToDisplaySegments,\n convertDisplaySegmentsToDD,\n validateCoordinateSegments,\n} from '../../components/coordinate-field/coordinate-utils';\nimport { getSegmentConfigs } from '../../components/coordinate-field/segment-configs';\nimport type {\n CoordinateSystem,\n CoordinateValue,\n SegmentConfig,\n} from '../../components/coordinate-field/types';\n\n/** Options for the useCoordinateFieldState hook */\nexport interface UseCoordinateFieldStateOptions {\n /** Controlled coordinate value */\n value?: CoordinateValue | null;\n /** Default value for uncontrolled mode */\n defaultValue?: CoordinateValue;\n /** Coordinate format system (dd, ddm, dms, mgrs, utm) */\n format: CoordinateSystem;\n /** Callback when coordinate value changes */\n onChange?:\n | Dispatch<SetStateAction<CoordinateValue | null>>\n | ((value: CoordinateValue | null) => void);\n /** Callback for validation errors */\n onError?: (message: string, context?: Record<string, unknown>) => void;\n /** Register timeouts for cleanup on unmount */\n registerTimeout?: (timeoutId: NodeJS.Timeout) => void;\n}\n\n/** Return value from the useCoordinateFieldState hook */\nexport interface UseCoordinateFieldStateResult {\n /** Current coordinate value (null if incomplete/invalid) */\n currentValue: CoordinateValue | null;\n /** Array of display values for each segment */\n segmentValues: string[];\n /** Array of validation error messages */\n validationErrors: string[];\n /** All segment configurations including literals */\n segmentConfigs: SegmentConfig[];\n /** Only editable segment configurations */\n editableSegmentConfigs: SegmentConfig[];\n /** Handle change of a single segment */\n handleSegmentChange: (index: number, newValue: string) => void;\n /** Handle blur event for a segment */\n handleSegmentBlur: (index: number) => void;\n /** Set all segment values at once */\n setSegmentValues: (values: string[]) => void;\n /** Set validation errors */\n setValidationErrors: (errors: string[]) => void;\n /** First validation error or null */\n effectiveErrorMessage: string | null;\n /** Apply a pasted coordinate value */\n applyPastedCoordinate: (pastedValue: CoordinateValue) => void;\n /** Immediately run pending validation */\n flushPendingValidation: () => void;\n}\n\n/**\n * Manages coordinate segment values, validation, and format conversion\n *\n * @example\n * ```tsx\n * function CoordinateInputs() {\n * const [value, setValue] = useState<CoordinateValue | null>(null);\n * const { registerTimeout } = useTimeoutCleanup();\n *\n * const {\n * currentValue,\n * segmentValues,\n * validationErrors,\n * editableSegmentConfigs,\n * handleSegmentChange,\n * } = useCoordinateFieldState({\n * value,\n * format: 'ddm',\n * onChange: setValue,\n * onError: (msg) => console.error(msg),\n * registerTimeout,\n * });\n *\n * return (\n * <div>\n * {editableSegmentConfigs.map((config, i) => (\n * <input\n * key={i}\n * value={segmentValues[i]}\n * onChange={(e) => handleSegmentChange(i, e.target.value)}\n * placeholder={config.placeholder}\n * />\n * ))}\n * {validationErrors.map((error, i) => (\n * <span key={i}>{error}</span>\n * ))}\n * </div>\n * );\n * }\n * ```\n *\n * @param options - {@link UseCoordinateFieldStateOptions}\n * @param options.value - Controlled coordinate value.\n * @param options.defaultValue - Default value for uncontrolled mode.\n * @param options.format - Coordinate format system (dd, ddm, dms, mgrs, utm).\n * @param options.onChange - Callback when coordinate value changes.\n * @param options.onError - Callback for validation errors.\n * @param options.registerTimeout - Register timeouts for cleanup on unmount.\n * @returns {@link UseCoordinateFieldStateResult} Segment state, validation, and change handlers.\n */\nexport function useCoordinateFieldState({\n value,\n defaultValue,\n format,\n onChange,\n onError,\n registerTimeout,\n}: UseCoordinateFieldStateOptions): UseCoordinateFieldStateResult {\n const [internalValue, setInternalValue] = useState<CoordinateValue | null>(\n defaultValue || null,\n );\n const [validationErrors, setValidationErrors] = useState<string[]>([]);\n const validationTimeoutRef = useRef<NodeJS.Timeout | null>(null);\n\n const currentValue = value !== undefined ? value : internalValue;\n\n const clearValidationTimeout = () => {\n if (validationTimeoutRef.current) {\n clearTimeout(validationTimeoutRef.current);\n validationTimeoutRef.current = null;\n }\n };\n\n const handleChange = (newValue: CoordinateValue | null) => {\n if (value === undefined) {\n setInternalValue(newValue);\n }\n onChange?.(newValue);\n };\n\n const segmentConfigs = useMemo(() => getSegmentConfigs(format), [format]);\n\n const editableSegmentConfigs = useMemo(\n () => segmentConfigs.flat().filter((config) => config.type !== 'literal'),\n [segmentConfigs],\n );\n\n const [segmentValues, setSegmentValues] = useState<string[]>(() => {\n const initialValue = value !== undefined ? value : defaultValue;\n if (!initialValue) {\n return new Array(editableSegmentConfigs.length).fill('');\n }\n\n const segments = convertDDToDisplaySegments(initialValue, format);\n if (!segments) {\n return new Array(editableSegmentConfigs.length).fill('');\n }\n\n return segments;\n });\n\n const convertValueToSegmentsOrClear = useCallback(\n (valueToConvert: CoordinateValue | null) => {\n // Clear any pending validation when value changes\n clearValidationTimeout();\n\n const segments = valueToConvert\n ? convertDDToDisplaySegments(valueToConvert, format)\n : null;\n\n setSegmentValues(\n segments || new Array(editableSegmentConfigs.length).fill(''),\n );\n setValidationErrors([]);\n },\n [format, editableSegmentConfigs.length],\n );\n\n const prevFormatRef = useRef(format);\n\n useEffect(() => {\n if (prevFormatRef.current !== format) {\n prevFormatRef.current = format;\n const valueToConvert = value !== undefined ? value : internalValue;\n convertValueToSegmentsOrClear(valueToConvert);\n }\n }, [format, value, internalValue, convertValueToSegmentsOrClear]);\n\n useEffect(() => {\n if (value !== undefined) {\n convertValueToSegmentsOrClear(value);\n }\n }, [value, convertValueToSegmentsOrClear]);\n\n /**\n * Validates segment values and updates the coordinate state\n *\n * When validation fails, calls onError with \"Invalid coordinate value\" message\n * and context containing the detailed validation errors from @accelint/geo.\n *\n * @param updatedValues - Array of segment values to validate\n */\n const validateAndUpdateCoordinate = (updatedValues: string[]) => {\n const errors = validateCoordinateSegments(updatedValues, format);\n\n if (errors.length > 0) {\n setValidationErrors(errors);\n onError?.('Invalid coordinate value', {\n errors,\n format,\n segments: updatedValues,\n });\n handleChange(null);\n return;\n }\n\n const ddValue = convertDisplaySegmentsToDD(updatedValues, format);\n if (!ddValue) {\n const errorMsg = 'Invalid coordinate value';\n setValidationErrors([errorMsg]);\n onError?.(errorMsg, { format, segments: updatedValues });\n handleChange(null);\n return;\n }\n\n setValidationErrors([]);\n handleChange(ddValue);\n };\n\n const handleSegmentChange = (index: number, newValue: string) => {\n const updatedValues = [...segmentValues];\n\n // Normalize MGRS letter inputs (Band/Grid): uppercase only\n if (\n format === 'mgrs' &&\n (index === 1 || index === 2) &&\n /^[a-zA-Z]+$/.test(newValue)\n ) {\n updatedValues[index] = newValue.toUpperCase();\n } else {\n updatedValues[index] = newValue;\n }\n\n setSegmentValues(updatedValues);\n\n if (areAllSegmentsFilled(updatedValues)) {\n // Clear any pending validation timeout\n clearValidationTimeout();\n\n // Capture segment values at timeout creation\n const capturedValues = [...updatedValues];\n\n // Debounce validation by 400ms when all segments are full\n const timeoutId = setTimeout(() => {\n validateAndUpdateCoordinate(capturedValues);\n validationTimeoutRef.current = null;\n }, 400);\n\n validationTimeoutRef.current = timeoutId;\n registerTimeout?.(timeoutId);\n } else {\n // Clear any pending validation when segments become incomplete\n clearValidationTimeout();\n setValidationErrors([]);\n if (currentValue !== null) {\n handleChange(null);\n }\n }\n };\n\n const handleSegmentBlur = (index: number) => {\n // MGRS zone field: add leading zero to single-digit values on blur\n if (format === 'mgrs' && index === 0) {\n const currentVal = segmentValues[0];\n if (currentVal && currentVal.length === 1 && /^\\d$/.test(currentVal)) {\n const updatedValues = [...segmentValues];\n updatedValues[0] = currentVal.padStart(2, '0');\n setSegmentValues(updatedValues);\n }\n }\n };\n\n const applyPastedCoordinate = (pastedValue: CoordinateValue) => {\n // Clear any pending validation when applying pasted coordinate\n clearValidationTimeout();\n\n const segments = convertDDToDisplaySegments(pastedValue, format);\n\n if (segments) {\n setSegmentValues(segments);\n setValidationErrors([]);\n handleChange(pastedValue);\n }\n };\n\n const flushPendingValidation = () => {\n if (validationTimeoutRef.current) {\n clearValidationTimeout();\n\n // Immediately validate if all segments are filled\n if (areAllSegmentsFilled(segmentValues)) {\n validateAndUpdateCoordinate(segmentValues);\n }\n }\n };\n\n const effectiveErrorMessage = useMemo(\n () => validationErrors[0] || null,\n [validationErrors],\n );\n\n return {\n currentValue,\n segmentValues,\n validationErrors,\n segmentConfigs,\n editableSegmentConfigs,\n handleSegmentChange,\n handleSegmentBlur,\n setSegmentValues,\n setValidationErrors,\n effectiveErrorMessage,\n applyPastedCoordinate,\n flushPendingValidation,\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"use-coordinate-field-state.js","names":[],"sources":["../../../src/hooks/coordinate-field/use-coordinate-field-state.ts"],"sourcesContent":["/*\n * Copyright 2026 Hypergiant Galactic Systems Inc. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {\n type Dispatch,\n type SetStateAction,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport {\n areAllSegmentsFilled,\n convertDDToDisplaySegments,\n convertDisplaySegmentsToDD,\n validateCoordinateSegments,\n} from '../../components/coordinate-field/coordinate-utils';\nimport { getSegmentConfigs } from '../../components/coordinate-field/segment-configs';\nimport type {\n CoordinateSystem,\n CoordinateValue,\n SegmentConfig,\n} from '../../components/coordinate-field/types';\n\n/** Options for the useCoordinateFieldState hook */\nexport interface UseCoordinateFieldStateOptions {\n /** Controlled coordinate value */\n value?: CoordinateValue | null;\n /** Default value for uncontrolled mode */\n defaultValue?: CoordinateValue;\n /** Coordinate format system (dd, ddm, dms, mgrs, utm) */\n format: CoordinateSystem;\n /** Callback when coordinate value changes */\n onChange?:\n | Dispatch<SetStateAction<CoordinateValue | null>>\n | ((value: CoordinateValue | null) => void);\n /** Callback for validation errors */\n onError?: (message: string, context?: Record<string, unknown>) => void;\n /** Register timeouts for cleanup on unmount */\n registerTimeout?: (timeoutId: NodeJS.Timeout) => void;\n}\n\n/** Return value from the useCoordinateFieldState hook */\nexport interface UseCoordinateFieldStateResult {\n /** Current coordinate value (null if incomplete/invalid) */\n currentValue: CoordinateValue | null;\n /** Array of display values for each segment */\n segmentValues: string[];\n /** Array of validation error messages */\n validationErrors: string[];\n /** All segment configurations including literals */\n segmentConfigs: SegmentConfig[];\n /** Only editable segment configurations */\n editableSegmentConfigs: SegmentConfig[];\n /** Handle change of a single segment */\n handleSegmentChange: (index: number, newValue: string) => void;\n /** Handle blur event for a segment */\n handleSegmentBlur: (index: number) => void;\n /** Set all segment values at once */\n setSegmentValues: (values: string[]) => void;\n /** Set validation errors */\n setValidationErrors: (errors: string[]) => void;\n /** First validation error or null */\n effectiveErrorMessage: string | null;\n /** Apply a pasted coordinate value */\n applyPastedCoordinate: (pastedValue: CoordinateValue) => void;\n /** Immediately run pending validation */\n flushPendingValidation: () => void;\n}\n\n/**\n * Manages coordinate segment values, validation, and format conversion\n *\n * @example\n * ```tsx\n * function CoordinateInputs() {\n * const [value, setValue] = useState<CoordinateValue | null>(null);\n * const { registerTimeout } = useTimeoutCleanup();\n *\n * const {\n * currentValue,\n * segmentValues,\n * validationErrors,\n * editableSegmentConfigs,\n * handleSegmentChange,\n * } = useCoordinateFieldState({\n * value,\n * format: 'ddm',\n * onChange: setValue,\n * onError: (msg) => console.error(msg),\n * registerTimeout,\n * });\n *\n * return (\n * <div>\n * {editableSegmentConfigs.map((config, i) => (\n * <input\n * key={i}\n * value={segmentValues[i]}\n * onChange={(e) => handleSegmentChange(i, e.target.value)}\n * placeholder={config.placeholder}\n * />\n * ))}\n * {validationErrors.map((error, i) => (\n * <span key={i}>{error}</span>\n * ))}\n * </div>\n * );\n * }\n * ```\n *\n * @param options - {@link UseCoordinateFieldStateOptions}\n * @param options.value - Controlled coordinate value.\n * @param options.defaultValue - Default value for uncontrolled mode.\n * @param options.format - Coordinate format system (dd, ddm, dms, mgrs, utm).\n * @param options.onChange - Callback when coordinate value changes.\n * @param options.onError - Callback for validation errors.\n * @param options.registerTimeout - Register timeouts for cleanup on unmount.\n * @returns {@link UseCoordinateFieldStateResult} Segment state, validation, and change handlers.\n */\nexport function useCoordinateFieldState({\n value,\n defaultValue,\n format,\n onChange,\n onError,\n registerTimeout,\n}: UseCoordinateFieldStateOptions): UseCoordinateFieldStateResult {\n const [internalValue, setInternalValue] = useState<CoordinateValue | null>(\n defaultValue || null,\n );\n const [validationErrors, setValidationErrors] = useState<string[]>([]);\n const validationTimeoutRef = useRef<NodeJS.Timeout | null>(null);\n // Last value emitted via onChange; `undefined` means nothing emitted yet.\n const lastEmittedValueRef = useRef<CoordinateValue | null | undefined>(\n undefined,\n );\n\n const currentValue = value !== undefined ? value : internalValue;\n\n const clearValidationTimeout = () => {\n if (validationTimeoutRef.current) {\n clearTimeout(validationTimeoutRef.current);\n validationTimeoutRef.current = null;\n }\n };\n\n const handleChange = (newValue: CoordinateValue | null) => {\n lastEmittedValueRef.current = newValue;\n if (value === undefined) {\n setInternalValue(newValue);\n }\n onChange?.(newValue);\n };\n\n const segmentConfigs = useMemo(() => getSegmentConfigs(format), [format]);\n\n const editableSegmentConfigs = useMemo(\n () => segmentConfigs.flat().filter((config) => config.type !== 'literal'),\n [segmentConfigs],\n );\n\n const [segmentValues, setSegmentValues] = useState<string[]>(() => {\n const initialValue = value !== undefined ? value : defaultValue;\n if (!initialValue) {\n return new Array(editableSegmentConfigs.length).fill('');\n }\n\n const segments = convertDDToDisplaySegments(initialValue, format);\n if (!segments) {\n return new Array(editableSegmentConfigs.length).fill('');\n }\n\n return segments;\n });\n\n const convertValueToSegmentsOrClear = useCallback(\n (valueToConvert: CoordinateValue | null) => {\n // Clear any pending validation when value changes\n clearValidationTimeout();\n\n const segments = valueToConvert\n ? convertDDToDisplaySegments(valueToConvert, format)\n : null;\n\n setSegmentValues(\n segments || new Array(editableSegmentConfigs.length).fill(''),\n );\n setValidationErrors([]);\n },\n [format, editableSegmentConfigs.length],\n );\n\n const prevFormatRef = useRef(format);\n\n useEffect(() => {\n if (prevFormatRef.current !== format) {\n prevFormatRef.current = format;\n const valueToConvert = value !== undefined ? value : internalValue;\n convertValueToSegmentsOrClear(valueToConvert);\n }\n }, [format, value, internalValue, convertValueToSegmentsOrClear]);\n\n useEffect(() => {\n if (value === undefined) {\n return;\n }\n\n /*\n * Skip re-syncing when the controlled `value` is just the echo of our own\n * onChange (the parent storing what we emitted). Without this guard, the\n * `handleChange(null)` fired for an in-progress edit (one segment emptied,\n * or an invalid entry) comes straight back and wipes every segment and any\n * validation error that was just set.\n */\n const lastEmitted = lastEmittedValueRef.current;\n const isEchoOfEmit =\n lastEmitted !== undefined &&\n (value === lastEmitted ||\n (value !== null &&\n lastEmitted !== null &&\n value.lat === lastEmitted.lat &&\n value.lon === lastEmitted.lon));\n\n if (!isEchoOfEmit) {\n convertValueToSegmentsOrClear(value);\n }\n }, [value, convertValueToSegmentsOrClear]);\n\n /**\n * Validates segment values and updates the coordinate state\n *\n * When validation fails, calls onError with \"Invalid coordinate value\" message\n * and context containing the detailed validation errors from @accelint/geo.\n *\n * @param updatedValues - Array of segment values to validate\n */\n const validateAndUpdateCoordinate = (updatedValues: string[]) => {\n const errors = validateCoordinateSegments(updatedValues, format);\n\n if (errors.length > 0) {\n setValidationErrors(errors);\n onError?.('Invalid coordinate value', {\n errors,\n format,\n segments: updatedValues,\n });\n handleChange(null);\n return;\n }\n\n const ddValue = convertDisplaySegmentsToDD(updatedValues, format);\n if (!ddValue) {\n const errorMsg = 'Invalid coordinate value';\n setValidationErrors([errorMsg]);\n onError?.(errorMsg, { format, segments: updatedValues });\n handleChange(null);\n return;\n }\n\n setValidationErrors([]);\n handleChange(ddValue);\n };\n\n const handleSegmentChange = (index: number, newValue: string) => {\n const updatedValues = [...segmentValues];\n\n // Normalize MGRS letter inputs (Band/Grid): uppercase only\n if (\n format === 'mgrs' &&\n (index === 1 || index === 2) &&\n /^[a-zA-Z]+$/.test(newValue)\n ) {\n updatedValues[index] = newValue.toUpperCase();\n } else {\n updatedValues[index] = newValue;\n }\n\n setSegmentValues(updatedValues);\n\n if (areAllSegmentsFilled(updatedValues)) {\n // Clear any pending validation timeout\n clearValidationTimeout();\n\n // Capture segment values at timeout creation\n const capturedValues = [...updatedValues];\n\n // Debounce validation by 400ms when all segments are full\n const timeoutId = setTimeout(() => {\n validateAndUpdateCoordinate(capturedValues);\n validationTimeoutRef.current = null;\n }, 400);\n\n validationTimeoutRef.current = timeoutId;\n registerTimeout?.(timeoutId);\n } else {\n // Clear any pending validation when segments become incomplete\n clearValidationTimeout();\n setValidationErrors([]);\n if (currentValue !== null) {\n handleChange(null);\n }\n }\n };\n\n const handleSegmentBlur = (index: number) => {\n // MGRS zone field: add leading zero to single-digit values on blur\n if (format === 'mgrs' && index === 0) {\n const currentVal = segmentValues[0];\n if (currentVal && currentVal.length === 1 && /^\\d$/.test(currentVal)) {\n const updatedValues = [...segmentValues];\n updatedValues[0] = currentVal.padStart(2, '0');\n setSegmentValues(updatedValues);\n }\n }\n };\n\n const applyPastedCoordinate = (pastedValue: CoordinateValue) => {\n // Clear any pending validation when applying pasted coordinate\n clearValidationTimeout();\n\n const segments = convertDDToDisplaySegments(pastedValue, format);\n\n if (segments) {\n setSegmentValues(segments);\n setValidationErrors([]);\n handleChange(pastedValue);\n }\n };\n\n const flushPendingValidation = () => {\n if (validationTimeoutRef.current) {\n clearValidationTimeout();\n\n // Immediately validate if all segments are filled\n if (areAllSegmentsFilled(segmentValues)) {\n validateAndUpdateCoordinate(segmentValues);\n }\n }\n };\n\n const effectiveErrorMessage = useMemo(\n () => validationErrors[0] || null,\n [validationErrors],\n );\n\n return {\n currentValue,\n segmentValues,\n validationErrors,\n segmentConfigs,\n editableSegmentConfigs,\n handleSegmentChange,\n handleSegmentBlur,\n setSegmentValues,\n setValidationErrors,\n effectiveErrorMessage,\n applyPastedCoordinate,\n flushPendingValidation,\n };\n}\n"],"mappings":"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"}
@@ -11,7 +11,7 @@
11
11
  */
12
12
 
13
13
  import { PropsWithChildren, RefObject } from "react";
14
- import * as react_jsx_runtime83 from "react/jsx-runtime";
14
+ import * as react_jsx_runtime15 from "react/jsx-runtime";
15
15
 
16
16
  //#region src/providers/portal.d.ts
17
17
  /**
@@ -30,7 +30,7 @@ declare function PortalProvider({
30
30
  }: PropsWithChildren<{
31
31
  parentRef?: RefObject<HTMLElement | null>;
32
32
  inject?: HTMLElement | null;
33
- }>): react_jsx_runtime83.JSX.Element;
33
+ }>): react_jsx_runtime15.JSX.Element;
34
34
  //#endregion
35
35
  export { PortalProvider };
36
36
  //# sourceMappingURL=portal.d.ts.map
@@ -12,7 +12,7 @@
12
12
 
13
13
  import "client-only";
14
14
  import { PropsWithChildren } from "react";
15
- import * as react_jsx_runtime79 from "react/jsx-runtime";
15
+ import * as react_jsx_runtime16 from "react/jsx-runtime";
16
16
  import { PartialDeep } from "type-fest";
17
17
  import { DomainColorTokens, SemanticColorTokens, ThemeTokens } from "@accelint/design-foundation/tokens/types";
18
18
 
@@ -46,7 +46,7 @@ declare function ThemeProvider({
46
46
  defaultMode,
47
47
  onChange,
48
48
  overrides
49
- }: ThemeProviderProps): react_jsx_runtime79.JSX.Element;
49
+ }: ThemeProviderProps): react_jsx_runtime16.JSX.Element;
50
50
  /**
51
51
  * Access the current theme context
52
52
  *
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@accelint/design-toolkit",
3
3
  "description": "An open-source component library to serve as part of the entire ecosystem of UX for Accelint.",
4
- "version": "9.11.2",
4
+ "version": "9.12.0",
5
5
  "author": "https://hypergiant.com",
6
6
  "$schema": "https://json.schemastore.org/package",
7
7
  "devDependencies": {
@@ -56,11 +56,11 @@
56
56
  "@accelint/converters": "1.0.1",
57
57
  "@accelint/core": "0.6.0",
58
58
  "@accelint/design-foundation": "3.2.0",
59
+ "@accelint/geo": "0.6.1",
59
60
  "@accelint/icons": "3.0.0",
60
61
  "@accelint/logger": "1.1.0",
61
- "@accelint/predicates": "0.5.2",
62
62
  "@accelint/postcss-tailwind-css-modules": "1.1.0",
63
- "@accelint/geo": "0.6.0",
63
+ "@accelint/predicates": "0.5.2",
64
64
  "@accelint/prettier-config": "0.2.1",
65
65
  "@accelint/temporal": "0.1.4",
66
66
  "@accelint/vitest-config": "0.1.6",
@@ -467,14 +467,14 @@
467
467
  "uuid": "^11.1.0",
468
468
  "zod": "^4.1.12",
469
469
  "zustand": "^5.0.3",
470
- "@accelint/bus": "4.0.0",
471
- "@accelint/core": "0.6.0",
472
470
  "@accelint/design-foundation": "3.2.0",
473
- "@accelint/geo": "0.6.0",
474
- "@accelint/converters": "1.0.1",
471
+ "@accelint/core": "0.6.0",
472
+ "@accelint/geo": "0.6.1",
475
473
  "@accelint/icons": "3.0.0",
476
474
  "@accelint/logger": "1.1.0",
477
475
  "@accelint/predicates": "0.5.2",
476
+ "@accelint/converters": "1.0.1",
477
+ "@accelint/bus": "4.0.0",
478
478
  "@accelint/temporal": "0.1.4"
479
479
  },
480
480
  "private": false,