@selvajs/ui 6.6.0-beta.15 → 6.6.0-beta.16

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 (204) hide show
  1. package/README.md +0 -3
  2. package/dist/components/compute/AppLayout.svelte +5 -3
  3. package/dist/components/compute/CollapsedPanelStrip.svelte +1 -1
  4. package/dist/components/compute/ParameterPresetManager.svelte +1 -1
  5. package/dist/components/compute/SolveMessages.svelte +2 -2
  6. package/dist/components/layout/FooterItemRenderer.svelte +1 -1
  7. package/dist/components/layout/PageFooter.svelte +2 -2
  8. package/dist/components/layout/PageHeader.svelte +1 -1
  9. package/dist/components/layout/SideNav.svelte +3 -3
  10. package/dist/components/layout/SubNav.svelte +2 -2
  11. package/dist/components/preview/ChartOutput.svelte +3 -3
  12. package/dist/components/preview/Group.svelte +7 -7
  13. package/dist/components/preview/ImageOutput.svelte +6 -6
  14. package/dist/components/preview/InputControl.svelte +1 -0
  15. package/dist/components/preview/OutputDisplay.svelte +8 -6
  16. package/dist/components/preview/TabBar.svelte +6 -4
  17. package/dist/components/preview/TabBar.svelte.d.ts +2 -0
  18. package/dist/components/preview/TabContent.svelte +1 -1
  19. package/dist/components/preview/TabLayout.svelte +3 -4
  20. package/dist/components/preview/inputs/ChecklistInput.svelte +3 -3
  21. package/dist/components/preview/inputs/ColorInput.svelte +356 -14
  22. package/dist/components/preview/inputs/ColorInput.svelte.d.ts +1 -0
  23. package/dist/components/preview/inputs/FileInput.svelte +3 -3
  24. package/dist/components/preview/inputs/SegmentedInput.svelte +2 -1
  25. package/dist/components/preview/inputs/TileInput.svelte +1 -1
  26. package/dist/components/primitives/CalculateButton.svelte +2 -2
  27. package/dist/components/primitives/Callout.svelte +7 -5
  28. package/dist/components/primitives/Callout.svelte.d.ts +4 -4
  29. package/dist/components/primitives/DataTable.svelte +1 -1
  30. package/dist/components/primitives/ImageUploadField.svelte +1 -1
  31. package/dist/components/primitives/alert-dialog/alert-dialog-content.svelte +1 -1
  32. package/dist/components/primitives/badge/badge.svelte +2 -2
  33. package/dist/components/primitives/badge/badge.svelte.d.ts +6 -6
  34. package/dist/components/primitives/button/button.svelte +6 -7
  35. package/dist/components/primitives/button/button.svelte.d.ts +18 -18
  36. package/dist/components/primitives/card/card.svelte +1 -1
  37. package/dist/components/primitives/card/card.svelte.d.ts +1 -1
  38. package/dist/components/primitives/checkbox/checkbox.svelte +1 -1
  39. package/dist/components/primitives/command/command-input.svelte +1 -1
  40. package/dist/components/primitives/command/command-item.svelte +1 -1
  41. package/dist/components/primitives/command/command-link-item.svelte +1 -1
  42. package/dist/components/primitives/command/command.svelte +1 -1
  43. package/dist/components/primitives/context-menu/context-menu-checkbox-item.svelte +1 -1
  44. package/dist/components/primitives/context-menu/context-menu-content.svelte +1 -1
  45. package/dist/components/primitives/context-menu/context-menu-item.svelte +1 -1
  46. package/dist/components/primitives/context-menu/context-menu-radio-item.svelte +1 -1
  47. package/dist/components/primitives/context-menu/context-menu-sub-content.svelte +1 -1
  48. package/dist/components/primitives/context-menu/context-menu-sub-trigger.svelte +1 -1
  49. package/dist/components/primitives/dialog/dialog-content.svelte +2 -2
  50. package/dist/components/primitives/drawer/Drawer.svelte +1 -1
  51. package/dist/components/primitives/dropdown-menu/dropdown-menu-checkbox-item.svelte +31 -11
  52. package/dist/components/primitives/dropdown-menu/dropdown-menu-checkbox-item.svelte.d.ts +2 -0
  53. package/dist/components/primitives/dropdown-menu/dropdown-menu-content.svelte +5 -1
  54. package/dist/components/primitives/dropdown-menu/dropdown-menu-content.svelte.d.ts +2 -0
  55. package/dist/components/primitives/dropdown-menu/dropdown-menu-item.svelte +4 -2
  56. package/dist/components/primitives/dropdown-menu/dropdown-menu-item.svelte.d.ts +2 -1
  57. package/dist/components/primitives/dropdown-menu/dropdown-menu-radio-item.svelte +1 -1
  58. package/dist/components/primitives/dropdown-menu/dropdown-menu-shortcut.svelte +1 -1
  59. package/dist/components/primitives/dropdown-menu/dropdown-menu-sub-content.svelte +1 -1
  60. package/dist/components/primitives/dropdown-menu/dropdown-menu-sub-trigger.svelte +1 -1
  61. package/dist/components/primitives/index.d.ts +1 -1
  62. package/dist/components/primitives/index.js +1 -1
  63. package/dist/components/primitives/input/input.svelte +2 -2
  64. package/dist/components/primitives/input-group/input-group.svelte +1 -1
  65. package/dist/components/primitives/popover/popover-content.svelte +1 -1
  66. package/dist/components/primitives/resizable/resizable-handle.svelte +2 -2
  67. package/dist/components/primitives/search/search.svelte +1 -1
  68. package/dist/components/primitives/select/select-content.svelte +1 -1
  69. package/dist/components/primitives/select/select-item.svelte +1 -1
  70. package/dist/components/primitives/select/select-trigger.svelte +1 -1
  71. package/dist/components/primitives/slider/slider.svelte +1 -1
  72. package/dist/components/primitives/switch/switch.svelte +1 -1
  73. package/dist/components/primitives/tabs/tabs-list.svelte +1 -1
  74. package/dist/components/primitives/tabs/tabs-list.svelte.d.ts +3 -3
  75. package/dist/components/primitives/tabs/tabs-trigger.svelte +1 -1
  76. package/dist/components/primitives/tabs/tabs-trigger.svelte.d.ts +3 -3
  77. package/dist/components/primitives/textarea/textarea.svelte +1 -1
  78. package/dist/components/primitives/toggle/toggle.svelte +6 -3
  79. package/dist/components/primitives/toggle/toggle.svelte.d.ts +10 -7
  80. package/dist/components/primitives/toggle-group/toggle-group-item.svelte +1 -1
  81. package/dist/components/primitives/toggle-group/toggle-group.svelte +1 -1
  82. package/dist/components/primitives/tooltip/index.d.ts +6 -0
  83. package/dist/components/primitives/tooltip/index.js +8 -0
  84. package/dist/components/primitives/tooltip/tooltip-content.svelte +34 -0
  85. package/dist/components/primitives/tooltip/tooltip-content.svelte.d.ts +10 -0
  86. package/dist/components/primitives/tooltip/tooltip-portal.svelte +7 -0
  87. package/dist/components/primitives/tooltip/tooltip-portal.svelte.d.ts +4 -0
  88. package/dist/components/primitives/tooltip/tooltip-provider.svelte +7 -0
  89. package/dist/components/primitives/tooltip/tooltip-provider.svelte.d.ts +4 -0
  90. package/dist/components/primitives/tooltip/tooltip-trigger.svelte +7 -0
  91. package/dist/components/primitives/tooltip/tooltip-trigger.svelte.d.ts +4 -0
  92. package/dist/components/primitives/tooltip/tooltip.svelte +7 -0
  93. package/dist/components/primitives/tooltip/tooltip.svelte.d.ts +4 -0
  94. package/dist/components/viewer/MeshMetadataPanel.svelte +1 -1
  95. package/dist/components/viewer/SceneManager.svelte +19 -19
  96. package/dist/components/viewer/Viewer.svelte +68 -157
  97. package/dist/components/viewer/ViewerDock.svelte +404 -0
  98. package/dist/components/viewer/ViewerDock.svelte.d.ts +42 -0
  99. package/dist/i18n/messages.d.ts +11 -0
  100. package/dist/i18n/messages.js +18 -0
  101. package/dist/styles/base.css +81 -80
  102. package/dist/utils/color-space.d.ts +21 -0
  103. package/dist/utils/color-space.js +90 -0
  104. package/package.json +9 -10
  105. package/src/lib/components/compute/AppLayout.svelte +5 -3
  106. package/src/lib/components/compute/CollapsedPanelStrip.svelte +1 -1
  107. package/src/lib/components/compute/ParameterPresetManager.svelte +1 -1
  108. package/src/lib/components/compute/SolveMessages.svelte +2 -2
  109. package/src/lib/components/layout/FooterItemRenderer.svelte +1 -1
  110. package/src/lib/components/layout/PageFooter.svelte +2 -2
  111. package/src/lib/components/layout/PageHeader.svelte +1 -1
  112. package/src/lib/components/layout/SideNav.svelte +3 -3
  113. package/src/lib/components/layout/SubNav.svelte +2 -2
  114. package/src/lib/components/preview/ChartOutput.svelte +3 -3
  115. package/src/lib/components/preview/Group.svelte +7 -7
  116. package/src/lib/components/preview/ImageOutput.svelte +6 -6
  117. package/src/lib/components/preview/InputControl.svelte +1 -0
  118. package/src/lib/components/preview/OutputDisplay.svelte +8 -6
  119. package/src/lib/components/preview/TabBar.svelte +6 -4
  120. package/src/lib/components/preview/TabContent.svelte +1 -1
  121. package/src/lib/components/preview/TabLayout.svelte +3 -4
  122. package/src/lib/components/preview/inputs/ChecklistInput.svelte +3 -3
  123. package/src/lib/components/preview/inputs/ColorInput.svelte +356 -14
  124. package/src/lib/components/preview/inputs/FileInput.svelte +3 -3
  125. package/src/lib/components/preview/inputs/SegmentedInput.svelte +2 -1
  126. package/src/lib/components/preview/inputs/TileInput.svelte +1 -1
  127. package/src/lib/components/primitives/CalculateButton.svelte +2 -2
  128. package/src/lib/components/primitives/Callout.svelte +7 -5
  129. package/src/lib/components/primitives/DataTable.svelte +1 -1
  130. package/src/lib/components/primitives/ImageUploadField.svelte +1 -1
  131. package/src/lib/components/primitives/alert-dialog/alert-dialog-content.svelte +1 -1
  132. package/src/lib/components/primitives/badge/badge.svelte +2 -2
  133. package/src/lib/components/primitives/button/button.svelte +6 -7
  134. package/src/lib/components/primitives/card/card.svelte +1 -1
  135. package/src/lib/components/primitives/checkbox/checkbox.svelte +1 -1
  136. package/src/lib/components/primitives/command/command-input.svelte +1 -1
  137. package/src/lib/components/primitives/command/command-item.svelte +1 -1
  138. package/src/lib/components/primitives/command/command-link-item.svelte +1 -1
  139. package/src/lib/components/primitives/command/command.svelte +1 -1
  140. package/src/lib/components/primitives/context-menu/context-menu-checkbox-item.svelte +1 -1
  141. package/src/lib/components/primitives/context-menu/context-menu-content.svelte +1 -1
  142. package/src/lib/components/primitives/context-menu/context-menu-item.svelte +1 -1
  143. package/src/lib/components/primitives/context-menu/context-menu-radio-item.svelte +1 -1
  144. package/src/lib/components/primitives/context-menu/context-menu-sub-content.svelte +1 -1
  145. package/src/lib/components/primitives/context-menu/context-menu-sub-trigger.svelte +1 -1
  146. package/src/lib/components/primitives/dialog/dialog-content.svelte +2 -2
  147. package/src/lib/components/primitives/drawer/Drawer.svelte +1 -1
  148. package/src/lib/components/primitives/dropdown-menu/dropdown-menu-checkbox-item.svelte +31 -11
  149. package/src/lib/components/primitives/dropdown-menu/dropdown-menu-content.svelte +5 -1
  150. package/src/lib/components/primitives/dropdown-menu/dropdown-menu-item.svelte +4 -2
  151. package/src/lib/components/primitives/dropdown-menu/dropdown-menu-radio-item.svelte +1 -1
  152. package/src/lib/components/primitives/dropdown-menu/dropdown-menu-shortcut.svelte +1 -1
  153. package/src/lib/components/primitives/dropdown-menu/dropdown-menu-sub-content.svelte +1 -1
  154. package/src/lib/components/primitives/dropdown-menu/dropdown-menu-sub-trigger.svelte +1 -1
  155. package/src/lib/components/primitives/index.ts +1 -1
  156. package/src/lib/components/primitives/input/input.svelte +2 -2
  157. package/src/lib/components/primitives/input-group/input-group.svelte +1 -1
  158. package/src/lib/components/primitives/popover/popover-content.svelte +1 -1
  159. package/src/lib/components/primitives/resizable/resizable-handle.svelte +2 -2
  160. package/src/lib/components/primitives/search/search.svelte +1 -1
  161. package/src/lib/components/primitives/select/select-content.svelte +1 -1
  162. package/src/lib/components/primitives/select/select-item.svelte +1 -1
  163. package/src/lib/components/primitives/select/select-trigger.svelte +1 -1
  164. package/src/lib/components/primitives/slider/slider.svelte +1 -1
  165. package/src/lib/components/primitives/switch/switch.svelte +1 -1
  166. package/src/lib/components/primitives/tabs/tabs-list.svelte +1 -1
  167. package/src/lib/components/primitives/tabs/tabs-trigger.svelte +1 -1
  168. package/src/lib/components/primitives/textarea/textarea.svelte +1 -1
  169. package/src/lib/components/primitives/toggle/toggle.svelte +6 -3
  170. package/src/lib/components/primitives/toggle-group/toggle-group-item.svelte +1 -1
  171. package/src/lib/components/primitives/toggle-group/toggle-group.svelte +1 -1
  172. package/src/lib/components/primitives/tooltip/index.ts +19 -0
  173. package/src/lib/components/primitives/tooltip/tooltip-content.svelte +34 -0
  174. package/src/lib/components/primitives/tooltip/tooltip-portal.svelte +7 -0
  175. package/src/lib/components/primitives/tooltip/tooltip-provider.svelte +7 -0
  176. package/src/lib/components/primitives/tooltip/tooltip-trigger.svelte +7 -0
  177. package/src/lib/components/primitives/tooltip/tooltip.svelte +7 -0
  178. package/src/lib/components/viewer/MeshMetadataPanel.svelte +1 -1
  179. package/src/lib/components/viewer/SceneManager.svelte +19 -19
  180. package/src/lib/components/viewer/Viewer.svelte +68 -157
  181. package/src/lib/components/viewer/ViewerDock.svelte +404 -0
  182. package/src/lib/i18n/messages.ts +29 -0
  183. package/src/lib/styles/base.css +81 -80
  184. package/src/lib/utils/color-space.ts +107 -0
  185. package/dist/components/primitives/theme-switcher/ThemeSwitcher.svelte +0 -39
  186. package/dist/components/primitives/theme-switcher/ThemeSwitcher.svelte.d.ts +0 -3
  187. package/dist/components/primitives/theme-switcher/index.d.ts +0 -1
  188. package/dist/components/primitives/theme-switcher/index.js +0 -1
  189. package/dist/styles/themes/cyberpunk.css +0 -98
  190. package/dist/styles/themes/neutral.css +0 -72
  191. package/dist/styles/themes/ocean.css +0 -75
  192. package/dist/styles/themes/selva.css +0 -105
  193. package/dist/theme/themeStore.svelte.d.ts +0 -12
  194. package/dist/theme/themeStore.svelte.js +0 -40
  195. package/dist/theme/themes.d.ts +0 -5
  196. package/dist/theme/themes.js +0 -13
  197. package/src/lib/components/primitives/theme-switcher/ThemeSwitcher.svelte +0 -39
  198. package/src/lib/components/primitives/theme-switcher/index.ts +0 -1
  199. package/src/lib/styles/themes/cyberpunk.css +0 -98
  200. package/src/lib/styles/themes/neutral.css +0 -72
  201. package/src/lib/styles/themes/ocean.css +0 -75
  202. package/src/lib/styles/themes/selva.css +0 -105
  203. package/src/lib/theme/themeStore.svelte.ts +0 -50
  204. package/src/lib/theme/themes.ts +0 -18
@@ -1,17 +1,17 @@
1
1
  import { type VariantProps } from 'tailwind-variants';
2
2
  export declare const tabsListVariants: import("tailwind-variants").TVReturnType<{
3
3
  variant: {
4
- default: "h-9 w-fit justify-center rounded-lg bg-muted p-0.75";
4
+ default: "h-9 w-fit justify-center rounded-md bg-muted p-0.5";
5
5
  line: "gap-1 px-2 w-full justify-start";
6
6
  };
7
7
  }, undefined, "inline-flex items-center text-muted-foreground", {
8
8
  variant: {
9
- default: "h-9 w-fit justify-center rounded-lg bg-muted p-0.75";
9
+ default: "h-9 w-fit justify-center rounded-md bg-muted p-0.5";
10
10
  line: "gap-1 px-2 w-full justify-start";
11
11
  };
12
12
  }, undefined, import("tailwind-variants").TVReturnTypeLike<{
13
13
  variant: {
14
- default: "h-9 w-fit justify-center rounded-lg bg-muted p-0.75";
14
+ default: "h-9 w-fit justify-center rounded-md bg-muted p-0.5";
15
15
  line: "gap-1 px-2 w-full justify-start";
16
16
  };
17
17
  }, undefined>>;
@@ -6,7 +6,7 @@
6
6
  variants: {
7
7
  variant: {
8
8
  default:
9
- 'px-2 py-1 data-[state=active]:shadow-sm h-full flex-1 rounded-md border border-transparent text-foreground transition focus-visible:border-ring data-[state=active]:bg-background dark:text-muted-foreground dark:data-[state=active]:border-input dark:data-[state=active]:bg-input/30 dark:data-[state=active]:text-foreground',
9
+ 'px-2 py-1 data-[state=active]:shadow-sm h-full flex-1 rounded-inner border border-transparent text-foreground transition focus-visible:border-ring data-[state=active]:bg-raised dark:text-muted-foreground data-[state=active]:border-border-strong dark:data-[state=active]:text-foreground',
10
10
  line: 'px-2.5 py-3 relative flex-none text-muted-foreground transition-colors after:absolute after:inset-x-2 after:bottom-0 after:h-0.5 after:rounded-full hover:text-foreground data-[state=active]:text-foreground data-[state=active]:after:bg-primary'
11
11
  }
12
12
  },
@@ -1,17 +1,17 @@
1
1
  import { type VariantProps } from 'tailwind-variants';
2
2
  export declare const tabsTriggerVariants: import("tailwind-variants").TVReturnType<{
3
3
  variant: {
4
- default: "px-2 py-1 data-[state=active]:shadow-sm h-full flex-1 rounded-md border border-transparent text-foreground transition focus-visible:border-ring data-[state=active]:bg-background dark:text-muted-foreground dark:data-[state=active]:border-input dark:data-[state=active]:bg-input/30 dark:data-[state=active]:text-foreground";
4
+ default: "px-2 py-1 data-[state=active]:shadow-sm h-full flex-1 rounded-inner border border-transparent text-foreground transition focus-visible:border-ring data-[state=active]:bg-raised dark:text-muted-foreground data-[state=active]:border-border-strong dark:data-[state=active]:text-foreground";
5
5
  line: "px-2.5 py-3 relative flex-none text-muted-foreground transition-colors after:absolute after:inset-x-2 after:bottom-0 after:h-0.5 after:rounded-full hover:text-foreground data-[state=active]:text-foreground data-[state=active]:after:bg-primary";
6
6
  };
7
7
  }, undefined, "gap-1.5 text-sm font-medium [&_svg:not([class*='size-'])]:size-4 inline-flex items-center justify-center whitespace-nowrap focus-visible:ring-3 focus-visible:ring-ring focus-visible:outline-1 focus-visible:outline-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0", {
8
8
  variant: {
9
- default: "px-2 py-1 data-[state=active]:shadow-sm h-full flex-1 rounded-md border border-transparent text-foreground transition focus-visible:border-ring data-[state=active]:bg-background dark:text-muted-foreground dark:data-[state=active]:border-input dark:data-[state=active]:bg-input/30 dark:data-[state=active]:text-foreground";
9
+ default: "px-2 py-1 data-[state=active]:shadow-sm h-full flex-1 rounded-inner border border-transparent text-foreground transition focus-visible:border-ring data-[state=active]:bg-raised dark:text-muted-foreground data-[state=active]:border-border-strong dark:data-[state=active]:text-foreground";
10
10
  line: "px-2.5 py-3 relative flex-none text-muted-foreground transition-colors after:absolute after:inset-x-2 after:bottom-0 after:h-0.5 after:rounded-full hover:text-foreground data-[state=active]:text-foreground data-[state=active]:after:bg-primary";
11
11
  };
12
12
  }, undefined, import("tailwind-variants").TVReturnTypeLike<{
13
13
  variant: {
14
- default: "px-2 py-1 data-[state=active]:shadow-sm h-full flex-1 rounded-md border border-transparent text-foreground transition focus-visible:border-ring data-[state=active]:bg-background dark:text-muted-foreground dark:data-[state=active]:border-input dark:data-[state=active]:bg-input/30 dark:data-[state=active]:text-foreground";
14
+ default: "px-2 py-1 data-[state=active]:shadow-sm h-full flex-1 rounded-inner border border-transparent text-foreground transition focus-visible:border-ring data-[state=active]:bg-raised dark:text-muted-foreground data-[state=active]:border-border-strong dark:data-[state=active]:text-foreground";
15
15
  line: "px-2.5 py-3 relative flex-none text-muted-foreground transition-colors after:absolute after:inset-x-2 after:bottom-0 after:h-0.5 after:rounded-full hover:text-foreground data-[state=active]:text-foreground data-[state=active]:after:bg-primary";
16
16
  };
17
17
  }, undefined>>;
@@ -15,7 +15,7 @@
15
15
  bind:this={ref}
16
16
  data-slot={dataSlot}
17
17
  class={cn(
18
- 'min-h-16 px-3 py-2 text-base shadow-xs md:text-sm flex field-sizing-content w-full rounded-md border border-input bg-transparent transition outline-none placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:bg-input/30 dark:aria-invalid:ring-destructive/40',
18
+ 'min-h-16 px-3 py-2 text-base shadow-xs md:text-sm flex field-sizing-content w-full rounded-md border border-input bg-field transition outline-none placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40',
19
19
  className
20
20
  )}
21
21
  bind:value
@@ -2,14 +2,17 @@
2
2
  import { type VariantProps, tv } from 'tailwind-variants';
3
3
 
4
4
  export const toggleVariants = tv({
5
- base: "hover:text-foreground aria-pressed:bg-muted focus-visible:border-ring focus-visible:ring-ring aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive data-[state=on]:bg-muted gap-1 rounded-lg text-sm font-medium transition-all [&_svg:not([class*='size-'])]:size-4 group/toggle inline-flex items-center justify-center whitespace-nowrap outline-none hover:bg-muted focus-visible:ring-3 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0",
5
+ base: "hover:text-foreground aria-pressed:bg-selected focus-visible:border-ring focus-visible:ring-ring aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive data-[state=on]:bg-selected gap-1 rounded-md text-sm font-medium transition-all [&_svg:not([class*='size-'])]:size-4 group/toggle inline-flex items-center justify-center whitespace-nowrap outline-none hover:bg-hover focus-visible:ring-3 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0",
6
6
  variants: {
7
7
  variant: {
8
8
  default: 'bg-transparent',
9
- outline: 'border-input hover:bg-muted border bg-transparent',
9
+ // Item inside a segmented track: the chosen value sits raised above the track.
10
+ segmented:
11
+ 'rounded-inner bg-transparent text-muted-foreground data-[state=on]:bg-raised data-[state=on]:text-foreground data-[state=on]:shadow-raised data-[state=on]:ring-1 data-[state=on]:ring-border-strong',
12
+ outline: 'border-input hover:bg-hover border bg-transparent',
10
13
  // Filled accent for the active item; a bare bg-muted is too faint on a form.
11
14
  accent:
12
- 'border-input hover:bg-muted border bg-transparent data-[state=on]:bg-primary/15 data-[state=on]:ring-1 data-[state=on]:ring-primary data-[state=on]:ring-inset'
15
+ 'border-input hover:bg-hover border bg-transparent data-[state=on]:bg-primary/15 data-[state=on]:ring-1 data-[state=on]:ring-primary data-[state=on]:ring-inset'
13
16
  },
14
17
  size: {
15
18
  default:
@@ -2,8 +2,9 @@ import { type VariantProps } from 'tailwind-variants';
2
2
  export declare const toggleVariants: import("tailwind-variants").TVReturnType<{
3
3
  variant: {
4
4
  default: "bg-transparent";
5
- outline: "border-input hover:bg-muted border bg-transparent";
6
- accent: "border-input hover:bg-muted border bg-transparent data-[state=on]:bg-primary/15 data-[state=on]:ring-1 data-[state=on]:ring-primary data-[state=on]:ring-inset";
5
+ segmented: "rounded-inner bg-transparent text-muted-foreground data-[state=on]:bg-raised data-[state=on]:text-foreground data-[state=on]:shadow-raised data-[state=on]:ring-1 data-[state=on]:ring-border-strong";
6
+ outline: "border-input hover:bg-hover border bg-transparent";
7
+ accent: "border-input hover:bg-hover border bg-transparent data-[state=on]:bg-primary/15 data-[state=on]:ring-1 data-[state=on]:ring-primary data-[state=on]:ring-inset";
7
8
  };
8
9
  size: {
9
10
  default: "h-8 min-w-8 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2";
@@ -11,11 +12,12 @@ export declare const toggleVariants: import("tailwind-variants").TVReturnType<{
11
12
  lg: "h-9 min-w-9 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2";
12
13
  stacked: "min-h-12 min-w-0 flex-col gap-1 px-1 py-1.5 text-xs";
13
14
  };
14
- }, undefined, "hover:text-foreground aria-pressed:bg-muted focus-visible:border-ring focus-visible:ring-ring aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive data-[state=on]:bg-muted gap-1 rounded-lg text-sm font-medium transition-all [&_svg:not([class*='size-'])]:size-4 group/toggle inline-flex items-center justify-center whitespace-nowrap outline-none hover:bg-muted focus-visible:ring-3 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0", {
15
+ }, undefined, "hover:text-foreground aria-pressed:bg-selected focus-visible:border-ring focus-visible:ring-ring aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive data-[state=on]:bg-selected gap-1 rounded-md text-sm font-medium transition-all [&_svg:not([class*='size-'])]:size-4 group/toggle inline-flex items-center justify-center whitespace-nowrap outline-none hover:bg-hover focus-visible:ring-3 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0", {
15
16
  variant: {
16
17
  default: "bg-transparent";
17
- outline: "border-input hover:bg-muted border bg-transparent";
18
- accent: "border-input hover:bg-muted border bg-transparent data-[state=on]:bg-primary/15 data-[state=on]:ring-1 data-[state=on]:ring-primary data-[state=on]:ring-inset";
18
+ segmented: "rounded-inner bg-transparent text-muted-foreground data-[state=on]:bg-raised data-[state=on]:text-foreground data-[state=on]:shadow-raised data-[state=on]:ring-1 data-[state=on]:ring-border-strong";
19
+ outline: "border-input hover:bg-hover border bg-transparent";
20
+ accent: "border-input hover:bg-hover border bg-transparent data-[state=on]:bg-primary/15 data-[state=on]:ring-1 data-[state=on]:ring-primary data-[state=on]:ring-inset";
19
21
  };
20
22
  size: {
21
23
  default: "h-8 min-w-8 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2";
@@ -26,8 +28,9 @@ export declare const toggleVariants: import("tailwind-variants").TVReturnType<{
26
28
  }, undefined, import("tailwind-variants").TVReturnTypeLike<{
27
29
  variant: {
28
30
  default: "bg-transparent";
29
- outline: "border-input hover:bg-muted border bg-transparent";
30
- accent: "border-input hover:bg-muted border bg-transparent data-[state=on]:bg-primary/15 data-[state=on]:ring-1 data-[state=on]:ring-primary data-[state=on]:ring-inset";
31
+ segmented: "rounded-inner bg-transparent text-muted-foreground data-[state=on]:bg-raised data-[state=on]:text-foreground data-[state=on]:shadow-raised data-[state=on]:ring-1 data-[state=on]:ring-border-strong";
32
+ outline: "border-input hover:bg-hover border bg-transparent";
33
+ accent: "border-input hover:bg-hover border bg-transparent data-[state=on]:bg-primary/15 data-[state=on]:ring-1 data-[state=on]:ring-primary data-[state=on]:ring-inset";
31
34
  };
32
35
  size: {
33
36
  default: "h-8 min-w-8 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2";
@@ -23,7 +23,7 @@
23
23
  data-size={ctx.size || size}
24
24
  data-spacing={ctx.spacing}
25
25
  class={cn(
26
- 'group-data-[spacing=0]/toggle-group:px-2 group-data-[spacing=0]/toggle-group:has-data-[icon=inline-end]:pr-1.5 group-data-[spacing=0]/toggle-group:has-data-[icon=inline-start]:pl-1.5 shrink-0 group-data-[spacing=0]/toggle-group:rounded-none focus:z-10 focus-visible:z-10 group-data-[orientation=horizontal]/toggle-group:data-[spacing=0]:first:rounded-l-lg group-data-[orientation=vertical]/toggle-group:data-[spacing=0]:first:rounded-t-lg group-data-[orientation=horizontal]/toggle-group:data-[spacing=0]:last:rounded-r-lg group-data-[orientation=vertical]/toggle-group:data-[spacing=0]:last:rounded-b-lg group-data-[orientation=horizontal]/toggle-group:data-[spacing=0]:data-[variant=accent]:border-l-0 group-data-[orientation=vertical]/toggle-group:data-[spacing=0]:data-[variant=accent]:border-t-0 group-data-[orientation=horizontal]/toggle-group:data-[spacing=0]:data-[variant=accent]:first:border-l group-data-[orientation=vertical]/toggle-group:data-[spacing=0]:data-[variant=accent]:first:border-t group-data-[orientation=horizontal]/toggle-group:data-[spacing=0]:data-[variant=outline]:border-l-0 group-data-[orientation=vertical]/toggle-group:data-[spacing=0]:data-[variant=outline]:border-t-0 group-data-[orientation=horizontal]/toggle-group:data-[spacing=0]:data-[variant=outline]:first:border-l group-data-[orientation=vertical]/toggle-group:data-[spacing=0]:data-[variant=outline]:first:border-t',
26
+ 'group-data-[spacing=0]/toggle-group:px-2 group-data-[spacing=0]/toggle-group:has-data-[icon=inline-end]:pr-1.5 group-data-[spacing=0]/toggle-group:has-data-[icon=inline-start]:pl-1.5 shrink-0 group-data-[spacing=0]/toggle-group:rounded-none focus:z-10 focus-visible:z-10 group-data-[orientation=horizontal]/toggle-group:data-[spacing=0]:first:rounded-l-md group-data-[orientation=vertical]/toggle-group:data-[spacing=0]:first:rounded-t-md group-data-[orientation=horizontal]/toggle-group:data-[spacing=0]:last:rounded-r-md group-data-[orientation=vertical]/toggle-group:data-[spacing=0]:last:rounded-b-md group-data-[orientation=horizontal]/toggle-group:data-[spacing=0]:data-[variant=accent]:border-l-0 group-data-[orientation=vertical]/toggle-group:data-[spacing=0]:data-[variant=accent]:border-t-0 group-data-[orientation=horizontal]/toggle-group:data-[spacing=0]:data-[variant=accent]:first:border-l group-data-[orientation=vertical]/toggle-group:data-[spacing=0]:data-[variant=accent]:first:border-t group-data-[orientation=horizontal]/toggle-group:data-[spacing=0]:data-[variant=outline]:border-l-0 group-data-[orientation=vertical]/toggle-group:data-[spacing=0]:data-[variant=outline]:border-t-0 group-data-[orientation=horizontal]/toggle-group:data-[spacing=0]:data-[variant=outline]:first:border-l group-data-[orientation=vertical]/toggle-group:data-[spacing=0]:data-[variant=outline]:first:border-t',
27
27
  toggleVariants({
28
28
  variant: ctx.variant || variant,
29
29
  size: ctx.size || size
@@ -68,7 +68,7 @@ get along, so we shut typescript up by casting `value` to `never`.
68
68
  data-spacing={spacing}
69
69
  style="--gap: calc(var(--spacing) * {spacing})"
70
70
  class={cn(
71
- 'group/toggle-group flex w-fit flex-row items-center gap-(--gap) rounded-lg data-[orientation=vertical]:flex-col data-[orientation=vertical]:items-stretch data-[size=sm]:rounded-md',
71
+ 'group/toggle-group data-[variant=segmented]:p-0.5 flex w-fit flex-row items-center gap-(--gap) rounded-md data-[orientation=vertical]:flex-col data-[orientation=vertical]:items-stretch data-[variant=segmented]:border data-[variant=segmented]:border-input data-[variant=segmented]:bg-muted',
72
72
  className
73
73
  )}
74
74
  {...restProps}
@@ -0,0 +1,6 @@
1
+ import Content from './tooltip-content.svelte';
2
+ import Portal from './tooltip-portal.svelte';
3
+ import Provider from './tooltip-provider.svelte';
4
+ import Trigger from './tooltip-trigger.svelte';
5
+ import Root from './tooltip.svelte';
6
+ export { Root, Content, Provider, Portal, Trigger, Root as Tooltip, Content as TooltipContent, Provider as TooltipProvider, Portal as TooltipPortal, Trigger as TooltipTrigger };
@@ -0,0 +1,8 @@
1
+ import Content from './tooltip-content.svelte';
2
+ import Portal from './tooltip-portal.svelte';
3
+ import Provider from './tooltip-provider.svelte';
4
+ import Trigger from './tooltip-trigger.svelte';
5
+ import Root from './tooltip.svelte';
6
+ export { Root, Content, Provider, Portal, Trigger,
7
+ //
8
+ Root as Tooltip, Content as TooltipContent, Provider as TooltipProvider, Portal as TooltipPortal, Trigger as TooltipTrigger };
@@ -0,0 +1,34 @@
1
+ <script lang="ts">
2
+ import { Tooltip as TooltipPrimitive } from 'bits-ui';
3
+ import { cn, type WithoutChildrenOrChild } from '../../../utils.js';
4
+ import TooltipPortal from './tooltip-portal.svelte';
5
+ import type { ComponentProps } from 'svelte';
6
+
7
+ let {
8
+ ref = $bindable(null),
9
+ class: className,
10
+ sideOffset = 6,
11
+ side = 'top',
12
+ children,
13
+ portalProps,
14
+ ...restProps
15
+ }: TooltipPrimitive.ContentProps & {
16
+ portalProps?: WithoutChildrenOrChild<ComponentProps<typeof TooltipPortal>>;
17
+ } = $props();
18
+ </script>
19
+
20
+ <TooltipPortal {...portalProps}>
21
+ <TooltipPrimitive.Content
22
+ bind:ref
23
+ data-slot="tooltip-content"
24
+ {sideOffset}
25
+ {side}
26
+ class={cn(
27
+ 'data-[state=delayed-open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=delayed-open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=delayed-open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 px-2.5 py-1.5 text-xs font-medium z-50 w-fit origin-(--bits-tooltip-content-transform-origin) rounded-md bg-foreground text-balance text-background',
28
+ className
29
+ )}
30
+ {...restProps}
31
+ >
32
+ {@render children?.()}
33
+ </TooltipPrimitive.Content>
34
+ </TooltipPortal>
@@ -0,0 +1,10 @@
1
+ import { Tooltip as TooltipPrimitive } from 'bits-ui';
2
+ import { type WithoutChildrenOrChild } from '../../../utils.js';
3
+ import TooltipPortal from './tooltip-portal.svelte';
4
+ import type { ComponentProps } from 'svelte';
5
+ type $$ComponentProps = TooltipPrimitive.ContentProps & {
6
+ portalProps?: WithoutChildrenOrChild<ComponentProps<typeof TooltipPortal>>;
7
+ };
8
+ declare const TooltipContent: import("svelte").Component<$$ComponentProps, {}, "ref">;
9
+ type TooltipContent = ReturnType<typeof TooltipContent>;
10
+ export default TooltipContent;
@@ -0,0 +1,7 @@
1
+ <script lang="ts">
2
+ import { Tooltip as TooltipPrimitive } from 'bits-ui';
3
+
4
+ let { ...restProps }: TooltipPrimitive.PortalProps = $props();
5
+ </script>
6
+
7
+ <TooltipPrimitive.Portal {...restProps} />
@@ -0,0 +1,4 @@
1
+ import { Tooltip as TooltipPrimitive } from 'bits-ui';
2
+ declare const TooltipPortal: import("svelte").Component<TooltipPrimitive.PortalProps, {}, "">;
3
+ type TooltipPortal = ReturnType<typeof TooltipPortal>;
4
+ export default TooltipPortal;
@@ -0,0 +1,7 @@
1
+ <script lang="ts">
2
+ import { Tooltip as TooltipPrimitive } from 'bits-ui';
3
+
4
+ let { ...restProps }: TooltipPrimitive.ProviderProps = $props();
5
+ </script>
6
+
7
+ <TooltipPrimitive.Provider {...restProps} />
@@ -0,0 +1,4 @@
1
+ import { Tooltip as TooltipPrimitive } from 'bits-ui';
2
+ declare const TooltipProvider: import("svelte").Component<TooltipPrimitive.ProviderProps, {}, "">;
3
+ type TooltipProvider = ReturnType<typeof TooltipProvider>;
4
+ export default TooltipProvider;
@@ -0,0 +1,7 @@
1
+ <script lang="ts">
2
+ import { Tooltip as TooltipPrimitive } from 'bits-ui';
3
+
4
+ let { ref = $bindable(null), ...restProps }: TooltipPrimitive.TriggerProps = $props();
5
+ </script>
6
+
7
+ <TooltipPrimitive.Trigger bind:ref data-slot="tooltip-trigger" {...restProps} />
@@ -0,0 +1,4 @@
1
+ import { Tooltip as TooltipPrimitive } from 'bits-ui';
2
+ declare const TooltipTrigger: import("svelte").Component<TooltipPrimitive.TriggerProps, {}, "ref">;
3
+ type TooltipTrigger = ReturnType<typeof TooltipTrigger>;
4
+ export default TooltipTrigger;
@@ -0,0 +1,7 @@
1
+ <script lang="ts">
2
+ import { Tooltip as TooltipPrimitive } from 'bits-ui';
3
+
4
+ let { open = $bindable(false), ...restProps }: TooltipPrimitive.RootProps = $props();
5
+ </script>
6
+
7
+ <TooltipPrimitive.Root bind:open {...restProps} />
@@ -0,0 +1,4 @@
1
+ import { Tooltip as TooltipPrimitive } from 'bits-ui';
2
+ declare const Tooltip: import("svelte").Component<TooltipPrimitive.RootProps, {}, "open">;
3
+ type Tooltip = ReturnType<typeof Tooltip>;
4
+ export default Tooltip;
@@ -65,7 +65,7 @@
65
65
  <table class="text-xs w-full border-collapse">
66
66
  <tbody>
67
67
  {#each Object.entries(filteredMetadata) as [key, value] (key)}
68
- <tr class="border-b border-border/60 last:border-b-0">
68
+ <tr class="border-b border-border last:border-b-0">
69
69
  <th
70
70
  scope="row"
71
71
  class="px-4 py-2 font-normal text-left align-top whitespace-nowrap text-muted-foreground"
@@ -225,16 +225,16 @@
225
225
  onmousedown={() => outliner.selection.clear()}
226
226
  >
227
227
  <div class="px-3 py-2 gap-2 flex items-center border-b border-border">
228
- <Search class="h-3.5 w-3.5 shrink-0 text-muted-foreground/50" />
228
+ <Search class="h-3.5 w-3.5 shrink-0 text-faint-foreground" />
229
229
  <input
230
- class="min-w-0 text-xs flex-1 bg-transparent text-foreground outline-none placeholder:text-muted-foreground/50"
230
+ class="min-w-0 text-xs flex-1 bg-transparent text-foreground outline-none placeholder:text-faint-foreground"
231
231
  placeholder={t.searchObjects}
232
232
  bind:value={searchQuery}
233
233
  />
234
234
  {#if searchQuery}
235
235
  <button onclick={() => (searchQuery = '')} aria-label={t.clearSearch}>
236
236
  <X
237
- class="h-3.5 w-3.5 text-muted-foreground/50 transition-colors hover:text-muted-foreground"
237
+ class="h-3.5 w-3.5 text-faint-foreground transition-colors hover:text-muted-foreground"
238
238
  />
239
239
  </button>
240
240
  {/if}
@@ -247,11 +247,11 @@
247
247
  >
248
248
  {#if allCollapsed}
249
249
  <ChevronsUpDown
250
- class="h-3.5 w-3.5 text-muted-foreground/50 transition-colors hover:text-muted-foreground"
250
+ class="h-3.5 w-3.5 text-faint-foreground transition-colors hover:text-muted-foreground"
251
251
  />
252
252
  {:else}
253
253
  <ChevronsDownUp
254
- class="h-3.5 w-3.5 text-muted-foreground/50 transition-colors hover:text-muted-foreground"
254
+ class="h-3.5 w-3.5 text-faint-foreground transition-colors hover:text-muted-foreground"
255
255
  />
256
256
  {/if}
257
257
  </button>
@@ -285,10 +285,10 @@
285
285
  {@const isCollapsed = collapsed.has(row.layerName)}
286
286
 
287
287
  <div
288
- class="gap-1 pl-1 pr-2 group flex h-full items-center transition-colors hover:bg-muted"
288
+ class="gap-1 pl-1 pr-2 group flex h-full items-center transition-colors hover:bg-hover"
289
289
  >
290
290
  <button
291
- class="rounded p-0.5 shrink-0 text-muted-foreground transition-colors hover:text-muted-foreground"
291
+ class="p-0.5 shrink-0 rounded-sm text-muted-foreground transition-colors hover:text-muted-foreground"
292
292
  onclick={() => outliner.toggleCollapsed(row.layerName)}
293
293
  aria-label={isCollapsed ? t.expandLayer : t.collapseLayer}
294
294
  >
@@ -300,15 +300,15 @@
300
300
  </button>
301
301
 
302
302
  <button
303
- class="rounded p-1 shrink-0 transition-colors hover:bg-muted"
303
+ class="p-1 shrink-0 rounded-sm transition-colors hover:bg-hover"
304
304
  onclick={() => toggleLayer(entries)}
305
305
  title={layerHidden ? t.showLayer : t.hideLayer}
306
306
  aria-label={layerHidden ? t.showLayer : t.hideLayer}
307
307
  >
308
308
  {#if layerHidden}
309
- <EyeOff class="h-3.5 w-3.5 text-muted-foreground/40" />
309
+ <EyeOff class="h-3.5 w-3.5 text-faint-foreground" />
310
310
  {:else if layerPartial}
311
- <Eye class="h-3.5 w-3.5 text-muted-foreground/60" />
311
+ <Eye class="h-3.5 w-3.5 text-faint-foreground" />
312
312
  {:else}
313
313
  <Eye class="h-3.5 w-3.5 text-muted-foreground" />
314
314
  {/if}
@@ -316,13 +316,13 @@
316
316
 
317
317
  <span
318
318
  class="min-w-0 text-xs font-medium flex-1 truncate {layerHidden
319
- ? 'text-muted-foreground/40 line-through'
319
+ ? 'text-faint-foreground line-through'
320
320
  : 'text-foreground'}"
321
321
  >
322
322
  {row.layerName}
323
323
  </span>
324
324
 
325
- <span class="shrink-0 text-2xs text-muted-foreground/50 tabular-nums">
325
+ <span class="shrink-0 text-2xs text-faint-foreground tabular-nums">
326
326
  {entries.length}
327
327
  </span>
328
328
  </div>
@@ -338,7 +338,7 @@
338
338
  aria-selected={isSelected}
339
339
  tabindex="-1"
340
340
  class="gap-1.5 pl-5 pr-2 flex h-full cursor-pointer items-center transition-colors
341
- {isSelected ? 'bg-primary/10 hover:bg-primary/15' : 'hover:bg-muted'}
341
+ {isSelected ? 'bg-primary/10 hover:bg-primary/15' : 'hover:bg-hover'}
342
342
  {isHidden ? 'opacity-40' : ''}"
343
343
  onmouseenter={() => onHover?.(entry)}
344
344
  onmouseleave={() => onHover?.(null)}
@@ -351,7 +351,7 @@
351
351
  e.key === 'Enter' && selectObject(entry.key, e as unknown as MouseEvent)}
352
352
  >
353
353
  <button
354
- class="rounded p-1 shrink-0 transition-colors hover:bg-muted"
354
+ class="p-1 shrink-0 rounded-sm transition-colors hover:bg-hover"
355
355
  onclick={(e) => {
356
356
  e.stopPropagation();
357
357
  toggleEntry(entry);
@@ -360,7 +360,7 @@
360
360
  aria-label={isHidden ? t.showObject : t.hideObject}
361
361
  >
362
362
  {#if isHidden}
363
- <EyeOff class="h-3 w-3 text-muted-foreground/60" />
363
+ <EyeOff class="h-3 w-3 text-faint-foreground" />
364
364
  {:else}
365
365
  <Eye class="h-3 w-3 text-muted-foreground" />
366
366
  {/if}
@@ -369,13 +369,13 @@
369
369
  <span
370
370
  class="min-w-0 text-xs flex-1 truncate {isHidden
371
371
  ? 'text-muted-foreground line-through'
372
- : 'text-foreground/80'}"
372
+ : 'text-foreground'}"
373
373
  >
374
374
  {entry.label}
375
375
  </span>
376
376
 
377
377
  <span
378
- class="rounded px-1 py-0.5 font-medium shrink-0 bg-muted text-2xs text-muted-foreground/70"
378
+ class="px-1 py-0.5 font-medium shrink-0 rounded-sm bg-muted text-2xs text-faint-foreground"
379
379
  >
380
380
  {getTypeLabel(entry.object)}
381
381
  </span>
@@ -388,12 +388,12 @@
388
388
 
389
389
  {#if sceneObjects.length === 0}
390
390
  <div class="py-12 flex flex-col items-center justify-center text-center">
391
- <EyeOff class="mb-2 h-5 w-5 text-muted-foreground/30" />
391
+ <EyeOff class="mb-2 h-5 w-5 text-faint-foreground" />
392
392
  <p class="text-xs text-muted-foreground">{t.noObjects}</p>
393
393
  </div>
394
394
  {:else if layerGroups.size === 0}
395
395
  <div class="py-12 flex flex-col items-center justify-center text-center">
396
- <Search class="mb-2 h-5 w-5 text-muted-foreground/30" />
396
+ <Search class="mb-2 h-5 w-5 text-faint-foreground" />
397
397
  <p class="text-xs text-muted-foreground">
398
398
  {t.noResultsFor.replace('{query}', searchQuery)}
399
399
  </p>