@noxlovette/material 0.1.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 (537) hide show
  1. package/dist/actions/clickOutside.d.ts +3 -0
  2. package/dist/actions/clickOutside.js +13 -0
  3. package/dist/actions/floating.d.ts +20 -0
  4. package/dist/actions/floating.js +87 -0
  5. package/dist/actions/index.d.ts +4 -0
  6. package/dist/actions/index.js +4 -0
  7. package/dist/actions/keyboard.d.ts +3 -0
  8. package/dist/actions/keyboard.js +14 -0
  9. package/dist/actions/positionFloating.d.ts +10 -0
  10. package/dist/actions/positionFloating.js +59 -0
  11. package/dist/animation/containerTransform.d.ts +13 -0
  12. package/dist/animation/containerTransform.js +138 -0
  13. package/dist/animation/easing.d.ts +6 -0
  14. package/dist/animation/easing.js +78 -0
  15. package/dist/animation/enterExit.d.ts +3 -0
  16. package/dist/animation/enterExit.js +23 -0
  17. package/dist/animation/index.d.ts +5 -0
  18. package/dist/animation/index.js +5 -0
  19. package/dist/animation/outroClass.d.ts +3 -0
  20. package/dist/animation/outroClass.js +20 -0
  21. package/dist/animation/shapes.d.ts +35 -0
  22. package/dist/animation/shapes.js +37 -0
  23. package/dist/animation/shapesAnimatable.d.ts +35 -0
  24. package/dist/animation/shapesAnimatable.js +41 -0
  25. package/dist/animation/shapesAnimatableSmall.d.ts +29 -0
  26. package/dist/animation/shapesAnimatableSmall.js +33 -0
  27. package/dist/animation/sharedAxisTransition.d.ts +38 -0
  28. package/dist/animation/sharedAxisTransition.js +23 -0
  29. package/dist/animation/transition.d.ts +4 -0
  30. package/dist/animation/transition.js +4 -0
  31. package/dist/animation/transitionTypes.d.ts +8 -0
  32. package/dist/animation/transitionTypes.js +1 -0
  33. package/dist/components/badge/Badge.svelte +26 -0
  34. package/dist/components/badge/Badge.svelte.d.ts +12 -0
  35. package/dist/components/badge/index.d.ts +3 -0
  36. package/dist/components/badge/index.js +6 -0
  37. package/dist/components/badge/theme.d.ts +16 -0
  38. package/dist/components/badge/theme.js +10 -0
  39. package/dist/components/badge/types.d.ts +18 -0
  40. package/dist/components/badge/types.js +1 -0
  41. package/dist/components/buttons/Button.svelte +53 -0
  42. package/dist/components/buttons/Button.svelte.d.ts +16 -0
  43. package/dist/components/buttons/ButtonIcon.svelte +79 -0
  44. package/dist/components/buttons/ButtonIcon.svelte.d.ts +14 -0
  45. package/dist/components/buttons/FAB.svelte +81 -0
  46. package/dist/components/buttons/FAB.svelte.d.ts +14 -0
  47. package/dist/components/buttons/FABMenu.svelte +86 -0
  48. package/dist/components/buttons/FABMenu.svelte.d.ts +8 -0
  49. package/dist/components/buttons/FABMenuItem.svelte +38 -0
  50. package/dist/components/buttons/FABMenuItem.svelte.d.ts +5 -0
  51. package/dist/components/buttons/Toggle.svelte +62 -0
  52. package/dist/components/buttons/Toggle.svelte.d.ts +11 -0
  53. package/dist/components/buttons/connected/ConnectedButtons.svelte +14 -0
  54. package/dist/components/buttons/connected/ConnectedButtons.svelte.d.ts +8 -0
  55. package/dist/components/buttons/connected/index.d.ts +2 -0
  56. package/dist/components/buttons/connected/index.js +5 -0
  57. package/dist/components/buttons/connected/types.d.ts +14 -0
  58. package/dist/components/buttons/connected/types.js +1 -0
  59. package/dist/components/buttons/index.d.ts +9 -0
  60. package/dist/components/buttons/index.js +13 -0
  61. package/dist/components/buttons/theme.d.ts +539 -0
  62. package/dist/components/buttons/theme.js +495 -0
  63. package/dist/components/buttons/types.d.ts +201 -0
  64. package/dist/components/buttons/types.js +1 -0
  65. package/dist/components/cards/Card.svelte +39 -0
  66. package/dist/components/cards/Card.svelte.d.ts +13 -0
  67. package/dist/components/cards/index.d.ts +3 -0
  68. package/dist/components/cards/index.js +6 -0
  69. package/dist/components/cards/theme.d.ts +37 -0
  70. package/dist/components/cards/theme.js +34 -0
  71. package/dist/components/cards/types.d.ts +31 -0
  72. package/dist/components/cards/types.js +1 -0
  73. package/dist/components/containers/app/App.svelte +32 -0
  74. package/dist/components/containers/app/App.svelte.d.ts +8 -0
  75. package/dist/components/containers/app/index.d.ts +3 -0
  76. package/dist/components/containers/app/index.js +6 -0
  77. package/dist/components/containers/app/theme.d.ts +3 -0
  78. package/dist/components/containers/app/theme.js +4 -0
  79. package/dist/components/containers/app/types.d.ts +25 -0
  80. package/dist/components/containers/app/types.js +1 -0
  81. package/dist/components/containers/bottom-sheet/BottomSheet.svelte +125 -0
  82. package/dist/components/containers/bottom-sheet/BottomSheet.svelte.d.ts +12 -0
  83. package/dist/components/containers/bottom-sheet/index.d.ts +2 -0
  84. package/dist/components/containers/bottom-sheet/index.js +5 -0
  85. package/dist/components/containers/bottom-sheet/types.d.ts +16 -0
  86. package/dist/components/containers/bottom-sheet/types.js +1 -0
  87. package/dist/components/containers/context-menu/ContextMenu.svelte +152 -0
  88. package/dist/components/containers/context-menu/ContextMenu.svelte.d.ts +23 -0
  89. package/dist/components/containers/context-menu/index.d.ts +3 -0
  90. package/dist/components/containers/context-menu/index.js +6 -0
  91. package/dist/components/containers/context-menu/theme.d.ts +51 -0
  92. package/dist/components/containers/context-menu/theme.js +21 -0
  93. package/dist/components/containers/context-menu/types.d.ts +45 -0
  94. package/dist/components/containers/context-menu/types.js +1 -0
  95. package/dist/components/containers/dialogue/Dialogue.svelte +134 -0
  96. package/dist/components/containers/dialogue/Dialogue.svelte.d.ts +14 -0
  97. package/dist/components/containers/dialogue/index.d.ts +3 -0
  98. package/dist/components/containers/dialogue/index.js +6 -0
  99. package/dist/components/containers/dialogue/theme.d.ts +51 -0
  100. package/dist/components/containers/dialogue/theme.js +10 -0
  101. package/dist/components/containers/dialogue/types.d.ts +46 -0
  102. package/dist/components/containers/dialogue/types.js +1 -0
  103. package/dist/components/containers/divider/Divider.svelte +100 -0
  104. package/dist/components/containers/divider/Divider.svelte.d.ts +13 -0
  105. package/dist/components/containers/divider/index.d.ts +3 -0
  106. package/dist/components/containers/divider/index.js +6 -0
  107. package/dist/components/containers/divider/theme.d.ts +33 -0
  108. package/dist/components/containers/divider/theme.js +15 -0
  109. package/dist/components/containers/divider/types.d.ts +27 -0
  110. package/dist/components/containers/divider/types.js +1 -0
  111. package/dist/components/containers/index.d.ts +15 -0
  112. package/dist/components/containers/index.js +17 -0
  113. package/dist/components/containers/link-preview/LinkPreview.svelte +64 -0
  114. package/dist/components/containers/link-preview/LinkPreview.svelte.d.ts +10 -0
  115. package/dist/components/containers/link-preview/index.d.ts +3 -0
  116. package/dist/components/containers/link-preview/index.js +6 -0
  117. package/dist/components/containers/link-preview/theme.d.ts +33 -0
  118. package/dist/components/containers/link-preview/theme.js +7 -0
  119. package/dist/components/containers/link-preview/types.d.ts +22 -0
  120. package/dist/components/containers/link-preview/types.js +1 -0
  121. package/dist/components/containers/list/ListItem.svelte +79 -0
  122. package/dist/components/containers/list/ListItem.svelte.d.ts +4 -0
  123. package/dist/components/containers/list/index.d.ts +3 -0
  124. package/dist/components/containers/list/index.js +6 -0
  125. package/dist/components/containers/list/theme.d.ts +67 -0
  126. package/dist/components/containers/list/theme.js +27 -0
  127. package/dist/components/containers/list/types.d.ts +48 -0
  128. package/dist/components/containers/list/types.js +1 -0
  129. package/dist/components/containers/menu/Menu.svelte +70 -0
  130. package/dist/components/containers/menu/Menu.svelte.d.ts +20 -0
  131. package/dist/components/containers/menu/index.d.ts +2 -0
  132. package/dist/components/containers/menu/index.js +5 -0
  133. package/dist/components/containers/menu/types.d.ts +40 -0
  134. package/dist/components/containers/menu/types.js +1 -0
  135. package/dist/components/containers/menu-item/MenuItem.svelte +75 -0
  136. package/dist/components/containers/menu-item/MenuItem.svelte.d.ts +20 -0
  137. package/dist/components/containers/menu-item/index.d.ts +2 -0
  138. package/dist/components/containers/menu-item/index.js +5 -0
  139. package/dist/components/containers/menu-item/types.d.ts +36 -0
  140. package/dist/components/containers/menu-item/types.js +1 -0
  141. package/dist/components/containers/merger/InputMerger.svelte +29 -0
  142. package/dist/components/containers/merger/InputMerger.svelte.d.ts +14 -0
  143. package/dist/components/containers/merger/index.d.ts +1 -0
  144. package/dist/components/containers/merger/index.js +3 -0
  145. package/dist/components/containers/panes/SinglePane.svelte +29 -0
  146. package/dist/components/containers/panes/SinglePane.svelte.d.ts +5 -0
  147. package/dist/components/containers/panes/SplitPane.svelte +132 -0
  148. package/dist/components/containers/panes/SplitPane.svelte.d.ts +5 -0
  149. package/dist/components/containers/panes/SupportingPane.svelte +81 -0
  150. package/dist/components/containers/panes/SupportingPane.svelte.d.ts +9 -0
  151. package/dist/components/containers/panes/index.d.ts +5 -0
  152. package/dist/components/containers/panes/index.js +8 -0
  153. package/dist/components/containers/panes/theme.d.ts +331 -0
  154. package/dist/components/containers/panes/theme.js +152 -0
  155. package/dist/components/containers/panes/types.d.ts +81 -0
  156. package/dist/components/containers/panes/types.js +1 -0
  157. package/dist/components/containers/popover/Popover.svelte +82 -0
  158. package/dist/components/containers/popover/Popover.svelte.d.ts +10 -0
  159. package/dist/components/containers/popover/index.d.ts +3 -0
  160. package/dist/components/containers/popover/index.js +6 -0
  161. package/dist/components/containers/popover/theme.d.ts +51 -0
  162. package/dist/components/containers/popover/theme.js +10 -0
  163. package/dist/components/containers/popover/types.d.ts +22 -0
  164. package/dist/components/containers/popover/types.js +1 -0
  165. package/dist/components/containers/scroll-area/ScrollArea.svelte +41 -0
  166. package/dist/components/containers/scroll-area/ScrollArea.svelte.d.ts +5 -0
  167. package/dist/components/containers/scroll-area/index.d.ts +3 -0
  168. package/dist/components/containers/scroll-area/index.js +6 -0
  169. package/dist/components/containers/scroll-area/theme.d.ts +55 -0
  170. package/dist/components/containers/scroll-area/theme.js +26 -0
  171. package/dist/components/containers/scroll-area/types.d.ts +26 -0
  172. package/dist/components/containers/scroll-area/types.js +1 -0
  173. package/dist/components/containers/side-sheet/SideSheet.svelte +21 -0
  174. package/dist/components/containers/side-sheet/SideSheet.svelte.d.ts +9 -0
  175. package/dist/components/containers/side-sheet/index.d.ts +2 -0
  176. package/dist/components/containers/side-sheet/index.js +5 -0
  177. package/dist/components/containers/side-sheet/types.d.ts +18 -0
  178. package/dist/components/containers/side-sheet/types.js +1 -0
  179. package/dist/components/containers/stack/HStack.svelte +23 -0
  180. package/dist/components/containers/stack/HStack.svelte.d.ts +5 -0
  181. package/dist/components/containers/stack/VStack.svelte +23 -0
  182. package/dist/components/containers/stack/VStack.svelte.d.ts +5 -0
  183. package/dist/components/containers/stack/index.d.ts +4 -0
  184. package/dist/components/containers/stack/index.js +7 -0
  185. package/dist/components/containers/stack/theme.d.ts +60 -0
  186. package/dist/components/containers/stack/theme.js +24 -0
  187. package/dist/components/containers/stack/types.d.ts +12 -0
  188. package/dist/components/containers/stack/types.js +1 -0
  189. package/dist/components/date/DateField.svelte +155 -0
  190. package/dist/components/date/DateField.svelte.d.ts +12 -0
  191. package/dist/components/date/DateRangeField.svelte +211 -0
  192. package/dist/components/date/DateRangeField.svelte.d.ts +13 -0
  193. package/dist/components/date/index.d.ts +4 -0
  194. package/dist/components/date/index.js +7 -0
  195. package/dist/components/date/theme.d.ts +158 -0
  196. package/dist/components/date/theme.js +149 -0
  197. package/dist/components/date/types.d.ts +64 -0
  198. package/dist/components/date/types.js +1 -0
  199. package/dist/components/forms/checkbox/Checkbox.svelte +66 -0
  200. package/dist/components/forms/checkbox/Checkbox.svelte.d.ts +10 -0
  201. package/dist/components/forms/checkbox/index.d.ts +3 -0
  202. package/dist/components/forms/checkbox/index.js +6 -0
  203. package/dist/components/forms/checkbox/theme.d.ts +141 -0
  204. package/dist/components/forms/checkbox/theme.js +69 -0
  205. package/dist/components/forms/checkbox/types.d.ts +39 -0
  206. package/dist/components/forms/checkbox/types.js +1 -0
  207. package/dist/components/forms/command/Command.svelte +14 -0
  208. package/dist/components/forms/command/Command.svelte.d.ts +5 -0
  209. package/dist/components/forms/command/CommandEmpty.svelte +14 -0
  210. package/dist/components/forms/command/CommandEmpty.svelte.d.ts +4 -0
  211. package/dist/components/forms/command/CommandGroup.svelte +17 -0
  212. package/dist/components/forms/command/CommandGroup.svelte.d.ts +4 -0
  213. package/dist/components/forms/command/CommandInput.svelte +18 -0
  214. package/dist/components/forms/command/CommandInput.svelte.d.ts +4 -0
  215. package/dist/components/forms/command/CommandItem.svelte +14 -0
  216. package/dist/components/forms/command/CommandItem.svelte.d.ts +4 -0
  217. package/dist/components/forms/command/CommandList.svelte +14 -0
  218. package/dist/components/forms/command/CommandList.svelte.d.ts +4 -0
  219. package/dist/components/forms/command/CommandSeparator.svelte +12 -0
  220. package/dist/components/forms/command/CommandSeparator.svelte.d.ts +4 -0
  221. package/dist/components/forms/command/index.d.ts +9 -0
  222. package/dist/components/forms/command/index.js +12 -0
  223. package/dist/components/forms/command/theme.d.ts +81 -0
  224. package/dist/components/forms/command/theme.js +15 -0
  225. package/dist/components/forms/command/types.d.ts +31 -0
  226. package/dist/components/forms/command/types.js +1 -0
  227. package/dist/components/forms/index.d.ts +12 -0
  228. package/dist/components/forms/index.js +14 -0
  229. package/dist/components/forms/multipart/Multipart.svelte +532 -0
  230. package/dist/components/forms/multipart/Multipart.svelte.d.ts +51 -0
  231. package/dist/components/forms/multipart/index.d.ts +1 -0
  232. package/dist/components/forms/multipart/index.js +3 -0
  233. package/dist/components/forms/pin/PinInput.svelte +51 -0
  234. package/dist/components/forms/pin/PinInput.svelte.d.ts +10 -0
  235. package/dist/components/forms/pin/index.d.ts +3 -0
  236. package/dist/components/forms/pin/index.js +6 -0
  237. package/dist/components/forms/pin/theme.d.ts +60 -0
  238. package/dist/components/forms/pin/theme.js +33 -0
  239. package/dist/components/forms/pin/types.d.ts +29 -0
  240. package/dist/components/forms/pin/types.js +1 -0
  241. package/dist/components/forms/radio-group/RadioGroup.svelte +61 -0
  242. package/dist/components/forms/radio-group/RadioGroup.svelte.d.ts +10 -0
  243. package/dist/components/forms/radio-group/index.d.ts +3 -0
  244. package/dist/components/forms/radio-group/index.js +6 -0
  245. package/dist/components/forms/radio-group/theme.d.ts +132 -0
  246. package/dist/components/forms/radio-group/theme.js +48 -0
  247. package/dist/components/forms/radio-group/types.d.ts +24 -0
  248. package/dist/components/forms/radio-group/types.js +1 -0
  249. package/dist/components/forms/search/Search.svelte +52 -0
  250. package/dist/components/forms/search/Search.svelte.d.ts +11 -0
  251. package/dist/components/forms/search/index.d.ts +3 -0
  252. package/dist/components/forms/search/index.js +6 -0
  253. package/dist/components/forms/search/theme.d.ts +33 -0
  254. package/dist/components/forms/search/theme.js +15 -0
  255. package/dist/components/forms/search/types.d.ts +34 -0
  256. package/dist/components/forms/search/types.js +1 -0
  257. package/dist/components/forms/select/Select.svelte +141 -0
  258. package/dist/components/forms/select/Select.svelte.d.ts +13 -0
  259. package/dist/components/forms/select/SelectGroup.svelte +19 -0
  260. package/dist/components/forms/select/SelectGroup.svelte.d.ts +8 -0
  261. package/dist/components/forms/select/SelectItem.svelte +35 -0
  262. package/dist/components/forms/select/SelectItem.svelte.d.ts +14 -0
  263. package/dist/components/forms/select/SelectLabel.svelte +19 -0
  264. package/dist/components/forms/select/SelectLabel.svelte.d.ts +8 -0
  265. package/dist/components/forms/select/SelectSeparator.svelte +13 -0
  266. package/dist/components/forms/select/SelectSeparator.svelte.d.ts +6 -0
  267. package/dist/components/forms/select/index.d.ts +7 -0
  268. package/dist/components/forms/select/index.js +10 -0
  269. package/dist/components/forms/select/theme.d.ts +84 -0
  270. package/dist/components/forms/select/theme.js +87 -0
  271. package/dist/components/forms/select/types.d.ts +63 -0
  272. package/dist/components/forms/select/types.js +1 -0
  273. package/dist/components/forms/slider/Slider.svelte +201 -0
  274. package/dist/components/forms/slider/Slider.svelte.d.ts +12 -0
  275. package/dist/components/forms/slider/index.d.ts +3 -0
  276. package/dist/components/forms/slider/index.js +6 -0
  277. package/dist/components/forms/slider/theme.d.ts +78 -0
  278. package/dist/components/forms/slider/theme.js +33 -0
  279. package/dist/components/forms/slider/types.d.ts +56 -0
  280. package/dist/components/forms/slider/types.js +1 -0
  281. package/dist/components/forms/switch/Switch.svelte +74 -0
  282. package/dist/components/forms/switch/Switch.svelte.d.ts +12 -0
  283. package/dist/components/forms/switch/index.d.ts +3 -0
  284. package/dist/components/forms/switch/index.js +6 -0
  285. package/dist/components/forms/switch/theme.d.ts +51 -0
  286. package/dist/components/forms/switch/theme.js +71 -0
  287. package/dist/components/forms/switch/types.d.ts +25 -0
  288. package/dist/components/forms/switch/types.js +1 -0
  289. package/dist/components/forms/textfield/Textfield.svelte +82 -0
  290. package/dist/components/forms/textfield/Textfield.svelte.d.ts +11 -0
  291. package/dist/components/forms/textfield/index.d.ts +3 -0
  292. package/dist/components/forms/textfield/index.js +6 -0
  293. package/dist/components/forms/textfield/theme.d.ts +75 -0
  294. package/dist/components/forms/textfield/theme.js +74 -0
  295. package/dist/components/forms/textfield/types.d.ts +60 -0
  296. package/dist/components/forms/textfield/types.js +1 -0
  297. package/dist/components/forms/toggle-group/ToggleGroup.svelte +38 -0
  298. package/dist/components/forms/toggle-group/ToggleGroup.svelte.d.ts +11 -0
  299. package/dist/components/forms/toggle-group/ToggleGroupItem.svelte +36 -0
  300. package/dist/components/forms/toggle-group/ToggleGroupItem.svelte.d.ts +8 -0
  301. package/dist/components/forms/toggle-group/index.d.ts +4 -0
  302. package/dist/components/forms/toggle-group/index.js +7 -0
  303. package/dist/components/forms/toggle-group/theme.d.ts +74 -0
  304. package/dist/components/forms/toggle-group/theme.js +20 -0
  305. package/dist/components/forms/toggle-group/types.d.ts +25 -0
  306. package/dist/components/forms/toggle-group/types.js +1 -0
  307. package/dist/components/forms/tooltip/Tooltip.svelte +104 -0
  308. package/dist/components/forms/tooltip/Tooltip.svelte.d.ts +11 -0
  309. package/dist/components/forms/tooltip/index.d.ts +3 -0
  310. package/dist/components/forms/tooltip/index.js +6 -0
  311. package/dist/components/forms/tooltip/theme.d.ts +105 -0
  312. package/dist/components/forms/tooltip/theme.js +52 -0
  313. package/dist/components/forms/tooltip/types.d.ts +29 -0
  314. package/dist/components/forms/tooltip/types.js +1 -0
  315. package/dist/components/index.d.ts +15 -0
  316. package/dist/components/index.js +17 -0
  317. package/dist/components/misc/Avatar.svelte +70 -0
  318. package/dist/components/misc/Avatar.svelte.d.ts +9 -0
  319. package/dist/components/misc/ThemeSettings.svelte +88 -0
  320. package/dist/components/misc/ThemeSettings.svelte.d.ts +18 -0
  321. package/dist/components/misc/ThemeSwitcher.svelte +21 -0
  322. package/dist/components/misc/ThemeSwitcher.svelte.d.ts +3 -0
  323. package/dist/components/misc/index.d.ts +5 -0
  324. package/dist/components/misc/index.js +8 -0
  325. package/dist/components/misc/theme.d.ts +52 -0
  326. package/dist/components/misc/theme.js +25 -0
  327. package/dist/components/misc/types.d.ts +18 -0
  328. package/dist/components/misc/types.js +1 -0
  329. package/dist/components/nav/appbar/AppBar.svelte +60 -0
  330. package/dist/components/nav/appbar/AppBar.svelte.d.ts +12 -0
  331. package/dist/components/nav/appbar/index.d.ts +3 -0
  332. package/dist/components/nav/appbar/index.js +6 -0
  333. package/dist/components/nav/appbar/theme.d.ts +99 -0
  334. package/dist/components/nav/appbar/theme.js +33 -0
  335. package/dist/components/nav/appbar/types.d.ts +20 -0
  336. package/dist/components/nav/appbar/types.js +1 -0
  337. package/dist/components/nav/index.d.ts +5 -0
  338. package/dist/components/nav/index.js +8 -0
  339. package/dist/components/nav/navbar/Navbar.svelte +33 -0
  340. package/dist/components/nav/navbar/Navbar.svelte.d.ts +18 -0
  341. package/dist/components/nav/navbar/NavbarItem.svelte +66 -0
  342. package/dist/components/nav/navbar/NavbarItem.svelte.d.ts +9 -0
  343. package/dist/components/nav/navbar/index.d.ts +4 -0
  344. package/dist/components/nav/navbar/index.js +7 -0
  345. package/dist/components/nav/navbar/theme.d.ts +95 -0
  346. package/dist/components/nav/navbar/theme.js +31 -0
  347. package/dist/components/nav/navbar/types.d.ts +29 -0
  348. package/dist/components/nav/navbar/types.js +1 -0
  349. package/dist/components/nav/rail/Rail.svelte +75 -0
  350. package/dist/components/nav/rail/Rail.svelte.d.ts +11 -0
  351. package/dist/components/nav/rail/RailItem.svelte +104 -0
  352. package/dist/components/nav/rail/RailItem.svelte.d.ts +9 -0
  353. package/dist/components/nav/rail/index.d.ts +4 -0
  354. package/dist/components/nav/rail/index.js +7 -0
  355. package/dist/components/nav/rail/theme.d.ts +218 -0
  356. package/dist/components/nav/rail/theme.js +107 -0
  357. package/dist/components/nav/rail/types.d.ts +44 -0
  358. package/dist/components/nav/rail/types.js +1 -0
  359. package/dist/components/nav/tabs/Tab.svelte +49 -0
  360. package/dist/components/nav/tabs/Tab.svelte.d.ts +9 -0
  361. package/dist/components/nav/tabs/TabContent.svelte +11 -0
  362. package/dist/components/nav/tabs/TabContent.svelte.d.ts +8 -0
  363. package/dist/components/nav/tabs/TabHolder.svelte +44 -0
  364. package/dist/components/nav/tabs/TabHolder.svelte.d.ts +16 -0
  365. package/dist/components/nav/tabs/index.d.ts +5 -0
  366. package/dist/components/nav/tabs/index.js +8 -0
  367. package/dist/components/nav/tabs/theme.d.ts +92 -0
  368. package/dist/components/nav/tabs/theme.js +37 -0
  369. package/dist/components/nav/tabs/types.d.ts +39 -0
  370. package/dist/components/nav/tabs/types.js +1 -0
  371. package/dist/components/nav/types.d.ts +6 -0
  372. package/dist/components/nav/types.js +1 -0
  373. package/dist/components/pill/Pill.svelte +17 -0
  374. package/dist/components/pill/Pill.svelte.d.ts +5 -0
  375. package/dist/components/pill/index.d.ts +3 -0
  376. package/dist/components/pill/index.js +6 -0
  377. package/dist/components/pill/theme.d.ts +27 -0
  378. package/dist/components/pill/theme.js +16 -0
  379. package/dist/components/pill/types.d.ts +6 -0
  380. package/dist/components/pill/types.js +1 -0
  381. package/dist/components/progress/CircularProgress.svelte +58 -0
  382. package/dist/components/progress/CircularProgress.svelte.d.ts +16 -0
  383. package/dist/components/progress/LinearProgress.svelte +45 -0
  384. package/dist/components/progress/LinearProgress.svelte.d.ts +15 -0
  385. package/dist/components/progress/WavyLinearProgress.svelte +58 -0
  386. package/dist/components/progress/WavyLinearProgress.svelte.d.ts +19 -0
  387. package/dist/components/progress/_wavy.d.ts +2 -0
  388. package/dist/components/progress/_wavy.js +32 -0
  389. package/dist/components/progress/index.d.ts +4 -0
  390. package/dist/components/progress/index.js +7 -0
  391. package/dist/components/snackbar/Snackbar.svelte +102 -0
  392. package/dist/components/snackbar/Snackbar.svelte.d.ts +9 -0
  393. package/dist/components/snackbar/index.d.ts +3 -0
  394. package/dist/components/snackbar/index.js +6 -0
  395. package/dist/components/snackbar/theme.d.ts +36 -0
  396. package/dist/components/snackbar/theme.js +16 -0
  397. package/dist/components/snackbar/types.d.ts +33 -0
  398. package/dist/components/snackbar/types.js +1 -0
  399. package/dist/components/table/Table.svelte +26 -0
  400. package/dist/components/table/Table.svelte.d.ts +8 -0
  401. package/dist/components/table/TableBody.svelte +17 -0
  402. package/dist/components/table/TableBody.svelte.d.ts +5 -0
  403. package/dist/components/table/TableCell.svelte +24 -0
  404. package/dist/components/table/TableCell.svelte.d.ts +8 -0
  405. package/dist/components/table/TableFoot.svelte +17 -0
  406. package/dist/components/table/TableFoot.svelte.d.ts +5 -0
  407. package/dist/components/table/TableHead.svelte +18 -0
  408. package/dist/components/table/TableHead.svelte.d.ts +8 -0
  409. package/dist/components/table/TableHeader.svelte +43 -0
  410. package/dist/components/table/TableHeader.svelte.d.ts +8 -0
  411. package/dist/components/table/TableRow.svelte +24 -0
  412. package/dist/components/table/TableRow.svelte.d.ts +8 -0
  413. package/dist/components/table/index.d.ts +9 -0
  414. package/dist/components/table/index.js +12 -0
  415. package/dist/components/table/theme.d.ts +165 -0
  416. package/dist/components/table/theme.js +50 -0
  417. package/dist/components/table/types.d.ts +44 -0
  418. package/dist/components/table/types.js +1 -0
  419. package/dist/components/time/TimeField.svelte +111 -0
  420. package/dist/components/time/TimeField.svelte.d.ts +28 -0
  421. package/dist/components/time/TimepickerInput.svelte +75 -0
  422. package/dist/components/time/TimepickerInput.svelte.d.ts +10 -0
  423. package/dist/components/time/index.d.ts +4 -0
  424. package/dist/components/time/index.js +7 -0
  425. package/dist/components/time/theme.d.ts +69 -0
  426. package/dist/components/time/theme.js +13 -0
  427. package/dist/components/time/types.d.ts +34 -0
  428. package/dist/components/time/types.js +1 -0
  429. package/dist/components/toolbar/Toolbar.svelte +26 -0
  430. package/dist/components/toolbar/Toolbar.svelte.d.ts +10 -0
  431. package/dist/components/toolbar/ToolbarButton.svelte +25 -0
  432. package/dist/components/toolbar/ToolbarButton.svelte.d.ts +5 -0
  433. package/dist/components/toolbar/ToolbarDivider.svelte +6 -0
  434. package/dist/components/toolbar/ToolbarDivider.svelte.d.ts +18 -0
  435. package/dist/components/toolbar/ToolbarGroup.svelte +18 -0
  436. package/dist/components/toolbar/ToolbarGroup.svelte.d.ts +5 -0
  437. package/dist/components/toolbar/ToolbarGroupItem.svelte +27 -0
  438. package/dist/components/toolbar/ToolbarGroupItem.svelte.d.ts +8 -0
  439. package/dist/components/toolbar/index.d.ts +7 -0
  440. package/dist/components/toolbar/index.js +10 -0
  441. package/dist/components/toolbar/theme.d.ts +106 -0
  442. package/dist/components/toolbar/theme.js +27 -0
  443. package/dist/components/toolbar/types.d.ts +20 -0
  444. package/dist/components/toolbar/types.js +1 -0
  445. package/dist/components/typography/body/Body.svelte +33 -0
  446. package/dist/components/typography/body/Body.svelte.d.ts +10 -0
  447. package/dist/components/typography/body/index.d.ts +3 -0
  448. package/dist/components/typography/body/index.js +6 -0
  449. package/dist/components/typography/body/theme.d.ts +30 -0
  450. package/dist/components/typography/body/theme.js +14 -0
  451. package/dist/components/typography/body/types.d.ts +21 -0
  452. package/dist/components/typography/body/types.js +1 -0
  453. package/dist/components/typography/display/Display.svelte +27 -0
  454. package/dist/components/typography/display/Display.svelte.d.ts +10 -0
  455. package/dist/components/typography/display/index.d.ts +3 -0
  456. package/dist/components/typography/display/index.js +6 -0
  457. package/dist/components/typography/display/theme.d.ts +30 -0
  458. package/dist/components/typography/display/theme.js +14 -0
  459. package/dist/components/typography/display/types.d.ts +21 -0
  460. package/dist/components/typography/display/types.js +1 -0
  461. package/dist/components/typography/headline/Headline.svelte +27 -0
  462. package/dist/components/typography/headline/Headline.svelte.d.ts +10 -0
  463. package/dist/components/typography/headline/index.d.ts +3 -0
  464. package/dist/components/typography/headline/index.js +6 -0
  465. package/dist/components/typography/headline/theme.d.ts +30 -0
  466. package/dist/components/typography/headline/theme.js +14 -0
  467. package/dist/components/typography/headline/types.d.ts +21 -0
  468. package/dist/components/typography/headline/types.js +1 -0
  469. package/dist/components/typography/index.d.ts +6 -0
  470. package/dist/components/typography/index.js +8 -0
  471. package/dist/components/typography/kbd/Kbd.svelte +18 -0
  472. package/dist/components/typography/kbd/Kbd.svelte.d.ts +5 -0
  473. package/dist/components/typography/kbd/index.d.ts +3 -0
  474. package/dist/components/typography/kbd/index.js +6 -0
  475. package/dist/components/typography/kbd/theme.d.ts +18 -0
  476. package/dist/components/typography/kbd/theme.js +10 -0
  477. package/dist/components/typography/kbd/types.d.ts +17 -0
  478. package/dist/components/typography/kbd/types.js +1 -0
  479. package/dist/components/typography/label/Label.svelte +25 -0
  480. package/dist/components/typography/label/Label.svelte.d.ts +10 -0
  481. package/dist/components/typography/label/index.d.ts +3 -0
  482. package/dist/components/typography/label/index.js +6 -0
  483. package/dist/components/typography/label/theme.d.ts +28 -0
  484. package/dist/components/typography/label/theme.js +14 -0
  485. package/dist/components/typography/label/types.d.ts +23 -0
  486. package/dist/components/typography/label/types.js +1 -0
  487. package/dist/components/typography/title/Title.svelte +27 -0
  488. package/dist/components/typography/title/Title.svelte.d.ts +10 -0
  489. package/dist/components/typography/title/index.d.ts +3 -0
  490. package/dist/components/typography/title/index.js +6 -0
  491. package/dist/components/typography/title/theme.d.ts +30 -0
  492. package/dist/components/typography/title/theme.js +14 -0
  493. package/dist/components/typography/title/types.d.ts +21 -0
  494. package/dist/components/typography/title/types.js +1 -0
  495. package/dist/index.css +6 -0
  496. package/dist/index.d.ts +4 -0
  497. package/dist/index.js +4 -0
  498. package/dist/styles/component.css +154 -0
  499. package/dist/styles/elevation.css +45 -0
  500. package/dist/styles/motion.css +51 -0
  501. package/dist/styles/prose.css +48 -0
  502. package/dist/styles/rounding.css +11 -0
  503. package/dist/styles/theme/dark-hc.css +53 -0
  504. package/dist/styles/theme/dark-mc.css +53 -0
  505. package/dist/styles/theme/dark.css +51 -0
  506. package/dist/styles/theme/light-hc.css +53 -0
  507. package/dist/styles/theme/light-mc.css +53 -0
  508. package/dist/styles/theme/light.css +51 -0
  509. package/dist/styles/typescale.css +63 -0
  510. package/dist/utils/Layer.svelte +217 -0
  511. package/dist/utils/Layer.svelte.d.ts +3 -0
  512. package/dist/utils/Theme.svelte +90 -0
  513. package/dist/utils/icon/Icon.svelte +24 -0
  514. package/dist/utils/icon/Icon.svelte.d.ts +4 -0
  515. package/dist/utils/icon/LoadingIndicator.svelte +39 -0
  516. package/dist/utils/icon/LoadingIndicator.svelte.d.ts +4 -0
  517. package/dist/utils/icon/MaterialSymbolsProvider.svelte +38 -0
  518. package/dist/utils/icon/MaterialSymbolsProvider.svelte.d.ts +8 -0
  519. package/dist/utils/icon/base-icons.d.ts +1 -0
  520. package/dist/utils/icon/base-icons.js +29 -0
  521. package/dist/utils/icon/index.d.ts +6 -0
  522. package/dist/utils/icon/index.js +6 -0
  523. package/dist/utils/icon/theme.d.ts +30 -0
  524. package/dist/utils/icon/theme.js +14 -0
  525. package/dist/utils/icon/types.d.ts +23 -0
  526. package/dist/utils/icon/types.js +1 -0
  527. package/dist/utils/index.d.ts +7 -0
  528. package/dist/utils/index.js +6 -0
  529. package/dist/utils/theme.svelte.d.ts +24 -0
  530. package/dist/utils/theme.svelte.js +156 -0
  531. package/dist/utils/tutorial.d.ts +9 -0
  532. package/dist/utils/tutorial.js +46 -0
  533. package/dist/utils/types.d.ts +18 -0
  534. package/dist/utils/types.js +5 -0
  535. package/dist/utils/ui.d.ts +6 -0
  536. package/dist/utils/ui.js +56 -0
  537. package/package.json +85 -0
@@ -0,0 +1,532 @@
1
+ <!--
2
+ @component
3
+ @component
4
+ Multipart file upload component that supports chunked uploads for large files.
5
+ Follows Material 3 design principles for file uploaders.
6
+ -->
7
+ <script lang="ts">
8
+ import { onDestroy } from 'svelte';
9
+ import { formatPercentage, Layer } from '../../../utils/index.js';
10
+ import Icon from '../../../utils/icon/Icon.svelte';
11
+ import ButtonIcon from '../../buttons/ButtonIcon.svelte';
12
+ import CircularProgress from '../../progress/CircularProgress.svelte';
13
+ import Label from '../../typography/label/Label.svelte';
14
+ import Title from '../../typography/title/Title.svelte';
15
+ import HStack from '../../containers/stack/HStack.svelte';
16
+ import Dialogue from '../../containers/dialogue/Dialogue.svelte';
17
+ import { nanoid } from 'nanoid';
18
+
19
+ type UploadStatus = 'waiting' | 'uploading' | 'complete' | 'error';
20
+
21
+ interface PartUploadUrl {
22
+ partNumber: number;
23
+ url: string;
24
+ }
25
+
26
+ interface InitResponse {
27
+ uploadId: string;
28
+ fileId: string;
29
+ s3Key: string;
30
+ parts: PartUploadUrl[];
31
+ }
32
+
33
+ interface CompletedPart {
34
+ partNumber: number;
35
+ etag: string;
36
+ }
37
+
38
+ /**
39
+ * Internal state for a single file upload.
40
+ */
41
+ interface FileUploadState {
42
+ /** Unique identifier for the upload session */
43
+ id: string;
44
+ /** The file being uploaded */
45
+ file: File;
46
+ /** Upload progress tracking */
47
+ progress: {
48
+ /** Number of chunks uploaded */
49
+ uploaded: number;
50
+ /** Total number of chunks */
51
+ total: number;
52
+ /** Total bytes uploaded */
53
+ bytes: number;
54
+ /** Total size of the file in bytes */
55
+ totalBytes: number;
56
+ /** Percentage of upload completed (0-100) */
57
+ percentComplete: number;
58
+ };
59
+ /** Current status of the upload */
60
+ status: UploadStatus;
61
+ /** Optional error message if status is 'error' */
62
+ errorMessage?: string;
63
+ /** AbortController for cancelling the upload */
64
+ abortController?: AbortController;
65
+ }
66
+
67
+ let {
68
+ taskId = null,
69
+ folderId = null,
70
+ readonly = false,
71
+ initialUploads = [],
72
+ title = 'Загрузка файлов',
73
+ label = 'Область загрузки файлов'
74
+ }: {
75
+ /** Unique ID of the task associated with these uploads */
76
+ taskId?: string | null;
77
+ /** ID of the folder where files will be stored */
78
+ folderId?: string | null;
79
+ /** Whether the upload area is interactive */
80
+ readonly?: boolean;
81
+ /** Initial list of files to display */
82
+ initialUploads?: FileUploadState[];
83
+ /** Title displayed above the upload area */
84
+ title?: string;
85
+ /** Accessibility label for the upload zone */
86
+ label?: string;
87
+ } = $props();
88
+
89
+ let fileUploads: FileUploadState[] = $state([...initialUploads]);
90
+ let fileToRemove = $state<FileUploadState | null>(null);
91
+ let fileInputRef = $state<HTMLInputElement>();
92
+
93
+ const CHUNK_SIZE = 5 * 1024 * 1024;
94
+ const MAX_FILE_SIZE = 99 * 1024 * 1024; // 99MB
95
+
96
+ function calculateChunks(file: File): number {
97
+ return Math.ceil(file.size / CHUNK_SIZE);
98
+ }
99
+
100
+ async function handleFileSelect(event: Event) {
101
+ if (readonly) return;
102
+
103
+ const input = event.target as HTMLInputElement;
104
+ if (!input.files?.length) return;
105
+
106
+ const validFiles: File[] = [];
107
+ const rejectedFiles: string[] = [];
108
+
109
+ Array.from(input.files).forEach((file) => {
110
+ if (file.size > MAX_FILE_SIZE) {
111
+ rejectedFiles.push(file.name);
112
+ } else {
113
+ validFiles.push(file);
114
+ }
115
+ });
116
+
117
+ const newFiles = validFiles.map((file) => ({
118
+ id: nanoid(),
119
+ file,
120
+ progress: {
121
+ uploaded: 0,
122
+ total: calculateChunks(file),
123
+ bytes: 0,
124
+ totalBytes: file.size,
125
+ percentComplete: 0
126
+ },
127
+ status: 'waiting' as UploadStatus
128
+ }));
129
+
130
+ fileUploads = [...fileUploads, ...newFiles];
131
+
132
+ input.value = '';
133
+ startUploads();
134
+ }
135
+ function startUploads() {
136
+ if (readonly) return;
137
+ fileUploads.filter((upload) => upload.status === 'waiting').forEach(uploadFile);
138
+ }
139
+ async function uploadFile(fileState: FileUploadState) {
140
+ if (readonly) return;
141
+ const { id, file } = fileState;
142
+ let uploadIdLocal = '';
143
+ let fileIdLocal = '';
144
+ let s3Key = '';
145
+
146
+ try {
147
+ fileState.status = 'uploading';
148
+ fileState.abortController = new AbortController();
149
+
150
+ const initResponse = await fetch('/api/multipart/init', {
151
+ method: 'POST',
152
+ headers: { 'Content-Type': 'application/json' },
153
+ body: JSON.stringify({
154
+ fileName: file.name,
155
+ contentType: file.type || 'application/octet-stream',
156
+ fileSize: file.size,
157
+ totalParts: calculateChunks(file),
158
+ parentId: folderId,
159
+ taskId: taskId
160
+ })
161
+ });
162
+
163
+ if (!initResponse.ok) {
164
+ throw new Error(`Failed to initialize upload: ${await initResponse.text()}`);
165
+ }
166
+
167
+ const {
168
+ uploadId,
169
+ fileId,
170
+ s3Key: fileKey,
171
+ parts
172
+ } = (await initResponse.json()) as InitResponse;
173
+ uploadIdLocal = uploadId;
174
+ fileIdLocal = fileId;
175
+ s3Key = fileKey;
176
+
177
+ const signal = fileState.abortController.signal;
178
+ const completedParts: CompletedPart[] = [];
179
+
180
+ for (let i = 0; i < parts.length; i++) {
181
+ if (signal.aborted) {
182
+ throw new Error('Upload aborted by user');
183
+ }
184
+
185
+ const { partNumber, url } = parts[i];
186
+ const start = (partNumber - 1) * CHUNK_SIZE;
187
+ const end = Math.min(file.size, start + CHUNK_SIZE);
188
+ const chunk = file.slice(start, end);
189
+
190
+ try {
191
+ const uploadResult = await uploadWithProgress(url, chunk, signal, (loaded) => {
192
+ // LE FIX: calcul propre du progress
193
+ const previousBytes = (partNumber - 1) * CHUNK_SIZE;
194
+ fileState.progress.bytes = previousBytes + loaded;
195
+ fileState.progress.percentComplete = (fileState.progress.bytes / file.size) * 100;
196
+ });
197
+
198
+ if (!uploadResult.ok) {
199
+ throw new Error(`Failed to upload part ${partNumber}: ${uploadResult.statusText}`);
200
+ }
201
+
202
+ const etag = uploadResult.headers.get('ETag')?.replace(/['"]/g, '') || '';
203
+ completedParts.push({ partNumber, etag });
204
+
205
+ // Pas besoin de double update ici, c'est déjà fait dans le callback
206
+ fileState.progress.uploaded = i + 1;
207
+ } catch (error) {
208
+ throw new Error('Failed to upload');
209
+ }
210
+ }
211
+
212
+ // 3. Complete the multipart upload
213
+ const completeResponse = await fetch(`/api/multipart/complete?taskId=${taskId}`, {
214
+ method: 'POST',
215
+ headers: { 'Content-Type': 'application/json' },
216
+ body: JSON.stringify({
217
+ uploadId,
218
+ fileId: fileIdLocal,
219
+ s3Key,
220
+ parts: completedParts
221
+ })
222
+ });
223
+
224
+ if (!completeResponse.ok) {
225
+ throw new Error(`Failed to complete upload: ${await completeResponse.text()}`);
226
+ }
227
+
228
+ fileState.status = 'complete';
229
+ } catch (error: any) {
230
+ fileState.status = 'error';
231
+ fileState.errorMessage = 'Ошибка загрузки';
232
+
233
+ // Try to abort the upload on S3 if it was initialized
234
+ if (uploadIdLocal && s3Key && fileIdLocal) {
235
+ try {
236
+ await fetch('/api/multipart/abort', {
237
+ method: 'POST',
238
+ headers: { 'Content-Type': 'application/json' },
239
+ body: JSON.stringify({
240
+ uploadId: uploadIdLocal,
241
+ fileId: fileIdLocal,
242
+ s3Key
243
+ })
244
+ });
245
+ } catch (abortError: any) {
246
+ console.error(abortError);
247
+ }
248
+ }
249
+ }
250
+ }
251
+
252
+ // Cancel an upload
253
+ function cancelUpload(fileState: FileUploadState) {
254
+ fileState.abortController?.abort();
255
+ fileState.status = 'error';
256
+ fileState.errorMessage = 'Загрузка отменена пользователем';
257
+ }
258
+
259
+ // Remove a file from the list
260
+ function removeFile(fileState: FileUploadState) {
261
+ // Cancel upload if in progress
262
+ if (fileState.status === 'uploading') {
263
+ cancelUpload(fileState);
264
+ }
265
+
266
+ // Remove from list
267
+ fileUploads = fileUploads.filter((upload) => upload.id !== fileState.id);
268
+ }
269
+
270
+ // Clean up abort controllers on component destroy
271
+ onDestroy(() => {
272
+ fileUploads.forEach((upload) => {
273
+ upload.abortController?.abort();
274
+ });
275
+ });
276
+
277
+ // Upload with progress tracking
278
+ async function uploadWithProgress(
279
+ url: string,
280
+ data: Blob,
281
+ signal: AbortSignal,
282
+ onProgress: (loaded: number) => void
283
+ ): Promise<Response> {
284
+ return new Promise((resolve, reject) => {
285
+ const xhr = new XMLHttpRequest();
286
+
287
+ xhr.upload.addEventListener('progress', (event) => {
288
+ if (event.lengthComputable) {
289
+ onProgress(event.loaded);
290
+ }
291
+ });
292
+
293
+ xhr.addEventListener('loadend', () => {
294
+ if (xhr.readyState === 4) {
295
+ if (xhr.status >= 200 && xhr.status < 300) {
296
+ // Convert XHR response to fetch Response for consistency
297
+ const response = new Response(xhr.response, {
298
+ status: xhr.status,
299
+ statusText: xhr.statusText,
300
+ headers: new Headers({
301
+ ETag: xhr.getResponseHeader('ETag') || ''
302
+ })
303
+ });
304
+ resolve(response);
305
+ } else {
306
+ reject(new Error(`HTTP error ${xhr.status}: ${xhr.statusText}`));
307
+ }
308
+ }
309
+ });
310
+
311
+ xhr.addEventListener('error', () => {
312
+ reject(new Error('Network error occurred'));
313
+ });
314
+
315
+ xhr.addEventListener('abort', () => {
316
+ reject(new Error('Upload aborted'));
317
+ });
318
+
319
+ // Initialize the request
320
+ xhr.open('PUT', url);
321
+ xhr.send(data);
322
+
323
+ // Handle abort signal
324
+ if (signal) {
325
+ signal.addEventListener('abort', () => {
326
+ xhr.abort();
327
+ });
328
+ }
329
+ });
330
+ }
331
+ let isDragging = $state(false);
332
+
333
+ function handleDragOver(e: DragEvent) {
334
+ if (readonly) return;
335
+ e.preventDefault();
336
+ isDragging = true;
337
+ }
338
+
339
+ function handleDragLeave() {
340
+ isDragging = false;
341
+ }
342
+
343
+ function handleDrop(e: DragEvent) {
344
+ if (readonly) return;
345
+ e.preventDefault();
346
+ isDragging = false;
347
+
348
+ if (!e.dataTransfer?.files.length) return;
349
+
350
+ // Create a synthetic event that mimics an input change event
351
+ const mockEvent = {
352
+ target: {
353
+ files: e.dataTransfer.files
354
+ }
355
+ } as unknown as Event;
356
+
357
+ // Use your existing file handling function
358
+ handleFileSelect(mockEvent);
359
+ }
360
+
361
+ function triggerBrowse() {
362
+ if (readonly) return;
363
+ fileInputRef?.click();
364
+ }
365
+
366
+ function handleKeydown(e: KeyboardEvent) {
367
+ if (readonly) return;
368
+ if (e.key === 'Enter' || e.key === ' ') {
369
+ e.preventDefault();
370
+ triggerBrowse();
371
+ }
372
+ }
373
+
374
+ const statusTone = (status: UploadStatus) => {
375
+ switch (status) {
376
+ case 'complete':
377
+ return 'bg-md-sys-color-primary-container text-md-sys-color-on-primary-container';
378
+ case 'error':
379
+ return 'bg-md-sys-color-error/12 text-md-sys-color-error';
380
+ case 'uploading':
381
+ return 'bg-md-sys-color-primary/10 text-md-sys-color-primary';
382
+ default:
383
+ return 'bg-md-sys-color-surface-variant text-md-sys-color-on-surface-variant';
384
+ }
385
+ };
386
+
387
+ const statusIcon = (status: UploadStatus) => {
388
+ switch (status) {
389
+ case 'complete':
390
+ return 'check_circle';
391
+ case 'error':
392
+ return 'error';
393
+ case 'uploading':
394
+ return 'cloud_upload';
395
+ default:
396
+ return 'schedule';
397
+ }
398
+ };
399
+
400
+ const statusLabel = (fileState: FileUploadState) => {
401
+ switch (fileState.status) {
402
+ case 'complete':
403
+ return 'Готово';
404
+ case 'error':
405
+ return 'Ошибка';
406
+ case 'uploading':
407
+ return `Загрузка — ${formatPercentage(fileState.progress.percentComplete)}%`;
408
+ default:
409
+ return 'В очереди';
410
+ }
411
+ };
412
+
413
+ const progressWidth = (fileState: FileUploadState) =>
414
+ fileState.status === 'complete' ? 100 : formatPercentage(fileState.progress.percentComplete);
415
+ </script>
416
+
417
+ <HStack>
418
+ <Title>{title}</Title>
419
+ <Label>Максимальный размер файла — 100 Мб.</Label>
420
+
421
+ <label
422
+ for="fileInput"
423
+ ondragover={handleDragOver}
424
+ ondragleave={handleDragLeave}
425
+ ondrop={handleDrop}
426
+ aria-label="Область загрузки файлов"
427
+ aria-disabled={readonly}
428
+ class={`group state-layer relative block ${readonly ? 'cursor-not-allowed opacity-80' : 'cursor-pointer'} focus-within:outline-md-sys-color-primary rounded-lg p-4 focus-within:outline-2 ${
429
+ isDragging
430
+ ? ' bg-md-sys-color-primary/6 shadow-elevation-1'
431
+ : ' bg-md-sys-color-surface-container-high '
432
+ }`}
433
+ >
434
+ <input
435
+ id="fileInput"
436
+ type="file"
437
+ name="file"
438
+ onchange={handleFileSelect}
439
+ multiple
440
+ class="sr-only"
441
+ disabled={readonly}
442
+ />
443
+
444
+ <div class="flex flex-col items-center gap-3 text-center">
445
+ <div
446
+ class={`flex size-12 items-center justify-center rounded-full ${
447
+ isDragging
448
+ ? 'bg-md-sys-color-primary text-md-sys-color-on-primary'
449
+ : 'bg-md-sys-color-primary-container text-md-sys-color-on-primary-container group-hover:bg-md-sys-color-primary group-hover:text-md-sys-color-on-primary'
450
+ }`}
451
+ >
452
+ <Icon name="file_upload" />
453
+ </div>
454
+
455
+ <div class="space-y-1">
456
+ <p class="md-sys-typescale-title-medium text-md-sys-color-on-surface">
457
+ Перетащите файлы сюда
458
+ </p>
459
+ <p class="md-sys-typescale-body-small text-md-sys-color-on-surface-variant">
460
+ Или нажмите, чтобы выбрать их на устройстве
461
+ </p>
462
+ </div>
463
+ </div>
464
+
465
+ <Layer />
466
+ </label>
467
+
468
+ {#if fileUploads.length > 0}
469
+ <div class="space-y-3">
470
+ {#each fileUploads as fileState (fileState.id)}
471
+ <div class=" bg-md-sys-color-surface-container-high flex items-center gap-3 rounded-lg p-3">
472
+ {#if fileState.status === 'uploading'}
473
+ <CircularProgress percent={progressWidth(fileState)} />
474
+ {:else}
475
+ <div
476
+ class={`flex size-10 items-center justify-center rounded-full ${statusTone(fileState.status)}`}
477
+ >
478
+ <Icon name={statusIcon(fileState.status)} />
479
+ </div>
480
+ {/if}
481
+
482
+ <div class="flex-1 space-y-1 overflow-hidden">
483
+ <p class="md-sys-typescale-body-large text-md-sys-color-on-surface truncate">
484
+ {fileState.file.name}
485
+ </p>
486
+
487
+ {#if fileState.errorMessage}
488
+ <p class="md-sys-typescale-body-small text-md-sys-color-error">
489
+ {fileState.errorMessage}
490
+ </p>
491
+ {/if}
492
+ </div>
493
+
494
+ <div class="flex items-center gap-1">
495
+ {#if fileState.status === 'uploading'}
496
+ <ButtonIcon
497
+ variant="text"
498
+ iconProps={{ name: 'close' }}
499
+ type="button"
500
+ onclick={() => cancelUpload(fileState)}
501
+ ></ButtonIcon>
502
+ {:else}
503
+ <ButtonIcon
504
+ variant="text"
505
+ iconProps={{ name: 'delete' }}
506
+ type="button"
507
+ onclick={() => (fileToRemove = fileState)}
508
+ ></ButtonIcon>
509
+ {/if}
510
+ </div>
511
+ </div>
512
+ {/each}
513
+ </div>
514
+ {/if}
515
+ </HStack>
516
+
517
+ <Dialogue
518
+ open={!!fileToRemove}
519
+ toggle={() => (fileToRemove = null)}
520
+ onconfirm={() => {
521
+ if (fileToRemove) {
522
+ removeFile(fileToRemove);
523
+ fileToRemove = null;
524
+ }
525
+ }}
526
+ confirmText="Удалить"
527
+ headline="Удаление файла"
528
+ supportingText={fileToRemove
529
+ ? `Вы действительно хотите удалить файл "${fileToRemove.file.name}"?`
530
+ : ''}
531
+ enhance={null}
532
+ />
@@ -0,0 +1,51 @@
1
+ type UploadStatus = 'waiting' | 'uploading' | 'complete' | 'error';
2
+ /**
3
+ * Internal state for a single file upload.
4
+ */
5
+ interface FileUploadState {
6
+ /** Unique identifier for the upload session */
7
+ id: string;
8
+ /** The file being uploaded */
9
+ file: File;
10
+ /** Upload progress tracking */
11
+ progress: {
12
+ /** Number of chunks uploaded */
13
+ uploaded: number;
14
+ /** Total number of chunks */
15
+ total: number;
16
+ /** Total bytes uploaded */
17
+ bytes: number;
18
+ /** Total size of the file in bytes */
19
+ totalBytes: number;
20
+ /** Percentage of upload completed (0-100) */
21
+ percentComplete: number;
22
+ };
23
+ /** Current status of the upload */
24
+ status: UploadStatus;
25
+ /** Optional error message if status is 'error' */
26
+ errorMessage?: string;
27
+ /** AbortController for cancelling the upload */
28
+ abortController?: AbortController;
29
+ }
30
+ type $$ComponentProps = {
31
+ /** Unique ID of the task associated with these uploads */
32
+ taskId?: string | null;
33
+ /** ID of the folder where files will be stored */
34
+ folderId?: string | null;
35
+ /** Whether the upload area is interactive */
36
+ readonly?: boolean;
37
+ /** Initial list of files to display */
38
+ initialUploads?: FileUploadState[];
39
+ /** Title displayed above the upload area */
40
+ title?: string;
41
+ /** Accessibility label for the upload zone */
42
+ label?: string;
43
+ };
44
+ /**
45
+ * @component
46
+ * Multipart file upload component that supports chunked uploads for large files.
47
+ * Follows Material 3 design principles for file uploaders.
48
+ */
49
+ declare const Multipart: import("svelte").Component<$$ComponentProps, {}, "">;
50
+ type Multipart = ReturnType<typeof Multipart>;
51
+ export default Multipart;
@@ -0,0 +1 @@
1
+ export { default as Multipart } from './Multipart.svelte';
@@ -0,0 +1,3 @@
1
+ // THIS FILE IS AUTO-GENERATED BY scripts/generate-components-index.ts - DO NOT EDIT MANUALLY
2
+ // default exports for components in this folder
3
+ export { default as Multipart } from './Multipart.svelte';
@@ -0,0 +1,51 @@
1
+ <!--
2
+ @component
3
+ Material 3 Pin Input.
4
+
5
+ Pin inputs allow users to enter a multi-digit code, such as an OTP or a security PIN.
6
+ -->
7
+ <script lang="ts">
8
+ import { PinInput } from 'bits-ui';
9
+ import { pinInput } from './theme.js';
10
+ import type { PinInputProps } from './types.js';
11
+
12
+ let {
13
+ value = $bindable(''),
14
+ count = 4,
15
+ label,
16
+ supportingText,
17
+ error = false,
18
+ disabled = false,
19
+ placeholder = '○',
20
+ maxlength,
21
+ ...restProps
22
+ }: PinInputProps = $props();
23
+
24
+ const cls = $derived(pinInput({ error, disabled }));
25
+ </script>
26
+
27
+ <div class={cls.root()}>
28
+ {#if label}
29
+ <span class={cls.label()}>{label}</span>
30
+ {/if}
31
+
32
+ <PinInput.Root bind:value maxlength={maxlength ?? count} {disabled} {...restProps}>
33
+ {#snippet children({ cells })}
34
+ <div class={cls.container()}>
35
+ {#each cells as cell}
36
+ <PinInput.Cell {cell} class={cls.cell()}>
37
+ {#if cell.char}
38
+ {cell.char}
39
+ {:else}
40
+ {placeholder}
41
+ {/if}
42
+ </PinInput.Cell>
43
+ {/each}
44
+ </div>
45
+ {/snippet}
46
+ </PinInput.Root>
47
+
48
+ {#if supportingText}
49
+ <span class={cls.supportingText()}>{supportingText}</span>
50
+ {/if}
51
+ </div>
@@ -0,0 +1,10 @@
1
+ import { PinInput } from 'bits-ui';
2
+ import type { PinInputProps } from './types.js';
3
+ /**
4
+ * Material 3 Pin Input.
5
+ *
6
+ * Pin inputs allow users to enter a multi-digit code, such as an OTP or a security PIN.
7
+ */
8
+ declare const PinInput: import("svelte").Component<PinInputProps, {}, "value">;
9
+ type PinInput = ReturnType<typeof PinInput>;
10
+ export default PinInput;
@@ -0,0 +1,3 @@
1
+ export * from './theme.js';
2
+ export * from './types.js';
3
+ export { default as PinInput } from './PinInput.svelte';
@@ -0,0 +1,6 @@
1
+ // THIS FILE IS AUTO-GENERATED BY scripts/generate-components-index.ts - DO NOT EDIT MANUALLY
2
+ // re-export TS/JS modules from this folder
3
+ export * from './theme.js';
4
+ export * from './types.js';
5
+ // default exports for components in this folder
6
+ export { default as PinInput } from './PinInput.svelte';