@neo-ui-kit/react 0.0.0-stage → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (270) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +213 -2
  3. package/dist/artwork/icons.json.d.ts +2 -0
  4. package/dist/artwork/illustrations.json.d.ts +2 -0
  5. package/dist/chunks/chunk-347P6ZE4.js +104 -0
  6. package/dist/chunks/chunk-BJSFN52W.js +417 -0
  7. package/dist/chunks/chunk-FCOU3ODR.js +63 -0
  8. package/dist/chunks/chunk-JZ4GDTH5.js +87 -0
  9. package/dist/chunks/chunk-UGDRXR7P.js +3362 -0
  10. package/dist/chunks/chunk-VK6GHRLV.js +335 -0
  11. package/dist/chunks/chunk-YKCUOZ7V.js +777 -0
  12. package/dist/components/artwork/DatabaseArt/DatabaseArt.d.ts +6 -0
  13. package/dist/components/artwork/DatabaseArt/styles.css +58 -0
  14. package/dist/components/artwork/Landscape/Landscape.d.ts +7 -0
  15. package/dist/components/artwork/Landscape/styles.css +79 -0
  16. package/dist/components/artwork/NeonWaves/NeonWaves.d.ts +15 -0
  17. package/dist/components/artwork/NeonWaves/styles.css +48 -0
  18. package/dist/components/artwork/Planet/Planet.d.ts +4 -0
  19. package/dist/components/artwork/Planet/styles.css +52 -0
  20. package/dist/components/artwork/QuantumField/QuantumField.d.ts +42 -0
  21. package/dist/components/artwork/QuantumField/QuantumFieldExperience.d.ts +22 -0
  22. package/dist/components/artwork/QuantumField/UPSTREAM-LICENSE.txt +21 -0
  23. package/dist/components/artwork/QuantumField/audio.d.ts +15 -0
  24. package/dist/components/artwork/QuantumField/renderer.d.ts +24 -0
  25. package/dist/components/artwork/QuantumField/styles.css +77 -0
  26. package/dist/components/artwork/ServerArt/ServerArt.d.ts +8 -0
  27. package/dist/components/artwork/ServerArt/styles.css +43 -0
  28. package/dist/components/artwork/Spectrum/Spectrum.d.ts +7 -0
  29. package/dist/components/artwork/Spectrum/styles.css +35 -0
  30. package/dist/components/artwork/layers.d.ts +15 -0
  31. package/dist/components/artwork/useArtwork.d.ts +8 -0
  32. package/dist/components/controls/Autocomplete/Autocomplete.d.ts +2 -0
  33. package/dist/components/controls/Autocomplete/styles.css +1 -0
  34. package/dist/components/controls/Button/Button.d.ts +2 -0
  35. package/dist/components/controls/Button/styles.css +1 -0
  36. package/dist/components/controls/Checkbox/Checkbox.d.ts +2 -0
  37. package/dist/components/controls/Checkbox/styles.css +70 -0
  38. package/dist/components/controls/Chip/Chip.d.ts +21 -0
  39. package/dist/components/controls/Chip/styles.css +74 -0
  40. package/dist/components/controls/ChipField.d.ts +25 -0
  41. package/dist/components/controls/ColorPicker/ColorPicker.d.ts +16 -0
  42. package/dist/components/controls/ColorPicker/color.d.ts +9 -0
  43. package/dist/components/controls/ColorPicker/styles.css +103 -0
  44. package/dist/components/controls/DatePicker/DatePicker.d.ts +19 -0
  45. package/dist/components/controls/DatePicker/styles.css +69 -0
  46. package/dist/components/controls/FilePicker/FilePicker.d.ts +2 -0
  47. package/dist/components/controls/FilePicker/styles.css +149 -0
  48. package/dist/components/controls/IconButton/IconButton.d.ts +2 -0
  49. package/dist/components/controls/IconButton/styles.css +4 -0
  50. package/dist/components/controls/InputBase/InputBase.d.ts +21 -0
  51. package/dist/components/controls/InputBase/styles.css +379 -0
  52. package/dist/components/controls/Link/Link.d.ts +11 -0
  53. package/dist/components/controls/Link/styles.css +50 -0
  54. package/dist/components/controls/NumberField/NumberField.d.ts +2 -0
  55. package/dist/components/controls/NumberField/styles.css +1 -0
  56. package/dist/components/controls/PeoplePicker/PeoplePicker.d.ts +37 -0
  57. package/dist/components/controls/PeoplePicker/styles.css +7 -0
  58. package/dist/components/controls/SegmentedControl/SegmentedControl.d.ts +2 -0
  59. package/dist/components/controls/SegmentedControl/styles.css +9 -0
  60. package/dist/components/controls/Select/Select.d.ts +8 -0
  61. package/dist/components/controls/Select/styles.css +142 -0
  62. package/dist/components/controls/Slider/Slider.d.ts +3 -0
  63. package/dist/components/controls/Slider/styles.css +138 -0
  64. package/dist/components/controls/SplitButton/SplitButton.d.ts +2 -0
  65. package/dist/components/controls/SplitButton/styles.css +169 -0
  66. package/dist/components/controls/Switch/Switch.d.ts +2 -0
  67. package/dist/components/controls/Switch/styles.css +54 -0
  68. package/dist/components/controls/Tab/Tab.d.ts +2 -0
  69. package/dist/components/controls/Tab/styles.css +111 -0
  70. package/dist/components/controls/Tabs/Tabs.d.ts +2 -0
  71. package/dist/components/controls/Tabs/styles.css +239 -0
  72. package/dist/components/controls/TagInput/TagInput.d.ts +24 -0
  73. package/dist/components/controls/TagInput/styles.css +24 -0
  74. package/dist/components/controls/TextArea/TextArea.d.ts +2 -0
  75. package/dist/components/controls/TextArea/styles.css +15 -0
  76. package/dist/components/controls/TextField/TextField.d.ts +2 -0
  77. package/dist/components/controls/ThemePicker/ThemePicker.d.ts +24 -0
  78. package/dist/components/controls/ThemePicker/styles.css +128 -0
  79. package/dist/components/controls/ToggleButton/ToggleButton.d.ts +2 -0
  80. package/dist/components/controls/ToggleButton/styles.css +49 -0
  81. package/dist/components/controls/internal.d.ts +62 -0
  82. package/dist/components/controls/shared.css +694 -0
  83. package/dist/components/controls/shared.d.ts +204 -0
  84. package/dist/components/editor/PianoRoll/PianoRoll.d.ts +65 -0
  85. package/dist/components/editor/PianoRoll/styles.css +186 -0
  86. package/dist/components/editor/shared.css +1 -0
  87. package/dist/components/effects/AnimatedBorder/AnimatedBorder.d.ts +9 -0
  88. package/dist/components/effects/AnimatedBorder/styles.css +7 -0
  89. package/dist/components/effects/Beacon/Beacon.d.ts +9 -0
  90. package/dist/components/effects/Beacon/styles.css +38 -0
  91. package/dist/components/effects/Equalizer/Equalizer.d.ts +14 -0
  92. package/dist/components/effects/Equalizer/styles.css +38 -0
  93. package/dist/components/effects/GlowText/GlowText.d.ts +9 -0
  94. package/dist/components/effects/GlowText/styles.css +56 -0
  95. package/dist/components/effects/ImageShine/ImageShine.d.ts +13 -0
  96. package/dist/components/effects/ImageShine/styles.css +66 -0
  97. package/dist/components/effects/Marquee/Marquee.d.ts +9 -0
  98. package/dist/components/effects/Marquee/styles.css +46 -0
  99. package/dist/components/effects/MelodixText/MelodixText.d.ts +15 -0
  100. package/dist/components/effects/MelodixText/styles.css +28 -0
  101. package/dist/components/effects/Reveal/Reveal.d.ts +13 -0
  102. package/dist/components/effects/Reveal/styles.css +25 -0
  103. package/dist/components/effects/Shimmer/Shimmer.d.ts +10 -0
  104. package/dist/components/effects/Shimmer/styles.css +48 -0
  105. package/dist/components/effects/Sparkles/Sparkles.d.ts +9 -0
  106. package/dist/components/effects/Sparkles/styles.css +28 -0
  107. package/dist/components/effects/Spotlight/Spotlight.d.ts +11 -0
  108. package/dist/components/effects/Spotlight/styles.css +45 -0
  109. package/dist/components/effects/Tilt/Tilt.d.ts +11 -0
  110. package/dist/components/effects/Tilt/styles.css +67 -0
  111. package/dist/components/feedback/Badge/Badge.d.ts +3 -0
  112. package/dist/components/feedback/Badge/styles.css +91 -0
  113. package/dist/components/feedback/CollapsibleSection/CollapsibleSection.d.ts +2 -0
  114. package/dist/components/feedback/CollapsibleSection/styles.css +76 -0
  115. package/dist/components/feedback/DataTable/DataTable.d.ts +16 -0
  116. package/dist/components/feedback/DataTable/styles.css +522 -0
  117. package/dist/components/feedback/Dialog/Dialog.d.ts +2 -0
  118. package/dist/components/feedback/Dialog/styles.css +82 -0
  119. package/dist/components/feedback/EmptyState/EmptyState.d.ts +2 -0
  120. package/dist/components/feedback/EmptyState/styles.css +80 -0
  121. package/dist/components/feedback/KeyValueList/KeyValueList.d.ts +2 -0
  122. package/dist/components/feedback/KeyValueList/styles.css +51 -0
  123. package/dist/components/feedback/Menu/Menu.d.ts +2 -0
  124. package/dist/components/feedback/Menu/styles.css +123 -0
  125. package/dist/components/feedback/MenuItem/MenuItem.d.ts +2 -0
  126. package/dist/components/feedback/MenuItem/styles.css +71 -0
  127. package/dist/components/feedback/MessageBar/MessageBar.d.ts +2 -0
  128. package/dist/components/feedback/MessageBar/styles.css +116 -0
  129. package/dist/components/feedback/Popover/Popover.d.ts +2 -0
  130. package/dist/components/feedback/Popover/styles.css +44 -0
  131. package/dist/components/feedback/ProgressBar/ProgressBar.d.ts +2 -0
  132. package/dist/components/feedback/ProgressBar/styles.css +76 -0
  133. package/dist/components/feedback/SignalBars/SignalBars.d.ts +11 -0
  134. package/dist/components/feedback/SignalBars/styles.css +31 -0
  135. package/dist/components/feedback/StatusIndicator/StatusIndicator.d.ts +2 -0
  136. package/dist/components/feedback/StatusIndicator/styles.css +88 -0
  137. package/dist/components/feedback/Steps/Steps.d.ts +2 -0
  138. package/dist/components/feedback/Steps/styles.css +152 -0
  139. package/dist/components/feedback/Toast/Toast.d.ts +2 -0
  140. package/dist/components/feedback/Toast/styles.css +89 -0
  141. package/dist/components/feedback/Tooltip/Tooltip.d.ts +15 -0
  142. package/dist/components/feedback/Tooltip/styles.css +38 -0
  143. package/dist/components/feedback/shared.css +22 -0
  144. package/dist/components/feedback/shared.d.ts +231 -0
  145. package/dist/components/forms/Form/Form.d.ts +35 -0
  146. package/dist/components/forms/Form/styles.css +1 -0
  147. package/dist/components/forms/FormFields/FormFields.d.ts +20 -0
  148. package/dist/components/forms/FormFields/styles.css +72 -0
  149. package/dist/components/foundation/Loader/Loader.d.ts +30 -0
  150. package/dist/components/foundation/LoaderGenerator/LoaderGenerator.d.ts +38 -0
  151. package/dist/components/foundation/LoaderGenerator/styles.css +104 -0
  152. package/dist/components/foundation/ThemeEditor/ThemeEditor.d.ts +15 -0
  153. package/dist/components/foundation/ThemeEditor/styles.css +97 -0
  154. package/dist/components/foundation/ThemeEditor/themeConfig.d.ts +47 -0
  155. package/dist/components/foundation/ThemeProvider/ThemeProvider.d.ts +32 -0
  156. package/dist/components/foundation/ThemeProvider/styles.css +59 -0
  157. package/dist/components/foundation/Typography/Typography.d.ts +17 -0
  158. package/dist/components/foundation/Typography/styles.css +115 -0
  159. package/dist/components/layout/Avatar/Avatar.d.ts +2 -0
  160. package/dist/components/layout/Avatar/HostSeal.d.ts +5 -0
  161. package/dist/components/layout/Avatar/styles.css +166 -0
  162. package/dist/components/layout/BrandMark/BrandMark.d.ts +2 -0
  163. package/dist/components/layout/BrandMark/styles.css +39 -0
  164. package/dist/components/layout/ButtonGroup/ButtonGroup.d.ts +12 -0
  165. package/dist/components/layout/ButtonGroup/styles.css +36 -0
  166. package/dist/components/layout/Card/Card.d.ts +14 -0
  167. package/dist/components/layout/Card/styles.css +37 -0
  168. package/dist/components/layout/DialogActions/DialogActions.d.ts +12 -0
  169. package/dist/components/layout/DialogActions/styles.css +31 -0
  170. package/dist/components/layout/DialogBody/DialogBody.d.ts +12 -0
  171. package/dist/components/layout/DialogBody/styles.css +28 -0
  172. package/dist/components/layout/Divider/Divider.d.ts +2 -0
  173. package/dist/components/layout/Divider/styles.css +58 -0
  174. package/dist/components/layout/FloatingPanel/FloatingPanel.d.ts +15 -0
  175. package/dist/components/layout/FloatingPanel/styles.css +47 -0
  176. package/dist/components/layout/FloatingPanel/useFloatingPanel.d.ts +54 -0
  177. package/dist/components/layout/Grid/Grid.d.ts +24 -0
  178. package/dist/components/layout/Grid/styles.css +90 -0
  179. package/dist/components/layout/Header/Header.d.ts +2 -0
  180. package/dist/components/layout/Header/styles.css +42 -0
  181. package/dist/components/layout/Icon/Icon.d.ts +4 -0
  182. package/dist/components/layout/Icon/styles.css +62 -0
  183. package/dist/components/layout/Illustration/Illustration.d.ts +2 -0
  184. package/dist/components/layout/Illustration/styles.css +104 -0
  185. package/dist/components/layout/ScrollArea/ScrollArea.d.ts +2 -0
  186. package/dist/components/layout/ScrollArea/styles.css +61 -0
  187. package/dist/components/layout/Stack/Stack.d.ts +21 -0
  188. package/dist/components/layout/Stack/styles.css +53 -0
  189. package/dist/components/layout/StatTile/StatTile.d.ts +20 -0
  190. package/dist/components/layout/StatTile/styles.css +90 -0
  191. package/dist/components/layout/TabPanel/TabPanel.d.ts +2 -0
  192. package/dist/components/layout/TabPanel/styles.css +16 -0
  193. package/dist/components/layout/Text/Text.d.ts +2 -0
  194. package/dist/components/layout/Text/styles.css +29 -0
  195. package/dist/components/layout/Toolbar/Toolbar.d.ts +12 -0
  196. package/dist/components/layout/Toolbar/styles.css +7 -0
  197. package/dist/components/layout/shared.css +79 -0
  198. package/dist/components/layout/shared.d.ts +64 -0
  199. package/dist/components/media/AudioPlayer/AudioPlayer.d.ts +2 -0
  200. package/dist/components/media/AudioPlayer/styles.css +86 -0
  201. package/dist/components/media/KaraokeLyrics/KaraokeLyrics.d.ts +25 -0
  202. package/dist/components/media/KaraokeLyrics/styles.css +56 -0
  203. package/dist/components/media/LevelMeter/LevelMeter.d.ts +7 -0
  204. package/dist/components/media/LevelMeter/styles.css +30 -0
  205. package/dist/components/media/MediaCard/MediaCard.d.ts +24 -0
  206. package/dist/components/media/MediaCard/styles.css +108 -0
  207. package/dist/components/media/MelodyRoll/MelodyRoll.d.ts +48 -0
  208. package/dist/components/media/MelodyRoll/styles.css +196 -0
  209. package/dist/components/media/PianoKeyboard/PianoKeyboard.d.ts +24 -0
  210. package/dist/components/media/PianoKeyboard/styles.css +83 -0
  211. package/dist/components/media/RotaryKnob/RotaryKnob.d.ts +3 -0
  212. package/dist/components/media/RotaryKnob/styles.css +319 -0
  213. package/dist/components/media/Sparkline/Sparkline.d.ts +2 -0
  214. package/dist/components/media/Sparkline/styles.css +70 -0
  215. package/dist/components/media/WaveDecoration/WaveDecoration.d.ts +2 -0
  216. package/dist/components/media/WaveDecoration/styles.css +2 -0
  217. package/dist/components/media/Waveform/Waveform.d.ts +9 -0
  218. package/dist/components/media/Waveform/styles.css +375 -0
  219. package/dist/components/media/Waveform/useWaveformPeaks.d.ts +11 -0
  220. package/dist/components/media/shared.css +7 -0
  221. package/dist/components/media/shared.d.ts +80 -0
  222. package/dist/components/navigation/Router/Router.d.ts +32 -0
  223. package/dist/components/navigation/Router/styles.css +1 -0
  224. package/dist/components.css +102 -0
  225. package/dist/core/artwork.d.ts +17 -0
  226. package/dist/core/base.d.ts +65 -0
  227. package/dist/core/environment.d.ts +5 -0
  228. package/dist/core/i18n.d.ts +34 -0
  229. package/dist/core/messages.d.ts +1 -0
  230. package/dist/core/motion/hooks.d.ts +17 -0
  231. package/dist/core/motion-engine.d.ts +13 -0
  232. package/dist/core/noise.d.ts +20 -0
  233. package/dist/core/providers/context.d.ts +4 -0
  234. package/dist/core/responsive.d.ts +13 -0
  235. package/dist/core.d.ts +8 -0
  236. package/dist/core.js +56 -0
  237. package/dist/editor.d.ts +2 -0
  238. package/dist/editor.js +8 -0
  239. package/dist/fonts/melodix/Melodix-100.woff2 +0 -0
  240. package/dist/fonts/melodix/Melodix-200.woff2 +0 -0
  241. package/dist/fonts/melodix/Melodix-300.woff2 +0 -0
  242. package/dist/fonts/melodix/Melodix-400.woff2 +0 -0
  243. package/dist/fonts/melodix/Melodix-500.woff2 +0 -0
  244. package/dist/fonts/melodix/Melodix-600.woff2 +0 -0
  245. package/dist/fonts/melodix/Melodix-700.woff2 +0 -0
  246. package/dist/fonts/melodix/Melodix-800.woff2 +0 -0
  247. package/dist/fonts/melodix/Melodix-900.woff2 +0 -0
  248. package/dist/fonts/melodix/MelodixText-100.woff2 +0 -0
  249. package/dist/fonts/melodix/MelodixText-200.woff2 +0 -0
  250. package/dist/fonts/melodix/MelodixText-300.woff2 +0 -0
  251. package/dist/fonts/melodix/MelodixText-400.woff2 +0 -0
  252. package/dist/fonts/melodix/MelodixText-500.woff2 +0 -0
  253. package/dist/fonts/melodix/MelodixText-600.woff2 +0 -0
  254. package/dist/fonts/melodix/MelodixText-700.woff2 +0 -0
  255. package/dist/fonts/melodix/MelodixText-800.woff2 +0 -0
  256. package/dist/fonts/melodix/MelodixText-900.woff2 +0 -0
  257. package/dist/fonts/melodix/OFL-PlayfairDisplay.txt +93 -0
  258. package/dist/fonts/melodix.css +123 -0
  259. package/dist/forms.d.ts +4 -0
  260. package/dist/forms.js +17 -0
  261. package/dist/index.d.ts +163 -0
  262. package/dist/index.js +9683 -0
  263. package/dist/router.d.ts +2 -0
  264. package/dist/router.js +11 -0
  265. package/dist/styles.css +2 -0
  266. package/dist/theme/base.css +221 -0
  267. package/dist/theme/tokens.css +196 -0
  268. package/dist/theme/typography.d.ts +24 -0
  269. package/dist/tokens.css +1 -0
  270. package/package.json +83 -4
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 pro100dimka
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,3 +1,214 @@
1
- # Temporary Holding Version
1
+ # @neo-ui-kit/react
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ Migration: replace `@ad-voice/ui` with `@neo-ui-kit/react` in dependencies and imports, including CSS and `/core`, `/forms`, `/editor`, `/router` subpaths. Install `@neo-ui-kit/react`; component APIs and CSS class names are unchanged. The old package name is not an alias.
4
+
5
+ NEO UI — React + TypeScript UI kit: glass/ruby surfaces, animated neon borders, fields, tabs, dialogs, audio controls and a melody editor.
6
+
7
+ ## Install
8
+
9
+ Live docs: https://pro100dimka.github.io/adui/
10
+
11
+ Install the package in your application. React and ReactDOM are peer dependencies; the declared range is React 18.2 through 19.
12
+
13
+ ```bash
14
+ npm install @neo-ui-kit/react
15
+ ```
16
+
17
+ Package: [@neo-ui-kit/react on npm](https://www.npmjs.com/package/@neo-ui-kit/react).
18
+
19
+ Import the stylesheet once in the app entry point:
20
+
21
+ ```ts
22
+ import "@neo-ui-kit/react/styles.css";
23
+ ```
24
+
25
+ To test repository changes before publishing, run `npm run package` from the repository root and install the resulting archive in a separate application:
26
+
27
+ ```bash
28
+ npm install /path/to/adui/release/neo-ui-kit-react-1.0.1.tgz
29
+ ```
30
+
31
+ Maintainers publish new versions from `Pro100Dimka/adui` using the `release.yml` GitHub Actions workflow, a matching `v<version>` tag, and the `npm-publication` environment. npm trusts its OIDC identity; no `NPM_TOKEN` is required. The workflow checks the project and packed consumer before publishing the tested archive. Published `1.0.0` cannot be overwritten: code and README changes in npm require a new package version. See the [repository release instructions](https://github.com/Pro100Dimka/adui#npm-пакет).
32
+
33
+ ## Theme
34
+
35
+ Two colours build the whole palette (a primary scale, a secondary scale and tinted neutrals):
36
+
37
+ ```tsx
38
+ import { ThemeProvider } from "@neo-ui-kit/react";
39
+
40
+ <ThemeProvider theme="violet">…</ThemeProvider> // a ready pair
41
+ <ThemeProvider primary="#2f7bff" secondary="#9cc4ff">…</ThemeProvider>
42
+ <ThemeProvider tokens={{ "primary-900": "#0a1430" }}>…</ThemeProvider> // any token by hand
43
+ ```
44
+
45
+ ## Usage
46
+
47
+ ```tsx
48
+ import { Button, Card, Switch, TextField } from "@neo-ui-kit/react";
49
+
50
+ export function SettingsCard() {
51
+ return (
52
+ <Card title="Настройки" border>
53
+ <TextField label="Имя в онлайн-комнате" defaultValue="BBB" clearable />
54
+ <Switch label="Радио включено" defaultChecked />
55
+ <Button variant="primary" icon="save">
56
+ Сохранить
57
+ </Button>
58
+ </Card>
59
+ );
60
+ }
61
+ ```
62
+
63
+ Fields that declare `value` / `defaultValue` support controlled and uncontrolled values; checkboxes and switches use `checked` / `defaultChecked`. Dialog supports `open` / `defaultOpen` and `onOpenChange`; Popover requires controlled `open`. See each component's API for its supported state and event names; a change callback reports a user action, while the owner applies the new controlled value.
64
+
65
+ The package ships ESM only. Import styles once and wrap the UI in `ThemeProvider`; no playground CSS or router is required. `@neo-ui-kit/react/core`, `/forms`, `/editor`, and `/router` share the same provider contexts with the root entry.
66
+
67
+ The library code is licensed under [MIT](./LICENSE). Bundled third-party materials retain their respective licenses and notices: `dist/fonts/melodix/OFL-PlayfairDisplay.txt` for the font and `dist/components/artwork/QuantumField/UPSTREAM-LICENSE.txt` for Quantum Fields.
68
+
69
+ ## QuantumField
70
+
71
+ `QuantumField` is an original, theme-native 3D audio visualization for backgrounds and panels. It renders immediately—there is no Enter gate—and its seven `mode` values are `orbit`, `vortex`, `lattice`, `wave`, `bloom`, `helix`, and `terrain`. Its bounded WebGL renderer uses static particle and filament buffers without post-processing; Canvas 2D is a fallback when WebGL is unavailable. `quality="auto"` limits pixels and particles, and drawing pauses outside the viewport, in hidden tabs, or when the kit's motion setting is off. `interactive` enables deep wheel zoom, local pointer influence, and drag-to-rotate; hovering alone never rotates the whole field. `density`, `speed`, `quality`, `interactive`, and `paused` are optional. Normally its colours follow the nearest `ThemeProvider`; `palette={[primary, secondary]}` overrides one instance.
72
+
73
+ ```tsx
74
+ import { QuantumField, ThemeProvider } from "@neo-ui-kit/react";
75
+
76
+ <ThemeProvider primary="#10c99a" secondary="#7cf3d0">
77
+ <QuantumField mode="vortex" quality="auto" aria-label="Audio field" />
78
+ </ThemeProvider>
79
+ ```
80
+
81
+ To react to a microphone, request access only from a user click and pass the resulting stream. The component owns and releases its audio analysis graph; your app still owns the stream and stops its tracks when no longer needed.
82
+
83
+ ```tsx
84
+ import { useEffect, useState } from "react";
85
+ import { Button, QuantumField } from "@neo-ui-kit/react";
86
+
87
+ function MicrophoneField() {
88
+ const [stream, setStream] = useState<MediaStream | null>(null);
89
+ useEffect(() => () => stream?.getTracks().forEach((track) => track.stop()), [stream]);
90
+ return <>
91
+ <Button onClick={async () => setStream(await navigator.mediaDevices.getUserMedia({ audio: true }))}>
92
+ Enable microphone
93
+ </Button>
94
+ <QuantumField mode="terrain" stream={stream ?? undefined} />
95
+ </>;
96
+ }
97
+ ```
98
+
99
+ For a file player, `createQuantumFieldAudio()` provides a small optional transport. Create it in response to a user action, call `loadFile(file)` (which does **not** autoplay), then pass `controller.analyser` as `audio`. Its `play`, `pause`, `seek`, `media`, and `dispose` members let you build the controls with the kit's `FilePicker`, `Button`, and `Slider`. `requestMicrophone()` is explicit and stops only the stream it requested; `connectStream(stream)` accepts an app-owned stream without taking ownership.
100
+
101
+ ```tsx
102
+ import { useEffect, useRef, useState } from "react";
103
+ import { Button, FilePicker, QuantumField, createQuantumFieldAudio } from "@neo-ui-kit/react";
104
+
105
+ function FileField() {
106
+ const controller = useRef<ReturnType<typeof createQuantumFieldAudio> | null>(null);
107
+ const [analyser, setAnalyser] = useState<AnalyserNode | null>(null);
108
+ useEffect(() => () => { void controller.current?.dispose(); }, []);
109
+
110
+ return <>
111
+ <FilePicker variant="button" accept="audio/*" label="Choose audio" onFiles={([file]) => {
112
+ if (!file) return;
113
+ const audio = controller.current ??= createQuantumFieldAudio();
114
+ audio.loadFile(file); // does not autoplay
115
+ setAnalyser(audio.analyser);
116
+ }} />
117
+ <Button disabled={!analyser} onClick={() => { void controller.current?.play(); }}>Play</Button>
118
+ <QuantumField mode="wave" audio={analyser ?? undefined} />
119
+ </>;
120
+ }
121
+ ```
122
+
123
+ An existing audio engine can also pass its own `AnalyserNode` as `audio`, or a callback returning `{ bands: [bass, …, air], energy, beat }` with seven normalized band levels. Playback and permission handling stay outside the visualizer, so mounting it never captures audio unexpectedly.
124
+
125
+ ## DataTable
126
+
127
+ `DataTable` includes multi-column sorting, per-column filters with distinct-value autocomplete, grouping and aggregates, search, selection, column visibility/order/pinning, lazy row details, row actions, row numbers, density controls, CSV export, and responsive cards. Readers can resize columns by dragging the header edge or focusing it and pressing ←/→; double-clicking the edge restores its original width. `resizableColumns={false}` disables all handles, and `resizable: false` disables one column.
128
+
129
+ Set `pageSize` to enable pagination. `pageSizeOptions` provides footer choices (the initial size is always included), and the footer shows the visible result range. The reset button clears sorting, filters, grouping, search, hidden columns, resized widths, and the chosen page size. See the live `DataTable` example in the documentation for complete column and row definitions.
130
+
131
+ Click a header to cycle ascending/descending/unsorted; Shift-click adds another sort criterion. `sorting` / `defaultSorting` / `onSortingChange` manage the ordered array of criteria. The existing single-column `sort` API remains supported. `columnOrder` and `columnPinning` have the same controlled/default/change pattern; pinning is `{ left: ["name"], right: ["status"] }`. The Columns menu exposes keyboard-accessible reordering and pinning. `renderRowDetails(row, index)` is called only for expanded, mounted rows; `expandedRows` contains stable row keys. `renderRowActions` adds an isolated actions cell (`rowActionsWidth` defaults to 120px). Enable `rowNumbers` and `densityToggle` as needed.
132
+
133
+ For a remote table, supply only the current page and control the state used by your data client:
134
+
135
+ ```tsx
136
+ import { useState } from "react";
137
+ import { DataTable, type DataTablePagination, type DataTableSort } from "@neo-ui-kit/react";
138
+
139
+ type Person = { id: string; name: string };
140
+ const columns = [{ key: "name", title: "Name" }];
141
+
142
+ export function PeopleTable({ rows, total, loading }: { rows: Person[]; total: number; loading: boolean }) {
143
+ const [query, setQuery] = useState("");
144
+ const [sorting, setSorting] = useState<DataTableSort[]>([]);
145
+ const [pagination, setPagination] = useState<DataTablePagination>({ pageIndex: 0, pageSize: 25 });
146
+ // Your data client loads rows for query, sorting and pagination; cancel stale requests there.
147
+ return <DataTable columns={columns} rows={rows} rowCount={total} loading={loading}
148
+ searchable query={query} onQueryChange={setQuery}
149
+ sorting={sorting} onSortingChange={setSorting}
150
+ pagination={pagination} onPaginationChange={setPagination}
151
+ manualFiltering manualSorting manualPagination />;
152
+ }
153
+ ```
154
+
155
+ Manual flags are independent: the table does not fetch data and does not re-filter, re-sort or re-slice the corresponding server results. Provide `rowCount` for exact remote page counts. Without it, remote pagination keeps the current page and offers Next while the received page is full. Selection keys survive changing remote pages. Column filters search the complete distinct-value set before offering up to 100 suggestions; the actual row filter is not capped.
156
+
157
+ For an unpaginated large dataset use `virtualize maxHeight={480}`. The table mounts a viewport-sized range plus `overscan`, measures variable row/detail heights, and keeps a scrollable table on narrow screens rather than converting virtual rows into cards. Pinned tables also keep their horizontal table layout on narrow screens. `estimatedRowHeight` is the initial estimate, not a fixed-height restriction. Small paginated tables do not need virtualization. Stable row keys are important for measured heights, details and selection.
158
+
159
+ ## Responsiveness
160
+
161
+ The package pauses decorative work outside the viewport and in hidden tabs. Its shared motion clock stops when no visible work remains; consumers do not need a separate animation scheduler. Playback updates are isolated from transport and volume controls. Audio analysis and loader image processing yield between short CPU work slices, and unmounting cancels stale results. Processed loader images are capped at 2048px on the longest side; turning background removal off restores the original upload.
162
+
163
+ Router updates are immediate by default. Opt into native snapshot transitions with `transition` only when their temporary interruption of pointer interaction suits your screen; normal CSS entrances do not require it.
164
+
165
+ Animated border geometry is initialized and resized in small batches on the shared clock, only while visible. Light positions use the cached contour instead of querying SVG geometry on every frame. Offscreen borders keep their light position without measuring layout or advancing the effect.
166
+
167
+ Keep `rows`, `columns`, `options`, and `initialValues` immutable: replace them when their contents change. Stable references allow expensive derived results to be reused across selection, navigation, and other local UI changes. Do not memoize every prop automatically.
168
+
169
+ For large tables, use `pageSize` or opt into `virtualize` to bound mounted rows. Virtualization bounds rendering, not the cost of client-side sorting/filtering: use the manual server contracts for datasets that are too large to process locally. Open Select/Autocomplete lists are not virtualized: filter very large datasets before supplying options. `PeoplePicker.onSearch(query, signal)` receives an optional `AbortSignal`; forward it to your data client to cancel superseded requests. Expensive custom renderers, validators, and aggregates still need their own work budget.
170
+
171
+ ## Entry points
172
+
173
+ ```ts
174
+ import { Button, Card, Dialog, AudioPlayer } from "@neo-ui-kit/react";
175
+ import { PianoRoll } from "@neo-ui-kit/react/editor";
176
+ import { Router } from "@neo-ui-kit/react/router";
177
+ import { Form, FormFields, useForm } from "@neo-ui-kit/react/forms";
178
+ import { ThemeProvider, useMotion } from "@neo-ui-kit/react/core";
179
+ ```
180
+
181
+ ## RotaryKnob
182
+
183
+ Canvas-rendered volume knob. Drag near the edge to rotate, drag from the center to move linearly, click the outer scale to jump. Wheel and arrow keys change the value, Shift gives a fine step, PageUp/PageDown change by 10, Home/End set 0/100, Escape cancels a drag, double-click resets. `onValueChange` fires while adjusting, `onValueCommit` after the gesture. `readOnly` turns it into a gauge.
184
+
185
+ ## 1.0.1 release notes
186
+
187
+ - Clarifies npm installation and documents GitHub Actions trusted publishing through OIDC.
188
+ - Corrects the documented DataTable `rowActionsWidth` default to 120px.
189
+ - Runtime code is unchanged from 1.0.0.
190
+
191
+ ## 1.0.0 hardening notes
192
+
193
+ Version 1.0.0 is the new NEO UI starting point. Rebuild the local archive after changing source files.
194
+
195
+ - React 18 element refs now reach their public DOM targets. Controlled fields and RotaryKnob keep the supplied value until their owner accepts a change.
196
+ - Nested layers close in order with Escape. Dialog restores focus, discards obsolete async confirmations, and keeps actions available in narrow containers.
197
+ - Fields preserve explicit accessible names and descriptions. Select applies `style` / `className` to its layout wrapper and `id` / `data-*` to its trigger; text fields target their native input. Compound pickers retain their existing outer `id` / `data-*` location.
198
+ - Select and ColorPicker button names include their rendered value or placeholder after the field label, including explicit `aria-label` / `aria-labelledby`. Exact accessible-name queries should include that value; external label references retain priority over `aria-label`.
199
+ - AnimatedBorder follows independent elliptical corner radii, resizes without repeated contour work, resumes after motion preference changes, and does not enlarge scroll geometry. Visible borders follow the shared animation cadence; this improves smoothness at a higher CPU cost than the previous 10fps idle path.
200
+ - Border overlays and moving lights share the exact border box, including fractional sizes, asymmetric borders, scrolling and transforms.
201
+ - DataTable fills its container with pinned columns, keeps sorting/filtering/select-all visible in its narrow card layout, and resets density and details with the rest of the view. The default row-actions width is now 120px (previously 96px); set `rowActionsWidth` explicitly to retain a custom layout.
202
+ - Icon and Loader accept `xs`, `sm`, `md`, `lg` alongside their existing numeric/CSS-length sizes. RotaryKnob fits narrow containers throughout rotation; documentation uses named size presets and NumberField for numeric parameters.
203
+ - Badge text follows the theme foreground for readable status labels in light and dark schemes. StatusIndicator's offline text rule is scoped to that component.
204
+ - `AudioPlayer.onVolumeChange` is additive. Pair it with `volume` when an external audio engine owns playback.
205
+ - Explicit empty Waveform/Sparkline arrays now render empty data. Omit the data prop if you want the demonstration shape.
206
+ - PianoRoll cancellation reports zero offsets before `onNoteDragEnd`. Apply offsets relative to the gesture start to restore a cancelled edit.
207
+ - SplitButton `items` now uses the Menu item contract. Invalid item shapes that slipped through the previous `any[]` type must be corrected.
208
+ - The root entry exports `FormProps` and `FormFieldsProps`. Artwork declarations work without `resolveJsonModule` or `skipLibCheck` in the consuming app.
209
+
210
+ Repository evidence, browser runners, before/after measurements and coverage limits are recorded in `evidence/`. Unit and renderer checks complement actual browser geometry and interaction checks; they do not certify untested physical devices or browser engines.
211
+
212
+ ## Quantum Field experience
213
+
214
+ `QuantumFieldExperience` restores the full Quantum Fields visualizer inside an iframe. A compact, transparent field sits above the kit's `FilePicker`, externally controlled `AudioPlayer`, tooltip-labelled microphone/screenshot/fullscreen actions, field selector, and sensitivity control. The selected song name appears on the file button; playback and seeking use the visualizer's single audio source. Other controls live in a closed-by-default “Тонкая настройка” section below the field. It follows the nearest `ThemeProvider` palette. This experience includes MIT-licensed upstream code and CDN-loaded Three.js modules; the upstream notice is shipped as `UPSTREAM-LICENSE.txt`. It is not mounted in overview-card previews. For a smaller self-authored field without transport controls, use `QuantumField` directly.
@@ -0,0 +1,2 @@
1
+ declare const assets: Record<"back" | "close" | "plus" | "minus" | "check" | "chevron" | "play" | "pause" | "music" | "document" | "wave" | "grid" | "cursor" | "pencil" | "eraser" | "scissors" | "mouse" | "volume" | "search" | "more" | "sliders" | "settings" | "fit" | "save" | "undo" | "redo" | "bulb" | "window" | "folder" | "upload" | "download" | "reset" | "info" | "copy" | "clock" | "warning" | "processing" | "stop" | "up" | "down" | "trash" | "database" | "refresh" | "motion" | "cloud-gpu" | "antenna" | "rocket" | "login" | "braces" | "ok" | "stopwatch" | "levels" | "mic" | "headphones" | "gauge" | "gear" | "palette" | "audio" | "chip" | "key" | "wrench" | "photo" | "eye" | "migrate" | "radio" | "heart" | "history" | "cube" | "file" | "list" | "stethoscope" | "crown" | "person" | "signal" | "leave" | "prev" | "sparkle" | "studio" | "note" | "rhythm" | "timer" | "target" | "user" | "users", import("../core/base").VectorNode>;
2
+ export default assets;
@@ -0,0 +1,2 @@
1
+ declare const assets: Record<"planet" | "mountains" | "city" | "silk" | "horizon" | "landscape" | "brand" | "database" | "host" | "server" | "microphone", import("../core/base").VectorNode>;
2
+ export default assets;
@@ -0,0 +1,104 @@
1
+ import {
2
+ motionEnabled
3
+ } from "./chunk-FCOU3ODR.js";
4
+
5
+ // src/components/navigation/Router/Router.tsx
6
+ import {
7
+ createContext,
8
+ useContext,
9
+ useEffect,
10
+ useMemo,
11
+ useState
12
+ } from "react";
13
+ import { flushSync } from "react-dom";
14
+ import { Fragment, jsx } from "react/jsx-runtime";
15
+ var Context = createContext(null);
16
+ var clean = (v) => {
17
+ const x = `/${v.replace(/^#?\/?/, "").replace(/\/+$/g, "")}`;
18
+ return x === "/" ? x : x.replace(/\/$/, "");
19
+ };
20
+ var current = (m) => clean(m === "hash" ? location.hash.slice(1) || "/" : location.pathname);
21
+ var morph = (update, transition) => transition && motionEnabled() && "startViewTransition" in document ? void document.startViewTransition(() => flushSync(update)) : update();
22
+ function matchPath(pattern, pathname) {
23
+ const p = clean(pattern).split("/").filter(Boolean), v = clean(pathname).split("/").filter(Boolean), params = /* @__PURE__ */ Object.create(null);
24
+ for (let i = 0, j = 0; i < p.length; i++, j++) {
25
+ const token = p[i];
26
+ if (token === "*") {
27
+ try {
28
+ params["*"] = decodeURIComponent(v.slice(j).join("/"));
29
+ } catch {
30
+ return null;
31
+ }
32
+ return params;
33
+ }
34
+ if (j >= v.length) return null;
35
+ if (token.startsWith(":")) {
36
+ try {
37
+ params[token.slice(1)] = decodeURIComponent(v[j]);
38
+ } catch {
39
+ return null;
40
+ }
41
+ } else if (token !== v[j]) return null;
42
+ }
43
+ return p.at(-1) === "*" || p.length === v.length ? params : null;
44
+ }
45
+ function matchRoute(routes, pathname) {
46
+ for (const route of routes) {
47
+ const params = matchPath(route.path, pathname);
48
+ if (params) return { route, pathname: clean(pathname), params };
49
+ }
50
+ return null;
51
+ }
52
+ function Router({
53
+ routes,
54
+ fallback = null,
55
+ context,
56
+ mode = "hash",
57
+ transition = false
58
+ }) {
59
+ const [pathname, setPathname] = useState(() => current(mode));
60
+ useEffect(() => {
61
+ setPathname(current(mode));
62
+ }, [mode]);
63
+ useEffect(() => {
64
+ const event = mode === "hash" ? "hashchange" : "popstate", sync = () => morph(() => setPathname(current(mode)), transition);
65
+ window.addEventListener(event, sync);
66
+ return () => window.removeEventListener(event, sync);
67
+ }, [mode, transition]);
68
+ const match = useMemo(() => matchRoute(routes, pathname), [routes, pathname]);
69
+ const navigate = (to, replace = false) => {
70
+ const path = clean(to);
71
+ if (mode === "hash") {
72
+ const hash = `#${path}`;
73
+ if (replace) {
74
+ history.replaceState(null, "", hash);
75
+ setPathname(path);
76
+ } else location.hash = path;
77
+ } else {
78
+ history[replace ? "replaceState" : "pushState"](null, "", path);
79
+ morph(() => setPathname(current(mode)), transition);
80
+ }
81
+ };
82
+ useEffect(() => {
83
+ if (match?.route.redirectTo) navigate(match.route.redirectTo, true);
84
+ }, [match?.route.redirectTo]);
85
+ if (!match) return /* @__PURE__ */ jsx(Fragment, { children: fallback });
86
+ if (match.route.redirectTo) return null;
87
+ const value = { ...match, navigate }, allowed = match.route.access?.({
88
+ pathname: match.pathname,
89
+ params: match.params,
90
+ context
91
+ }) ?? true, content = allowed ? match.route.element : match.route.denied;
92
+ return /* @__PURE__ */ jsx(Context.Provider, { value, children: typeof content === "function" ? content(match) : content ?? fallback });
93
+ }
94
+ function useRouter() {
95
+ const value = useContext(Context);
96
+ if (!value) throw new Error("useRouter must be used inside <Router>");
97
+ return value;
98
+ }
99
+
100
+ export {
101
+ matchRoute,
102
+ Router,
103
+ useRouter
104
+ };