@dodlhuat/basix 1.1.1 → 1.2.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 (352) hide show
  1. package/README.md +706 -482
  2. package/css/accordion.scss +86 -87
  3. package/css/alert.scss +137 -137
  4. package/css/badge.scss +104 -0
  5. package/css/bottom-sheet.scss +192 -0
  6. package/css/breadcrumb.scss +158 -0
  7. package/css/button.scss +48 -0
  8. package/css/calendar.scss +957 -0
  9. package/css/card.scss +65 -65
  10. package/css/chart.scss +270 -157
  11. package/css/chat-bubbles.scss +134 -68
  12. package/css/chips.scss +109 -19
  13. package/css/colors.scss +32 -32
  14. package/css/context-menu.scss +182 -0
  15. package/css/datepicker.scss +336 -336
  16. package/css/defaults.scss +90 -90
  17. package/css/docs.scss +529 -0
  18. package/css/editor.scss +664 -461
  19. package/css/file-uploader.scss +1 -1
  20. package/css/flyout-menu.scss +361 -361
  21. package/css/form.scss +124 -0
  22. package/css/gallery.scss +65 -6
  23. package/css/grid.scss +41 -40
  24. package/css/group-picker.scss +345 -0
  25. package/css/guitar-chords.css +250 -250
  26. package/css/icons.scss +330 -330
  27. package/css/parameters.scss +3 -3
  28. package/css/placeholder.scss +33 -33
  29. package/css/popover.scss +206 -0
  30. package/css/progress.scss +76 -32
  31. package/css/properties.scss +51 -36
  32. package/css/push-menu.scss +302 -174
  33. package/css/reset.scss +39 -39
  34. package/css/scrollbar.scss +62 -5
  35. package/css/sidebar-nav.scss +92 -0
  36. package/css/spinner.scss +65 -65
  37. package/css/stepper.scss +248 -0
  38. package/css/style.css +4603 -273
  39. package/css/style.css.map +1 -1
  40. package/css/style.min.css +1 -1
  41. package/css/style.scss +51 -39
  42. package/css/table.scss +199 -199
  43. package/css/tabs.scss +154 -123
  44. package/css/timeline.scss +83 -38
  45. package/css/timepicker.scss +100 -5
  46. package/css/toast.scss +81 -81
  47. package/css/typography.scss +194 -161
  48. package/css/virtual-dropdown.scss +35 -29
  49. package/js/bottom-sheet.js +173 -0
  50. package/js/bottom-sheet.ts +222 -0
  51. package/js/calendar.js +532 -0
  52. package/js/calendar.ts +706 -0
  53. package/js/carousel.js +26 -13
  54. package/js/chart.js +573 -257
  55. package/js/chart.ts +692 -0
  56. package/js/code-viewer.js +10 -10
  57. package/js/code-viewer.ts +188 -188
  58. package/js/context-menu.js +212 -0
  59. package/js/context-menu.ts +252 -0
  60. package/js/datepicker.ts +627 -627
  61. package/js/docs-nav.js +204 -0
  62. package/js/dropdown.ts +179 -179
  63. package/js/editor.js +96 -38
  64. package/js/editor.ts +483 -425
  65. package/js/file-uploader.js +1 -0
  66. package/js/file-uploader.ts +1 -0
  67. package/js/flyout-menu.js +14 -14
  68. package/js/flyout-menu.ts +249 -249
  69. package/js/form-builder.js +106 -106
  70. package/js/gallery.js +13 -6
  71. package/js/gallery.ts +245 -236
  72. package/js/group-picker.js +342 -0
  73. package/js/group-picker.ts +447 -0
  74. package/js/guitar-chords.js +268 -268
  75. package/js/lazy-loader.js +121 -121
  76. package/js/modal.ts +166 -166
  77. package/js/popover.js +163 -0
  78. package/js/popover.ts +219 -0
  79. package/js/position.js +108 -0
  80. package/js/position.ts +111 -0
  81. package/js/push-menu.js +226 -113
  82. package/js/push-menu.ts +284 -145
  83. package/js/request.js +50 -50
  84. package/js/scroll.ts +47 -47
  85. package/js/scrollbar.js +13 -0
  86. package/js/scrollbar.ts +324 -307
  87. package/js/select.ts +216 -216
  88. package/js/sidebar-nav.js +41 -0
  89. package/js/sidebar-nav.ts +66 -0
  90. package/js/stepper.js +80 -0
  91. package/js/stepper.ts +104 -0
  92. package/js/table.ts +452 -452
  93. package/js/tabs.ts +279 -279
  94. package/js/theme.js +17 -6
  95. package/js/theme.ts +234 -224
  96. package/js/timepicker.js +21 -8
  97. package/js/toast.ts +137 -137
  98. package/js/tooltip.js +6 -60
  99. package/js/tooltip.ts +184 -251
  100. package/js/tsconfig.json +18 -18
  101. package/js/utils.ts +83 -83
  102. package/js/virtual-dropdown.js +25 -25
  103. package/js/virtual-dropdown.ts +365 -365
  104. package/package.json +39 -39
  105. package/fonts/Outfit-VariableFont_wght.woff +0 -0
  106. package/fonts/material-icons.woff2 +0 -0
  107. package/icons/activity-outline.svg +0 -1
  108. package/icons/alert-circle-outline.svg +0 -1
  109. package/icons/alert-triangle-outline.svg +0 -1
  110. package/icons/archive-outline.svg +0 -1
  111. package/icons/arrow-back-outline.svg +0 -1
  112. package/icons/arrow-circle-down-outline.svg +0 -1
  113. package/icons/arrow-circle-left-outline.svg +0 -1
  114. package/icons/arrow-circle-right-outline.svg +0 -1
  115. package/icons/arrow-circle-up-outline.svg +0 -1
  116. package/icons/arrow-down-outline.svg +0 -1
  117. package/icons/arrow-downward-outline.svg +0 -1
  118. package/icons/arrow-forward-outline.svg +0 -1
  119. package/icons/arrow-ios-back-outline.svg +0 -1
  120. package/icons/arrow-ios-downward-outline.svg +0 -1
  121. package/icons/arrow-ios-forward-outline.svg +0 -1
  122. package/icons/arrow-ios-upward-outline.svg +0 -1
  123. package/icons/arrow-left-outline.svg +0 -1
  124. package/icons/arrow-right-outline.svg +0 -1
  125. package/icons/arrow-up-outline.svg +0 -1
  126. package/icons/arrow-upward-outline.svg +0 -1
  127. package/icons/arrowhead-down-outline.svg +0 -1
  128. package/icons/arrowhead-left-outline.svg +0 -1
  129. package/icons/arrowhead-right-outline.svg +0 -1
  130. package/icons/arrowhead-up-outline.svg +0 -1
  131. package/icons/at-outline.svg +0 -1
  132. package/icons/attach-2-outline.svg +0 -1
  133. package/icons/attach-outline.svg +0 -1
  134. package/icons/award-outline.svg +0 -1
  135. package/icons/backspace-outline.svg +0 -1
  136. package/icons/bar-chart-2-outline.svg +0 -1
  137. package/icons/bar-chart-outline.svg +0 -1
  138. package/icons/battery-outline.svg +0 -1
  139. package/icons/behance-outline.svg +0 -1
  140. package/icons/bell-off-outline.svg +0 -1
  141. package/icons/bell-outline.svg +0 -1
  142. package/icons/bluetooth-outline.svg +0 -1
  143. package/icons/book-open-outline.svg +0 -1
  144. package/icons/book-outline.svg +0 -1
  145. package/icons/bookmark-outline.svg +0 -1
  146. package/icons/briefcase-outline.svg +0 -1
  147. package/icons/browser-outline.svg +0 -1
  148. package/icons/brush-outline.svg +0 -1
  149. package/icons/bulb-outline.svg +0 -1
  150. package/icons/calendar-outline.svg +0 -1
  151. package/icons/camera-outline.svg +0 -1
  152. package/icons/car-outline.svg +0 -1
  153. package/icons/cast-outline.svg +0 -1
  154. package/icons/charging-outline.svg +0 -1
  155. package/icons/checkmark-circle-2-outline.svg +0 -1
  156. package/icons/checkmark-circle-outline.svg +0 -1
  157. package/icons/checkmark-outline.svg +0 -1
  158. package/icons/checkmark-square-2-outline.svg +0 -1
  159. package/icons/checkmark-square-outline.svg +0 -1
  160. package/icons/chevron-down-outline.svg +0 -1
  161. package/icons/chevron-left-outline.svg +0 -1
  162. package/icons/chevron-right-outline.svg +0 -1
  163. package/icons/chevron-up-outline.svg +0 -1
  164. package/icons/clipboard-outline.svg +0 -1
  165. package/icons/clock-outline.svg +0 -1
  166. package/icons/close-circle-outline.svg +0 -1
  167. package/icons/close-outline.svg +0 -1
  168. package/icons/close-square-outline.svg +0 -1
  169. package/icons/cloud-download-outline.svg +0 -1
  170. package/icons/cloud-upload-outline.svg +0 -1
  171. package/icons/code-download-outline.svg +0 -1
  172. package/icons/code-outline.svg +0 -1
  173. package/icons/collapse-outline.svg +0 -1
  174. package/icons/color-palette-outline.svg +0 -1
  175. package/icons/color-picker-outline.svg +0 -1
  176. package/icons/compass-outline.svg +0 -1
  177. package/icons/copy-outline.svg +0 -1
  178. package/icons/corner-down-left-outline.svg +0 -1
  179. package/icons/corner-down-right-outline.svg +0 -1
  180. package/icons/corner-left-down-outline.svg +0 -1
  181. package/icons/corner-left-up-outline.svg +0 -1
  182. package/icons/corner-right-down-outline.svg +0 -1
  183. package/icons/corner-right-up-outline.svg +0 -1
  184. package/icons/corner-up-left-outline.svg +0 -1
  185. package/icons/corner-up-right-outline.svg +0 -1
  186. package/icons/credit-card-outline.svg +0 -1
  187. package/icons/crop-outline.svg +0 -1
  188. package/icons/cube-outline.svg +0 -1
  189. package/icons/diagonal-arrow-left-down-outline.svg +0 -1
  190. package/icons/diagonal-arrow-left-up-outline.svg +0 -1
  191. package/icons/diagonal-arrow-right-down-outline.svg +0 -1
  192. package/icons/diagonal-arrow-right-up-outline.svg +0 -1
  193. package/icons/done-all-outline.svg +0 -1
  194. package/icons/download-outline.svg +0 -1
  195. package/icons/droplet-off-outline.svg +0 -1
  196. package/icons/droplet-outline.svg +0 -1
  197. package/icons/edit-2-outline.svg +0 -1
  198. package/icons/edit-outline.svg +0 -1
  199. package/icons/email-outline.svg +0 -1
  200. package/icons/expand-outline.svg +0 -1
  201. package/icons/external-link-outline.svg +0 -1
  202. package/icons/eye-off-2-outline.svg +0 -1
  203. package/icons/eye-off-outline.svg +0 -1
  204. package/icons/eye-outline.svg +0 -1
  205. package/icons/facebook-outline.svg +0 -1
  206. package/icons/file-add-outline.svg +0 -1
  207. package/icons/file-outline.svg +0 -1
  208. package/icons/file-remove-outline.svg +0 -1
  209. package/icons/file-text-outline.svg +0 -1
  210. package/icons/film-outline.svg +0 -1
  211. package/icons/flag-outline.svg +0 -1
  212. package/icons/flash-off-outline.svg +0 -1
  213. package/icons/flash-outline.svg +0 -1
  214. package/icons/flip-2-outline.svg +0 -1
  215. package/icons/flip-outline.svg +0 -1
  216. package/icons/folder-add-outline.svg +0 -1
  217. package/icons/folder-outline.svg +0 -1
  218. package/icons/folder-remove-outline.svg +0 -1
  219. package/icons/funnel-outline.svg +0 -1
  220. package/icons/gift-outline.svg +0 -1
  221. package/icons/github-outline.svg +0 -1
  222. package/icons/globe-2-outline.svg +0 -1
  223. package/icons/globe-outline.svg +0 -1
  224. package/icons/google-outline.svg +0 -1
  225. package/icons/grid-outline.svg +0 -1
  226. package/icons/hard-drive-outline.svg +0 -1
  227. package/icons/hash-outline.svg +0 -1
  228. package/icons/headphones-outline.svg +0 -1
  229. package/icons/heart-outline.svg +0 -1
  230. package/icons/home-outline.svg +0 -1
  231. package/icons/image-outline.svg +0 -1
  232. package/icons/inbox-outline.svg +0 -1
  233. package/icons/info-outline.svg +0 -1
  234. package/icons/keypad-outline.svg +0 -1
  235. package/icons/layers-outline.svg +0 -1
  236. package/icons/layout-outline.svg +0 -1
  237. package/icons/link-2-outline.svg +0 -1
  238. package/icons/link-outline.svg +0 -1
  239. package/icons/linkedin-outline.svg +0 -1
  240. package/icons/list-outline.svg +0 -1
  241. package/icons/loader-outline.svg +0 -1
  242. package/icons/lock-outline.svg +0 -1
  243. package/icons/log-in-outline.svg +0 -1
  244. package/icons/log-out-outline.svg +0 -1
  245. package/icons/map-outline.svg +0 -1
  246. package/icons/maximize-outline.svg +0 -1
  247. package/icons/menu-2-outline.svg +0 -1
  248. package/icons/menu-arrow-outline.svg +0 -1
  249. package/icons/menu-outline.svg +0 -1
  250. package/icons/message-circle-outline.svg +0 -1
  251. package/icons/message-square-outline.svg +0 -1
  252. package/icons/mic-off-outline.svg +0 -1
  253. package/icons/mic-outline.svg +0 -1
  254. package/icons/minimize-outline.svg +0 -1
  255. package/icons/minus-circle-outline.svg +0 -1
  256. package/icons/minus-outline.svg +0 -1
  257. package/icons/minus-square-outline.svg +0 -1
  258. package/icons/monitor-outline.svg +0 -1
  259. package/icons/moon-outline.svg +0 -1
  260. package/icons/more-horizontal-outline.svg +0 -1
  261. package/icons/more-vertical-outline.svg +0 -1
  262. package/icons/move-outline.svg +0 -1
  263. package/icons/music-outline.svg +0 -1
  264. package/icons/navigation-2-outline.svg +0 -1
  265. package/icons/navigation-outline.svg +0 -1
  266. package/icons/npm-outline.svg +0 -1
  267. package/icons/options-2-outline.svg +0 -1
  268. package/icons/options-outline.svg +0 -1
  269. package/icons/pantone-outline.svg +0 -1
  270. package/icons/paper-plane-outline.svg +0 -1
  271. package/icons/pause-circle-outline.svg +0 -1
  272. package/icons/people-outline.svg +0 -1
  273. package/icons/percent-outline.svg +0 -1
  274. package/icons/person-add-outline.svg +0 -1
  275. package/icons/person-delete-outline.svg +0 -1
  276. package/icons/person-done-outline.svg +0 -1
  277. package/icons/person-outline.svg +0 -1
  278. package/icons/person-remove-outline.svg +0 -1
  279. package/icons/phone-call-outline.svg +0 -1
  280. package/icons/phone-missed-outline.svg +0 -1
  281. package/icons/phone-off-outline.svg +0 -1
  282. package/icons/phone-outline.svg +0 -1
  283. package/icons/pie-chart-outline.svg +0 -1
  284. package/icons/pin-outline.svg +0 -1
  285. package/icons/play-circle-outline.svg +0 -1
  286. package/icons/plus-circle-outline.svg +0 -1
  287. package/icons/plus-outline.svg +0 -1
  288. package/icons/plus-square-outline.svg +0 -1
  289. package/icons/power-outline.svg +0 -1
  290. package/icons/pricetags-outline.svg +0 -1
  291. package/icons/printer-outline.svg +0 -1
  292. package/icons/question-mark-circle-outline.svg +0 -1
  293. package/icons/question-mark-outline.svg +0 -1
  294. package/icons/radio-button-off-outline.svg +0 -1
  295. package/icons/radio-button-on-outline.svg +0 -1
  296. package/icons/radio-outline.svg +0 -1
  297. package/icons/recording-outline.svg +0 -1
  298. package/icons/refresh-outline.svg +0 -1
  299. package/icons/repeat-outline.svg +0 -1
  300. package/icons/rewind-left-outline.svg +0 -1
  301. package/icons/rewind-right-outline.svg +0 -1
  302. package/icons/save-outline.svg +0 -1
  303. package/icons/scissors-outline.svg +0 -1
  304. package/icons/search-outline.svg +0 -1
  305. package/icons/settings-2-outline.svg +0 -1
  306. package/icons/settings-outline.svg +0 -1
  307. package/icons/shake-outline.svg +0 -1
  308. package/icons/share-outline.svg +0 -1
  309. package/icons/shield-off-outline.svg +0 -1
  310. package/icons/shield-outline.svg +0 -1
  311. package/icons/shopping-bag-outline.svg +0 -1
  312. package/icons/shopping-cart-outline.svg +0 -1
  313. package/icons/shuffle-2-outline.svg +0 -1
  314. package/icons/shuffle-outline.svg +0 -1
  315. package/icons/skip-back-outline.svg +0 -1
  316. package/icons/skip-forward-outline.svg +0 -1
  317. package/icons/slash-outline.svg +0 -1
  318. package/icons/smartphone-outline.svg +0 -1
  319. package/icons/smiling-face-outline.svg +0 -1
  320. package/icons/speaker-outline.svg +0 -1
  321. package/icons/square-outline.svg +0 -1
  322. package/icons/star-outline.svg +0 -1
  323. package/icons/stop-circle-outline.svg +0 -1
  324. package/icons/sun-outline.svg +0 -1
  325. package/icons/swap-outline.svg +0 -1
  326. package/icons/sync-outline.svg +0 -1
  327. package/icons/text-outline.svg +0 -1
  328. package/icons/thermometer-minus-outline.svg +0 -1
  329. package/icons/thermometer-outline.svg +0 -1
  330. package/icons/thermometer-plus-outline.svg +0 -1
  331. package/icons/toggle-left-outline.svg +0 -1
  332. package/icons/toggle-right-outline.svg +0 -1
  333. package/icons/trash-2-outline.svg +0 -1
  334. package/icons/trash-outline.svg +0 -1
  335. package/icons/trending-down-outline.svg +0 -1
  336. package/icons/trending-up-outline.svg +0 -1
  337. package/icons/tv-outline.svg +0 -1
  338. package/icons/twitter-outline.svg +0 -1
  339. package/icons/umbrella-outline.svg +0 -1
  340. package/icons/undo-outline.svg +0 -1
  341. package/icons/unlock-outline.svg +0 -1
  342. package/icons/upload-outline.svg +0 -1
  343. package/icons/video-off-outline.svg +0 -1
  344. package/icons/video-outline.svg +0 -1
  345. package/icons/volume-down-outline.svg +0 -1
  346. package/icons/volume-mute-outline.svg +0 -1
  347. package/icons/volume-off-outline.svg +0 -1
  348. package/icons/volume-up-outline.svg +0 -1
  349. package/icons/wifi-off-outline.svg +0 -1
  350. package/icons/wifi-outline.svg +0 -1
  351. package/js/index.js +0 -718
  352. package/js/index.ts +0 -873
package/README.md CHANGED
@@ -1,482 +1,706 @@
1
- # Basix 1.1.0
2
-
3
- Basix is intended as a starter for the rapid development of a design. Each design element can be added individually to
4
- include only the data required. It is using plain javascript / typescript and therefore is not dependent on any plugin.
5
-
6
- A demo can be found here: <a href="http://www.andibauer.at/basix/" target="_blank">http://www.andibauer.at/basix/</a>
7
-
8
- ### Benefits
9
-
10
- * lightweight
11
- * customizable
12
- * no dependencies, completely vanilla javascript (or css only)
13
-
14
- ## Usage
15
-
16
- Take a look at style.scss for a glimpse on a full import. reset, parameters, colors & defaults are mandatory, anything
17
- else can be added as needed.
18
-
19
- To use the import functionality of javascript files you need to import your main script as a module. And either build
20
- your own css or include the existing full style.css (or min)
21
-
22
- ``` html
23
- <link rel="stylesheet" href="css/style.css" type="text/css">
24
- <script src="js/index.js" type="module"></script>
25
- ```
26
-
27
- ---
28
-
29
- # Available Components
30
-
31
- ## Layout
32
-
33
- ### Grid System
34
-
35
- The Grid component provides a flexbox-based layout system. Use `.row` with `.column` children. Columns can use `.grow-2` through `.grow-6` for proportional sizing. Responsive — stacks on mobile.
36
-
37
- ``` html
38
- <div class="row">
39
- <div class="column">Column 1</div>
40
- <div class="column grow-2">Column 2 (2x)</div>
41
- <div class="column">Column 3</div>
42
- </div>
43
- ```
44
-
45
- ### Typography
46
-
47
- The typography system is built around the Outfit variable font, providing a modern, readable base for all text. Headings follow a clear scale with bold weight and tighter line spacing for strong visual hierarchy. Utility classes enable simple text alignment. Monospace fonts are reserved for code.
48
-
49
- ### Cards
50
-
51
- The Card component is a CSS-only component that creates visually contained content sections with optional header and footer. Use `.card` on rows or columns to wrap them into a card.
52
-
53
- ``` html
54
- <div class="row card">
55
- <div class="column">Card content</div>
56
- </div>
57
- ```
58
-
59
- ### Icons
60
-
61
- Basix uses a reduced Google Material Icon font with just a minimum set of icons. The reduced version is only 5.5 KB compared to the full 242.5 KB. Use the `icon` class with the desired icon element class.
62
-
63
- ``` html
64
- <span class="icon icon-home"></span>
65
- ```
66
-
67
- ---
68
-
69
- ## Forms
70
-
71
- The Form styles provide consistent styling for inputs, textareas, and native elements.
72
-
73
- ### Text Input
74
-
75
- ``` html
76
- <label for="my-input">Text Input</label>
77
- <input type="text" id="my-input" />
78
- ```
79
-
80
- ### Textarea
81
-
82
- ``` html
83
- <label for="my-textarea">Text Area</label>
84
- <textarea id="my-textarea"></textarea>
85
- ```
86
-
87
- ### Checkbox
88
-
89
- The Checkbox component provides custom-styled checkboxes.
90
-
91
- ``` html
92
- <input class="styled-checkbox" id="checkbox-1" type="checkbox" value="1" />
93
- <label for="checkbox-1">Checkbox</label>
94
- ```
95
-
96
- ### Radio Buttons
97
-
98
- The Radio Button component provides custom-styled radio inputs.
99
-
100
- ``` html
101
- <label class="radio-button-container">One
102
- <input type="radio" checked="checked" name="radio" />
103
- <span class="checkmark"></span>
104
- </label>
105
- ```
106
-
107
- ### Switch
108
-
109
- The Switch component creates styled toggle switches based on checkboxes.
110
-
111
- ``` html
112
- <div class="switch">
113
- <input type="checkbox" id="switch" />
114
- <label for="switch">Toggle</label>
115
- </div>
116
- ```
117
-
118
- ### Range Slider
119
-
120
- The Range Slider component creates a simple styled slider.
121
-
122
- ``` html
123
- <input type="range" min="1" max="100" value="50" />
124
- ```
125
-
126
- ---
127
-
128
- ## Navigation
129
-
130
- ### Push Menu
131
-
132
- The PushMenu component creates a sidebar navigation that "pushes" the main content when opened. Uses a checkbox-based toggle mechanism.
133
-
134
- ### Flyout Menu
135
-
136
- The Flyout Menu component creates slide-in navigation menus with nested submenus. Supports left/right direction, header/footer and keyboard navigation (Escape to close).
137
-
138
- | Option | Type | Default | Description |
139
- |---|---|---|---|
140
- | `triggerSelector` | string | `'.menu-trigger'` | CSS selector for the element(s) that open the menu |
141
- | `menuSelector` | string | `'#flyoutMenu'` | CSS selector for the flyout menu element |
142
- | `overlaySelector` | string | `'#flyoutOverlay'` | CSS selector for the backdrop overlay |
143
- | `closeSelector` | string | `'.close-menu'` | CSS selector for close button(s) inside the menu |
144
- | `direction` | string | `'right'` | Slide-in direction, either `'right'` or `'left'` |
145
- | `title` | string | `'Menu'` | Shown in the header if enabled |
146
- | `enableHeader` | boolean | `true` | Shows the menu header |
147
- | `footerText` | string | `'© 2025 Brand Inc.'` | Shown in the footer if enabled |
148
- | `enableFooter` | boolean | `true` | Shows the menu footer |
149
-
150
- ### Dropdown Menu
151
-
152
- The Dropdown Menu allows to create multi-level dropdown menus with nested submenus. The menu fires custom events `CustomEvent<DropdownSelectDetail>` that can be listened to in order to react to user selections.
153
-
154
- ``` html
155
- <div class="dropdown-container" id="myDropdown">
156
- <button class="dropdown-trigger">Select Option</button>
157
- <ul class="dropdown-menu">
158
- <li><div class="dropdown-item">Profile</div></li>
159
- <li>
160
- <div class="dropdown-item">Settings</div>
161
- <ul>
162
- <li><div class="dropdown-item">Account</div></li>
163
- </ul>
164
- </li>
165
- </ul>
166
- </div>
167
- ```
168
-
169
- ---
170
-
171
- ## Feedback
172
-
173
- ### Modal
174
-
175
- The Modal component creates dialog overlays with header, content, and footer sections. Supports types (success, error, warning, info) and close on Escape key.
176
-
177
- | Parameter | Type | Description |
178
- |---|---|---|
179
- | `content` | string | Content of the modal. Can be HTML or a simple string |
180
- | `header` | string | Header of the modal. Can be HTML or a simple string |
181
- | `footer` | string | Footer of the modal. Can be HTML or a simple string |
182
- | `closeable` | boolean | Shows a close button |
183
- | `type` | ModalType | The type of the modal (success, error, warning, info, default) |
184
-
185
- ### Toast
186
-
187
- The Toast component shows brief notification messages.
188
-
189
- | Parameter | Type | Description |
190
- |---|---|---|
191
- | `content` | string | The content of the toast |
192
- | `header` | string | The header of the toast |
193
- | `markup` | ToastType | Changes the color of the toast: default, success, warning, error |
194
- | `closeable` | boolean | Allows to close the toast before auto-closure time |
195
- | `auto-closure` | integer | Optional closure time in ms |
196
-
197
- ### Tooltip
198
-
199
- The Tooltip component shows contextual information on hover.
200
-
201
- ``` html
202
- <button class="tooltip-trigger" data-tooltip="This is a simple tooltip">Hover me</button>
203
- ```
204
-
205
- ### Spinner / Loading
206
-
207
- The Spinner component shows simple loading indicators. There are two variants: a simple spinner and a loading indicator with dots.
208
-
209
- ``` html
210
- <div class="spinner"></div>
211
- <div class="loading"></div>
212
- ```
213
-
214
- ---
215
-
216
- ## Components
217
-
218
- ### Alerts
219
-
220
- The Alert component displays contextual feedback messages. Available variants: default, error, warning and success.
221
-
222
- ``` html
223
- <div class="alert alert-error"><strong>Error: </strong> This is an error alert!</div>
224
- ```
225
-
226
- ### Buttons
227
-
228
- The Button component provides styled buttons with variants. Use the `.button` class on divs or simply the `button` element with color classes: `button-primary`, `button-success`, `button-warning`, `button-error`.
229
-
230
- ``` html
231
- <button class="button-primary">Primary</button>
232
- ```
233
-
234
- ### Chips
235
-
236
- The Chips component displays small interactive elements like tags or filters. CSS only. Use listeners if you want them to be clickable or closeable.
237
-
238
- ``` html
239
- <div class="chips">
240
- <div class="chip">Example Chip</div>
241
- <div class="chip clickable">Clickable Chip</div>
242
- <div class="chip closeable">
243
- Closeable Chip
244
- <button class="close"><span class="icon icon-close"></span></button>
245
- </div>
246
- </div>
247
- ```
248
-
249
- ### Accordion
250
-
251
- The Accordion component creates collapsible content sections. Uses hidden radio/checkbox inputs with labels and is CSS only.
252
-
253
- ``` html
254
- <div class="accordion">
255
- <div class="accordion-item">
256
- <input type="radio" name="accordion" id="acc1" class="accordion-input" checked />
257
- <label for="acc1" class="accordion-label">Section Title</label>
258
- <div class="accordion-content">
259
- <div class="accordion-body"><div><p>Content here.</p></div></div>
260
- </div>
261
- </div>
262
- </div>
263
- ```
264
-
265
- ### Tabs
266
-
267
- The Tabs component creates accessible tabbed interfaces. Supports horizontal/vertical layouts, keyboard navigation (arrow keys, Home, End), and ARIA attributes.
268
-
269
- | Option | Type | Default | Description |
270
- |---|---|---|---|
271
- | `layout` | string | `'horizontal'` | Layout of the tabs, either `'horizontal'` or `'vertical'` |
272
- | `defaultTab` | integer | `0` | Index of the default active tab (0-based) |
273
-
274
- ### Timeline
275
-
276
- The Timeline component displays chronological events. CSS only.
277
-
278
- ``` html
279
- <div class="timeline">
280
- <div class="timeline-item active">
281
- <div class="timeline-content">
282
- <span class="timeline-date">October 12, 2023</span>
283
- <h3 class="timeline-title">Event Title</h3>
284
- <p class="timeline-body">Event description.</p>
285
- </div>
286
- </div>
287
- </div>
288
- ```
289
-
290
- ### Progress Bar
291
-
292
- The Progress Bar component displays task completion.
293
-
294
- ``` html
295
- <div class="progress-bar">
296
- <div class="progress" style="height: 24px; width: 50%"></div>
297
- </div>
298
- ```
299
-
300
- ### Placeholder / Skeleton
301
-
302
- The Placeholder component creates skeleton loading states. Use `.placeholder` with width classes `.w-1` through `.w-12` (12-column grid). Animates with a pulsing fade effect.
303
-
304
- ``` html
305
- <span class="placeholder w-6"></span>
306
- ```
307
-
308
- ---
309
-
310
- ## Advanced Components
311
-
312
- ### Data Tables
313
-
314
- The Table component provides sortable, searchable, and paginated data tables. It can parse existing HTML tables or accept data programmatically.
315
-
316
- ### Date Picker
317
-
318
- The DatePicker component provides a calendar interface for date selection. Supports single date or date range modes, customizable locales, and mobile-responsive design.
319
-
320
- #### DatePicker Parameters
321
-
322
- | Parameter | Type | Description |
323
- |---|---|---|
324
- | `input` | HTMLInputElement \| string | The input element to attach the date picker to |
325
- | `options` | DatePickerOptions | Configuration options for the date picker (see options table) |
326
- | `currentDate` | Date | The current date to be displayed; defaults to today's date |
327
- | `selectedDate` | Date | The selected date; defaults to null |
328
- | `rangeStart` | Date | The start of a selected date range; defaults to null |
329
- | `rangeEnd` | Date | The end of a selected date range; defaults to null |
330
- | `viewYear` | number | The year currently displayed; defaults to the current year |
331
- | `viewMonth` | number | The month currently displayed; defaults to the current month |
332
- | `viewMode` | ViewMode | The view mode (`'days'` \| `'months'` \| `'years'`); defaults to `'days'` |
333
- | `yearRangeStart` | number | The start of the year range; defaults to this year |
334
-
335
- #### DatePickerOptions
336
-
337
- | Option | Type | Default | Description |
338
- |---|---|---|---|
339
- | `mode` | string | `'single'` | Mode of the date picker, either `'single'` or `'range'` |
340
- | `startDay` | number | `0` | Start day of the week (0 = Sunday, 1 = Monday, etc.) |
341
- | `locales` | DatePickerLocales | — | Locales object containing a `days` array and a `months` array with localized names |
342
- | `format` | `(date: Date) => string` | — | Function to format the date for display; defaults to `'YYYY-MM-DD'` |
343
- | `onSelect` | `(date: Date \| DateRange) => void` | — | Callback when a date is selected |
344
-
345
- ### Tree Component
346
-
347
- The TreeComponent renders hierarchical data as an expandable/collapsible tree. Supports file/folder icons, selection, and programmatic expand/collapse.
348
-
349
- #### TreeComponent Parameters
350
-
351
- | Parameter | Type | Description |
352
- |---|---|---|
353
- | `container` | HTMLElement \| string | The container element |
354
- | `data` | TreeNode[] | An array of TreeNodes to render |
355
- | `selectedNode` | TreeNode \| null | The currently selected TreeNode |
356
-
357
- #### TreeNode
358
-
359
- | Parameter | Type | Description |
360
- |---|---|---|
361
- | `label` | string | The label of the TreeNode |
362
- | `type` | NodeType | The type of the TreeNode: `'file'` \| `'folder'` |
363
- | `children` | TreeNode[] | An array of child TreeNodes |
364
-
365
- ### File Uploader
366
-
367
- The FileUploader component provides drag-and-drop file upload functionality with progress indication. Supports file validation (size, type), multiple files, and upload cancellation.
368
-
369
- ### Virtual Dropdown
370
-
371
- Virtual Dropdown is a performant, virtualized dropdown component that efficiently renders large option lists by only drawing visible items in the DOM. Supports single and multi-select modes, built-in search/filtering, keyboard navigation, and configurable item height and render limits — making it ideal for scenarios with hundreds or thousands of selectable options.
372
-
373
- ### Custom Scrollbar
374
-
375
- The Scrollbar component creates custom-styled scrollbars. Supports pointer/touch dragging, track clicking, and automatic thumb sizing. Can be used with any class.
376
-
377
- ``` html
378
- <div class="scroll-container" style="height: 100px">
379
- <div class="viewport">
380
- <div class="content">...</div>
381
- <div class="scrollbar" aria-hidden="true">
382
- <div class="track">
383
- <div class="thumb" role="presentation" aria-hidden="true"></div>
384
- </div>
385
- </div>
386
- </div>
387
- </div>
388
- ```
389
-
390
- ### Chat Bubbles
391
-
392
- The Chat Bubbles component styles messaging interfaces.
393
-
394
- ``` html
395
- <div class="chat-container">
396
- <div class="message message-incoming">
397
- Hello!
398
- <span class="message-meta">10:42 AM</span>
399
- </div>
400
- <div class="message message-outgoing">
401
- Hi there!
402
- <span class="message-meta">10:43 AM</span>
403
- </div>
404
- </div>
405
- ```
406
-
407
- ### Carousel
408
-
409
- The Carousel component creates image/content sliders with navigation buttons and dot indicators. Supports loop mode, autoplay, and touch/swipe gestures.
410
-
411
- ``` html
412
- <div class="carousel" id="carouselIdHere">
413
- <div>Slide 1</div>
414
- <div>Slide 2</div>
415
- <div>Slide 3</div>
416
- </div>
417
- ```
418
-
419
- ### Gallery
420
-
421
- A responsive, infinite-scroll masonry gallery that dynamically arranges image cards into columns. The layout automatically adapts to the viewport width, redistributing items into the shortest column for a balanced, Pinterest-style grid. Cards feature lazy-loaded images with a smooth fade-in effect, titles, and descriptions. Scroll to the bottom to load more content — fetching can be throttled with a configurable reload limit to prevent runaway requests.
422
-
423
- #### Constructor Parameters
424
-
425
- | Parameter | Type | Description |
426
- |---|---|---|
427
- | `containerId` | string | The `id` of the HTML element that will serve as the gallery container. Throws an error if not found in the DOM. |
428
- | `options` | MasonryGalleryOptions | Optional configuration object to customise the gallery's layout and behaviour. Defaults to `{}`. |
429
-
430
- #### MasonryGalleryOptions
431
-
432
- | Option | Type | Default | Description |
433
- |---|---|---|---|
434
- | `minColumnWidth` | number | `250` | Minimum width (in pixels) for each masonry column. The number of columns is calculated by dividing the available container width by this value. |
435
- | `scrollThreshold` | number | `100` | Distance from the bottom of the page (in pixels) at which the next batch of images is fetched. |
436
- | `loaderSelector` | string | `'.loader'` | CSS selector for the loading-indicator element. Shown/hidden automatically during fetch cycles via a `hidden` class toggle. |
437
- | `reload` | number | `2` | Maximum number of times new images can be fetched via infinite scroll. Once the limit is reached, further scroll events are ignored. |
438
- | `fetchFunction` | `Promise<ImageData[]>` | — | A promise that resolves to an array of `ImageData` objects (`{ src, title, desc }`). Required in practice — the built-in fallback throws an error. |
439
-
440
- ---
441
-
442
- ## Utilities
443
-
444
- ### Theme Toggle
445
-
446
- The Theme component manages light/dark mode switching. Persists preference to localStorage, respects system preference, and supports keyboard shortcut (Ctrl/Cmd+J). Any element with id `theme-toggle` can work as a switch.
447
-
448
- ### Scroll Utility
449
-
450
- The Scroll utility allows to scroll to elements in the DOM. You can scroll to any class or id element.
451
-
452
- ``` js
453
- window.Scroll.to('#my-element');
454
- ```
455
-
456
- ---
457
-
458
- ## How to Run Locally
459
-
460
- Building is only necessary if you want to make changes to files. Otherwise, docker is enough.
461
-
462
- ```bash
463
- # Docker
464
- docker compose up -d
465
- # http://localhost:8082
466
-
467
- # Compile TypeScript
468
- # One-time compilation (all .ts files in js/)
469
- npx tsc -p js/tsconfig.json
470
- # Watch mode (auto-recompile on changes)
471
- npx tsc -p js/tsconfig.json --watch
472
- # Or use the shorter alias:
473
- tsc -p js/tsconfig.json -w
474
-
475
- # Compile SCSS to CSS
476
- # Install sass first: npm install -g sass
477
- sass css:css
478
- # Or with watch mode:
479
- sass --watch css:css
480
- # Or compile + minify the main bundle:
481
- sass --style=compressed css/style.scss css/style.min.css
482
- ```
1
+ # Basix 1.2.1
2
+
3
+ Basix is intended as a starter for the rapid development of a design. Each design element can be added individually to
4
+ include only the data required. It is using plain javascript / typescript and therefore is not dependent on any plugin.
5
+
6
+ A demo can be found here: <a href="http://www.andibauer.at/basix/" target="_blank">http://www.andibauer.at/basix/</a>
7
+
8
+ ### Benefits
9
+
10
+ * lightweight
11
+ * customizable
12
+ * no dependencies, completely vanilla javascript (or css only)
13
+
14
+ ## Usage
15
+
16
+ Take a look at style.scss for a glimpse on a full import. reset, parameters, colors & defaults are mandatory, anything
17
+ else can be added as needed.
18
+
19
+ To use the import functionality of javascript files you need to import your main script as a module. And either build
20
+ your own css or include the existing full style.css (or min)
21
+
22
+ ``` html
23
+ <link rel="stylesheet" href="css/style.css" type="text/css">
24
+ <script src="js/index.js" type="module"></script>
25
+ ```
26
+
27
+ ---
28
+
29
+ # Available Components
30
+
31
+ ## Layout
32
+
33
+ ### Grid System
34
+
35
+ The Grid component provides a flexbox-based layout system. Use `.row` with `.column` children. Columns can use `.grow-2` through `.grow-6` for proportional sizing. Responsive — stacks on mobile.
36
+
37
+ ``` html
38
+ <div class="row">
39
+ <div class="column">Column 1</div>
40
+ <div class="column grow-2">Column 2 (2x)</div>
41
+ <div class="column">Column 3</div>
42
+ </div>
43
+ ```
44
+
45
+ ### Typography
46
+
47
+ The typography system is built around the Outfit variable font, providing a modern, readable base for all text. Headings follow a clear scale with bold weight and tighter line spacing for strong visual hierarchy. Utility classes enable simple text alignment. Monospace fonts are reserved for code.
48
+
49
+ ### Cards
50
+
51
+ The Card component is a CSS-only component that creates visually contained content sections with optional header and footer. Use `.card` on rows or columns to wrap them into a card.
52
+
53
+ ``` html
54
+ <div class="row card">
55
+ <div class="column">Card content</div>
56
+ </div>
57
+ ```
58
+
59
+ ### Icons
60
+
61
+ Basix ships icons in two formats:
62
+
63
+ **Font icons** — a reduced Google Material Icon font (~5.5 KB vs the full 242.5 KB). Use the `.icon` class with a modifier.
64
+
65
+ ``` html
66
+ <span class="icon icon-home"></span>
67
+ ```
68
+
69
+ **SVG sprite** — a single `svg-icons/icons.svg` sprite file. Preferred when you need consistent sizing, color inheritance via `currentColor`, or icons inside JS-generated markup.
70
+
71
+ ``` html
72
+ <svg class="icon-svg"><use href="svg-icons/icons.svg#home"/></svg>
73
+ ```
74
+
75
+ ---
76
+
77
+ ## Forms
78
+
79
+ The Form styles provide consistent styling for inputs, textareas, and native elements.
80
+
81
+ ### Text Input
82
+
83
+ ``` html
84
+ <label for="my-input">Text Input</label>
85
+ <input type="text" id="my-input" />
86
+ ```
87
+
88
+ ### Textarea
89
+
90
+ ``` html
91
+ <label for="my-textarea">Text Area</label>
92
+ <textarea id="my-textarea"></textarea>
93
+ ```
94
+
95
+ ### Checkbox
96
+
97
+ The Checkbox component provides custom-styled checkboxes.
98
+
99
+ ``` html
100
+ <input class="styled-checkbox" id="checkbox-1" type="checkbox" value="1" />
101
+ <label for="checkbox-1">Checkbox</label>
102
+ ```
103
+
104
+ ### Radio Buttons
105
+
106
+ The Radio Button component provides custom-styled radio inputs.
107
+
108
+ ``` html
109
+ <label class="radio-button-container">One
110
+ <input type="radio" checked="checked" name="radio" />
111
+ <span class="checkmark"></span>
112
+ </label>
113
+ ```
114
+
115
+ ### Switch
116
+
117
+ The Switch component creates styled toggle switches based on checkboxes.
118
+
119
+ ``` html
120
+ <div class="switch">
121
+ <input type="checkbox" id="switch" />
122
+ <label for="switch">Toggle</label>
123
+ </div>
124
+ ```
125
+
126
+ ### Range Slider
127
+
128
+ The Range Slider component creates a simple styled slider.
129
+
130
+ ``` html
131
+ <input type="range" min="1" max="100" value="50" />
132
+ ```
133
+
134
+ ---
135
+
136
+ ## Navigation
137
+
138
+ ### Push Menu
139
+
140
+ The PushMenu component creates a sidebar navigation that "pushes" the main content when opened. Uses a checkbox-based toggle mechanism.
141
+
142
+ ### Flyout Menu
143
+
144
+ The Flyout Menu component creates slide-in navigation menus with nested submenus. Supports left/right direction, header/footer and keyboard navigation (Escape to close).
145
+
146
+ | Option | Type | Default | Description |
147
+ |---|---|---|---|
148
+ | `triggerSelector` | string | `'.menu-trigger'` | CSS selector for the element(s) that open the menu |
149
+ | `menuSelector` | string | `'#flyoutMenu'` | CSS selector for the flyout menu element |
150
+ | `overlaySelector` | string | `'#flyoutOverlay'` | CSS selector for the backdrop overlay |
151
+ | `closeSelector` | string | `'.close-menu'` | CSS selector for close button(s) inside the menu |
152
+ | `direction` | string | `'right'` | Slide-in direction, either `'right'` or `'left'` |
153
+ | `title` | string | `'Menu'` | Shown in the header if enabled |
154
+ | `enableHeader` | boolean | `true` | Shows the menu header |
155
+ | `footerText` | string | `'© 2025 Brand Inc.'` | Shown in the footer if enabled |
156
+ | `enableFooter` | boolean | `true` | Shows the menu footer |
157
+
158
+ ### Dropdown Menu
159
+
160
+ The Dropdown Menu allows to create multi-level dropdown menus with nested submenus. The menu fires custom events `CustomEvent<DropdownSelectDetail>` that can be listened to in order to react to user selections.
161
+
162
+ ``` html
163
+ <div class="dropdown-container" id="myDropdown">
164
+ <button class="dropdown-trigger">Select Option</button>
165
+ <ul class="dropdown-menu">
166
+ <li><div class="dropdown-item">Profile</div></li>
167
+ <li>
168
+ <div class="dropdown-item">Settings</div>
169
+ <ul>
170
+ <li><div class="dropdown-item">Account</div></li>
171
+ </ul>
172
+ </li>
173
+ </ul>
174
+ </div>
175
+ ```
176
+
177
+ ---
178
+
179
+ ## Feedback
180
+
181
+ ### Modal
182
+
183
+ The Modal component creates dialog overlays with header, content, and footer sections. Supports types (success, error, warning, info) and close on Escape key.
184
+
185
+ | Parameter | Type | Description |
186
+ |---|---|---|
187
+ | `content` | string | Content of the modal. Can be HTML or a simple string |
188
+ | `header` | string | Header of the modal. Can be HTML or a simple string |
189
+ | `footer` | string | Footer of the modal. Can be HTML or a simple string |
190
+ | `closeable` | boolean | Shows a close button |
191
+ | `type` | ModalType | The type of the modal (success, error, warning, info, default) |
192
+
193
+ ### Toast
194
+
195
+ The Toast component shows brief notification messages.
196
+
197
+ | Parameter | Type | Description |
198
+ |---|---|---|
199
+ | `content` | string | The content of the toast |
200
+ | `header` | string | The header of the toast |
201
+ | `markup` | ToastType | Changes the color of the toast: default, success, warning, error |
202
+ | `closeable` | boolean | Allows to close the toast before auto-closure time |
203
+ | `auto-closure` | integer | Optional closure time in ms |
204
+
205
+ ### Bottom Sheet
206
+
207
+ The Bottom Sheet component slides up a panel from the bottom of the screen. On desktop it centers as a floating panel. Supports drag-to-dismiss, snap heights, header/footer slots, and an optional close button.
208
+
209
+ | Option | Type | Default | Description |
210
+ |---|---|---|---|
211
+ | `content` | string | — | HTML content rendered inside the sheet body |
212
+ | `header` | string | — | Optional header text |
213
+ | `footer` | string | — | Optional footer HTML (e.g. action buttons) |
214
+ | `closeable` | boolean | `true` | Shows a close button and enables backdrop/Escape dismissal |
215
+ | `snapHeight` | string | `'auto'` | Height preset: `'auto'`, `'half'` (50vh), or `'full'` (100dvh) |
216
+ | `onClose` | function | — | Callback fired after the dismiss animation completes |
217
+
218
+ ``` js
219
+ const sheet = new BottomSheet({
220
+ content: '<p>Sheet content here.</p>',
221
+ header: 'Title',
222
+ footer: '<div class="buttons"><button>Cancel</button><button>Confirm</button></div>',
223
+ snapHeight: 'half',
224
+ onClose: () => console.log('closed'),
225
+ });
226
+ sheet.show();
227
+ sheet.hide();
228
+ sheet.snapTo('full');
229
+ ```
230
+
231
+ ### Tooltip
232
+
233
+ The Tooltip component shows contextual information on hover.
234
+
235
+ ``` html
236
+ <button class="tooltip-trigger" data-tooltip="This is a simple tooltip">Hover me</button>
237
+ ```
238
+
239
+ ### Spinner / Loading
240
+
241
+ The Spinner component shows simple loading indicators. There are two variants: a simple spinner and a loading indicator with dots.
242
+
243
+ ``` html
244
+ <div class="spinner"></div>
245
+ <div class="loading"></div>
246
+ ```
247
+
248
+ ---
249
+
250
+ ## Components
251
+
252
+ ### Alerts
253
+
254
+ The Alert component displays contextual feedback messages. Available variants: default, error, warning and success.
255
+
256
+ ``` html
257
+ <div class="alert alert-error"><strong>Error: </strong> This is an error alert!</div>
258
+ ```
259
+
260
+ ### Buttons
261
+
262
+ The Button component provides styled buttons with variants. Use the `.button` class on divs or simply the `button` element with color classes: `button-primary`, `button-success`, `button-warning`, `button-error`.
263
+
264
+ ``` html
265
+ <button class="button-primary">Primary</button>
266
+ ```
267
+
268
+ ### Chips
269
+
270
+ The Chips component displays small interactive elements like tags or filters. CSS only. Use listeners if you want them to be clickable or closeable.
271
+
272
+ ``` html
273
+ <div class="chips">
274
+ <div class="chip">Example Chip</div>
275
+ <div class="chip clickable">Clickable Chip</div>
276
+ <div class="chip closeable">
277
+ Closeable Chip
278
+ <button class="close"><span class="icon icon-close"></span></button>
279
+ </div>
280
+ </div>
281
+ ```
282
+
283
+ ### Badge
284
+
285
+ The Badge component displays compact status labels or counts inline. CSS only. Supports soft (tinted), solid, and outline variants, three sizes, and a dot-only indicator.
286
+
287
+ ``` html
288
+ <!-- Soft (default) -->
289
+ <span class="badge badge-info">Info</span>
290
+ <span class="badge badge-success">Success</span>
291
+ <span class="badge badge-warning">Warning</span>
292
+ <span class="badge badge-error">Error</span>
293
+
294
+ <!-- Solid fill -->
295
+ <span class="badge badge-solid badge-info">Info</span>
296
+
297
+ <!-- Outline -->
298
+ <span class="badge badge-outline badge-error">Error</span>
299
+
300
+ <!-- Sizes -->
301
+ <span class="badge badge-sm badge-info">Small</span>
302
+ <span class="badge badge-lg badge-info">Large</span>
303
+
304
+ <!-- Dot indicator (no text) -->
305
+ <span class="badge badge-dot badge-success"></span>
306
+ ```
307
+
308
+ ### Stepper
309
+
310
+ The Stepper component guides users through a multi-step process. Supports horizontal and vertical layouts, animated connector fills, active pulse, completed, and error states. Steps can optionally be made clickable for non-linear navigation.
311
+
312
+ ``` html
313
+ <div class="stepper" id="my-stepper">
314
+ <div class="stepper-step completed">
315
+ <div class="stepper-indicator">
316
+ <svg class="icon-svg"><use href="svg-icons/icons.svg#check"/></svg>
317
+ </div>
318
+ <div class="stepper-label">
319
+ <span class="stepper-title">Account</span>
320
+ <span class="stepper-desc">Your details</span>
321
+ </div>
322
+ </div>
323
+ <div class="stepper-connector completed"></div>
324
+ <div class="stepper-step active">
325
+ <div class="stepper-indicator">2</div>
326
+ <div class="stepper-label">
327
+ <span class="stepper-title">Profile</span>
328
+ </div>
329
+ </div>
330
+ <div class="stepper-connector"></div>
331
+ <div class="stepper-step">
332
+ <div class="stepper-indicator">3</div>
333
+ <div class="stepper-label">
334
+ <span class="stepper-title">Review</span>
335
+ </div>
336
+ </div>
337
+ </div>
338
+ ```
339
+
340
+ Add `.stepper-vertical` to the container for a vertical layout.
341
+
342
+ ``` js
343
+ const stepper = new Stepper('#my-stepper', {
344
+ defaultStep: 0, // initial active step (0-based)
345
+ clickable: true, // allow clicking completed steps to navigate back
346
+ onChange: (current, previous) => console.log(current, previous),
347
+ });
348
+
349
+ stepper.next();
350
+ stepper.prev();
351
+ stepper.goTo(2);
352
+ stepper.setError(1);
353
+ stepper.clearError(1);
354
+ stepper.isFirst(); // boolean
355
+ stepper.isLast(); // boolean
356
+ stepper.getStep(); // current index
357
+ stepper.getStepCount();
358
+ ```
359
+
360
+ | Option | Type | Default | Description |
361
+ |---|---|---|---|
362
+ | `defaultStep` | number | `0` | Index of the initially active step |
363
+ | `clickable` | boolean | `false` | Adds `.stepper-clickable` and wires click-to-navigate on all steps |
364
+ | `onChange` | function | — | Callback fired on step change: `(current, previous) => void` |
365
+
366
+ ### Accordion
367
+
368
+ The Accordion component creates collapsible content sections. Uses hidden radio/checkbox inputs with labels and is CSS only.
369
+
370
+ ``` html
371
+ <div class="accordion">
372
+ <div class="accordion-item">
373
+ <input type="radio" name="accordion" id="acc1" class="accordion-input" checked />
374
+ <label for="acc1" class="accordion-label">Section Title</label>
375
+ <div class="accordion-content">
376
+ <div class="accordion-body"><div><p>Content here.</p></div></div>
377
+ </div>
378
+ </div>
379
+ </div>
380
+ ```
381
+
382
+ ### Tabs
383
+
384
+ The Tabs component creates accessible tabbed interfaces. Supports horizontal/vertical layouts, keyboard navigation (arrow keys, Home, End), and ARIA attributes.
385
+
386
+ | Option | Type | Default | Description |
387
+ |---|---|---|---|
388
+ | `layout` | string | `'horizontal'` | Layout of the tabs, either `'horizontal'` or `'vertical'` |
389
+ | `defaultTab` | integer | `0` | Index of the default active tab (0-based) |
390
+
391
+ ### Timeline
392
+
393
+ The Timeline component displays chronological events. CSS only.
394
+
395
+ ``` html
396
+ <div class="timeline">
397
+ <div class="timeline-item active">
398
+ <div class="timeline-content">
399
+ <span class="timeline-date">October 12, 2023</span>
400
+ <h3 class="timeline-title">Event Title</h3>
401
+ <p class="timeline-body">Event description.</p>
402
+ </div>
403
+ </div>
404
+ </div>
405
+ ```
406
+
407
+ ### Progress Bar
408
+
409
+ The Progress Bar component displays task completion.
410
+
411
+ ``` html
412
+ <div class="progress-bar">
413
+ <div class="progress" style="height: 24px; width: 50%"></div>
414
+ </div>
415
+ ```
416
+
417
+ ### Placeholder / Skeleton
418
+
419
+ The Placeholder component creates skeleton loading states. Use `.placeholder` with width classes `.w-1` through `.w-12` (12-column grid). Animates with a pulsing fade effect.
420
+
421
+ ``` html
422
+ <span class="placeholder w-6"></span>
423
+ ```
424
+
425
+ ---
426
+
427
+ ## Advanced Components
428
+
429
+ ### Context Menu
430
+
431
+ The Context Menu component shows a custom right-click menu on any target element. Supports icons, keyboard shortcuts, group labels, separators, submenus, destructive items, and disabled items. Automatically flips to avoid viewport overflow and animates in from the click origin.
432
+
433
+ ``` js
434
+ new ContextMenu('.my-element', [
435
+ { group: 'File' },
436
+ { label: 'Open', icon: 'folder_open', shortcut: '⌘O', action: (target) => {} },
437
+ { label: 'Rename', icon: 'edit', shortcut: 'F2', action: (target) => {} },
438
+ 'separator',
439
+ {
440
+ label: 'Share', icon: 'send',
441
+ submenu: [
442
+ { label: 'Copy link', icon: 'attachment', action: (target) => {} },
443
+ { label: 'Send by mail', icon: 'mail', action: (target) => {} },
444
+ ]
445
+ },
446
+ 'separator',
447
+ { label: 'Delete', icon: 'delete', destructive: true, action: (target) => {} },
448
+ ]);
449
+ ```
450
+
451
+ The constructor accepts a CSS selector string, a single `HTMLElement`, or an array of `HTMLElement`s as the first argument.
452
+
453
+ #### Item types
454
+
455
+ | Type | Shape | Description |
456
+ |---|---|---|
457
+ | Action item | `ContextMenuItemDef` | Regular clickable item |
458
+ | Separator | `'separator'` | Horizontal divider line |
459
+ | Group label | `{ group: string }` | Non-interactive section header |
460
+
461
+ #### ContextMenuItemDef
462
+
463
+ | Property | Type | Description |
464
+ |---|---|---|
465
+ | `label` | string | Display text |
466
+ | `icon` | string | SVG sprite icon id (e.g. `'delete'`) |
467
+ | `shortcut` | string | Keyboard shortcut hint shown on the right (e.g. `'⌘O'`) |
468
+ | `disabled` | boolean | Renders item at reduced opacity, non-interactive |
469
+ | `destructive` | boolean | Renders item in error/red color |
470
+ | `action` | function | Callback `(target: HTMLElement) => void` — receives the right-clicked element |
471
+ | `submenu` | `ContextMenuInput[]` | Nested items; renders a submenu on hover |
472
+
473
+ #### Keyboard navigation
474
+
475
+ | Key | Action |
476
+ |---|---|
477
+ | `↑` / `↓` | Move focus between items |
478
+ | `Enter` | Activate focused item |
479
+ | `Escape` | Close the menu |
480
+
481
+ ### Data Tables
482
+
483
+ The Table component provides sortable, searchable, and paginated data tables. It can parse existing HTML tables or accept data programmatically.
484
+
485
+ ### Date Picker
486
+
487
+ The DatePicker component provides a calendar interface for date selection. Supports single date or date range modes, customizable locales, and mobile-responsive design.
488
+
489
+ #### DatePicker Parameters
490
+
491
+ | Parameter | Type | Description |
492
+ |---|---|---|
493
+ | `input` | HTMLInputElement \| string | The input element to attach the date picker to |
494
+ | `options` | DatePickerOptions | Configuration options for the date picker (see options table) |
495
+ | `currentDate` | Date | The current date to be displayed; defaults to today's date |
496
+ | `selectedDate` | Date | The selected date; defaults to null |
497
+ | `rangeStart` | Date | The start of a selected date range; defaults to null |
498
+ | `rangeEnd` | Date | The end of a selected date range; defaults to null |
499
+ | `viewYear` | number | The year currently displayed; defaults to the current year |
500
+ | `viewMonth` | number | The month currently displayed; defaults to the current month |
501
+ | `viewMode` | ViewMode | The view mode (`'days'` \| `'months'` \| `'years'`); defaults to `'days'` |
502
+ | `yearRangeStart` | number | The start of the year range; defaults to this year |
503
+
504
+ #### DatePickerOptions
505
+
506
+ | Option | Type | Default | Description |
507
+ |---|---|---|---|
508
+ | `mode` | string | `'single'` | Mode of the date picker, either `'single'` or `'range'` |
509
+ | `startDay` | number | `0` | Start day of the week (0 = Sunday, 1 = Monday, etc.) |
510
+ | `locales` | DatePickerLocales | — | Locales object containing a `days` array and a `months` array with localized names |
511
+ | `format` | `(date: Date) => string` | — | Function to format the date for display; defaults to `'YYYY-MM-DD'` |
512
+ | `onSelect` | `(date: Date \| DateRange) => void` | — | Callback when a date is selected |
513
+
514
+ ### Tree Component
515
+
516
+ The TreeComponent renders hierarchical data as an expandable/collapsible tree. Supports file/folder icons, selection, and programmatic expand/collapse.
517
+
518
+ #### TreeComponent Parameters
519
+
520
+ | Parameter | Type | Description |
521
+ |---|---|---|
522
+ | `container` | HTMLElement \| string | The container element |
523
+ | `data` | TreeNode[] | An array of TreeNodes to render |
524
+ | `selectedNode` | TreeNode \| null | The currently selected TreeNode |
525
+
526
+ #### TreeNode
527
+
528
+ | Parameter | Type | Description |
529
+ |---|---|---|
530
+ | `label` | string | The label of the TreeNode |
531
+ | `type` | NodeType | The type of the TreeNode: `'file'` \| `'folder'` |
532
+ | `children` | TreeNode[] | An array of child TreeNodes |
533
+
534
+ ### File Uploader
535
+
536
+ The FileUploader component provides drag-and-drop file upload functionality with progress indication. Supports file validation (size, type), multiple files, and upload cancellation.
537
+
538
+ ### Virtual Dropdown
539
+
540
+ Virtual Dropdown is a performant, virtualized dropdown component that efficiently renders large option lists by only drawing visible items in the DOM. Supports single and multi-select modes, built-in search/filtering, keyboard navigation, and configurable item height and render limits — making it ideal for scenarios with hundreds or thousands of selectable options.
541
+
542
+ ### Group Picker
543
+
544
+ The GroupPicker component enables hierarchical group and subgroup selection. Users can either select an entire parent group (covering all subgroups) or pick individual subgroups. Groups without children are directly selectable. Selecting all subgroups automatically promotes to a parent selection. Includes debounced search with match highlighting, expand/collapse, and a chip-based selection summary.
545
+
546
+ ``` html
547
+ <div id="group-picker-demo"></div>
548
+ ```
549
+
550
+ ``` js
551
+ const data: GroupData[] = [
552
+ {
553
+ id: 'gruppenspiele', label: 'Gruppenspiele',
554
+ subgroups: [
555
+ { id: 'grossgruppe', label: 'Grossgruppenspiele' },
556
+ { id: 'trinkspiele', label: 'Trinkspiele' },
557
+ ]
558
+ },
559
+ { id: 'schach', label: 'Schach' }, // no subgroups — directly selectable
560
+ ];
561
+
562
+ const picker = new GroupPicker('#group-picker-demo', data, {
563
+ onSelectionChange: (selection) => console.log(selection),
564
+ });
565
+ ```
566
+
567
+ #### GroupData
568
+
569
+ | Property | Type | Description |
570
+ |---|---|---|
571
+ | `id` | string | Unique identifier for the group |
572
+ | `label` | string | Display name |
573
+ | `subgroups` | SubgroupData[] | Optional array of `{ id, label }` child items |
574
+
575
+ #### GroupPickerOptions
576
+
577
+ | Option | Type | Default | Description |
578
+ |---|---|---|---|
579
+ | `onSelectionChange` | function | — | Callback fired on selection change with `GroupPickerSelection` |
580
+ | `searchPlaceholder` | string | `'Gruppen durchsuchen...'` | Placeholder text for the search input |
581
+ | `selectAllLabel` | string | `'Alle'` | Label for the select-all button |
582
+ | `deselectLabel` | string | `'Abwahlen'` | Label shown when a parent group is selected |
583
+ | `emptyLabel` | string | `'Keine Ergebnisse'` | Shown when search yields no results |
584
+ | `selectionPlaceholder` | string | `'Noch keine Auswahl getroffen'` | Placeholder in the selection summary area |
585
+
586
+ #### Public API
587
+
588
+ | Method | Description |
589
+ |---|---|
590
+ | `getSelection()` | Returns `{ parentGroups: string[], subgroups: { groupId, subgroupId }[] }` |
591
+ | `setSelection(selection)` | Programmatically set the selection state |
592
+ | `clearSelection()` | Clear all selections |
593
+ | `expandAll()` | Expand all groups |
594
+ | `collapseAll()` | Collapse all groups |
595
+ | `destroy()` | Remove event listeners and clear the DOM |
596
+
597
+ ### Custom Scrollbar
598
+
599
+ The Scrollbar component creates custom-styled scrollbars. Supports pointer/touch dragging, track clicking, and automatic thumb sizing. Can be used with any class.
600
+
601
+ ``` html
602
+ <div class="scroll-container" style="height: 100px">
603
+ <div class="viewport">
604
+ <div class="content">...</div>
605
+ <div class="scrollbar" aria-hidden="true">
606
+ <div class="track">
607
+ <div class="thumb" role="presentation" aria-hidden="true"></div>
608
+ </div>
609
+ </div>
610
+ </div>
611
+ </div>
612
+ ```
613
+
614
+ ### Chat Bubbles
615
+
616
+ The Chat Bubbles component styles messaging interfaces.
617
+
618
+ ``` html
619
+ <div class="chat-container">
620
+ <div class="message message-incoming">
621
+ Hello!
622
+ <span class="message-meta">10:42 AM</span>
623
+ </div>
624
+ <div class="message message-outgoing">
625
+ Hi there!
626
+ <span class="message-meta">10:43 AM</span>
627
+ </div>
628
+ </div>
629
+ ```
630
+
631
+ ### Carousel
632
+
633
+ The Carousel component creates image/content sliders with navigation buttons and dot indicators. Supports loop mode, autoplay, and touch/swipe gestures.
634
+
635
+ ``` html
636
+ <div class="carousel" id="carouselIdHere">
637
+ <div>Slide 1</div>
638
+ <div>Slide 2</div>
639
+ <div>Slide 3</div>
640
+ </div>
641
+ ```
642
+
643
+ ### Gallery
644
+
645
+ A responsive, infinite-scroll masonry gallery that dynamically arranges image cards into columns. The layout automatically adapts to the viewport width, redistributing items into the shortest column for a balanced, Pinterest-style grid. Cards feature lazy-loaded images with a smooth fade-in effect, titles, and descriptions. Scroll to the bottom to load more content — fetching can be throttled with a configurable reload limit to prevent runaway requests.
646
+
647
+ #### Constructor Parameters
648
+
649
+ | Parameter | Type | Description |
650
+ |---|---|---|
651
+ | `containerId` | string | The `id` of the HTML element that will serve as the gallery container. Throws an error if not found in the DOM. |
652
+ | `options` | MasonryGalleryOptions | Optional configuration object to customise the gallery's layout and behaviour. Defaults to `{}`. |
653
+
654
+ #### MasonryGalleryOptions
655
+
656
+ | Option | Type | Default | Description |
657
+ |---|---|---|---|
658
+ | `minColumnWidth` | number | `250` | Minimum width (in pixels) for each masonry column. The number of columns is calculated by dividing the available container width by this value. |
659
+ | `scrollThreshold` | number | `100` | Distance from the bottom of the page (in pixels) at which the next batch of images is fetched. |
660
+ | `loaderSelector` | string | `'.loader'` | CSS selector for the loading-indicator element. Shown/hidden automatically during fetch cycles via a `hidden` class toggle. |
661
+ | `reload` | number | `2` | Maximum number of times new images can be fetched via infinite scroll. Once the limit is reached, further scroll events are ignored. |
662
+ | `fetchFunction` | `Promise<ImageData[]>` | — | A promise that resolves to an array of `ImageData` objects (`{ src, title, desc }`). Required in practice — the built-in fallback throws an error. |
663
+
664
+ ---
665
+
666
+ ## Utilities
667
+
668
+ ### Theme Toggle
669
+
670
+ The Theme component manages light/dark mode switching. Persists preference to localStorage, respects system preference, and supports keyboard shortcut (Ctrl/Cmd+J). Any element with id `theme-toggle` can work as a switch.
671
+
672
+ ### Scroll Utility
673
+
674
+ The Scroll utility allows to scroll to elements in the DOM. You can scroll to any class or id element.
675
+
676
+ ``` js
677
+ window.Scroll.to('#my-element');
678
+ ```
679
+
680
+ ---
681
+
682
+ ## How to Run Locally
683
+
684
+ Building is only necessary if you want to make changes to files. Otherwise, docker is enough.
685
+
686
+ ```bash
687
+ # Docker
688
+ docker compose up -d
689
+ # → http://localhost:8082
690
+
691
+ # Compile TypeScript
692
+ # One-time compilation (all .ts files in js/)
693
+ npx tsc -p js/tsconfig.json
694
+ # Watch mode (auto-recompile on changes)
695
+ npx tsc -p js/tsconfig.json --watch
696
+ # Or use the shorter alias:
697
+ tsc -p js/tsconfig.json -w
698
+
699
+ # Compile SCSS to CSS
700
+ # Install sass first: npm install -g sass
701
+ sass css:css
702
+ # Or with watch mode:
703
+ sass --watch css:css
704
+ # Or compile + minify the main bundle:
705
+ sass --style=compressed css/style.scss css/style.min.css
706
+ ```