@broxus/react-uikit 0.23.3 → 0.24.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (319) hide show
  1. package/README.md +328 -1
  2. package/dist/assets/accordion.css +1 -4
  3. package/dist/assets/alert.css +28 -1
  4. package/dist/assets/align.css +5 -5
  5. package/dist/assets/animation.css +1 -1
  6. package/dist/assets/article.css +2 -3
  7. package/dist/assets/background.css +5 -5
  8. package/dist/assets/badge.css +1 -4
  9. package/dist/assets/base.css +2 -12
  10. package/dist/assets/breadcrumb.css +1 -5
  11. package/dist/assets/button.css +12 -37
  12. package/dist/assets/card.css +3 -5
  13. package/dist/assets/checkbox.css +1 -1
  14. package/dist/assets/close.css +1 -3
  15. package/dist/assets/column.css +7 -8
  16. package/dist/assets/comment.css +2 -2
  17. package/dist/assets/container.css +7 -7
  18. package/dist/assets/control.css +1 -16
  19. package/dist/assets/cover.css +1 -1
  20. package/dist/assets/custom-media.css +15 -0
  21. package/dist/assets/datepicker.css +5 -3
  22. package/dist/assets/description-list.css +1 -2
  23. package/dist/assets/divider.css +2 -5
  24. package/dist/assets/dotnav.css +1 -5
  25. package/dist/assets/drawer.css +1 -1
  26. package/dist/assets/drop.css +1 -1
  27. package/dist/assets/dropdown.css +1 -9
  28. package/dist/assets/flex.css +9 -9
  29. package/dist/assets/form.css +3 -11
  30. package/dist/assets/grid.css +7 -8
  31. package/dist/assets/heading.css +3 -6
  32. package/dist/assets/height.css +1 -1
  33. package/dist/assets/icon.css +1 -10
  34. package/dist/assets/iconnav.css +1 -4
  35. package/dist/assets/input-number.css +1 -1
  36. package/dist/assets/input-password.css +1 -1
  37. package/dist/assets/inverse.css +1 -1
  38. package/dist/assets/label.css +1 -3
  39. package/dist/assets/leader.css +1 -1
  40. package/dist/assets/link.css +1 -5
  41. package/dist/assets/list.css +1 -8
  42. package/dist/assets/margin.css +11 -11
  43. package/dist/assets/marker.css +1 -4
  44. package/dist/assets/modal.css +4 -4
  45. package/dist/assets/motion.css +3 -2
  46. package/dist/assets/nav.css +1 -18
  47. package/dist/assets/navbar.css +5 -23
  48. package/dist/assets/overlay.css +1 -1
  49. package/dist/assets/padding.css +3 -3
  50. package/dist/assets/pagination.css +1 -5
  51. package/dist/assets/placeholder.css +1 -1
  52. package/dist/assets/position.css +2 -2
  53. package/dist/assets/print.css +4 -4
  54. package/dist/assets/progress.css +1 -1
  55. package/dist/assets/radio.css +1 -1
  56. package/dist/assets/search.css +1 -10
  57. package/dist/assets/section.css +4 -4
  58. package/dist/assets/segmented.css +1 -1
  59. package/dist/assets/select.css +1 -1
  60. package/dist/assets/slider.css +1 -1
  61. package/dist/assets/spinner.css +1 -1
  62. package/dist/assets/sticky.css +1 -1
  63. package/dist/assets/subnav.css +1 -14
  64. package/dist/assets/svg.css +1 -1
  65. package/dist/assets/switch.css +1 -1
  66. package/dist/assets/table.css +2 -8
  67. package/dist/assets/tabs.css +1 -6
  68. package/dist/assets/text.css +5 -12
  69. package/dist/assets/textarea.css +1 -1
  70. package/dist/assets/thumbnav.css +1 -1
  71. package/dist/assets/tile.css +5 -5
  72. package/dist/assets/tooltip.css +1 -1
  73. package/dist/assets/totop.css +1 -4
  74. package/dist/assets/transition.css +1 -1
  75. package/dist/assets/uikit.min.css +1 -1
  76. package/dist/assets/utility.css +1 -3
  77. package/dist/assets/vars.css +72 -4
  78. package/dist/assets/visibility.css +9 -9
  79. package/dist/assets/width.css +9 -9
  80. package/dist/esm/components/Navbar/Nav.d.ts +1 -1
  81. package/package.json +321 -18
  82. package/styles/_components.scss +85 -0
  83. package/styles/_globals.scss +151 -0
  84. package/styles/_import.components.scss +508 -58
  85. package/styles/_import.scss +608 -83
  86. package/styles/_import.utilities.scss +162 -17
  87. package/styles/_mixins.scss +1865 -0
  88. package/styles/_tokens.scss +85 -0
  89. package/styles/{mixin.scss → _utils.scss} +8 -2
  90. package/styles/{variables.scss → _variables.scss} +40 -26
  91. package/styles/accordion/_accordion.scss +231 -0
  92. package/styles/accordion/_index.scss +11 -0
  93. package/styles/alert/_alert.scss +201 -0
  94. package/styles/alert/_index.scss +11 -0
  95. package/styles/align/_align.scss +153 -0
  96. package/styles/align/_index.scss +11 -0
  97. package/styles/animation/_animation.scss +353 -0
  98. package/styles/animation/_index.scss +11 -0
  99. package/styles/article/_article.scss +112 -0
  100. package/styles/article/_index.scss +11 -0
  101. package/styles/background/_background.scss +170 -0
  102. package/styles/background/_index.scss +11 -0
  103. package/styles/badge/_badge.scss +92 -0
  104. package/styles/badge/_index.scss +11 -0
  105. package/styles/base/_base.scss +661 -0
  106. package/styles/base/_index.scss +11 -0
  107. package/styles/breadcrumb/_breadcrumb.scss +133 -0
  108. package/styles/breadcrumb/_index.scss +11 -0
  109. package/styles/button/_button.scss +707 -0
  110. package/styles/button/_index.scss +11 -0
  111. package/styles/card/_card.scss +544 -0
  112. package/styles/card/_index.scss +11 -0
  113. package/styles/checkbox/_checkbox.scss +329 -0
  114. package/styles/checkbox/_index.scss +11 -0
  115. package/styles/close/_close.scss +69 -0
  116. package/styles/close/_index.scss +11 -0
  117. package/styles/column/_column.scss +159 -0
  118. package/styles/column/_index.scss +11 -0
  119. package/styles/comment/_comment.scss +195 -0
  120. package/styles/comment/_index.scss +11 -0
  121. package/styles/container/_container.scss +240 -0
  122. package/styles/container/_index.scss +11 -0
  123. package/styles/control/_control.scss +364 -0
  124. package/styles/control/_index.scss +11 -0
  125. package/styles/cover/_cover.scss +99 -0
  126. package/styles/cover/_index.scss +8 -0
  127. package/styles/custom-media.scss +17 -0
  128. package/styles/datepicker/_datepicker.scss +841 -0
  129. package/styles/datepicker/_index.scss +11 -0
  130. package/styles/description-list/_description-list.scss +96 -0
  131. package/styles/description-list/_index.scss +11 -0
  132. package/styles/divider/_divider.scss +168 -0
  133. package/styles/divider/_index.scss +11 -0
  134. package/styles/dotnav/_dotnav.scss +171 -0
  135. package/styles/dotnav/_index.scss +11 -0
  136. package/styles/drawer/_drawer.scss +588 -0
  137. package/styles/drawer/_index.scss +11 -0
  138. package/styles/drop/_drop.scss +97 -0
  139. package/styles/drop/_index.scss +11 -0
  140. package/styles/dropdown/_dropdown.scss +218 -0
  141. package/styles/dropdown/_index.scss +11 -0
  142. package/styles/flex/_flex.scss +338 -0
  143. package/styles/flex/_index.scss +8 -0
  144. package/styles/form/_form.scss +665 -0
  145. package/styles/form/_index.scss +11 -0
  146. package/styles/grid/_grid.scss +657 -0
  147. package/styles/grid/_index.scss +11 -0
  148. package/styles/heading/_heading.scss +265 -0
  149. package/styles/heading/_index.scss +11 -0
  150. package/styles/height/_height.scss +77 -0
  151. package/styles/height/_index.scss +11 -0
  152. package/styles/icon/_icon.scss +274 -0
  153. package/styles/icon/_index.scss +11 -0
  154. package/styles/iconnav/_iconnav.scss +149 -0
  155. package/styles/iconnav/_index.scss +11 -0
  156. package/styles/input-number/_index.scss +8 -0
  157. package/styles/input-number/_input-number.scss +115 -0
  158. package/styles/input-password/_index.scss +8 -0
  159. package/styles/input-password/_input-password.scss +52 -0
  160. package/styles/inverse/_index.scss +11 -0
  161. package/styles/inverse/_inverse.scss +68 -0
  162. package/styles/label/_index.scss +11 -0
  163. package/styles/label/_label.scss +132 -0
  164. package/styles/leader/_index.scss +11 -0
  165. package/styles/leader/_leader.scss +80 -0
  166. package/styles/link/_index.scss +11 -0
  167. package/styles/link/_link.scss +158 -0
  168. package/styles/list/_index.scss +11 -0
  169. package/styles/list/_list.scss +288 -0
  170. package/styles/margin/_index.scss +11 -0
  171. package/styles/margin/_margin.scss +312 -0
  172. package/styles/marker/_index.scss +11 -0
  173. package/styles/marker/_marker.scss +73 -0
  174. package/styles/modal/_index.scss +11 -0
  175. package/styles/modal/_modal.scss +374 -0
  176. package/styles/motion/_index.scss +8 -0
  177. package/styles/motion/_motion.scss +640 -0
  178. package/styles/nav/_index.scss +11 -0
  179. package/styles/nav/_nav.scss +583 -0
  180. package/styles/navbar/_index.scss +11 -0
  181. package/styles/navbar/_navbar.scss +694 -0
  182. package/styles/overlay/_index.scss +11 -0
  183. package/styles/overlay/_overlay.scss +115 -0
  184. package/styles/padding/_index.scss +11 -0
  185. package/styles/padding/_padding.scss +93 -0
  186. package/styles/pagination/_index.scss +11 -0
  187. package/styles/pagination/_pagination.scss +149 -0
  188. package/styles/placeholder/_index.scss +11 -0
  189. package/styles/placeholder/_placeholder.scss +60 -0
  190. package/styles/position/_index.scss +11 -0
  191. package/styles/position/_position.scss +257 -0
  192. package/styles/print.scss +8 -5
  193. package/styles/progress/_index.scss +11 -0
  194. package/styles/progress/_progress.scss +131 -0
  195. package/styles/radio/_index.scss +11 -0
  196. package/styles/radio/_radio.scss +272 -0
  197. package/styles/search/_index.scss +11 -0
  198. package/styles/search/_search.scss +353 -0
  199. package/styles/section/_index.scss +11 -0
  200. package/styles/section/_section.scss +293 -0
  201. package/styles/segmented/_index.scss +11 -0
  202. package/styles/segmented/_segmented.scss +275 -0
  203. package/styles/select/_index.scss +11 -0
  204. package/styles/select/_select.scss +641 -0
  205. package/styles/slider/_index.scss +11 -0
  206. package/styles/slider/_slider.scss +525 -0
  207. package/styles/spinner/_index.scss +11 -0
  208. package/styles/spinner/_spinner.scss +90 -0
  209. package/styles/sticky/_index.scss +11 -0
  210. package/styles/sticky/_sticky.scss +66 -0
  211. package/styles/subnav/_index.scss +11 -0
  212. package/styles/subnav/_subnav.scss +267 -0
  213. package/styles/svg/_index.scss +8 -0
  214. package/styles/svg/_svg.scss +64 -0
  215. package/styles/switch/_index.scss +11 -0
  216. package/styles/switch/_switch.scss +226 -0
  217. package/styles/table/_index.scss +11 -0
  218. package/styles/table/_table.scss +337 -0
  219. package/styles/tabs/_index.scss +11 -0
  220. package/styles/tabs/_tabs.scss +809 -0
  221. package/styles/text/_index.scss +11 -0
  222. package/styles/text/_text.scss +432 -0
  223. package/styles/textarea/_index.scss +11 -0
  224. package/styles/textarea/_textarea.scss +98 -0
  225. package/styles/thumbnav/_index.scss +11 -0
  226. package/styles/thumbnav/_thumbnav.scss +130 -0
  227. package/styles/tile/_index.scss +11 -0
  228. package/styles/tile/_tile.scss +313 -0
  229. package/styles/tooltip/_index.scss +11 -0
  230. package/styles/tooltip/_tooltip.scss +101 -0
  231. package/styles/totop/_index.scss +11 -0
  232. package/styles/totop/_totop.scss +80 -0
  233. package/styles/transition/_index.scss +11 -0
  234. package/styles/transition/_transition.scss +197 -0
  235. package/styles/utility/_index.scss +11 -0
  236. package/styles/utility/_utility.scss +642 -0
  237. package/styles/vars.scss +474 -139
  238. package/styles/visibility/_index.scss +8 -0
  239. package/styles/visibility/_visibility.scss +196 -0
  240. package/styles/width/_index.scss +11 -0
  241. package/styles/width/_width.scss +698 -0
  242. package/dist/assets/mixin.css +0 -1
  243. package/dist/assets/mixins.css +0 -1
  244. package/dist/assets/variables.css +0 -1
  245. package/styles/accordion.scss +0 -224
  246. package/styles/alert.scss +0 -197
  247. package/styles/align.scss +0 -149
  248. package/styles/animation.scss +0 -349
  249. package/styles/article.scss +0 -105
  250. package/styles/background.scss +0 -167
  251. package/styles/badge.scss +0 -85
  252. package/styles/base.scss +0 -656
  253. package/styles/breadcrumb.scss +0 -126
  254. package/styles/button.scss +0 -700
  255. package/styles/card.scss +0 -534
  256. package/styles/checkbox.scss +0 -325
  257. package/styles/close.scss +0 -62
  258. package/styles/column.scss +0 -152
  259. package/styles/comment.scss +0 -191
  260. package/styles/container.scss +0 -236
  261. package/styles/control.scss +0 -357
  262. package/styles/cover.scss +0 -81
  263. package/styles/datepicker.scss +0 -834
  264. package/styles/description-list.scss +0 -89
  265. package/styles/divider.scss +0 -161
  266. package/styles/dotnav.scss +0 -164
  267. package/styles/drawer.scss +0 -584
  268. package/styles/drop.scss +0 -93
  269. package/styles/dropdown.scss +0 -207
  270. package/styles/flex.scss +0 -326
  271. package/styles/form.scss +0 -658
  272. package/styles/grid.scss +0 -650
  273. package/styles/heading.scss +0 -258
  274. package/styles/height.scss +0 -73
  275. package/styles/icon.scss +0 -267
  276. package/styles/iconnav.scss +0 -142
  277. package/styles/input-number.scss +0 -98
  278. package/styles/input-password.scss +0 -35
  279. package/styles/inverse.scss +0 -65
  280. package/styles/label.scss +0 -125
  281. package/styles/leader.scss +0 -76
  282. package/styles/link.scss +0 -151
  283. package/styles/list.scss +0 -281
  284. package/styles/margin.scss +0 -308
  285. package/styles/marker.scss +0 -66
  286. package/styles/mixins.scss +0 -2555
  287. package/styles/modal.scss +0 -370
  288. package/styles/motion.scss +0 -627
  289. package/styles/nav.scss +0 -576
  290. package/styles/navbar.scss +0 -682
  291. package/styles/overlay.scss +0 -107
  292. package/styles/padding.scss +0 -89
  293. package/styles/pagination.scss +0 -142
  294. package/styles/placeholder.scss +0 -56
  295. package/styles/position.scss +0 -253
  296. package/styles/progress.scss +0 -127
  297. package/styles/radio.scss +0 -268
  298. package/styles/search.scss +0 -346
  299. package/styles/section.scss +0 -285
  300. package/styles/segmented.scss +0 -271
  301. package/styles/select.scss +0 -644
  302. package/styles/slider.scss +0 -521
  303. package/styles/spinner.scss +0 -86
  304. package/styles/sticky.scss +0 -62
  305. package/styles/subnav.scss +0 -260
  306. package/styles/svg.scss +0 -46
  307. package/styles/switch.scss +0 -218
  308. package/styles/table.scss +0 -330
  309. package/styles/tabs.scss +0 -802
  310. package/styles/text.scss +0 -425
  311. package/styles/textarea.scss +0 -94
  312. package/styles/thumbnav.scss +0 -126
  313. package/styles/tile.scss +0 -309
  314. package/styles/tooltip.scss +0 -94
  315. package/styles/totop.scss +0 -73
  316. package/styles/transition.scss +0 -193
  317. package/styles/utility.scss +0 -635
  318. package/styles/visibility.scss +0 -184
  319. package/styles/width.scss +0 -694
package/README.md CHANGED
@@ -1,3 +1,330 @@
1
1
  # Broxus / UIkit
2
2
 
3
- Collection of the React-based components and CSS utilities that helps build user interfaces of the web applications.
3
+ A React component library built on top of **[React component](https://github.com/react-component)** primitives and
4
+ adapted to the **[UIkit](https://getuikit.com/)** CSS framework. Provides a collection of lightweight, composable
5
+ components and CSS utilities for building web application interfaces.
6
+
7
+ Components are designed as building blocks — simple and minimal by default, with the expectation that projects
8
+ apply their own styling and theming via the SCSS customization system.
9
+
10
+ ## Table of Contents
11
+
12
+ - [Installation](#installation)
13
+ - [Components](#components)
14
+ - [Layout](#layout)
15
+ - [Navigation](#navigation)
16
+ - [Forms & Controls](#forms--controls)
17
+ - [Data Display](#data-display)
18
+ - [Typography](#typography)
19
+ - [Feedback](#feedback)
20
+ - [Interactive Containers](#interactive-containers)
21
+ - [Actions](#actions)
22
+ - [System](#system)
23
+ - [Customization](#customization)
24
+ - [Pre-built CSS](#pre-built-css)
25
+ - [SCSS Entry Points](#scss-entry-points)
26
+ - [Selective Import](#selective-import)
27
+ - [Overriding SCSS Variables](#overriding-scss-variables)
28
+ - [Overriding CSS Custom Properties](#overriding-css-custom-properties)
29
+ - [Hook Mixins](#hook-mixins)
30
+ - [Color Mode](#color-mode)
31
+ - [Key Conventions](#key-conventions)
32
+
33
+ ## Installation
34
+
35
+ Install the package as project dependency
36
+
37
+ ```shell
38
+ npm install @broxus/react-uikit
39
+ ```
40
+
41
+ ```shell
42
+ yarn add @broxus/react-uikit
43
+ ```
44
+
45
+ ```shell
46
+ pnpm add @broxus/react-uikit
47
+ ```
48
+
49
+ ```shell
50
+ bun add @broxus/react-uikit
51
+ ```
52
+
53
+ ## Components
54
+
55
+ ### Layout
56
+
57
+ Page structure, spacing, and responsive grid primitives.
58
+
59
+ | Component | Description |
60
+ |---|---|
61
+ | `Section` | Full-width page section with background variants (`default`, `muted`, `primary`, `secondary`, `tertiary`) and size options |
62
+ | `Container` | Max-width content wrapper with horizontal padding |
63
+ | `Grid` | CSS grid with configurable gaps, dividers, responsive child widths, and equal-height matching |
64
+ | `Flex` / `Flex.Item` | Flexbox container and items with responsive alignment, direction, wrap, and ordering |
65
+ | `Width` | Fixed, fractional (`1-2`, `1-3`, etc.), or responsive width control |
66
+ | `Tile` | Content tile with background variants, similar to Section but for individual blocks |
67
+ | `Cover` | Fills container with an image or video while maintaining aspect ratio |
68
+ | `Align` / `Align.Left` / `Align.Center` / `Align.Right` | Horizontal content alignment with RTL support |
69
+ | `Divider` | Horizontal or vertical separator line |
70
+
71
+ ### Navigation
72
+
73
+ Menus, tabs, breadcrumbs, and other navigation patterns.
74
+
75
+ | Component | Description |
76
+ |---|---|
77
+ | `Navbar` | Top navigation bar with `.Container`, `.Left`, `.Center`, `.Right`, `.Nav`, `.Item`, `.Toggle` |
78
+ | `Nav` | Vertical, horizontal, or inline menu with submenus, groups, headers, and dividers |
79
+ | `Subnav` | Secondary navigation with `divider` and `pill` variants |
80
+ | `Breadcrumb` | Hierarchical breadcrumb trail |
81
+ | `Tabs` | Tabbed interface (`line`, `card`, `editable-card`) with configurable position and size |
82
+ | `Segmented` | Segmented control for switching between 2 or more options |
83
+ | `Dotnav` | Dot indicator navigation (e.g. for sliders) |
84
+ | `Iconnav` | Icon-based navigation |
85
+
86
+ ### Forms & Controls
87
+
88
+ Input elements, selectors, and form layout.
89
+
90
+ | Component | Description |
91
+ |---|---|
92
+ | `Form` | Form container with `.Label`, `.Fieldset`, `.Legend`, `.Controls` — supports `stacked` and `horizontal` layouts |
93
+ | `Input` | Text input with prefix, suffix, clear button, and validation states |
94
+ | `Input.Number` | Numeric input with increment/decrement |
95
+ | `Input.Password` | Password input with visibility toggle |
96
+ | `TextArea` | Multiline text input with character count |
97
+ | `Select` | Dropdown select with single, multiple, and tags modes, search, and loading state |
98
+ | `Checkbox` / `Checkbox.Group` | Checkbox with indeterminate state and group support |
99
+ | `Radio` / `Radio.Group` | Radio button with group support |
100
+ | `Switch` | Toggle switch with loading state and custom labels |
101
+ | `Slider` | Range slider for numeric value selection |
102
+ | `DatePicker` | Date selection with calendar popup and range support |
103
+
104
+ ### Data Display
105
+
106
+ Components for presenting structured content.
107
+
108
+ | Component | Description |
109
+ |---|---|
110
+ | `Card` | Content card with `.Header`, `.Body`, `.Footer`, `.Title`, `.Badge`, `.Media` — supports style variants and hover effects |
111
+ | `Badge` | Small label or count indicator |
112
+ | `Label` | Status label with `success`, `warning`, `danger` variants |
113
+ | `List` / `List.Item` | Styled list with marker types (`bullet`, `disc`, `divider`, `striped`, etc.) and color options |
114
+ | `DescriptionList` | Term–description pairs (`<dl>`) with `.Term` and `.Description` |
115
+ | `Progress` | Progress bar |
116
+ | `Article` | Article content wrapper with `.Title` and `.Meta` |
117
+
118
+ ### Typography
119
+
120
+ Text styling and heading components.
121
+
122
+ | Component | Description |
123
+ |---|---|
124
+ | `Text` | Styled text with color, size, weight, transform, alignment, and wrapping control |
125
+ | `Heading` | Section heading with size scale and decorations (`bullet`, `divider`, `line`) |
126
+ | `Link` | Styled link with variants (`heading`, `muted`, `reset`, `text`, `toggle`) |
127
+
128
+ ### Feedback
129
+
130
+ Notifications, dialogs, and loading indicators.
131
+
132
+ | Component | Description |
133
+ |---|---|
134
+ | `Alert` | Notification message with severity levels (`primary`, `success`, `warning`, `danger`) and close animation |
135
+ | `Modal` | Dialog window with centered, full-screen, and custom container options |
136
+ | `Drawer` | Side panel with `push`, `reveal`, and `slide` animations |
137
+ | `Spinner` | SVG loading spinner with configurable size |
138
+ | `Overlay` | Content overlay with positioning options |
139
+
140
+ ### Interactive Containers
141
+
142
+ Expandable, collapsible, and popup containers.
143
+
144
+ | Component | Description |
145
+ |---|---|
146
+ | `Accordion` / `Accordion.Item` | Collapsible content panels |
147
+ | `Drop` | Popup overlay attached to a trigger element, with placement and arrow options |
148
+ | `Dropdown` | Dropdown menu (wraps Drop) |
149
+
150
+ ### Actions
151
+
152
+ Buttons and action triggers.
153
+
154
+ | Component | Description |
155
+ |---|---|
156
+ | `Button` / `Button.Group` | Action button with variants (`primary`, `secondary`, `tertiary`, `danger`, `link`, `text`), sizes, and shapes (`circle`, `round`) |
157
+ | `Close` | Close button (X icon) |
158
+
159
+ ### System
160
+
161
+ Configuration providers and base utilities.
162
+
163
+ | Component | Description |
164
+ |---|---|
165
+ | `ConfigProvider` | Global configuration for component defaults: icons, locale, breakpoints, direction, popup containers |
166
+ | `Inverse` | Color mode provider for light/dark theme switching with persistence |
167
+ | `Icon` | Icon from the built-in icon set |
168
+
169
+ ## Customization
170
+
171
+ The library provides two ways to consume styles:
172
+
173
+ - **Pre-built CSS** — ready-to-use stylesheets available at `@broxus/react-uikit/assets/*.css`, no SCSS toolchain needed (see [Pre-built CSS](#pre-built-css))
174
+ - **SCSS source** — full customization via variables, tokens, and hook mixins
175
+
176
+ The SCSS styling system has two layers:
177
+
178
+ - **SCSS variables** (compile-time) — used for computations (`color.scale()`, `rgba()`, math) and resolved to literal values at build
179
+ - **CSS custom properties** (runtime) — the actual design tokens consumed by components via `var(--...)`
180
+
181
+ ### Pre-built CSS
182
+
183
+ Pre-compiled CSS assets available without an SCSS toolchain:
184
+
185
+ | Asset | Purpose |
186
+ |---|---|
187
+ | `@broxus/react-uikit/assets/uikit.min.css` | Fully compiled CSS with [default component set](#selective-import) |
188
+ | `@broxus/react-uikit/assets/vars.css` | Global (`--global-*`) and base (`--base-*`) CSS custom properties. Component-specific tokens are included in their respective modules |
189
+ | `@broxus/react-uikit/assets/custom-media.css` | PostCSS custom media queries for breakpoints |
190
+
191
+ Components can also be imported individually:
192
+
193
+ ```css
194
+ @import '@broxus/react-uikit/assets/button.css';
195
+ @import '@broxus/react-uikit/assets/card.css';
196
+ @import '@broxus/react-uikit/assets/modal.css';
197
+ ```
198
+
199
+ Module names correspond to component names in the [component map](#selective-import).
200
+
201
+ > [!WARNING] Important
202
+ >
203
+ > Component styles use [custom media queries](https://drafts.csswg.org/mediaqueries-5/#custom-mq) for responsive breakpoints (`@media (--media-breakpoint-small)`, etc.). These are not natively supported by browsers and require [PostCSS](https://postcss.org/) with [postcss-custom-media](https://github.com/csstools/postcss-plugins/tree/main/plugins/postcss-custom-media) plugin to be processed. Import `@broxus/react-uikit/assets/custom-media.css` to provide the breakpoint definitions.
204
+
205
+ ### SCSS Entry Points
206
+
207
+ | Entry point | Purpose |
208
+ |---|---|
209
+ | `@broxus/react-uikit/styles/import` | Main entry — outputs component styles with conditional token generation |
210
+ | `@broxus/react-uikit/styles/vars` | Outputs only `:root` CSS custom properties (tokens), no component styles |
211
+ | `@broxus/react-uikit/styles/tokens` | Re-exports token mixins (`button-tokens`, `card-tokens`, etc.) for selective inclusion |
212
+ | `@broxus/react-uikit/styles/variables` | SCSS variable defaults — override via `@forward ... with (...)` |
213
+ | `@broxus/react-uikit/styles/components` | Re-exports component style mixins and inverse style mixins |
214
+
215
+ ### Selective Import
216
+
217
+ Include only the components you need to reduce CSS output:
218
+
219
+ ```scss
220
+ @use '@broxus/react-uikit/styles/import' with (
221
+ $components: (button: true, card: true, control: true, modal: true),
222
+ );
223
+ ```
224
+
225
+ Or include everything:
226
+
227
+ ```scss
228
+ @use '@broxus/react-uikit/styles/import' with (
229
+ $components: (all: true),
230
+ );
231
+ ```
232
+
233
+ Component map:
234
+
235
+ | Group | Enabled by default | Disabled by default |
236
+ |---|---|---|
237
+ | Base | `base` | — |
238
+ | Elements | `link`, `heading`, `divider`, `list`, `icon`, `form`, `control`, `input-password`, `input-number`, `checkbox`, `radio`, `datepicker`, `button`, `slider`, `switch`, `select`, `textarea` | `description-list`, `progress` |
239
+ | Layout | `section`, `container`, `grid`, `tile`, `card` | — |
240
+ | Common | `close`, `spinner`, `alert`, `badge`, `label`, `tooltip` | `totop`, `marker`, `overlay`, `article`, `search`, `placeholder` |
241
+ | Interaction | `accordion`, `drop`, `dropdown`, `modal`, `drawer` | `sticky`, `leader` |
242
+ | Navigation | `nav`, `navbar`, `subnav`, `segmented`, `breadcrumb`, `tabs` | `dotnav`, `thumbnav`, `iconnav` |
243
+ | Utilities | `animation`, `motion`, `width`, `height`, `text`, `align`, `svg`, `utility`, `flex`, `margin`, `padding`, `position`, `transition`, `visibility` | `column`, `cover`, `background`, `inverse` |
244
+
245
+ ### Overriding SCSS Variables
246
+
247
+ Override library defaults by forwarding with new values:
248
+
249
+ ```scss
250
+ @forward '@broxus/react-uikit/styles/variables' with (
251
+ $global-font-family: 'Inter', sans-serif !default,
252
+ $global-primary-color: #ad6d60 !default,
253
+ $global-background: #0d0d0d !default,
254
+ $global-border-radius: 8px !default,
255
+ $button-primary-hover-background: color.scale(#ad6d60, $lightness: -8%) !default,
256
+ );
257
+ ```
258
+
259
+ ### Overriding CSS Custom Properties
260
+
261
+ Token mixins accept `@content` blocks to override specific CSS custom properties:
262
+
263
+ ```scss
264
+ @use '@broxus/react-uikit/styles/tokens';
265
+
266
+ :root {
267
+ @include tokens.global-tokens {
268
+ --global-primary-color: #ad6d60;
269
+ --global-background: #0d0d0d;
270
+ }
271
+ @include tokens.button-tokens {
272
+ --button-round-border-radius: var(--global-small-border-radius);
273
+ --button-disabled-background: rgba(173, 109, 96, 6%);
274
+ }
275
+ // Components without overrides — just include with defaults:
276
+ @include tokens.card-tokens;
277
+ @include tokens.alert-tokens;
278
+ }
279
+ ```
280
+
281
+ ### Hook Mixins
282
+
283
+ Inject custom CSS into component render points. Define mixins and register them via the `$mixins` map:
284
+
285
+ ```scss
286
+ // _mixins.scss
287
+ @mixin hook-button() {
288
+ font-weight: 500;
289
+ transition: background-color 200ms ease-in-out, color 200ms ease-in-out;
290
+ }
291
+
292
+ // index.scss
293
+ @use 'sass:meta';
294
+ @use 'mixins';
295
+
296
+ @use '@broxus/react-uikit/styles/import' as * with (
297
+ $components: (all: true),
298
+ $mixins: (
299
+ 'hook-button': meta.get-mixin('hook-button', 'mixins'),
300
+ ),
301
+ );
302
+ ```
303
+
304
+ Hook naming convention: `hook-{component}`, `hook-{component}-{modifier}`, `hook-{component}-{state}`,
305
+ `hook-{component}-misc`, `hook-inverse-{component}`.
306
+
307
+ ### Color Mode
308
+
309
+ The `$*-color-mode` variables control text color direction, not the theme itself:
310
+
311
+ - `light` — light text on dark background
312
+ - `dark` — dark text on light background
313
+
314
+ ```scss
315
+ @forward '@broxus/react-uikit/styles/variables' with (
316
+ $section-default-color-mode: light, // dark background, light text
317
+ $section-primary-color-mode: dark, // primary background, dark text
318
+ $card-primary-color-mode: dark,
319
+ $navbar-color-mode: light,
320
+ );
321
+ ```
322
+
323
+ ## Key Conventions
324
+
325
+ - **Compound components** — complex components use dot-notation: `Card.Header`, `Flex.Item`, `Nav.Sub`, etc.
326
+ - **Responsive breakpoints** — layout and typography components support `s`, `m`, `l`, `xl` breakpoint configs
327
+ - **Standard sizes** — `xsmall | small | medium | large | xlarge`
328
+ - **Form states** — `success | warning | danger | blank`
329
+ - **RTL support** — all components support `direction` prop or global config via `ConfigProvider`
330
+ - **Selective import** — SCSS entry points accept a `$components` map to include only needed component styles
@@ -129,7 +129,4 @@
129
129
  --accordion-icon-margin-right: var(--global-small-margin);
130
130
  --accordion-icon-color: var(--global-color);
131
131
  --accordion-icon-size: 1.4rem;
132
- --inverse-accordion-title-color: var(--inverse-global-emphasis-color);
133
- --inverse-accordion-title-hover-color: var(--inverse-global-color);
134
- --inverse-accordion-item-disabled-color: var(--inverse-global-emphasis-color);
135
- }
132
+ }
@@ -9,6 +9,10 @@
9
9
  padding-right: var(--alert-padding-right);
10
10
  position: relative;
11
11
  }
12
+ .uk-alert a:not([class]) {
13
+ color: inherit;
14
+ text-decoration: underline;
15
+ }
12
16
 
13
17
  /* Add margin if adjacent element */
14
18
  * + .uk-alert {
@@ -101,7 +105,30 @@
101
105
  padding-top: 0;
102
106
  }
103
107
 
108
+ /*
109
+ * Content
110
+ */
111
+ .uk-alert h1,
112
+ .uk-alert h2,
113
+ .uk-alert h3,
114
+ .uk-alert h4,
115
+ .uk-alert h5,
116
+ .uk-alert h6 {
117
+ color: inherit;
118
+ }
119
+
120
+ .uk-alert a:not([class]) {
121
+ color: inherit;
122
+ text-decoration: underline;
123
+ }
124
+
125
+ .uk-alert a:not([class]):hover {
126
+ color: inherit;
127
+ text-decoration: underline;
128
+ }
129
+
104
130
  :root {
131
+ --alert-border-radius: var(--global-border-radius);
105
132
  --alert-margin-vertical: var(--global-margin);
106
133
  --alert-padding: var(--global-small-gutter);
107
134
  --alert-padding-right: calc(var(--alert-padding) + 15px);
@@ -117,4 +144,4 @@
117
144
  --alert-warning-color: var(--global-warning-color);
118
145
  --alert-danger-background: rgb(250.2, 178.68, 168.6);
119
146
  --alert-danger-color: var(--global-danger-color);
120
- }
147
+ }
@@ -37,7 +37,7 @@
37
37
  }
38
38
 
39
39
  /* Phone landscape and bigger */
40
- @media (min-width: 640px) {
40
+ @media (--media-breakpoint-small) {
41
41
  .uk-align-left\@s {
42
42
  float: left;
43
43
  margin-right: var(--align-margin-horizontal);
@@ -50,7 +50,7 @@
50
50
  }
51
51
  }
52
52
  /* Tablet landscape and bigger */
53
- @media (min-width: 960px) {
53
+ @media (--media-breakpoint-medium) {
54
54
  .uk-align-left\@m {
55
55
  float: left;
56
56
  margin-right: var(--align-margin-horizontal);
@@ -63,7 +63,7 @@
63
63
  }
64
64
  }
65
65
  /* Desktop and bigger */
66
- @media (min-width: 1200px) {
66
+ @media (--media-breakpoint-large) {
67
67
  .uk-align-left\@l {
68
68
  float: left;
69
69
  margin-top: 0;
@@ -86,7 +86,7 @@
86
86
  }
87
87
  }
88
88
  /* Large screen and bigger */
89
- @media (min-width: 1600px) {
89
+ @media (--media-breakpoint-xlarge) {
90
90
  .uk-align-left\@xl {
91
91
  float: left;
92
92
  margin-right: var(--align-margin-horizontal-l);
@@ -102,4 +102,4 @@
102
102
  --align-margin-horizontal: var(--global-gutter);
103
103
  --align-margin-horizontal-l: var(--global-medium-gutter);
104
104
  --align-margin-vertical: var(--global-gutter);
105
- }
105
+ }
@@ -384,4 +384,4 @@
384
384
  --ease-out-quint: cubic-bezier(0.23, 1, 0.32, 1);
385
385
  --ease-in-quint: cubic-bezier(0.755, 0.05, 0.855, 0.06);
386
386
  --ease-in-out-quint: cubic-bezier(0.86, 0, 0.07, 1);
387
- }
387
+ }
@@ -26,7 +26,7 @@
26
26
  }
27
27
 
28
28
  /* Tablet landscape and bigger */
29
- @media (min-width: 960px) {
29
+ @media (--media-breakpoint-medium) {
30
30
  .uk-article-title {
31
31
  font-size: var(--article-title-font-size-m);
32
32
  }
@@ -47,5 +47,4 @@
47
47
  --article-meta-font-size: var(--global-small-font-size);
48
48
  --article-meta-line-height: 1.4;
49
49
  --article-meta-color: var(--global-muted-color);
50
- --inverse-article-meta-color: var(--inverse-global-muted-color);
51
- }
50
+ }
@@ -115,25 +115,25 @@
115
115
  /* Image
116
116
  ========================================================================== */
117
117
  /* Phone portrait and smaller */
118
- @media (max-width: 639px) {
118
+ @media (--media-breakpoint-xsmall-max) {
119
119
  .uk-background-image\@s {
120
120
  background-image: none !important;
121
121
  }
122
122
  }
123
123
  /* Phone landscape and smaller */
124
- @media (max-width: 959px) {
124
+ @media (--media-breakpoint-small-max) {
125
125
  .uk-background-image\@m {
126
126
  background-image: none !important;
127
127
  }
128
128
  }
129
129
  /* Tablet landscape and smaller */
130
- @media (max-width: 1199px) {
130
+ @media (--media-breakpoint-medium-max) {
131
131
  .uk-background-image\@l {
132
132
  background-image: none !important;
133
133
  }
134
134
  }
135
135
  /* Desktop and smaller */
136
- @media (max-width: 1599px) {
136
+ @media (--media-breakpoint-large-max) {
137
137
  .uk-background-image\@xl {
138
138
  background-image: none !important;
139
139
  }
@@ -206,4 +206,4 @@
206
206
  --primary-background: var(--global-primary-background);
207
207
  --secondary-background: var(--global-secondary-background);
208
208
  --tertiary-background: var(--global-tertiary-background);
209
- }
209
+ }
@@ -40,7 +40,4 @@
40
40
  --badge-color: var(--global-inverse-color);
41
41
  --badge-font-size: var(--global-small-font-size);
42
42
  --badge-hover-color: var(--global-inverse-color);
43
- --inverse-badge-background: var(--inverse-global-primary-background);
44
- --inverse-badge-color: var(--inverse-global-inverse-color);
45
- --inverse-badge-hover-color: var(--inverse-global-inverse-color);
46
- }
43
+ }
@@ -294,7 +294,7 @@ h6, .uk-h6 {
294
294
  }
295
295
 
296
296
  /* Tablet landscape and bigger */
297
- @media (min-width: 960px) {
297
+ @media (--media-breakpoint-medium) {
298
298
  h1, .uk-h1 {
299
299
  font-size: var(--base-h1-font-size-m);
300
300
  }
@@ -558,14 +558,4 @@ template {
558
558
  --uk-breakpoint-m: var(--breakpoint-medium);
559
559
  --uk-breakpoint-l: var(--breakpoint-large);
560
560
  --uk-breakpoint-xl: var(--breakpoint-xlarge);
561
- --inverse-base-color: var(--inverse-global-color);
562
- --inverse-base-link-color: var(--inverse-global-emphasis-color);
563
- --inverse-base-link-hover-color: var(--inverse-global-emphasis-color);
564
- --inverse-base-code-color: var(--inverse-global-color);
565
- --inverse-base-em-color: var(--inverse-global-emphasis-color);
566
- --inverse-base-heading-color: var(--inverse-global-emphasis-color);
567
- --inverse-base-hr-border: var(--inverse-global-color);
568
- --inverse-base-focus-outline: var(--inverse-global-emphasis-color);
569
- --inverse-base-blockquote-color: var(--inverse-global-emphasis-color);
570
- --inverse-base-blockquote-footer-color: var(--inverse-global-color);
571
- }
561
+ }
@@ -62,8 +62,4 @@
62
62
  --breadcrumb-divider-margin-horizontal: 20px;
63
63
  --breadcrumb-divider-font-size: var(--breadcrumb-item-font-size);
64
64
  --breadcrumb-divider-color: var(--global-muted-color);
65
- --inverse-breadcrumb-item-color: var(--inverse-global-muted-color);
66
- --inverse-breadcrumb-item-hover-color: var(--inverse-global-color);
67
- --inverse-breadcrumb-item-active-color: var(--inverse-global-color);
68
- --inverse-breadcrumb-divider-color: var(--inverse-global-muted-color);
69
- }
65
+ }
@@ -368,6 +368,17 @@
368
368
  vertical-align: middle; /* 2 */
369
369
  }
370
370
 
371
+ .uk-button-group .uk-button-circle:not(:last-child),
372
+ .uk-button-group .uk-button-round:not(:last-child) {
373
+ border-bottom-right-radius: 0;
374
+ border-top-right-radius: 0;
375
+ }
376
+ .uk-button-group .uk-button-circle:not(:first-child),
377
+ .uk-button-group .uk-button-round:not(:first-child) {
378
+ border-bottom-left-radius: 0;
379
+ border-top-left-radius: 0;
380
+ }
381
+
371
382
  :root {
372
383
  --button-line-height: var(--global-control-height);
373
384
  --button-xsmall-line-height: var(--global-control-xsmall-height);
@@ -452,40 +463,4 @@
452
463
  --button-link-hover-color: var(--global-link-hover-color);
453
464
  --button-link-hover-text-decoration: underline;
454
465
  --button-link-disabled-color: var(--global-muted-color);
455
- --inverse-button-color: var(--inverse-global-inverse-color);
456
- --inverse-button-default-background: var(--inverse-global-primary-background);
457
- --inverse-button-default-color: var(--inverse-global-inverse-color);
458
- --inverse-button-default-hover-background: rgb(242.25, 242.25, 242.25);
459
- --inverse-button-default-hover-color: var(--inverse-global-inverse-color);
460
- --inverse-button-default-active-background: rgb(229.5, 229.5, 229.5);
461
- --inverse-button-default-active-color: var(--inverse-global-inverse-color);
462
- --inverse-button-primary-background: var(--inverse-global-primary-background);
463
- --inverse-button-primary-color: var(--inverse-global-inverse-color);
464
- --inverse-button-primary-hover-background: rgb(242.25, 242.25, 242.25);
465
- --inverse-button-primary-hover-color: var(--inverse-global-inverse-color);
466
- --inverse-button-primary-active-background: rgb(229.5, 229.5, 229.5);
467
- --inverse-button-primary-active-color: var(--inverse-global-inverse-color);
468
- --inverse-button-secondary-background: var(--inverse-global-primary-background);
469
- --inverse-button-secondary-color: var(--inverse-global-inverse-color);
470
- --inverse-button-secondary-hover-background: rgb(242.25, 242.25, 242.25);
471
- --inverse-button-secondary-hover-color: var(--inverse-global-inverse-color);
472
- --inverse-button-secondary-active-background: rgb(229.5, 229.5, 229.5);
473
- --inverse-button-secondary-active-color: var(--inverse-global-inverse-color);
474
- --inverse-button-tertiary-background: var(--inverse-global-primary-background);
475
- --inverse-button-tertiary-color: var(--inverse-global-inverse-color);
476
- --inverse-button-tertiary-hover-background: rgb(242.25, 242.25, 242.25);
477
- --inverse-button-tertiary-hover-color: var(--inverse-global-inverse-color);
478
- --inverse-button-tertiary-active-background: rgb(229.5, 229.5, 229.5);
479
- --inverse-button-tertiary-active-color: var(--inverse-global-inverse-color);
480
- --inverse-button-danger-background: var(--button-danger-background);
481
- --inverse-button-danger-color: var(--button-danger-color);
482
- --inverse-button-danger-hover-background: var(--button-danger-hover-background);
483
- --inverse-button-danger-hover-color: var(--button-danger-hover-color);
484
- --inverse-button-danger-active-background: var(--button-danger-active-background);
485
- --inverse-button-danger-active-color: var(--button-danger-active-color);
486
- --inverse-button-text-color: var(--inverse-global-emphasis-color);
487
- --inverse-button-text-hover-color: var(--inverse-global-muted-color);
488
- --inverse-button-text-disabled-color: var(--inverse-global-muted-color);
489
- --inverse-button-link-color: var(--inverse-global-emphasis-color);
490
- --inverse-button-link-hover-color: var(--inverse-global-muted-color);
491
- }
466
+ }
@@ -24,7 +24,7 @@
24
24
  }
25
25
 
26
26
  /* Desktop and bigger */
27
- @media (min-width: 1200px) {
27
+ @media (--media-breakpoint-large) {
28
28
  .uk-card-body {
29
29
  padding: var(--card-body-padding-vertical-l) var(--card-body-padding-horizontal-l);
30
30
  }
@@ -187,7 +187,7 @@
187
187
  * Large
188
188
  */
189
189
  /* Desktop and bigger */
190
- @media (min-width: 1200px) {
190
+ @media (--media-breakpoint-large) {
191
191
  .uk-card-large.uk-card-body,
192
192
  .uk-card-large .uk-card-body {
193
193
  padding: var(--card-large-body-padding-vertical-l) var(--card-large-body-padding-horizontal-l);
@@ -250,6 +250,4 @@
250
250
  --card-large-header-padding-vertical-l: 35px;
251
251
  --card-large-footer-padding-horizontal-l: var(--global-large-gutter);
252
252
  --card-large-footer-padding-vertical-l: 35px;
253
- --inverse-card-badge-background: var(--inverse-global-primary-background);
254
- --inverse-card-badge-color: var(--inverse-global-inverse-color);
255
- }
253
+ }
@@ -237,4 +237,4 @@
237
237
  --checkbox-checked-control-background: rgba(30, 135, 240, 0.15);
238
238
  --checkbox-checked-control-color: #1e87f0;
239
239
  --checkbox-checked-control-padding: 10px;
240
- }
240
+ }
@@ -19,6 +19,4 @@
19
19
  :root {
20
20
  --close-color: var(--global-muted-color);
21
21
  --close-hover-color: var(--global-color);
22
- --inverse-close-color: var(--inverse-global-muted-color);
23
- --inverse-close-hover-color: var(--inverse-global-color);
24
- }
22
+ }