tera-system-ui 0.1.75 → 0.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 (1085) hide show
  1. package/dist/components/accordion/Accordion.recipe.d.ts +125 -0
  2. package/dist/components/accordion/Accordion.recipe.js +28 -0
  3. package/dist/components/accordion/components/Accordion.svelte +4 -1
  4. package/dist/components/accordion/components/AccordionContent.svelte +4 -6
  5. package/dist/components/accordion/components/AccordionItem.svelte +3 -2
  6. package/dist/components/accordion/components/AccordionTrigger.svelte +11 -9
  7. package/dist/components/accordion/components/AccordionTrigger.svelte.d.ts +3 -0
  8. package/dist/components/accordion/index.d.ts +2 -1
  9. package/dist/components/accordion/index.js +1 -0
  10. package/dist/components/alert/Alert.recipe.d.ts +113 -0
  11. package/dist/components/alert/Alert.recipe.js +53 -0
  12. package/dist/components/alert/Alert.svelte +28 -18
  13. package/dist/components/alert/Alert.svelte.d.ts +2 -13
  14. package/dist/components/alert/index.d.ts +2 -0
  15. package/dist/components/alert/index.js +1 -0
  16. package/dist/components/avatar/Avatar.recipe.d.ts +113 -0
  17. package/dist/components/avatar/Avatar.recipe.js +37 -0
  18. package/dist/components/avatar/Avatar.svelte +19 -24
  19. package/dist/components/avatar/Avatar.svelte.d.ts +1 -1
  20. package/dist/components/avatar/index.d.ts +2 -1
  21. package/dist/components/avatar/index.js +1 -0
  22. package/dist/components/badge/Badge.recipe.d.ts +68 -0
  23. package/dist/components/badge/Badge.recipe.js +35 -0
  24. package/dist/components/badge/Badge.svelte +15 -7
  25. package/dist/components/badge/Badge.svelte.d.ts +1 -1
  26. package/dist/components/badge/index.d.ts +2 -1
  27. package/dist/components/badge/index.js +1 -0
  28. package/dist/components/bottom-sheet/BottomSheet.recipe.d.ts +121 -0
  29. package/dist/components/bottom-sheet/BottomSheet.recipe.js +47 -0
  30. package/dist/components/bottom-sheet/BottomSheet.svelte +847 -0
  31. package/dist/components/bottom-sheet/BottomSheet.svelte.d.ts +4 -0
  32. package/dist/components/bottom-sheet/bottomSheetStore.svelte.d.ts +39 -0
  33. package/dist/components/bottom-sheet/bottomSheetStore.svelte.js +158 -0
  34. package/dist/components/bottom-sheet/index.d.ts +5 -0
  35. package/dist/components/bottom-sheet/index.js +3 -0
  36. package/dist/components/button/Button.recipe.d.ts +131 -0
  37. package/dist/components/button/Button.recipe.js +120 -0
  38. package/dist/components/button/Button.svelte +37 -23
  39. package/dist/components/button/Button.svelte.d.ts +1 -1
  40. package/dist/components/button/index.d.ts +2 -1
  41. package/dist/components/button/index.js +1 -0
  42. package/dist/components/card/{Card.d.ts → Card.recipe.d.ts} +18 -6
  43. package/dist/components/card/Card.recipe.js +41 -0
  44. package/dist/components/card/Card.svelte +5 -5
  45. package/dist/components/card/Card.svelte.d.ts +1 -1
  46. package/dist/components/card/index.d.ts +2 -1
  47. package/dist/components/card/index.js +1 -0
  48. package/dist/components/checkbox/Checkbox.recipe.d.ts +80 -0
  49. package/dist/components/checkbox/Checkbox.recipe.js +39 -0
  50. package/dist/components/checkbox/Checkbox.svelte +29 -35
  51. package/dist/components/checkbox/Checkbox.svelte.d.ts +1 -1
  52. package/dist/components/checkbox/index.d.ts +2 -1
  53. package/dist/components/checkbox/index.js +1 -0
  54. package/dist/components/combobox/Combobox.recipe.d.ts +138 -0
  55. package/dist/components/combobox/Combobox.recipe.js +50 -0
  56. package/dist/components/combobox/Combobox.svelte +57 -37
  57. package/dist/components/combobox/Combobox.svelte.d.ts +1 -1
  58. package/dist/components/combobox/index.d.ts +2 -1
  59. package/dist/components/combobox/index.js +1 -0
  60. package/dist/components/command/Command.recipe.d.ts +92 -0
  61. package/dist/components/command/Command.recipe.js +31 -0
  62. package/dist/components/command/components/command-empty.svelte +2 -2
  63. package/dist/components/command/components/command-group.svelte +4 -3
  64. package/dist/components/command/components/command-input.svelte +3 -7
  65. package/dist/components/command/components/command-item.svelte +2 -5
  66. package/dist/components/command/components/command-link-item.svelte +2 -5
  67. package/dist/components/command/components/command-list.svelte +2 -2
  68. package/dist/components/command/components/command-separator.svelte +2 -2
  69. package/dist/components/command/components/command-shortcut.svelte +2 -2
  70. package/dist/components/command/components/command-shortcut.svelte.d.ts +1 -1
  71. package/dist/components/command/components/command.svelte +2 -5
  72. package/dist/components/command/index.d.ts +2 -0
  73. package/dist/components/command/index.js +1 -0
  74. package/dist/components/date-range-picker/DateRangePicker.recipe.d.ts +220 -0
  75. package/dist/components/date-range-picker/DateRangePicker.recipe.js +113 -0
  76. package/dist/components/date-range-picker/DateRangePicker.svelte +53 -72
  77. package/dist/components/date-range-picker/DateRangePicker.svelte.d.ts +1 -1
  78. package/dist/components/date-range-picker/index.d.ts +2 -1
  79. package/dist/components/date-range-picker/index.js +1 -0
  80. package/dist/components/dialog/Dialog.recipe.d.ts +229 -0
  81. package/dist/components/dialog/Dialog.recipe.js +68 -0
  82. package/dist/components/dialog/Dialog.svelte +21 -39
  83. package/dist/components/dialog/Dialog.svelte.d.ts +1 -1
  84. package/dist/components/dialog/index.d.ts +2 -1
  85. package/dist/components/dialog/index.js +1 -0
  86. package/dist/components/drawer/Drawer.recipe.d.ts +140 -0
  87. package/dist/components/drawer/Drawer.recipe.js +50 -0
  88. package/dist/components/drawer/Drawer.svelte +16 -24
  89. package/dist/components/drawer/Drawer.svelte.d.ts +2 -14
  90. package/dist/components/drawer/index.d.ts +1 -0
  91. package/dist/components/drawer/index.js +1 -0
  92. package/dist/components/dropdown-menu/{DropdownMenu.d.ts → DropdownMenu.recipe.d.ts} +63 -4
  93. package/dist/components/dropdown-menu/DropdownMenu.recipe.js +41 -0
  94. package/dist/components/dropdown-menu/components/DropdownMenu.svelte +3 -8
  95. package/dist/components/dropdown-menu/components/DropdownMenu.svelte.d.ts +1 -1
  96. package/dist/components/dropdown-menu/components/DropdownMenuGroup.svelte +3 -2
  97. package/dist/components/dropdown-menu/components/DropdownMenuGroup.svelte.d.ts +1 -1
  98. package/dist/components/dropdown-menu/components/DropdownMenuHeader.svelte +3 -2
  99. package/dist/components/dropdown-menu/components/DropdownMenuHeader.svelte.d.ts +1 -1
  100. package/dist/components/dropdown-menu/components/DropdownMenuItem.svelte +3 -9
  101. package/dist/components/dropdown-menu/components/DropdownMenuItem.svelte.d.ts +1 -1
  102. package/dist/components/dropdown-menu/components/DropdownMenuSeparator.svelte +3 -2
  103. package/dist/components/dropdown-menu/components/DropdownMenuSeparator.svelte.d.ts +1 -1
  104. package/dist/components/dropdown-menu/index.d.ts +2 -1
  105. package/dist/components/dropdown-menu/index.js +1 -0
  106. package/dist/components/fonts/TeraFontMono.svelte +1 -1
  107. package/dist/components/fonts/TeraFontMono.svelte.d.ts +1 -1
  108. package/dist/components/input/Input.recipe.d.ts +166 -0
  109. package/dist/components/input/Input.recipe.js +86 -0
  110. package/dist/components/input/Input.svelte +43 -38
  111. package/dist/components/input/Input.svelte.d.ts +1 -1
  112. package/dist/components/input/index.d.ts +2 -1
  113. package/dist/components/input/index.js +1 -0
  114. package/dist/components/label/Label.recipe.d.ts +46 -0
  115. package/dist/components/label/Label.recipe.js +27 -0
  116. package/dist/components/label/Label.svelte +2 -2
  117. package/dist/components/label/Label.svelte.d.ts +1 -1
  118. package/dist/components/label/index.d.ts +2 -1
  119. package/dist/components/label/index.js +1 -0
  120. package/dist/components/popover/Popover.recipe.d.ts +80 -0
  121. package/dist/components/popover/Popover.recipe.js +23 -0
  122. package/dist/components/popover/Popover.svelte +4 -8
  123. package/dist/components/popover/Popover.svelte.d.ts +1 -1
  124. package/dist/components/popover/index.d.ts +2 -1
  125. package/dist/components/popover/index.js +1 -0
  126. package/dist/components/popover-responsive/PopoverResponsive.recipe.d.ts +85 -0
  127. package/dist/components/popover-responsive/PopoverResponsive.recipe.js +27 -0
  128. package/dist/components/popover-responsive/PopoverResponsive.svelte +38 -5
  129. package/dist/components/popover-responsive/PopoverResponsive.svelte.d.ts +1 -1
  130. package/dist/components/popover-responsive/index.d.ts +2 -1
  131. package/dist/components/popover-responsive/index.js +1 -0
  132. package/dist/components/select/Select.recipe.d.ts +190 -0
  133. package/dist/components/select/Select.recipe.js +51 -0
  134. package/dist/components/select/Select.svelte +18 -24
  135. package/dist/components/select/Select.svelte.d.ts +1 -1
  136. package/dist/components/select/index.d.ts +2 -1
  137. package/dist/components/select/index.js +1 -0
  138. package/dist/components/skeleton/Skeleton.recipe.d.ts +89 -0
  139. package/dist/components/skeleton/Skeleton.recipe.js +41 -0
  140. package/dist/components/skeleton/Skeleton.svelte +7 -6
  141. package/dist/components/skeleton/Skeleton.svelte.d.ts +2 -10
  142. package/dist/components/skeleton/index.d.ts +2 -0
  143. package/dist/components/skeleton/index.js +1 -0
  144. package/dist/components/slider/Slider.recipe.d.ts +115 -0
  145. package/dist/components/slider/Slider.recipe.js +50 -0
  146. package/dist/components/slider/Slider.svelte +6 -12
  147. package/dist/components/slider/Slider.svelte.d.ts +1 -1
  148. package/dist/components/slider/index.d.ts +3 -1
  149. package/dist/components/slider/index.js +1 -0
  150. package/dist/components/spinner/Spinner.recipe.d.ts +60 -0
  151. package/dist/components/spinner/Spinner.recipe.js +38 -0
  152. package/dist/components/spinner/Spinner.svelte +2 -2
  153. package/dist/components/spinner/Spinner.svelte.d.ts +2 -8
  154. package/dist/components/spinner/index.d.ts +2 -0
  155. package/dist/components/spinner/index.js +1 -0
  156. package/dist/components/star-rating/StarRating.recipe.d.ts +49 -0
  157. package/dist/components/star-rating/StarRating.recipe.js +29 -0
  158. package/dist/components/star-rating/StarRating.svelte +39 -35
  159. package/dist/components/star-rating/StarRating.svelte.d.ts +1 -1
  160. package/dist/components/star-rating/index.d.ts +2 -1
  161. package/dist/components/star-rating/index.js +1 -0
  162. package/dist/components/switch/Switch.recipe.d.ts +81 -0
  163. package/dist/components/switch/Switch.recipe.js +38 -0
  164. package/dist/components/switch/Switch.svelte +27 -36
  165. package/dist/components/switch/Switch.svelte.d.ts +1 -1
  166. package/dist/components/switch/index.d.ts +2 -1
  167. package/dist/components/switch/index.js +1 -0
  168. package/dist/components/table/Table.recipe.d.ts +134 -0
  169. package/dist/components/table/Table.recipe.js +44 -0
  170. package/dist/components/table/Table.svelte +10 -10
  171. package/dist/components/table/Table.svelte.d.ts +2 -17
  172. package/dist/components/table/index.d.ts +2 -0
  173. package/dist/components/table/index.js +1 -0
  174. package/dist/components/tabs/Tabs.recipe.d.ts +161 -0
  175. package/dist/components/tabs/Tabs.recipe.js +76 -0
  176. package/dist/components/tabs/Tabs.svelte.d.ts +2 -57
  177. package/dist/components/tabs/Tabs.svelte.js +3 -0
  178. package/dist/components/tabs/components/Tabs.svelte +8 -8
  179. package/dist/components/tabs/components/Tabs.svelte.d.ts +1 -1
  180. package/dist/components/tabs/components/TabsContent.svelte +3 -2
  181. package/dist/components/tabs/components/TabsContent.svelte.d.ts +1 -1
  182. package/dist/components/tabs/components/TabsItem.svelte +11 -36
  183. package/dist/components/tabs/components/TabsItem.svelte.d.ts +1 -1
  184. package/dist/components/tabs/components/TabsList.svelte +11 -40
  185. package/dist/components/tabs/components/TabsList.svelte.d.ts +1 -1
  186. package/dist/components/tabs/index.d.ts +2 -1
  187. package/dist/components/tabs/index.js +1 -0
  188. package/dist/components/text-area/TextArea.recipe.d.ts +181 -0
  189. package/dist/components/text-area/TextArea.recipe.js +81 -0
  190. package/dist/components/text-area/TextArea.svelte +68 -63
  191. package/dist/components/text-area/TextArea.svelte.d.ts +1 -1
  192. package/dist/components/text-area/index.d.ts +2 -1
  193. package/dist/components/text-area/index.js +1 -0
  194. package/dist/components/toast/ToastContainer.svelte +15 -16
  195. package/dist/components/tooltip/Tooltip.recipe.d.ts +79 -0
  196. package/dist/components/tooltip/Tooltip.recipe.js +26 -0
  197. package/dist/components/tooltip/Tooltip.svelte +10 -7
  198. package/dist/components/tooltip/Tooltip.svelte.d.ts +1 -1
  199. package/dist/components/tooltip/index.d.ts +2 -1
  200. package/dist/components/tooltip/index.js +1 -0
  201. package/dist/index.d.ts +55 -65
  202. package/dist/index.js +28 -37
  203. package/dist/{components → internal}/icons/IconCheck.svelte +3 -4
  204. package/dist/{components → internal}/icons/IconChevronDown.svelte +3 -4
  205. package/dist/{components → internal}/icons/IconSearch.svelte +3 -4
  206. package/dist/{components → internal}/icons/IconX.svelte +3 -4
  207. package/dist/internal/icons/index.d.ts +4 -0
  208. package/dist/internal/icons/index.js +4 -0
  209. package/dist/llms/accordion.md +2 -1
  210. package/dist/llms/alert.md +7 -2
  211. package/dist/llms/avatar.md +2 -2
  212. package/dist/llms/badge.md +4 -0
  213. package/dist/llms/bottom-sheet.md +44 -0
  214. package/dist/llms/button.md +7 -1
  215. package/dist/llms/card.md +2 -0
  216. package/dist/llms/checkbox.md +2 -1
  217. package/dist/llms/colors.md +20 -20
  218. package/dist/llms/combobox.md +8 -2
  219. package/dist/llms/command.md +2 -0
  220. package/dist/llms/date-range-picker.md +12 -2
  221. package/dist/llms/dialog.md +9 -4
  222. package/dist/llms/drawer.md +13 -8
  223. package/dist/llms/dropdown-menu.md +11 -2
  224. package/dist/llms/index.md +1 -13
  225. package/dist/llms/input.md +3 -0
  226. package/dist/llms/label.md +2 -0
  227. package/dist/llms/popover-responsive.md +10 -2
  228. package/dist/llms/popover.md +1 -1
  229. package/dist/llms/select.md +2 -1
  230. package/dist/llms/skeleton.md +8 -5
  231. package/dist/llms/slider.md +5 -3
  232. package/dist/llms/spinner.md +6 -2
  233. package/dist/llms/star-rating.md +3 -0
  234. package/dist/llms/switch.md +2 -1
  235. package/dist/llms/table.md +14 -7
  236. package/dist/llms/tabs.md +18 -3
  237. package/dist/llms/text-area.md +3 -0
  238. package/dist/llms/tooltip.md +2 -1
  239. package/dist/recipes/index.d.ts +79 -0
  240. package/dist/recipes/index.js +52 -0
  241. package/dist/stories/ComponentOverview.stories.svelte +346 -350
  242. package/dist/themes/tera-ui-base.css +149 -62
  243. package/dist/themes/theme-cv-builder.css +146 -0
  244. package/dist/themes/theme-professional.css +8 -33
  245. package/dist/tokens/index.d.ts +168 -0
  246. package/dist/tokens/index.js +122 -0
  247. package/dist/types/index.d.ts +19 -24
  248. package/package.json +30 -50
  249. package/registry/accordion.json +65 -0
  250. package/registry/alert.json +43 -0
  251. package/registry/avatar.json +43 -0
  252. package/registry/badge.json +43 -0
  253. package/registry/bottom-sheet.json +50 -0
  254. package/registry/button.json +43 -0
  255. package/registry/card.json +43 -0
  256. package/registry/checkbox.json +45 -0
  257. package/registry/combobox.json +45 -0
  258. package/registry/command.json +109 -0
  259. package/registry/date-range-picker.json +48 -0
  260. package/registry/dialog.json +50 -0
  261. package/registry/drawer.json +45 -0
  262. package/registry/dropdown-menu.json +72 -0
  263. package/registry/fonts.json +41 -0
  264. package/registry/index.json +193 -0
  265. package/registry/input.json +43 -0
  266. package/registry/label.json +44 -0
  267. package/registry/popover-responsive.json +46 -0
  268. package/registry/popover.json +44 -0
  269. package/registry/select.json +51 -0
  270. package/registry/skeleton.json +43 -0
  271. package/registry/slider.json +44 -0
  272. package/registry/spinner.json +43 -0
  273. package/registry/star-rating.json +43 -0
  274. package/registry/switch.json +44 -0
  275. package/registry/table.json +45 -0
  276. package/registry/tabs.json +71 -0
  277. package/registry/text-area.json +43 -0
  278. package/registry/toast.json +41 -0
  279. package/registry/tooltip.json +44 -0
  280. package/scripts/generate-ts-index.js +1 -18
  281. package/scripts/tera-ui.mjs +171 -0
  282. package/dist/components/accordion/Accordion.d.ts +0 -52
  283. package/dist/components/accordion/Accordion.js +0 -11
  284. package/dist/components/ai/ChatBubble.svelte +0 -35
  285. package/dist/components/ai/ChatBubble.svelte.d.ts +0 -12
  286. package/dist/components/ai/PromptInput.svelte +0 -58
  287. package/dist/components/ai/PromptInput.svelte.d.ts +0 -13
  288. package/dist/components/ai/StreamText.svelte +0 -41
  289. package/dist/components/ai/StreamText.svelte.d.ts +0 -11
  290. package/dist/components/ai/SuggestionChips.svelte +0 -34
  291. package/dist/components/ai/SuggestionChips.svelte.d.ts +0 -10
  292. package/dist/components/ai/ThinkingLoader.svelte +0 -34
  293. package/dist/components/ai/ThinkingLoader.svelte.d.ts +0 -11
  294. package/dist/components/ai/index.d.ts +0 -5
  295. package/dist/components/ai/index.js +0 -5
  296. package/dist/components/avatar/Avatar.d.ts +0 -45
  297. package/dist/components/avatar/Avatar.js +0 -35
  298. package/dist/components/badge/Badge.d.ts +0 -52
  299. package/dist/components/badge/Badge.js +0 -22
  300. package/dist/components/brand-logo/BrandLogo.d.ts +0 -38
  301. package/dist/components/brand-logo/BrandLogo.js +0 -18
  302. package/dist/components/brand-logo/BrandLogo.svelte +0 -36
  303. package/dist/components/brand-logo/BrandLogo.svelte.d.ts +0 -4
  304. package/dist/components/brand-logo/index.d.ts +0 -2
  305. package/dist/components/brand-logo/index.js +0 -1
  306. package/dist/components/button/Button.d.ts +0 -113
  307. package/dist/components/button/Button.js +0 -135
  308. package/dist/components/card/Card.js +0 -28
  309. package/dist/components/checkbox/Checkbox.d.ts +0 -32
  310. package/dist/components/checkbox/Checkbox.js +0 -11
  311. package/dist/components/combobox/Combobox.d.ts +0 -47
  312. package/dist/components/combobox/Combobox.js +0 -5
  313. package/dist/components/date-range-picker/DateRangePicker.types.d.ts +0 -38
  314. package/dist/components/date-range-picker/DateRangePicker.types.js +0 -1
  315. package/dist/components/dialog/Dialog.d.ts +0 -55
  316. package/dist/components/dialog/Dialog.js +0 -1
  317. package/dist/components/dropdown-menu/DropdownMenu.js +0 -1
  318. package/dist/components/header/Header.d.ts +0 -11
  319. package/dist/components/header/Header.js +0 -7
  320. package/dist/components/header/Header.svelte +0 -33
  321. package/dist/components/header/Header.svelte.d.ts +0 -5
  322. package/dist/components/header/header.scss +0 -20
  323. package/dist/components/header/index.d.ts +0 -2
  324. package/dist/components/header/index.js +0 -1
  325. package/dist/components/header/package.json +0 -14
  326. package/dist/components/icons/IconArrowBigRightFilled.svelte +0 -7
  327. package/dist/components/icons/IconArrowBigRightFilled.svelte.d.ts +0 -5
  328. package/dist/components/icons/IconBook.svelte +0 -7
  329. package/dist/components/icons/IconBook.svelte.d.ts +0 -5
  330. package/dist/components/icons/IconBookmarkPlus.svelte +0 -7
  331. package/dist/components/icons/IconBookmarkPlus.svelte.d.ts +0 -5
  332. package/dist/components/icons/IconCalculator.svelte +0 -7
  333. package/dist/components/icons/IconCalculator.svelte.d.ts +0 -5
  334. package/dist/components/icons/IconCoin.svelte +0 -7
  335. package/dist/components/icons/IconCoin.svelte.d.ts +0 -5
  336. package/dist/components/icons/IconCoinConvert.svelte +0 -17
  337. package/dist/components/icons/IconCoinConvert.svelte.d.ts +0 -4
  338. package/dist/components/icons/IconCopy.svelte +0 -7
  339. package/dist/components/icons/IconCopy.svelte.d.ts +0 -5
  340. package/dist/components/icons/IconCopyCheckFilled.svelte +0 -7
  341. package/dist/components/icons/IconCopyCheckFilled.svelte.d.ts +0 -5
  342. package/dist/components/icons/IconHamburger.svelte +0 -7
  343. package/dist/components/icons/IconHamburger.svelte.d.ts +0 -4
  344. package/dist/components/icons/IconLanguage.svelte +0 -7
  345. package/dist/components/icons/IconLanguage.svelte.d.ts +0 -5
  346. package/dist/components/icons/IconLoader2.svelte +0 -7
  347. package/dist/components/icons/IconLoader2.svelte.d.ts +0 -5
  348. package/dist/components/icons/IconLogout.svelte +0 -7
  349. package/dist/components/icons/IconLogout.svelte.d.ts +0 -5
  350. package/dist/components/icons/IconMoon.svelte +0 -7
  351. package/dist/components/icons/IconMoon.svelte.d.ts +0 -4
  352. package/dist/components/icons/IconPointFilled.svelte +0 -7
  353. package/dist/components/icons/IconPointFilled.svelte.d.ts +0 -5
  354. package/dist/components/icons/IconSettings.svelte +0 -7
  355. package/dist/components/icons/IconSettings.svelte.d.ts +0 -5
  356. package/dist/components/icons/IconSun.svelte +0 -7
  357. package/dist/components/icons/IconSun.svelte.d.ts +0 -4
  358. package/dist/components/icons/IconSwitchHorizontal.svelte +0 -7
  359. package/dist/components/icons/IconSwitchHorizontal.svelte.d.ts +0 -5
  360. package/dist/components/icons/IconSwitchVertical.svelte +0 -7
  361. package/dist/components/icons/IconSwitchVertical.svelte.d.ts +0 -5
  362. package/dist/components/icons/IconTransform.svelte +0 -7
  363. package/dist/components/icons/IconTransform.svelte.d.ts +0 -5
  364. package/dist/components/icons/index.d.ts +0 -23
  365. package/dist/components/icons/index.js +0 -23
  366. package/dist/components/input/Input.d.ts +0 -72
  367. package/dist/components/input/Input.js +0 -45
  368. package/dist/components/label/Label.d.ts +0 -38
  369. package/dist/components/label/Label.js +0 -18
  370. package/dist/components/language-picker-button/LanguagePickerButton.d.ts +0 -15
  371. package/dist/components/language-picker-button/LanguagePickerButton.js +0 -7
  372. package/dist/components/language-picker-button/LanguagePickerButton.svelte +0 -78
  373. package/dist/components/language-picker-button/LanguagePickerButton.svelte.d.ts +0 -7
  374. package/dist/components/language-picker-button/index.d.ts +0 -2
  375. package/dist/components/language-picker-button/index.js +0 -1
  376. package/dist/components/light-dark-toggle/LightDarkToggle.d.ts +0 -11
  377. package/dist/components/light-dark-toggle/LightDarkToggle.js +0 -7
  378. package/dist/components/light-dark-toggle/LightDarkToggle.svelte +0 -33
  379. package/dist/components/light-dark-toggle/LightDarkToggle.svelte.d.ts +0 -4
  380. package/dist/components/light-dark-toggle/index.d.ts +0 -2
  381. package/dist/components/light-dark-toggle/index.js +0 -1
  382. package/dist/components/marketing/FeatureCard.svelte +0 -37
  383. package/dist/components/marketing/FeatureCard.svelte.d.ts +0 -13
  384. package/dist/components/marketing/PricingCard.svelte +0 -48
  385. package/dist/components/marketing/PricingCard.svelte.d.ts +0 -15
  386. package/dist/components/marketing/StatBlock.svelte +0 -14
  387. package/dist/components/marketing/StatBlock.svelte.d.ts +0 -10
  388. package/dist/components/marketing/TestimonialCard.svelte +0 -24
  389. package/dist/components/marketing/TestimonialCard.svelte.d.ts +0 -12
  390. package/dist/components/marketing/index.d.ts +0 -4
  391. package/dist/components/marketing/index.js +0 -4
  392. package/dist/components/popover/Popover.d.ts +0 -37
  393. package/dist/components/popover/Popover.js +0 -1
  394. package/dist/components/popover-responsive/PopoverResponsive.d.ts +0 -22
  395. package/dist/components/popover-responsive/PopoverResponsive.js +0 -1
  396. package/dist/components/select/Select.d.ts +0 -106
  397. package/dist/components/select/Select.js +0 -24
  398. package/dist/components/side-navigation/SideNavigation.d.ts +0 -72
  399. package/dist/components/side-navigation/SideNavigation.js +0 -91
  400. package/dist/components/side-navigation/SideNavigation.svelte +0 -143
  401. package/dist/components/side-navigation/SideNavigation.svelte.d.ts +0 -4
  402. package/dist/components/side-navigation/SideNavigationGroup.svelte +0 -40
  403. package/dist/components/side-navigation/SideNavigationGroup.svelte.d.ts +0 -10
  404. package/dist/components/side-navigation/SideNavigationItem.svelte +0 -18
  405. package/dist/components/side-navigation/SideNavigationItem.svelte.d.ts +0 -8
  406. package/dist/components/side-navigation/SideNavigationLayout.svelte +0 -19
  407. package/dist/components/side-navigation/SideNavigationLayout.svelte.d.ts +0 -9
  408. package/dist/components/side-navigation/index.d.ts +0 -5
  409. package/dist/components/side-navigation/index.js +0 -4
  410. package/dist/components/side-navigation/sidenav.scss +0 -226
  411. package/dist/components/slider/Slider.d.ts +0 -28
  412. package/dist/components/slider/Slider.js +0 -1
  413. package/dist/components/star-rating/StarRating.d.ts +0 -31
  414. package/dist/components/star-rating/StarRating.js +0 -15
  415. package/dist/components/switch/Switch.d.ts +0 -27
  416. package/dist/components/switch/Switch.js +0 -11
  417. package/dist/components/tera-ui-context/TeraUiContext.d.ts +0 -11
  418. package/dist/components/tera-ui-context/TeraUiContext.js +0 -1
  419. package/dist/components/tera-ui-context/TeraUiContext.svelte +0 -13
  420. package/dist/components/tera-ui-context/TeraUiContext.svelte.d.ts +0 -4
  421. package/dist/components/tera-ui-context/global-context-store.d.ts +0 -3
  422. package/dist/components/tera-ui-context/global-context-store.js +0 -2
  423. package/dist/components/tera-ui-context/global-context.d.ts +0 -3
  424. package/dist/components/tera-ui-context/global-context.js +0 -24
  425. package/dist/components/tera-ui-context/index.d.ts +0 -2
  426. package/dist/components/tera-ui-context/index.js +0 -1
  427. package/dist/components/text-area/TextArea.d.ts +0 -87
  428. package/dist/components/text-area/TextArea.js +0 -48
  429. package/dist/components/tooltip/Tooltip.d.ts +0 -23
  430. package/dist/components/tooltip/Tooltip.js +0 -1
  431. package/dist/components/user-avatar-with-menu/UserAvatarWithMenu.d.ts +0 -14
  432. package/dist/components/user-avatar-with-menu/UserAvatarWithMenu.js +0 -7
  433. package/dist/components/user-avatar-with-menu/UserAvatarWithMenu.svelte +0 -48
  434. package/dist/components/user-avatar-with-menu/UserAvatarWithMenu.svelte.d.ts +0 -4
  435. package/dist/components/user-avatar-with-menu/index.d.ts +0 -2
  436. package/dist/components/user-avatar-with-menu/index.js +0 -1
  437. package/dist/i18n/index.d.ts +0 -1
  438. package/dist/i18n/index.js +0 -1
  439. package/dist/i18n/language.d.ts +0 -2
  440. package/dist/i18n/language.js +0 -45
  441. package/dist/internal/service/user.service.d.ts +0 -2
  442. package/dist/internal/service/user.service.js +0 -20
  443. package/dist/llms/ai.md +0 -110
  444. package/dist/llms/brand-logo.md +0 -30
  445. package/dist/llms/header.md +0 -26
  446. package/dist/llms/icons.md +0 -43
  447. package/dist/llms/language-picker-button.md +0 -30
  448. package/dist/llms/light-dark-toggle.md +0 -26
  449. package/dist/llms/marketing.md +0 -95
  450. package/dist/llms/side-navigation.md +0 -51
  451. package/dist/llms/tera-ui-context.md +0 -30
  452. package/dist/llms/user-avatar-with-menu.md +0 -28
  453. package/dist/paraglide/.prettierignore +0 -3
  454. package/dist/paraglide/README.md +0 -162
  455. package/dist/paraglide/messages/_index.d.ts +0 -106
  456. package/dist/paraglide/messages/_index.js +0 -439
  457. package/dist/paraglide/messages/ar.d.ts +0 -23
  458. package/dist/paraglide/messages/ar.js +0 -38
  459. package/dist/paraglide/messages/bg.d.ts +0 -23
  460. package/dist/paraglide/messages/bg.js +0 -38
  461. package/dist/paraglide/messages/bn.d.ts +0 -23
  462. package/dist/paraglide/messages/bn.js +0 -38
  463. package/dist/paraglide/messages/ca.d.ts +0 -23
  464. package/dist/paraglide/messages/ca.js +0 -38
  465. package/dist/paraglide/messages/cs.d.ts +0 -23
  466. package/dist/paraglide/messages/cs.js +0 -38
  467. package/dist/paraglide/messages/da.d.ts +0 -23
  468. package/dist/paraglide/messages/da.js +0 -38
  469. package/dist/paraglide/messages/de.d.ts +0 -23
  470. package/dist/paraglide/messages/de.js +0 -38
  471. package/dist/paraglide/messages/el.d.ts +0 -23
  472. package/dist/paraglide/messages/el.js +0 -38
  473. package/dist/paraglide/messages/en.d.ts +0 -23
  474. package/dist/paraglide/messages/en.js +0 -38
  475. package/dist/paraglide/messages/es.d.ts +0 -23
  476. package/dist/paraglide/messages/es.js +0 -38
  477. package/dist/paraglide/messages/fi.d.ts +0 -23
  478. package/dist/paraglide/messages/fi.js +0 -38
  479. package/dist/paraglide/messages/fr.d.ts +0 -23
  480. package/dist/paraglide/messages/fr.js +0 -38
  481. package/dist/paraglide/messages/he.d.ts +0 -23
  482. package/dist/paraglide/messages/he.js +0 -38
  483. package/dist/paraglide/messages/hi.d.ts +0 -23
  484. package/dist/paraglide/messages/hi.js +0 -38
  485. package/dist/paraglide/messages/hu.d.ts +0 -23
  486. package/dist/paraglide/messages/hu.js +0 -38
  487. package/dist/paraglide/messages/id.d.ts +0 -23
  488. package/dist/paraglide/messages/id.js +0 -38
  489. package/dist/paraglide/messages/it.d.ts +0 -23
  490. package/dist/paraglide/messages/it.js +0 -38
  491. package/dist/paraglide/messages/ja.d.ts +0 -23
  492. package/dist/paraglide/messages/ja.js +0 -38
  493. package/dist/paraglide/messages/ko.d.ts +0 -23
  494. package/dist/paraglide/messages/ko.js +0 -38
  495. package/dist/paraglide/messages/lt.d.ts +0 -23
  496. package/dist/paraglide/messages/lt.js +0 -38
  497. package/dist/paraglide/messages/lv.d.ts +0 -23
  498. package/dist/paraglide/messages/lv.js +0 -38
  499. package/dist/paraglide/messages/ms.d.ts +0 -23
  500. package/dist/paraglide/messages/ms.js +0 -38
  501. package/dist/paraglide/messages/nl.d.ts +0 -23
  502. package/dist/paraglide/messages/nl.js +0 -38
  503. package/dist/paraglide/messages/no.d.ts +0 -23
  504. package/dist/paraglide/messages/no.js +0 -38
  505. package/dist/paraglide/messages/pl.d.ts +0 -23
  506. package/dist/paraglide/messages/pl.js +0 -38
  507. package/dist/paraglide/messages/pt.d.ts +0 -23
  508. package/dist/paraglide/messages/pt.js +0 -38
  509. package/dist/paraglide/messages/ro.d.ts +0 -23
  510. package/dist/paraglide/messages/ro.js +0 -38
  511. package/dist/paraglide/messages/ru.d.ts +0 -23
  512. package/dist/paraglide/messages/ru.js +0 -38
  513. package/dist/paraglide/messages/sk.d.ts +0 -23
  514. package/dist/paraglide/messages/sk.js +0 -38
  515. package/dist/paraglide/messages/sl.d.ts +0 -23
  516. package/dist/paraglide/messages/sl.js +0 -38
  517. package/dist/paraglide/messages/sq.d.ts +0 -23
  518. package/dist/paraglide/messages/sq.js +0 -38
  519. package/dist/paraglide/messages/sr.d.ts +0 -23
  520. package/dist/paraglide/messages/sr.js +0 -38
  521. package/dist/paraglide/messages/sv.d.ts +0 -23
  522. package/dist/paraglide/messages/sv.js +0 -38
  523. package/dist/paraglide/messages/sw.d.ts +0 -23
  524. package/dist/paraglide/messages/sw.js +0 -38
  525. package/dist/paraglide/messages/ta.d.ts +0 -23
  526. package/dist/paraglide/messages/ta.js +0 -38
  527. package/dist/paraglide/messages/te.d.ts +0 -23
  528. package/dist/paraglide/messages/te.js +0 -38
  529. package/dist/paraglide/messages/th.d.ts +0 -23
  530. package/dist/paraglide/messages/th.js +0 -38
  531. package/dist/paraglide/messages/tl.d.ts +0 -23
  532. package/dist/paraglide/messages/tl.js +0 -38
  533. package/dist/paraglide/messages/tr.d.ts +0 -23
  534. package/dist/paraglide/messages/tr.js +0 -38
  535. package/dist/paraglide/messages/uk.d.ts +0 -23
  536. package/dist/paraglide/messages/uk.js +0 -38
  537. package/dist/paraglide/messages/vi.d.ts +0 -23
  538. package/dist/paraglide/messages/vi.js +0 -38
  539. package/dist/paraglide/messages/zh-CN.d.ts +0 -23
  540. package/dist/paraglide/messages/zh-CN.js +0 -38
  541. package/dist/paraglide/messages/zh-TW.d.ts +0 -23
  542. package/dist/paraglide/messages/zh-TW.js +0 -38
  543. package/dist/paraglide/messages.d.ts +0 -2
  544. package/dist/paraglide/messages.js +0 -4
  545. package/dist/paraglide/registry.d.ts +0 -34
  546. package/dist/paraglide/registry.js +0 -46
  547. package/dist/paraglide/runtime.d.ts +0 -758
  548. package/dist/paraglide/runtime.js +0 -1990
  549. package/dist/paraglide/server.d.ts +0 -96
  550. package/dist/paraglide/server.js +0 -277
  551. package/dist/tera-i18n/README.md +0 -105
  552. package/dist/tera-i18n/assets/world-flags/Algeria.svg +0 -13
  553. package/dist/tera-i18n/assets/world-flags/East Timor.svg +0 -13
  554. package/dist/tera-i18n/assets/world-flags/Rapa Nui.svg +0 -11
  555. package/dist/tera-i18n/assets/world-flags/abkhazia.svg +0 -23
  556. package/dist/tera-i18n/assets/world-flags/afghanistan.svg +0 -14
  557. package/dist/tera-i18n/assets/world-flags/aland islands.svg +0 -15
  558. package/dist/tera-i18n/assets/world-flags/albania.svg +0 -11
  559. package/dist/tera-i18n/assets/world-flags/american samoa.svg +0 -15
  560. package/dist/tera-i18n/assets/world-flags/andorra.svg +0 -15
  561. package/dist/tera-i18n/assets/world-flags/angola.svg +0 -14
  562. package/dist/tera-i18n/assets/world-flags/anguilla.svg +0 -19
  563. package/dist/tera-i18n/assets/world-flags/antigua and barbuda.svg +0 -15
  564. package/dist/tera-i18n/assets/world-flags/argentina.svg +0 -13
  565. package/dist/tera-i18n/assets/world-flags/armenia.svg +0 -12
  566. package/dist/tera-i18n/assets/world-flags/aruba.svg +0 -15
  567. package/dist/tera-i18n/assets/world-flags/australia.svg +0 -21
  568. package/dist/tera-i18n/assets/world-flags/austria.svg +0 -12
  569. package/dist/tera-i18n/assets/world-flags/azerbaijan.svg +0 -14
  570. package/dist/tera-i18n/assets/world-flags/azores islands.svg +0 -21
  571. package/dist/tera-i18n/assets/world-flags/bahamas.svg +0 -13
  572. package/dist/tera-i18n/assets/world-flags/bahrain.svg +0 -11
  573. package/dist/tera-i18n/assets/world-flags/balearic islands.svg +0 -16
  574. package/dist/tera-i18n/assets/world-flags/bangladesh.svg +0 -11
  575. package/dist/tera-i18n/assets/world-flags/barbados.svg +0 -13
  576. package/dist/tera-i18n/assets/world-flags/basque country.svg +0 -20
  577. package/dist/tera-i18n/assets/world-flags/belarus.svg +0 -18
  578. package/dist/tera-i18n/assets/world-flags/belgium.svg +0 -12
  579. package/dist/tera-i18n/assets/world-flags/belize.svg +0 -17
  580. package/dist/tera-i18n/assets/world-flags/benin.svg +0 -12
  581. package/dist/tera-i18n/assets/world-flags/bermuda.svg +0 -20
  582. package/dist/tera-i18n/assets/world-flags/bhutan.svg +0 -13
  583. package/dist/tera-i18n/assets/world-flags/bolivia.svg +0 -12
  584. package/dist/tera-i18n/assets/world-flags/bonaire.svg +0 -14
  585. package/dist/tera-i18n/assets/world-flags/bosnia and herzegovina.svg +0 -13
  586. package/dist/tera-i18n/assets/world-flags/botswana.svg +0 -13
  587. package/dist/tera-i18n/assets/world-flags/brazil.svg +0 -14
  588. package/dist/tera-i18n/assets/world-flags/british columbia.svg +0 -31
  589. package/dist/tera-i18n/assets/world-flags/british indian ocean territory.svg +0 -29
  590. package/dist/tera-i18n/assets/world-flags/british virgin islands.svg +0 -24
  591. package/dist/tera-i18n/assets/world-flags/brunei.svg +0 -19
  592. package/dist/tera-i18n/assets/world-flags/bulgaria.svg +0 -12
  593. package/dist/tera-i18n/assets/world-flags/burkina faso.svg +0 -12
  594. package/dist/tera-i18n/assets/world-flags/burundi.svg +0 -18
  595. package/dist/tera-i18n/assets/world-flags/cambodia.svg +0 -13
  596. package/dist/tera-i18n/assets/world-flags/cameroon.svg +0 -13
  597. package/dist/tera-i18n/assets/world-flags/canada.svg +0 -13
  598. package/dist/tera-i18n/assets/world-flags/canary islands.svg +0 -12
  599. package/dist/tera-i18n/assets/world-flags/cape verde.svg +0 -23
  600. package/dist/tera-i18n/assets/world-flags/catalonia.svg +0 -7
  601. package/dist/tera-i18n/assets/world-flags/cayman islands.svg +0 -20
  602. package/dist/tera-i18n/assets/world-flags/central african republic.svg +0 -20
  603. package/dist/tera-i18n/assets/world-flags/ceuta.svg +0 -29
  604. package/dist/tera-i18n/assets/world-flags/chad.svg +0 -12
  605. package/dist/tera-i18n/assets/world-flags/chile.svg +0 -13
  606. package/dist/tera-i18n/assets/world-flags/china.svg +0 -15
  607. package/dist/tera-i18n/assets/world-flags/cocos island.svg +0 -19
  608. package/dist/tera-i18n/assets/world-flags/colombia.svg +0 -12
  609. package/dist/tera-i18n/assets/world-flags/comoros.svg +0 -19
  610. package/dist/tera-i18n/assets/world-flags/cook islands.svg +0 -22
  611. package/dist/tera-i18n/assets/world-flags/corsica.svg +0 -12
  612. package/dist/tera-i18n/assets/world-flags/costa rica.svg +0 -13
  613. package/dist/tera-i18n/assets/world-flags/croatia.svg +0 -31
  614. package/dist/tera-i18n/assets/world-flags/cuba.svg +0 -16
  615. package/dist/tera-i18n/assets/world-flags/curacao.svg +0 -14
  616. package/dist/tera-i18n/assets/world-flags/cyprus.svg +0 -12
  617. package/dist/tera-i18n/assets/world-flags/czech republic.svg +0 -12
  618. package/dist/tera-i18n/assets/world-flags/democratic republic of congo.svg +0 -14
  619. package/dist/tera-i18n/assets/world-flags/denmark.svg +0 -14
  620. package/dist/tera-i18n/assets/world-flags/djibouti.svg +0 -13
  621. package/dist/tera-i18n/assets/world-flags/dominica.svg +0 -34
  622. package/dist/tera-i18n/assets/world-flags/dominican republic.svg +0 -17
  623. package/dist/tera-i18n/assets/world-flags/ecuador.svg +0 -15
  624. package/dist/tera-i18n/assets/world-flags/egypt.svg +0 -13
  625. package/dist/tera-i18n/assets/world-flags/el salvador.svg +0 -15
  626. package/dist/tera-i18n/assets/world-flags/england.svg +0 -11
  627. package/dist/tera-i18n/assets/world-flags/equatorial guinea.svg +0 -16
  628. package/dist/tera-i18n/assets/world-flags/eritrea.svg +0 -13
  629. package/dist/tera-i18n/assets/world-flags/estonia.svg +0 -12
  630. package/dist/tera-i18n/assets/world-flags/ethiopia.svg +0 -15
  631. package/dist/tera-i18n/assets/world-flags/european union.svg +0 -18
  632. package/dist/tera-i18n/assets/world-flags/falkland islands.svg +0 -18
  633. package/dist/tera-i18n/assets/world-flags/faroe islands.svg +0 -12
  634. package/dist/tera-i18n/assets/world-flags/fiji.svg +0 -18
  635. package/dist/tera-i18n/assets/world-flags/finland.svg +0 -11
  636. package/dist/tera-i18n/assets/world-flags/france.svg +0 -12
  637. package/dist/tera-i18n/assets/world-flags/french polynesia.svg +0 -17
  638. package/dist/tera-i18n/assets/world-flags/gabon.svg +0 -12
  639. package/dist/tera-i18n/assets/world-flags/galapagos islands.svg +0 -12
  640. package/dist/tera-i18n/assets/world-flags/gambia.svg +0 -13
  641. package/dist/tera-i18n/assets/world-flags/georgia.svg +0 -15
  642. package/dist/tera-i18n/assets/world-flags/germany.svg +0 -12
  643. package/dist/tera-i18n/assets/world-flags/ghana.svg +0 -13
  644. package/dist/tera-i18n/assets/world-flags/gibraltar.svg +0 -13
  645. package/dist/tera-i18n/assets/world-flags/greece.svg +0 -15
  646. package/dist/tera-i18n/assets/world-flags/greenland.svg +0 -13
  647. package/dist/tera-i18n/assets/world-flags/grenada.svg +0 -27
  648. package/dist/tera-i18n/assets/world-flags/guam.svg +0 -18
  649. package/dist/tera-i18n/assets/world-flags/guatemala.svg +0 -14
  650. package/dist/tera-i18n/assets/world-flags/guernsey.svg +0 -12
  651. package/dist/tera-i18n/assets/world-flags/guinea bissau.svg +0 -14
  652. package/dist/tera-i18n/assets/world-flags/guinea.svg +0 -12
  653. package/dist/tera-i18n/assets/world-flags/guyana.svg +0 -15
  654. package/dist/tera-i18n/assets/world-flags/haiti.svg +0 -17
  655. package/dist/tera-i18n/assets/world-flags/hawaii.svg +0 -15
  656. package/dist/tera-i18n/assets/world-flags/honduras.svg +0 -17
  657. package/dist/tera-i18n/assets/world-flags/hong kong.svg +0 -15
  658. package/dist/tera-i18n/assets/world-flags/hungary.svg +0 -12
  659. package/dist/tera-i18n/assets/world-flags/iceland.svg +0 -15
  660. package/dist/tera-i18n/assets/world-flags/india.svg +0 -15
  661. package/dist/tera-i18n/assets/world-flags/indonesia.svg +0 -11
  662. package/dist/tera-i18n/assets/world-flags/iran.svg +0 -13
  663. package/dist/tera-i18n/assets/world-flags/iraq.svg +0 -15
  664. package/dist/tera-i18n/assets/world-flags/ireland.svg +0 -12
  665. package/dist/tera-i18n/assets/world-flags/isle of man.svg +0 -11
  666. package/dist/tera-i18n/assets/world-flags/israel.svg +0 -13
  667. package/dist/tera-i18n/assets/world-flags/italy.svg +0 -12
  668. package/dist/tera-i18n/assets/world-flags/ivory coast.svg +0 -12
  669. package/dist/tera-i18n/assets/world-flags/jamaica.svg +0 -14
  670. package/dist/tera-i18n/assets/world-flags/japan.svg +0 -11
  671. package/dist/tera-i18n/assets/world-flags/jersey.svg +0 -13
  672. package/dist/tera-i18n/assets/world-flags/jordan.svg +0 -14
  673. package/dist/tera-i18n/assets/world-flags/kazakhstan.svg +0 -13
  674. package/dist/tera-i18n/assets/world-flags/kenya.svg +0 -19
  675. package/dist/tera-i18n/assets/world-flags/kiribati.svg +0 -17
  676. package/dist/tera-i18n/assets/world-flags/kosovo.svg +0 -17
  677. package/dist/tera-i18n/assets/world-flags/kuwait.svg +0 -13
  678. package/dist/tera-i18n/assets/world-flags/kyrgyzstan.svg +0 -16
  679. package/dist/tera-i18n/assets/world-flags/laos.svg +0 -13
  680. package/dist/tera-i18n/assets/world-flags/latvia.svg +0 -12
  681. package/dist/tera-i18n/assets/world-flags/lebanon.svg +0 -13
  682. package/dist/tera-i18n/assets/world-flags/lesotho.svg +0 -13
  683. package/dist/tera-i18n/assets/world-flags/liberia.svg +0 -23
  684. package/dist/tera-i18n/assets/world-flags/libya.svg +0 -14
  685. package/dist/tera-i18n/assets/world-flags/liechtenstein.svg +0 -12
  686. package/dist/tera-i18n/assets/world-flags/lithuania.svg +0 -12
  687. package/dist/tera-i18n/assets/world-flags/luxembourg.svg +0 -12
  688. package/dist/tera-i18n/assets/world-flags/macao.svg +0 -18
  689. package/dist/tera-i18n/assets/world-flags/madagascar.svg +0 -12
  690. package/dist/tera-i18n/assets/world-flags/madeira.svg +0 -14
  691. package/dist/tera-i18n/assets/world-flags/malawi.svg +0 -13
  692. package/dist/tera-i18n/assets/world-flags/malaysia.svg +0 -17
  693. package/dist/tera-i18n/assets/world-flags/maldives.svg +0 -12
  694. package/dist/tera-i18n/assets/world-flags/mali.svg +0 -12
  695. package/dist/tera-i18n/assets/world-flags/malta.svg +0 -12
  696. package/dist/tera-i18n/assets/world-flags/marshall island.svg +0 -13
  697. package/dist/tera-i18n/assets/world-flags/martinique.svg +0 -18
  698. package/dist/tera-i18n/assets/world-flags/mauritania.svg +0 -12
  699. package/dist/tera-i18n/assets/world-flags/mauritius.svg +0 -13
  700. package/dist/tera-i18n/assets/world-flags/melilla.svg +0 -25
  701. package/dist/tera-i18n/assets/world-flags/mexico.svg +0 -14
  702. package/dist/tera-i18n/assets/world-flags/micronesia.svg +0 -14
  703. package/dist/tera-i18n/assets/world-flags/moldova.svg +0 -15
  704. package/dist/tera-i18n/assets/world-flags/monaco.svg +0 -11
  705. package/dist/tera-i18n/assets/world-flags/mongolia.svg +0 -19
  706. package/dist/tera-i18n/assets/world-flags/montenegro.svg +0 -15
  707. package/dist/tera-i18n/assets/world-flags/montserrat.svg +0 -17
  708. package/dist/tera-i18n/assets/world-flags/morocco.svg +0 -11
  709. package/dist/tera-i18n/assets/world-flags/mozambique.svg +0 -17
  710. package/dist/tera-i18n/assets/world-flags/myanmar.svg +0 -13
  711. package/dist/tera-i18n/assets/world-flags/namibia.svg +0 -14
  712. package/dist/tera-i18n/assets/world-flags/nato.svg +0 -19
  713. package/dist/tera-i18n/assets/world-flags/nauru.svg +0 -14
  714. package/dist/tera-i18n/assets/world-flags/nepal.svg +0 -16
  715. package/dist/tera-i18n/assets/world-flags/netherlands.svg +0 -12
  716. package/dist/tera-i18n/assets/world-flags/new zealand.svg +0 -18
  717. package/dist/tera-i18n/assets/world-flags/nicaragua.svg +0 -16
  718. package/dist/tera-i18n/assets/world-flags/niger.svg +0 -13
  719. package/dist/tera-i18n/assets/world-flags/nigeria.svg +0 -12
  720. package/dist/tera-i18n/assets/world-flags/niue.svg +0 -20
  721. package/dist/tera-i18n/assets/world-flags/norfolk island.svg +0 -13
  722. package/dist/tera-i18n/assets/world-flags/north korea.svg +0 -15
  723. package/dist/tera-i18n/assets/world-flags/northern cyprus.svg +0 -14
  724. package/dist/tera-i18n/assets/world-flags/northern marianas islands.svg +0 -14
  725. package/dist/tera-i18n/assets/world-flags/norway.svg +0 -15
  726. package/dist/tera-i18n/assets/world-flags/oman.svg +0 -15
  727. package/dist/tera-i18n/assets/world-flags/orkney islands.svg +0 -15
  728. package/dist/tera-i18n/assets/world-flags/ossetia.svg +0 -12
  729. package/dist/tera-i18n/assets/world-flags/pakistan.svg +0 -14
  730. package/dist/tera-i18n/assets/world-flags/palau.svg +0 -11
  731. package/dist/tera-i18n/assets/world-flags/palestine.svg +0 -13
  732. package/dist/tera-i18n/assets/world-flags/panama.svg +0 -14
  733. package/dist/tera-i18n/assets/world-flags/papua new guinea.svg +0 -17
  734. package/dist/tera-i18n/assets/world-flags/paraguay.svg +0 -14
  735. package/dist/tera-i18n/assets/world-flags/peru.svg +0 -12
  736. package/dist/tera-i18n/assets/world-flags/philippines.svg +0 -16
  737. package/dist/tera-i18n/assets/world-flags/pitcairn islands.svg +0 -18
  738. package/dist/tera-i18n/assets/world-flags/poland.svg +0 -11
  739. package/dist/tera-i18n/assets/world-flags/portugal.svg +0 -14
  740. package/dist/tera-i18n/assets/world-flags/puerto rico.svg +0 -15
  741. package/dist/tera-i18n/assets/world-flags/qatar.svg +0 -11
  742. package/dist/tera-i18n/assets/world-flags/republic of macedonia.svg +0 -20
  743. package/dist/tera-i18n/assets/world-flags/republic of the congo.svg +0 -12
  744. package/dist/tera-i18n/assets/world-flags/romania.svg +0 -12
  745. package/dist/tera-i18n/assets/world-flags/russia.svg +0 -12
  746. package/dist/tera-i18n/assets/world-flags/rwanda.svg +0 -13
  747. package/dist/tera-i18n/assets/world-flags/saba island.svg +0 -15
  748. package/dist/tera-i18n/assets/world-flags/sahrawi arab democratic republic.svg +0 -15
  749. package/dist/tera-i18n/assets/world-flags/samoa.svg +0 -16
  750. package/dist/tera-i18n/assets/world-flags/san marino.svg +0 -16
  751. package/dist/tera-i18n/assets/world-flags/sao tome and prince.svg +0 -15
  752. package/dist/tera-i18n/assets/world-flags/sardinia.svg +0 -23
  753. package/dist/tera-i18n/assets/world-flags/saudi arabia.svg +0 -16
  754. package/dist/tera-i18n/assets/world-flags/scotland.svg +0 -14
  755. package/dist/tera-i18n/assets/world-flags/senegal.svg +0 -13
  756. package/dist/tera-i18n/assets/world-flags/serbia.svg +0 -16
  757. package/dist/tera-i18n/assets/world-flags/seychelles.svg +0 -14
  758. package/dist/tera-i18n/assets/world-flags/sierra leone.svg +0 -12
  759. package/dist/tera-i18n/assets/world-flags/singapore.svg +0 -17
  760. package/dist/tera-i18n/assets/world-flags/sint eustatius.svg +0 -20
  761. package/dist/tera-i18n/assets/world-flags/sint maarten.svg +0 -17
  762. package/dist/tera-i18n/assets/world-flags/slovakia.svg +0 -16
  763. package/dist/tera-i18n/assets/world-flags/slovenia.svg +0 -13
  764. package/dist/tera-i18n/assets/world-flags/solomon islands.svg +0 -17
  765. package/dist/tera-i18n/assets/world-flags/somalia.svg +0 -11
  766. package/dist/tera-i18n/assets/world-flags/somaliland.svg +0 -18
  767. package/dist/tera-i18n/assets/world-flags/south africa.svg +0 -15
  768. package/dist/tera-i18n/assets/world-flags/south korea.svg +0 -30
  769. package/dist/tera-i18n/assets/world-flags/south sudan.svg +0 -15
  770. package/dist/tera-i18n/assets/world-flags/spain.png +0 -0
  771. package/dist/tera-i18n/assets/world-flags/spain.svg +0 -676
  772. package/dist/tera-i18n/assets/world-flags/sri lanka.svg +0 -15
  773. package/dist/tera-i18n/assets/world-flags/st barts.svg +0 -16
  774. package/dist/tera-i18n/assets/world-flags/st lucia.svg +0 -13
  775. package/dist/tera-i18n/assets/world-flags/st vincent and the grenadines.svg +0 -15
  776. package/dist/tera-i18n/assets/world-flags/sudan.svg +0 -13
  777. package/dist/tera-i18n/assets/world-flags/suriname.svg +0 -14
  778. package/dist/tera-i18n/assets/world-flags/swaziland.svg +0 -21
  779. package/dist/tera-i18n/assets/world-flags/sweden.svg +0 -14
  780. package/dist/tera-i18n/assets/world-flags/switzerland.svg +0 -11
  781. package/dist/tera-i18n/assets/world-flags/syria.svg +0 -14
  782. package/dist/tera-i18n/assets/world-flags/taiwan.svg +0 -14
  783. package/dist/tera-i18n/assets/world-flags/tajikistan.svg +0 -20
  784. package/dist/tera-i18n/assets/world-flags/tanzania.svg +0 -13
  785. package/dist/tera-i18n/assets/world-flags/thailand.svg +0 -13
  786. package/dist/tera-i18n/assets/world-flags/tibet.svg +0 -22
  787. package/dist/tera-i18n/assets/world-flags/togo.svg +0 -15
  788. package/dist/tera-i18n/assets/world-flags/tokelau.svg +0 -15
  789. package/dist/tera-i18n/assets/world-flags/tonga.svg +0 -12
  790. package/dist/tera-i18n/assets/world-flags/transnistria.svg +0 -12
  791. package/dist/tera-i18n/assets/world-flags/trinidad and tobago.svg +0 -13
  792. package/dist/tera-i18n/assets/world-flags/tunisia.svg +0 -13
  793. package/dist/tera-i18n/assets/world-flags/turkey.svg +0 -12
  794. package/dist/tera-i18n/assets/world-flags/turkmenistan.svg +0 -30
  795. package/dist/tera-i18n/assets/world-flags/turks and caicos.svg +0 -19
  796. package/dist/tera-i18n/assets/world-flags/tuvalu.svg +0 -25
  797. package/dist/tera-i18n/assets/world-flags/uganda.svg +0 -16
  798. package/dist/tera-i18n/assets/world-flags/ukraine.svg +0 -11
  799. package/dist/tera-i18n/assets/world-flags/united arab emirates.svg +0 -13
  800. package/dist/tera-i18n/assets/world-flags/united kingdom.svg +0 -23
  801. package/dist/tera-i18n/assets/world-flags/united nations.svg +0 -12
  802. package/dist/tera-i18n/assets/world-flags/united states.svg +0 -15
  803. package/dist/tera-i18n/assets/world-flags/uruguay.svg +0 -16
  804. package/dist/tera-i18n/assets/world-flags/uzbekista/314/201n.svg +0 -27
  805. package/dist/tera-i18n/assets/world-flags/uzbekist/303/241n.svg +0 -27
  806. package/dist/tera-i18n/assets/world-flags/vanuatu.svg +0 -32
  807. package/dist/tera-i18n/assets/world-flags/vatican city.svg +0 -13
  808. package/dist/tera-i18n/assets/world-flags/venezuela.svg +0 -20
  809. package/dist/tera-i18n/assets/world-flags/vietnam.svg +0 -11
  810. package/dist/tera-i18n/assets/world-flags/virgin islands.svg +0 -18
  811. package/dist/tera-i18n/assets/world-flags/wales.svg +0 -12
  812. package/dist/tera-i18n/assets/world-flags/yemen.svg +0 -12
  813. package/dist/tera-i18n/assets/world-flags/zambia.svg +0 -14
  814. package/dist/tera-i18n/assets/world-flags/zimbabwe.svg +0 -20
  815. package/dist/tera-i18n/dev-tools/translator/.env +0 -2
  816. package/dist/tera-i18n/dev-tools/translator/gpt-translator-calculator-seo.js +0 -79
  817. package/dist/tera-i18n/dev-tools/translator/gpt-translator-i18n-message.js +0 -274
  818. package/dist/tera-i18n/dev-tools/translator/gpt-translator.js +0 -128
  819. package/dist/tera-i18n/dev-tools/translator/index.js +0 -2
  820. package/dist/tera-i18n/dev-tools/translator/package-lock.json +0 -780
  821. package/dist/tera-i18n/dev-tools/translator/package.json +0 -20
  822. package/dist/tera-i18n/dev-tools/translator/prompt/i18n-message-translate-prompt-calculator.md +0 -34
  823. package/dist/tera-i18n/dev-tools/translator/prompt/i18n-message-translate-prompt-cv-maker.md +0 -149
  824. package/dist/tera-i18n/dev-tools/translator/prompt/i18n-message-translate-prompt-system.txt +0 -1
  825. package/dist/tera-i18n/dev-tools/translator/prompt/i18n-message-translate-prompt.txt +0 -14
  826. package/dist/tera-i18n/dev-tools/translator/tsconfig.json +0 -17
  827. package/dist/tera-i18n/dev-tools/translator/types/supported-languages.js +0 -90
  828. package/dist/tera-i18n/projects/common/all-language-data.d.ts +0 -3
  829. package/dist/tera-i18n/projects/common/all-language-data.js +0 -141
  830. package/dist/tera-i18n/projects/common/messages/en.json +0 -0
  831. package/dist/tera-i18n/projects/common/types/language.d.ts +0 -6
  832. package/dist/tera-i18n/projects/common/types/language.js +0 -1
  833. package/dist/tera-i18n/projects/cv-maker/messages/ar-AE.json +0 -94
  834. package/dist/tera-i18n/projects/cv-maker/messages/ar-EG.json +0 -94
  835. package/dist/tera-i18n/projects/cv-maker/messages/ar-IQ.json +0 -94
  836. package/dist/tera-i18n/projects/cv-maker/messages/ar-SA.json +0 -94
  837. package/dist/tera-i18n/projects/cv-maker/messages/ar-SD.json +0 -94
  838. package/dist/tera-i18n/projects/cv-maker/messages/ar-YE.json +0 -94
  839. package/dist/tera-i18n/projects/cv-maker/messages/ar.json +0 -95
  840. package/dist/tera-i18n/projects/cv-maker/messages/bg.json +0 -95
  841. package/dist/tera-i18n/projects/cv-maker/messages/bn.json +0 -95
  842. package/dist/tera-i18n/projects/cv-maker/messages/ca.json +0 -95
  843. package/dist/tera-i18n/projects/cv-maker/messages/cs.json +0 -95
  844. package/dist/tera-i18n/projects/cv-maker/messages/da.json +0 -95
  845. package/dist/tera-i18n/projects/cv-maker/messages/de.json +0 -95
  846. package/dist/tera-i18n/projects/cv-maker/messages/el.json +0 -95
  847. package/dist/tera-i18n/projects/cv-maker/messages/en-AE.json +0 -94
  848. package/dist/tera-i18n/projects/cv-maker/messages/en-AU.json +0 -94
  849. package/dist/tera-i18n/projects/cv-maker/messages/en-CA.json +0 -94
  850. package/dist/tera-i18n/projects/cv-maker/messages/en-GB.json +0 -94
  851. package/dist/tera-i18n/projects/cv-maker/messages/en-ID.json +0 -94
  852. package/dist/tera-i18n/projects/cv-maker/messages/en-IN.json +0 -94
  853. package/dist/tera-i18n/projects/cv-maker/messages/en-NZ.json +0 -94
  854. package/dist/tera-i18n/projects/cv-maker/messages/en-PH.json +0 -94
  855. package/dist/tera-i18n/projects/cv-maker/messages/en-PK.json +0 -94
  856. package/dist/tera-i18n/projects/cv-maker/messages/en-SA.json +0 -94
  857. package/dist/tera-i18n/projects/cv-maker/messages/en-US.json +0 -94
  858. package/dist/tera-i18n/projects/cv-maker/messages/en-ZA.json +0 -94
  859. package/dist/tera-i18n/projects/cv-maker/messages/en.json +0 -92
  860. package/dist/tera-i18n/projects/cv-maker/messages/es-419.json +0 -94
  861. package/dist/tera-i18n/projects/cv-maker/messages/es-AR.json +0 -94
  862. package/dist/tera-i18n/projects/cv-maker/messages/es-ES.json +0 -94
  863. package/dist/tera-i18n/projects/cv-maker/messages/es-MX.json +0 -94
  864. package/dist/tera-i18n/projects/cv-maker/messages/es.json +0 -95
  865. package/dist/tera-i18n/projects/cv-maker/messages/fi.json +0 -95
  866. package/dist/tera-i18n/projects/cv-maker/messages/fr-MA.json +0 -94
  867. package/dist/tera-i18n/projects/cv-maker/messages/fr.json +0 -95
  868. package/dist/tera-i18n/projects/cv-maker/messages/he.json +0 -95
  869. package/dist/tera-i18n/projects/cv-maker/messages/hi.json +0 -95
  870. package/dist/tera-i18n/projects/cv-maker/messages/hr.json +0 -94
  871. package/dist/tera-i18n/projects/cv-maker/messages/hu.json +0 -95
  872. package/dist/tera-i18n/projects/cv-maker/messages/id.json +0 -95
  873. package/dist/tera-i18n/projects/cv-maker/messages/it.json +0 -95
  874. package/dist/tera-i18n/projects/cv-maker/messages/ja.json +0 -95
  875. package/dist/tera-i18n/projects/cv-maker/messages/ko.json +0 -95
  876. package/dist/tera-i18n/projects/cv-maker/messages/lt.json +0 -95
  877. package/dist/tera-i18n/projects/cv-maker/messages/lv.json +0 -95
  878. package/dist/tera-i18n/projects/cv-maker/messages/ms-MY.json +0 -94
  879. package/dist/tera-i18n/projects/cv-maker/messages/ms.json +0 -95
  880. package/dist/tera-i18n/projects/cv-maker/messages/nl.json +0 -95
  881. package/dist/tera-i18n/projects/cv-maker/messages/no.json +0 -95
  882. package/dist/tera-i18n/projects/cv-maker/messages/pl.json +0 -95
  883. package/dist/tera-i18n/projects/cv-maker/messages/pt-BR.json +0 -94
  884. package/dist/tera-i18n/projects/cv-maker/messages/pt-PT.json +0 -94
  885. package/dist/tera-i18n/projects/cv-maker/messages/pt.json +0 -95
  886. package/dist/tera-i18n/projects/cv-maker/messages/ro.json +0 -95
  887. package/dist/tera-i18n/projects/cv-maker/messages/ru.json +0 -95
  888. package/dist/tera-i18n/projects/cv-maker/messages/sk.json +0 -95
  889. package/dist/tera-i18n/projects/cv-maker/messages/sl.json +0 -95
  890. package/dist/tera-i18n/projects/cv-maker/messages/sq.json +0 -95
  891. package/dist/tera-i18n/projects/cv-maker/messages/sr.json +0 -95
  892. package/dist/tera-i18n/projects/cv-maker/messages/sv.json +0 -95
  893. package/dist/tera-i18n/projects/cv-maker/messages/sw.json +0 -95
  894. package/dist/tera-i18n/projects/cv-maker/messages/ta.json +0 -95
  895. package/dist/tera-i18n/projects/cv-maker/messages/te.json +0 -95
  896. package/dist/tera-i18n/projects/cv-maker/messages/th.json +0 -95
  897. package/dist/tera-i18n/projects/cv-maker/messages/tl.json +0 -95
  898. package/dist/tera-i18n/projects/cv-maker/messages/tr.json +0 -95
  899. package/dist/tera-i18n/projects/cv-maker/messages/uk.json +0 -95
  900. package/dist/tera-i18n/projects/cv-maker/messages/vi.json +0 -95
  901. package/dist/tera-i18n/projects/cv-maker/messages/zh-CN.json +0 -95
  902. package/dist/tera-i18n/projects/cv-maker/messages/zh-TW.json +0 -95
  903. package/dist/tera-i18n/projects/cv-maker/messages/zh.json +0 -94
  904. package/dist/tera-i18n/projects/cv-maker/project.inlang/settings.json +0 -84
  905. package/dist/tera-i18n/projects/cv-maker/supported-language.d.ts +0 -1
  906. package/dist/tera-i18n/projects/cv-maker/supported-language.js +0 -81
  907. package/dist/tera-i18n/projects/mathda/messages/en.json +0 -4
  908. package/dist/tera-i18n/projects/mathda/messages/vi.json +0 -4
  909. package/dist/tera-i18n/projects/mathda/project.inlang/settings.json +0 -15
  910. package/dist/tera-i18n/projects/mathda/supported-language.d.ts +0 -1
  911. package/dist/tera-i18n/projects/mathda/supported-language.js +0 -4
  912. package/dist/tera-i18n/projects/tera-calculator/messages/bg.json +0 -183
  913. package/dist/tera-i18n/projects/tera-calculator/messages/bn.json +0 -183
  914. package/dist/tera-i18n/projects/tera-calculator/messages/ca.json +0 -183
  915. package/dist/tera-i18n/projects/tera-calculator/messages/cs.json +0 -183
  916. package/dist/tera-i18n/projects/tera-calculator/messages/da.json +0 -183
  917. package/dist/tera-i18n/projects/tera-calculator/messages/de.json +0 -183
  918. package/dist/tera-i18n/projects/tera-calculator/messages/el.json +0 -183
  919. package/dist/tera-i18n/projects/tera-calculator/messages/en-IN.json +0 -183
  920. package/dist/tera-i18n/projects/tera-calculator/messages/en-PH.json +0 -183
  921. package/dist/tera-i18n/projects/tera-calculator/messages/en-US.json +0 -183
  922. package/dist/tera-i18n/projects/tera-calculator/messages/en.json +0 -189
  923. package/dist/tera-i18n/projects/tera-calculator/messages/es.json +0 -183
  924. package/dist/tera-i18n/projects/tera-calculator/messages/fi.json +0 -183
  925. package/dist/tera-i18n/projects/tera-calculator/messages/fr.json +0 -183
  926. package/dist/tera-i18n/projects/tera-calculator/messages/hi.json +0 -183
  927. package/dist/tera-i18n/projects/tera-calculator/messages/hu.json +0 -183
  928. package/dist/tera-i18n/projects/tera-calculator/messages/id.json +0 -183
  929. package/dist/tera-i18n/projects/tera-calculator/messages/it.json +0 -183
  930. package/dist/tera-i18n/projects/tera-calculator/messages/ja.json +0 -183
  931. package/dist/tera-i18n/projects/tera-calculator/messages/ko.json +0 -183
  932. package/dist/tera-i18n/projects/tera-calculator/messages/lt.json +0 -183
  933. package/dist/tera-i18n/projects/tera-calculator/messages/lv.json +0 -183
  934. package/dist/tera-i18n/projects/tera-calculator/messages/ms.json +0 -183
  935. package/dist/tera-i18n/projects/tera-calculator/messages/nl.json +0 -183
  936. package/dist/tera-i18n/projects/tera-calculator/messages/no.json +0 -183
  937. package/dist/tera-i18n/projects/tera-calculator/messages/pl.json +0 -183
  938. package/dist/tera-i18n/projects/tera-calculator/messages/pt.json +0 -183
  939. package/dist/tera-i18n/projects/tera-calculator/messages/ro.json +0 -183
  940. package/dist/tera-i18n/projects/tera-calculator/messages/ru.json +0 -183
  941. package/dist/tera-i18n/projects/tera-calculator/messages/sk.json +0 -183
  942. package/dist/tera-i18n/projects/tera-calculator/messages/sl.json +0 -183
  943. package/dist/tera-i18n/projects/tera-calculator/messages/sq.json +0 -183
  944. package/dist/tera-i18n/projects/tera-calculator/messages/sr.json +0 -183
  945. package/dist/tera-i18n/projects/tera-calculator/messages/sv.json +0 -183
  946. package/dist/tera-i18n/projects/tera-calculator/messages/sw.json +0 -183
  947. package/dist/tera-i18n/projects/tera-calculator/messages/ta.json +0 -183
  948. package/dist/tera-i18n/projects/tera-calculator/messages/te.json +0 -183
  949. package/dist/tera-i18n/projects/tera-calculator/messages/th.json +0 -183
  950. package/dist/tera-i18n/projects/tera-calculator/messages/tl.json +0 -183
  951. package/dist/tera-i18n/projects/tera-calculator/messages/tr.json +0 -183
  952. package/dist/tera-i18n/projects/tera-calculator/messages/uk.json +0 -183
  953. package/dist/tera-i18n/projects/tera-calculator/messages/vi.json +0 -183
  954. package/dist/tera-i18n/projects/tera-calculator/messages/zh-CN.json +0 -183
  955. package/dist/tera-i18n/projects/tera-calculator/messages/zh-TW.json +0 -183
  956. package/dist/tera-i18n/projects/tera-calculator/project.inlang/settings.json +0 -57
  957. package/dist/tera-i18n/projects/tera-calculator/supported-language.d.ts +0 -1
  958. package/dist/tera-i18n/projects/tera-calculator/supported-language.js +0 -48
  959. package/dist/tera-i18n/projects/tera-converter/messages/auto-generated/de.json +0 -1876
  960. package/dist/tera-i18n/projects/tera-converter/messages/auto-generated/en.json +0 -1876
  961. package/dist/tera-i18n/projects/tera-converter/messages/auto-generated/es.json +0 -1876
  962. package/dist/tera-i18n/projects/tera-converter/messages/auto-generated/fr.json +0 -1876
  963. package/dist/tera-i18n/projects/tera-converter/messages/auto-generated/it.json +0 -1876
  964. package/dist/tera-i18n/projects/tera-converter/messages/auto-generated/ja.json +0 -1876
  965. package/dist/tera-i18n/projects/tera-converter/messages/auto-generated/ko.json +0 -1876
  966. package/dist/tera-i18n/projects/tera-converter/messages/auto-generated/pt.json +0 -1876
  967. package/dist/tera-i18n/projects/tera-converter/messages/auto-generated/ru.json +0 -1876
  968. package/dist/tera-i18n/projects/tera-converter/messages/auto-generated/vi.json +0 -1876
  969. package/dist/tera-i18n/projects/tera-converter/messages/auto-generated/zh-CN.json +0 -1876
  970. package/dist/tera-i18n/projects/tera-converter/messages/de.json +0 -41
  971. package/dist/tera-i18n/projects/tera-converter/messages/en.json +0 -42
  972. package/dist/tera-i18n/projects/tera-converter/messages/es.json +0 -41
  973. package/dist/tera-i18n/projects/tera-converter/messages/fr.json +0 -41
  974. package/dist/tera-i18n/projects/tera-converter/messages/it.json +0 -41
  975. package/dist/tera-i18n/projects/tera-converter/messages/ja.json +0 -41
  976. package/dist/tera-i18n/projects/tera-converter/messages/ko.json +0 -41
  977. package/dist/tera-i18n/projects/tera-converter/messages/pt.json +0 -41
  978. package/dist/tera-i18n/projects/tera-converter/messages/ru.json +0 -41
  979. package/dist/tera-i18n/projects/tera-converter/messages/vi.json +0 -41
  980. package/dist/tera-i18n/projects/tera-converter/messages/zh-CN.json +0 -41
  981. package/dist/tera-i18n/projects/tera-converter/project.inlang/project_id +0 -1
  982. package/dist/tera-i18n/projects/tera-converter/project.inlang/settings.json +0 -27
  983. package/dist/tera-i18n/projects/tera-converter/supported-language.d.ts +0 -1
  984. package/dist/tera-i18n/projects/tera-converter/supported-language.js +0 -13
  985. package/dist/tera-i18n/projects/tera-system-ui/messages/ar.json +0 -10
  986. package/dist/tera-i18n/projects/tera-system-ui/messages/bg.json +0 -10
  987. package/dist/tera-i18n/projects/tera-system-ui/messages/bn.json +0 -10
  988. package/dist/tera-i18n/projects/tera-system-ui/messages/ca.json +0 -10
  989. package/dist/tera-i18n/projects/tera-system-ui/messages/cs.json +0 -10
  990. package/dist/tera-i18n/projects/tera-system-ui/messages/da.json +0 -10
  991. package/dist/tera-i18n/projects/tera-system-ui/messages/de.json +0 -10
  992. package/dist/tera-i18n/projects/tera-system-ui/messages/el.json +0 -10
  993. package/dist/tera-i18n/projects/tera-system-ui/messages/en.json +0 -10
  994. package/dist/tera-i18n/projects/tera-system-ui/messages/es.json +0 -10
  995. package/dist/tera-i18n/projects/tera-system-ui/messages/fi.json +0 -10
  996. package/dist/tera-i18n/projects/tera-system-ui/messages/fr.json +0 -10
  997. package/dist/tera-i18n/projects/tera-system-ui/messages/he.json +0 -10
  998. package/dist/tera-i18n/projects/tera-system-ui/messages/hi.json +0 -10
  999. package/dist/tera-i18n/projects/tera-system-ui/messages/hu.json +0 -10
  1000. package/dist/tera-i18n/projects/tera-system-ui/messages/id.json +0 -10
  1001. package/dist/tera-i18n/projects/tera-system-ui/messages/it.json +0 -10
  1002. package/dist/tera-i18n/projects/tera-system-ui/messages/ja.json +0 -10
  1003. package/dist/tera-i18n/projects/tera-system-ui/messages/ko.json +0 -10
  1004. package/dist/tera-i18n/projects/tera-system-ui/messages/lt.json +0 -10
  1005. package/dist/tera-i18n/projects/tera-system-ui/messages/lv.json +0 -10
  1006. package/dist/tera-i18n/projects/tera-system-ui/messages/ms.json +0 -10
  1007. package/dist/tera-i18n/projects/tera-system-ui/messages/nl.json +0 -10
  1008. package/dist/tera-i18n/projects/tera-system-ui/messages/no.json +0 -10
  1009. package/dist/tera-i18n/projects/tera-system-ui/messages/pl.json +0 -10
  1010. package/dist/tera-i18n/projects/tera-system-ui/messages/pt.json +0 -10
  1011. package/dist/tera-i18n/projects/tera-system-ui/messages/ro.json +0 -10
  1012. package/dist/tera-i18n/projects/tera-system-ui/messages/ru.json +0 -10
  1013. package/dist/tera-i18n/projects/tera-system-ui/messages/sk.json +0 -10
  1014. package/dist/tera-i18n/projects/tera-system-ui/messages/sl.json +0 -10
  1015. package/dist/tera-i18n/projects/tera-system-ui/messages/sq.json +0 -10
  1016. package/dist/tera-i18n/projects/tera-system-ui/messages/sr.json +0 -10
  1017. package/dist/tera-i18n/projects/tera-system-ui/messages/sv.json +0 -10
  1018. package/dist/tera-i18n/projects/tera-system-ui/messages/sw.json +0 -10
  1019. package/dist/tera-i18n/projects/tera-system-ui/messages/ta.json +0 -10
  1020. package/dist/tera-i18n/projects/tera-system-ui/messages/te.json +0 -10
  1021. package/dist/tera-i18n/projects/tera-system-ui/messages/th.json +0 -10
  1022. package/dist/tera-i18n/projects/tera-system-ui/messages/tl.json +0 -10
  1023. package/dist/tera-i18n/projects/tera-system-ui/messages/tr.json +0 -10
  1024. package/dist/tera-i18n/projects/tera-system-ui/messages/uk.json +0 -10
  1025. package/dist/tera-i18n/projects/tera-system-ui/messages/vi.json +0 -10
  1026. package/dist/tera-i18n/projects/tera-system-ui/messages/zh-CN.json +0 -10
  1027. package/dist/tera-i18n/projects/tera-system-ui/messages/zh-TW.json +0 -10
  1028. package/dist/tera-i18n/projects/tera-system-ui/project.inlang/settings.json +0 -59
  1029. package/dist/tera-i18n/projects/tera-system-ui/supported-language.d.ts +0 -1
  1030. package/dist/tera-i18n/projects/tera-system-ui/supported-language.js +0 -45
  1031. package/dist/tera-i18n/projects/tera-tools/messages/ar.json +0 -70
  1032. package/dist/tera-i18n/projects/tera-tools/messages/bg.json +0 -70
  1033. package/dist/tera-i18n/projects/tera-tools/messages/bn.json +0 -70
  1034. package/dist/tera-i18n/projects/tera-tools/messages/ca.json +0 -70
  1035. package/dist/tera-i18n/projects/tera-tools/messages/cs.json +0 -70
  1036. package/dist/tera-i18n/projects/tera-tools/messages/da.json +0 -70
  1037. package/dist/tera-i18n/projects/tera-tools/messages/de.json +0 -70
  1038. package/dist/tera-i18n/projects/tera-tools/messages/el.json +0 -70
  1039. package/dist/tera-i18n/projects/tera-tools/messages/en.json +0 -96
  1040. package/dist/tera-i18n/projects/tera-tools/messages/es.json +0 -70
  1041. package/dist/tera-i18n/projects/tera-tools/messages/fi.json +0 -70
  1042. package/dist/tera-i18n/projects/tera-tools/messages/fr.json +0 -70
  1043. package/dist/tera-i18n/projects/tera-tools/messages/he.json +0 -70
  1044. package/dist/tera-i18n/projects/tera-tools/messages/hi.json +0 -70
  1045. package/dist/tera-i18n/projects/tera-tools/messages/hu.json +0 -70
  1046. package/dist/tera-i18n/projects/tera-tools/messages/id.json +0 -70
  1047. package/dist/tera-i18n/projects/tera-tools/messages/it.json +0 -70
  1048. package/dist/tera-i18n/projects/tera-tools/messages/ja.json +0 -70
  1049. package/dist/tera-i18n/projects/tera-tools/messages/ko.json +0 -70
  1050. package/dist/tera-i18n/projects/tera-tools/messages/lt.json +0 -70
  1051. package/dist/tera-i18n/projects/tera-tools/messages/lv.json +0 -70
  1052. package/dist/tera-i18n/projects/tera-tools/messages/ms.json +0 -70
  1053. package/dist/tera-i18n/projects/tera-tools/messages/nl.json +0 -70
  1054. package/dist/tera-i18n/projects/tera-tools/messages/no.json +0 -70
  1055. package/dist/tera-i18n/projects/tera-tools/messages/pl.json +0 -70
  1056. package/dist/tera-i18n/projects/tera-tools/messages/pt.json +0 -70
  1057. package/dist/tera-i18n/projects/tera-tools/messages/ro.json +0 -70
  1058. package/dist/tera-i18n/projects/tera-tools/messages/ru.json +0 -70
  1059. package/dist/tera-i18n/projects/tera-tools/messages/sk.json +0 -70
  1060. package/dist/tera-i18n/projects/tera-tools/messages/sl.json +0 -70
  1061. package/dist/tera-i18n/projects/tera-tools/messages/sq.json +0 -70
  1062. package/dist/tera-i18n/projects/tera-tools/messages/sr.json +0 -70
  1063. package/dist/tera-i18n/projects/tera-tools/messages/sv.json +0 -70
  1064. package/dist/tera-i18n/projects/tera-tools/messages/sw.json +0 -70
  1065. package/dist/tera-i18n/projects/tera-tools/messages/ta.json +0 -70
  1066. package/dist/tera-i18n/projects/tera-tools/messages/te.json +0 -70
  1067. package/dist/tera-i18n/projects/tera-tools/messages/th.json +0 -70
  1068. package/dist/tera-i18n/projects/tera-tools/messages/tl.json +0 -70
  1069. package/dist/tera-i18n/projects/tera-tools/messages/tr.json +0 -70
  1070. package/dist/tera-i18n/projects/tera-tools/messages/uk.json +0 -70
  1071. package/dist/tera-i18n/projects/tera-tools/messages/vi.json +0 -70
  1072. package/dist/tera-i18n/projects/tera-tools/messages/zh-CN.json +0 -70
  1073. package/dist/tera-i18n/projects/tera-tools/messages/zh-TW.json +0 -70
  1074. package/dist/tera-i18n/projects/tera-tools/project.inlang/project_id +0 -1
  1075. package/dist/tera-i18n/projects/tera-tools/project.inlang/settings.json +0 -61
  1076. package/dist/tera-i18n/projects/tera-tools/supported-language.d.ts +0 -1
  1077. package/dist/tera-i18n/projects/tera-tools/supported-language.js +0 -45
  1078. package/dist/themes/theme-ai.css +0 -100
  1079. package/dist/themes/theme-marketing.css +0 -91
  1080. /package/dist/{components → internal}/icons/IconCheck.svelte.d.ts +0 -0
  1081. /package/dist/{components → internal}/icons/IconChevronDown.svelte.d.ts +0 -0
  1082. /package/dist/{components → internal}/icons/IconSearch.svelte.d.ts +0 -0
  1083. /package/dist/{components → internal}/icons/IconX.svelte.d.ts +0 -0
  1084. /package/dist/{components → internal}/icons/Icons.d.ts +0 -0
  1085. /package/dist/{components → internal}/icons/Icons.js +0 -0
@@ -0,0 +1,50 @@
1
+ {
2
+ "$schema": "https://tera-system-ui/registry-item.schema.json",
3
+ "name": "bottom-sheet",
4
+ "type": "registry:component",
5
+ "description": "Draggable iOS-style bottom sheet with snap points, container-scale effect, and stacking.",
6
+ "recipe": "src/lib/components/bottom-sheet/BottomSheet.recipe.ts",
7
+ "files": [
8
+ {
9
+ "path": "src/lib/components/bottom-sheet/BottomSheet.recipe.ts",
10
+ "target": "BottomSheet.recipe.ts",
11
+ "type": "recipe",
12
+ "content": "import {tv, type VariantProps} from \"tailwind-variants\";\nimport type {Snippet} from \"svelte\";\n\n/**\n * BottomSheet recipe — the canonical styled layer for the draggable sheet.\n *\n * An iOS-style bottom sheet with snap points, gesture dragging, container-scale\n * effect, and stacking (custom behavior — not bits-ui). The recipe is slotted by\n * role — backdrop / sheet / handle / handleBar / header / closeButton / content —\n * so an app can restyle any part independently. Only the *themeable, static*\n * surface lives here; the per-frame transforms (translate / scale / opacity) are\n * driven imperatively from the component and the runtime transition duration is\n * passed through the `--transition-duration` CSS var.\n *\n * The `constrained` variant switches fixed → absolute positioning when the sheet\n * is bounded inside a container; `dragging` carries the grabbing cursor.\n *\n * Primary customization surface: extend with `tv({ extend: bottomSheetRecipe, ... })`\n * in typed code. Lighter rung: the per-component CSS var (--tera-bottom-sheet-radius)\n * retunes the top corner radius with no code change; it defaults to the prior\n * literal value inline.\n */\nexport const bottomSheetRecipe = tv({\n slots: {\n backdrop: 'fixed inset-0 bg-black opacity-0 touch-none [will-change:opacity] [-webkit-tap-highlight-color:transparent] transition-opacity duration-[var(--transition-duration,0.35s)] ease-out',\n sheet: 'fixed bottom-0 left-0 right-0 flex flex-col overflow-visible bg-surface-raised rounded-t-[var(--tera-bottom-sheet-radius,12px)] shadow-[0_-1px_0_rgb(255_255_255/0.05),0_-4px_20px_rgb(0_0_0/0.3)] [will-change:translate] [translate:0_100%] [transform:translateZ(0)] [backface-visibility:hidden] transition-[translate] duration-[var(--transition-duration,0.35s)] ease-[cubic-bezier(0.2,0.9,0.36,1)]',\n handle: 'flex shrink-0 items-center justify-center px-4 pt-2 pb-1 cursor-grab touch-none active:cursor-grabbing',\n handleBar: 'h-[5px] w-9 rounded-[2.5px] bg-text-tertiary',\n header: 'relative shrink-0 cursor-grab touch-none select-none border-b border-border-default px-4 pt-1 pb-3 active:cursor-grabbing',\n closeButton: 'absolute right-2 top-[calc(50%-4px)] flex h-8 w-8 -translate-y-1/2 cursor-pointer items-center justify-center rounded-full border-none bg-transparent p-0 text-text-tertiary [touch-action:manipulation] [-webkit-tap-highlight-color:transparent] transition-colors hover:bg-surface-hover hover:text-text-primary active:bg-surface-hover',\n content: 'flex min-h-0 flex-1 flex-col overflow-hidden [touch-action:pan-y]',\n },\n variants: {\n // Sheet bounded inside a container (vs. the viewport): switch fixed → absolute.\n constrained: {\n true: {backdrop: 'absolute', sheet: 'absolute'},\n false: {},\n },\n // Active drag: grabbing cursor + suppress selection.\n dragging: {\n true: {sheet: 'cursor-grabbing select-none'},\n false: {},\n },\n },\n defaultVariants: {\n constrained: false,\n dragging: false,\n },\n});\n\nexport type BottomSheetRecipeProps = VariantProps<typeof bottomSheetRecipe>;\n\nexport interface BottomSheetProps {\n /** Unique identifier for this sheet (drives stacking/z-index registry). */\n id: string;\n /** Whether the sheet is open. Bindable. */\n open?: boolean;\n /** Snap positions as viewport fractions (0–1), e.g. [0.25, 0.5, 0.9]. */\n snapPoints?: number[];\n /** Index into `snapPoints` to settle at when opening. */\n defaultSnapPoint?: number;\n /** Container element to constrain the sheet within (constrained mode). */\n containerRef?: HTMLElement | null;\n /** Element to apply the background scale effect to (defaults to containerRef). */\n scaleTargetRef?: HTMLElement | null;\n /** Constrain the sheet inside `containerRef` (absolute positioning). */\n constrainToContainer?: boolean;\n /** Scale/round the background target as the sheet opens (iOS effect). */\n scaleBackground?: boolean;\n /** Allow dragging down past the lowest snap point to close. */\n dragToClose?: boolean;\n /** Close when the backdrop is tapped. */\n closeOnBackdrop?: boolean;\n /** Show a close (X) button in the header (requires the `header` snippet). */\n showCloseButton?: boolean;\n /** Called after the sheet finishes closing. */\n onClose?: () => void;\n /** Called whenever the open state changes. */\n onOpenChange?: (open: boolean) => void;\n /** Main body content. */\n children?: Snippet;\n /** Header content; renders the header bar when set. */\n header?: Snippet;\n}\n"
13
+ },
14
+ {
15
+ "path": "src/lib/components/bottom-sheet/BottomSheet.svelte",
16
+ "target": "BottomSheet.svelte",
17
+ "type": "svelte",
18
+ "content": "<script lang=\"ts\">\n import {onDestroy, onMount} from 'svelte';\n import {bottomSheetStore} from './bottomSheetStore.svelte.js';\n import {bottomSheetRecipe, type BottomSheetProps} from './BottomSheet.recipe';\n import {IconX} from \"$lib/internal/icons\";\n\n // ============================================\n // CONFIGURABLE CONSTANTS\n // Adjust these values to customize the bottom sheet behavior\n // ============================================\n\n const CONFIG = {\n // Scale effect for background container\n scale: {\n factor: 0.06, // How much to scale down (6%)\n borderRadius: 16, // Border radius when scaled (px)\n translateY: 20, // Vertical offset when scaled (px)\n origin: 'top center' // Transform origin\n },\n\n // Backdrop\n backdrop: {\n maxOpacity: 0.5 // Maximum opacity when fully open\n },\n\n // Animation timing\n animation: {\n defaultDuration: 0.35, // Default duration (seconds)\n minDuration: 0.15, // Min duration for fast swipes\n maxDuration: 0.4, // Max duration for slow gestures\n easing: 'cubic-bezier(0.2, 0.9, 0.36, 1)' // iOS-style spring curve\n },\n\n // Gesture handling\n gesture: {\n velocityInfluence: 0.01, // How much velocity affects snap selection\n overdragExponent: 0.55, // Overdrag resistance (lower = more resistance)\n closeVelocityThreshold: 0.35, // Velocity to trigger close (px/ms)\n closeProgressThreshold: 0.35, // Progress to trigger close (0-1)\n maxLockedDrag: 60, // Max drag when dragToClose disabled (px)\n lockedDragResistance: 0.3, // Resistance when dragToClose disabled\n // Two-phase gesture recognition for interactive elements (iOS-style)\n dragActivationThreshold: 10, // Vertical px to commit to drag from interactive element\n horizontalDeadZone: 1.2, // If abs(dx)/abs(dy) > this, abort drag (let native horizontal win)\n tapDistanceThreshold: 6 // Max total movement (px) to still count as a tap\n }\n } as const;\n\n // ============================================\n // COMPONENT PROPS\n // ============================================\n\n let {\n id,\n open = $bindable(false),\n snapPoints = [0.9],\n defaultSnapPoint = 0,\n containerRef = null,\n scaleTargetRef = null,\n constrainToContainer = false,\n scaleBackground = true,\n dragToClose = true,\n closeOnBackdrop = true,\n showCloseButton = false,\n onClose,\n onOpenChange,\n children,\n header\n }: BottomSheetProps = $props();\n\n // ============================================\n // INTERNAL STATE\n // ============================================\n\n // DOM references\n let sheetRef = $state<HTMLElement | null>(null);\n let contentRef = $state<HTMLElement | null>(null);\n let backdropRef = $state<HTMLElement | null>(null);\n\n // Sheet state\n let isVisible = $state(false);\n let isClosing = $state(false);\n let isAnimating = $state(false);\n let isDragging = $state(false);\n let currentTranslateY = $state(0);\n let sheetHeight = $state(0);\n let transitionDuration = $state(`${CONFIG.animation.defaultDuration}s`);\n\n // Drag tracking\n let dragState = {\n startY: 0,\n startX: 0,\n lastY: 0,\n currentY: 0,\n deltaY: 0,\n startSnapPoint: 0,\n activePointerId: null as number | null,\n isTouchActive: false,\n shouldPreventScroll: false,\n history: [] as { y: number; time: number }[],\n // Two-phase gesture recognition for interactive elements\n isPending: false, // Tracking started but not yet committed to drag\n isInteractiveStart: false, // Gesture began on an interactive element\n committed: false, // Gesture has been resolved as a drag\n inScrollable: false // Gesture began inside a [data-bottom-sheet-scroll] area\n };\n\n // Scroll state\n let scrollableElement: HTMLElement | null = null;\n let isScrolledToTop = true;\n\n // Dimensions\n let windowHeight = $state(typeof window !== 'undefined' ? window.innerHeight : 800);\n let containerHeight = $state(0);\n let containerResizeObserver: ResizeObserver | null = null;\n let prevOpen: boolean | null = null;\n\n // ============================================\n // COMPUTED VALUES\n // ============================================\n\n const r = $derived(bottomSheetRecipe({constrained: constrainToContainer, dragging: isDragging}));\n\n const scaleTarget = $derived(scaleTargetRef ?? containerRef);\n const effectiveHeight = $derived(\n constrainToContainer && containerRef ? containerHeight : windowHeight\n );\n const maxSnapPoint = $derived(Math.max(...snapPoints));\n const maxSheetHeight = $derived(maxSnapPoint * effectiveHeight);\n const zIndex = $derived(bottomSheetStore.getZIndex(id));\n const currentSnapPoint = $derived(snapPoints[defaultSnapPoint] ?? 0.5);\n const allSnapPoints = $derived([0, ...snapPoints].sort((a, b) => a - b));\n\n // ============================================\n // LIFECYCLE\n // ============================================\n\n onMount(() => {\n bottomSheetStore.register(id, {snapPoints, defaultSnapPoint, closeOnBackdrop});\n window.addEventListener('resize', handleWindowResize);\n\n return () => {\n bottomSheetStore.unregister(id);\n window.removeEventListener('resize', handleWindowResize);\n };\n });\n\n onDestroy(() => {\n containerResizeObserver?.disconnect();\n });\n\n // Watch containerRef for constrained mode\n $effect(() => {\n if (!containerRef || !constrainToContainer) return;\n\n containerHeight = containerRef.clientHeight;\n containerResizeObserver?.disconnect();\n\n containerResizeObserver = new ResizeObserver(() => {\n containerHeight = containerRef!.clientHeight;\n if (isVisible && !isDragging && sheetRef) {\n sheetHeight = sheetRef.offsetHeight;\n }\n });\n containerResizeObserver.observe(containerRef);\n\n return () => {\n containerResizeObserver?.disconnect();\n containerResizeObserver = null;\n };\n });\n\n // Watch open prop changes\n $effect(() => {\n const shouldOpen = open;\n\n if (prevOpen === null) {\n prevOpen = shouldOpen;\n if (shouldOpen) doOpen();\n return;\n }\n\n if (shouldOpen && !prevOpen && !isVisible) {\n prevOpen = true;\n doOpen();\n } else if (!shouldOpen && prevOpen && isVisible && !isClosing) {\n prevOpen = false;\n doClose();\n }\n });\n\n // Setup scrollable element detection\n $effect(() => {\n if (!contentRef || !isVisible) return;\n\n scrollableElement = contentRef.querySelector<HTMLElement>('[data-bottom-sheet-scroll]');\n if (!scrollableElement) return;\n\n const handleScroll = () => {\n isScrolledToTop = scrollableElement!.scrollTop <= 1;\n };\n scrollableElement.addEventListener('scroll', handleScroll, {passive: true});\n isScrolledToTop = scrollableElement.scrollTop <= 1;\n });\n\n // ============================================\n // CORE FUNCTIONS\n // ============================================\n\n function handleWindowResize() {\n if (isVisible && !isDragging) {\n windowHeight = window.innerHeight;\n if (sheetRef) sheetHeight = sheetRef.offsetHeight;\n }\n }\n\n function recalculateDimensions() {\n if (typeof window !== 'undefined') windowHeight = window.innerHeight;\n if (containerRef && constrainToContainer) containerHeight = containerRef.clientHeight;\n if (sheetRef) sheetHeight = sheetRef.offsetHeight;\n }\n\n function doOpen() {\n isVisible = true;\n isClosing = false;\n isAnimating = true;\n bottomSheetStore.open(id);\n\n requestAnimationFrame(() => {\n // sheetRef is bound by this rAF tick.\n recalculateDimensions();\n requestAnimationFrame(() => snapTo(currentSnapPoint, () => {\n isAnimating = false;\n }));\n });\n }\n\n function doClose() {\n if (isClosing) return;\n isClosing = true;\n isAnimating = true;\n\n snapTo(0, () => {\n isVisible = false;\n isClosing = false;\n isAnimating = false;\n bottomSheetStore.close(id);\n prevOpen = false;\n open = false;\n resetScaleTarget();\n onClose?.();\n onOpenChange?.(false);\n });\n }\n\n function snapTo(progress: number, onComplete?: () => void) {\n transitionDuration = calcDynamicDuration();\n // Calculate translateY: sheet height is maxSnapPoint * effectiveHeight\n // When progress = maxSnapPoint, translateY = 0 (fully visible)\n // When progress = 0, translateY = sheetHeight (hidden)\n const targetTranslateY = sheetHeight - (progress * effectiveHeight);\n currentTranslateY = targetTranslateY;\n\n if (sheetRef) {\n sheetRef.style.translate = `0 ${targetTranslateY}px`;\n }\n\n updateBackdrop(progress);\n updateScaleTarget(progress);\n bottomSheetStore.updateProgress(id, Math.max(0, Math.min(1, progress)));\n\n if (onComplete) {\n setTimeout(onComplete, parseFloat(transitionDuration) * 1000);\n }\n }\n\n // ============================================\n // VISUAL UPDATES\n // ============================================\n\n function updateBackdrop(progress: number) {\n if (!backdropRef) return;\n const opacity = Math.max(0, Math.min(CONFIG.backdrop.maxOpacity, progress * CONFIG.backdrop.maxOpacity));\n backdropRef.style.opacity = String(opacity);\n }\n\n function updateScaleTarget(progress: number, withTransition = true) {\n if (!scaleTarget || !scaleBackground) return;\n\n const p = Math.max(0, Math.min(1, progress));\n const {factor, borderRadius, translateY, origin} = CONFIG.scale;\n\n scaleTarget.style.scale = String(1 - factor * p);\n scaleTarget.style.translate = `0 ${translateY * p}px`;\n scaleTarget.style.borderRadius = `${borderRadius * p}px`;\n scaleTarget.style.transformOrigin = origin;\n scaleTarget.style.overflow = 'hidden';\n scaleTarget.style.willChange = 'scale, translate, border-radius';\n\n if (withTransition) {\n const {easing} = CONFIG.animation;\n scaleTarget.style.transition = `scale ${transitionDuration} ${easing}, translate ${transitionDuration} ${easing}, border-radius ${transitionDuration} ${easing}`;\n }\n }\n\n function resetScaleTarget() {\n if (!scaleTarget || !scaleBackground) return;\n\n scaleTarget.style.scale = '';\n scaleTarget.style.translate = '';\n scaleTarget.style.borderRadius = '';\n scaleTarget.style.transformOrigin = '';\n scaleTarget.style.overflow = '';\n scaleTarget.style.transition = '';\n scaleTarget.style.willChange = '';\n }\n\n // ============================================\n // GESTURE UTILITIES\n // ============================================\n\n function pushHistory(y: number) {\n const now = performance.now();\n dragState.history = dragState.history.filter(p => now - p.time <= 100);\n dragState.history.push({y, time: now});\n }\n\n function clearHistory() {\n dragState.history = [];\n }\n\n function calculateVelocity(): number {\n const now = performance.now();\n const recent = dragState.history.filter(p => now - p.time <= 100);\n\n if (recent.length < 2) return 0;\n\n const first = recent[0];\n const last = recent[recent.length - 1];\n if (!first || !last) return 0;\n const dt = last.time - first.time;\n\n return dt > 0 ? (last.y - first.y) / dt : 0;\n }\n\n function calcDynamicDuration(): string {\n const now = performance.now();\n const recent = dragState.history.filter(p => now - p.time <= 100);\n\n if (recent.length < 2) return `${CONFIG.animation.defaultDuration}s`;\n\n const first = recent[0];\n const last = recent[recent.length - 1];\n if (!first || !last) return `${CONFIG.animation.defaultDuration}s`;\n const speed = Math.abs((last.y - first.y) / (last.time - first.time));\n const {minDuration, maxDuration} = CONFIG.animation;\n\n let duration = maxDuration - (speed / 2) * (maxDuration - minDuration);\n duration = Math.max(minDuration, Math.min(maxDuration, duration));\n\n return `${duration}s`;\n }\n\n function overdragResistance(value: number): number {\n return value < 0 ? -Math.pow(Math.abs(value), CONFIG.gesture.overdragExponent) : value;\n }\n\n function applyLockedDragResistance(rawTranslateY: number): number {\n // Base translateY when at start snap point: sheetHeight - (startSnapPoint * effectiveHeight)\n const baseTranslateY = sheetHeight - (dragState.startSnapPoint * effectiveHeight);\n const dragDistance = rawTranslateY - baseTranslateY;\n\n if (dragDistance > 0) {\n const {lockedDragResistance, maxLockedDrag} = CONFIG.gesture;\n const resistedDrag = Math.min(dragDistance * lockedDragResistance, maxLockedDrag);\n return baseTranslateY + resistedDrag;\n }\n return rawTranslateY;\n }\n\n function findNearestSnapPoint(translateY: number, velocityInfluence = 0): number {\n // Calculate progress: translateY = sheetHeight - (progress * effectiveHeight)\n // So: progress = (sheetHeight - translateY) / effectiveHeight\n const currentProgress = (sheetHeight - translateY) / effectiveHeight;\n const targetProgress = currentProgress + velocityInfluence;\n\n return allSnapPoints.reduce((nearest, sp) =>\n Math.abs(targetProgress - sp) < Math.abs(targetProgress - nearest) ? sp : nearest\n , allSnapPoints[0] ?? 0);\n }\n\n function determineSnapPoint(): number {\n // Calculate progress: translateY = sheetHeight - (progress * effectiveHeight)\n // So: progress = (sheetHeight - translateY) / effectiveHeight\n const currentProgress = (sheetHeight - currentTranslateY) / effectiveHeight;\n const velocity = calculateVelocity();\n\n if (!dragToClose) {\n return dragState.startSnapPoint;\n }\n\n const {closeVelocityThreshold, closeProgressThreshold, velocityInfluence} = CONFIG.gesture;\n\n // Fast swipe handling\n if (Math.abs(velocity) > closeVelocityThreshold) {\n if (velocity > 0) {\n // Swipe down - close or go to lower snap\n const lowerSnaps = allSnapPoints.filter(sp => sp < dragState.startSnapPoint);\n const lowest = lowerSnaps[lowerSnaps.length - 1];\n if (lowest !== undefined && currentProgress >= lowest * 0.5) {\n return lowest;\n }\n return 0;\n } else {\n // Swipe up - go to higher snap\n const higherSnaps = allSnapPoints.filter(sp => sp > currentProgress);\n return higherSnaps[0] ?? Math.max(...snapPoints);\n }\n }\n\n // Check close threshold\n const progressDrop = dragState.startSnapPoint - currentProgress;\n if (progressDrop > closeProgressThreshold) {\n return 0;\n }\n\n // Velocity is in px/ms, convert to progress units (divide by effectiveHeight, multiply by 1000 for scale)\n const velocityInProgressUnits = -velocity / effectiveHeight * 1000;\n return findNearestSnapPoint(currentTranslateY, velocityInProgressUnits * velocityInfluence);\n }\n\n // ============================================\n // TOUCH EVENT HANDLERS\n // ============================================\n\n function isInDraggableArea(target: HTMLElement): boolean {\n return !!(target.closest('[data-bottom-sheet-handle]'));\n }\n\n function isInteractive(target: HTMLElement): boolean {\n return !!target.closest('button, a, input, select, textarea, [tabindex]:not([tabindex=\"-1\"])');\n }\n\n function shouldIgnoreDrag(target: HTMLElement): boolean {\n return !!target.closest('[data-bottom-sheet-no-drag]');\n }\n\n /**\n * Install a one-shot capture-phase click listener to suppress the ghost click\n * that fires after a committed drag from an interactive element.\n */\n function suppressNextClick() {\n if (!sheetRef) return;\n const handler = (e: Event) => {\n e.preventDefault();\n e.stopPropagation();\n sheetRef?.removeEventListener('click', handler, true);\n };\n sheetRef.addEventListener('click', handler, true);\n // Safety: auto-remove after a short delay if click never fires\n setTimeout(() => sheetRef?.removeEventListener('click', handler, true), 300);\n }\n\n /**\n * Reset all pending/two-phase gesture state fields.\n */\n function resetPendingState() {\n dragState.isPending = false;\n dragState.isInteractiveStart = false;\n dragState.committed = false;\n dragState.inScrollable = false;\n }\n\n /**\n * Initialize common drag tracking fields shared by both touch and pointer paths.\n */\n function initDragTracking(clientX: number, clientY: number) {\n dragState.startX = clientX;\n dragState.startY = clientY;\n dragState.lastY = clientY;\n dragState.currentY = currentTranslateY;\n dragState.deltaY = 0;\n dragState.startSnapPoint = Math.round((sheetHeight - currentTranslateY) / effectiveHeight * 100) / 100;\n clearHistory();\n pushHistory(clientY);\n }\n\n /**\n * Commit to dragging: transition from pending state to active drag.\n * Re-anchors startY/currentY to the current position to prevent visual jump.\n */\n function commitToDrag(clientY: number) {\n dragState.isPending = false;\n dragState.committed = true;\n // Re-anchor to current position so sheet doesn't jump\n dragState.startY = clientY;\n dragState.currentY = currentTranslateY;\n clearHistory();\n pushHistory(clientY);\n\n transitionDuration = '0s';\n if (scaleTarget) scaleTarget.style.transition = 'none';\n isDragging = true;\n }\n\n /**\n * Check if the pending gesture should be resolved.\n * Returns: 'drag' if vertical threshold exceeded and should drag sheet,\n * 'abort' if horizontal wins or user wants to scroll content,\n * 'pending' if undecided.\n */\n function resolvePendingGesture(clientX: number, clientY: number): 'drag' | 'abort' | 'pending' {\n const {dragActivationThreshold, horizontalDeadZone} = CONFIG.gesture;\n const absX = Math.abs(clientX - dragState.startX);\n const absY = Math.abs(clientY - dragState.startY);\n const deltaY = clientY - dragState.startY; // positive = finger moving down\n\n // Horizontal threshold exceeded — let native behavior handle it (slider, scroll, etc.)\n if (absX >= dragActivationThreshold) {\n return 'abort';\n }\n\n // Vertical threshold exceeded and angle is more vertical than horizontal\n if (absY >= dragActivationThreshold && absY > absX * horizontalDeadZone) {\n // Inside a scrollable area: only commit to drag if pulling DOWN from top (dismiss gesture).\n // If swiping UP (to scroll content down), abort and let native scroll work.\n if (dragState.inScrollable) {\n if (scrollableElement) isScrolledToTop = scrollableElement.scrollTop <= 1;\n if (deltaY > 0 && isScrolledToTop) {\n // Pulling down from top → drag sheet (dismiss)\n return 'drag';\n }\n // Swiping up, or not at top → let native scroll handle it\n return 'abort';\n }\n return 'drag';\n }\n\n return 'pending';\n }\n\n function handleTouchStart(e: TouchEvent) {\n if (dragState.isTouchActive) return;\n\n const target = e.target as HTMLElement;\n const inDraggableArea = isInDraggableArea(target);\n const inScrollable = !!target.closest('[data-bottom-sheet-scroll]');\n const isInteractiveTarget = isInteractive(target);\n\n // data-bottom-sheet-no-drag: treat as fully default element — no tracking at all\n if (shouldIgnoreDrag(target) && !inDraggableArea) {\n return;\n }\n\n if (scrollableElement) isScrolledToTop = scrollableElement.scrollTop <= 1;\n\n if (inScrollable && !isScrolledToTop && !inDraggableArea) {\n dragState.shouldPreventScroll = false;\n return;\n }\n\n // Initialize tracking for all cases\n const touch = e.touches[0];\n if (!touch) return;\n dragState.isTouchActive = true;\n initDragTracking(touch.clientX, touch.clientY);\n\n // Interactive element (button, input, slider, etc.) NOT in draggable area:\n // Enter pending state — don't commit to drag yet, let threshold decide\n if (isInteractiveTarget && !inDraggableArea) {\n dragState.isPending = true;\n dragState.isInteractiveStart = true;\n dragState.committed = false;\n dragState.inScrollable = inScrollable;\n dragState.shouldPreventScroll = true; // Will be used if we commit\n\n // Do NOT set isDragging, transitionDuration, or disable transitions\n // Do NOT call e.preventDefault() — allow native touch behavior until committed\n return;\n }\n\n // Non-interactive element: immediately commit to dragging (existing behavior)\n dragState.isPending = false;\n dragState.isInteractiveStart = false;\n dragState.committed = true;\n dragState.shouldPreventScroll = !(inScrollable && isScrolledToTop && !inDraggableArea);\n\n transitionDuration = '0s';\n if (scaleTarget) scaleTarget.style.transition = 'none';\n isDragging = true;\n }\n\n function handleTouchMove(e: TouchEvent) {\n if (!dragState.isTouchActive) return;\n\n const touch = e.touches[0];\n if (!touch) return;\n const clientY = touch.clientY;\n const clientX = touch.clientX;\n\n // ── Two-phase: resolve pending gesture from interactive element ──\n if (dragState.isPending) {\n pushHistory(clientY);\n const result = resolvePendingGesture(clientX, clientY);\n\n if (result === 'drag') {\n // Vertical intent wins → commit to drag\n commitToDrag(clientY);\n dragState.shouldPreventScroll = true;\n e.preventDefault();\n return; // First real drag frame happens on next move\n }\n if (result === 'abort') {\n // Horizontal intent wins → abort, let native behavior (slider, etc.)\n dragState.isPending = false;\n dragState.committed = false;\n dragState.isTouchActive = false;\n dragState.isInteractiveStart = false;\n return;\n }\n // Still pending — do nothing, let native behavior continue\n return;\n }\n\n // ── Normal drag logic (committed) ──\n const moveDelta = clientY - dragState.startY;\n dragState.deltaY = clientY - dragState.lastY;\n dragState.lastY = clientY;\n pushHistory(clientY);\n\n if (scrollableElement) isScrolledToTop = scrollableElement.scrollTop <= 1;\n if (isScrolledToTop && moveDelta > 0) dragState.shouldPreventScroll = true;\n if (!dragState.shouldPreventScroll) return;\n\n e.preventDefault();\n\n let translateY = dragState.currentY + moveDelta;\n if (translateY < 0) translateY = overdragResistance(translateY);\n if (!dragToClose) translateY = applyLockedDragResistance(translateY);\n translateY = Math.min(translateY, sheetHeight);\n\n currentTranslateY = translateY;\n if (sheetRef) sheetRef.style.translate = `0 ${translateY}px`;\n\n const progress = Math.max(0, Math.min(maxSnapPoint, (sheetHeight - translateY) / effectiveHeight));\n updateBackdrop(progress);\n updateScaleTarget(progress, false);\n bottomSheetStore.updateProgress(id, progress);\n }\n\n function handleTouchEnd(e: TouchEvent) {\n if (e.touches.length > 0 || !dragState.isTouchActive) return;\n\n dragState.isTouchActive = false;\n\n // ── Two-phase: pending never resolved (tap) → let native click fire ──\n if (dragState.isPending) {\n resetPendingState();\n return;\n }\n\n // ── Committed drag from interactive element → suppress ghost click ──\n if (dragState.committed && dragState.isInteractiveStart) {\n suppressNextClick();\n }\n resetPendingState();\n\n if (!dragState.shouldPreventScroll) {\n isDragging = false;\n return;\n }\n\n isDragging = false;\n dragState.shouldPreventScroll = false;\n\n const nearestSnap = determineSnapPoint();\n\n if (nearestSnap === 0 && dragToClose) {\n doClose();\n } else {\n snapTo(nearestSnap > 0 ? nearestSnap : dragState.startSnapPoint, () => {\n if (!open) {\n prevOpen = true;\n open = true;\n onOpenChange?.(true);\n }\n });\n }\n }\n\n // ============================================\n // POINTER EVENT HANDLERS (Desktop)\n // ============================================\n\n function handlePointerDown(e: PointerEvent) {\n if (e.pointerType === 'touch' || e.button !== 0 || dragState.activePointerId !== null) return;\n\n const target = e.target as HTMLElement;\n const inDraggableArea = isInDraggableArea(target);\n const inScrollable = !!target.closest('[data-bottom-sheet-scroll]');\n const isInteractiveTarget = isInteractive(target);\n const shouldIgnoreDragTarget = shouldIgnoreDrag(target);\n\n // data-bottom-sheet-no-drag: treat as fully default element — no tracking at all\n if (shouldIgnoreDragTarget && !inDraggableArea) return;\n\n if (scrollableElement) isScrolledToTop = scrollableElement.scrollTop <= 1;\n if (inScrollable && !isScrolledToTop && !inDraggableArea) return;\n\n dragState.activePointerId = e.pointerId;\n initDragTracking(e.clientX, e.clientY);\n\n // Interactive element NOT in draggable area:\n // Enter pending state — don't commit yet, preserve native focus/click\n if (isInteractiveTarget && !inDraggableArea) {\n dragState.isPending = true;\n dragState.isInteractiveStart = true;\n dragState.committed = false;\n dragState.inScrollable = inScrollable;\n\n // Do NOT call e.preventDefault() — preserve focus for inputs\n // Do NOT call setPointerCapture — allow native hover/click behavior\n // Do NOT set isDragging or disable transitions\n return;\n }\n\n // Non-interactive element: immediately commit to dragging\n dragState.isPending = false;\n dragState.isInteractiveStart = false;\n dragState.committed = true;\n\n transitionDuration = '0s';\n if (scaleTarget) scaleTarget.style.transition = 'none';\n sheetRef?.setPointerCapture(e.pointerId);\n isDragging = true;\n e.preventDefault();\n }\n\n function handlePointerMove(e: PointerEvent) {\n if (e.pointerType === 'touch' || dragState.activePointerId !== e.pointerId) return;\n if (!isDragging && !dragState.isPending) return;\n\n const clientY = e.clientY;\n const clientX = e.clientX;\n\n // ── Two-phase: resolve pending gesture from interactive element ──\n if (dragState.isPending) {\n pushHistory(clientY);\n const result = resolvePendingGesture(clientX, clientY);\n\n if (result === 'drag') {\n // Vertical intent wins → commit to drag\n commitToDrag(clientY);\n sheetRef?.setPointerCapture(e.pointerId);\n e.preventDefault();\n return; // First real drag frame happens on next move\n }\n if (result === 'abort') {\n // Horizontal intent wins → abort, let native behavior\n dragState.isPending = false;\n dragState.committed = false;\n dragState.activePointerId = null;\n dragState.isInteractiveStart = false;\n return;\n }\n // Still pending — do nothing\n return;\n }\n\n // ── Normal drag logic (committed) ──\n dragState.deltaY = clientY - dragState.lastY;\n dragState.lastY = clientY;\n pushHistory(clientY);\n\n let translateY = dragState.currentY + clientY - dragState.startY;\n if (translateY < 0) translateY = overdragResistance(translateY);\n if (!dragToClose) translateY = applyLockedDragResistance(translateY);\n translateY = Math.min(translateY, sheetHeight);\n\n currentTranslateY = translateY;\n if (sheetRef) sheetRef.style.translate = `0 ${translateY}px`;\n\n const progress = Math.max(0, Math.min(maxSnapPoint, (sheetHeight - translateY) / effectiveHeight));\n updateBackdrop(progress);\n updateScaleTarget(progress, false);\n bottomSheetStore.updateProgress(id, progress);\n\n e.preventDefault();\n }\n\n function handlePointerUp(e: PointerEvent) {\n if (e.pointerType === 'touch' || dragState.activePointerId !== e.pointerId) return;\n\n try {\n sheetRef?.releasePointerCapture(e.pointerId);\n } catch {\n }\n dragState.activePointerId = null;\n\n // ── Two-phase: pending never resolved (tap) → let native click fire ──\n if (dragState.isPending) {\n resetPendingState();\n return;\n }\n\n // ── Committed drag from interactive element → suppress ghost click ──\n if (dragState.committed && dragState.isInteractiveStart) {\n suppressNextClick();\n }\n resetPendingState();\n\n if (!isDragging) return;\n isDragging = false;\n\n const nearestSnap = determineSnapPoint();\n\n if (nearestSnap === 0 && dragToClose) {\n doClose();\n } else {\n snapTo(nearestSnap > 0 ? nearestSnap : dragState.startSnapPoint, () => {\n if (!open) {\n prevOpen = true;\n open = true;\n onOpenChange?.(true);\n }\n });\n }\n }\n\n function handlePointerCancel(e: PointerEvent) {\n if (e.pointerType === 'touch' || dragState.activePointerId !== e.pointerId) return;\n\n try {\n sheetRef?.releasePointerCapture(e.pointerId);\n } catch {\n }\n dragState.activePointerId = null;\n\n // If pending, just reset — nothing visual happened\n if (dragState.isPending) {\n resetPendingState();\n return;\n }\n resetPendingState();\n\n if (!isDragging) return;\n isDragging = false;\n\n snapTo(findNearestSnapPoint(currentTranslateY, 0));\n }\n\n function handleCloseButtonClick(e: MouseEvent) {\n e.stopPropagation();\n doClose();\n }\n\n function handleBackdropClick(e: PointerEvent) {\n if (!closeOnBackdrop || e.target !== backdropRef || isDragging || isAnimating) return;\n doClose();\n }\n\n function handleKeydown(e: KeyboardEvent) {\n if (e.key === 'Escape' && isVisible && bottomSheetStore.isTopmost(id)) {\n e.preventDefault();\n doClose();\n }\n }\n\n // Svelte action for touch events\n function touchEvents(node: HTMLElement) {\n node.addEventListener('touchstart', handleTouchStart, {passive: false});\n node.addEventListener('touchmove', handleTouchMove, {passive: false});\n node.addEventListener('touchend', handleTouchEnd, {passive: true});\n\n return {\n destroy() {\n node.removeEventListener('touchstart', handleTouchStart);\n node.removeEventListener('touchmove', handleTouchMove);\n node.removeEventListener('touchend', handleTouchEnd);\n }\n };\n }\n</script>\n\n<svelte:window onkeydown={handleKeydown}/>\n\n{#if isVisible}\n <!-- Backdrop -->\n <!-- svelte-ignore a11y_no_static_element_interactions -->\n <div\n bind:this={backdropRef}\n class={r.backdrop()}\n style:z-index={zIndex}\n style:--transition-duration={transitionDuration}\n onpointerup={handleBackdropClick}\n ></div>\n\n <!-- Sheet -->\n <!-- svelte-ignore a11y_no_static_element_interactions -->\n <div\n bind:this={sheetRef}\n class={r.sheet()}\n style:z-index={zIndex + 1}\n style:height=\"{maxSheetHeight}px\"\n style:--transition-duration={transitionDuration}\n role=\"dialog\"\n aria-modal=\"true\"\n tabindex={-1}\n use:touchEvents\n onpointerdown={handlePointerDown}\n onpointermove={handlePointerMove}\n onpointerup={handlePointerUp}\n onpointercancel={handlePointerCancel}\n >\n <!-- Drag Handle -->\n <div class={r.handle()} data-bottom-sheet-handle>\n <div class={r.handleBar()}></div>\n </div>\n\n <!-- Header -->\n {#if header}\n <div class={r.header()} data-bottom-sheet-header>\n {@render header()}\n {#if showCloseButton}\n <button\n class={r.closeButton()}\n data-bottom-sheet-close\n onclick={handleCloseButtonClick}\n aria-label=\"Close\"\n type=\"button\"\n >\n <IconX class=\"size-4\"/>\n </button>\n {/if}\n </div>\n {/if}\n\n <!-- Content -->\n <div bind:this={contentRef} class={r.content()} data-bottom-sheet-content>\n {#if children}\n {@render children()}\n {/if}\n </div>\n </div>\n{/if}\n\n<style>\n /* Consumer-marked scroll region inside the sheet body. */\n [data-bottom-sheet-content] :global([data-bottom-sheet-scroll]) {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n overscroll-behavior: contain;\n -webkit-overflow-scrolling: touch;\n min-height: 0;\n touch-action: pan-y;\n }\n\n /* Suppress native gestures on header children so the drag is captured. */\n [data-bottom-sheet-header] :global(*) {\n touch-action: none;\n user-select: none;\n }\n</style>\n"
19
+ },
20
+ {
21
+ "path": "src/lib/components/bottom-sheet/bottomSheetStore.svelte.ts",
22
+ "target": "bottomSheetStore.svelte.ts",
23
+ "type": "ts",
24
+ "content": "/**\n * Bottom Sheet store — Svelte 5 runes.\n *\n * A small singleton that tracks the stack of open bottom sheets so multiple\n * sheets can layer correctly (z-index), report drag progress, and resolve which\n * sheet is topmost (for Escape handling). Sheets register on mount and push/pop\n * themselves from the stack as they open/close. Exposed publicly so apps can\n * drive sheets programmatically (open/close/closeTop) in addition to `bind:open`.\n */\n\nexport interface BottomSheetConfig {\n id: string;\n snapPoints: number[];\n defaultSnapPoint: number;\n closeOnBackdrop: boolean;\n}\n\nexport interface SheetStackItem {\n id: string;\n zIndex: number;\n progress: number;\n config: BottomSheetConfig;\n}\n\nconst BASE_Z_INDEX = 1000;\nconst Z_INDEX_INCREMENT = 10;\n\nfunction createBottomSheetStore() {\n // Stack of active sheets (bottom to top)\n let sheetStack = $state<SheetStackItem[]>([]);\n\n // Registry of all sheet configs\n let registry = $state<Map<string, BottomSheetConfig>>(new Map());\n\n // Container refs for scale effect\n let containerRefs = $state<Map<string, HTMLElement>>(new Map());\n\n /**\n * Register a sheet with its config\n */\n function register(id: string, config: Omit<BottomSheetConfig, 'id'>): void {\n registry.set(id, {id, ...config});\n }\n\n /**\n * Unregister a sheet\n */\n function unregister(id: string): void {\n registry.delete(id);\n containerRefs.delete(id);\n // Remove from stack if present\n sheetStack = sheetStack.filter(s => s.id !== id);\n }\n\n /**\n * Open a sheet by ID\n */\n function open(id: string): void {\n const config = registry.get(id);\n if (!config) {\n // Sheet was not registered (component not mounted yet) — ignore.\n return;\n }\n\n // Check if already in stack\n if (sheetStack.some(s => s.id === id)) {\n return;\n }\n\n // Calculate z-index based on stack position\n const zIndex = BASE_Z_INDEX + (sheetStack.length * Z_INDEX_INCREMENT);\n\n sheetStack = [...sheetStack, {\n id,\n zIndex,\n progress: 0,\n config\n }];\n }\n\n /**\n * Close a sheet by ID\n */\n function close(id: string): void {\n sheetStack = sheetStack.filter(s => s.id !== id);\n // Recalculate z-indices for remaining sheets\n sheetStack = sheetStack.map((sheet, index) => ({\n ...sheet,\n zIndex: BASE_Z_INDEX + (index * Z_INDEX_INCREMENT)\n }));\n }\n\n /**\n * Close the topmost sheet\n */\n function closeTop(): void {\n const top = sheetStack[sheetStack.length - 1];\n if (top) {\n close(top.id);\n }\n }\n\n /**\n * Update progress for a sheet (0-1)\n */\n function updateProgress(id: string, progress: number): void {\n const index = sheetStack.findIndex(s => s.id === id);\n const sheet = sheetStack[index];\n if (sheet) {\n sheet.progress = Math.max(0, Math.min(1, progress));\n }\n }\n\n /**\n * Get z-index for a sheet\n */\n function getZIndex(id: string): number {\n const sheet = sheetStack.find(s => s.id === id);\n return sheet?.zIndex ?? BASE_Z_INDEX;\n }\n\n /**\n * Check if a sheet is open\n */\n function isOpen(id: string): boolean {\n return sheetStack.some(s => s.id === id);\n }\n\n /**\n * Check if a sheet is the topmost\n */\n function isTopmost(id: string): boolean {\n return sheetStack[sheetStack.length - 1]?.id === id;\n }\n\n /**\n * Get progress for a sheet\n */\n function getProgress(id: string): number {\n const sheet = sheetStack.find(s => s.id === id);\n return sheet?.progress ?? 0;\n }\n\n /**\n * Attach container ref for scale effect\n */\n function attachContainer(sheetId: string, ref: HTMLElement): void {\n containerRefs.set(sheetId, ref);\n }\n\n /**\n * Get container ref for a sheet\n */\n function getContainer(sheetId: string): HTMLElement | undefined {\n return containerRefs.get(sheetId);\n }\n\n /**\n * Get combined backdrop opacity from all sheets\n */\n function getCombinedBackdropOpacity(): number {\n // Use the topmost sheet's progress for backdrop\n const top = sheetStack[sheetStack.length - 1];\n return top ? top.progress * 0.5 : 0;\n }\n\n /**\n * Get the current stack\n */\n function getStack(): SheetStackItem[] {\n return sheetStack;\n }\n\n return {\n get stack() { return sheetStack; },\n get hasOpenSheets() { return sheetStack.length > 0; },\n\n register,\n unregister,\n open,\n close,\n closeTop,\n updateProgress,\n getZIndex,\n isOpen,\n isTopmost,\n getProgress,\n attachContainer,\n getContainer,\n getCombinedBackdropOpacity,\n getStack\n };\n}\n\n// Export singleton instance\nexport const bottomSheetStore = createBottomSheetStore();\n"
25
+ },
26
+ {
27
+ "path": "src/lib/components/bottom-sheet/index.ts",
28
+ "target": "index.ts",
29
+ "type": "ts",
30
+ "content": "export {default as BottomSheet} from './BottomSheet.svelte'\nexport {bottomSheetStore} from './bottomSheetStore.svelte.js'\nexport {bottomSheetRecipe} from './BottomSheet.recipe'\nexport type {BottomSheetRecipeProps, BottomSheetProps} from './BottomSheet.recipe'\nexport type {BottomSheetConfig, SheetStackItem} from './bottomSheetStore.svelte.js'\n"
31
+ }
32
+ ],
33
+ "dependencies": [
34
+ "tailwind-variants"
35
+ ],
36
+ "peerDependencies": [
37
+ "svelte"
38
+ ],
39
+ "registryDependencies": [],
40
+ "sharedModules": {
41
+ "utils": false,
42
+ "icons": true,
43
+ "hooks": false
44
+ },
45
+ "exports": [
46
+ "BottomSheet",
47
+ "bottomSheetStore",
48
+ "bottomSheetRecipe"
49
+ ]
50
+ }
@@ -0,0 +1,43 @@
1
+ {
2
+ "$schema": "https://tera-system-ui/registry-item.schema.json",
3
+ "name": "button",
4
+ "type": "registry:component",
5
+ "description": "Interactive button with variants, sizes, loading, danger, link mode.",
6
+ "recipe": "src/lib/components/button/Button.recipe.ts",
7
+ "files": [
8
+ {
9
+ "path": "src/lib/components/button/Button.recipe.ts",
10
+ "target": "Button.recipe.ts",
11
+ "type": "recipe",
12
+ "content": "import {tv, type VariantProps} from \"tailwind-variants\";\nimport type {Snippet} from \"svelte\";\nimport type {HTMLAnchorAttributes, HTMLButtonAttributes} from \"svelte/elements\";\n\n/**\n * Button recipe — the canonical styled layer for the base design language.\n *\n * Primary customization surface: an app owns its look by extending this recipe\n * with `tv({ extend: buttonRecipe, ... })` in typed code — base sizing and\n * states are inherited; only the design language changes. See\n * docs/ARCHITECTURE.md for the worked example (kept out of this JSDoc so the\n * llms doc generator doesn't grep its variant tokens).\n *\n * Restyle-internals (the lighter rung): the per-component CSS vars below\n * (--tera-button-*) let a theme/app retune radius, weight and press feel with\n * no code change; they default to global axis tokens in tera-ui-base.css.\n */\nexport const buttonRecipe = tv({\n base: 'relative overflow-visible rounded-[var(--tera-button-radius,var(--tera-radius-base))] inline-flex items-center justify-center leading-tight [&>svg]:stroke-icon select-none outline-none [font-weight:var(--tera-button-font-weight,500)] cursor-pointer transition-[background-color,border-color,box-shadow,transform,opacity] ease-ui duration-[var(--tera-duration-fast)] focus-visible:shadow-focus',\n variants: {\n variant: {\n // \"Detent\" press: primary rides a raised accent key; hover brightens\n // + lifts, active depresses (translateY down, key collapses).\n primary: 'bg-primary-600 text-white border border-primary-700 shadow-key hover:bg-primary-500 hover:border-primary-600 hover:[transform:translateY(var(--tera-button-hover-lift,-1px))] active:bg-primary-700 active:shadow-sm active:[transform:translateY(1px)_scale(var(--tera-button-active-scale,0.98))]',\n // Default reads as a physical key — subtle raised edge, surface lifts\n // on hover, depresses on press. Accent stays reserved for primary.\n default: 'bg-surface-control text-text-primary border border-border-default shadow-xs hover:bg-surface-raised hover:border-border-strong active:bg-surface-sunken active:shadow-none active:[transform:translateY(1px)_scale(var(--tera-button-active-scale,0.98))]',\n dashed: 'bg-surface-control text-text-secondary border border-dashed border-border-strong hover:text-text-primary hover:bg-surface-raised active:bg-surface-sunken active:[transform:translateY(1px)_scale(var(--tera-button-active-scale,0.98))]',\n text: 'bg-transparent text-text-primary border border-transparent hover:bg-surface-hover active:bg-surface-hover active:[transform:scale(var(--tera-button-active-scale,0.98))]',\n link: 'bg-transparent text-interactive border border-transparent hover:text-interactive-hover hover:underline underline-offset-2 active:text-interactive-active px-0',\n },\n size: {\n xs: 'h-[var(--tera-control-height-xs)] px-[var(--tera-control-px-xs)] gap-1 text-xs [&>svg]:size-3',\n sm: 'h-[var(--tera-control-height-sm)] px-[var(--tera-control-px-sm)] gap-1.5 text-sm [&>svg]:size-3.5',\n md: 'h-[var(--tera-control-height-base)] px-[var(--tera-control-px-lg)] gap-2 text-sm [&>svg]:size-4',\n lg: 'h-[var(--tera-control-height-lg)] px-[var(--tera-control-px-lg)] gap-2 text-base [&>svg]:size-5',\n },\n shape: {\n default: '',\n circle: 'rounded-full px-0',\n round: 'rounded-full',\n },\n disabled: {\n true: 'bg-surface-sunken text-text-disabled border-border-default pointer-events-none shadow-none cursor-not-allowed',\n },\n loading: {\n true: 'cursor-wait pointer-events-none opacity-65'\n },\n icon: {\n true: 'px-0'\n },\n danger: {\n true: ''\n },\n block: {\n true: 'w-full'\n }\n },\n compoundVariants: [\n // Primary danger state — swap the accent key for a neutral shadow.\n {\n variant: 'primary',\n danger: true,\n disabled: false,\n class: 'bg-error-default border-error-600 shadow-sm hover:bg-error-hover hover:border-error-default active:bg-error-active active:border-error-active'\n },\n // Default danger state\n {\n variant: 'default',\n danger: true,\n disabled: false,\n class: 'text-error-default border-error-default hover:text-error-hover hover:border-error-hover active:text-error-active active:border-error-active'\n },\n // Dashed danger state\n {\n variant: 'dashed',\n danger: true,\n disabled: false,\n class: 'text-error-default border-error-default hover:text-error-hover hover:border-error-hover active:text-error-active active:border-error-active'\n },\n // Text danger state\n {\n variant: 'text',\n danger: true,\n disabled: false,\n class: 'text-error-default hover:bg-error-subtle active:bg-error-muted'\n },\n // Link danger state\n {\n variant: 'link',\n danger: true,\n disabled: false,\n class: 'text-error-default hover:text-error-hover active:text-error-active'\n },\n // Text disabled state\n {\n variant: 'text',\n disabled: true,\n class: 'bg-transparent border-transparent'\n },\n // Link disabled state\n {\n variant: 'link',\n disabled: true,\n class: 'bg-transparent border-transparent'\n },\n // Icon size variants - circle and icon-only\n {size: 'xs', icon: true, class: 'size-[var(--tera-control-height-xs)]'},\n {size: 'sm', icon: true, class: 'size-[var(--tera-control-height-sm)]'},\n {size: 'md', icon: true, class: 'size-[var(--tera-control-height-base)]'},\n {size: 'lg', icon: true, class: 'size-[var(--tera-control-height-lg)]'},\n // Circle shape sizing\n {size: 'xs', shape: 'circle', class: 'size-[var(--tera-control-height-xs)]'},\n {size: 'sm', shape: 'circle', class: 'size-[var(--tera-control-height-sm)]'},\n {size: 'md', shape: 'circle', class: 'size-[var(--tera-control-height-base)]'},\n {size: 'lg', shape: 'circle', class: 'size-[var(--tera-control-height-lg)]'},\n ],\n defaultVariants: {\n variant: 'default',\n size: 'md',\n shape: 'default',\n },\n});\n\nexport type ButtonRecipeProps = VariantProps<typeof buttonRecipe>;\n\nexport interface ButtonProps extends Omit<HTMLButtonAttributes, 'disabled'>, ButtonRecipeProps {\n children?: Snippet;\n /** Replace the default loading spinner with custom markup (structural seam). */\n spinner?: Snippet;\n /** When set, the button renders as an `<a>` (button-as-link) without forking. */\n href?: HTMLAnchorAttributes['href'];\n target?: HTMLAnchorAttributes['target'];\n rel?: HTMLAnchorAttributes['rel'];\n class?: string;\n ref?: HTMLElement | null;\n}\n"
13
+ },
14
+ {
15
+ "path": "src/lib/components/button/Button.svelte",
16
+ "target": "Button.svelte",
17
+ "type": "svelte",
18
+ "content": "<script lang=\"ts\">\n import {type ButtonProps, buttonRecipe} from \"./Button.recipe\";\n\n let {\n children, disabled, variant = 'default', icon, size = 'md', shape = 'default', danger, loading, block,\n class: className,\n href, target, rel,\n spinner,\n ref = $bindable(),\n onclick,\n ...props\n }: ButtonProps = $props();\n\n const tag = $derived(href ? 'a' : 'button');\n const isDisabled = $derived(disabled || loading);\n\n function handleClick(e: MouseEvent) {\n if (isDisabled) {\n e.preventDefault();\n return;\n }\n onclick?.(e);\n }\n</script>\n\n<svelte:element\n this={tag}\n bind:this={ref}\n class={buttonRecipe({ disabled: isDisabled, variant, icon, size, shape, danger, block, class: className })}\n data-variant={variant}\n data-danger={danger || undefined}\n href={tag === 'a' ? href : undefined}\n target={tag === 'a' ? target : undefined}\n rel={tag === 'a' ? rel : undefined}\n role={tag === 'a' ? 'button' : undefined}\n disabled={tag === 'button' ? isDisabled : undefined}\n aria-disabled={isDisabled || undefined}\n aria-busy={loading}\n {...props}\n onclick={handleClick}\n>\n {#if loading}\n {#if spinner}\n {@render spinner()}\n {:else}\n <svg class=\"animate-spin\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle class=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"4\"></circle>\n <path class=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"></path>\n </svg>\n {/if}\n {/if}\n {@render children?.()}\n</svelte:element>\n"
19
+ },
20
+ {
21
+ "path": "src/lib/components/button/index.ts",
22
+ "target": "index.ts",
23
+ "type": "ts",
24
+ "content": "export {default as Button} from './Button.svelte'\nexport {buttonRecipe} from './Button.recipe'\nexport type {ButtonProps, ButtonRecipeProps} from './Button.recipe'\n"
25
+ }
26
+ ],
27
+ "dependencies": [
28
+ "tailwind-variants"
29
+ ],
30
+ "peerDependencies": [
31
+ "svelte"
32
+ ],
33
+ "registryDependencies": [],
34
+ "sharedModules": {
35
+ "utils": false,
36
+ "icons": false,
37
+ "hooks": false
38
+ },
39
+ "exports": [
40
+ "Button",
41
+ "buttonRecipe"
42
+ ]
43
+ }
@@ -0,0 +1,43 @@
1
+ {
2
+ "$schema": "https://tera-system-ui/registry-item.schema.json",
3
+ "name": "card",
4
+ "type": "registry:component",
5
+ "description": "Content container with elevation, border, padding variants.",
6
+ "recipe": "src/lib/components/card/Card.recipe.ts",
7
+ "files": [
8
+ {
9
+ "path": "src/lib/components/card/Card.recipe.ts",
10
+ "target": "Card.recipe.ts",
11
+ "type": "recipe",
12
+ "content": "import {tv, type VariantProps} from \"tailwind-variants\";\nimport type {Snippet} from \"svelte\";\nimport type {HTMLAttributes} from \"svelte/elements\";\n\n/**\n * Card recipe — the canonical styled layer for the base design language.\n *\n * Primary customization surface: an app owns its look by extending this recipe\n * with `tv({ extend: cardRecipe, ... })` in typed code — surface, variant and\n * padding scales are inherited; only the design language changes. See\n * docs/ARCHITECTURE.md for the worked example (kept out of this JSDoc so the\n * llms doc generator doesn't grep its variant tokens).\n *\n * Restyle-internals (the lighter rung): the per-component CSS var below\n * (--tera-card-radius) lets a theme/app retune the corner radius with no code\n * change; it defaults to the global container-radius token in tera-ui-base.css.\n */\nexport const cardRecipe = tv({\n base: 'relative bg-surface-raised rounded-[var(--tera-card-radius,var(--border-radius-container))] transition-[box-shadow,transform] ease-spring duration-[var(--tera-duration-base)]',\n variants: {\n variant: {\n default: 'shadow-sm',\n elevated: 'shadow-md',\n bordered: 'border border-border-default shadow-none',\n ghost: 'bg-transparent shadow-none',\n },\n padding: {\n none: 'p-0',\n sm: 'p-3',\n md: 'p-5',\n lg: 'p-7',\n },\n clickable: {\n true: 'cursor-pointer hover:shadow-md hover:-translate-y-px active:scale-[0.99]',\n },\n loading: {\n true: 'overflow-hidden',\n },\n },\n defaultVariants: {\n variant: 'default',\n padding: 'md',\n },\n});\n\nexport type CardRecipeProps = VariantProps<typeof cardRecipe>;\n\nexport interface CardProps extends HTMLAttributes<HTMLDivElement>, CardRecipeProps {\n children?: Snippet;\n class?: string;\n ref?: HTMLDivElement | null;\n}\n"
13
+ },
14
+ {
15
+ "path": "src/lib/components/card/Card.svelte",
16
+ "target": "Card.svelte",
17
+ "type": "svelte",
18
+ "content": "<script lang=\"ts\">\n import {type CardProps, cardRecipe} from './Card.recipe';\n\n let {\n children,\n class: className,\n variant,\n padding,\n clickable,\n loading,\n ref = $bindable(),\n onclick,\n ...props\n }: CardProps = $props();\n</script>\n\n{#if clickable}\n <button\n bind:this={ref}\n class={cardRecipe({ variant, padding, clickable, loading, class: className })}\n {onclick}\n {...props}\n >\n {#if loading}\n <div class=\"absolute inset-0 z-10 flex items-center justify-center bg-surface-raised/80 rounded-[var(--tera-card-radius)]\">\n <div class=\"size-6 rounded-full border-2 border-border-default border-t-interactive animate-spin\"></div>\n </div>\n {/if}\n {@render children?.()}\n </button>\n{:else}\n <div\n bind:this={ref}\n class={cardRecipe({ variant, padding, clickable, loading, class: className })}\n {onclick}\n {...props}\n >\n {#if loading}\n <div class=\"absolute inset-0 z-10 flex items-center justify-center bg-surface-raised/80 rounded-[var(--tera-card-radius)]\">\n <div class=\"size-6 rounded-full border-2 border-border-default border-t-interactive animate-spin\"></div>\n </div>\n {/if}\n {@render children?.()}\n </div>\n{/if}\n"
19
+ },
20
+ {
21
+ "path": "src/lib/components/card/index.ts",
22
+ "target": "index.ts",
23
+ "type": "ts",
24
+ "content": "export {default as Card} from './Card.svelte'\nexport {cardRecipe} from './Card.recipe'\nexport type {CardProps, CardRecipeProps} from './Card.recipe'\n"
25
+ }
26
+ ],
27
+ "dependencies": [
28
+ "tailwind-variants"
29
+ ],
30
+ "peerDependencies": [
31
+ "svelte"
32
+ ],
33
+ "registryDependencies": [],
34
+ "sharedModules": {
35
+ "utils": false,
36
+ "icons": false,
37
+ "hooks": false
38
+ },
39
+ "exports": [
40
+ "Card",
41
+ "cardRecipe"
42
+ ]
43
+ }
@@ -0,0 +1,45 @@
1
+ {
2
+ "$schema": "https://tera-system-ui/registry-item.schema.json",
3
+ "name": "checkbox",
4
+ "type": "registry:component",
5
+ "description": "Checkbox input with indeterminate support.",
6
+ "recipe": "src/lib/components/checkbox/Checkbox.recipe.ts",
7
+ "files": [
8
+ {
9
+ "path": "src/lib/components/checkbox/Checkbox.recipe.ts",
10
+ "target": "Checkbox.recipe.ts",
11
+ "type": "recipe",
12
+ "content": "/**\n * Checkbox recipe — the canonical styled layer for the base design language.\n *\n * Built on the bits-ui Checkbox primitive: a box (root) plus a centered\n * indicator that renders the check / indeterminate glyph.\n *\n * Primary customization surface: an app owns its look by extending this recipe\n * with `tv({ extend: checkboxRecipe, ... })` in typed code — the box sizing,\n * focus and state styles are inherited; only the design language changes. See\n * docs/ARCHITECTURE.md for the worked example.\n *\n * Restyle-internals (the lighter rung): the per-component CSS var below\n * (--tera-checkbox-radius) lets a theme/app retune the box corner radius with\n * no code change; it defaults to a global axis token in tera-ui-base.css.\n */\nimport {tv, type VariantProps} from \"tailwind-variants\";\nimport type {Snippet} from \"svelte\";\n\nexport const checkboxRecipe = tv({\n slots: {\n root: [\n \"group peer box-content size-4 shrink-0 rounded-[var(--tera-checkbox-radius,var(--tera-radius-sm))] border border-border-strong bg-surface-control\",\n \"shadow-[inset_0_1px_0_0_rgba(255,255,255,0.5),0_1px_2px_rgba(15,23,42,0.08)]\",\n \"transition-[border-color,box-shadow,background-color,transform] ease-ui duration-[var(--tera-duration-fast)]\",\n \"hover:border-border-strong hover:bg-surface-hover\",\n \"active:scale-95 active:duration-[var(--tera-duration-micro)]\",\n \"focus-visible:outline-none focus-visible:shadow-focus\",\n \"data-[state=checked]:bg-primary-600 data-[state=checked]:border-primary-600 data-[state=checked]:shadow-key data-[state=checked]:hover:bg-interactive-active\",\n \"data-[state=indeterminate]:bg-primary-600 data-[state=indeterminate]:border-primary-600 data-[state=indeterminate]:shadow-key data-[state=indeterminate]:hover:bg-interactive-active\",\n \"disabled:cursor-not-allowed disabled:bg-neutral-token-3 disabled:border-neutral-token-5 disabled:opacity-50 disabled:shadow-none\",\n \"data-[disabled=true]:cursor-not-allowed data-[disabled=true]:bg-neutral-token-3 data-[disabled=true]:border-neutral-token-5 data-[disabled=true]:opacity-50 data-[disabled=true]:shadow-none\",\n ],\n indicator: [\n \"flex size-4 items-center justify-center\",\n \"scale-50 opacity-0 transition-[transform,opacity] ease-spring duration-[var(--tera-duration-fast)]\",\n \"group-data-[state=checked]:scale-100 group-data-[state=checked]:opacity-100\",\n \"group-data-[state=indeterminate]:scale-100 group-data-[state=indeterminate]:opacity-100\",\n \"motion-reduce:transition-none\",\n ],\n },\n});\n\nexport type CheckboxRecipeProps = VariantProps<typeof checkboxRecipe>;\n\nexport interface CheckboxProps extends CheckboxRecipeProps {\n /** Additional CSS classes for the root element. */\n class?: string;\n /** Whether the checkbox is checked. Bindable. */\n checked?: boolean;\n /** Whether the checkbox shows an indeterminate (−) state. Bindable. */\n indeterminate?: boolean;\n /** Prevents user interaction and dims the control. */\n disabled?: boolean;\n /** Whether the checkbox must be checked before form submission. */\n required?: boolean;\n /** Name attribute used when submitting within a form. */\n name?: string;\n /** Value sent with the form when checked. */\n value?: string;\n /** Called when the checked state changes. */\n onCheckedChange?: (checked: boolean) => void;\n /** Additional content rendered next to the checkbox indicator. */\n children?: Snippet;\n /**\n * Replace the default indicator glyph (structural seam). Receives the\n * current `checked` / `indeterminate` state so a custom mark can react.\n */\n checkIcon?: Snippet<[{ checked: boolean; indeterminate: boolean }]>;\n /** Bindable reference to the root button element. */\n ref?: HTMLButtonElement | null;\n [key: string]: unknown;\n}\n"
13
+ },
14
+ {
15
+ "path": "src/lib/components/checkbox/Checkbox.svelte",
16
+ "target": "Checkbox.svelte",
17
+ "type": "svelte",
18
+ "content": "<script lang=\"ts\">\n import { Checkbox as CheckboxPrimitive } from \"bits-ui\";\n import { cn } from \"$lib/utils/index.js\";\n import IconCheck from \"@tabler/icons-svelte/icons/check\"\n import IconMinus from \"@tabler/icons-svelte/icons/minus\"\n import { type CheckboxProps, checkboxRecipe } from './Checkbox.recipe';\n\n let {\n ref = $bindable(null),\n checked = $bindable(false),\n indeterminate = $bindable(false),\n class: className,\n disabled,\n required,\n name,\n value,\n onCheckedChange,\n checkIcon,\n ...restProps\n }: CheckboxProps = $props();\n\n const r = checkboxRecipe();\n</script>\n\n<CheckboxPrimitive.Root\n bind:ref\n {disabled}\n {required}\n {name}\n {value}\n {onCheckedChange}\n class={r.root({ class: className })}\n bind:checked\n bind:indeterminate\n {...restProps}\n>\n {#snippet children({ checked, indeterminate })}\n <div class={r.indicator()}>\n {#if checkIcon}\n {@render checkIcon({ checked, indeterminate })}\n {:else if indeterminate}\n <IconMinus class=\"size-3.5 text-neutral-1\" stroke={3}/>\n {:else}\n <IconCheck class={cn(\"size-3.5 text-neutral-1\")} stroke={3.25}/>\n {/if}\n </div>\n {/snippet}\n</CheckboxPrimitive.Root>\n"
19
+ },
20
+ {
21
+ "path": "src/lib/components/checkbox/index.ts",
22
+ "target": "index.ts",
23
+ "type": "ts",
24
+ "content": "export {default as Checkbox} from './Checkbox.svelte'\nexport {checkboxRecipe} from './Checkbox.recipe'\nexport type {CheckboxProps, CheckboxRecipeProps} from './Checkbox.recipe'\n"
25
+ }
26
+ ],
27
+ "dependencies": [
28
+ "bits-ui",
29
+ "@tabler/icons-svelte",
30
+ "tailwind-variants"
31
+ ],
32
+ "peerDependencies": [
33
+ "svelte"
34
+ ],
35
+ "registryDependencies": [],
36
+ "sharedModules": {
37
+ "utils": true,
38
+ "icons": false,
39
+ "hooks": false
40
+ },
41
+ "exports": [
42
+ "Checkbox",
43
+ "checkboxRecipe"
44
+ ]
45
+ }
@@ -0,0 +1,45 @@
1
+ {
2
+ "$schema": "https://tera-system-ui/registry-item.schema.json",
3
+ "name": "combobox",
4
+ "type": "registry:component",
5
+ "description": "Searchable combobox with autocomplete.",
6
+ "recipe": "src/lib/components/combobox/Combobox.recipe.ts",
7
+ "files": [
8
+ {
9
+ "path": "src/lib/components/combobox/Combobox.recipe.ts",
10
+ "target": "Combobox.recipe.ts",
11
+ "type": "recipe",
12
+ "content": "import {tv, type VariantProps} from \"tailwind-variants\";\nimport type {Snippet} from \"svelte\";\n\n/**\n * Combobox recipe — the canonical styled layer for the searchable dropdown.\n *\n * Multi-part component (built on bits-ui Combobox): the recipe is slotted by\n * role — root / input / clear / trigger / chevron / content / viewport / item /\n * empty / chip / chipRemove — so an app can restyle any part independently. The\n * root wrapper carries the open/disabled visual states; the dropdown parts are\n * static base strings.\n *\n * Primary customization surface: extend with `tv({ extend: comboboxRecipe, ... })`\n * in typed code. Lighter rung: the per-component CSS vars (--tera-combobox-*) let\n * a theme retune corner radius with no code change; each reads through an inline\n * fallback to the prior global token, so the recipe is self-sufficient. See\n * docs/ARCHITECTURE.md for worked examples (kept out of this JSDoc so the llms\n * doc generator doesn't grep its tokens).\n */\nexport const comboboxRecipe = tv({\n slots: {\n root: `w-full inline-flex items-center gap-1 rounded-[var(--tera-combobox-radius,var(--tera-radius-base))] outline-none font-normal text-left\n border border-border-default bg-surface-control shadow-xs\n transition-[border-color,box-shadow] ease-ui duration-[var(--tera-duration-fast)]\n hover:border-border-strong`,\n input: 'flex-1 min-w-0 bg-transparent text-sm text-text-primary placeholder:text-text-tertiary outline-none cursor-default',\n clear: 'shrink-0 flex items-center justify-center size-4 rounded text-text-tertiary hover:text-text-primary',\n trigger: 'flex items-center justify-center text-text-tertiary hover:text-text-primary',\n chevron: 'size-4 transition-transform ease-ui duration-[var(--tera-duration-fast)]',\n content: `z-50 overflow-hidden\n bg-surface rounded-[var(--tera-combobox-content-radius,var(--border-radius-container))] border border-border-default shadow-lg\n animate-in fade-in zoom-in-95 duration-[var(--tera-duration-fast)]\n data-[state=closed]:animate-out data-[state=closed]:fade-out data-[state=closed]:zoom-out-95`,\n viewport: 'p-1 max-h-60 overflow-auto',\n item: `relative flex w-full cursor-pointer select-none items-center rounded px-2 py-2 text-sm text-text-primary outline-none\n transition-colors ease-ui duration-[var(--tera-duration-micro)]\n data-[highlighted]:bg-surface-hover\n data-[selected]:font-medium data-[selected]:text-interactive\n data-[disabled]:cursor-not-allowed data-[disabled]:opacity-50`,\n empty: 'px-3 py-4 text-sm text-center text-text-tertiary',\n chip: 'inline-flex items-center gap-1 pl-2 pr-1 py-0.5 rounded-full text-xs bg-interactive-subtle text-interactive-text border border-interactive-border shrink-0',\n chipRemove: 'flex items-center rounded-full hover:bg-interactive/20',\n },\n variants: {\n open: {\n true: {root: 'border-interactive-hover shadow-focus'},\n },\n disabled: {\n true: {root: 'cursor-not-allowed opacity-50 pointer-events-none'},\n },\n },\n});\n\nexport type ComboboxRecipeProps = VariantProps<typeof comboboxRecipe>;\n\nexport interface ComboboxItem {\n /** Unique value submitted or passed to onchange. */\n value: string;\n /** Human-readable label shown in the list and trigger. */\n label: string;\n /** Prevents selecting this item. */\n disabled?: boolean;\n}\n\nexport interface ComboboxProps {\n /** Whether one or many items can be selected at once. */\n type: 'single' | 'multiple';\n /** List of selectable options. */\n items: ComboboxItem[];\n /** Currently selected value(s). Bindable. */\n value?: string | string[];\n /** Placeholder shown in the search input when nothing is selected. */\n placeholder?: string;\n /** Prevents all interaction. */\n disabled?: boolean;\n /** Whether keyboard navigation wraps at the list boundaries. */\n loop?: boolean;\n /** Allow deselecting the current value by clicking it again (single mode only). */\n allowDeselect?: boolean;\n /** Called when the selection changes. */\n onchange?: (value: string | string[]) => void;\n /** Additional CSS classes for the root container. */\n class?: string;\n /** Bindable reference to the trigger element. */\n ref?: HTMLElement | null;\n\n // ── Passed through to Combobox.Root ────────────────────────────────\n /** Name for the hidden form input, enabling native form submission. */\n name?: string;\n /** Marks the field as required for form validation. */\n required?: boolean;\n /** Scroll alignment for the highlighted item. */\n scrollAlignment?: 'nearest' | 'center';\n\n // ── Autocomplete / free-text mode (single only) ─────────────────────\n /**\n * When true (single mode only), whatever the user types becomes the\n * combobox value directly — like a text input with suggestions.\n * Selecting an item from the list still sets its item.value as normal.\n */\n freeInput?: boolean;\n\n // ── Structural seams (override the hardcoded internal icons) ────────\n /** Replace the default selected-item check mark with custom markup. */\n checkIcon?: Snippet;\n /** Replace the default trigger chevron with custom markup. */\n chevronIcon?: Snippet;\n /** Replace the default clear (×) icon with custom markup. */\n clearIcon?: Snippet;\n\n [key: string]: unknown;\n}\n"
13
+ },
14
+ {
15
+ "path": "src/lib/components/combobox/Combobox.svelte",
16
+ "target": "Combobox.svelte",
17
+ "type": "svelte",
18
+ "content": "<script lang=\"ts\">\n import {Combobox as ComboboxPrimitive} from 'bits-ui';\n import {type ComboboxProps, comboboxRecipe} from './Combobox.recipe';\n import {cn} from '$lib/utils/utils.js';\n import {IconCheck, IconChevronDown} from '$lib/internal/icons';\n import IconX from '@tabler/icons-svelte/icons/x';\n\n let {\n type,\n items = [],\n value = $bindable(undefined),\n placeholder = 'Search…',\n disabled,\n loop,\n allowDeselect,\n onchange,\n class: className,\n ref = $bindable(null),\n name,\n required,\n scrollAlignment,\n freeInput = false,\n checkIcon,\n chevronIcon,\n clearIcon,\n }: ComboboxProps = $props();\n\n let searchText = $state('');\n let open = $state(false);\n\n\n const filteredItems = $derived(\n searchText.trim()\n ? items.filter(i => i.label.toLowerCase().includes(searchText.trim().toLowerCase()))\n : items\n );\n\n // Label of the currently selected item (single mode), or '' if none / custom text\n const selectedLabel = $derived(\n type === 'single' && typeof value === 'string' && value\n ? (items.find(i => i.value === value)?.label ?? '')\n : ''\n );\n\n const selectedChips = $derived(\n type === 'multiple' && Array.isArray(value)\n ? (value as string[]).map(v => ({value: v, label: items.find(i => i.value === v)?.label ?? v}))\n : []\n );\n\n /**\n * inputValue passed to Combobox.Root for single mode:\n * - freeInput mode: always controlled — show selected label when an item\n * matches, otherwise show the raw value (custom free text).\n * - normal mode: undefined → let bits-ui manage it automatically.\n *\n * Setting this to '' on clear ensures the input text is wiped even when\n * the dropdown animation is still playing.\n */\n const controlledInputValue = $derived.by<string | undefined>(() => {\n if (type !== 'single') return undefined;\n if (freeInput) {\n // Show label when value matches an item; otherwise the raw typed value\n return selectedLabel || (typeof value === 'string' ? value : '') || '';\n }\n // Normal mode: after clearing, force the input empty; otherwise let bits-ui handle it\n if (!value) return '';\n return undefined;\n });\n\n // In freeInput mode the X button is visible whenever the input has any text\n const showClearBtn = $derived(\n type === 'single' && (freeInput ? !!(value) : !!(value))\n );\n\n function handleSingleInput(e: Event & {currentTarget: HTMLInputElement}) {\n searchText = e.currentTarget.value;\n if (freeInput) {\n // Typed text IS the value in free-input mode\n value = searchText as typeof value;\n onchange?.(searchText);\n // Close immediately (same tick) when no suggestions match —\n // avoids a \"no results\" flash before a reactive effect would fire.\n if (searchText.trim() && !items.some(i => i.label.toLowerCase().includes(searchText.trim().toLowerCase()))) {\n open = false;\n }\n }\n }\n\n function clearOne(v: string) {\n const next = (value as string[]).filter(x => x !== v);\n value = next as typeof value;\n onchange?.(next);\n }\n\n function clearAll() {\n value = type === 'multiple' ? ([] as typeof value) : (undefined as typeof value);\n onchange?.(type === 'multiple' ? [] : '');\n searchText = '';\n }\n\n const r = $derived(comboboxRecipe({open, disabled}));\n</script>\n\n{#if type === 'single'}\n <ComboboxPrimitive.Root\n type=\"single\"\n bind:value={value as string | undefined}\n bind:open\n onValueChange={(v) => onchange?.(v)}\n {disabled}\n {loop}\n {allowDeselect}\n {name}\n {required}\n {scrollAlignment}\n {items}\n inputValue={controlledInputValue}\n onOpenChange={(o) => { if (!o) searchText = ''; }}\n >\n <div bind:this={ref} class={r.root({class: cn('h-[var(--tera-control-height-md)] px-[var(--tera-control-px-md)]', className)})}>\n <ComboboxPrimitive.Input\n oninput={handleSingleInput}\n placeholder={(!freeInput && selectedLabel) ? selectedLabel : placeholder}\n clearOnDeselect\n class={r.input()}\n />\n {#if showClearBtn}\n <button\n type=\"button\"\n onpointerdown={(e) => e.stopPropagation()}\n onclick={(e) => { e.stopPropagation(); clearAll(); }}\n class={r.clear()}\n aria-label=\"Clear selection\"\n >\n {#if clearIcon}\n {@render clearIcon()}\n {:else}\n <IconX class=\"size-3.5\" />\n {/if}\n </button>\n {/if}\n <ComboboxPrimitive.Trigger class={r.trigger({class: 'shrink-0'})}>\n {#if chevronIcon}\n {@render chevronIcon()}\n {:else}\n <IconChevronDown class={cn(r.chevron(), open && 'rotate-180')} />\n {/if}\n </ComboboxPrimitive.Trigger>\n </div>\n\n {#if !freeInput || filteredItems.length > 0}\n <ComboboxPrimitive.Portal>\n <ComboboxPrimitive.Content\n sideOffset={4}\n customAnchor={ref}\n class={r.content({class: 'min-w-[var(--bits-combobox-anchor-width)]'})}\n >\n <ComboboxPrimitive.Viewport class={r.viewport()}>\n {#each filteredItems as item (item.value)}\n <ComboboxPrimitive.Item\n value={item.value}\n label={item.label}\n disabled={item.disabled}\n class={r.item()}\n >\n {#snippet children({selected})}\n <span class=\"flex-1\">{item.label}</span>\n {#if selected}\n {#if checkIcon}\n {@render checkIcon()}\n {:else}\n <IconCheck class=\"size-4 text-interactive shrink-0\" />\n {/if}\n {/if}\n {/snippet}\n </ComboboxPrimitive.Item>\n {:else}\n <div class={r.empty()}>No results found.</div>\n {/each}\n </ComboboxPrimitive.Viewport>\n </ComboboxPrimitive.Content>\n </ComboboxPrimitive.Portal>\n {/if}\n </ComboboxPrimitive.Root>\n\n{:else}\n <ComboboxPrimitive.Root\n type=\"multiple\"\n bind:value={value as string[] | undefined}\n bind:open\n onValueChange={(v) => onchange?.(v)}\n {disabled}\n {loop}\n {name}\n {required}\n {scrollAlignment}\n onOpenChange={(o) => { if (!o) searchText = ''; }}\n >\n <div bind:this={ref} class={r.root({class: cn('min-h-[var(--tera-control-height-md)] h-auto flex-wrap gap-1 px-[var(--tera-control-px-md)] py-1.5', className)})}>\n {#each selectedChips as chip (chip.value)}\n <span class={r.chip()}>\n {chip.label}\n <button\n type=\"button\"\n onpointerdown={(e) => e.stopPropagation()}\n onclick={(e) => { e.stopPropagation(); clearOne(chip.value); }}\n class={r.chipRemove()}\n aria-label=\"Remove {chip.label}\"\n >\n {#if clearIcon}\n {@render clearIcon()}\n {:else}\n <IconX class=\"size-3\" />\n {/if}\n </button>\n </span>\n {/each}\n <ComboboxPrimitive.Input\n oninput={(e) => (searchText = e.currentTarget.value)}\n placeholder={selectedChips.length === 0 ? placeholder : ''}\n clearOnDeselect\n class={r.input({class: 'min-w-[80px]'})}\n />\n <span class=\"ml-auto flex items-center gap-1 shrink-0 self-center\">\n {#if selectedChips.length > 0}\n <button\n type=\"button\"\n onpointerdown={(e) => e.stopPropagation()}\n onclick={(e) => { e.stopPropagation(); clearAll(); }}\n class={r.clear()}\n aria-label=\"Clear all\"\n >\n {#if clearIcon}\n {@render clearIcon()}\n {:else}\n <IconX class=\"size-3.5\" />\n {/if}\n </button>\n {/if}\n <ComboboxPrimitive.Trigger class={r.trigger()}>\n {#if chevronIcon}\n {@render chevronIcon()}\n {:else}\n <IconChevronDown class={cn(r.chevron(), open && 'rotate-180')} />\n {/if}\n </ComboboxPrimitive.Trigger>\n </span>\n </div>\n\n <ComboboxPrimitive.Portal>\n <ComboboxPrimitive.Content\n sideOffset={4}\n customAnchor={ref}\n class={r.content({class: 'min-w-[var(--bits-combobox-anchor-width)]'})}\n >\n <ComboboxPrimitive.Viewport class={r.viewport()}>\n {#each filteredItems as item (item.value)}\n <ComboboxPrimitive.Item\n value={item.value}\n label={item.label}\n disabled={item.disabled}\n class={r.item()}\n >\n {#snippet children({selected})}\n <span class=\"flex-1\">{item.label}</span>\n {#if selected}\n {#if checkIcon}\n {@render checkIcon()}\n {:else}\n <IconCheck class=\"size-4 text-interactive shrink-0\" />\n {/if}\n {/if}\n {/snippet}\n </ComboboxPrimitive.Item>\n {:else}\n <div class={r.empty()}>No results found.</div>\n {/each}\n </ComboboxPrimitive.Viewport>\n </ComboboxPrimitive.Content>\n </ComboboxPrimitive.Portal>\n </ComboboxPrimitive.Root>\n{/if}\n"
19
+ },
20
+ {
21
+ "path": "src/lib/components/combobox/index.ts",
22
+ "target": "index.ts",
23
+ "type": "ts",
24
+ "content": "export {default as Combobox} from './Combobox.svelte'\nexport {comboboxRecipe} from './Combobox.recipe'\nexport type {ComboboxProps, ComboboxItem, ComboboxRecipeProps} from './Combobox.recipe'\n"
25
+ }
26
+ ],
27
+ "dependencies": [
28
+ "bits-ui",
29
+ "@tabler/icons-svelte",
30
+ "tailwind-variants"
31
+ ],
32
+ "peerDependencies": [
33
+ "svelte"
34
+ ],
35
+ "registryDependencies": [],
36
+ "sharedModules": {
37
+ "utils": true,
38
+ "icons": true,
39
+ "hooks": false
40
+ },
41
+ "exports": [
42
+ "Combobox",
43
+ "comboboxRecipe"
44
+ ]
45
+ }
@@ -0,0 +1,109 @@
1
+ {
2
+ "$schema": "https://tera-system-ui/registry-item.schema.json",
3
+ "name": "command",
4
+ "type": "registry:component",
5
+ "description": "Command palette.",
6
+ "recipe": "src/lib/components/command/Command.recipe.ts",
7
+ "files": [
8
+ {
9
+ "path": "src/lib/components/command/Command.recipe.ts",
10
+ "target": "Command.recipe.ts",
11
+ "type": "recipe",
12
+ "content": "import {tv, type VariantProps} from \"tailwind-variants\";\n\n/**\n * Command recipe — the canonical styled layer for the base design language.\n *\n * Multi-part component (built on bits-ui Command): the recipe is slotted by role\n * — root / list / item / linkItem / group / groupHeading / separator / shortcut /\n * empty — so an app can restyle any part independently. Most of the visual\n * treatment for the list surface, items, groups and empty state lives in the\n * companion `command.scss` (data-cmdk-* attribute selectors); these slots carry\n * the Tailwind utility strings that were previously inlined per sub-component.\n *\n * Primary customization surface: extend with `tv({ extend: commandRecipe, ... })`\n * in typed code. Lighter rung: the per-component CSS var (--tera-command-radius)\n * lets a theme retune the list/menu surface corner radius with no code change;\n * it defaults to 0 (square — the prior look) via an inline fallback. See\n * docs/ARCHITECTURE.md for worked examples (kept out of this JSDoc so the llms\n * doc generator doesn't grep its tokens).\n */\nexport const commandRecipe = tv({\n slots: {\n root: 'flex w-full flex-col overflow-hidden',\n list: 'rounded-[var(--tera-command-radius,0)]',\n item: '',\n linkItem: \"aria-selected:bg-accent aria-selected:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground outline-hidden relative flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50 [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n group: 'overflow-hidden',\n groupHeading: '',\n separator: 'bg-border mx-1 h-px',\n shortcut: 'text-muted-foreground ml-auto text-xs tracking-widest',\n empty: '',\n },\n});\n\nexport type CommandRecipeProps = VariantProps<typeof commandRecipe>;\n"
13
+ },
14
+ {
15
+ "path": "src/lib/components/command/command.scss",
16
+ "target": "command.scss",
17
+ "type": "style",
18
+ "content": "@reference \"tailwindcss/theme\";\r\n\r\n[data-cmdk-root] {\r\n\ttransition: transform 100ms ease;\r\n\tmax-width: var(--spacing-screen-md);\r\n\twidth: 100%;\r\n\toverflow: hidden;\r\n}\r\n\r\n[data-cmdk-item] {\r\n\tcontent-visibility: auto;\r\n\r\n\tcursor: pointer;\r\n\tborder-radius: var(--radius-sm);\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n\tgap: --spacing(2);\r\n\tpadding-inline: --spacing(2);\r\n\tpadding-block: --spacing(2.5);\r\n\tcolor: var(--color-neutral-token-10);\r\n\tuser-select: none;\r\n\twill-change: background, color;\r\n\ttransition: all 150ms ease;\r\n\ttransition-property: none;\r\n\r\n\t&[data-selected] {\r\n\t\tbackground: var(--color-neutral-token-4);\r\n\t\tcolor: var(--color-neutral-token-13);\r\n\t}\r\n\r\n\t&[data-disabled] {\r\n\t\tcolor: var(--color-neutral-token-7);\r\n\t\tcursor: not-allowed;\r\n\t}\r\n\r\n\t&:active {\r\n\t\ttransition-property: background;\r\n\t\tbackground: var(--color-neutral-token-5);\r\n\t}\r\n\r\n\t//& + [data-cmdk-item] {\r\n\t//\tmargin-top: 4px;\r\n\t//}\r\n\r\n\tsvg {\r\n\t\twidth: 18px;\r\n\t\theight: 18px;\r\n\t}\r\n}\r\n\r\n[data-cmdk-list] {\r\n\theight: min(330px, calc(var(--cmdk-list-height)));\r\n\tmax-height: 400px;\r\n\toverflow: auto;\r\n\toverscroll-behavior: contain;\r\n\ttransition: 100ms ease;\r\n\ttransition-property: height;\r\n\tmargin-block: --spacing(2);\r\n\tpadding-inline: --spacing(2);\r\n}\r\n\r\n[data-cmdk-separator] {\r\n\theight: 1px;\r\n\twidth: 100%;\r\n\tmargin: 4px 0;\r\n\tbackground: var(--color-neutral-token-5);\r\n}\r\n\r\n*:not([hidden]) + [data-cmdk-group] {\r\n\tmargin-top: --spacing(2);\r\n}\r\n\r\n[data-cmdk-group-heading] {\r\n\tuser-select: none;\r\n\tfont-size: var(--text-xs);\r\n\tcolor: var(--color-neutral-token-9);\r\n\tdisplay: flex;\r\n\tpadding-block: --spacing(1);\r\n\tpadding-inline: --spacing(2);\r\n}\r\n\r\n[data-cmdk-empty] {\r\n\tdisplay: grid;\r\n\tplace-content: center;\r\n\tfont-size: var(--text-sm);\r\n\tcolor: var(--color-neutral-token-8);\r\n\theight: --spacing(12);\r\n\twhite-space: pre-wrap;\r\n}"
19
+ },
20
+ {
21
+ "path": "src/lib/components/command/components/command-empty.svelte",
22
+ "target": "components/command-empty.svelte",
23
+ "type": "svelte",
24
+ "content": "<script lang=\"ts\">\r\n import { Command as CommandPrimitive } from \"bits-ui\";\r\n import { commandRecipe } from \"../Command.recipe\";\r\n let {\r\n ref = $bindable(null),\r\n class: className,\r\n ...restProps\r\n }: CommandPrimitive.EmptyProps = $props();\r\n</script>\r\n<CommandPrimitive.Empty\r\n bind:ref\r\n data-slot=\"command-empty\"\r\n data-cmdk-empty=\"\"\r\n class={commandRecipe().empty({class: className})}\r\n {...restProps}\r\n/>"
25
+ },
26
+ {
27
+ "path": "src/lib/components/command/components/command-group.svelte",
28
+ "target": "components/command-group.svelte",
29
+ "type": "svelte",
30
+ "content": "<script lang=\"ts\">\r\n import { Command as CommandPrimitive, useId } from \"bits-ui\";\r\n import { commandRecipe } from \"../Command.recipe\";\r\n let {\r\n ref = $bindable(null),\r\n class: className,\r\n children,\r\n heading,\r\n value,\r\n ...restProps\r\n }: CommandPrimitive.GroupProps & {\r\n heading?: string;\r\n } = $props();\r\n\r\n const r = commandRecipe();\r\n</script>\r\n<CommandPrimitive.Group\r\n bind:ref\r\n data-slot=\"command-group\"\r\n class={r.group({class: className})}\r\n value={value ?? heading ?? `----${useId()}`}\r\n {...restProps}\r\n>\r\n {#if heading}\r\n <CommandPrimitive.GroupHeading\r\n data-cmdk-group-heading=\"\"\r\n class={r.groupHeading()}\r\n >\r\n {heading}\r\n </CommandPrimitive.GroupHeading>\r\n {/if}\r\n <CommandPrimitive.GroupItems {children} />\r\n</CommandPrimitive.Group>"
31
+ },
32
+ {
33
+ "path": "src/lib/components/command/components/command-input.svelte",
34
+ "target": "components/command-input.svelte",
35
+ "type": "svelte",
36
+ "content": "<script lang=\"ts\">\r\n import {Command as CommandPrimitive} from \"bits-ui\";\r\n import {cn} from \"$lib/utils\";\r\n import {IconSearch} from \"$lib/internal/icons\";\r\n import {inputRecipe} from \"$lib/components/input\";\r\n\r\n let {\r\n autofocus = undefined,\r\n ref = $bindable(null),\r\n class: className,\r\n value = $bindable(\"\"),\r\n ...restProps\r\n }: CommandPrimitive.InputProps = $props();\r\n</script>\r\n<div class=\"flex items-center border-b px-3\" data-slot=\"command-input-wrapper\">\r\n <IconSearch class=\"size-4 shrink-0 opacity-50\"/>\r\n <CommandPrimitive.Input\r\n autofocus={autofocus}\r\n data-slot=\"command-input\"\r\n class={inputRecipe({ variant: 'borderless', size: 'lg' }).field({ class: cn('rounded-none text-sm', className) })}\r\n\r\n bind:ref\r\n {...restProps}\r\n bind:value\r\n />\r\n</div>"
37
+ },
38
+ {
39
+ "path": "src/lib/components/command/components/command-item.svelte",
40
+ "target": "components/command-item.svelte",
41
+ "type": "svelte",
42
+ "content": "<script lang=\"ts\">\r\n import {Command as CommandPrimitive} from \"bits-ui\";\r\n import {commandRecipe} from \"../Command.recipe\";\r\n\r\n let {\r\n ref = $bindable(null),\r\n class: className,\r\n ...restProps\r\n }: CommandPrimitive.ItemProps = $props();\r\n</script>\r\n<CommandPrimitive.Item\r\n bind:ref\r\n data-slot=\"command-item\"\r\n data-cmdk-item=\"\"\r\n class={commandRecipe().item({class: className})}\r\n {...restProps}\r\n/>"
43
+ },
44
+ {
45
+ "path": "src/lib/components/command/components/command-link-item.svelte",
46
+ "target": "components/command-link-item.svelte",
47
+ "type": "svelte",
48
+ "content": "<script lang=\"ts\">\r\n import { Command as CommandPrimitive } from \"bits-ui\";\r\n import { commandRecipe } from \"../Command.recipe\";\r\n let {\r\n ref = $bindable(null),\r\n class: className,\r\n ...restProps\r\n }: CommandPrimitive.LinkItemProps = $props();\r\n</script>\r\n<CommandPrimitive.LinkItem\r\n bind:ref\r\n data-slot=\"command-item\"\r\n class={commandRecipe().linkItem({class: className})}\r\n {...restProps}\r\n/>"
49
+ },
50
+ {
51
+ "path": "src/lib/components/command/components/command-list.svelte",
52
+ "target": "components/command-list.svelte",
53
+ "type": "svelte",
54
+ "content": "<script lang=\"ts\">\r\n import { Command as CommandPrimitive } from \"bits-ui\";\r\n import { commandRecipe } from \"../Command.recipe\";\r\n let {\r\n ref = $bindable(null),\r\n class: className,\r\n ...restProps\r\n }: CommandPrimitive.ListProps = $props();\r\n</script>\r\n<CommandPrimitive.List\r\n bind:ref\r\n data-slot=\"command-list\"\r\n data-cmdk-list=\"\"\r\n class={commandRecipe().list({class: className})}\r\n {...restProps}\r\n/>"
55
+ },
56
+ {
57
+ "path": "src/lib/components/command/components/command-separator.svelte",
58
+ "target": "components/command-separator.svelte",
59
+ "type": "svelte",
60
+ "content": "<script lang=\"ts\">\r\n import { Command as CommandPrimitive } from \"bits-ui\";\r\n import { commandRecipe } from \"../Command.recipe\";\r\n let {\r\n ref = $bindable(null),\r\n class: className,\r\n ...restProps\r\n }: CommandPrimitive.SeparatorProps = $props();\r\n</script>\r\n<CommandPrimitive.Separator\r\n bind:ref\r\n data-slot=\"command-separator\"\r\n class={commandRecipe().separator({class: className})}\r\n {...restProps}\r\n/>"
61
+ },
62
+ {
63
+ "path": "src/lib/components/command/components/command-shortcut.svelte",
64
+ "target": "components/command-shortcut.svelte",
65
+ "type": "svelte",
66
+ "content": "<script lang=\"ts\">\r\n import type {WithElementRef} from \"$lib/utils\";\r\n import type {HTMLAttributes} from \"svelte/elements\";\r\n import {commandRecipe} from \"../Command.recipe\";\r\n\r\n let {\r\n ref = $bindable(null),\r\n class: className,\r\n children,\r\n ...restProps\r\n }: WithElementRef<HTMLAttributes<HTMLSpanElement>> = $props();\r\n</script>\r\n<span\r\n bind:this={ref}\r\n data-slot=\"command-shortcut\"\r\n class={commandRecipe().shortcut({class: className})}\r\n {...restProps}\r\n>\r\n {@render children?.()}\r\n</span>"
67
+ },
68
+ {
69
+ "path": "src/lib/components/command/components/command.svelte",
70
+ "target": "components/command.svelte",
71
+ "type": "svelte",
72
+ "content": "<script lang=\"ts\">\r\n import {Command as CommandPrimitive} from \"bits-ui\";\r\n import {commandRecipe} from \"../Command.recipe\";\r\n import \"../command.scss\"\r\n\r\n let {\r\n ref = $bindable(null),\r\n value = $bindable(\"\"),\r\n command = $bindable(),\r\n class: className,\r\n selectedIndex,\r\n ...restProps\r\n }: CommandPrimitive.RootProps = $props();\r\n\r\n $effect(() => {\r\n if (!command || selectedIndex === undefined) return;\r\n const items = command.getValidItems();\r\n if (!items?.length) return;\r\n\r\n setTimeout(() => {\r\n if (selectedIndex < 0) {\r\n const selectedItem = items.find((item: HTMLElement) =>\r\n item.hasAttribute('data-selected')\r\n );\r\n\r\n if (selectedItem) {\r\n selectedItem.removeAttribute(\"data-selected\");\r\n\r\n // Use AbortController for cleanup\r\n const controller = new AbortController();\r\n selectedItem.addEventListener(\"pointerenter\", () => {\r\n selectedItem.setAttribute(\"data-selected\", \"\");\r\n }, {once: true, signal: controller.signal});\r\n\r\n // Cleanup on component unmount\r\n return () => controller.abort();\r\n }\r\n } else if (selectedIndex < items.length) {\r\n command.updateSelectedToIndex(selectedIndex);\r\n }\r\n }, 6)\r\n });\r\n</script>\r\n<CommandPrimitive.Root\r\n bind:value\r\n bind:ref\r\n bind:this={command}\r\n data-slot=\"command\"\r\n class={commandRecipe().root({class: className})}\r\n {...restProps}\r\n/>"
73
+ },
74
+ {
75
+ "path": "src/lib/components/command/index.ts",
76
+ "target": "index.ts",
77
+ "type": "ts",
78
+ "content": "import {Command as CommandPrimitive} from \"bits-ui\";\r\nimport Root from \"./components/command.svelte\";\r\nimport Empty from \"./components/command-empty.svelte\";\r\nimport Group from \"./components/command-group.svelte\";\r\nimport Item from \"./components/command-item.svelte\";\r\nimport Input from \"./components/command-input.svelte\";\r\nimport List from \"./components/command-list.svelte\";\r\nimport Separator from \"./components/command-separator.svelte\";\r\nimport Shortcut from \"./components/command-shortcut.svelte\";\r\nimport LinkItem from \"./components/command-link-item.svelte\";\r\n\r\nconst Loading = CommandPrimitive.Loading;\r\nexport {//\r\n Root as Command,\r\n Empty as CommandEmpty,\r\n Group as CommandGroup,\r\n Item as CommandItem,\r\n LinkItem as CommandLinkItem,\r\n Input as CommandInput,\r\n List as CommandList,\r\n Separator as CommandSeparator,\r\n Shortcut as CommandShortcut,\r\n Loading as CommandLoading,\r\n};\r\n\r\nexport {commandRecipe} from \"./Command.recipe\";\r\nexport type {CommandRecipeProps} from \"./Command.recipe\";"
79
+ }
80
+ ],
81
+ "dependencies": [
82
+ "bits-ui",
83
+ "tailwind-variants"
84
+ ],
85
+ "peerDependencies": [
86
+ "svelte"
87
+ ],
88
+ "registryDependencies": [
89
+ "input"
90
+ ],
91
+ "sharedModules": {
92
+ "utils": true,
93
+ "icons": true,
94
+ "hooks": false
95
+ },
96
+ "exports": [
97
+ "Command",
98
+ "CommandEmpty",
99
+ "CommandGroup",
100
+ "CommandItem",
101
+ "CommandLinkItem",
102
+ "CommandInput",
103
+ "CommandList",
104
+ "CommandSeparator",
105
+ "CommandShortcut",
106
+ "CommandLoading",
107
+ "commandRecipe"
108
+ ]
109
+ }