@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/js/docs-nav.js ADDED
@@ -0,0 +1,204 @@
1
+ import { SidebarNav } from './sidebar-nav.js';
2
+ import { Scrollbar } from './scrollbar.js';
3
+
4
+ const NAV = [
5
+ {
6
+ label: 'Foundation',
7
+ items: [
8
+ { label: 'Layout & Grid', href: 'foundation/layout.html' },
9
+ { label: 'Typography', href: 'foundation/typography.html' },
10
+ { label: 'Colors & Tokens', href: 'foundation/colors.html' },
11
+ { label: 'Icons', href: 'foundation/icons.html' },
12
+ ],
13
+ },
14
+ {
15
+ label: 'Forms',
16
+ items: [
17
+ { label: 'Inputs & Forms', href: 'forms/inputs.html' },
18
+ { label: 'Date Picker', href: 'forms/datepicker.html' },
19
+ { label: 'Range Slider', href: 'forms/range-slider.html' },
20
+ { label: 'File Uploader', href: 'forms/file-uploader.html' },
21
+ ],
22
+ },
23
+ {
24
+ label: 'Navigation',
25
+ items: [
26
+ { label: 'Push Menu', href: 'navigation/push-menu.html' },
27
+ { label: 'Flyout Menu', href: 'navigation/flyout-menu.html' },
28
+ { label: 'Sidebar Nav', href: 'navigation/sidebar-nav.html' },
29
+ { label: 'Dropdown', href: 'navigation/dropdown.html' },
30
+ { label: 'Tabs', href: 'navigation/tabs.html' },
31
+ { label: 'Breadcrumbs', href: 'navigation/breadcrumbs.html' },
32
+ ],
33
+ },
34
+ {
35
+ label: 'Overlays',
36
+ items: [
37
+ { label: 'Modal', href: 'overlays/modal.html' },
38
+ { label: 'Popover', href: 'overlays/popover.html' },
39
+ { label: 'Tooltip', href: 'overlays/tooltip.html' },
40
+ { label: 'Bottom Sheet', href: 'overlays/bottom-sheet.html' },
41
+ { label: 'Toast', href: 'overlays/toast.html' },
42
+ ],
43
+ },
44
+ {
45
+ label: 'Components',
46
+ items: [
47
+ { label: 'Buttons & Chips', href: 'components/buttons.html' },
48
+ { label: 'Alerts & Badge', href: 'components/alerts.html' },
49
+ { label: 'Accordion', href: 'components/accordion.html' },
50
+ { label: 'Stepper', href: 'components/stepper.html' },
51
+ { label: 'Timeline', href: 'components/timeline.html' },
52
+ { label: 'Progress & Skeleton', href: 'components/progress.html' },
53
+ { label: 'Data Table', href: 'components/table.html' },
54
+ { label: 'Tree', href: 'components/tree.html' },
55
+ { label: 'Carousel', href: 'components/carousel.html' },
56
+ { label: 'Gallery', href: 'components/gallery.html' },
57
+ { label: 'Scrollbar', href: 'components/scrollbar.html' },
58
+ { label: 'Chat Bubbles', href: 'components/chat-bubbles.html' },
59
+ { label: 'Charts', href: 'components/charts.html' },
60
+ { label: 'Group Picker', href: 'components/group-picker.html' },
61
+ { label: 'Virtual Dropdown', href: 'components/virtual-dropdown.html' },
62
+ { label: 'Timespan Picker', href: 'components/timespan-picker.html' },
63
+ { label: 'Rich Text Editor', href: 'components/editor.html' },
64
+ ],
65
+ },
66
+ {
67
+ label: 'Utilities',
68
+ items: [
69
+ { label: 'Theme', href: 'utilities/theme.html' },
70
+ { label: 'Scroll', href: 'utilities/scroll.html' },
71
+ { label: 'Context Menu', href: 'utilities/context-menu.html' },
72
+ ],
73
+ },
74
+ ];
75
+
76
+ class DocsNav {
77
+ constructor() {
78
+ this.currentPath = window.location.pathname;
79
+ // Compute prefix to reach docs/ root from current page.
80
+ // docs/index.html → prefix = ''
81
+ // docs/overlays/foo.html → prefix = '../'
82
+ const segs = this.currentPath.split('/').filter(Boolean);
83
+ const docsIdx = segs.lastIndexOf('docs');
84
+ const depth = docsIdx >= 0 ? segs.length - docsIdx - 1 : 0;
85
+ this.prefix = depth > 1 ? '../'.repeat(depth - 1) : '';
86
+ this.render();
87
+ this.bindMobile();
88
+ }
89
+
90
+ isActive(href) {
91
+ // href is like 'overlays/popover.html' — match against current path
92
+ return this.currentPath.endsWith('/' + href.replace(/^[^/]+\//, '')) &&
93
+ this.currentPath.includes('/' + href.split('/')[0] + '/');
94
+ }
95
+
96
+ render() {
97
+ // Sidebar
98
+ const sidebar = document.getElementById('docs-sidebar');
99
+ if (!sidebar) return;
100
+
101
+ const logoHref = this.prefix ? this.prefix + '../index.html' : '../index.html';
102
+
103
+ sidebar.innerHTML = `
104
+ <a class="docs-sidebar-logo" href="${logoHref}">
105
+ Basix
106
+ <span class="docs-logo-badge">docs</span>
107
+ </a>
108
+ <div class="docs-sidebar-search">
109
+ <input type="search" placeholder="Search…" id="docs-search" autocomplete="off"/>
110
+ </div>
111
+ <div class="scroll-container sidebar-scroll">
112
+ <div class="viewport">
113
+ <div class="content">
114
+ <nav class="docs-nav" aria-label="Documentation navigation">
115
+ <ul>${NAV.map(section => this.renderSection(section)).join('')}</ul>
116
+ </nav>
117
+ </div>
118
+ </div>
119
+ <div class="scrollbar">
120
+ <div class="track">
121
+ <div class="thumb"></div>
122
+ </div>
123
+ </div>
124
+ </div>
125
+ `;
126
+
127
+ new Scrollbar(sidebar.querySelector('.sidebar-scroll'));
128
+
129
+ // Breadcrumb
130
+ this.renderBreadcrumb();
131
+
132
+ // Search
133
+ document.getElementById('docs-search')?.addEventListener('input', e => {
134
+ this.filter(e.target.value);
135
+ });
136
+ }
137
+
138
+ renderSection(section) {
139
+ return `
140
+ <li class="docs-nav-section">
141
+ <div class="docs-nav-section-label">${section.label}</div>
142
+ <ul>
143
+ ${section.items.map(item => this.renderItem(item, section)).join('')}
144
+ </ul>
145
+ </li>`;
146
+ }
147
+
148
+ renderItem(item, section) {
149
+ const active = this.isActive(item.href) ? ' is-active' : '';
150
+ return `
151
+ <li class="docs-nav-item">
152
+ <a href="${this.prefix}${item.href}" class="${active}">${item.label}</a>
153
+ </li>`;
154
+ }
155
+
156
+ renderBreadcrumb() {
157
+ const bc = document.getElementById('docs-breadcrumb');
158
+ if (!bc) return;
159
+
160
+ let activeSection = null;
161
+ let activeItem = null;
162
+ for (const section of NAV) {
163
+ for (const item of section.items) {
164
+ if (this.isActive(item.href)) {
165
+ activeSection = section;
166
+ activeItem = item;
167
+ break;
168
+ }
169
+ }
170
+ if (activeItem) break;
171
+ }
172
+
173
+ if (!activeSection || !activeItem) return;
174
+
175
+ const rootHref = this.prefix ? this.prefix + '../index.html' : '../index.html';
176
+ bc.innerHTML = `
177
+ <a href="${rootHref}">Basix</a>
178
+ <span class="sep">/</span>
179
+ <span>${activeSection.label}</span>
180
+ <span class="sep">/</span>
181
+ <span class="current">${activeItem.label}</span>
182
+ `;
183
+ }
184
+
185
+ filter(query) {
186
+ const q = query.toLowerCase().trim();
187
+ document.querySelectorAll('.docs-nav-item').forEach(item => {
188
+ const label = item.querySelector('a')?.textContent?.toLowerCase() ?? '';
189
+ item.style.display = (!q || label.includes(q)) ? '' : 'none';
190
+ });
191
+ document.querySelectorAll('.docs-nav-section').forEach(section => {
192
+ const visible = [...section.querySelectorAll('.docs-nav-item')]
193
+ .some(i => i.style.display !== 'none');
194
+ section.style.display = (!q || visible) ? '' : 'none';
195
+ });
196
+ }
197
+
198
+ bindMobile() {
199
+ const layout = document.querySelector('.sidebar-layout');
200
+ if (layout) new SidebarNav(layout, { toggleSelector: '#docs-mobile-toggle' });
201
+ }
202
+ }
203
+
204
+ export { DocsNav, NAV };
package/js/dropdown.ts CHANGED
@@ -1,180 +1,180 @@
1
- interface DropdownOptions {
2
- closeOnSelect?: boolean;
3
- allowMultipleOpen?: boolean;
4
- }
5
-
6
- interface DropdownSelectDetail {
7
- text: string;
8
- element: HTMLElement;
9
- }
10
-
11
- class Dropdown {
12
- private container: HTMLElement;
13
- private trigger: HTMLElement;
14
- private menu: HTMLElement;
15
- private options: Required<DropdownOptions>;
16
- private abortController: AbortController;
17
-
18
- constructor(selector: string, options: DropdownOptions = {}) {
19
- const container = document.querySelector<HTMLElement>(selector);
20
-
21
- if (!container) {
22
- console.error(`Dropdown container not found: ${selector}`);
23
- throw new Error(`Dropdown container "${selector}" not found`);
24
- }
25
-
26
- this.container = container;
27
-
28
- const trigger = this.container.querySelector<HTMLElement>('.dropdown-trigger');
29
- const menu = this.container.querySelector<HTMLElement>('.dropdown-menu');
30
-
31
- if (!trigger || !menu) {
32
- throw new Error('Dropdown requires .dropdown-trigger and .dropdown-menu elements');
33
- }
34
-
35
- this.trigger = trigger;
36
- this.menu = menu;
37
-
38
- this.options = {
39
- closeOnSelect: options.closeOnSelect ?? true,
40
- allowMultipleOpen: options.allowMultipleOpen ?? false,
41
- };
42
-
43
- this.abortController = new AbortController();
44
- this.init();
45
- }
46
-
47
- private init(): void {
48
- this.setupItems();
49
- this.attachEventListeners();
50
- }
51
-
52
- private attachEventListeners(): void {
53
- const { signal } = this.abortController;
54
-
55
- // Toggle main dropdown
56
- this.trigger.addEventListener(
57
- 'click',
58
- (e: MouseEvent) => {
59
- e.stopPropagation();
60
- this.toggle();
61
- },
62
- { signal }
63
- );
64
-
65
- // Close when clicking outside
66
- document.addEventListener(
67
- 'click',
68
- (e: MouseEvent) => {
69
- if (!this.container.contains(e.target as Node)) {
70
- this.close();
71
- }
72
- },
73
- { signal }
74
- );
75
-
76
- // Handle item clicks using event delegation
77
- this.menu.addEventListener(
78
- 'click',
79
- (e: MouseEvent) => {
80
- e.stopPropagation();
81
-
82
- const target = e.target as HTMLElement;
83
- const item = target.closest<HTMLElement>('.dropdown-item');
84
-
85
- if (!item) return;
86
-
87
- const li = item.parentElement as HTMLLIElement;
88
- const submenu = li.querySelector<HTMLUListElement>('ul');
89
-
90
- if (submenu) {
91
- this.toggleSubmenu(li);
92
- } else {
93
- this.handleSelection(item);
94
- if (this.options.closeOnSelect) {
95
- this.close();
96
- }
97
- }
98
- },
99
- { signal }
100
- );
101
- }
102
-
103
- private setupItems(): void {
104
- const items = this.menu.querySelectorAll<HTMLElement>('.dropdown-item');
105
-
106
- items.forEach((item) => {
107
- const li = item.parentElement as HTMLLIElement;
108
- if (li.querySelector('ul')) {
109
- item.classList.add('has-children');
110
- }
111
- });
112
- }
113
-
114
- public toggle(): void {
115
- this.container.classList.toggle('active');
116
- }
117
-
118
- public close(): void {
119
- this.container.classList.remove('active');
120
- this.closeAllSubmenus();
121
- }
122
-
123
- public open(): void {
124
- this.container.classList.add('active');
125
- }
126
-
127
- private toggleSubmenu(li: HTMLLIElement): void {
128
- const isOpening = !li.classList.contains('open');
129
-
130
- // Close siblings if not allowing multiple open menus
131
- if (isOpening && !this.options.allowMultipleOpen) {
132
- const parent = li.parentElement;
133
- if (parent) {
134
- const siblings = Array.from(parent.children) as HTMLLIElement[];
135
-
136
- siblings.forEach((sibling) => {
137
- if (sibling !== li && sibling.classList.contains('open')) {
138
- sibling.classList.remove('open');
139
-
140
- // Close deeply nested open items
141
- const deepOpenItems = sibling.querySelectorAll<HTMLLIElement>('.open');
142
- deepOpenItems.forEach((el) => el.classList.remove('open'));
143
- }
144
- });
145
- }
146
- }
147
-
148
- li.classList.toggle('open');
149
- }
150
-
151
- private closeAllSubmenus(): void {
152
- const openItems = this.menu.querySelectorAll<HTMLLIElement>('li.open');
153
- openItems.forEach((item) => item.classList.remove('open'));
154
- }
155
-
156
- private handleSelection(item: HTMLElement): void {
157
- const text = item.textContent?.trim() ?? '';
158
-
159
- // Dispatch custom event with proper typing
160
- const event = new CustomEvent<DropdownSelectDetail>('dropdown-select', {
161
- detail: {
162
- text,
163
- element: item,
164
- },
165
- bubbles: true,
166
- });
167
-
168
- this.container.dispatchEvent(event);
169
- }
170
-
171
- /**
172
- * Cleanup method to remove event listeners
173
- */
174
- public destroy(): void {
175
- this.abortController.abort();
176
- this.close();
177
- }
178
- }
179
-
1
+ interface DropdownOptions {
2
+ closeOnSelect?: boolean;
3
+ allowMultipleOpen?: boolean;
4
+ }
5
+
6
+ interface DropdownSelectDetail {
7
+ text: string;
8
+ element: HTMLElement;
9
+ }
10
+
11
+ class Dropdown {
12
+ private container: HTMLElement;
13
+ private trigger: HTMLElement;
14
+ private menu: HTMLElement;
15
+ private options: Required<DropdownOptions>;
16
+ private abortController: AbortController;
17
+
18
+ constructor(selector: string, options: DropdownOptions = {}) {
19
+ const container = document.querySelector<HTMLElement>(selector);
20
+
21
+ if (!container) {
22
+ console.error(`Dropdown container not found: ${selector}`);
23
+ throw new Error(`Dropdown container "${selector}" not found`);
24
+ }
25
+
26
+ this.container = container;
27
+
28
+ const trigger = this.container.querySelector<HTMLElement>('.dropdown-trigger');
29
+ const menu = this.container.querySelector<HTMLElement>('.dropdown-menu');
30
+
31
+ if (!trigger || !menu) {
32
+ throw new Error('Dropdown requires .dropdown-trigger and .dropdown-menu elements');
33
+ }
34
+
35
+ this.trigger = trigger;
36
+ this.menu = menu;
37
+
38
+ this.options = {
39
+ closeOnSelect: options.closeOnSelect ?? true,
40
+ allowMultipleOpen: options.allowMultipleOpen ?? false,
41
+ };
42
+
43
+ this.abortController = new AbortController();
44
+ this.init();
45
+ }
46
+
47
+ private init(): void {
48
+ this.setupItems();
49
+ this.attachEventListeners();
50
+ }
51
+
52
+ private attachEventListeners(): void {
53
+ const { signal } = this.abortController;
54
+
55
+ // Toggle main dropdown
56
+ this.trigger.addEventListener(
57
+ 'click',
58
+ (e: MouseEvent) => {
59
+ e.stopPropagation();
60
+ this.toggle();
61
+ },
62
+ { signal }
63
+ );
64
+
65
+ // Close when clicking outside
66
+ document.addEventListener(
67
+ 'click',
68
+ (e: MouseEvent) => {
69
+ if (!this.container.contains(e.target as Node)) {
70
+ this.close();
71
+ }
72
+ },
73
+ { signal }
74
+ );
75
+
76
+ // Handle item clicks using event delegation
77
+ this.menu.addEventListener(
78
+ 'click',
79
+ (e: MouseEvent) => {
80
+ e.stopPropagation();
81
+
82
+ const target = e.target as HTMLElement;
83
+ const item = target.closest<HTMLElement>('.dropdown-item');
84
+
85
+ if (!item) return;
86
+
87
+ const li = item.parentElement as HTMLLIElement;
88
+ const submenu = li.querySelector<HTMLUListElement>('ul');
89
+
90
+ if (submenu) {
91
+ this.toggleSubmenu(li);
92
+ } else {
93
+ this.handleSelection(item);
94
+ if (this.options.closeOnSelect) {
95
+ this.close();
96
+ }
97
+ }
98
+ },
99
+ { signal }
100
+ );
101
+ }
102
+
103
+ private setupItems(): void {
104
+ const items = this.menu.querySelectorAll<HTMLElement>('.dropdown-item');
105
+
106
+ items.forEach((item) => {
107
+ const li = item.parentElement as HTMLLIElement;
108
+ if (li.querySelector('ul')) {
109
+ item.classList.add('has-children');
110
+ }
111
+ });
112
+ }
113
+
114
+ public toggle(): void {
115
+ this.container.classList.toggle('active');
116
+ }
117
+
118
+ public close(): void {
119
+ this.container.classList.remove('active');
120
+ this.closeAllSubmenus();
121
+ }
122
+
123
+ public open(): void {
124
+ this.container.classList.add('active');
125
+ }
126
+
127
+ private toggleSubmenu(li: HTMLLIElement): void {
128
+ const isOpening = !li.classList.contains('open');
129
+
130
+ // Close siblings if not allowing multiple open menus
131
+ if (isOpening && !this.options.allowMultipleOpen) {
132
+ const parent = li.parentElement;
133
+ if (parent) {
134
+ const siblings = Array.from(parent.children) as HTMLLIElement[];
135
+
136
+ siblings.forEach((sibling) => {
137
+ if (sibling !== li && sibling.classList.contains('open')) {
138
+ sibling.classList.remove('open');
139
+
140
+ // Close deeply nested open items
141
+ const deepOpenItems = sibling.querySelectorAll<HTMLLIElement>('.open');
142
+ deepOpenItems.forEach((el) => el.classList.remove('open'));
143
+ }
144
+ });
145
+ }
146
+ }
147
+
148
+ li.classList.toggle('open');
149
+ }
150
+
151
+ private closeAllSubmenus(): void {
152
+ const openItems = this.menu.querySelectorAll<HTMLLIElement>('li.open');
153
+ openItems.forEach((item) => item.classList.remove('open'));
154
+ }
155
+
156
+ private handleSelection(item: HTMLElement): void {
157
+ const text = item.textContent?.trim() ?? '';
158
+
159
+ // Dispatch custom event with proper typing
160
+ const event = new CustomEvent<DropdownSelectDetail>('dropdown-select', {
161
+ detail: {
162
+ text,
163
+ element: item,
164
+ },
165
+ bubbles: true,
166
+ });
167
+
168
+ this.container.dispatchEvent(event);
169
+ }
170
+
171
+ /**
172
+ * Cleanup method to remove event listeners
173
+ */
174
+ public destroy(): void {
175
+ this.abortController.abort();
176
+ this.close();
177
+ }
178
+ }
179
+
180
180
  export { Dropdown, DropdownSelectDetail };