@sveltier/ui 0.0.0-stage → 0.1.0-alpha.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 (331) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +82 -2
  3. package/dist/components/Accordion/Accordion.svelte +74 -0
  4. package/dist/components/Accordion/Accordion.svelte.d.ts +25 -0
  5. package/dist/components/Accordion/accordion.css +88 -0
  6. package/dist/components/Accordion/index.d.ts +2 -0
  7. package/dist/components/Accordion/index.js +1 -0
  8. package/dist/components/Accordion/types.d.ts +64 -0
  9. package/dist/components/Accordion/types.js +1 -0
  10. package/dist/components/Alert/Alert.svelte +88 -0
  11. package/dist/components/Alert/Alert.svelte.d.ts +4 -0
  12. package/dist/components/Alert/alert.css +78 -0
  13. package/dist/components/Alert/index.d.ts +2 -0
  14. package/dist/components/Alert/index.js +1 -0
  15. package/dist/components/Alert/types.d.ts +67 -0
  16. package/dist/components/Alert/types.js +1 -0
  17. package/dist/components/Avatar/Avatar.svelte +47 -0
  18. package/dist/components/Avatar/Avatar.svelte.d.ts +4 -0
  19. package/dist/components/Avatar/avatar.css +34 -0
  20. package/dist/components/Avatar/index.d.ts +2 -0
  21. package/dist/components/Avatar/index.js +1 -0
  22. package/dist/components/Avatar/types.d.ts +47 -0
  23. package/dist/components/Avatar/types.js +1 -0
  24. package/dist/components/Badge/Badge.svelte +53 -0
  25. package/dist/components/Badge/Badge.svelte.d.ts +4 -0
  26. package/dist/components/Badge/badge.css +57 -0
  27. package/dist/components/Badge/index.d.ts +2 -0
  28. package/dist/components/Badge/index.js +1 -0
  29. package/dist/components/Badge/types.d.ts +43 -0
  30. package/dist/components/Badge/types.js +1 -0
  31. package/dist/components/Button/Button.svelte +85 -0
  32. package/dist/components/Button/Button.svelte.d.ts +4 -0
  33. package/dist/components/Button/button.css +132 -0
  34. package/dist/components/Button/index.d.ts +2 -0
  35. package/dist/components/Button/index.js +1 -0
  36. package/dist/components/Button/types.d.ts +76 -0
  37. package/dist/components/Button/types.js +1 -0
  38. package/dist/components/ButtonGroup/ButtonGroup.svelte +61 -0
  39. package/dist/components/ButtonGroup/ButtonGroup.svelte.d.ts +4 -0
  40. package/dist/components/ButtonGroup/button-group.css +39 -0
  41. package/dist/components/ButtonGroup/index.d.ts +2 -0
  42. package/dist/components/ButtonGroup/index.js +1 -0
  43. package/dist/components/ButtonGroup/types.d.ts +48 -0
  44. package/dist/components/ButtonGroup/types.js +1 -0
  45. package/dist/components/Card/Card.svelte +53 -0
  46. package/dist/components/Card/Card.svelte.d.ts +4 -0
  47. package/dist/components/Card/card.css +62 -0
  48. package/dist/components/Card/index.d.ts +2 -0
  49. package/dist/components/Card/index.js +1 -0
  50. package/dist/components/Card/types.d.ts +56 -0
  51. package/dist/components/Card/types.js +1 -0
  52. package/dist/components/Checkbox/Checkbox.svelte +105 -0
  53. package/dist/components/Checkbox/Checkbox.svelte.d.ts +4 -0
  54. package/dist/components/Checkbox/checkbox.css +138 -0
  55. package/dist/components/Checkbox/index.d.ts +2 -0
  56. package/dist/components/Checkbox/index.js +1 -0
  57. package/dist/components/Checkbox/types.d.ts +76 -0
  58. package/dist/components/Checkbox/types.js +1 -0
  59. package/dist/components/Chip/Chip.svelte +109 -0
  60. package/dist/components/Chip/Chip.svelte.d.ts +4 -0
  61. package/dist/components/Chip/chip.css +101 -0
  62. package/dist/components/Chip/index.d.ts +2 -0
  63. package/dist/components/Chip/index.js +1 -0
  64. package/dist/components/Chip/types.d.ts +69 -0
  65. package/dist/components/Chip/types.js +1 -0
  66. package/dist/components/Choice/Choice.svelte +60 -0
  67. package/dist/components/Choice/Choice.svelte.d.ts +4 -0
  68. package/dist/components/Choice/choice.css +75 -0
  69. package/dist/components/Choice/types.d.ts +43 -0
  70. package/dist/components/Choice/types.js +1 -0
  71. package/dist/components/Dialog/Dialog.svelte +36 -0
  72. package/dist/components/Dialog/Dialog.svelte.d.ts +4 -0
  73. package/dist/components/Dialog/index.d.ts +2 -0
  74. package/dist/components/Dialog/index.js +1 -0
  75. package/dist/components/Dialog/types.d.ts +50 -0
  76. package/dist/components/Dialog/types.js +1 -0
  77. package/dist/components/Divider/Divider.svelte +19 -0
  78. package/dist/components/Divider/Divider.svelte.d.ts +4 -0
  79. package/dist/components/Divider/divider.css +23 -0
  80. package/dist/components/Divider/index.d.ts +2 -0
  81. package/dist/components/Divider/index.js +1 -0
  82. package/dist/components/Divider/types.d.ts +10 -0
  83. package/dist/components/Divider/types.js +1 -0
  84. package/dist/components/Field/Field.svelte +95 -0
  85. package/dist/components/Field/Field.svelte.d.ts +4 -0
  86. package/dist/components/Field/field.css +210 -0
  87. package/dist/components/Field/index.d.ts +3 -0
  88. package/dist/components/Field/index.js +2 -0
  89. package/dist/components/Field/types.d.ts +109 -0
  90. package/dist/components/Field/types.js +2 -0
  91. package/dist/components/Form/Form.svelte +93 -0
  92. package/dist/components/Form/Form.svelte.d.ts +8 -0
  93. package/dist/components/Form/form.css +16 -0
  94. package/dist/components/Form/index.d.ts +2 -0
  95. package/dist/components/Form/index.js +1 -0
  96. package/dist/components/Form/types.d.ts +38 -0
  97. package/dist/components/Form/types.js +1 -0
  98. package/dist/components/Icon/Icon.svelte +38 -0
  99. package/dist/components/Icon/Icon.svelte.d.ts +4 -0
  100. package/dist/components/Icon/icon.css +33 -0
  101. package/dist/components/Icon/index.d.ts +2 -0
  102. package/dist/components/Icon/index.js +1 -0
  103. package/dist/components/Icon/types.d.ts +34 -0
  104. package/dist/components/Icon/types.js +1 -0
  105. package/dist/components/List/List.svelte +39 -0
  106. package/dist/components/List/List.svelte.d.ts +4 -0
  107. package/dist/components/List/ListItem.svelte +57 -0
  108. package/dist/components/List/ListItem.svelte.d.ts +4 -0
  109. package/dist/components/List/index.d.ts +3 -0
  110. package/dist/components/List/index.js +2 -0
  111. package/dist/components/List/list.css +127 -0
  112. package/dist/components/List/types.d.ts +67 -0
  113. package/dist/components/List/types.js +1 -0
  114. package/dist/components/Menu/Menu.svelte +195 -0
  115. package/dist/components/Menu/Menu.svelte.d.ts +4 -0
  116. package/dist/components/Menu/index.d.ts +2 -0
  117. package/dist/components/Menu/index.js +1 -0
  118. package/dist/components/Menu/menu.css +103 -0
  119. package/dist/components/Menu/types.d.ts +90 -0
  120. package/dist/components/Menu/types.js +1 -0
  121. package/dist/components/Modal/Modal.svelte +146 -0
  122. package/dist/components/Modal/Modal.svelte.d.ts +4 -0
  123. package/dist/components/Modal/modal.css +150 -0
  124. package/dist/components/Modal/types.d.ts +54 -0
  125. package/dist/components/Modal/types.js +1 -0
  126. package/dist/components/NativeSelect/NativeSelect.svelte +110 -0
  127. package/dist/components/NativeSelect/NativeSelect.svelte.d.ts +25 -0
  128. package/dist/components/NativeSelect/index.d.ts +2 -0
  129. package/dist/components/NativeSelect/index.js +1 -0
  130. package/dist/components/NativeSelect/native-select.css +45 -0
  131. package/dist/components/NativeSelect/types.d.ts +58 -0
  132. package/dist/components/NativeSelect/types.js +1 -0
  133. package/dist/components/NumberField/NumberField.svelte +246 -0
  134. package/dist/components/NumberField/NumberField.svelte.d.ts +4 -0
  135. package/dist/components/NumberField/index.d.ts +2 -0
  136. package/dist/components/NumberField/index.js +1 -0
  137. package/dist/components/NumberField/number-field.css +74 -0
  138. package/dist/components/NumberField/types.d.ts +73 -0
  139. package/dist/components/NumberField/types.js +1 -0
  140. package/dist/components/Popover/Popover.svelte +115 -0
  141. package/dist/components/Popover/Popover.svelte.d.ts +4 -0
  142. package/dist/components/Popover/index.d.ts +2 -0
  143. package/dist/components/Popover/index.js +1 -0
  144. package/dist/components/Popover/popover.css +67 -0
  145. package/dist/components/Popover/types.d.ts +83 -0
  146. package/dist/components/Popover/types.js +1 -0
  147. package/dist/components/Progress/ProgressCircular.svelte +61 -0
  148. package/dist/components/Progress/ProgressCircular.svelte.d.ts +4 -0
  149. package/dist/components/Progress/ProgressLinear.svelte +44 -0
  150. package/dist/components/Progress/ProgressLinear.svelte.d.ts +4 -0
  151. package/dist/components/Progress/index.d.ts +3 -0
  152. package/dist/components/Progress/index.js +2 -0
  153. package/dist/components/Progress/progress-circular.css +61 -0
  154. package/dist/components/Progress/progress-linear.css +67 -0
  155. package/dist/components/Progress/types.d.ts +53 -0
  156. package/dist/components/Progress/types.js +1 -0
  157. package/dist/components/RadioGroup/RadioGroup.svelte +149 -0
  158. package/dist/components/RadioGroup/RadioGroup.svelte.d.ts +25 -0
  159. package/dist/components/RadioGroup/index.d.ts +2 -0
  160. package/dist/components/RadioGroup/index.js +1 -0
  161. package/dist/components/RadioGroup/radio-group.css +139 -0
  162. package/dist/components/RadioGroup/types.d.ts +93 -0
  163. package/dist/components/RadioGroup/types.js +1 -0
  164. package/dist/components/SegmentedControl/SegmentedControl.svelte +70 -0
  165. package/dist/components/SegmentedControl/SegmentedControl.svelte.d.ts +25 -0
  166. package/dist/components/SegmentedControl/index.d.ts +2 -0
  167. package/dist/components/SegmentedControl/index.js +1 -0
  168. package/dist/components/SegmentedControl/segmented-control.css +68 -0
  169. package/dist/components/SegmentedControl/types.d.ts +60 -0
  170. package/dist/components/SegmentedControl/types.js +1 -0
  171. package/dist/components/Sheet/Sheet.svelte +56 -0
  172. package/dist/components/Sheet/Sheet.svelte.d.ts +4 -0
  173. package/dist/components/Sheet/index.d.ts +2 -0
  174. package/dist/components/Sheet/index.js +2 -0
  175. package/dist/components/Sheet/sheet.css +61 -0
  176. package/dist/components/Sheet/types.d.ts +51 -0
  177. package/dist/components/Sheet/types.js +1 -0
  178. package/dist/components/Skeleton/Skeleton.svelte +33 -0
  179. package/dist/components/Skeleton/Skeleton.svelte.d.ts +4 -0
  180. package/dist/components/Skeleton/index.d.ts +2 -0
  181. package/dist/components/Skeleton/index.js +1 -0
  182. package/dist/components/Skeleton/skeleton.css +70 -0
  183. package/dist/components/Skeleton/types.d.ts +25 -0
  184. package/dist/components/Skeleton/types.js +1 -0
  185. package/dist/components/Slider/Slider.svelte +153 -0
  186. package/dist/components/Slider/Slider.svelte.d.ts +4 -0
  187. package/dist/components/Slider/index.d.ts +2 -0
  188. package/dist/components/Slider/index.js +1 -0
  189. package/dist/components/Slider/slider.css +206 -0
  190. package/dist/components/Slider/types.d.ts +102 -0
  191. package/dist/components/Slider/types.js +1 -0
  192. package/dist/components/Switch/Switch.svelte +94 -0
  193. package/dist/components/Switch/Switch.svelte.d.ts +4 -0
  194. package/dist/components/Switch/index.d.ts +2 -0
  195. package/dist/components/Switch/index.js +1 -0
  196. package/dist/components/Switch/switch.css +118 -0
  197. package/dist/components/Switch/types.d.ts +67 -0
  198. package/dist/components/Switch/types.js +1 -0
  199. package/dist/components/Tabs/Tabs.svelte +93 -0
  200. package/dist/components/Tabs/Tabs.svelte.d.ts +25 -0
  201. package/dist/components/Tabs/index.d.ts +2 -0
  202. package/dist/components/Tabs/index.js +1 -0
  203. package/dist/components/Tabs/tabs.css +73 -0
  204. package/dist/components/Tabs/types.d.ts +59 -0
  205. package/dist/components/Tabs/types.js +1 -0
  206. package/dist/components/TextField/TextField.svelte +115 -0
  207. package/dist/components/TextField/TextField.svelte.d.ts +4 -0
  208. package/dist/components/TextField/index.d.ts +2 -0
  209. package/dist/components/TextField/index.js +1 -0
  210. package/dist/components/TextField/types.d.ts +57 -0
  211. package/dist/components/TextField/types.js +1 -0
  212. package/dist/components/Textarea/Textarea.svelte +116 -0
  213. package/dist/components/Textarea/Textarea.svelte.d.ts +4 -0
  214. package/dist/components/Textarea/index.d.ts +2 -0
  215. package/dist/components/Textarea/index.js +1 -0
  216. package/dist/components/Textarea/textarea.css +35 -0
  217. package/dist/components/Textarea/types.d.ts +60 -0
  218. package/dist/components/Textarea/types.js +1 -0
  219. package/dist/components/Tooltip/Tooltip.svelte +161 -0
  220. package/dist/components/Tooltip/Tooltip.svelte.d.ts +4 -0
  221. package/dist/components/Tooltip/index.d.ts +2 -0
  222. package/dist/components/Tooltip/index.js +1 -0
  223. package/dist/components/Tooltip/tooltip.css +44 -0
  224. package/dist/components/Tooltip/types.d.ts +55 -0
  225. package/dist/components/Tooltip/types.js +1 -0
  226. package/dist/core/defaults/DefaultsProvider.svelte +30 -0
  227. package/dist/core/defaults/DefaultsProvider.svelte.d.ts +13 -0
  228. package/dist/core/defaults/context.d.ts +45 -0
  229. package/dist/core/defaults/context.js +38 -0
  230. package/dist/core/display/display.d.ts +39 -0
  231. package/dist/core/display/display.js +53 -0
  232. package/dist/core/errors/codes.d.ts +124 -0
  233. package/dist/core/errors/codes.js +108 -0
  234. package/dist/core/errors/errors.d.ts +8 -0
  235. package/dist/core/errors/errors.js +7 -0
  236. package/dist/core/form/constraints.d.ts +15 -0
  237. package/dist/core/form/constraints.js +42 -0
  238. package/dist/core/form/context.d.ts +19 -0
  239. package/dist/core/form/context.js +4 -0
  240. package/dist/core/form/field.svelte.d.ts +34 -0
  241. package/dist/core/form/field.svelte.js +66 -0
  242. package/dist/core/form/number.d.ts +24 -0
  243. package/dist/core/form/number.js +71 -0
  244. package/dist/core/form/types.d.ts +22 -0
  245. package/dist/core/form/types.js +1 -0
  246. package/dist/core/locale/locale.d.ts +56 -0
  247. package/dist/core/locale/locale.js +82 -0
  248. package/dist/core/overlay/types.d.ts +33 -0
  249. package/dist/core/overlay/types.js +1 -0
  250. package/dist/core/props/classes.d.ts +21 -0
  251. package/dist/core/props/classes.js +44 -0
  252. package/dist/core/props/element.d.ts +18 -0
  253. package/dist/core/props/element.js +1 -0
  254. package/dist/core/props/types.d.ts +47 -0
  255. package/dist/core/props/types.js +16 -0
  256. package/dist/core/provider/UIProvider.svelte +63 -0
  257. package/dist/core/provider/UIProvider.svelte.d.ts +29 -0
  258. package/dist/core/theme/ThemeProvider.svelte +178 -0
  259. package/dist/core/theme/ThemeProvider.svelte.d.ts +25 -0
  260. package/dist/core/theme/color.d.ts +23 -0
  261. package/dist/core/theme/color.js +54 -0
  262. package/dist/core/theme/context.d.ts +25 -0
  263. package/dist/core/theme/context.js +14 -0
  264. package/dist/core/theme/css.d.ts +25 -0
  265. package/dist/core/theme/css.js +73 -0
  266. package/dist/core/theme/define.d.ts +11 -0
  267. package/dist/core/theme/define.js +21 -0
  268. package/dist/core/theme/resolve.d.ts +6 -0
  269. package/dist/core/theme/resolve.js +18 -0
  270. package/dist/core/theme/theme-provider.css +13 -0
  271. package/dist/core/theme/types.d.ts +35 -0
  272. package/dist/core/theme/types.js +61 -0
  273. package/dist/core/toast/ToastOutlet.svelte +192 -0
  274. package/dist/core/toast/ToastOutlet.svelte.d.ts +11 -0
  275. package/dist/core/toast/ToastProvider.svelte +39 -0
  276. package/dist/core/toast/ToastProvider.svelte.d.ts +19 -0
  277. package/dist/core/toast/toast.css +134 -0
  278. package/dist/core/toast/toast.svelte.d.ts +117 -0
  279. package/dist/core/toast/toast.svelte.js +133 -0
  280. package/dist/dev/off.d.ts +5 -0
  281. package/dist/dev/off.js +4 -0
  282. package/dist/dev/on.d.ts +20 -0
  283. package/dist/dev/on.js +49 -0
  284. package/dist/index.d.ts +67 -0
  285. package/dist/index.js +83 -0
  286. package/dist/primitives/anchored/anchored.d.ts +39 -0
  287. package/dist/primitives/anchored/anchored.js +104 -0
  288. package/dist/primitives/anchored/fallback.d.ts +31 -0
  289. package/dist/primitives/anchored/fallback.js +73 -0
  290. package/dist/primitives/focus/focus-trap.d.ts +25 -0
  291. package/dist/primitives/focus/focus-trap.js +86 -0
  292. package/dist/primitives/focus/roving-focus.d.ts +22 -0
  293. package/dist/primitives/focus/roving-focus.js +86 -0
  294. package/dist/primitives/focus/tabbable.d.ts +9 -0
  295. package/dist/primitives/focus/tabbable.js +75 -0
  296. package/dist/primitives/inert/inert-others.d.ts +12 -0
  297. package/dist/primitives/inert/inert-others.js +44 -0
  298. package/dist/primitives/keyboard/keymap.d.ts +17 -0
  299. package/dist/primitives/keyboard/keymap.js +39 -0
  300. package/dist/primitives/keyboard/typeahead.d.ts +18 -0
  301. package/dist/primitives/keyboard/typeahead.js +50 -0
  302. package/dist/primitives/layer/dismissable.d.ts +32 -0
  303. package/dist/primitives/layer/dismissable.js +91 -0
  304. package/dist/primitives/motion/easing.d.ts +9 -0
  305. package/dist/primitives/motion/easing.js +46 -0
  306. package/dist/primitives/motion/motion.d.ts +59 -0
  307. package/dist/primitives/motion/motion.js +80 -0
  308. package/dist/primitives/portal/Portal.svelte +37 -0
  309. package/dist/primitives/portal/Portal.svelte.d.ts +9 -0
  310. package/dist/primitives/portal/PortalContent.svelte +15 -0
  311. package/dist/primitives/portal/PortalContent.svelte.d.ts +9 -0
  312. package/dist/primitives/portal/portal.css +8 -0
  313. package/dist/primitives/scroll-lock/scroll-lock.d.ts +10 -0
  314. package/dist/primitives/scroll-lock/scroll-lock.js +33 -0
  315. package/dist/primitives/virtual/virtual-list.svelte.d.ts +65 -0
  316. package/dist/primitives/virtual/virtual-list.svelte.js +291 -0
  317. package/dist/styles/base.css +44 -0
  318. package/dist/styles/props.css +140 -0
  319. package/dist/styles/tokens.css +84 -0
  320. package/dist/styles/visually-hidden.css +16 -0
  321. package/dist/themes/aurora.d.ts +13 -0
  322. package/dist/themes/aurora.js +103 -0
  323. package/dist/themes/heritage.d.ts +13 -0
  324. package/dist/themes/heritage.js +102 -0
  325. package/dist/themes/maison.d.ts +13 -0
  326. package/dist/themes/maison.js +99 -0
  327. package/dist/themes/milano.d.ts +13 -0
  328. package/dist/themes/milano.js +101 -0
  329. package/dist/themes/monolith.d.ts +13 -0
  330. package/dist/themes/monolith.js +101 -0
  331. package/package.json +87 -5
@@ -0,0 +1,116 @@
1
+ <script lang="ts">
2
+ // Several lines of text in a Field, with validation. See TextareaProps for the props.
3
+ import { untrack } from 'svelte';
4
+ import { DEV, warnUnnamed } from '#dev';
5
+ import { useDefaults } from '../../core/defaults/context.js';
6
+ import { textConstraintMessage } from '../../core/form/constraints.js';
7
+ import { createField } from '../../core/form/field.svelte.js';
8
+ import { useLocale } from '../../core/locale/locale.js';
9
+ import Field from '../Field/Field.svelte';
10
+ import './textarea.css';
11
+ import type { TextareaDefaults, TextareaProps } from './types.js';
12
+
13
+ let {
14
+ variant,
15
+ color,
16
+ size,
17
+ density,
18
+ rounded,
19
+ disabled,
20
+ value = $bindable(''),
21
+ rows = 3,
22
+ autoGrow = false,
23
+ maxRows,
24
+ label,
25
+ hint,
26
+ error,
27
+ rules,
28
+ validateOn,
29
+ required = false,
30
+ readonly = false,
31
+ prepend,
32
+ append,
33
+ id,
34
+ 'aria-describedby': describedBy,
35
+ class: className,
36
+ style,
37
+ ref = $bindable(null),
38
+ ...rest
39
+ }: TextareaProps = $props();
40
+
41
+ const resolve = useDefaults<TextareaDefaults>('Textarea', {
42
+ variant: 'outlined',
43
+ color: 'primary',
44
+ size: 'md',
45
+ density: 'default',
46
+ rounded: true,
47
+ disabled: false
48
+ });
49
+ const p = $derived(resolve({ variant, color, size, density, rounded, disabled }));
50
+ const locale = useLocale();
51
+ // A form reset goes back to the text the field started with; a defaultValue of the app's own wins.
52
+ const initial = untrack(() => value ?? '');
53
+
54
+ const field = createField<string>({
55
+ value: () => value ?? '',
56
+ empty: (text) => text === '',
57
+ check: (text) =>
58
+ textConstraintMessage(
59
+ text,
60
+ { required, minlength: rest.minlength, maxlength: rest.maxlength },
61
+ locale.t
62
+ ),
63
+ rules: () => rules,
64
+ error: () => error,
65
+ validateOn: () => validateOn,
66
+ control: () => ref
67
+ });
68
+
69
+ if (DEV) $effect(() => warnUnnamed('Textarea', ref));
70
+
71
+ // Browsers without `field-sizing: content` grow the box by measuring the text; CSS caps it
72
+ // at maxRows, past which it scrolls.
73
+ $effect(() => {
74
+ const element = ref;
75
+ void value;
76
+ if (!autoGrow || !element || CSS.supports('field-sizing', 'content')) return;
77
+ element.style.blockSize = 'auto';
78
+ element.style.blockSize = `${element.scrollHeight}px`;
79
+ });
80
+
81
+ // Leaving means focus went outside the field, not to a button in it.
82
+ function leave(event: FocusEvent) {
83
+ const root = event.currentTarget as HTMLElement;
84
+ if (!root.contains(event.relatedTarget as Node | null)) field.left();
85
+ }
86
+ </script>
87
+
88
+ <Field
89
+ {...p}
90
+ {id}
91
+ {label}
92
+ {hint}
93
+ error={field.error}
94
+ {required}
95
+ {readonly}
96
+ {prepend}
97
+ {append}
98
+ class={['sv-textarea', autoGrow && 'sv-textarea--grow', className]}
99
+ {style}
100
+ oninput={field.changed}
101
+ onfocusout={leave}
102
+ >
103
+ {#snippet children(attributes)}
104
+ <textarea
105
+ bind:this={ref}
106
+ defaultValue={initial}
107
+ {...rest}
108
+ {...attributes}
109
+ aria-describedby={[describedBy, attributes['aria-describedby']].filter(Boolean).join(' ') ||
110
+ undefined}
111
+ {rows}
112
+ style:--sv-textarea-rows={rows}
113
+ style:--sv-textarea-max={maxRows}
114
+ bind:value></textarea>
115
+ {/snippet}
116
+ </Field>
@@ -0,0 +1,4 @@
1
+ import type { TextareaProps } from './types.js';
2
+ declare const Textarea: import("svelte").Component<TextareaProps, {}, "ref" | "value">;
3
+ type Textarea = ReturnType<typeof Textarea>;
4
+ export default Textarea;
@@ -0,0 +1,2 @@
1
+ export { default as Textarea } from './Textarea.svelte';
2
+ export type { TextareaDefaults, TextareaProps } from './types.js';
@@ -0,0 +1 @@
1
+ export { default as Textarea } from './Textarea.svelte';
@@ -0,0 +1,35 @@
1
+ @layer sv.tokens, sv.base, sv.components, sv.utilities;
2
+
3
+ @layer sv.components {
4
+ /*
5
+ * Several lines start at the top of the box, at the height a one-line field gives its text, so
6
+ * a Textarea lines up with a TextField beside it. Lines are spaced for reading.
7
+ */
8
+ .sv-textarea > .sv-field__box {
9
+ /* Half of what the box's height leaves around one line, inside its two borders. */
10
+ --sv-textarea-pad: calc(
11
+ (var(--sv-size-height) * var(--sv-density) - 2 * var(--sv-hairline) - 1lh) / 2
12
+ );
13
+ /* The control radius, never rounder than a card, even where controls are pills. */
14
+ --sv-field-radius: min(var(--sv-radius-md), var(--sv-radius-lg));
15
+ align-items: flex-start;
16
+ line-height: var(--sv-leading-normal);
17
+ }
18
+
19
+ .sv-textarea .sv-field__control {
20
+ padding-block: var(--sv-textarea-pad);
21
+ resize: vertical;
22
+ }
23
+
24
+ .sv-textarea :where(.sv-field__prepend, .sv-field__append) {
25
+ padding-block: var(--sv-textarea-pad);
26
+ }
27
+
28
+ /* Growing: at least `rows` lines, at most `maxRows`, then it scrolls. */
29
+ .sv-textarea--grow .sv-field__control {
30
+ field-sizing: content;
31
+ min-block-size: calc(var(--sv-textarea-rows) * 1lh + 2 * var(--sv-textarea-pad));
32
+ max-block-size: calc(var(--sv-textarea-max) * 1lh + 2 * var(--sv-textarea-pad));
33
+ resize: none;
34
+ }
35
+ }
@@ -0,0 +1,60 @@
1
+ import type { HTMLTextareaAttributes } from 'svelte/elements';
2
+ import type { Rule, ValidateOn } from '../../core/form/types.js';
3
+ import type { ElementProps } from '../../core/props/element.js';
4
+ import type { FieldContentProps, FieldDefaults } from '../Field/types.js';
5
+ /** The Textarea props that `DefaultsProvider` and `UIProvider` can set for a subtree. */
6
+ export type TextareaDefaults = FieldDefaults;
7
+ declare module '../../core/defaults/context.js' {
8
+ interface ComponentDefaults {
9
+ Textarea: TextareaDefaults;
10
+ }
11
+ }
12
+ type TextareaOwnProps = Partial<TextareaDefaults> & FieldContentProps & {
13
+ /** The text. Bindable. */
14
+ value?: string;
15
+ /**
16
+ * Visible lines, and the fewest it shows when it grows.
17
+ * @default 3
18
+ */
19
+ rows?: number;
20
+ /**
21
+ * Grows with its text instead of scrolling, up to `maxRows`.
22
+ * @default false
23
+ */
24
+ autoGrow?: boolean;
25
+ /** With `autoGrow`, the most lines it grows to before it scrolls. Unlimited when not set. */
26
+ maxRows?: number;
27
+ /** Checks run in order after the HTML constraints. The first message is shown. */
28
+ rules?: readonly Rule<string>[];
29
+ /** When the message shows. Defaults to the form's setting, else `'blur'`. */
30
+ validateOn?: ValidateOn;
31
+ /**
32
+ * The field must not be empty. Adds an asterisk to the label.
33
+ * @default false
34
+ */
35
+ required?: boolean;
36
+ /**
37
+ * The text can be read, selected and copied but not changed.
38
+ * @default false
39
+ */
40
+ readonly?: boolean;
41
+ /** Inline style of the field's root element. */
42
+ style?: string | null;
43
+ };
44
+ /**
45
+ * Several lines of text with a label, a hint and validation. `class` and `style` apply to the
46
+ * field; `id`, `ref` and every other attribute (`name`, `placeholder`, `minlength`,
47
+ * `maxlength`, events) go to the `<textarea>`.
48
+ *
49
+ * @example
50
+ * <Textarea
51
+ * label="Note to the payee"
52
+ * name="note"
53
+ * maxlength={280}
54
+ * autoGrow
55
+ * maxRows={8}
56
+ * bind:value={note}
57
+ * />
58
+ */
59
+ export type TextareaProps = ElementProps<HTMLTextAreaElement, HTMLTextareaAttributes, TextareaOwnProps>;
60
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,161 @@
1
+ <script module lang="ts">
2
+ // Until when the next tooltip skips its delay: while one shows, and shortly after it hides,
3
+ // so moving across a toolbar shows each one at once.
4
+ let warmUntil = 0;
5
+ </script>
6
+
7
+ <script lang="ts">
8
+ // A short text that describes a control, on hover and keyboard focus. See TooltipProps.
9
+ import { createAttachmentKey, type Attachment } from 'svelte/attachments';
10
+ import { on } from 'svelte/events';
11
+ import { checkValue, DEV, warnNamelessTrigger } from '#dev';
12
+ import { useDefaults } from '../../core/defaults/context.js';
13
+ import type { TriggerAttributes } from '../../core/overlay/types.js';
14
+ import { ALIGNS, anchored, SIDES } from '../../primitives/anchored/anchored.js';
15
+ import { dismissable } from '../../primitives/layer/dismissable.js';
16
+ import './tooltip.css';
17
+ import type { TooltipDefaults, TooltipProps } from './types.js';
18
+
19
+ let {
20
+ text,
21
+ trigger,
22
+ side,
23
+ align,
24
+ delay,
25
+ open = $bindable(false),
26
+ id: idProp,
27
+ class: className,
28
+ ref = $bindable(null),
29
+ ...rest
30
+ }: TooltipProps = $props();
31
+
32
+ const resolve = useDefaults<TooltipDefaults>('Tooltip', {
33
+ side: 'top',
34
+ align: 'center',
35
+ delay: 377
36
+ });
37
+ const p = $derived(resolve({ side, align, delay }));
38
+
39
+ if (DEV) {
40
+ $effect(() => checkValue('Tooltip', 'side', p.side, SIDES));
41
+ $effect(() => checkValue('Tooltip', 'align', p.align, ALIGNS));
42
+ }
43
+
44
+ const uid = $props.id();
45
+ const id = $derived(idProp ?? uid);
46
+
47
+ // Room between the control and the tooltip, in px, clear of a focus ring.
48
+ const OFFSET = 8;
49
+ // Time to cross that room onto the tooltip before it hides, in ms.
50
+ const GRACE = 144;
51
+ const WARM = 377;
52
+
53
+ // The control it describes, which it is placed against.
54
+ let anchor = $state<HTMLElement | null>(null);
55
+ let timer: ReturnType<typeof setTimeout> | undefined;
56
+ // A press on the control hides the tooltip until the pointer leaves it.
57
+ let pressed = false;
58
+
59
+ function show() {
60
+ clearTimeout(timer);
61
+ open = true;
62
+ }
63
+
64
+ function hide() {
65
+ clearTimeout(timer);
66
+ open = false;
67
+ }
68
+
69
+ function later(action: () => void, ms: number) {
70
+ clearTimeout(timer);
71
+ timer = setTimeout(action, ms);
72
+ }
73
+
74
+ // Touch has no hover: a tap is a press, and a long press belongs to the platform.
75
+ function enter(event: PointerEvent) {
76
+ if (event.pointerType === 'touch' || pressed) return;
77
+ if (open || performance.now() < warmUntil) show();
78
+ else later(show, p.delay);
79
+ }
80
+
81
+ function leave() {
82
+ pressed = false;
83
+ later(hide, GRACE);
84
+ }
85
+
86
+ function press() {
87
+ pressed = true;
88
+ hide();
89
+ }
90
+
91
+ // Keyboard focus shows it at once; a click that focuses the control does not.
92
+ function focus(event: FocusEvent) {
93
+ if ((event.currentTarget as HTMLElement).matches(':focus-visible')) show();
94
+ }
95
+
96
+ const control: Attachment<HTMLElement> = (node) => {
97
+ anchor = node;
98
+ if (DEV) warnNamelessTrigger('Tooltip', node);
99
+ const stops = [
100
+ on(node, 'pointerenter', enter),
101
+ on(node, 'pointerleave', leave),
102
+ on(node, 'pointerdown', press),
103
+ on(node, 'focus', focus),
104
+ on(node, 'blur', hide)
105
+ ];
106
+ return () => {
107
+ for (const stop of stops) stop();
108
+ clearTimeout(timer);
109
+ if (anchor === node) anchor = null;
110
+ };
111
+ };
112
+ const CONTROL = createAttachmentKey();
113
+ const triggerAttributes: TriggerAttributes = $derived({
114
+ 'aria-describedby': id,
115
+ [CONTROL]: control
116
+ });
117
+
118
+ // In the top layer while open. It stays placed until it has faded out, and a hidden tooltip
119
+ // is not placed at all, so a page with many of them pays nothing for those not shown.
120
+ let leaving = $state(false);
121
+ const popover: Attachment<HTMLElement> = (node) => {
122
+ if (!open) return;
123
+ node.showPopover();
124
+ warmUntil = Infinity;
125
+ return () => {
126
+ warmUntil = performance.now() + WARM;
127
+ if (!node.matches(':popover-open')) return;
128
+ node.hidePopover();
129
+ leaving = true;
130
+ void Promise.allSettled(node.getAnimations().map(({ finished }) => finished)).then(
131
+ () => (leaving = false)
132
+ );
133
+ };
134
+ };
135
+ const place: Attachment<HTMLElement> = (node) => {
136
+ if (open || leaving) {
137
+ return anchored({ anchor, side: p.side, align: p.align, offset: OFFSET })(node);
138
+ }
139
+ };
140
+ // Escape hides it first, as the topmost layer; a press outside hides it and goes through.
141
+ const layer: Attachment<HTMLElement> = (node) => {
142
+ if (open) return dismissable({ onDismiss: hide, transient: true })(node);
143
+ };
144
+ </script>
145
+
146
+ {@render trigger(triggerAttributes)}
147
+ <div
148
+ bind:this={ref}
149
+ {...rest}
150
+ {id}
151
+ role="tooltip"
152
+ popover="manual"
153
+ class={['sv-tooltip', className]}
154
+ {@attach popover}
155
+ {@attach place}
156
+ {@attach layer}
157
+ onpointerenter={() => clearTimeout(timer)}
158
+ onpointerleave={leave}
159
+ >
160
+ {text}
161
+ </div>
@@ -0,0 +1,4 @@
1
+ import type { TooltipProps } from './types.js';
2
+ declare const Tooltip: import("svelte").Component<TooltipProps, {}, "ref" | "open">;
3
+ type Tooltip = ReturnType<typeof Tooltip>;
4
+ export default Tooltip;
@@ -0,0 +1,2 @@
1
+ export { default as Tooltip } from './Tooltip.svelte';
2
+ export type { TooltipDefaults, TooltipProps } from './types.js';
@@ -0,0 +1 @@
1
+ export { default as Tooltip } from './Tooltip.svelte';
@@ -0,0 +1,44 @@
1
+ @layer sv.tokens, sv.base, sv.components, sv.utilities;
2
+
3
+ @layer sv.components {
4
+ /*
5
+ * The page inverted: the text colour as the background, so it reads on any surface in both
6
+ * schemes. As wide as its text up to a short line, never wider than the screen. It grows in
7
+ * from 94.4% and fades with the theme's fast timing, and stays in the top layer until it has
8
+ * faded out; with reduced motion it simply appears.
9
+ */
10
+ .sv-tooltip {
11
+ inline-size: max-content;
12
+ max-inline-size: min(21rem, 100vw - 2 * var(--sv-space-8));
13
+ padding-block: var(--sv-space-3);
14
+ padding-inline: var(--sv-space-8);
15
+ border: 0;
16
+ border-radius: var(--sv-radius-sm);
17
+ overflow: visible;
18
+ background: var(--sv-color-text);
19
+ box-shadow: var(--sv-shadow);
20
+ color: var(--sv-color-background);
21
+ font-family: var(--sv-font-ui);
22
+ font-size: var(--sv-text-xs);
23
+ line-height: var(--sv-leading-snug);
24
+ overflow-wrap: break-word;
25
+ opacity: 0;
26
+ transform: scale(0.944);
27
+ transition-property: opacity, transform, display, overlay;
28
+ transition-duration: var(--sv-duration-fast);
29
+ transition-timing-function: var(--sv-ease);
30
+ transition-behavior: allow-discrete;
31
+ }
32
+
33
+ .sv-tooltip:popover-open {
34
+ opacity: 1;
35
+ transform: none;
36
+ }
37
+
38
+ @starting-style {
39
+ .sv-tooltip:popover-open {
40
+ opacity: 0;
41
+ transform: scale(0.944);
42
+ }
43
+ }
44
+ }
@@ -0,0 +1,55 @@
1
+ import type { Snippet } from 'svelte';
2
+ import type { HTMLAttributes } from 'svelte/elements';
3
+ import type { TriggerAttributes } from '../../core/overlay/types.js';
4
+ import type { ElementProps } from '../../core/props/element.js';
5
+ import type { Align, Side } from '../../primitives/anchored/anchored.js';
6
+ /** The Tooltip props that `DefaultsProvider` and `UIProvider` can set for a subtree. */
7
+ export interface TooltipDefaults {
8
+ /**
9
+ * The side of the control it shows on, moved to the opposite side when there is no room.
10
+ * `start` and `end` follow the writing direction.
11
+ * @default 'top'
12
+ */
13
+ side: Side;
14
+ /**
15
+ * Its alignment along that side.
16
+ * @default 'center'
17
+ */
18
+ align: Align;
19
+ /**
20
+ * How long the pointer rests on the control before it shows, in ms. Keyboard focus shows it
21
+ * at once, and so does moving on from another tooltip, as across a toolbar.
22
+ * @default 377
23
+ */
24
+ delay: number;
25
+ }
26
+ declare module '../../core/defaults/context.js' {
27
+ interface ComponentDefaults {
28
+ Tooltip: TooltipDefaults;
29
+ }
30
+ }
31
+ /**
32
+ * A short text that describes a control: shown when the pointer rests on it and at once on
33
+ * keyboard focus, hidden on Escape, on leaving and on a press. It stays while the pointer moves
34
+ * onto it. It holds text only; for links, buttons or fields, use a Popover. The text is the
35
+ * control's description (`aria-describedby`), not its name: an icon-only button still needs
36
+ * `aria-label`. `class`, `style`, `ref` and other attributes go to the tooltip.
37
+ *
38
+ * @example
39
+ * <Tooltip text="Copy the IBAN">
40
+ * {#snippet trigger(attributes)}
41
+ * <Button {...attributes} icon variant="text" aria-label="Copy the IBAN"><Icon path={copy} /></Button>
42
+ * {/snippet}
43
+ * </Tooltip>
44
+ */
45
+ export type TooltipProps = ElementProps<HTMLDivElement, Omit<HTMLAttributes<HTMLDivElement>, 'children' | 'popover' | 'role'>, Partial<TooltipDefaults> & {
46
+ /** The text. */
47
+ text: string;
48
+ /** The control it describes. Spread the attributes it receives onto it. */
49
+ trigger: Snippet<[TriggerAttributes]>;
50
+ /**
51
+ * Whether it shows. Bindable; it sets this as the pointer and focus come and go.
52
+ * @default false
53
+ */
54
+ open?: boolean;
55
+ }>;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,30 @@
1
+ <script lang="ts" module>
2
+ import type { Snippet } from 'svelte';
3
+ import type { DefaultsConfig } from './context.js';
4
+
5
+ export interface DefaultsProviderProps {
6
+ /**
7
+ * Defaults for this subtree: `global` reaches every component with the prop, and a key
8
+ * per component name targets one component. Merged over any outer provider, key by key.
9
+ */
10
+ defaults: DefaultsConfig;
11
+ children?: Snippet;
12
+ }
13
+ </script>
14
+
15
+ <script lang="ts">
16
+ import { getDefaultsContext, mergeDefaults, setDefaultsContext } from './context.js';
17
+
18
+ let { defaults, children }: DefaultsProviderProps = $props();
19
+
20
+ const parent = getDefaultsContext();
21
+ const merged = $derived(mergeDefaults(parent?.config, defaults));
22
+
23
+ setDefaultsContext({
24
+ get config() {
25
+ return merged;
26
+ }
27
+ });
28
+ </script>
29
+
30
+ {@render children?.()}
@@ -0,0 +1,13 @@
1
+ import type { Snippet } from 'svelte';
2
+ import type { DefaultsConfig } from './context.js';
3
+ export interface DefaultsProviderProps {
4
+ /**
5
+ * Defaults for this subtree: `global` reaches every component with the prop, and a key
6
+ * per component name targets one component. Merged over any outer provider, key by key.
7
+ */
8
+ defaults: DefaultsConfig;
9
+ children?: Snippet;
10
+ }
11
+ declare const DefaultsProvider: import("svelte").Component<DefaultsProviderProps, {}, "">;
12
+ type DefaultsProvider = ReturnType<typeof DefaultsProvider>;
13
+ export default DefaultsProvider;
@@ -0,0 +1,45 @@
1
+ import type { SharedProps } from '../props/types.js';
2
+ /** Defaults that reach every component which declares the prop. */
3
+ export type GlobalDefaults = Pick<SharedProps, 'variant' | 'density' | 'size' | 'color' | 'rounded' | 'disabled'>;
4
+ /**
5
+ * Per-component defaults, keyed by component name. Sveltier's components register here,
6
+ * and so can yours, by declaration merging:
7
+ *
8
+ * @example
9
+ * declare module '@sveltier/ui' {
10
+ * interface ComponentDefaults {
11
+ * MyCard: { elevated?: boolean };
12
+ * }
13
+ * }
14
+ */
15
+ export interface ComponentDefaults {
16
+ }
17
+ export type DefaultsConfig = {
18
+ global?: GlobalDefaults;
19
+ } & {
20
+ [Name in keyof ComponentDefaults]?: Partial<ComponentDefaults[Name]>;
21
+ };
22
+ type Bag = Record<string, unknown>;
23
+ type Merged = Record<string, Bag | undefined>;
24
+ interface DefaultsContext {
25
+ /** The merged configuration of this provider and all its ancestors. */
26
+ readonly config: Merged;
27
+ }
28
+ export declare const getDefaultsContext: () => DefaultsContext | undefined;
29
+ export declare const setDefaultsContext: (context: DefaultsContext) => DefaultsContext;
30
+ /** Merges a provider's own config over its parent's, per component and per key. */
31
+ export declare function mergeDefaults(parent: Merged | undefined, own: DefaultsConfig): Merged;
32
+ /**
33
+ * Returns a resolver for a component's defaultable props. Call it during component
34
+ * initialisation, then resolve inside `$derived` so prop and provider changes are tracked:
35
+ *
36
+ * @example
37
+ * let { size, variant, ...rest }: ButtonProps = $props();
38
+ * const resolve = useDefaults('Button', { size: 'md', variant: 'flat' });
39
+ * const p = $derived(resolve({ size, variant }));
40
+ *
41
+ * Order: the prop passed in, then the nearest provider's defaults for `name`, then its
42
+ * global defaults, then `builtins`. `undefined` and `null` mean "not set".
43
+ */
44
+ export declare function useDefaults<T extends object>(name: string, builtins: T): (local: Partial<T>) => T;
45
+ export {};
@@ -0,0 +1,38 @@
1
+ import { getContext, hasContext, setContext } from 'svelte';
2
+ const KEY = Symbol('sveltier.defaults');
3
+ export const getDefaultsContext = () => hasContext(KEY) ? getContext(KEY) : undefined;
4
+ export const setDefaultsContext = (context) => setContext(KEY, context);
5
+ /** Merges a provider's own config over its parent's, per component and per key. */
6
+ export function mergeDefaults(parent, own) {
7
+ const merged = { ...parent };
8
+ for (const [name, values] of Object.entries(own)) {
9
+ merged[name] = { ...parent?.[name], ...values };
10
+ }
11
+ return merged;
12
+ }
13
+ /**
14
+ * Returns a resolver for a component's defaultable props. Call it during component
15
+ * initialisation, then resolve inside `$derived` so prop and provider changes are tracked:
16
+ *
17
+ * @example
18
+ * let { size, variant, ...rest }: ButtonProps = $props();
19
+ * const resolve = useDefaults('Button', { size: 'md', variant: 'flat' });
20
+ * const p = $derived(resolve({ size, variant }));
21
+ *
22
+ * Order: the prop passed in, then the nearest provider's defaults for `name`, then its
23
+ * global defaults, then `builtins`. `undefined` and `null` mean "not set".
24
+ */
25
+ export function useDefaults(name, builtins) {
26
+ const context = getDefaultsContext();
27
+ const keys = Object.keys(builtins);
28
+ return (local) => {
29
+ const config = context?.config;
30
+ const own = config?.[name];
31
+ const global = config?.global;
32
+ const resolved = {};
33
+ for (const key of keys) {
34
+ resolved[key] = (local[key] ?? own?.[key] ?? global?.[key] ?? builtins[key]);
35
+ }
36
+ return resolved;
37
+ };
38
+ }
@@ -0,0 +1,39 @@
1
+ /** Breakpoints, from the narrowest viewport to the widest. */
2
+ export declare const BREAKPOINTS: readonly ["xs", "sm", "md", "lg", "xl", "xxl"];
3
+ export type Breakpoint = (typeof BREAKPOINTS)[number];
4
+ /** The minimum width, in CSS px, of every breakpoint above `xs`. */
5
+ export type DisplayThresholds = Record<Exclude<Breakpoint, 'xs'>, number>;
6
+ export interface DisplayOptions {
7
+ /** Minimum widths in CSS px. Defaults: sm 600, md 960, lg 1280, xl 1920, xxl 2560. */
8
+ thresholds?: Partial<DisplayThresholds>;
9
+ /** `mobile` is true below this breakpoint. Defaults to `md`. */
10
+ mobileBreakpoint?: Exclude<Breakpoint, 'xs'>;
11
+ /** Viewport width assumed during server rendering. Defaults to 0, mobile first. */
12
+ ssrWidth?: number;
13
+ }
14
+ type Flags = {
15
+ readonly [Name in Breakpoint]: boolean;
16
+ } & {
17
+ readonly [Name in Exclude<Breakpoint, 'xs' | 'xxl'> as `${Name}AndUp` | `${Name}AndDown`]: boolean;
18
+ };
19
+ /** The viewport as `useDisplay()` sees it. Every field is reactive. */
20
+ export interface DisplayInstance extends Flags {
21
+ /** The current breakpoint. */
22
+ readonly name: Breakpoint;
23
+ /** Whether the viewport is narrower than the mobile breakpoint. */
24
+ readonly mobile: boolean;
25
+ readonly thresholds: Readonly<DisplayThresholds>;
26
+ }
27
+ /**
28
+ * Builds the breakpoint flags on one `MediaQuery` per threshold. Each flag reads only the
29
+ * queries it needs, so a component is updated only when its own threshold is crossed.
30
+ */
31
+ export declare function createDisplay({ thresholds: custom, mobileBreakpoint, ssrWidth }?: DisplayOptions): DisplayInstance;
32
+ /** Gives a subtree its display instance, built from the root's options. */
33
+ export declare const setDisplayContext: (display: DisplayInstance) => DisplayInstance;
34
+ /**
35
+ * Returns the viewport breakpoints. Call it during component initialisation. Without a
36
+ * provider it returns one shared instance with the default options.
37
+ */
38
+ export declare function useDisplay(): DisplayInstance;
39
+ export {};