@gunkin/uiify 0.0.17-alpha → 0.0.20-alpha

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 (292) hide show
  1. package/agents/components.md +1 -1
  2. package/agents/index.md +1 -0
  3. package/agents/reference/components/breadcrumb.md +11 -1
  4. package/agents/reference/components/button.md +4 -4
  5. package/agents/reference/components/candle-chart.md +20 -1
  6. package/agents/reference/components/carousel.md +3 -2
  7. package/agents/reference/components/combobox.md +2 -1
  8. package/agents/reference/components/drawer.md +8 -1
  9. package/agents/reference/components/dropdown-menu.md +1 -1
  10. package/agents/reference/components/file-upload.md +12 -1
  11. package/agents/reference/components/line-chart.md +1 -0
  12. package/agents/reference/components/modal.md +8 -1
  13. package/agents/reference/components/number-field.md +14 -3
  14. package/agents/reference/components/pagination.md +22 -1
  15. package/agents/reference/components/slider.md +9 -1
  16. package/agents/reference/components/spinner.md +8 -1
  17. package/agents/reference/components/toast.md +14 -1
  18. package/dist/components/behavior.css +9 -9
  19. package/dist/components/behavior.css.map +1 -1
  20. package/dist/components/breadcrumb/Breadcrumb.d.ts.map +1 -1
  21. package/dist/components/breadcrumb/Breadcrumb.js +21 -4
  22. package/dist/components/breadcrumb/Breadcrumb.js.map +1 -1
  23. package/dist/components/breadcrumb/index.d.ts +1 -1
  24. package/dist/components/breadcrumb/index.d.ts.map +1 -1
  25. package/dist/components/breadcrumb/index.js.map +1 -1
  26. package/dist/components/breadcrumb/types.d.ts +7 -0
  27. package/dist/components/breadcrumb/types.d.ts.map +1 -1
  28. package/dist/components/button/types.d.ts +4 -0
  29. package/dist/components/button/types.d.ts.map +1 -1
  30. package/dist/components/candle-chart/CandleChart.d.ts +1 -1
  31. package/dist/components/candle-chart/CandleChart.d.ts.map +1 -1
  32. package/dist/components/candle-chart/CandleChart.js +81 -46
  33. package/dist/components/candle-chart/CandleChart.js.map +1 -1
  34. package/dist/components/candle-chart/client/CandleChartClient.d.ts.map +1 -1
  35. package/dist/components/candle-chart/client/CandleChartClient.js +5 -0
  36. package/dist/components/candle-chart/client/CandleChartClient.js.map +1 -1
  37. package/dist/components/candle-chart/index.d.ts +1 -1
  38. package/dist/components/candle-chart/index.d.ts.map +1 -1
  39. package/dist/components/candle-chart/index.js.map +1 -1
  40. package/dist/components/candle-chart/types.d.ts +17 -0
  41. package/dist/components/candle-chart/types.d.ts.map +1 -1
  42. package/dist/components/carousel/CarouselMarkup.d.ts.map +1 -1
  43. package/dist/components/carousel/CarouselMarkup.js +20 -3
  44. package/dist/components/carousel/CarouselMarkup.js.map +1 -1
  45. package/dist/components/carousel/carousel-markup.js +2 -2
  46. package/dist/components/carousel/carousel-markup.js.map +1 -1
  47. package/dist/components/carousel/types.d.ts +3 -2
  48. package/dist/components/carousel/types.d.ts.map +1 -1
  49. package/dist/components/combobox/Combobox.d.ts.map +1 -1
  50. package/dist/components/combobox/Combobox.js +37 -23
  51. package/dist/components/combobox/Combobox.js.map +1 -1
  52. package/dist/components/combobox/combobox-store.d.ts.map +1 -1
  53. package/dist/components/combobox/combobox-store.js +5 -2
  54. package/dist/components/combobox/combobox-store.js.map +1 -1
  55. package/dist/components/combobox/types.d.ts +2 -3
  56. package/dist/components/combobox/types.d.ts.map +1 -1
  57. package/dist/components/context-menu/ContextMenu.d.ts.map +1 -1
  58. package/dist/components/context-menu/ContextMenu.js +25 -5
  59. package/dist/components/context-menu/ContextMenu.js.map +1 -1
  60. package/dist/components/drawer/DrawerNative.d.ts +1 -1
  61. package/dist/components/drawer/DrawerNative.d.ts.map +1 -1
  62. package/dist/components/drawer/DrawerNative.js +5 -2
  63. package/dist/components/drawer/DrawerNative.js.map +1 -1
  64. package/dist/components/drawer/index.d.ts +1 -1
  65. package/dist/components/drawer/index.d.ts.map +1 -1
  66. package/dist/components/drawer/index.js.map +1 -1
  67. package/dist/components/drawer/types.d.ts +4 -0
  68. package/dist/components/drawer/types.d.ts.map +1 -1
  69. package/dist/components/dropdown-menu/DropdownMenu.d.ts.map +1 -1
  70. package/dist/components/dropdown-menu/DropdownMenu.js +31 -15
  71. package/dist/components/dropdown-menu/DropdownMenu.js.map +1 -1
  72. package/dist/components/dropdown-menu/DropdownMenuBar.d.ts.map +1 -1
  73. package/dist/components/dropdown-menu/DropdownMenuBar.js +7 -5
  74. package/dist/components/dropdown-menu/DropdownMenuBar.js.map +1 -1
  75. package/dist/components/dropdown-menu/types.d.ts +1 -1
  76. package/dist/components/dropdown-menu/types.d.ts.map +1 -1
  77. package/dist/components/file-upload/FileUpload.d.ts.map +1 -1
  78. package/dist/components/file-upload/FileUpload.js +11 -4
  79. package/dist/components/file-upload/FileUpload.js.map +1 -1
  80. package/dist/components/file-upload/FileUploadRoot.d.ts +1 -1
  81. package/dist/components/file-upload/FileUploadRoot.d.ts.map +1 -1
  82. package/dist/components/file-upload/FileUploadRoot.js +9 -0
  83. package/dist/components/file-upload/FileUploadRoot.js.map +1 -1
  84. package/dist/components/file-upload/index.d.ts +1 -1
  85. package/dist/components/file-upload/index.d.ts.map +1 -1
  86. package/dist/components/file-upload/index.js.map +1 -1
  87. package/dist/components/file-upload/types.d.ts +8 -0
  88. package/dist/components/file-upload/types.d.ts.map +1 -1
  89. package/dist/components/line-chart/LineChart.d.ts.map +1 -1
  90. package/dist/components/line-chart/LineChart.js +3 -2
  91. package/dist/components/line-chart/LineChart.js.map +1 -1
  92. package/dist/components/line-chart/line-chart-geometry.d.ts +2 -2
  93. package/dist/components/line-chart/line-chart-geometry.d.ts.map +1 -1
  94. package/dist/components/line-chart/line-chart-geometry.js +6 -6
  95. package/dist/components/line-chart/line-chart-geometry.js.map +1 -1
  96. package/dist/components/line-chart/types.d.ts +2 -0
  97. package/dist/components/line-chart/types.d.ts.map +1 -1
  98. package/dist/components/modal/Modal.d.ts +1 -1
  99. package/dist/components/modal/Modal.d.ts.map +1 -1
  100. package/dist/components/modal/Modal.js +5 -2
  101. package/dist/components/modal/Modal.js.map +1 -1
  102. package/dist/components/modal/index.d.ts +1 -1
  103. package/dist/components/modal/index.d.ts.map +1 -1
  104. package/dist/components/modal/index.js.map +1 -1
  105. package/dist/components/modal/types.d.ts +4 -0
  106. package/dist/components/modal/types.d.ts.map +1 -1
  107. package/dist/components/number-field/NumberField.d.ts +1 -1
  108. package/dist/components/number-field/NumberField.d.ts.map +1 -1
  109. package/dist/components/number-field/NumberField.js +25 -5
  110. package/dist/components/number-field/NumberField.js.map +1 -1
  111. package/dist/components/number-field/format.d.ts +1 -1
  112. package/dist/components/number-field/format.d.ts.map +1 -1
  113. package/dist/components/number-field/format.js +32 -7
  114. package/dist/components/number-field/format.js.map +1 -1
  115. package/dist/components/number-field/index.d.ts +1 -1
  116. package/dist/components/number-field/index.d.ts.map +1 -1
  117. package/dist/components/number-field/index.js.map +1 -1
  118. package/dist/components/number-field/types.d.ts +11 -2
  119. package/dist/components/number-field/types.d.ts.map +1 -1
  120. package/dist/components/otp-input/OtpInput.d.ts.map +1 -1
  121. package/dist/components/otp-input/OtpInput.js +2 -0
  122. package/dist/components/otp-input/OtpInput.js.map +1 -1
  123. package/dist/components/pagination/Pagination.d.ts.map +1 -1
  124. package/dist/components/pagination/Pagination.js +93 -29
  125. package/dist/components/pagination/Pagination.js.map +1 -1
  126. package/dist/components/pagination/PaginationShell.d.ts +2 -1
  127. package/dist/components/pagination/PaginationShell.d.ts.map +1 -1
  128. package/dist/components/pagination/PaginationShell.js +44 -9
  129. package/dist/components/pagination/PaginationShell.js.map +1 -1
  130. package/dist/components/pagination/index.d.ts +1 -1
  131. package/dist/components/pagination/index.d.ts.map +1 -1
  132. package/dist/components/pagination/index.js.map +1 -1
  133. package/dist/components/pagination/types.d.ts +18 -0
  134. package/dist/components/pagination/types.d.ts.map +1 -1
  135. package/dist/components/slider/client/SliderClient.d.ts.map +1 -1
  136. package/dist/components/slider/client/SliderClient.js +11 -2
  137. package/dist/components/slider/client/SliderClient.js.map +1 -1
  138. package/dist/components/slider/index.d.ts +1 -1
  139. package/dist/components/slider/index.d.ts.map +1 -1
  140. package/dist/components/slider/index.js.map +1 -1
  141. package/dist/components/slider/types.d.ts +5 -0
  142. package/dist/components/slider/types.d.ts.map +1 -1
  143. package/dist/components/spinner/Spinner.d.ts.map +1 -1
  144. package/dist/components/spinner/Spinner.js +6 -3
  145. package/dist/components/spinner/Spinner.js.map +1 -1
  146. package/dist/components/spinner/index.d.ts +1 -1
  147. package/dist/components/spinner/index.d.ts.map +1 -1
  148. package/dist/components/spinner/index.js.map +1 -1
  149. package/dist/components/spinner/types.d.ts +4 -0
  150. package/dist/components/spinner/types.d.ts.map +1 -1
  151. package/dist/components/tags-input/TagsInput.d.ts.map +1 -1
  152. package/dist/components/tags-input/TagsInput.js +2 -0
  153. package/dist/components/tags-input/TagsInput.js.map +1 -1
  154. package/dist/components/toast/Toast.d.ts +1 -1
  155. package/dist/components/toast/Toast.d.ts.map +1 -1
  156. package/dist/components/toast/Toast.js +33 -29
  157. package/dist/components/toast/Toast.js.map +1 -1
  158. package/dist/components/toast/ToastElements.d.ts.map +1 -1
  159. package/dist/components/toast/ToastElements.js +24 -12
  160. package/dist/components/toast/ToastElements.js.map +1 -1
  161. package/dist/components/toast/index.d.ts +1 -1
  162. package/dist/components/toast/index.d.ts.map +1 -1
  163. package/dist/components/toast/index.js.map +1 -1
  164. package/dist/components/toast/types.d.ts +10 -0
  165. package/dist/components/toast/types.d.ts.map +1 -1
  166. package/dist/components/toolbar/Toolbar.d.ts +2 -2
  167. package/dist/components/toolbar/Toolbar.d.ts.map +1 -1
  168. package/dist/components/toolbar/Toolbar.js +8 -4
  169. package/dist/components/toolbar/Toolbar.js.map +1 -1
  170. package/dist/core/direction.d.ts +2 -0
  171. package/dist/core/direction.d.ts.map +1 -1
  172. package/dist/core/direction.js +8 -3
  173. package/dist/core/direction.js.map +1 -1
  174. package/dist/core/dismissable-layer-registry.d.ts.map +1 -1
  175. package/dist/core/dismissable-layer-registry.js +3 -1
  176. package/dist/core/dismissable-layer-registry.js.map +1 -1
  177. package/dist/core/format-label.d.ts +2 -0
  178. package/dist/core/format-label.d.ts.map +1 -0
  179. package/dist/core/format-label.js +13 -0
  180. package/dist/core/format-label.js.map +1 -0
  181. package/dist/core/ime.d.ts +16 -0
  182. package/dist/core/ime.d.ts.map +1 -0
  183. package/dist/core/ime.js +7 -0
  184. package/dist/core/ime.js.map +1 -0
  185. package/dist/core/index.d.ts +3 -0
  186. package/dist/core/index.d.ts.map +1 -1
  187. package/dist/core/index.js +3 -0
  188. package/dist/core/index.js.map +1 -1
  189. package/dist/core/roving-focus-store.d.ts +3 -2
  190. package/dist/core/roving-focus-store.d.ts.map +1 -1
  191. package/dist/core/roving-focus-store.js +5 -3
  192. package/dist/core/roving-focus-store.js.map +1 -1
  193. package/dist/core/roving-focus.d.ts.map +1 -1
  194. package/dist/core/roving-focus.js +10 -5
  195. package/dist/core/roving-focus.js.map +1 -1
  196. package/dist/core/text-direction.d.ts +7 -0
  197. package/dist/core/text-direction.d.ts.map +1 -0
  198. package/dist/core/text-direction.js +7 -0
  199. package/dist/core/text-direction.js.map +1 -0
  200. package/dist/styles/index.css +1 -1
  201. package/package.json +2 -1
  202. package/skills/uiify/SKILL.md +58 -33
  203. package/skills/uiify/references/compositions/card-rhythm.md +0 -2
  204. package/skills/uiify/references/compositions/destructive-confirmation.md +1 -3
  205. package/skills/uiify/references/compositions/form-grouping.md +0 -2
  206. package/skills/uiify/references/compositions/hero-actions.md +3 -5
  207. package/skills/uiify/references/compositions/page-frame.md +0 -2
  208. package/skills/uiify/references/compositions/pricing-actions.md +0 -2
  209. package/skills/uiify/references/compositions/save-feedback.md +1 -3
  210. package/skills/uiify/references/compositions/table-controls.md +1 -3
  211. package/skills/uiify/references/elements/accordion.md +38 -0
  212. package/skills/uiify/references/elements/alert-modal.md +32 -5
  213. package/skills/uiify/references/elements/avatar.md +31 -2
  214. package/skills/uiify/references/elements/badge.md +32 -3
  215. package/skills/uiify/references/elements/bar-chart.md +39 -7
  216. package/skills/uiify/references/elements/breadcrumb.md +38 -0
  217. package/skills/uiify/references/elements/button.md +38 -3
  218. package/skills/uiify/references/elements/candle-chart.md +40 -0
  219. package/skills/uiify/references/elements/card.md +38 -1
  220. package/skills/uiify/references/elements/carousel.md +40 -0
  221. package/skills/uiify/references/elements/checkbox.md +39 -0
  222. package/skills/uiify/references/elements/code-block.md +31 -2
  223. package/skills/uiify/references/elements/collapsible.md +38 -0
  224. package/skills/uiify/references/elements/color-picker.md +39 -0
  225. package/skills/uiify/references/elements/combobox.md +37 -0
  226. package/skills/uiify/references/elements/command-palette.md +33 -12
  227. package/skills/uiify/references/elements/context-menu.md +38 -0
  228. package/skills/uiify/references/elements/cookie-banner.md +30 -2
  229. package/skills/uiify/references/elements/date-picker.md +33 -9
  230. package/skills/uiify/references/elements/divider.md +30 -2
  231. package/skills/uiify/references/elements/drawer.md +38 -0
  232. package/skills/uiify/references/elements/dropdown-menu.md +38 -0
  233. package/skills/uiify/references/elements/empty-state.md +30 -2
  234. package/skills/uiify/references/elements/feature-grid.md +41 -1
  235. package/skills/uiify/references/elements/field.md +33 -3
  236. package/skills/uiify/references/elements/file-upload.md +40 -0
  237. package/skills/uiify/references/elements/footer.md +35 -4
  238. package/skills/uiify/references/elements/form.md +31 -4
  239. package/skills/uiify/references/elements/header.md +31 -3
  240. package/skills/uiify/references/elements/hero.md +43 -3
  241. package/skills/uiify/references/elements/hover-card.md +38 -0
  242. package/skills/uiify/references/elements/image-gallery.md +36 -4
  243. package/skills/uiify/references/elements/inline-alert.md +30 -2
  244. package/skills/uiify/references/elements/input.md +31 -4
  245. package/skills/uiify/references/elements/line-chart.md +38 -0
  246. package/skills/uiify/references/elements/logo-wall.md +31 -2
  247. package/skills/uiify/references/elements/modal.md +38 -0
  248. package/skills/uiify/references/elements/number-field.md +41 -0
  249. package/skills/uiify/references/elements/otp-input.md +39 -0
  250. package/skills/uiify/references/elements/pagination.md +33 -4
  251. package/skills/uiify/references/elements/password-input.md +33 -9
  252. package/skills/uiify/references/elements/popup.md +38 -0
  253. package/skills/uiify/references/elements/pricing-table.md +55 -2
  254. package/skills/uiify/references/elements/progress-bar.md +32 -4
  255. package/skills/uiify/references/elements/radio-group.md +39 -0
  256. package/skills/uiify/references/elements/rating.md +39 -0
  257. package/skills/uiify/references/elements/search-input.md +35 -4
  258. package/skills/uiify/references/elements/segmented-control.md +39 -0
  259. package/skills/uiify/references/elements/select.md +29 -1
  260. package/skills/uiify/references/elements/sidebar.md +33 -10
  261. package/skills/uiify/references/elements/skeleton.md +38 -0
  262. package/skills/uiify/references/elements/slider.md +39 -0
  263. package/skills/uiify/references/elements/spinner.md +38 -0
  264. package/skills/uiify/references/elements/stats-bar.md +30 -2
  265. package/skills/uiify/references/elements/stepper.md +32 -9
  266. package/skills/uiify/references/elements/switch.md +31 -4
  267. package/skills/uiify/references/elements/table-of-contents.md +39 -0
  268. package/skills/uiify/references/elements/table.md +32 -3
  269. package/skills/uiify/references/elements/tabs.md +38 -0
  270. package/skills/uiify/references/elements/tags-input.md +39 -0
  271. package/skills/uiify/references/elements/testimonial.md +35 -4
  272. package/skills/uiify/references/elements/textarea.md +30 -3
  273. package/skills/uiify/references/elements/timeline.md +31 -3
  274. package/skills/uiify/references/elements/toast.md +27 -1
  275. package/skills/uiify/references/elements/toggle-group.md +39 -0
  276. package/skills/uiify/references/elements/toggle.md +39 -0
  277. package/skills/uiify/references/elements/toolbar.md +39 -0
  278. package/skills/uiify/references/elements/tooltip.md +38 -0
  279. package/skills/uiify/references/elements/virtual-scroll.md +39 -0
  280. package/skills/uiify/references/examples/alert-confirmation.md +34 -0
  281. package/skills/uiify/references/examples/field-validation.md +37 -0
  282. package/skills/uiify/references/examples/select-basic.md +35 -0
  283. package/skills/uiify/references/examples/table-controls.md +40 -0
  284. package/skills/uiify/references/guides/assets.md +14 -0
  285. package/skills/uiify/references/guides/content.md +11 -0
  286. package/skills/uiify/references/guides/hierarchy.md +14 -0
  287. package/skills/uiify/references/guides/i18n.md +21 -0
  288. package/skills/uiify/references/guides/reference.md +9 -0
  289. package/skills/uiify/references/guides/states.md +12 -0
  290. package/skills/uiify/references/guides/surface.md +27 -0
  291. package/skills/uiify/scripts/lint.mjs +1 -1
  292. package/skills/uiify/scripts/static.mjs +150 -14
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/line-chart/LineChart.tsx"],"sourcesContent":["import type { ElementType, KeyboardEvent, PointerEvent, ReactElement } from \"react\";\nimport { useRenderElement } from \"@gunkin/uiify/core/render\";\nimport {\n axisLabelsFor,\n axisStyle,\n crosshairStyle,\n cursorStyle,\n geometryFor,\n getValueBounds,\n monthLabelsFor,\n pointStyle,\n pointsStyle,\n slotCrosshairStyle,\n valueLabelsFor,\n} from \"./line-chart-geometry.js\";\nimport type { LineChartPointProps, LineChartProps, LineChartViewProps } from \"./types.js\";\n\n/** One point and the segment from its predecessor; shared by the static list and virtual rows. */\nexport function LineChartPoint({\n as: Tag,\n point,\n previousPoint,\n index,\n count,\n min,\n max,\n interactive,\n isActive,\n isSelected,\n cursorY,\n onPointClick,\n onPointPointerLeave,\n onPointPointerMove,\n}: LineChartPointProps): ReactElement {\n const geometry = geometryFor(point, previousPoint, index, count, min, max);\n const handleKeyDown = (event: KeyboardEvent<HTMLButtonElement>) => {\n if (event.key !== \"Enter\" && event.key !== \" \") return;\n event.preventDefault();\n onPointClick?.(index);\n };\n\n return (\n <Tag\n aria-hidden={interactive ? undefined : true}\n data-part=\"point\"\n data-first={previousPoint === undefined ? \"\" : undefined}\n data-crosshair-active={interactive && isActive ? \"\" : undefined}\n data-point-selected={interactive && isSelected ? \"\" : undefined}\n data-time={String(point.time)}\n data-trend={geometry.trend}\n style={pointStyle(geometry, isActive ? cursorY : undefined)}\n >\n {interactive ? (\n <button\n data-part=\"point-hit\"\n type=\"button\"\n aria-label={`Point ${String(point.time)}`}\n aria-pressed={isSelected}\n onClick={() => onPointClick?.(index)}\n onKeyDown={handleKeyDown}\n onPointerLeave={onPointPointerLeave}\n onPointerMove={(event: PointerEvent<HTMLButtonElement>) =>\n onPointPointerMove?.({ index, offsetY: event.nativeEvent.offsetY })\n }\n />\n ) : null}\n </Tag>\n );\n}\nLineChartPoint.displayName = \"LineChartPoint\";\n\nexport function LineChart<TAs extends ElementType = \"figure\">(\n props: LineChartProps<TAs>,\n): ReactElement | null {\n const {\n as,\n render,\n data,\n xAxis,\n yAxis,\n \"aria-label\": ariaLabel,\n activePointIndex,\n cursorY,\n interactive = false,\n onPointClick,\n onPointPointerLeave,\n onPointPointerMove,\n selectedPointIndex,\n pointLayer,\n announceReadout = true,\n slotCount,\n slotOffset = 0,\n ...consumerProps\n } = props as LineChartProps<\"figure\"> & LineChartViewProps;\n const { min, max } = getValueBounds(data);\n const label = ariaLabel ?? \"Line chart\";\n const timeLabels = axisLabelsFor(xAxis, monthLabelsFor(data));\n const valueLabels = axisLabelsFor(yAxis, valueLabelsFor(min, max));\n const readoutIndex =\n activePointIndex ?? selectedPointIndex ?? (data.length > 0 ? data.length - 1 : undefined);\n const readoutPoint = readoutIndex === undefined ? undefined : data[readoutIndex];\n const crosshairPoint = activePointIndex === undefined ? undefined : data[activePointIndex];\n const points = pointLayer ?? (\n <ol data-part=\"points\" aria-label={`${label} points`} style={pointsStyle(data.length)}>\n {data.map((point, index) => (\n <LineChartPoint\n key={`${point.time}-${index}`}\n as=\"li\"\n point={point}\n previousPoint={data[index - 1]}\n index={index}\n count={data.length}\n min={min}\n max={max}\n interactive={interactive}\n isActive={activePointIndex === index}\n isSelected={selectedPointIndex === index}\n cursorY={cursorY}\n onPointClick={onPointClick}\n onPointPointerLeave={onPointPointerLeave}\n onPointPointerMove={onPointPointerMove}\n />\n ))}\n </ol>\n );\n const crosshairFor = (index: number, y: number | undefined) =>\n slotCount === undefined\n ? crosshairStyle(index, data.length, y)\n : slotCrosshairStyle(slotOffset + index, slotCount, y);\n\n return useRenderElement({\n as,\n defaultTag: \"figure\",\n props: {\n ...consumerProps,\n \"aria-label\": label,\n \"data-uiify-line-chart\": \"\",\n \"data-interactive\": interactive ? \"\" : undefined,\n children: (\n <>\n <figcaption>{label}</figcaption>\n {interactive && readoutPoint ? (\n <div data-part=\"readout\" aria-live={announceReadout ? \"polite\" : \"off\"}>\n <span data-part=\"readout-time\">{String(readoutPoint.time)}</span>\n <span>{readoutPoint.value}</span>\n </div>\n ) : null}\n <div data-part=\"plot\" aria-hidden={interactive ? undefined : true}>\n <div data-part=\"scroll-viewport\">\n <div data-part=\"canvas\">\n <div data-part=\"viewport\">\n {points}\n {interactive && crosshairPoint && activePointIndex !== undefined ? (\n <div\n data-part=\"crosshair\"\n aria-hidden=\"true\"\n style={crosshairFor(activePointIndex, cursorY)}\n >\n <span data-part=\"crosshair-marker\">+</span>\n </div>\n ) : null}\n </div>\n <div data-part=\"time-viewport\">\n <ol data-part=\"time-axis\" data-axis=\"time\" aria-label={`${label} dates`}>\n {timeLabels.map((axisLabel, index) => (\n <li\n key={`${axisLabel.position}-${index}`}\n style={axisStyle(\"x\", axisLabel.position)}\n >\n {axisLabel.label}\n </li>\n ))}\n {interactive && crosshairPoint && activePointIndex !== undefined ? (\n <li\n data-part=\"crosshair-time\"\n style={crosshairFor(activePointIndex, undefined)}\n >\n {String(crosshairPoint.time)}\n </li>\n ) : null}\n </ol>\n </div>\n </div>\n </div>\n <ol data-part=\"value-axis\" data-axis=\"value\" aria-label={`${label} values`}>\n {valueLabels.map((axisLabel, index) => (\n <li\n key={`${axisLabel.position}-${index}`}\n style={axisStyle(\"y\", axisLabel.position)}\n >\n {axisLabel.label}\n </li>\n ))}\n {interactive && crosshairPoint && activePointIndex !== undefined ? (\n <li data-part=\"crosshair-value\" style={cursorStyle(cursorY)}>\n {crosshairPoint.value}\n </li>\n ) : null}\n </ol>\n </div>\n <table data-part=\"data\" aria-label={`${label} data`}>\n <thead>\n <tr>\n <th scope=\"col\">Time</th>\n <th scope=\"col\">Value</th>\n </tr>\n </thead>\n <tbody>\n {data.map((point, index) => (\n <tr key={`${point.time}-${index}`}>\n <th scope=\"row\">{String(point.time)}</th>\n <td>{point.value}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </>\n ),\n },\n render,\n state: {},\n });\n}\nLineChart.displayName = \"LineChart\";\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/components/line-chart/LineChart.tsx"],"sourcesContent":["import type { ElementType, KeyboardEvent, PointerEvent, ReactElement } from \"react\";\nimport { useRenderElement } from \"@gunkin/uiify/core/render\";\nimport {\n axisLabelsFor,\n axisStyle,\n crosshairStyle,\n cursorStyle,\n geometryFor,\n getValueBounds,\n monthLabelsFor,\n pointStyle,\n pointsStyle,\n slotCrosshairStyle,\n valueLabelsFor,\n} from \"./line-chart-geometry.js\";\nimport type { LineChartPointProps, LineChartProps, LineChartViewProps } from \"./types.js\";\n\n/** One point and the segment from its predecessor; shared by the static list and virtual rows. */\nexport function LineChartPoint({\n as: Tag,\n point,\n previousPoint,\n index,\n count,\n min,\n max,\n interactive,\n isActive,\n isSelected,\n cursorY,\n onPointClick,\n onPointPointerLeave,\n onPointPointerMove,\n}: LineChartPointProps): ReactElement {\n const geometry = geometryFor(point, previousPoint, index, count, min, max);\n const handleKeyDown = (event: KeyboardEvent<HTMLButtonElement>) => {\n if (event.key !== \"Enter\" && event.key !== \" \") return;\n event.preventDefault();\n onPointClick?.(index);\n };\n\n return (\n <Tag\n aria-hidden={interactive ? undefined : true}\n data-part=\"point\"\n data-first={previousPoint === undefined ? \"\" : undefined}\n data-crosshair-active={interactive && isActive ? \"\" : undefined}\n data-point-selected={interactive && isSelected ? \"\" : undefined}\n data-time={String(point.time)}\n data-trend={geometry.trend}\n style={pointStyle(geometry, isActive ? cursorY : undefined)}\n >\n {interactive ? (\n <button\n data-part=\"point-hit\"\n type=\"button\"\n aria-label={`Point ${String(point.time)}`}\n aria-pressed={isSelected}\n onClick={() => onPointClick?.(index)}\n onKeyDown={handleKeyDown}\n onPointerLeave={onPointPointerLeave}\n onPointerMove={(event: PointerEvent<HTMLButtonElement>) =>\n onPointPointerMove?.({ index, offsetY: event.nativeEvent.offsetY })\n }\n />\n ) : null}\n </Tag>\n );\n}\nLineChartPoint.displayName = \"LineChartPoint\";\n\nexport function LineChart<TAs extends ElementType = \"figure\">(\n props: LineChartProps<TAs>,\n): ReactElement | null {\n const {\n as,\n render,\n data,\n xAxis,\n yAxis,\n \"aria-label\": ariaLabel,\n activePointIndex,\n cursorY,\n interactive = false,\n locale = \"en-US\",\n onPointClick,\n onPointPointerLeave,\n onPointPointerMove,\n selectedPointIndex,\n pointLayer,\n announceReadout = true,\n slotCount,\n slotOffset = 0,\n ...consumerProps\n } = props as LineChartProps<\"figure\"> & LineChartViewProps;\n const { min, max } = getValueBounds(data);\n const label = ariaLabel ?? \"Line chart\";\n const timeLabels = axisLabelsFor(xAxis, monthLabelsFor(data, locale));\n const valueLabels = axisLabelsFor(yAxis, valueLabelsFor(min, max, locale));\n const readoutIndex =\n activePointIndex ?? selectedPointIndex ?? (data.length > 0 ? data.length - 1 : undefined);\n const readoutPoint = readoutIndex === undefined ? undefined : data[readoutIndex];\n const crosshairPoint = activePointIndex === undefined ? undefined : data[activePointIndex];\n const points = pointLayer ?? (\n <ol data-part=\"points\" aria-label={`${label} points`} style={pointsStyle(data.length)}>\n {data.map((point, index) => (\n <LineChartPoint\n key={`${point.time}-${index}`}\n as=\"li\"\n point={point}\n previousPoint={data[index - 1]}\n index={index}\n count={data.length}\n min={min}\n max={max}\n interactive={interactive}\n isActive={activePointIndex === index}\n isSelected={selectedPointIndex === index}\n cursorY={cursorY}\n onPointClick={onPointClick}\n onPointPointerLeave={onPointPointerLeave}\n onPointPointerMove={onPointPointerMove}\n />\n ))}\n </ol>\n );\n const crosshairFor = (index: number, y: number | undefined) =>\n slotCount === undefined\n ? crosshairStyle(index, data.length, y)\n : slotCrosshairStyle(slotOffset + index, slotCount, y);\n\n return useRenderElement({\n as,\n defaultTag: \"figure\",\n props: {\n ...consumerProps,\n \"aria-label\": label,\n \"data-uiify-line-chart\": \"\",\n \"data-interactive\": interactive ? \"\" : undefined,\n children: (\n <>\n <figcaption>{label}</figcaption>\n {interactive && readoutPoint ? (\n <div data-part=\"readout\" aria-live={announceReadout ? \"polite\" : \"off\"}>\n <span data-part=\"readout-time\">{String(readoutPoint.time)}</span>\n <span>{readoutPoint.value}</span>\n </div>\n ) : null}\n <div data-part=\"plot\" aria-hidden={interactive ? undefined : true}>\n <div data-part=\"scroll-viewport\">\n <div data-part=\"canvas\">\n <div data-part=\"viewport\">\n {points}\n {interactive && crosshairPoint && activePointIndex !== undefined ? (\n <div\n data-part=\"crosshair\"\n aria-hidden=\"true\"\n style={crosshairFor(activePointIndex, cursorY)}\n >\n <span data-part=\"crosshair-marker\">+</span>\n </div>\n ) : null}\n </div>\n <div data-part=\"time-viewport\">\n <ol data-part=\"time-axis\" data-axis=\"time\" aria-label={`${label} dates`}>\n {timeLabels.map((axisLabel, index) => (\n <li\n key={`${axisLabel.position}-${index}`}\n style={axisStyle(\"x\", axisLabel.position)}\n >\n {axisLabel.label}\n </li>\n ))}\n {interactive && crosshairPoint && activePointIndex !== undefined ? (\n <li\n data-part=\"crosshair-time\"\n style={crosshairFor(activePointIndex, undefined)}\n >\n {String(crosshairPoint.time)}\n </li>\n ) : null}\n </ol>\n </div>\n </div>\n </div>\n <ol data-part=\"value-axis\" data-axis=\"value\" aria-label={`${label} values`}>\n {valueLabels.map((axisLabel, index) => (\n <li\n key={`${axisLabel.position}-${index}`}\n style={axisStyle(\"y\", axisLabel.position)}\n >\n {axisLabel.label}\n </li>\n ))}\n {interactive && crosshairPoint && activePointIndex !== undefined ? (\n <li data-part=\"crosshair-value\" style={cursorStyle(cursorY)}>\n {crosshairPoint.value}\n </li>\n ) : null}\n </ol>\n </div>\n <table data-part=\"data\" aria-label={`${label} data`}>\n <thead>\n <tr>\n <th scope=\"col\">Time</th>\n <th scope=\"col\">Value</th>\n </tr>\n </thead>\n <tbody>\n {data.map((point, index) => (\n <tr key={`${point.time}-${index}`}>\n <th scope=\"row\">{String(point.time)}</th>\n <td>{point.value}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </>\n ),\n },\n render,\n state: {},\n });\n}\nLineChart.displayName = \"LineChart\";\n"],"mappings":"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","names":[]}
@@ -46,8 +46,8 @@ export interface AxisLabel {
46
46
  readonly position: number;
47
47
  }
48
48
  export declare function pointPosition(index: number, count: number): number;
49
- export declare function monthLabelsFor(data: readonly LineChartData[]): AxisLabel[];
50
- export declare function valueLabelsFor(min: number, max: number): AxisLabel[];
49
+ export declare function monthLabelsFor(data: readonly LineChartData[], locale: string): AxisLabel[];
50
+ export declare function valueLabelsFor(min: number, max: number, locale: string): AxisLabel[];
51
51
  export declare function geometryFor(point: LineChartData, previousPoint: LineChartData | undefined, index: number, count: number, min: number, max: number): LinePointGeometry;
52
52
  export declare function pointStyle(geometry: LinePointGeometry, cursorY: number | undefined): PointStyle;
53
53
  export declare function pointsStyle(count: number): PointsStyle;
@@ -1 +1 @@
1
- {"version":3,"file":"line-chart-geometry.d.ts","sourceRoot":"","sources":["../../../src/components/line-chart/line-chart-geometry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"line-chart-geometry.d.ts","sourceRoot":"","sources":["../../../src/components/line-chart/line-chart-geometry.ts"],"names":[],"mappings":"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"}
@@ -21,10 +21,10 @@ function monthKey(time) {
21
21
  if (Number.isNaN(date.getTime())) return String(time);
22
22
  return `${date.getUTCFullYear()}-${date.getUTCMonth()}`;
23
23
  }
24
- function monthLabel(time) {
24
+ function monthLabel(time, locale) {
25
25
  const date = new Date(time);
26
26
  if (Number.isNaN(date.getTime())) return String(time);
27
- return new Intl.DateTimeFormat("en-US", {
27
+ return new Intl.DateTimeFormat(locale, {
28
28
  month: "short",
29
29
  timeZone: "UTC",
30
30
  year: "2-digit"
@@ -34,7 +34,7 @@ function pointPosition(index, count) {
34
34
  if (count <= 1) return 50;
35
35
  return index / (count - 1) * 100;
36
36
  }
37
- function monthLabelsFor(data) {
37
+ function monthLabelsFor(data, locale) {
38
38
  const labels = [];
39
39
  const seen = /* @__PURE__ */ new Set();
40
40
  data.forEach((point, index) => {
@@ -42,20 +42,20 @@ function monthLabelsFor(data) {
42
42
  if (seen.has(key)) return;
43
43
  seen.add(key);
44
44
  labels.push({
45
- label: monthLabel(point.time),
45
+ label: monthLabel(point.time, locale),
46
46
  position: pointPosition(index, data.length)
47
47
  });
48
48
  });
49
49
  return labels;
50
50
  }
51
- function valueLabelsFor(min, max) {
51
+ function valueLabelsFor(min, max, locale) {
52
52
  const tickCount = 6;
53
53
  const range = max - min;
54
54
  return Array.from({ length: tickCount }, (_, index) => {
55
55
  const ratio = index / (tickCount - 1);
56
56
  const value = max - range * ratio;
57
57
  return {
58
- label: new Intl.NumberFormat("en-US", { maximumFractionDigits: 2 }).format(value),
58
+ label: new Intl.NumberFormat(locale, { maximumFractionDigits: 2 }).format(value),
59
59
  position: ratio * 100
60
60
  };
61
61
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/line-chart/line-chart-geometry.ts"],"sourcesContent":["import type { CSSProperties, ReactNode } from \"react\";\nimport type { LineChartAxisLabel, LineChartData } from \"./types.js\";\n\nexport interface PointStyle extends CSSProperties {\n \"--line-prev-x\"?: string;\n \"--line-prev-y\"?: string;\n \"--line-rise\"?: string;\n \"--line-slot\": string;\n \"--line-x\": string;\n \"--line-y\": string;\n \"--line-cursor-y\"?: string;\n}\n\nexport interface PointsStyle extends CSSProperties {\n \"--line-count\": string;\n /** One segment's width in percentage points of the viewport width, unitless. */\n \"--line-run\": string;\n \"--line-segment-slot\": string;\n}\n\nexport interface CrosshairStyle extends CSSProperties {\n \"--line-crosshair-x\": string;\n \"--line-cursor-y\"?: string;\n}\n\nexport interface CursorStyle extends CSSProperties {\n \"--line-cursor-y\"?: string;\n}\n\nexport interface AxisStyle extends CSSProperties {\n \"--line-axis-x\"?: string;\n \"--line-axis-y\"?: string;\n}\n\ntype LineTrend = \"down\" | \"flat\" | \"up\";\n\ninterface LinePointGeometry {\n readonly previousX: string | undefined;\n readonly previousY: string | undefined;\n /** `y − previousY` in percentage points of the point box height, unitless. */\n readonly rise: string | undefined;\n readonly slot: string;\n readonly trend: LineTrend;\n readonly x: string;\n readonly y: string;\n}\n\nfunction percent(value: number): string {\n const rounded = Math.round(value * 10000) / 10000;\n return `${rounded}%`;\n}\n\nfunction valueToPercent(value: number, min: number, range: number): number {\n if (range === 0) return 50;\n return Math.min(100, Math.max(0, ((min + range - value) / range) * 100));\n}\n\nexport function getValueBounds(data: readonly LineChartData[]): { max: number; min: number } {\n let min = Number.POSITIVE_INFINITY;\n let max = Number.NEGATIVE_INFINITY;\n\n for (const point of data) {\n min = Math.min(min, point.value);\n max = Math.max(max, point.value);\n }\n\n if (data.length === 0) return { max: 1, min: 0 };\n return { max, min };\n}\n\nexport interface AxisLabel {\n readonly label: ReactNode;\n readonly position: number;\n}\n\nfunction monthKey(time: string | number): string {\n const date = new Date(time);\n if (Number.isNaN(date.getTime())) return String(time);\n return `${date.getUTCFullYear()}-${date.getUTCMonth()}`;\n}\n\nfunction monthLabel(time: string | number): string {\n const date = new Date(time);\n if (Number.isNaN(date.getTime())) return String(time);\n return new Intl.DateTimeFormat(\"en-US\", {\n month: \"short\",\n timeZone: \"UTC\",\n year: \"2-digit\",\n }).format(date);\n}\n\nexport function pointPosition(index: number, count: number): number {\n if (count <= 1) return 50;\n return (index / (count - 1)) * 100;\n}\n\nexport function monthLabelsFor(data: readonly LineChartData[]): AxisLabel[] {\n const labels: AxisLabel[] = [];\n const seen = new Set<string>();\n\n data.forEach((point, index) => {\n const key = monthKey(point.time);\n if (seen.has(key)) return;\n seen.add(key);\n labels.push({\n label: monthLabel(point.time),\n position: pointPosition(index, data.length),\n });\n });\n\n return labels;\n}\n\nexport function valueLabelsFor(min: number, max: number): AxisLabel[] {\n const tickCount = 6;\n const range = max - min;\n\n return Array.from({ length: tickCount }, (_, index) => {\n const ratio = index / (tickCount - 1);\n const value = max - range * ratio;\n return {\n label: new Intl.NumberFormat(\"en-US\", { maximumFractionDigits: 2 }).format(value),\n position: ratio * 100,\n };\n });\n}\n\nfunction trendFor(value: number, previousValue: number | undefined): LineTrend {\n if (previousValue === undefined || value === previousValue) return \"flat\";\n return value > previousValue ? \"up\" : \"down\";\n}\n\nexport function geometryFor(\n point: LineChartData,\n previousPoint: LineChartData | undefined,\n index: number,\n count: number,\n min: number,\n max: number,\n): LinePointGeometry {\n const range = max - min;\n const y = valueToPercent(point.value, min, range);\n const previousY =\n previousPoint === undefined ? undefined : valueToPercent(previousPoint.value, min, range);\n return {\n previousX: previousPoint === undefined ? undefined : percent(pointPosition(index - 1, count)),\n previousY: previousY === undefined ? undefined : percent(previousY),\n rise: previousY === undefined ? undefined : String(Math.round((y - previousY) * 10000) / 10000),\n slot: percent(count > 1 ? 100 / (count - 1) : 100),\n trend: trendFor(point.value, previousPoint?.value),\n x: percent(pointPosition(index, count)),\n y: percent(y),\n };\n}\n\nexport function pointStyle(geometry: LinePointGeometry, cursorY: number | undefined): PointStyle {\n return {\n ...(geometry.previousX === undefined ? {} : { \"--line-prev-x\": geometry.previousX }),\n ...(geometry.previousY === undefined ? {} : { \"--line-prev-y\": geometry.previousY }),\n ...(geometry.rise === undefined ? {} : { \"--line-rise\": geometry.rise }),\n \"--line-slot\": geometry.slot,\n \"--line-x\": geometry.x,\n \"--line-y\": geometry.y,\n ...(cursorY === undefined ? {} : { \"--line-cursor-y\": `${Math.max(0, cursorY)}px` }),\n };\n}\n\nexport function pointsStyle(count: number): PointsStyle {\n return {\n \"--line-count\": String(Math.max(count, 1)),\n \"--line-run\": String(Math.round((count > 1 ? 100 / (count - 1) : 100) * 10000) / 10000),\n \"--line-segment-slot\": percent(count > 1 ? 100 / (count - 1) : 100),\n };\n}\n\nexport function crosshairStyle(\n index: number,\n count: number,\n cursorY: number | undefined,\n): CrosshairStyle {\n return {\n \"--line-crosshair-x\": percent(pointPosition(index, count)),\n ...(cursorY === undefined ? {} : { \"--line-cursor-y\": `${Math.max(0, cursorY)}px` }),\n };\n}\n\n/** Crosshair at the center of slot `index` of `count` equal slots (live mode). */\nexport function slotCrosshairStyle(\n index: number,\n count: number,\n cursorY: number | undefined,\n): CrosshairStyle {\n return {\n \"--line-crosshair-x\": percent(((index + 0.5) / Math.max(count, 1)) * 100),\n ...(cursorY === undefined ? {} : { \"--line-cursor-y\": `${Math.max(0, cursorY)}px` }),\n };\n}\n\nexport function cursorStyle(cursorY: number | undefined): CursorStyle {\n return cursorY === undefined ? {} : { \"--line-cursor-y\": `${Math.max(0, cursorY)}px` };\n}\n\nexport function axisStyle(axis: \"x\" | \"y\", position: number): AxisStyle {\n const value = percent(Math.min(100, Math.max(0, position)));\n if (axis === \"x\") return { \"--line-axis-x\": value };\n return { \"--line-axis-y\": value };\n}\n\nexport function axisLabelsFor(\n overrides: readonly LineChartAxisLabel[] | undefined,\n fallback: readonly AxisLabel[],\n): readonly AxisLabel[] {\n return overrides ?? fallback;\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/components/line-chart/line-chart-geometry.ts"],"sourcesContent":["import type { CSSProperties, ReactNode } from \"react\";\nimport type { LineChartAxisLabel, LineChartData } from \"./types.js\";\n\nexport interface PointStyle extends CSSProperties {\n \"--line-prev-x\"?: string;\n \"--line-prev-y\"?: string;\n \"--line-rise\"?: string;\n \"--line-slot\": string;\n \"--line-x\": string;\n \"--line-y\": string;\n \"--line-cursor-y\"?: string;\n}\n\nexport interface PointsStyle extends CSSProperties {\n \"--line-count\": string;\n /** One segment's width in percentage points of the viewport width, unitless. */\n \"--line-run\": string;\n \"--line-segment-slot\": string;\n}\n\nexport interface CrosshairStyle extends CSSProperties {\n \"--line-crosshair-x\": string;\n \"--line-cursor-y\"?: string;\n}\n\nexport interface CursorStyle extends CSSProperties {\n \"--line-cursor-y\"?: string;\n}\n\nexport interface AxisStyle extends CSSProperties {\n \"--line-axis-x\"?: string;\n \"--line-axis-y\"?: string;\n}\n\ntype LineTrend = \"down\" | \"flat\" | \"up\";\n\ninterface LinePointGeometry {\n readonly previousX: string | undefined;\n readonly previousY: string | undefined;\n /** `y − previousY` in percentage points of the point box height, unitless. */\n readonly rise: string | undefined;\n readonly slot: string;\n readonly trend: LineTrend;\n readonly x: string;\n readonly y: string;\n}\n\nfunction percent(value: number): string {\n const rounded = Math.round(value * 10000) / 10000;\n return `${rounded}%`;\n}\n\nfunction valueToPercent(value: number, min: number, range: number): number {\n if (range === 0) return 50;\n return Math.min(100, Math.max(0, ((min + range - value) / range) * 100));\n}\n\nexport function getValueBounds(data: readonly LineChartData[]): { max: number; min: number } {\n let min = Number.POSITIVE_INFINITY;\n let max = Number.NEGATIVE_INFINITY;\n\n for (const point of data) {\n min = Math.min(min, point.value);\n max = Math.max(max, point.value);\n }\n\n if (data.length === 0) return { max: 1, min: 0 };\n return { max, min };\n}\n\nexport interface AxisLabel {\n readonly label: ReactNode;\n readonly position: number;\n}\n\nfunction monthKey(time: string | number): string {\n const date = new Date(time);\n if (Number.isNaN(date.getTime())) return String(time);\n return `${date.getUTCFullYear()}-${date.getUTCMonth()}`;\n}\n\nfunction monthLabel(time: string | number, locale: string): string {\n const date = new Date(time);\n if (Number.isNaN(date.getTime())) return String(time);\n return new Intl.DateTimeFormat(locale, {\n month: \"short\",\n timeZone: \"UTC\",\n year: \"2-digit\",\n }).format(date);\n}\n\nexport function pointPosition(index: number, count: number): number {\n if (count <= 1) return 50;\n return (index / (count - 1)) * 100;\n}\n\nexport function monthLabelsFor(data: readonly LineChartData[], locale: string): AxisLabel[] {\n const labels: AxisLabel[] = [];\n const seen = new Set<string>();\n\n data.forEach((point, index) => {\n const key = monthKey(point.time);\n if (seen.has(key)) return;\n seen.add(key);\n labels.push({\n label: monthLabel(point.time, locale),\n position: pointPosition(index, data.length),\n });\n });\n\n return labels;\n}\n\nexport function valueLabelsFor(min: number, max: number, locale: string): AxisLabel[] {\n const tickCount = 6;\n const range = max - min;\n\n return Array.from({ length: tickCount }, (_, index) => {\n const ratio = index / (tickCount - 1);\n const value = max - range * ratio;\n return {\n label: new Intl.NumberFormat(locale, { maximumFractionDigits: 2 }).format(value),\n position: ratio * 100,\n };\n });\n}\n\nfunction trendFor(value: number, previousValue: number | undefined): LineTrend {\n if (previousValue === undefined || value === previousValue) return \"flat\";\n return value > previousValue ? \"up\" : \"down\";\n}\n\nexport function geometryFor(\n point: LineChartData,\n previousPoint: LineChartData | undefined,\n index: number,\n count: number,\n min: number,\n max: number,\n): LinePointGeometry {\n const range = max - min;\n const y = valueToPercent(point.value, min, range);\n const previousY =\n previousPoint === undefined ? undefined : valueToPercent(previousPoint.value, min, range);\n return {\n previousX: previousPoint === undefined ? undefined : percent(pointPosition(index - 1, count)),\n previousY: previousY === undefined ? undefined : percent(previousY),\n rise: previousY === undefined ? undefined : String(Math.round((y - previousY) * 10000) / 10000),\n slot: percent(count > 1 ? 100 / (count - 1) : 100),\n trend: trendFor(point.value, previousPoint?.value),\n x: percent(pointPosition(index, count)),\n y: percent(y),\n };\n}\n\nexport function pointStyle(geometry: LinePointGeometry, cursorY: number | undefined): PointStyle {\n return {\n ...(geometry.previousX === undefined ? {} : { \"--line-prev-x\": geometry.previousX }),\n ...(geometry.previousY === undefined ? {} : { \"--line-prev-y\": geometry.previousY }),\n ...(geometry.rise === undefined ? {} : { \"--line-rise\": geometry.rise }),\n \"--line-slot\": geometry.slot,\n \"--line-x\": geometry.x,\n \"--line-y\": geometry.y,\n ...(cursorY === undefined ? {} : { \"--line-cursor-y\": `${Math.max(0, cursorY)}px` }),\n };\n}\n\nexport function pointsStyle(count: number): PointsStyle {\n return {\n \"--line-count\": String(Math.max(count, 1)),\n \"--line-run\": String(Math.round((count > 1 ? 100 / (count - 1) : 100) * 10000) / 10000),\n \"--line-segment-slot\": percent(count > 1 ? 100 / (count - 1) : 100),\n };\n}\n\nexport function crosshairStyle(\n index: number,\n count: number,\n cursorY: number | undefined,\n): CrosshairStyle {\n return {\n \"--line-crosshair-x\": percent(pointPosition(index, count)),\n ...(cursorY === undefined ? {} : { \"--line-cursor-y\": `${Math.max(0, cursorY)}px` }),\n };\n}\n\n/** Crosshair at the center of slot `index` of `count` equal slots (live mode). */\nexport function slotCrosshairStyle(\n index: number,\n count: number,\n cursorY: number | undefined,\n): CrosshairStyle {\n return {\n \"--line-crosshair-x\": percent(((index + 0.5) / Math.max(count, 1)) * 100),\n ...(cursorY === undefined ? {} : { \"--line-cursor-y\": `${Math.max(0, cursorY)}px` }),\n };\n}\n\nexport function cursorStyle(cursorY: number | undefined): CursorStyle {\n return cursorY === undefined ? {} : { \"--line-cursor-y\": `${Math.max(0, cursorY)}px` };\n}\n\nexport function axisStyle(axis: \"x\" | \"y\", position: number): AxisStyle {\n const value = percent(Math.min(100, Math.max(0, position)));\n if (axis === \"x\") return { \"--line-axis-x\": value };\n return { \"--line-axis-y\": value };\n}\n\nexport function axisLabelsFor(\n overrides: readonly LineChartAxisLabel[] | undefined,\n fallback: readonly AxisLabel[],\n): readonly AxisLabel[] {\n return overrides ?? fallback;\n}\n"],"mappings":"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","names":[]}
@@ -20,6 +20,8 @@ export interface LineChartOwnProps {
20
20
  readonly cursorY?: number;
21
21
  readonly data: readonly LineChartData[];
22
22
  readonly interactive?: boolean;
23
+ /** BCP 47 locale for default axis labels. Defaults to `"en-US"`. */
24
+ readonly locale?: string;
23
25
  readonly onPointClick?: (index: number) => void;
24
26
  readonly onPointPointerLeave?: () => void;
25
27
  readonly onPointPointerMove?: (position: LineChartPointerPosition) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/line-chart/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/line-chart/types.ts"],"names":[],"mappings":"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"}
@@ -6,7 +6,7 @@ import type { ModalProps } from "./types.js";
6
6
  * Controlled or initially open dialogs use `ModalClientContent` from
7
7
  * `@gunkin/uiify/components/modal/client`.
8
8
  */
9
- export declare function Modal({ id, trigger, title, description, children, closeLabel, footer, className, align, backdrop, dismiss, size, }: ModalProps): ReactElement;
9
+ export declare function Modal({ id, trigger, title, description, children, closeLabel, labels, footer, className, align, backdrop, dismiss, size, }: ModalProps): ReactElement;
10
10
  export declare namespace Modal {
11
11
  var displayName: string;
12
12
  }
@@ -1 +1 @@
1
- {"version":3,"file":"Modal.d.ts","sourceRoot":"","sources":["../../../src/components/modal/Modal.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAa,MAAM,OAAO,CAAC;AAYrD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAuB7C;;;;;GAKG;AACH,wBAAgB,KAAK,CAAC,EACpB,EAAE,EACF,OAAO,EACP,KAAK,EACL,WAAW,EACX,QAAQ,EACR,UAAoB,EACpB,MAAM,EACN,SAAS,EACT,KAAK,EACL,QAAQ,EACR,OAAO,EACP,IAAI,GACL,EAAE,UAAU,GAAG,YAAY,CAgC3B;yBA7Ce,KAAK"}
1
+ {"version":3,"file":"Modal.d.ts","sourceRoot":"","sources":["../../../src/components/modal/Modal.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAa,MAAM,OAAO,CAAC;AAYrD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAyB7C;;;;;GAKG;AACH,wBAAgB,KAAK,CAAC,EACpB,EAAE,EACF,OAAO,EACP,KAAK,EACL,WAAW,EACX,QAAQ,EACR,UAAU,EACV,MAAM,EACN,MAAM,EACN,SAAS,EACT,KAAK,EACL,QAAQ,EACR,OAAO,EACP,IAAI,GACL,EAAE,UAAU,GAAG,YAAY,CAiC3B;yBA/Ce,KAAK"}
@@ -10,6 +10,7 @@ import {
10
10
  ModalTitle,
11
11
  ModalTrigger
12
12
  } from "./ModalParts.js";
13
+ const DEFAULT_MODAL_LABELS = { close: "Close" };
13
14
  const CLOSE_ICON = /* @__PURE__ */ jsx(
14
15
  "svg",
15
16
  {
@@ -34,7 +35,8 @@ function Modal({
34
35
  title,
35
36
  description,
36
37
  children,
37
- closeLabel = "Close",
38
+ closeLabel,
39
+ labels,
38
40
  footer,
39
41
  className,
40
42
  align,
@@ -44,6 +46,7 @@ function Modal({
44
46
  }) {
45
47
  const titleId = `${id}-title`;
46
48
  const descriptionId = `${id}-description`;
49
+ const effectiveCloseLabel = closeLabel ?? labels?.close ?? DEFAULT_MODAL_LABELS.close;
47
50
  return /* @__PURE__ */ jsxs("div", { "data-part": "root", "data-uiify-modal": "", children: [
48
51
  /* @__PURE__ */ jsx(ModalTrigger, { target: id, children: trigger }),
49
52
  /* @__PURE__ */ jsxs(
@@ -62,7 +65,7 @@ function Modal({
62
65
  /* @__PURE__ */ jsxs(ModalHeader, { children: [
63
66
  /* @__PURE__ */ jsx(ModalTitle, { id: titleId, children: title }),
64
67
  isAbsent(description) ? null : /* @__PURE__ */ jsx(ModalDescription, { id: descriptionId, children: description }),
65
- /* @__PURE__ */ jsx(ModalClose, { "aria-label": closeLabel, target: id, children: CLOSE_ICON })
68
+ /* @__PURE__ */ jsx(ModalClose, { "aria-label": effectiveCloseLabel, target: id, children: CLOSE_ICON })
66
69
  ] }),
67
70
  isAbsent(children) ? null : /* @__PURE__ */ jsx(ModalBody, { children }),
68
71
  isAbsent(footer) ? null : /* @__PURE__ */ jsx(ModalFooter, { children: footer })
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/modal/Modal.tsx"],"sourcesContent":["import type { ReactElement, ReactNode } from \"react\";\nimport {\n ModalBody,\n ModalClose,\n ModalContent,\n ModalDescription,\n ModalFooter,\n ModalGrabber,\n ModalHeader,\n ModalTitle,\n ModalTrigger,\n} from \"./ModalParts.js\";\nimport type { ModalProps } from \"./types.js\";\n\nconst CLOSE_ICON = (\n <svg\n aria-hidden=\"true\"\n fill=\"none\"\n focusable=\"false\"\n height=\"14\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeWidth=\"1.75\"\n viewBox=\"0 0 16 16\"\n width=\"14\"\n >\n <path d=\"M3 3l10 10M13 3L3 13\" />\n </svg>\n);\n\n/** `null` and `undefined` both mean \"not given\": no empty part, no dangling `aria-describedby`. */\nfunction isAbsent(node: ReactNode): node is null | undefined {\n return node === null || node === undefined;\n}\n\n/**\n * Convenience shell over the native parts: one trigger and one modal `<dialog>`\n * with a header (title, description, close icon), a body and an optional footer.\n * Controlled or initially open dialogs use `ModalClientContent` from\n * `@gunkin/uiify/components/modal/client`.\n */\nexport function Modal({\n id,\n trigger,\n title,\n description,\n children,\n closeLabel = \"Close\",\n footer,\n className,\n align,\n backdrop,\n dismiss,\n size,\n}: ModalProps): ReactElement {\n const titleId = `${id}-title`;\n const descriptionId = `${id}-description`;\n\n return (\n <div data-part=\"root\" data-uiify-modal=\"\">\n <ModalTrigger target={id}>{trigger}</ModalTrigger>\n <ModalContent\n align={align}\n aria-describedby={isAbsent(description) ? undefined : descriptionId}\n aria-labelledby={titleId}\n backdrop={backdrop}\n className={className}\n dismiss={dismiss}\n id={id}\n size={size}\n >\n <ModalGrabber />\n <ModalHeader>\n <ModalTitle id={titleId}>{title}</ModalTitle>\n {isAbsent(description) ? null : (\n <ModalDescription id={descriptionId}>{description}</ModalDescription>\n )}\n <ModalClose aria-label={closeLabel} target={id}>\n {CLOSE_ICON}\n </ModalClose>\n </ModalHeader>\n {isAbsent(children) ? null : <ModalBody>{children}</ModalBody>}\n {isAbsent(footer) ? null : <ModalFooter>{footer}</ModalFooter>}\n </ModalContent>\n </div>\n );\n}\nModal.displayName = \"Modal\";\n"],"mappings":"AA0BI,cA8CI,YA9CJ;AAzBJ;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAGP,MAAM,aACJ;AAAA,EAAC;AAAA;AAAA,IACC,eAAY;AAAA,IACZ,MAAK;AAAA,IACL,WAAU;AAAA,IACV,QAAO;AAAA,IACP,QAAO;AAAA,IACP,eAAc;AAAA,IACd,aAAY;AAAA,IACZ,SAAQ;AAAA,IACR,OAAM;AAAA,IAEN,8BAAC,UAAK,GAAE,wBAAuB;AAAA;AACjC;AAIF,SAAS,SAAS,MAA2C;AAC3D,SAAO,SAAS,QAAQ,SAAS;AACnC;AAQO,SAAS,MAAM;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAa;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA6B;AAC3B,QAAM,UAAU,GAAG,EAAE;AACrB,QAAM,gBAAgB,GAAG,EAAE;AAE3B,SACE,qBAAC,SAAI,aAAU,QAAO,oBAAiB,IACrC;AAAA,wBAAC,gBAAa,QAAQ,IAAK,mBAAQ;AAAA,IACnC;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,oBAAkB,SAAS,WAAW,IAAI,SAAY;AAAA,QACtD,mBAAiB;AAAA,QACjB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QAEA;AAAA,8BAAC,gBAAa;AAAA,UACd,qBAAC,eACC;AAAA,gCAAC,cAAW,IAAI,SAAU,iBAAM;AAAA,YAC/B,SAAS,WAAW,IAAI,OACvB,oBAAC,oBAAiB,IAAI,eAAgB,uBAAY;AAAA,YAEpD,oBAAC,cAAW,cAAY,YAAY,QAAQ,IACzC,sBACH;AAAA,aACF;AAAA,UACC,SAAS,QAAQ,IAAI,OAAO,oBAAC,aAAW,UAAS;AAAA,UACjD,SAAS,MAAM,IAAI,OAAO,oBAAC,eAAa,kBAAO;AAAA;AAAA;AAAA,IAClD;AAAA,KACF;AAEJ;AACA,MAAM,cAAc;","names":[]}
1
+ {"version":3,"sources":["../../../src/components/modal/Modal.tsx"],"sourcesContent":["import type { ReactElement, ReactNode } from \"react\";\nimport {\n ModalBody,\n ModalClose,\n ModalContent,\n ModalDescription,\n ModalFooter,\n ModalGrabber,\n ModalHeader,\n ModalTitle,\n ModalTrigger,\n} from \"./ModalParts.js\";\nimport type { ModalProps } from \"./types.js\";\n\nconst DEFAULT_MODAL_LABELS = { close: \"Close\" } as const;\n\nconst CLOSE_ICON = (\n <svg\n aria-hidden=\"true\"\n fill=\"none\"\n focusable=\"false\"\n height=\"14\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeWidth=\"1.75\"\n viewBox=\"0 0 16 16\"\n width=\"14\"\n >\n <path d=\"M3 3l10 10M13 3L3 13\" />\n </svg>\n);\n\n/** `null` and `undefined` both mean \"not given\": no empty part, no dangling `aria-describedby`. */\nfunction isAbsent(node: ReactNode): node is null | undefined {\n return node === null || node === undefined;\n}\n\n/**\n * Convenience shell over the native parts: one trigger and one modal `<dialog>`\n * with a header (title, description, close icon), a body and an optional footer.\n * Controlled or initially open dialogs use `ModalClientContent` from\n * `@gunkin/uiify/components/modal/client`.\n */\nexport function Modal({\n id,\n trigger,\n title,\n description,\n children,\n closeLabel,\n labels,\n footer,\n className,\n align,\n backdrop,\n dismiss,\n size,\n}: ModalProps): ReactElement {\n const titleId = `${id}-title`;\n const descriptionId = `${id}-description`;\n const effectiveCloseLabel = closeLabel ?? labels?.close ?? DEFAULT_MODAL_LABELS.close;\n\n return (\n <div data-part=\"root\" data-uiify-modal=\"\">\n <ModalTrigger target={id}>{trigger}</ModalTrigger>\n <ModalContent\n align={align}\n aria-describedby={isAbsent(description) ? undefined : descriptionId}\n aria-labelledby={titleId}\n backdrop={backdrop}\n className={className}\n dismiss={dismiss}\n id={id}\n size={size}\n >\n <ModalGrabber />\n <ModalHeader>\n <ModalTitle id={titleId}>{title}</ModalTitle>\n {isAbsent(description) ? null : (\n <ModalDescription id={descriptionId}>{description}</ModalDescription>\n )}\n <ModalClose aria-label={effectiveCloseLabel} target={id}>\n {CLOSE_ICON}\n </ModalClose>\n </ModalHeader>\n {isAbsent(children) ? null : <ModalBody>{children}</ModalBody>}\n {isAbsent(footer) ? null : <ModalFooter>{footer}</ModalFooter>}\n </ModalContent>\n </div>\n );\n}\nModal.displayName = \"Modal\";\n"],"mappings":"AA4BI,cAgDI,YAhDJ;AA3BJ;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAGP,MAAM,uBAAuB,EAAE,OAAO,QAAQ;AAE9C,MAAM,aACJ;AAAA,EAAC;AAAA;AAAA,IACC,eAAY;AAAA,IACZ,MAAK;AAAA,IACL,WAAU;AAAA,IACV,QAAO;AAAA,IACP,QAAO;AAAA,IACP,eAAc;AAAA,IACd,aAAY;AAAA,IACZ,SAAQ;AAAA,IACR,OAAM;AAAA,IAEN,8BAAC,UAAK,GAAE,wBAAuB;AAAA;AACjC;AAIF,SAAS,SAAS,MAA2C;AAC3D,SAAO,SAAS,QAAQ,SAAS;AACnC;AAQO,SAAS,MAAM;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA6B;AAC3B,QAAM,UAAU,GAAG,EAAE;AACrB,QAAM,gBAAgB,GAAG,EAAE;AAC3B,QAAM,sBAAsB,cAAc,QAAQ,SAAS,qBAAqB;AAEhF,SACE,qBAAC,SAAI,aAAU,QAAO,oBAAiB,IACrC;AAAA,wBAAC,gBAAa,QAAQ,IAAK,mBAAQ;AAAA,IACnC;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,oBAAkB,SAAS,WAAW,IAAI,SAAY;AAAA,QACtD,mBAAiB;AAAA,QACjB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QAEA;AAAA,8BAAC,gBAAa;AAAA,UACd,qBAAC,eACC;AAAA,gCAAC,cAAW,IAAI,SAAU,iBAAM;AAAA,YAC/B,SAAS,WAAW,IAAI,OACvB,oBAAC,oBAAiB,IAAI,eAAgB,uBAAY;AAAA,YAEpD,oBAAC,cAAW,cAAY,qBAAqB,QAAQ,IAClD,sBACH;AAAA,aACF;AAAA,UACC,SAAS,QAAQ,IAAI,OAAO,oBAAC,aAAW,UAAS;AAAA,UACjD,SAAS,MAAM,IAAI,OAAO,oBAAC,eAAa,kBAAO;AAAA;AAAA;AAAA,IAClD;AAAA,KACF;AAEJ;AACA,MAAM,cAAc;","names":[]}
@@ -1,4 +1,4 @@
1
1
  export { Modal } from "./Modal.js";
2
2
  export { ModalBody, ModalClose, ModalContent, ModalDescription, ModalFooter, ModalGrabber, ModalHeader, ModalTitle, ModalTrigger, } from "./ModalParts.js";
3
- export type { ModalAlign, ModalAppearanceProps, ModalBackdrop, ModalBodyProps, ModalCloseOwnProps, ModalCloseProps, ModalContentOwnProps, ModalContentProps, ModalDescriptionProps, ModalDismiss, ModalFooterProps, ModalGrabberProps, ModalHeaderProps, ModalProps, ModalSize, ModalTitleProps, ModalTriggerOwnProps, ModalTriggerProps, } from "./types.js";
3
+ export type { ModalAlign, ModalAppearanceProps, ModalBackdrop, ModalBodyProps, ModalCloseOwnProps, ModalCloseProps, ModalContentOwnProps, ModalContentProps, ModalDescriptionProps, ModalDismiss, ModalFooterProps, ModalGrabberProps, ModalHeaderProps, ModalProps, ModalLabels, ModalSize, ModalTitleProps, ModalTriggerOwnProps, ModalTriggerProps, } from "./types.js";
4
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/modal/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EACL,SAAS,EACT,UAAU,EACV,YAAY,EACZ,gBAAgB,EAChB,WAAW,EACX,YAAY,EACZ,WAAW,EACX,UAAU,EACV,YAAY,GACb,MAAM,iBAAiB,CAAC;AACzB,YAAY,EACV,UAAU,EACV,oBAAoB,EACpB,aAAa,EACb,cAAc,EACd,kBAAkB,EAClB,eAAe,EACf,oBAAoB,EACpB,iBAAiB,EACjB,qBAAqB,EACrB,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,EAChB,UAAU,EACV,SAAS,EACT,eAAe,EACf,oBAAoB,EACpB,iBAAiB,GAClB,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/modal/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EACL,SAAS,EACT,UAAU,EACV,YAAY,EACZ,gBAAgB,EAChB,WAAW,EACX,YAAY,EACZ,WAAW,EACX,UAAU,EACV,YAAY,GACb,MAAM,iBAAiB,CAAC;AACzB,YAAY,EACV,UAAU,EACV,oBAAoB,EACpB,aAAa,EACb,cAAc,EACd,kBAAkB,EAClB,eAAe,EACf,oBAAoB,EACpB,iBAAiB,EACjB,qBAAqB,EACrB,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,EAChB,UAAU,EACV,WAAW,EACX,SAAS,EACT,eAAe,EACf,oBAAoB,EACpB,iBAAiB,GAClB,MAAM,YAAY,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/modal/index.ts"],"sourcesContent":["export { Modal } from \"./Modal.js\";\nexport {\n ModalBody,\n ModalClose,\n ModalContent,\n ModalDescription,\n ModalFooter,\n ModalGrabber,\n ModalHeader,\n ModalTitle,\n ModalTrigger,\n} from \"./ModalParts.js\";\nexport type {\n ModalAlign,\n ModalAppearanceProps,\n ModalBackdrop,\n ModalBodyProps,\n ModalCloseOwnProps,\n ModalCloseProps,\n ModalContentOwnProps,\n ModalContentProps,\n ModalDescriptionProps,\n ModalDismiss,\n ModalFooterProps,\n ModalGrabberProps,\n ModalHeaderProps,\n ModalProps,\n ModalSize,\n ModalTitleProps,\n ModalTriggerOwnProps,\n ModalTriggerProps,\n} from \"./types.js\";\n"],"mappings":"AAAA,SAAS,aAAa;AACtB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;","names":[]}
1
+ {"version":3,"sources":["../../../src/components/modal/index.ts"],"sourcesContent":["export { Modal } from \"./Modal.js\";\nexport {\n ModalBody,\n ModalClose,\n ModalContent,\n ModalDescription,\n ModalFooter,\n ModalGrabber,\n ModalHeader,\n ModalTitle,\n ModalTrigger,\n} from \"./ModalParts.js\";\nexport type {\n ModalAlign,\n ModalAppearanceProps,\n ModalBackdrop,\n ModalBodyProps,\n ModalCloseOwnProps,\n ModalCloseProps,\n ModalContentOwnProps,\n ModalContentProps,\n ModalDescriptionProps,\n ModalDismiss,\n ModalFooterProps,\n ModalGrabberProps,\n ModalHeaderProps,\n ModalProps,\n ModalLabels,\n ModalSize,\n ModalTitleProps,\n ModalTriggerOwnProps,\n ModalTriggerProps,\n} from \"./types.js\";\n"],"mappings":"AAAA,SAAS,aAAa;AACtB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;","names":[]}
@@ -30,10 +30,14 @@ export interface ModalProps extends ModalAppearanceProps {
30
30
  readonly children?: ReactNode;
31
31
  /** Accessible name of the header close icon. */
32
32
  readonly closeLabel?: string;
33
+ readonly labels?: Partial<ModalLabels>;
33
34
  /** Actions row pinned under the body. */
34
35
  readonly footer?: ReactNode;
35
36
  readonly className?: string;
36
37
  }
38
+ export interface ModalLabels {
39
+ readonly close: string;
40
+ }
37
41
  /** Own props of the native `show-modal` invoker. */
38
42
  export interface ModalTriggerOwnProps {
39
43
  readonly children?: ReactNode;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/modal/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/modal/types.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { type ElementType, type ReactElement } from "react";
2
2
  import type { NumberFieldRootProps, NumberFieldGroupProps, NumberFieldInputProps, NumberFieldIncrementProps, NumberFieldDecrementProps } from "./types.js";
3
- export type { NumberFieldDecrementProps, NumberFieldGroupProps, NumberFieldIncrementProps, NumberFieldInputProps, NumberFieldRootOwnProps, NumberFieldRootProps, } from "./types.js";
3
+ export type { NumberFieldDecrementProps, NumberFieldGroupProps, NumberFieldIncrementProps, NumberFieldInputOwnProps, NumberFieldInputProps, NumberFieldRootOwnProps, NumberFieldRootProps, } from "./types.js";
4
4
  export declare function NumberFieldRoot<TAs extends ElementType = "div">(props: NumberFieldRootProps<TAs>): ReactElement | null;
5
5
  export declare namespace NumberFieldRoot {
6
6
  var displayName: string;
@@ -1 +1 @@
1
- {"version":3,"file":"NumberField.d.ts","sourceRoot":"","sources":["../../../src/components/number-field/NumberField.tsx"],"names":[],"mappings":"AAEA,OAAO,EAKL,KAAK,WAAW,EAGhB,KAAK,YAAY,EAGlB,MAAM,OAAO,CAAC;AAcf,OAAO,KAAK,EAEV,oBAAoB,EACpB,qBAAqB,EACrB,qBAAqB,EACrB,yBAAyB,EACzB,yBAAyB,EAC1B,MAAM,YAAY,CAAC;AAEpB,YAAY,EACV,yBAAyB,EACzB,qBAAqB,EACrB,yBAAyB,EACzB,qBAAqB,EACrB,uBAAuB,EACvB,oBAAoB,GACrB,MAAM,YAAY,CAAC;AAKpB,wBAAgB,eAAe,CAAC,GAAG,SAAS,WAAW,GAAG,KAAK,EAC7D,KAAK,EAAE,oBAAoB,CAAC,GAAG,CAAC,GAC/B,YAAY,GAAG,IAAI,CAoIrB;yBAtIe,eAAe;;;AAyI/B,wBAAgB,gBAAgB,CAAC,GAAG,SAAS,WAAW,GAAG,KAAK,EAC9D,KAAK,EAAE,qBAAqB,CAAC,GAAG,CAAC,GAChC,YAAY,GAAG,IAAI,CAWrB;AAED,wBAAgB,gBAAgB,CAAC,GAAG,SAAS,WAAW,GAAG,OAAO,EAChE,KAAK,EAAE,qBAAqB,CAAC,GAAG,CAAC,GAChC,YAAY,GAAG,IAAI,CAwFrB;AAED,wBAAgB,oBAAoB,CAAC,GAAG,SAAS,WAAW,GAAG,QAAQ,EACrE,KAAK,EAAE,yBAAyB,CAAC,GAAG,CAAC,GACpC,YAAY,GAAG,IAAI,CAiCrB;AAED,wBAAgB,oBAAoB,CAAC,GAAG,SAAS,WAAW,GAAG,QAAQ,EACrE,KAAK,EAAE,yBAAyB,CAAC,GAAG,CAAC,GACpC,YAAY,GAAG,IAAI,CAiCrB;AAED,eAAO,MAAM,WAAW;;;;;;CAMvB,CAAC"}
1
+ {"version":3,"file":"NumberField.d.ts","sourceRoot":"","sources":["../../../src/components/number-field/NumberField.tsx"],"names":[],"mappings":"AAEA,OAAO,EAKL,KAAK,WAAW,EAIhB,KAAK,YAAY,EAGlB,MAAM,OAAO,CAAC;AAef,OAAO,KAAK,EAEV,oBAAoB,EACpB,qBAAqB,EACrB,qBAAqB,EACrB,yBAAyB,EACzB,yBAAyB,EAC1B,MAAM,YAAY,CAAC;AAEpB,YAAY,EACV,yBAAyB,EACzB,qBAAqB,EACrB,yBAAyB,EACzB,wBAAwB,EACxB,qBAAqB,EACrB,uBAAuB,EACvB,oBAAoB,GACrB,MAAM,YAAY,CAAC;AAKpB,wBAAgB,eAAe,CAAC,GAAG,SAAS,WAAW,GAAG,KAAK,EAC7D,KAAK,EAAE,oBAAoB,CAAC,GAAG,CAAC,GAC/B,YAAY,GAAG,IAAI,CAqIrB;yBAvIe,eAAe;;;AA0I/B,wBAAgB,gBAAgB,CAAC,GAAG,SAAS,WAAW,GAAG,KAAK,EAC9D,KAAK,EAAE,qBAAqB,CAAC,GAAG,CAAC,GAChC,YAAY,GAAG,IAAI,CAerB;AAED,wBAAgB,gBAAgB,CAAC,GAAG,SAAS,WAAW,GAAG,OAAO,EAChE,KAAK,EAAE,qBAAqB,CAAC,GAAG,CAAC,GAChC,YAAY,GAAG,IAAI,CA0FrB;AAED,wBAAgB,oBAAoB,CAAC,GAAG,SAAS,WAAW,GAAG,QAAQ,EACrE,KAAK,EAAE,yBAAyB,CAAC,GAAG,CAAC,GACpC,YAAY,GAAG,IAAI,CAuCrB;AAED,wBAAgB,oBAAoB,CAAC,GAAG,SAAS,WAAW,GAAG,QAAQ,EACrE,KAAK,EAAE,yBAAyB,CAAC,GAAG,CAAC,GACpC,YAAY,GAAG,IAAI,CAuCrB;AAED,eAAO,MAAM,WAAW;;;;;;CAMvB,CAAC"}
@@ -8,6 +8,7 @@ import {
8
8
  } from "react";
9
9
  import { useControllableState, useId } from "@gunkin/uiify/hooks";
10
10
  import { createPartContext } from "@gunkin/uiify/core";
11
+ import { isComposingKeyEvent } from "@gunkin/uiify/core/ime";
11
12
  import { composeEventHandlers } from "@gunkin/uiify/core/compose-event-handlers";
12
13
  import { useRenderElement } from "@gunkin/uiify/core/render";
13
14
  import {
@@ -31,6 +32,7 @@ function NumberFieldRoot(props) {
31
32
  max,
32
33
  step = 1,
33
34
  formatOptions,
35
+ locale = "en-US",
34
36
  clampValueOnBlur = true,
35
37
  disabled = false,
36
38
  readOnly = false,
@@ -39,7 +41,7 @@ function NumberFieldRoot(props) {
39
41
  } = props;
40
42
  const inputId = useId();
41
43
  const inputRef = useRef(null);
42
- const formatter = useMemo(() => createFormatter(formatOptions), [formatOptions]);
44
+ const formatter = useMemo(() => createFormatter(locale, formatOptions), [locale, formatOptions]);
43
45
  const [value, setValue] = useControllableState({
44
46
  value: controlledValue,
45
47
  defaultValue,
@@ -146,7 +148,11 @@ function NumberFieldGroup(props) {
146
148
  return useRenderElement({
147
149
  as,
148
150
  defaultTag: "div",
149
- props: { ...consumerProps, "data-disabled": disabled ? "" : void 0 },
151
+ props: {
152
+ ...consumerProps,
153
+ "data-disabled": disabled ? "" : void 0,
154
+ "data-part": "group"
155
+ },
150
156
  render,
151
157
  state: { disabled }
152
158
  });
@@ -171,6 +177,7 @@ function NumberFieldInput(props) {
171
177
  setEditing
172
178
  } = useNumberFieldContext("Input");
173
179
  const onKeyDown = (event) => {
180
+ if (isComposingKeyEvent(event)) return;
174
181
  if (disabled || readOnly) return;
175
182
  switch (event.key) {
176
183
  case "ArrowUp":
@@ -206,9 +213,10 @@ function NumberFieldInput(props) {
206
213
  defaultTag: "input",
207
214
  props: {
208
215
  ...consumerProps,
209
- id: inputId,
216
+ id: consumerProps.id ?? inputId,
210
217
  ref: inputRef,
211
218
  role: "spinbutton",
219
+ "data-part": "input",
212
220
  inputMode: "decimal",
213
221
  "aria-valuenow": numericValue,
214
222
  "aria-valuemin": min,
@@ -250,9 +258,15 @@ function NumberFieldIncrement(props) {
250
258
  ...consumerProps,
251
259
  type: "button",
252
260
  tabIndex: -1,
261
+ "data-part": "increment",
253
262
  "data-disabled": inactive ? "" : void 0,
254
263
  disabled: inactive || void 0,
255
- onClick: composeEventHandlers(consumerProps.onClick, () => increment()),
264
+ onClick: composeEventHandlers(
265
+ consumerProps.onClick,
266
+ (event) => {
267
+ if (event.detail === 0) increment();
268
+ }
269
+ ),
256
270
  onPointerDown: composeEventHandlers(consumerProps.onPointerDown, repeatProps.onPointerDown),
257
271
  onPointerUp: composeEventHandlers(consumerProps.onPointerUp, repeatProps.onPointerUp),
258
272
  onPointerLeave: composeEventHandlers(
@@ -280,9 +294,15 @@ function NumberFieldDecrement(props) {
280
294
  ...consumerProps,
281
295
  type: "button",
282
296
  tabIndex: -1,
297
+ "data-part": "decrement",
283
298
  "data-disabled": inactive ? "" : void 0,
284
299
  disabled: inactive || void 0,
285
- onClick: composeEventHandlers(consumerProps.onClick, () => decrement()),
300
+ onClick: composeEventHandlers(
301
+ consumerProps.onClick,
302
+ (event) => {
303
+ if (event.detail === 0) decrement();
304
+ }
305
+ ),
286
306
  onPointerDown: composeEventHandlers(consumerProps.onPointerDown, repeatProps.onPointerDown),
287
307
  onPointerUp: composeEventHandlers(consumerProps.onPointerUp, repeatProps.onPointerUp),
288
308
  onPointerLeave: composeEventHandlers(
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/number-field/NumberField.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n useCallback,\n useMemo,\n useRef,\n useState,\n type ElementType,\n type FocusEvent,\n type KeyboardEvent,\n type ReactElement,\n type ReactNode,\n type SyntheticEvent,\n} from \"react\";\nimport { useControllableState, useId } from \"@gunkin/uiify/hooks\";\nimport { createPartContext } from \"@gunkin/uiify/core\";\nimport { composeEventHandlers } from \"@gunkin/uiify/core/compose-event-handlers\";\nimport { useRenderElement, type PolymorphicProps } from \"@gunkin/uiify/core/render\";\nimport {\n clampNumber,\n createFormatter,\n formatNumber,\n isNumberInput,\n parseNumber,\n stepNumber,\n} from \"./format.js\";\nimport { usePressRepeat } from \"./use-press-repeat.js\";\nimport type {\n NumberFieldContextValue,\n NumberFieldRootProps,\n NumberFieldGroupProps,\n NumberFieldInputProps,\n NumberFieldIncrementProps,\n NumberFieldDecrementProps,\n} from \"./types.js\";\n\nexport type {\n NumberFieldDecrementProps,\n NumberFieldGroupProps,\n NumberFieldIncrementProps,\n NumberFieldInputProps,\n NumberFieldRootOwnProps,\n NumberFieldRootProps,\n} from \"./types.js\";\n\nconst [NumberFieldProvider, useNumberFieldContext] =\n createPartContext<NumberFieldContextValue>(\"NumberField\");\n\nexport function NumberFieldRoot<TAs extends ElementType = \"div\">(\n props: NumberFieldRootProps<TAs>,\n): ReactElement | null {\n const {\n as,\n render,\n value: controlledValue,\n defaultValue,\n onValueChange,\n min,\n max,\n step = 1,\n formatOptions,\n clampValueOnBlur = true,\n disabled = false,\n readOnly = false,\n required = false,\n ...consumerProps\n } = props as NumberFieldRootProps<ElementType>;\n\n const inputId = useId();\n const inputRef = useRef<HTMLInputElement>(null);\n const formatter = useMemo(() => createFormatter(formatOptions), [formatOptions]);\n const [value, setValue] = useControllableState<number | undefined>({\n value: controlledValue,\n defaultValue,\n onChange: onValueChange,\n });\n const [editing, setEditing] = useState(false);\n const [displayValue, setDisplayValue] = useState(() =>\n value === undefined ? \"\" : formatNumber(value, formatter),\n );\n\n const syncDisplay = useCallback(\n (next: number | undefined) => {\n setDisplayValue(next === undefined ? \"\" : formatNumber(next, formatter));\n },\n [formatter],\n );\n\n const applyValue = useCallback(\n (next: number | undefined) => {\n const clamped =\n next === undefined ? undefined : clampValueOnBlur ? clampNumber(next, min, max) : next;\n setValue(clamped);\n syncDisplay(clamped);\n },\n [clampValueOnBlur, max, min, setValue, syncDisplay],\n );\n\n const increment = useCallback(\n (multiplier = 1) => {\n if (disabled || readOnly) return;\n const base = value ?? min ?? 0;\n applyValue(stepNumber(base, multiplier, step, min, max));\n },\n [applyValue, disabled, max, min, readOnly, step, value],\n );\n\n const decrement = useCallback(\n (multiplier = 1) => {\n increment(-multiplier);\n },\n [increment],\n );\n\n const commitInput = useCallback(\n (raw: string) => {\n const parsed = parseNumber(raw, formatter);\n if (parsed === undefined) {\n syncDisplay(value);\n return;\n }\n applyValue(parsed);\n },\n [applyValue, formatter, syncDisplay, value],\n );\n\n const contextValue = useMemo<NumberFieldContextValue>(\n () => ({\n clampValueOnBlur,\n commitInput,\n decrement,\n disabled,\n displayValue: editing\n ? displayValue\n : value === undefined\n ? \"\"\n : formatNumber(value, formatter),\n formatter,\n increment,\n inputId,\n inputRef,\n max,\n min,\n numericValue: value,\n readOnly,\n required,\n setDisplayValue,\n setEditing,\n step,\n }),\n [\n clampValueOnBlur,\n commitInput,\n decrement,\n disabled,\n displayValue,\n editing,\n formatter,\n increment,\n inputId,\n max,\n min,\n readOnly,\n required,\n step,\n value,\n ],\n );\n\n const element = useRenderElement({\n as,\n defaultTag: \"div\",\n props: {\n ...consumerProps,\n \"data-disabled\": disabled ? \"\" : undefined,\n \"data-uiify-number-field\": \"\",\n },\n render,\n state: { disabled, readOnly, required },\n });\n\n return <NumberFieldProvider value={contextValue}>{element}</NumberFieldProvider>;\n}\nNumberFieldRoot.displayName = \"NumberFieldRoot\";\n\nexport function NumberFieldGroup<TAs extends ElementType = \"div\">(\n props: NumberFieldGroupProps<TAs>,\n): ReactElement | null {\n const { as, render, ...consumerProps } = props as NumberFieldGroupProps<ElementType>;\n const { disabled } = useNumberFieldContext(\"Group\");\n\n return useRenderElement({\n as,\n defaultTag: \"div\",\n props: { ...consumerProps, \"data-disabled\": disabled ? \"\" : undefined },\n render,\n state: { disabled },\n });\n}\n\nexport function NumberFieldInput<TAs extends ElementType = \"input\">(\n props: NumberFieldInputProps<TAs>,\n): ReactElement | null {\n const { as, render, ...consumerProps } = props as NumberFieldInputProps<\"input\">;\n const {\n commitInput,\n decrement,\n disabled,\n displayValue,\n formatter,\n increment,\n inputId,\n inputRef,\n max,\n min,\n numericValue,\n readOnly,\n required,\n setDisplayValue,\n setEditing,\n } = useNumberFieldContext(\"Input\");\n\n const onKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n if (disabled || readOnly) return;\n switch (event.key) {\n case \"ArrowUp\":\n event.preventDefault();\n increment();\n break;\n case \"ArrowDown\":\n event.preventDefault();\n decrement();\n break;\n case \"PageUp\":\n event.preventDefault();\n increment(10);\n break;\n case \"PageDown\":\n event.preventDefault();\n decrement(10);\n break;\n case \"Home\":\n event.preventDefault();\n if (min !== undefined) commitInput(String(min));\n break;\n case \"End\":\n event.preventDefault();\n if (max !== undefined) commitInput(String(max));\n break;\n default:\n break;\n }\n };\n\n return useRenderElement({\n as,\n defaultTag: \"input\",\n props: {\n ...consumerProps,\n id: inputId,\n ref: inputRef,\n role: \"spinbutton\",\n inputMode: \"decimal\",\n \"aria-valuenow\": numericValue,\n \"aria-valuemin\": min,\n \"aria-valuemax\": max,\n \"aria-required\": required || undefined,\n \"data-disabled\": disabled ? \"\" : undefined,\n \"data-readonly\": readOnly ? \"\" : undefined,\n disabled: disabled || undefined,\n readOnly: readOnly || undefined,\n required: required || undefined,\n value: displayValue,\n onFocus: composeEventHandlers(consumerProps.onFocus, () => setEditing(true)),\n onBlur: composeEventHandlers(consumerProps.onBlur, (event: FocusEvent<HTMLInputElement>) => {\n setEditing(false);\n commitInput(event.currentTarget.value);\n }),\n onChange: composeEventHandlers(\n consumerProps.onChange,\n (event: SyntheticEvent<HTMLInputElement>) => {\n if (isNumberInput(event.currentTarget.value, formatter))\n setDisplayValue(event.currentTarget.value);\n },\n ),\n onKeyDown: composeEventHandlers(consumerProps.onKeyDown, onKeyDown),\n },\n render,\n state: { disabled, readOnly, required },\n });\n}\n\nexport function NumberFieldIncrement<TAs extends ElementType = \"button\">(\n props: NumberFieldIncrementProps<TAs>,\n): ReactElement | null {\n const { as, render, ...consumerProps } = props as PolymorphicProps<\n \"button\",\n { readonly children?: ReactNode }\n >;\n const { disabled, increment, readOnly } = useNumberFieldContext(\"Increment\");\n const inactive = disabled || readOnly;\n const repeatProps = usePressRepeat(() => increment(), inactive);\n\n return useRenderElement({\n as,\n defaultTag: \"button\",\n props: {\n ...consumerProps,\n type: \"button\",\n tabIndex: -1,\n \"data-disabled\": inactive ? \"\" : undefined,\n disabled: inactive || undefined,\n onClick: composeEventHandlers(consumerProps.onClick, () => increment()),\n onPointerDown: composeEventHandlers(consumerProps.onPointerDown, repeatProps.onPointerDown),\n onPointerUp: composeEventHandlers(consumerProps.onPointerUp, repeatProps.onPointerUp),\n onPointerLeave: composeEventHandlers(\n consumerProps.onPointerLeave,\n repeatProps.onPointerLeave,\n ),\n onPointerCancel: composeEventHandlers(\n consumerProps.onPointerCancel,\n repeatProps.onPointerCancel,\n ),\n },\n render,\n state: { disabled: inactive },\n });\n}\n\nexport function NumberFieldDecrement<TAs extends ElementType = \"button\">(\n props: NumberFieldDecrementProps<TAs>,\n): ReactElement | null {\n const { as, render, ...consumerProps } = props as PolymorphicProps<\n \"button\",\n { readonly children?: ReactNode }\n >;\n const { decrement, disabled, readOnly } = useNumberFieldContext(\"Decrement\");\n const inactive = disabled || readOnly;\n const repeatProps = usePressRepeat(() => decrement(), inactive);\n\n return useRenderElement({\n as,\n defaultTag: \"button\",\n props: {\n ...consumerProps,\n type: \"button\",\n tabIndex: -1,\n \"data-disabled\": inactive ? \"\" : undefined,\n disabled: inactive || undefined,\n onClick: composeEventHandlers(consumerProps.onClick, () => decrement()),\n onPointerDown: composeEventHandlers(consumerProps.onPointerDown, repeatProps.onPointerDown),\n onPointerUp: composeEventHandlers(consumerProps.onPointerUp, repeatProps.onPointerUp),\n onPointerLeave: composeEventHandlers(\n consumerProps.onPointerLeave,\n repeatProps.onPointerLeave,\n ),\n onPointerCancel: composeEventHandlers(\n consumerProps.onPointerCancel,\n repeatProps.onPointerCancel,\n ),\n },\n render,\n state: { disabled: inactive },\n });\n}\n\nexport const NumberField = {\n Root: NumberFieldRoot,\n Group: NumberFieldGroup,\n Input: NumberFieldInput,\n Increment: NumberFieldIncrement,\n Decrement: NumberFieldDecrement,\n};\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/components/number-field/NumberField.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n useCallback,\n useMemo,\n useRef,\n useState,\n type ElementType,\n type FocusEvent,\n type KeyboardEvent,\n type MouseEvent as ReactMouseEvent,\n type ReactElement,\n type ReactNode,\n type SyntheticEvent,\n} from \"react\";\nimport { useControllableState, useId } from \"@gunkin/uiify/hooks\";\nimport { createPartContext } from \"@gunkin/uiify/core\";\nimport { isComposingKeyEvent } from \"@gunkin/uiify/core/ime\";\nimport { composeEventHandlers } from \"@gunkin/uiify/core/compose-event-handlers\";\nimport { useRenderElement, type PolymorphicProps } from \"@gunkin/uiify/core/render\";\nimport {\n clampNumber,\n createFormatter,\n formatNumber,\n isNumberInput,\n parseNumber,\n stepNumber,\n} from \"./format.js\";\nimport { usePressRepeat } from \"./use-press-repeat.js\";\nimport type {\n NumberFieldContextValue,\n NumberFieldRootProps,\n NumberFieldGroupProps,\n NumberFieldInputProps,\n NumberFieldIncrementProps,\n NumberFieldDecrementProps,\n} from \"./types.js\";\n\nexport type {\n NumberFieldDecrementProps,\n NumberFieldGroupProps,\n NumberFieldIncrementProps,\n NumberFieldInputOwnProps,\n NumberFieldInputProps,\n NumberFieldRootOwnProps,\n NumberFieldRootProps,\n} from \"./types.js\";\n\nconst [NumberFieldProvider, useNumberFieldContext] =\n createPartContext<NumberFieldContextValue>(\"NumberField\");\n\nexport function NumberFieldRoot<TAs extends ElementType = \"div\">(\n props: NumberFieldRootProps<TAs>,\n): ReactElement | null {\n const {\n as,\n render,\n value: controlledValue,\n defaultValue,\n onValueChange,\n min,\n max,\n step = 1,\n formatOptions,\n locale = \"en-US\",\n clampValueOnBlur = true,\n disabled = false,\n readOnly = false,\n required = false,\n ...consumerProps\n } = props as NumberFieldRootProps<ElementType>;\n\n const inputId = useId();\n const inputRef = useRef<HTMLInputElement>(null);\n const formatter = useMemo(() => createFormatter(locale, formatOptions), [locale, formatOptions]);\n const [value, setValue] = useControllableState<number | undefined>({\n value: controlledValue,\n defaultValue,\n onChange: onValueChange,\n });\n const [editing, setEditing] = useState(false);\n const [displayValue, setDisplayValue] = useState(() =>\n value === undefined ? \"\" : formatNumber(value, formatter),\n );\n\n const syncDisplay = useCallback(\n (next: number | undefined) => {\n setDisplayValue(next === undefined ? \"\" : formatNumber(next, formatter));\n },\n [formatter],\n );\n\n const applyValue = useCallback(\n (next: number | undefined) => {\n const clamped =\n next === undefined ? undefined : clampValueOnBlur ? clampNumber(next, min, max) : next;\n setValue(clamped);\n syncDisplay(clamped);\n },\n [clampValueOnBlur, max, min, setValue, syncDisplay],\n );\n\n const increment = useCallback(\n (multiplier = 1) => {\n if (disabled || readOnly) return;\n const base = value ?? min ?? 0;\n applyValue(stepNumber(base, multiplier, step, min, max));\n },\n [applyValue, disabled, max, min, readOnly, step, value],\n );\n\n const decrement = useCallback(\n (multiplier = 1) => {\n increment(-multiplier);\n },\n [increment],\n );\n\n const commitInput = useCallback(\n (raw: string) => {\n const parsed = parseNumber(raw, formatter);\n if (parsed === undefined) {\n syncDisplay(value);\n return;\n }\n applyValue(parsed);\n },\n [applyValue, formatter, syncDisplay, value],\n );\n\n const contextValue = useMemo<NumberFieldContextValue>(\n () => ({\n clampValueOnBlur,\n commitInput,\n decrement,\n disabled,\n displayValue: editing\n ? displayValue\n : value === undefined\n ? \"\"\n : formatNumber(value, formatter),\n formatter,\n increment,\n inputId,\n inputRef,\n max,\n min,\n numericValue: value,\n readOnly,\n required,\n setDisplayValue,\n setEditing,\n step,\n }),\n [\n clampValueOnBlur,\n commitInput,\n decrement,\n disabled,\n displayValue,\n editing,\n formatter,\n increment,\n inputId,\n max,\n min,\n readOnly,\n required,\n step,\n value,\n ],\n );\n\n const element = useRenderElement({\n as,\n defaultTag: \"div\",\n props: {\n ...consumerProps,\n \"data-disabled\": disabled ? \"\" : undefined,\n \"data-uiify-number-field\": \"\",\n },\n render,\n state: { disabled, readOnly, required },\n });\n\n return <NumberFieldProvider value={contextValue}>{element}</NumberFieldProvider>;\n}\nNumberFieldRoot.displayName = \"NumberFieldRoot\";\n\nexport function NumberFieldGroup<TAs extends ElementType = \"div\">(\n props: NumberFieldGroupProps<TAs>,\n): ReactElement | null {\n const { as, render, ...consumerProps } = props as NumberFieldGroupProps<ElementType>;\n const { disabled } = useNumberFieldContext(\"Group\");\n\n return useRenderElement({\n as,\n defaultTag: \"div\",\n props: {\n ...consumerProps,\n \"data-disabled\": disabled ? \"\" : undefined,\n \"data-part\": \"group\",\n },\n render,\n state: { disabled },\n });\n}\n\nexport function NumberFieldInput<TAs extends ElementType = \"input\">(\n props: NumberFieldInputProps<TAs>,\n): ReactElement | null {\n const { as, render, ...consumerProps } = props as NumberFieldInputProps<\"input\">;\n const {\n commitInput,\n decrement,\n disabled,\n displayValue,\n formatter,\n increment,\n inputId,\n inputRef,\n max,\n min,\n numericValue,\n readOnly,\n required,\n setDisplayValue,\n setEditing,\n } = useNumberFieldContext(\"Input\");\n\n const onKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n if (isComposingKeyEvent(event)) return;\n if (disabled || readOnly) return;\n switch (event.key) {\n case \"ArrowUp\":\n event.preventDefault();\n increment();\n break;\n case \"ArrowDown\":\n event.preventDefault();\n decrement();\n break;\n case \"PageUp\":\n event.preventDefault();\n increment(10);\n break;\n case \"PageDown\":\n event.preventDefault();\n decrement(10);\n break;\n case \"Home\":\n event.preventDefault();\n if (min !== undefined) commitInput(String(min));\n break;\n case \"End\":\n event.preventDefault();\n if (max !== undefined) commitInput(String(max));\n break;\n default:\n break;\n }\n };\n\n return useRenderElement({\n as,\n defaultTag: \"input\",\n props: {\n ...consumerProps,\n id: consumerProps.id ?? inputId,\n ref: inputRef,\n role: \"spinbutton\",\n \"data-part\": \"input\",\n inputMode: \"decimal\",\n \"aria-valuenow\": numericValue,\n \"aria-valuemin\": min,\n \"aria-valuemax\": max,\n \"aria-required\": required || undefined,\n \"data-disabled\": disabled ? \"\" : undefined,\n \"data-readonly\": readOnly ? \"\" : undefined,\n disabled: disabled || undefined,\n readOnly: readOnly || undefined,\n required: required || undefined,\n value: displayValue,\n onFocus: composeEventHandlers(consumerProps.onFocus, () => setEditing(true)),\n onBlur: composeEventHandlers(consumerProps.onBlur, (event: FocusEvent<HTMLInputElement>) => {\n setEditing(false);\n commitInput(event.currentTarget.value);\n }),\n onChange: composeEventHandlers(\n consumerProps.onChange,\n (event: SyntheticEvent<HTMLInputElement>) => {\n if (isNumberInput(event.currentTarget.value, formatter))\n setDisplayValue(event.currentTarget.value);\n },\n ),\n onKeyDown: composeEventHandlers(consumerProps.onKeyDown, onKeyDown),\n },\n render,\n state: { disabled, readOnly, required },\n });\n}\n\nexport function NumberFieldIncrement<TAs extends ElementType = \"button\">(\n props: NumberFieldIncrementProps<TAs>,\n): ReactElement | null {\n const { as, render, ...consumerProps } = props as PolymorphicProps<\n \"button\",\n { readonly children?: ReactNode }\n >;\n const { disabled, increment, readOnly } = useNumberFieldContext(\"Increment\");\n const inactive = disabled || readOnly;\n const repeatProps = usePressRepeat(() => increment(), inactive);\n\n return useRenderElement({\n as,\n defaultTag: \"button\",\n props: {\n ...consumerProps,\n type: \"button\",\n tabIndex: -1,\n \"data-part\": \"increment\",\n \"data-disabled\": inactive ? \"\" : undefined,\n disabled: inactive || undefined,\n onClick: composeEventHandlers(\n consumerProps.onClick,\n (event: ReactMouseEvent<HTMLButtonElement>) => {\n if (event.detail === 0) increment();\n },\n ),\n onPointerDown: composeEventHandlers(consumerProps.onPointerDown, repeatProps.onPointerDown),\n onPointerUp: composeEventHandlers(consumerProps.onPointerUp, repeatProps.onPointerUp),\n onPointerLeave: composeEventHandlers(\n consumerProps.onPointerLeave,\n repeatProps.onPointerLeave,\n ),\n onPointerCancel: composeEventHandlers(\n consumerProps.onPointerCancel,\n repeatProps.onPointerCancel,\n ),\n },\n render,\n state: { disabled: inactive },\n });\n}\n\nexport function NumberFieldDecrement<TAs extends ElementType = \"button\">(\n props: NumberFieldDecrementProps<TAs>,\n): ReactElement | null {\n const { as, render, ...consumerProps } = props as PolymorphicProps<\n \"button\",\n { readonly children?: ReactNode }\n >;\n const { decrement, disabled, readOnly } = useNumberFieldContext(\"Decrement\");\n const inactive = disabled || readOnly;\n const repeatProps = usePressRepeat(() => decrement(), inactive);\n\n return useRenderElement({\n as,\n defaultTag: \"button\",\n props: {\n ...consumerProps,\n type: \"button\",\n tabIndex: -1,\n \"data-part\": \"decrement\",\n \"data-disabled\": inactive ? \"\" : undefined,\n disabled: inactive || undefined,\n onClick: composeEventHandlers(\n consumerProps.onClick,\n (event: ReactMouseEvent<HTMLButtonElement>) => {\n if (event.detail === 0) decrement();\n },\n ),\n onPointerDown: composeEventHandlers(consumerProps.onPointerDown, repeatProps.onPointerDown),\n onPointerUp: composeEventHandlers(consumerProps.onPointerUp, repeatProps.onPointerUp),\n onPointerLeave: composeEventHandlers(\n consumerProps.onPointerLeave,\n repeatProps.onPointerLeave,\n ),\n onPointerCancel: composeEventHandlers(\n consumerProps.onPointerCancel,\n repeatProps.onPointerCancel,\n ),\n },\n render,\n state: { disabled: inactive },\n });\n}\n\nexport const NumberField = {\n Root: NumberFieldRoot,\n Group: NumberFieldGroup,\n Input: NumberFieldInput,\n Increment: NumberFieldIncrement,\n Decrement: NumberFieldDecrement,\n};\n"],"mappings":"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","names":[]}
@@ -1,5 +1,5 @@
1
1
  export declare function clampNumber(value: number, min?: number, max?: number): number;
2
- export declare function createFormatter(options?: Intl.NumberFormatOptions): Intl.NumberFormat;
2
+ export declare function createFormatter(locale: string, options?: Intl.NumberFormatOptions): Intl.NumberFormat;
3
3
  export declare function formatNumber(value: number, formatter: Intl.NumberFormat): string;
4
4
  export declare function isNumberInput(input: string, formatter: Intl.NumberFormat): boolean;
5
5
  export declare function parseNumber(input: string, formatter: Intl.NumberFormat): number | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../../src/components/number-field/format.ts"],"names":[],"mappings":"AAAA,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAK7E;AAED,wBAAgB,eAAe,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,YAAY,CAErF;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,YAAY,GAAG,MAAM,CAEhF;AAoBD,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,YAAY,GAAG,OAAO,CAElF;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,YAAY,GAAG,MAAM,GAAG,SAAS,CAK3F;AAED,wBAAgB,UAAU,CACxB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,GAAG,CAAC,EAAE,MAAM,EACZ,GAAG,CAAC,EAAE,MAAM,GACX,MAAM,CAMR"}
1
+ {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../../src/components/number-field/format.ts"],"names":[],"mappings":"AAAA,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAK7E;AAED,wBAAgB,eAAe,CAC7B,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,IAAI,CAAC,mBAAmB,GACjC,IAAI,CAAC,YAAY,CAEnB;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,YAAY,GAAG,MAAM,CAEhF;AAgDD,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,YAAY,GAAG,OAAO,CAElF;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,YAAY,GAAG,MAAM,GAAG,SAAS,CAK3F;AAED,wBAAgB,UAAU,CACxB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,GAAG,CAAC,EAAE,MAAM,EACZ,GAAG,CAAC,EAAE,MAAM,GACX,MAAM,CAMR"}
@@ -4,21 +4,46 @@ function clampNumber(value, min, max) {
4
4
  if (max !== void 0 && next > max) next = max;
5
5
  return next;
6
6
  }
7
- function createFormatter(options) {
8
- return new Intl.NumberFormat(void 0, options);
7
+ function createFormatter(locale, options) {
8
+ return new Intl.NumberFormat(locale, options);
9
9
  }
10
10
  function formatNumber(value, formatter) {
11
11
  return formatter.format(value);
12
12
  }
13
+ const BIDI_CONTROL = /\p{Bidi_Control}/gu;
14
+ const digitMaps = /* @__PURE__ */ new WeakMap();
15
+ function fold(value) {
16
+ return value.normalize("NFKC").replace(BIDI_CONTROL, "");
17
+ }
18
+ function nativeDigits(formatter) {
19
+ let map = digitMaps.get(formatter);
20
+ if (!map) {
21
+ const { locale, numberingSystem } = formatter.resolvedOptions();
22
+ const digits = new Intl.NumberFormat(locale, { numberingSystem, useGrouping: false });
23
+ const entries = /* @__PURE__ */ new Map();
24
+ for (let digit = 0; digit <= 9; digit += 1) {
25
+ const native = fold(digits.format(digit));
26
+ if (native !== String(digit)) entries.set(native, String(digit));
27
+ }
28
+ map = entries;
29
+ digitMaps.set(formatter, map);
30
+ }
31
+ return map;
32
+ }
13
33
  function normalizeInput(input, formatter) {
14
34
  const parts = formatter.formatToParts(-12345.6);
15
- const decimal = parts.find((part) => part.type === "decimal")?.value ?? ".";
16
- const group = parts.find((part) => part.type === "group")?.value ?? ",";
17
- let normalized = input.trim().replaceAll(group, "").replace(decimal, ".");
35
+ const decimal = fold(parts.find((part) => part.type === "decimal")?.value ?? ".");
36
+ const group = fold(parts.find((part) => part.type === "group")?.value ?? ",");
37
+ let normalized = fold(input.trim());
38
+ for (const [native, ascii] of nativeDigits(formatter)) {
39
+ normalized = normalized.replaceAll(native, ascii);
40
+ }
41
+ normalized = normalized.replaceAll(group, "").replace(decimal, ".");
18
42
  for (const part of parts) {
43
+ const value = fold(part.value);
19
44
  if (part.type === "currency" || part.type === "unit" || part.type === "literal" || part.type === "percentSign")
20
- normalized = normalized.replaceAll(part.value, "");
21
- if (part.type === "minusSign") normalized = normalized.replaceAll(part.value, "-");
45
+ normalized = normalized.replaceAll(value, "");
46
+ if (part.type === "minusSign") normalized = normalized.replaceAll(value, "-");
22
47
  }
23
48
  return normalized.replace(/\s/g, "");
24
49
  }