@dodlhuat/basix 1.0.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 (430) hide show
  1. package/README.md +482 -0
  2. package/css/accordion.css +109 -0
  3. package/css/accordion.css.map +1 -0
  4. package/css/accordion.scss +78 -0
  5. package/css/alert.css +57 -0
  6. package/css/alert.css.map +1 -0
  7. package/css/alert.scss +86 -0
  8. package/css/button.css +69 -0
  9. package/css/button.css.map +1 -0
  10. package/css/button.scss +102 -0
  11. package/css/card.css +144 -0
  12. package/css/card.css.map +1 -0
  13. package/css/card.scss +66 -0
  14. package/css/carousel.css +118 -0
  15. package/css/carousel.css.map +1 -0
  16. package/css/carousel.scss +87 -0
  17. package/css/chart.css +159 -0
  18. package/css/chart.css.map +1 -0
  19. package/css/chart.scss +159 -0
  20. package/css/chat-bubbles.css +97 -0
  21. package/css/chat-bubbles.css.map +1 -0
  22. package/css/chat-bubbles.scss +68 -0
  23. package/css/checkbox.css +77 -0
  24. package/css/checkbox.css.map +1 -0
  25. package/css/checkbox.scss +55 -0
  26. package/css/chips.css +72 -0
  27. package/css/chips.css.map +1 -0
  28. package/css/chips.scss +52 -0
  29. package/css/code-viewer.css +97 -0
  30. package/css/code-viewer.css.map +1 -0
  31. package/css/code-viewer.scss +98 -0
  32. package/css/colors.css +63 -0
  33. package/css/colors.css.map +1 -0
  34. package/css/colors.scss +33 -0
  35. package/css/datepicker.css +264 -0
  36. package/css/datepicker.css.map +1 -0
  37. package/css/datepicker.scss +317 -0
  38. package/css/defaults.css +118 -0
  39. package/css/defaults.css.map +1 -0
  40. package/css/defaults.scss +91 -0
  41. package/css/dropdown.css +146 -0
  42. package/css/dropdown.css.map +1 -0
  43. package/css/dropdown.scss +137 -0
  44. package/css/editor.css +413 -0
  45. package/css/editor.scss +458 -0
  46. package/css/file-uploader.css +194 -0
  47. package/css/file-uploader.css.map +1 -0
  48. package/css/file-uploader.scss +195 -0
  49. package/css/flyout-menu.css +345 -0
  50. package/css/flyout-menu.css.map +1 -0
  51. package/css/flyout-menu.scss +355 -0
  52. package/css/form-builder.css +9 -0
  53. package/css/form-builder.css.map +1 -0
  54. package/css/form-builder.scss +11 -0
  55. package/css/form.css +130 -0
  56. package/css/form.css.map +1 -0
  57. package/css/form.scss +115 -0
  58. package/css/gallery.css +91 -0
  59. package/css/gallery.css.map +1 -0
  60. package/css/gallery.scss +63 -0
  61. package/css/grid.css +44 -0
  62. package/css/grid.css.map +1 -0
  63. package/css/grid.scss +41 -0
  64. package/css/guitar-chords.css +251 -0
  65. package/css/icons.css +327 -0
  66. package/css/icons.css.map +1 -0
  67. package/css/icons.scss +331 -0
  68. package/css/modal.css +97 -0
  69. package/css/modal.css.map +1 -0
  70. package/css/modal.scss +72 -0
  71. package/css/parameters.css +1 -0
  72. package/css/parameters.css.map +1 -0
  73. package/css/parameters.scss +4 -0
  74. package/css/placeholder.css +50 -0
  75. package/css/placeholder.css.map +1 -0
  76. package/css/placeholder.scss +28 -0
  77. package/css/progress.css +51 -0
  78. package/css/progress.css.map +1 -0
  79. package/css/progress.scss +32 -0
  80. package/css/properties.css +31 -0
  81. package/css/properties.css.map +1 -0
  82. package/css/properties.scss +31 -0
  83. package/css/push-menu.css +145 -0
  84. package/css/push-menu.css.map +1 -0
  85. package/css/push-menu.scss +127 -0
  86. package/css/radiobutton.css +91 -0
  87. package/css/radiobutton.css.map +1 -0
  88. package/css/radiobutton.scss +64 -0
  89. package/css/reset.css +46 -0
  90. package/css/reset.css.map +1 -0
  91. package/css/reset.scss +40 -0
  92. package/css/scrollbar.css +91 -0
  93. package/css/scrollbar.css.map +1 -0
  94. package/css/scrollbar.scss +69 -0
  95. package/css/spinner.css +118 -0
  96. package/css/spinner.css.map +1 -0
  97. package/css/spinner.scss +91 -0
  98. package/css/style.css +3735 -0
  99. package/css/style.css.map +1 -0
  100. package/css/style.min.css +1 -0
  101. package/css/style.scss +38 -0
  102. package/css/switch.css +66 -0
  103. package/css/switch.css.map +1 -0
  104. package/css/switch.scss +42 -0
  105. package/css/table.css +201 -0
  106. package/css/table.css.map +1 -0
  107. package/css/table.scss +178 -0
  108. package/css/tabs.css +135 -0
  109. package/css/tabs.css.map +1 -0
  110. package/css/tabs.scss +118 -0
  111. package/css/timeline.css +69 -0
  112. package/css/timeline.css.map +1 -0
  113. package/css/timeline.scss +69 -0
  114. package/css/timepicker.scss +72 -0
  115. package/css/toast.css +98 -0
  116. package/css/toast.css.map +1 -0
  117. package/css/toast.scss +81 -0
  118. package/css/tooltip.css +151 -0
  119. package/css/tooltip.css.map +1 -0
  120. package/css/tooltip.scss +122 -0
  121. package/css/tree.css +199 -0
  122. package/css/tree.css.map +1 -0
  123. package/css/tree.scss +192 -0
  124. package/css/typography.css +137 -0
  125. package/css/typography.css.map +1 -0
  126. package/css/typography.scss +100 -0
  127. package/css/virtual-dropdown.css +149 -0
  128. package/css/virtual-dropdown.css.map +1 -0
  129. package/css/virtual-dropdown.scss +142 -0
  130. package/fonts/MaterialSymbolsOutlined.woff2 +0 -0
  131. package/fonts/Outfit-VariableFont_wght.woff +0 -0
  132. package/fonts/Outfit-VariableFont_wght.woff2 +0 -0
  133. package/fonts/material-icons.woff2 +0 -0
  134. package/icons/activity-outline.svg +1 -0
  135. package/icons/alert-circle-outline.svg +1 -0
  136. package/icons/alert-triangle-outline.svg +1 -0
  137. package/icons/archive-outline.svg +1 -0
  138. package/icons/arrow-back-outline.svg +1 -0
  139. package/icons/arrow-circle-down-outline.svg +1 -0
  140. package/icons/arrow-circle-left-outline.svg +1 -0
  141. package/icons/arrow-circle-right-outline.svg +1 -0
  142. package/icons/arrow-circle-up-outline.svg +1 -0
  143. package/icons/arrow-down-outline.svg +1 -0
  144. package/icons/arrow-downward-outline.svg +1 -0
  145. package/icons/arrow-forward-outline.svg +1 -0
  146. package/icons/arrow-ios-back-outline.svg +1 -0
  147. package/icons/arrow-ios-downward-outline.svg +1 -0
  148. package/icons/arrow-ios-forward-outline.svg +1 -0
  149. package/icons/arrow-ios-upward-outline.svg +1 -0
  150. package/icons/arrow-left-outline.svg +1 -0
  151. package/icons/arrow-right-outline.svg +1 -0
  152. package/icons/arrow-up-outline.svg +1 -0
  153. package/icons/arrow-upward-outline.svg +1 -0
  154. package/icons/arrowhead-down-outline.svg +1 -0
  155. package/icons/arrowhead-left-outline.svg +1 -0
  156. package/icons/arrowhead-right-outline.svg +1 -0
  157. package/icons/arrowhead-up-outline.svg +1 -0
  158. package/icons/at-outline.svg +1 -0
  159. package/icons/attach-2-outline.svg +1 -0
  160. package/icons/attach-outline.svg +1 -0
  161. package/icons/award-outline.svg +1 -0
  162. package/icons/backspace-outline.svg +1 -0
  163. package/icons/bar-chart-2-outline.svg +1 -0
  164. package/icons/bar-chart-outline.svg +1 -0
  165. package/icons/battery-outline.svg +1 -0
  166. package/icons/behance-outline.svg +1 -0
  167. package/icons/bell-off-outline.svg +1 -0
  168. package/icons/bell-outline.svg +1 -0
  169. package/icons/bluetooth-outline.svg +1 -0
  170. package/icons/book-open-outline.svg +1 -0
  171. package/icons/book-outline.svg +1 -0
  172. package/icons/bookmark-outline.svg +1 -0
  173. package/icons/briefcase-outline.svg +1 -0
  174. package/icons/browser-outline.svg +1 -0
  175. package/icons/brush-outline.svg +1 -0
  176. package/icons/bulb-outline.svg +1 -0
  177. package/icons/calendar-outline.svg +1 -0
  178. package/icons/camera-outline.svg +1 -0
  179. package/icons/car-outline.svg +1 -0
  180. package/icons/cast-outline.svg +1 -0
  181. package/icons/charging-outline.svg +1 -0
  182. package/icons/checkmark-circle-2-outline.svg +1 -0
  183. package/icons/checkmark-circle-outline.svg +1 -0
  184. package/icons/checkmark-outline.svg +1 -0
  185. package/icons/checkmark-square-2-outline.svg +1 -0
  186. package/icons/checkmark-square-outline.svg +1 -0
  187. package/icons/chevron-down-outline.svg +1 -0
  188. package/icons/chevron-left-outline.svg +1 -0
  189. package/icons/chevron-right-outline.svg +1 -0
  190. package/icons/chevron-up-outline.svg +1 -0
  191. package/icons/clipboard-outline.svg +1 -0
  192. package/icons/clock-outline.svg +1 -0
  193. package/icons/close-circle-outline.svg +1 -0
  194. package/icons/close-outline.svg +1 -0
  195. package/icons/close-square-outline.svg +1 -0
  196. package/icons/cloud-download-outline.svg +1 -0
  197. package/icons/cloud-upload-outline.svg +1 -0
  198. package/icons/code-download-outline.svg +1 -0
  199. package/icons/code-outline.svg +1 -0
  200. package/icons/collapse-outline.svg +1 -0
  201. package/icons/color-palette-outline.svg +1 -0
  202. package/icons/color-picker-outline.svg +1 -0
  203. package/icons/compass-outline.svg +1 -0
  204. package/icons/copy-outline.svg +1 -0
  205. package/icons/corner-down-left-outline.svg +1 -0
  206. package/icons/corner-down-right-outline.svg +1 -0
  207. package/icons/corner-left-down-outline.svg +1 -0
  208. package/icons/corner-left-up-outline.svg +1 -0
  209. package/icons/corner-right-down-outline.svg +1 -0
  210. package/icons/corner-right-up-outline.svg +1 -0
  211. package/icons/corner-up-left-outline.svg +1 -0
  212. package/icons/corner-up-right-outline.svg +1 -0
  213. package/icons/credit-card-outline.svg +1 -0
  214. package/icons/crop-outline.svg +1 -0
  215. package/icons/cube-outline.svg +1 -0
  216. package/icons/diagonal-arrow-left-down-outline.svg +1 -0
  217. package/icons/diagonal-arrow-left-up-outline.svg +1 -0
  218. package/icons/diagonal-arrow-right-down-outline.svg +1 -0
  219. package/icons/diagonal-arrow-right-up-outline.svg +1 -0
  220. package/icons/done-all-outline.svg +1 -0
  221. package/icons/download-outline.svg +1 -0
  222. package/icons/droplet-off-outline.svg +1 -0
  223. package/icons/droplet-outline.svg +1 -0
  224. package/icons/edit-2-outline.svg +1 -0
  225. package/icons/edit-outline.svg +1 -0
  226. package/icons/email-outline.svg +1 -0
  227. package/icons/expand-outline.svg +1 -0
  228. package/icons/external-link-outline.svg +1 -0
  229. package/icons/eye-off-2-outline.svg +1 -0
  230. package/icons/eye-off-outline.svg +1 -0
  231. package/icons/eye-outline.svg +1 -0
  232. package/icons/facebook-outline.svg +1 -0
  233. package/icons/file-add-outline.svg +1 -0
  234. package/icons/file-outline.svg +1 -0
  235. package/icons/file-remove-outline.svg +1 -0
  236. package/icons/file-text-outline.svg +1 -0
  237. package/icons/film-outline.svg +1 -0
  238. package/icons/flag-outline.svg +1 -0
  239. package/icons/flash-off-outline.svg +1 -0
  240. package/icons/flash-outline.svg +1 -0
  241. package/icons/flip-2-outline.svg +1 -0
  242. package/icons/flip-outline.svg +1 -0
  243. package/icons/folder-add-outline.svg +1 -0
  244. package/icons/folder-outline.svg +1 -0
  245. package/icons/folder-remove-outline.svg +1 -0
  246. package/icons/funnel-outline.svg +1 -0
  247. package/icons/gift-outline.svg +1 -0
  248. package/icons/github-outline.svg +1 -0
  249. package/icons/globe-2-outline.svg +1 -0
  250. package/icons/globe-outline.svg +1 -0
  251. package/icons/google-outline.svg +1 -0
  252. package/icons/grid-outline.svg +1 -0
  253. package/icons/hard-drive-outline.svg +1 -0
  254. package/icons/hash-outline.svg +1 -0
  255. package/icons/headphones-outline.svg +1 -0
  256. package/icons/heart-outline.svg +1 -0
  257. package/icons/home-outline.svg +1 -0
  258. package/icons/image-outline.svg +1 -0
  259. package/icons/inbox-outline.svg +1 -0
  260. package/icons/info-outline.svg +1 -0
  261. package/icons/keypad-outline.svg +1 -0
  262. package/icons/layers-outline.svg +1 -0
  263. package/icons/layout-outline.svg +1 -0
  264. package/icons/link-2-outline.svg +1 -0
  265. package/icons/link-outline.svg +1 -0
  266. package/icons/linkedin-outline.svg +1 -0
  267. package/icons/list-outline.svg +1 -0
  268. package/icons/loader-outline.svg +1 -0
  269. package/icons/lock-outline.svg +1 -0
  270. package/icons/log-in-outline.svg +1 -0
  271. package/icons/log-out-outline.svg +1 -0
  272. package/icons/map-outline.svg +1 -0
  273. package/icons/maximize-outline.svg +1 -0
  274. package/icons/menu-2-outline.svg +1 -0
  275. package/icons/menu-arrow-outline.svg +1 -0
  276. package/icons/menu-outline.svg +1 -0
  277. package/icons/message-circle-outline.svg +1 -0
  278. package/icons/message-square-outline.svg +1 -0
  279. package/icons/mic-off-outline.svg +1 -0
  280. package/icons/mic-outline.svg +1 -0
  281. package/icons/minimize-outline.svg +1 -0
  282. package/icons/minus-circle-outline.svg +1 -0
  283. package/icons/minus-outline.svg +1 -0
  284. package/icons/minus-square-outline.svg +1 -0
  285. package/icons/monitor-outline.svg +1 -0
  286. package/icons/moon-outline.svg +1 -0
  287. package/icons/more-horizontal-outline.svg +1 -0
  288. package/icons/more-vertical-outline.svg +1 -0
  289. package/icons/move-outline.svg +1 -0
  290. package/icons/music-outline.svg +1 -0
  291. package/icons/navigation-2-outline.svg +1 -0
  292. package/icons/navigation-outline.svg +1 -0
  293. package/icons/npm-outline.svg +1 -0
  294. package/icons/options-2-outline.svg +1 -0
  295. package/icons/options-outline.svg +1 -0
  296. package/icons/pantone-outline.svg +1 -0
  297. package/icons/paper-plane-outline.svg +1 -0
  298. package/icons/pause-circle-outline.svg +1 -0
  299. package/icons/people-outline.svg +1 -0
  300. package/icons/percent-outline.svg +1 -0
  301. package/icons/person-add-outline.svg +1 -0
  302. package/icons/person-delete-outline.svg +1 -0
  303. package/icons/person-done-outline.svg +1 -0
  304. package/icons/person-outline.svg +1 -0
  305. package/icons/person-remove-outline.svg +1 -0
  306. package/icons/phone-call-outline.svg +1 -0
  307. package/icons/phone-missed-outline.svg +1 -0
  308. package/icons/phone-off-outline.svg +1 -0
  309. package/icons/phone-outline.svg +1 -0
  310. package/icons/pie-chart-outline.svg +1 -0
  311. package/icons/pin-outline.svg +1 -0
  312. package/icons/play-circle-outline.svg +1 -0
  313. package/icons/plus-circle-outline.svg +1 -0
  314. package/icons/plus-outline.svg +1 -0
  315. package/icons/plus-square-outline.svg +1 -0
  316. package/icons/power-outline.svg +1 -0
  317. package/icons/pricetags-outline.svg +1 -0
  318. package/icons/printer-outline.svg +1 -0
  319. package/icons/question-mark-circle-outline.svg +1 -0
  320. package/icons/question-mark-outline.svg +1 -0
  321. package/icons/radio-button-off-outline.svg +1 -0
  322. package/icons/radio-button-on-outline.svg +1 -0
  323. package/icons/radio-outline.svg +1 -0
  324. package/icons/recording-outline.svg +1 -0
  325. package/icons/refresh-outline.svg +1 -0
  326. package/icons/repeat-outline.svg +1 -0
  327. package/icons/rewind-left-outline.svg +1 -0
  328. package/icons/rewind-right-outline.svg +1 -0
  329. package/icons/save-outline.svg +1 -0
  330. package/icons/scissors-outline.svg +1 -0
  331. package/icons/search-outline.svg +1 -0
  332. package/icons/settings-2-outline.svg +1 -0
  333. package/icons/settings-outline.svg +1 -0
  334. package/icons/shake-outline.svg +1 -0
  335. package/icons/share-outline.svg +1 -0
  336. package/icons/shield-off-outline.svg +1 -0
  337. package/icons/shield-outline.svg +1 -0
  338. package/icons/shopping-bag-outline.svg +1 -0
  339. package/icons/shopping-cart-outline.svg +1 -0
  340. package/icons/shuffle-2-outline.svg +1 -0
  341. package/icons/shuffle-outline.svg +1 -0
  342. package/icons/skip-back-outline.svg +1 -0
  343. package/icons/skip-forward-outline.svg +1 -0
  344. package/icons/slash-outline.svg +1 -0
  345. package/icons/smartphone-outline.svg +1 -0
  346. package/icons/smiling-face-outline.svg +1 -0
  347. package/icons/speaker-outline.svg +1 -0
  348. package/icons/square-outline.svg +1 -0
  349. package/icons/star-outline.svg +1 -0
  350. package/icons/stop-circle-outline.svg +1 -0
  351. package/icons/sun-outline.svg +1 -0
  352. package/icons/swap-outline.svg +1 -0
  353. package/icons/sync-outline.svg +1 -0
  354. package/icons/text-outline.svg +1 -0
  355. package/icons/thermometer-minus-outline.svg +1 -0
  356. package/icons/thermometer-outline.svg +1 -0
  357. package/icons/thermometer-plus-outline.svg +1 -0
  358. package/icons/toggle-left-outline.svg +1 -0
  359. package/icons/toggle-right-outline.svg +1 -0
  360. package/icons/trash-2-outline.svg +1 -0
  361. package/icons/trash-outline.svg +1 -0
  362. package/icons/trending-down-outline.svg +1 -0
  363. package/icons/trending-up-outline.svg +1 -0
  364. package/icons/tv-outline.svg +1 -0
  365. package/icons/twitter-outline.svg +1 -0
  366. package/icons/umbrella-outline.svg +1 -0
  367. package/icons/undo-outline.svg +1 -0
  368. package/icons/unlock-outline.svg +1 -0
  369. package/icons/upload-outline.svg +1 -0
  370. package/icons/video-off-outline.svg +1 -0
  371. package/icons/video-outline.svg +1 -0
  372. package/icons/volume-down-outline.svg +1 -0
  373. package/icons/volume-mute-outline.svg +1 -0
  374. package/icons/volume-off-outline.svg +1 -0
  375. package/icons/volume-up-outline.svg +1 -0
  376. package/icons/wifi-off-outline.svg +1 -0
  377. package/icons/wifi-outline.svg +1 -0
  378. package/js/carousel.js +133 -0
  379. package/js/carousel.ts +173 -0
  380. package/js/chart.js +257 -0
  381. package/js/code-viewer.js +148 -0
  382. package/js/code-viewer.ts +188 -0
  383. package/js/datepicker.js +497 -0
  384. package/js/datepicker.ts +619 -0
  385. package/js/dropdown.js +122 -0
  386. package/js/dropdown.ts +180 -0
  387. package/js/editor.js +421 -0
  388. package/js/editor.ts +426 -0
  389. package/js/file-uploader.js +268 -0
  390. package/js/file-uploader.ts +350 -0
  391. package/js/flyout-menu.js +195 -0
  392. package/js/flyout-menu.ts +250 -0
  393. package/js/form-builder.js +107 -0
  394. package/js/gallery.js +177 -0
  395. package/js/gallery.ts +231 -0
  396. package/js/guitar-chords.js +268 -0
  397. package/js/index.js +720 -0
  398. package/js/index.ts +874 -0
  399. package/js/lazy-loader.js +121 -0
  400. package/js/modal.js +113 -0
  401. package/js/modal.ts +167 -0
  402. package/js/push-menu.js +101 -0
  403. package/js/push-menu.ts +130 -0
  404. package/js/request.js +51 -0
  405. package/js/scroll.js +27 -0
  406. package/js/scroll.ts +47 -0
  407. package/js/scrollbar.js +219 -0
  408. package/js/scrollbar.ts +308 -0
  409. package/js/select.js +158 -0
  410. package/js/select.ts +217 -0
  411. package/js/table.js +359 -0
  412. package/js/table.ts +453 -0
  413. package/js/tabs.js +225 -0
  414. package/js/tabs.ts +280 -0
  415. package/js/theme.js +194 -0
  416. package/js/theme.ts +225 -0
  417. package/js/timepicker.js +98 -0
  418. package/js/timepicker.ts +131 -0
  419. package/js/toast.js +93 -0
  420. package/js/toast.ts +138 -0
  421. package/js/tooltip.js +193 -0
  422. package/js/tooltip.ts +252 -0
  423. package/js/tree.js +162 -0
  424. package/js/tree.ts +218 -0
  425. package/js/tsconfig.json +18 -0
  426. package/js/utils.js +69 -0
  427. package/js/utils.ts +84 -0
  428. package/js/virtual-dropdown.js +277 -0
  429. package/js/virtual-dropdown.ts +366 -0
  430. package/package.json +38 -0
package/README.md ADDED
@@ -0,0 +1,482 @@
1
+ # Basix 1.0.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
+ ```
@@ -0,0 +1,109 @@
1
+ :root {
2
+ --primary-text: #1E1F24;
3
+ --secondary-text: #62636C;
4
+ --divider: #D8D9E0;
5
+ --accent-text: #3D63DD;
6
+ --error: #D64545;
7
+ --warning: #C28A00;
8
+ --success: #2E8B57;
9
+ --secondary-background: #E7E8EC;
10
+ --background: #F9F9FB;
11
+ --accent-color: #3D63DD;
12
+ --accent-color-lighten: #87A5EF;
13
+ --accent-color-text: #D8D9E0;
14
+ --disabled: #D8D9E0;
15
+ }
16
+
17
+ [data-theme=dark] {
18
+ --primary-text: #EEEEF0;
19
+ --secondary-text: #B2B3BD;
20
+ --divider: #393A40;
21
+ --accent-text: #0E496D;
22
+ --error: #FF6B6B;
23
+ --warning: #F7B500;
24
+ --success: #5CC689;
25
+ --background: #111113;
26
+ --secondary-background: #19191B;
27
+ --accent-color: #1B7BB4;
28
+ --accent-color-lighten: #175982;
29
+ --accent-color-text: #B2B3BD;
30
+ --disabled: #303136;
31
+ }
32
+
33
+ .accordion {
34
+ margin: 0 auto;
35
+ border: 1px solid var(--divider);
36
+ border-radius: 0.4rem;
37
+ overflow: hidden;
38
+ box-shadow: 0 1px 2px rgba(56, 65, 74, 0.15);
39
+ }
40
+
41
+ .accordion-item {
42
+ border-bottom: 1px solid var(--divider);
43
+ }
44
+
45
+ .accordion-item:last-child {
46
+ border-bottom: none;
47
+ }
48
+
49
+ .accordion-input {
50
+ display: none;
51
+ }
52
+
53
+ .accordion-label {
54
+ display: flex;
55
+ justify-content: space-between;
56
+ align-items: center;
57
+ padding: 1rem 1.5rem;
58
+ background: var(--divider);
59
+ font-weight: 600;
60
+ cursor: pointer;
61
+ transition: background-color 0.2s ease;
62
+ -webkit-user-select: none;
63
+ -moz-user-select: none;
64
+ user-select: none;
65
+ }
66
+
67
+ .accordion-label:hover {
68
+ background: var(--accent-color-lighten);
69
+ }
70
+
71
+ .accordion-label::after {
72
+ content: "";
73
+ width: 10px;
74
+ height: 10px;
75
+ border-right: 2px solid currentColor;
76
+ border-bottom: 2px solid currentColor;
77
+ transform: rotate(45deg);
78
+ transition: transform 0.3s ease;
79
+ margin-left: 1rem;
80
+ }
81
+
82
+ .accordion-input:checked + .accordion-label {
83
+ background: var(--accent-color);
84
+ color: var(--acc-accent);
85
+ }
86
+
87
+ .accordion-input:checked + .accordion-label::after {
88
+ transform: rotate(-135deg);
89
+ }
90
+
91
+ .accordion-content {
92
+ display: grid;
93
+ grid-template-rows: 0fr;
94
+ transition: grid-template-rows 0.3s ease-out;
95
+ overflow: hidden;
96
+ }
97
+
98
+ .accordion-body {
99
+ min-height: 0;
100
+ }
101
+
102
+ .accordion-body > div {
103
+ padding: 1.5rem;
104
+ border-top: 1px solid transparent;
105
+ }
106
+
107
+ .accordion-input:checked ~ .accordion-content {
108
+ grid-template-rows: 1fr;
109
+ }/*# sourceMappingURL=accordion.css.map */
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["properties.scss","accordion.css","accordion.scss","parameters.scss"],"names":[],"mappings":"AAAA;EACE,uBAAA;EACA,yBAAA;EACA,kBAAA;EACA,sBAAA;EACA,gBAAA;EACA,kBAAA;EACA,kBAAA;EACA,+BAAA;EACA,qBAAA;EACA,uBAAA;EACA,+BAAA;EACA,4BAAA;EACA,mBAAA;ACCF;;ADEA;EACE,uBAAA;EACA,yBAAA;EACA,kBAAA;EACA,sBAAA;EACA,gBAAA;EACA,kBAAA;EACA,kBAAA;EACA,qBAAA;EACA,+BAAA;EACA,uBAAA;EACA,+BAAA;EACA,4BAAA;EACA,mBAAA;ACCF;;AC3BA;EACE,cAAA;EACA,gCAAA;EACA,qBCLc;EDMd,gBAAA;EACA,4CCLO;AFmCT;;AC3BA;EACE,uCAAA;AD8BF;;AC3BA;EACE,mBAAA;AD8BF;;AC3BA;EACE,aAAA;AD8BF;;AC3BA;EACE,aAAA;EACA,8BAAA;EACA,mBAAA;EACA,oBAAA;EACA,0BAAA;EACA,gBAAA;EACA,eAAA;EACA,sCAAA;EACA,yBAAA;KAAA,sBAAA;UAAA,iBAAA;AD8BF;;AC3BA;EACE,uCAAA;AD8BF;;AC3BA;EACE,WAAA;EACA,WAAA;EACA,YAAA;EACA,oCAAA;EACA,qCAAA;EACA,wBAAA;EACA,+BAAA;EACA,iBC/CQ;AF6EV;;AC3BA;EACE,+BAAA;EACA,wBAAA;AD8BF;;AC3BA;EACE,0BAAA;AD8BF;;AC3BA;EACE,aAAA;EACA,uBAAA;EACA,4CAAA;EACA,gBAAA;AD8BF;;AC3BA;EACE,aAAA;AD8BF;;AC3BA;EACE,eAAA;EACA,iCAAA;AD8BF;;AC3BA;EACE,uBAAA;AD8BF","file":"accordion.css"}
@@ -0,0 +1,78 @@
1
+ @use "properties";
2
+ @use "parameters" as *;
3
+
4
+ .accordion {
5
+ margin: 0 auto;
6
+ border: 1px solid var(--divider);
7
+ border-radius: $border-radius;
8
+ overflow: hidden;
9
+ box-shadow: $shadow;
10
+ }
11
+
12
+ .accordion-item {
13
+ border-bottom: 1px solid var(--divider);
14
+ }
15
+
16
+ .accordion-item:last-child {
17
+ border-bottom: none;
18
+ }
19
+
20
+ .accordion-input {
21
+ display: none;
22
+ }
23
+
24
+ .accordion-label {
25
+ display: flex;
26
+ justify-content: space-between;
27
+ align-items: center;
28
+ padding: $spacing calc($spacing * 1.5);
29
+ background: var(--divider);
30
+ font-weight: 600;
31
+ cursor: pointer;
32
+ transition: background-color 0.2s ease;
33
+ user-select: none;
34
+ }
35
+
36
+ .accordion-label:hover {
37
+ background: var(--accent-color-lighten);
38
+ }
39
+
40
+ .accordion-label::after {
41
+ content: '';
42
+ width: 10px;
43
+ height: 10px;
44
+ border-right: 2px solid currentColor;
45
+ border-bottom: 2px solid currentColor;
46
+ transform: rotate(45deg);
47
+ transition: transform 0.3s ease;
48
+ margin-left: $spacing;
49
+ }
50
+
51
+ .accordion-input:checked + .accordion-label {
52
+ background: var(--accent-color);
53
+ color: var(--acc-accent);
54
+ }
55
+
56
+ .accordion-input:checked + .accordion-label::after {
57
+ transform: rotate(-135deg);
58
+ }
59
+
60
+ .accordion-content {
61
+ display: grid;
62
+ grid-template-rows: 0fr;
63
+ transition: grid-template-rows 0.3s ease-out;
64
+ overflow: hidden;
65
+ }
66
+
67
+ .accordion-body {
68
+ min-height: 0;
69
+ }
70
+
71
+ .accordion-body > div {
72
+ padding: calc($spacing * 1.5);
73
+ border-top: 1px solid transparent;
74
+ }
75
+
76
+ .accordion-input:checked ~ .accordion-content {
77
+ grid-template-rows: 1fr;
78
+ }