@threadlabs/looma 0.14.8 → 0.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (336) hide show
  1. package/components/shared/icons.js +5 -0
  2. package/components/shared/menu-navigation.js +49 -0
  3. package/components/shared/overlay.js +33 -60
  4. package/components/ui-avatar/ui-avatar.html +19 -2
  5. package/components/ui-avatar/ui-avatar.js +7 -1
  6. package/components/ui-avatar-group/ui-avatar-group.html +8 -3
  7. package/components/ui-avatar-group/ui-avatar-group.js +6 -2
  8. package/components/ui-badge/ui-badge.html +70 -4
  9. package/components/ui-button/ui-button.html +21 -5
  10. package/components/ui-button/ui-button.js +10 -0
  11. package/components/ui-callout/ui-callout.html +13 -5
  12. package/components/ui-checkbox/ui-checkbox.html +11 -0
  13. package/components/ui-combobox/ui-combobox.html +46 -10
  14. package/components/ui-combobox/ui-combobox.js +5 -5
  15. package/components/ui-context-menu/ui-context-menu.html +33 -5
  16. package/components/ui-context-menu/ui-context-menu.js +26 -17
  17. package/components/ui-dialog/ui-dialog.html +51 -8
  18. package/components/ui-dialog/ui-dialog.js +28 -7
  19. package/components/ui-disclosure/ui-disclosure.html +14 -5
  20. package/components/ui-disclosure/ui-disclosure.js +51 -4
  21. package/components/ui-editable/ui-editable.html +17 -3
  22. package/components/ui-editable/ui-editable.js +7 -0
  23. package/components/ui-editor-insert-table-grid/ui-editor-insert-table-grid.html +48 -14
  24. package/components/ui-editor-insert-table-grid/ui-editor-insert-table-grid.js +40 -6
  25. package/components/ui-editor-mention-menu/ui-editor-mention-menu.html +22 -9
  26. package/components/ui-editor-mention-menu/ui-editor-mention-menu.js +33 -11
  27. package/components/ui-editor-mention-menu-item/ui-editor-mention-menu-item.html +67 -0
  28. package/components/ui-editor-slash-menu/ui-editor-slash-menu.html +33 -30
  29. package/components/ui-editor-slash-menu/ui-editor-slash-menu.js +42 -8
  30. package/components/ui-editor-slash-menu-group/ui-editor-slash-menu-group.html +31 -0
  31. package/components/ui-editor-slash-menu-item/ui-editor-slash-menu-item.html +75 -0
  32. package/components/ui-editor-table-context-menu/ui-editor-table-context-menu.html +16 -5
  33. package/components/ui-editor-table-context-menu/ui-editor-table-context-menu.js +10 -2
  34. package/components/ui-editor-table-overlay/ui-editor-table-overlay.html +5 -5
  35. package/components/ui-editor-table-overlay/ui-editor-table-overlay.js +5 -2
  36. package/components/ui-editor-table-toolbar/ui-editor-table-toolbar.html +14 -4
  37. package/components/ui-editor-table-toolbar/ui-editor-table-toolbar.js +2 -2
  38. package/components/ui-editor-toolbar/ui-editor-toolbar.html +1 -1
  39. package/components/ui-editor-toolbar/ui-editor-toolbar.js +46 -0
  40. package/components/ui-floating-action-button/ui-floating-action-button.html +1 -1
  41. package/components/ui-form-field/ui-form-field.html +16 -3
  42. package/components/ui-form-field/ui-form-field.js +1 -1
  43. package/components/ui-grid/ui-grid.html +17 -2
  44. package/components/ui-icon/ui-icon.html +5 -0
  45. package/components/ui-icon-button/ui-icon-button.html +25 -6
  46. package/components/ui-icon-button/ui-icon-button.js +11 -1
  47. package/components/ui-input/ui-input.html +3 -3
  48. package/components/ui-input-group/ui-input-group.html +18 -4
  49. package/components/ui-listbox/ui-listbox.html +81 -0
  50. package/components/ui-listbox/ui-listbox.js +27 -0
  51. package/components/ui-menu/ui-menu.html +33 -5
  52. package/components/ui-menu/ui-menu.js +18 -12
  53. package/components/ui-menu-group/ui-menu-group.html +27 -0
  54. package/components/ui-menu-item/ui-menu-item.html +80 -8
  55. package/components/ui-menu-item/ui-menu-item.js +47 -0
  56. package/components/ui-popover/ui-popover.html +33 -5
  57. package/components/ui-popover/ui-popover.js +9 -1
  58. package/components/ui-radio-group/ui-radio-group.html +13 -1
  59. package/components/ui-search-shell/ui-search-shell.html +6 -6
  60. package/components/ui-search-shell/ui-search-shell.js +21 -5
  61. package/components/ui-select/ui-select.html +14 -4
  62. package/components/ui-switch/ui-switch.html +2 -2
  63. package/components/ui-switcher/ui-switcher.html +8 -1
  64. package/components/ui-switcher/ui-switcher.js +15 -0
  65. package/components/ui-tabs/ui-tabs.html +17 -12
  66. package/components/ui-tabs/ui-tabs.js +43 -7
  67. package/components/ui-textarea/ui-textarea.html +28 -5
  68. package/components/ui-toast/ui-toast.html +88 -0
  69. package/components/ui-toast/ui-toast.js +68 -0
  70. package/components/ui-toast-region/ui-toast-region.html +102 -19
  71. package/components/ui-toast-region/ui-toast-region.js +10 -18
  72. package/components/ui-tooltip/ui-tooltip.html +51 -7
  73. package/components/ui-tooltip/ui-tooltip.js +29 -3
  74. package/components/ui-tree/ui-tree.html +12 -0
  75. package/components/ui-tree/ui-tree.js +191 -12
  76. package/components/ui-tree-item/ui-tree-item.html +87 -8
  77. package/components/ui-tree-item/ui-tree-item.js +3 -1
  78. package/dist/index.js +38 -32
  79. package/editor/chunks/extensions.js +82 -2
  80. package/editor/extensions/table-commands.d.ts +8 -0
  81. package/editor/icons.d.ts +5 -0
  82. package/editor/index.js +7 -2
  83. package/editor/insert-table-grid.d.ts +1 -1
  84. package/editor/mention-menu.d.ts +2 -0
  85. package/editor/slash-menu.d.ts +3 -0
  86. package/editor/table-context-menu.d.ts +1 -1
  87. package/editor/table-overlay.d.ts +2 -2
  88. package/package.json +1 -1
  89. package/styles/ui-avatar-group.css +1 -2
  90. package/styles/ui-avatar.css +11 -1
  91. package/styles/ui-badge.css +73 -1
  92. package/styles/ui-button.css +9 -1
  93. package/styles/ui-callout.css +1 -1
  94. package/styles/ui-checkbox.css +9 -0
  95. package/styles/ui-combobox.css +38 -7
  96. package/styles/ui-context-menu.css +32 -4
  97. package/styles/ui-dialog.css +42 -5
  98. package/styles/ui-editor-insert-table-grid.css +48 -11
  99. package/styles/ui-editor-mention-menu-item.css +57 -0
  100. package/styles/ui-editor-mention-menu.css +11 -1
  101. package/styles/ui-editor-slash-menu-group.css +21 -0
  102. package/styles/ui-editor-slash-menu-item.css +62 -0
  103. package/styles/ui-editor-slash-menu.css +10 -21
  104. package/styles/ui-editor-table-context-menu.css +1 -1
  105. package/styles/ui-floating-action-button.css +1 -1
  106. package/styles/ui-form-field.css +14 -1
  107. package/styles/ui-grid.css +14 -1
  108. package/styles/ui-icon-button.css +17 -5
  109. package/styles/ui-input-group.css +18 -4
  110. package/styles/ui-input.css +3 -3
  111. package/styles/ui-listbox.css +69 -0
  112. package/styles/ui-menu-group.css +19 -0
  113. package/styles/ui-menu-item.css +48 -9
  114. package/styles/ui-menu.css +32 -4
  115. package/styles/ui-popover.css +28 -4
  116. package/styles/ui-radio-group.css +9 -0
  117. package/styles/ui-search-shell.css +5 -5
  118. package/styles/ui-select.css +14 -4
  119. package/styles/ui-switch.css +2 -2
  120. package/styles/ui-switcher.css +4 -0
  121. package/styles/ui-textarea.css +27 -4
  122. package/styles/ui-toast-region.css +88 -4
  123. package/styles/ui-toast.css +74 -0
  124. package/styles/ui-tooltip.css +46 -6
  125. package/styles/ui-tree-item.css +72 -4
  126. package/styles/ui-tree.css +8 -0
  127. package/tokens.css +3 -0
  128. package/vanilla/UiAvatar.d.ts +2 -0
  129. package/vanilla/UiAvatar.js +8 -1
  130. package/vanilla/UiAvatarGroup.d.ts +2 -0
  131. package/vanilla/UiAvatarGroup.js +1 -1
  132. package/vanilla/UiBadge.d.ts +1 -1
  133. package/vanilla/UiBadge.js +1 -1
  134. package/vanilla/UiButton.d.ts +1 -0
  135. package/vanilla/UiButton.js +22 -6
  136. package/vanilla/UiCallout.d.ts +1 -1
  137. package/vanilla/UiCallout.js +1 -1
  138. package/vanilla/UiCheckbox.d.ts +1 -0
  139. package/vanilla/UiCheckbox.js +12 -9
  140. package/vanilla/UiCombobox.d.ts +3 -0
  141. package/vanilla/UiCombobox.js +30 -15
  142. package/vanilla/UiContextMenu.d.ts +1 -1
  143. package/vanilla/UiContextMenu.js +1 -1
  144. package/vanilla/UiDialog.d.ts +5 -2
  145. package/vanilla/UiDialog.js +1 -1
  146. package/vanilla/UiDisclosure.d.ts +2 -0
  147. package/vanilla/UiDisclosure.js +32 -18
  148. package/vanilla/UiEditable.d.ts +5 -0
  149. package/vanilla/UiEditable.js +7 -3
  150. package/vanilla/UiEditorInsertTableGrid.js +1 -6
  151. package/vanilla/UiEditorMentionMenu.d.ts +4 -2
  152. package/vanilla/UiEditorMentionMenu.js +49 -31
  153. package/vanilla/UiEditorMentionMenuItem.d.ts +16 -0
  154. package/vanilla/UiEditorMentionMenuItem.js +56 -0
  155. package/vanilla/UiEditorSlashMenu.d.ts +4 -3
  156. package/vanilla/UiEditorSlashMenu.js +59 -46
  157. package/vanilla/UiEditorSlashMenuGroup.d.ts +14 -0
  158. package/vanilla/UiEditorSlashMenuGroup.js +48 -0
  159. package/vanilla/UiEditorSlashMenuItem.d.ts +18 -0
  160. package/vanilla/UiEditorSlashMenuItem.js +57 -0
  161. package/vanilla/UiEditorTableContextMenu.d.ts +5 -2
  162. package/vanilla/UiEditorTableContextMenu.js +1 -2
  163. package/vanilla/UiEditorTableOverlay.d.ts +1 -1
  164. package/vanilla/UiEditorTableOverlay.js +5 -5
  165. package/vanilla/UiEditorTableToolbar.d.ts +4 -2
  166. package/vanilla/UiEditorTableToolbar.js +1 -2
  167. package/vanilla/UiEditorToolbar.js +2 -0
  168. package/vanilla/UiGrid.d.ts +1 -0
  169. package/vanilla/UiGrid.js +8 -7
  170. package/vanilla/UiIcon.js +1 -1
  171. package/vanilla/UiIconButton.d.ts +1 -0
  172. package/vanilla/UiIconButton.js +11 -2
  173. package/vanilla/UiListbox.d.ts +20 -0
  174. package/vanilla/UiListbox.js +45 -0
  175. package/vanilla/UiMenu.d.ts +1 -1
  176. package/vanilla/UiMenu.js +1 -1
  177. package/vanilla/UiMenuGroup.d.ts +14 -0
  178. package/vanilla/UiMenuGroup.js +35 -0
  179. package/vanilla/UiMenuItem.d.ts +5 -1
  180. package/vanilla/UiMenuItem.js +91 -30
  181. package/vanilla/UiPopover.d.ts +1 -1
  182. package/vanilla/UiPopover.js +1 -1
  183. package/vanilla/UiRadioGroup.d.ts +1 -0
  184. package/vanilla/UiRadioGroup.js +6 -3
  185. package/vanilla/UiSwitcher.d.ts +1 -0
  186. package/vanilla/UiSwitcher.js +7 -9
  187. package/vanilla/UiTabs.d.ts +1 -0
  188. package/vanilla/UiTabs.js +9 -1
  189. package/vanilla/UiTextarea.d.ts +1 -0
  190. package/vanilla/UiTextarea.js +4 -1
  191. package/vanilla/UiToast.d.ts +16 -0
  192. package/vanilla/UiToast.js +53 -0
  193. package/vanilla/UiToastRegion.d.ts +1 -4
  194. package/vanilla/UiToastRegion.js +3 -11
  195. package/vanilla/UiTooltip.d.ts +1 -1
  196. package/vanilla/UiTooltip.js +1 -1
  197. package/vanilla/UiTree.d.ts +2 -0
  198. package/vanilla/UiTree.js +1 -1
  199. package/vanilla/UiTreeItem.d.ts +1 -0
  200. package/vanilla/UiTreeItem.js +45 -31
  201. package/vanilla/index.js +6 -0
  202. package/vue/UiAvatar.d.ts +4 -0
  203. package/vue/UiAvatar.vue +23 -3
  204. package/vue/UiAvatarGroup.d.ts +3 -0
  205. package/vue/UiAvatarGroup.vue +7 -4
  206. package/vue/UiBadge.d.ts +2 -2
  207. package/vue/UiBadge.vue +74 -2
  208. package/vue/UiButton.d.ts +5 -3
  209. package/vue/UiButton.vue +41 -7
  210. package/vue/UiCallout.d.ts +2 -2
  211. package/vue/UiCallout.vue +3 -2
  212. package/vue/UiCheckbox.d.ts +2 -0
  213. package/vue/UiCheckbox.vue +16 -0
  214. package/vue/UiCombobox.d.ts +11 -3
  215. package/vue/UiCombobox.vue +60 -11
  216. package/vue/UiContextMenu.d.ts +2 -0
  217. package/vue/UiContextMenu.vue +47 -6
  218. package/vue/UiDialog.d.ts +18 -4
  219. package/vue/UiDialog.vue +86 -11
  220. package/vue/UiDisclosure.d.ts +8 -2
  221. package/vue/UiDisclosure.vue +38 -14
  222. package/vue/UiEditable.d.ts +10 -0
  223. package/vue/UiEditable.vue +14 -2
  224. package/vue/UiEditorInsertTableGrid.vue +52 -15
  225. package/vue/UiEditorMentionMenu.d.ts +24 -2
  226. package/vue/UiEditorMentionMenu.vue +27 -11
  227. package/vue/UiEditorMentionMenuItem.d.ts +24 -0
  228. package/vue/UiEditorMentionMenuItem.js +2 -0
  229. package/vue/UiEditorMentionMenuItem.vue +88 -0
  230. package/vue/UiEditorSlashMenu.d.ts +24 -1
  231. package/vue/UiEditorSlashMenu.vue +33 -33
  232. package/vue/UiEditorSlashMenuGroup.d.ts +18 -0
  233. package/vue/UiEditorSlashMenuGroup.js +2 -0
  234. package/vue/UiEditorSlashMenuGroup.vue +43 -0
  235. package/vue/UiEditorSlashMenuItem.d.ts +26 -0
  236. package/vue/UiEditorSlashMenuItem.js +2 -0
  237. package/vue/UiEditorSlashMenuItem.vue +101 -0
  238. package/vue/UiEditorTableContextMenu.d.ts +9 -3
  239. package/vue/UiEditorTableContextMenu.vue +53 -3
  240. package/vue/UiEditorTableOverlay.d.ts +2 -2
  241. package/vue/UiEditorTableOverlay.vue +8 -6
  242. package/vue/UiEditorTableToolbar.d.ts +7 -3
  243. package/vue/UiEditorTableToolbar.vue +50 -2
  244. package/vue/UiEditorToolbar.vue +14 -1
  245. package/vue/UiFloatingActionButton.vue +1 -1
  246. package/vue/UiFormField.vue +28 -3
  247. package/vue/UiGrid.d.ts +1 -0
  248. package/vue/UiGrid.vue +26 -2
  249. package/vue/UiIcon.vue +16 -0
  250. package/vue/UiIconButton.d.ts +5 -3
  251. package/vue/UiIconButton.vue +40 -6
  252. package/vue/UiInput.vue +10 -3
  253. package/vue/UiInputGroup.vue +32 -11
  254. package/vue/UiListbox.d.ts +33 -0
  255. package/vue/UiListbox.js +2 -0
  256. package/vue/UiListbox.vue +131 -0
  257. package/vue/UiMenu.d.ts +2 -0
  258. package/vue/UiMenu.vue +43 -6
  259. package/vue/UiMenuGroup.d.ts +18 -0
  260. package/vue/UiMenuGroup.js +2 -0
  261. package/vue/UiMenuGroup.vue +39 -0
  262. package/vue/UiMenuItem.d.ts +34 -2
  263. package/vue/UiMenuItem.vue +145 -9
  264. package/vue/UiPopover.d.ts +2 -2
  265. package/vue/UiPopover.vue +44 -5
  266. package/vue/UiRadioGroup.d.ts +2 -0
  267. package/vue/UiRadioGroup.vue +17 -0
  268. package/vue/UiSearchShell.vue +12 -5
  269. package/vue/UiSelect.vue +18 -4
  270. package/vue/UiSwitch.vue +2 -2
  271. package/vue/UiSwitcher.d.ts +1 -0
  272. package/vue/UiSwitcher.vue +22 -1
  273. package/vue/UiTabs.d.ts +6 -2
  274. package/vue/UiTabs.vue +14 -12
  275. package/vue/UiTextarea.d.ts +2 -0
  276. package/vue/UiTextarea.vue +32 -4
  277. package/vue/UiToast.d.ts +34 -0
  278. package/vue/UiToast.js +2 -0
  279. package/vue/UiToast.vue +173 -0
  280. package/vue/UiToastRegion.d.ts +2 -18
  281. package/vue/UiToastRegion.vue +123 -48
  282. package/vue/UiTooltip.d.ts +2 -2
  283. package/vue/UiTooltip.vue +67 -12
  284. package/vue/UiTree.d.ts +10 -0
  285. package/vue/UiTree.vue +27 -0
  286. package/vue/UiTreeItem.d.ts +2 -0
  287. package/vue/UiTreeItem.vue +96 -4
  288. package/vue/chunks/UiAvatar.js +19 -5
  289. package/vue/chunks/UiAvatarGroup.js +10 -4
  290. package/vue/chunks/UiBadge.js +1 -1
  291. package/vue/chunks/UiButton.js +58 -11
  292. package/vue/chunks/UiCallout.js +2 -2
  293. package/vue/chunks/UiCheckbox.js +12 -2
  294. package/vue/chunks/UiCombobox.js +29 -13
  295. package/vue/chunks/UiContextMenu.js +6 -2
  296. package/vue/chunks/UiDialog.js +25 -8
  297. package/vue/chunks/UiDisclosure.js +36 -12
  298. package/vue/chunks/UiEditable.js +22 -8
  299. package/vue/chunks/UiEditorInsertTableGrid.js +11 -14
  300. package/vue/chunks/UiEditorMentionMenu.js +30 -19
  301. package/vue/chunks/UiEditorMentionMenuItem.js +36 -0
  302. package/vue/chunks/UiEditorSlashMenu.js +33 -35
  303. package/vue/chunks/UiEditorSlashMenuGroup.js +26 -0
  304. package/vue/chunks/UiEditorSlashMenuItem.js +51 -0
  305. package/vue/chunks/UiEditorTableContextMenu.js +39 -5
  306. package/vue/chunks/UiEditorTableOverlay.js +6 -6
  307. package/vue/chunks/UiEditorTableToolbar.js +37 -4
  308. package/vue/chunks/UiEditorToolbar.js +18 -4
  309. package/vue/chunks/UiFloatingActionButton.js +1 -1
  310. package/vue/chunks/UiFormField.js +13 -9
  311. package/vue/chunks/UiGrid.js +6 -2
  312. package/vue/chunks/UiIcon.js +40 -2
  313. package/vue/chunks/UiIconButton.js +35 -4
  314. package/vue/chunks/UiInput.js +1 -1
  315. package/vue/chunks/UiInputGroup.js +1 -1
  316. package/vue/chunks/UiListbox.js +70 -0
  317. package/vue/chunks/UiMenu.js +6 -2
  318. package/vue/chunks/UiMenuGroup.js +25 -0
  319. package/vue/chunks/UiMenuItem.js +128 -7
  320. package/vue/chunks/UiPopover.js +1 -1
  321. package/vue/chunks/UiRadioGroup.js +8 -2
  322. package/vue/chunks/UiSearchShell.js +1 -1
  323. package/vue/chunks/UiSelect.js +1 -1
  324. package/vue/chunks/UiSwitch.js +1 -1
  325. package/vue/chunks/UiSwitcher.js +20 -3
  326. package/vue/chunks/UiTabs.js +4 -3
  327. package/vue/chunks/UiTextarea.js +7 -2
  328. package/vue/chunks/UiToast.js +81 -0
  329. package/vue/chunks/UiToastRegion.js +25 -49
  330. package/vue/chunks/UiTooltip.js +3 -7
  331. package/vue/chunks/UiTree.js +8 -4
  332. package/vue/chunks/UiTreeItem.js +28 -10
  333. package/vue/components.css +1840 -851
  334. package/vue/editor/index.js +263 -2
  335. package/vue/index.d.ts +6 -0
  336. package/vue/index.js +9 -3
@@ -1,4 +1,5 @@
1
1
  type __VLS_Props = {
2
+ autosize?: boolean;
2
3
  disabled?: boolean;
3
4
  invalid?: boolean;
4
5
  readonly?: boolean;
@@ -19,6 +20,7 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {
19
20
  required: boolean;
20
21
  readonly: boolean;
21
22
  rows: number;
23
+ autosize: boolean;
22
24
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
23
25
  declare const _default: typeof __VLS_export;
24
26
  export default _default;
@@ -8,6 +8,7 @@ defineOptions({ inheritAttrs: false })
8
8
 
9
9
  const props = withDefaults(
10
10
  defineProps<{
11
+ autosize?: boolean
11
12
  disabled?: boolean
12
13
  invalid?: boolean
13
14
  readonly?: boolean
@@ -18,6 +19,7 @@ const props = withDefaults(
18
19
  modelValue?: string | null
19
20
  }>(),
20
21
  {
22
+ autosize: false,
21
23
  disabled: false,
22
24
  invalid: false,
23
25
  readonly: false,
@@ -40,6 +42,7 @@ const root = ref<HTMLElement | null>(null)
40
42
  const hostState = computed(() =>
41
43
  [
42
44
  props.size && `size size=${props.size}`,
45
+ props.autosize && 'autosize',
43
46
  ].filter(Boolean).join(' ')
44
47
  )
45
48
 
@@ -61,6 +64,7 @@ useComponentHost(controllerModule.default, {
61
64
  :required="required"
62
65
  :aria-invalid="invalid"
63
66
  :rows="rows"
67
+ :style="{ '--_rows': rows }"
64
68
  v-model="model"
65
69
  :data-ui-textarea-state="hostState || undefined"
66
70
  ref="root"
@@ -73,6 +77,14 @@ useComponentHost(controllerModule.default, {
73
77
  syntax: "*";
74
78
  inherits: false;
75
79
  }
80
+ @property --ui-textarea-invalid-border {
81
+ syntax: "*";
82
+ inherits: false;
83
+ }
84
+ @property --ui-textarea-invalid-focus-shadow {
85
+ syntax: "*";
86
+ inherits: false;
87
+ }
76
88
  @property --ui-textarea-radius {
77
89
  syntax: "*";
78
90
  inherits: false;
@@ -89,11 +101,12 @@ useComponentHost(controllerModule.default, {
89
101
  min-inline-size: 0;
90
102
  min-block-size: calc(3rem * 2);
91
103
  margin: 0;
104
+ --_padding-block: var(--ui-space-2);
92
105
  padding: var(--ui-space-2) var(--ui-space-3);
93
106
  appearance: none;
94
107
  resize: vertical;
95
108
  border: 1px solid var(--ui-control-border, var(--ui-border-strong));
96
- border-radius: var(--ui-textarea-radius, var(--ui-radius-md));
109
+ border-radius: var(--ui-textarea-radius, var(--ui-field-radius, var(--ui-radius-md)));
97
110
  background: var(--ui-control-surface, var(--ui-surface-elevated));
98
111
  color: var(--ui-text-primary);
99
112
  font: inherit;
@@ -133,13 +146,19 @@ useComponentHost(controllerModule.default, {
133
146
  /* The app's invalid flag, or the browser's own verdict once the user has left an invalid field. */
134
147
  [data-component~="ui-textarea"][aria-invalid="true"],
135
148
  [data-component~="ui-textarea"]:is(:user-invalid, [data-user-invalid]) {
136
- border-color: var(--ui-danger-solid);
149
+ border-color: var(--ui-textarea-invalid-border, var(--ui-field-danger, var(--ui-danger-solid)));
137
150
  }
138
151
 
139
152
  [data-component~="ui-textarea"]:is([aria-invalid="true"], :is(:user-invalid, [data-user-invalid])):focus-visible {
140
- box-shadow:
153
+ box-shadow: var(
154
+ --ui-textarea-invalid-focus-shadow,
141
155
  var(--ui-control-inset),
142
- 0 0 0 3px color-mix(in srgb, var(--ui-danger-solid) 22%, transparent);
156
+ 0 0 0 3px color-mix(
157
+ in srgb,
158
+ var(--ui-textarea-invalid-border, var(--ui-field-danger, var(--ui-danger-solid))) 22%,
159
+ transparent
160
+ )
161
+ );
143
162
  }
144
163
 
145
164
  [data-component~="ui-textarea"]:disabled {
@@ -150,15 +169,24 @@ useComponentHost(controllerModule.default, {
150
169
  }
151
170
 
152
171
  [data-component~="ui-textarea"][data-ui-textarea-state~="size=sm"] {
172
+ --_padding-block: var(--ui-space-1);
153
173
  padding: var(--ui-space-1) var(--ui-space-2);
154
174
  font-size: var(--ui-font-size-sm);
155
175
  }
156
176
 
157
177
  [data-component~="ui-textarea"][data-ui-textarea-state~="size=lg"] {
178
+ --_padding-block: var(--ui-space-3);
158
179
  padding: var(--ui-space-3) var(--ui-space-4);
159
180
  font-size: var(--ui-font-size-md);
160
181
  }
161
182
 
183
+ @supports (field-sizing: content) {
184
+ [data-component~="ui-textarea"][data-ui-textarea-state~="autosize"] {
185
+ field-sizing: content;
186
+ min-block-size: calc(var(--_rows) * 1lh + var(--_padding-block) + var(--_padding-block) + 2px);
187
+ }
188
+ }
189
+
162
190
  /* Below 16px, iOS zooms the page into the focused field, so touch keeps body-size text. */
163
191
  @media (pointer: coarse) {
164
192
  [data-component~="ui-textarea"][data-ui-textarea-state~="size=sm"] {
@@ -0,0 +1,34 @@
1
+ type __VLS_Props = {
2
+ duration?: number;
3
+ tone?: 'neutral' | 'info' | 'success' | 'warning' | 'danger';
4
+ };
5
+ declare var __VLS_1: {}, __VLS_3: {};
6
+ type __VLS_Slots = {} & {
7
+ default?: (props: typeof __VLS_1) => any;
8
+ } & {
9
+ action?: (props: typeof __VLS_3) => any;
10
+ };
11
+ declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
12
+ dismiss: (detail: {
13
+ readonly id: string;
14
+ readonly reason: "action" | "timeout";
15
+ readonly trigger: "keyboard" | "pointer" | "programmatic";
16
+ }) => any;
17
+ }, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
18
+ onDismiss?: ((detail: {
19
+ readonly id: string;
20
+ readonly reason: "action" | "timeout";
21
+ readonly trigger: "keyboard" | "pointer" | "programmatic";
22
+ }) => any) | undefined;
23
+ }>, {
24
+ tone: "neutral" | "info" | "success" | "warning" | "danger";
25
+ duration: number;
26
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
27
+ declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
28
+ declare const _default: typeof __VLS_export;
29
+ export default _default;
30
+ type __VLS_WithSlots<T, S> = T & {
31
+ new (): {
32
+ $slots: S;
33
+ };
34
+ };
package/vue/UiToast.js ADDED
@@ -0,0 +1,2 @@
1
+ import { t as UiToast_default } from "./chunks/UiToast.js";
2
+ export { UiToast_default as default };
@@ -0,0 +1,173 @@
1
+ <!-- Generated by HTML Next 1.0.0-alpha.7 for Vue 3.5. Do not edit. -->
2
+ <script setup lang="ts">
3
+ import { computed, ref, useTemplateRef } from 'vue'
4
+ import * as controllerModule from '../components/ui-toast/ui-toast.js'
5
+ import { createDispatch, useComponentHost } from './host'
6
+ import UiIcon from './UiIcon.vue'
7
+ import UiIconButton from './UiIconButton.vue'
8
+
9
+ defineOptions({ inheritAttrs: false })
10
+
11
+ const props = withDefaults(
12
+ defineProps<{
13
+ duration?: number
14
+ tone?: 'neutral' | 'info' | 'success' | 'warning' | 'danger'
15
+ }>(),
16
+ {
17
+ duration: 0,
18
+ tone: 'neutral',
19
+ },
20
+ )
21
+ const emit = defineEmits<{
22
+ dismiss: [
23
+ detail: {
24
+ readonly id: string
25
+ readonly reason: 'action' | 'timeout'
26
+ readonly trigger: 'keyboard' | 'pointer' | 'programmatic'
27
+ },
28
+ ]
29
+ }>()
30
+
31
+ const root = ref<HTMLElement | null>(null)
32
+ const actionElement = useTemplateRef<HTMLElement>('action')
33
+
34
+ /** The values the styles' :host-state() rules test. */
35
+ const hostState = computed(() =>
36
+ [
37
+ props.tone && `tone tone=${props.tone}`,
38
+ ].filter(Boolean).join(' ')
39
+ )
40
+
41
+ const isDismissDetail = (detail: unknown): boolean =>
42
+ detail !== null && typeof detail === 'object' && !Array.isArray(detail)
43
+ && typeof (detail as Record<string, unknown>)['id'] === 'string'
44
+ && ((detail as Record<string, unknown>)['reason'] === 'action'
45
+ || (detail as Record<string, unknown>)['reason'] === 'timeout')
46
+ && ((detail as Record<string, unknown>)['trigger'] === 'keyboard'
47
+ || (detail as Record<string, unknown>)['trigger'] === 'pointer'
48
+ || (detail as Record<string, unknown>)['trigger'] === 'programmatic')
49
+ && Object.keys(detail as object).every((key) => ['id', 'reason', 'trigger'].includes(key))
50
+ const dispatch = createDispatch(root, emit as (name: string, detail: unknown) => void, {
51
+ checks: {
52
+ dismiss: isDismissDetail,
53
+ },
54
+ })
55
+
56
+ useComponentHost(controllerModule.default, {
57
+ root,
58
+ dispatch,
59
+ props,
60
+ refs: { action: actionElement },
61
+ })
62
+
63
+ function text(value: unknown): string {
64
+ if (Array.isArray(value)) return value.map(text).join(' ')
65
+ return value === null || value === undefined || typeof value === 'object' ? '' : String(value)
66
+ }
67
+
68
+ function attribute(value: unknown): any {
69
+ if (
70
+ value === null || value === undefined || value === false
71
+ || (typeof value === 'object' && !Array.isArray(value))
72
+ ) return undefined
73
+ return value === true ? '' : text(value)
74
+ }
75
+ </script>
76
+
77
+ <template>
78
+ <div
79
+ data-component="ui-toast"
80
+ v-bind="$attrs"
81
+ :role="attribute(
82
+ ({ neutral: 'status', info: 'status', success: 'status', warning: 'status', danger: 'alert' })[
83
+ tone
84
+ ],
85
+ )"
86
+ :data-ui-toast-state="hostState || undefined"
87
+ ref="root"
88
+ >
89
+ <div class="message"><slot /></div>
90
+ <div class="action" ref="action"><slot name="action" /></div>
91
+ <UiIconButton
92
+ class="dismiss"
93
+ size="sm"
94
+ variant="ghost"
95
+ label="Dismiss notification"
96
+ :round="true"
97
+ ><UiIcon name="x" /></UiIconButton>
98
+ </div>
99
+ </template>
100
+
101
+ <style scoped>
102
+ /* Component hooks stay on this toast; group overlay values may inherit from the region. */
103
+ @property --ui-toast-surface {
104
+ syntax: "*";
105
+ inherits: false;
106
+ }
107
+ @property --ui-toast-border {
108
+ syntax: "*";
109
+ inherits: false;
110
+ }
111
+ @property --ui-toast-radius {
112
+ syntax: "*";
113
+ inherits: false;
114
+ }
115
+ @property --ui-toast-shadow {
116
+ syntax: "*";
117
+ inherits: false;
118
+ }
119
+ @property --ui-toast-accent {
120
+ syntax: "*";
121
+ inherits: false;
122
+ }
123
+
124
+ [data-component~="ui-toast"] {
125
+ --_ui-toast-accent: var(--ui-border-strong);
126
+
127
+ display: flex;
128
+ align-items: center;
129
+ gap: var(--ui-space-2);
130
+ box-sizing: border-box;
131
+ inline-size: 100%;
132
+ margin: 0;
133
+ padding: var(--ui-space-3) var(--ui-space-4);
134
+ border: 1px solid var(--ui-toast-border, var(--ui-overlay-border, var(--ui-border-default)));
135
+ border-inline-start: 3px solid var(--ui-toast-accent, var(--_ui-toast-accent));
136
+ border-radius: var(--ui-toast-radius, var(--ui-overlay-radius, var(--ui-radius-lg)));
137
+ background: var(--ui-toast-surface, var(--ui-overlay-surface, var(--ui-surface-elevated)));
138
+ color: var(--ui-text-primary);
139
+ box-shadow: var(
140
+ --ui-toast-shadow,
141
+ var(--ui-overlay-shadow, var(--ui-elevation-overlay, var(--ui-shadow-lg)))
142
+ );
143
+ pointer-events: auto;
144
+ }
145
+
146
+ [data-component~="ui-toast"][data-ui-toast-state~="tone=info"] {
147
+ --_ui-toast-accent: var(--ui-info-solid);
148
+ }
149
+ [data-component~="ui-toast"][data-ui-toast-state~="tone=success"] {
150
+ --_ui-toast-accent: var(--ui-success-solid);
151
+ }
152
+ [data-component~="ui-toast"][data-ui-toast-state~="tone=warning"] {
153
+ --_ui-toast-accent: var(--ui-warning-solid);
154
+ }
155
+ [data-component~="ui-toast"][data-ui-toast-state~="tone=danger"] {
156
+ --_ui-toast-accent: var(--ui-danger-solid);
157
+ }
158
+
159
+ .message {
160
+ min-inline-size: 0;
161
+ flex: 1;
162
+ }
163
+ .action:not(:has(> *)) {
164
+ display: none;
165
+ }
166
+ .dismiss {
167
+ margin-inline-end: calc(var(--ui-space-2) * -1);
168
+ }
169
+
170
+ [data-component~="ui-toast"][hidden] {
171
+ display: none;
172
+ }
173
+ </style>
@@ -1,8 +1,6 @@
1
1
  type __VLS_Props = {
2
- auto?: boolean;
3
2
  duration?: number;
4
- message?: string;
5
- open?: boolean;
3
+ placement?: 'top' | 'top-start' | 'top-end' | 'bottom' | 'bottom-start' | 'bottom-end';
6
4
  };
7
5
  declare var __VLS_1: {};
8
6
  type __VLS_Slots = {} & {
@@ -11,33 +9,19 @@ type __VLS_Slots = {} & {
11
9
  declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {
12
10
  show: (...args: unknown[]) => Promise<unknown>;
13
11
  }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
14
- close: (detail: {
15
- readonly open: boolean;
16
- readonly reason: "action" | "timeout" | "programmatic" | "light-dismiss" | "escape";
17
- readonly trigger: "keyboard" | "pointer" | "programmatic";
18
- }) => any;
19
- "update:open": (value: boolean) => any;
20
12
  dismiss: (detail: {
21
13
  readonly id: string;
22
14
  readonly reason: "action" | "timeout";
23
15
  readonly trigger: "keyboard" | "pointer" | "programmatic";
24
16
  }) => any;
25
17
  }, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
26
- onClose?: ((detail: {
27
- readonly open: boolean;
28
- readonly reason: "action" | "timeout" | "programmatic" | "light-dismiss" | "escape";
29
- readonly trigger: "keyboard" | "pointer" | "programmatic";
30
- }) => any) | undefined;
31
- "onUpdate:open"?: ((value: boolean) => any) | undefined;
32
18
  onDismiss?: ((detail: {
33
19
  readonly id: string;
34
20
  readonly reason: "action" | "timeout";
35
21
  readonly trigger: "keyboard" | "pointer" | "programmatic";
36
22
  }) => any) | undefined;
37
23
  }>, {
38
- open: boolean;
39
- message: string;
40
- auto: boolean;
24
+ placement: "top" | "top-start" | "top-end" | "bottom" | "bottom-start" | "bottom-end";
41
25
  duration: number;
42
26
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
43
27
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
@@ -1,35 +1,24 @@
1
1
  <!-- Generated by HTML Next 1.0.0-alpha.7 for Vue 3.5. Do not edit. -->
2
2
  <script setup lang="ts">
3
- import { ref } from 'vue'
3
+ import { computed, ref } from 'vue'
4
4
  import * as controllerModule from '../components/ui-toast-region/ui-toast-region.js'
5
5
  import { createDispatch, useComponentHost } from './host'
6
+ import UiIcon from './UiIcon.vue'
6
7
  import UiIconButton from './UiIconButton.vue'
7
8
 
8
9
  defineOptions({ inheritAttrs: false })
9
10
 
10
11
  const props = withDefaults(
11
12
  defineProps<{
12
- auto?: boolean
13
13
  duration?: number
14
- message?: string
15
- open?: boolean
14
+ placement?: 'top' | 'top-start' | 'top-end' | 'bottom' | 'bottom-start' | 'bottom-end'
16
15
  }>(),
17
16
  {
18
- auto: false,
19
- duration: 5000,
20
- message: 'Notification',
21
- open: false,
17
+ duration: 0,
18
+ placement: 'top',
22
19
  },
23
20
  )
24
21
  const emit = defineEmits<{
25
- 'update:open': [value: boolean]
26
- close: [
27
- detail: {
28
- readonly open: boolean
29
- readonly reason: 'action' | 'timeout' | 'programmatic' | 'light-dismiss' | 'escape'
30
- readonly trigger: 'keyboard' | 'pointer' | 'programmatic'
31
- },
32
- ]
33
22
  dismiss: [
34
23
  detail: {
35
24
  readonly id: string
@@ -40,23 +29,23 @@ const emit = defineEmits<{
40
29
  }>()
41
30
 
42
31
  const root = ref<HTMLElement | null>(null)
43
- const internalOpen = ref(false)
44
- const toasts = ref<{ id: string; message: string; role: 'alert' | 'status'; closing: boolean }[]>(
45
- [],
32
+ const toasts = ref<
33
+ {
34
+ id: string
35
+ message: string
36
+ tone: 'neutral' | 'info' | 'success' | 'warning' | 'danger'
37
+ role: 'alert' | 'status'
38
+ closing: boolean
39
+ }[]
40
+ >([])
41
+
42
+ /** The values the styles' :host-state() rules test. */
43
+ const hostState = computed(() =>
44
+ [
45
+ props.placement && `placement placement=${props.placement}`,
46
+ ].filter(Boolean).join(' ')
46
47
  )
47
48
 
48
- const isCloseDetail = (detail: unknown): boolean =>
49
- detail !== null && typeof detail === 'object' && !Array.isArray(detail)
50
- && typeof (detail as Record<string, unknown>)['open'] === 'boolean'
51
- && ((detail as Record<string, unknown>)['reason'] === 'action'
52
- || (detail as Record<string, unknown>)['reason'] === 'timeout'
53
- || (detail as Record<string, unknown>)['reason'] === 'programmatic'
54
- || (detail as Record<string, unknown>)['reason'] === 'light-dismiss'
55
- || (detail as Record<string, unknown>)['reason'] === 'escape')
56
- && ((detail as Record<string, unknown>)['trigger'] === 'keyboard'
57
- || (detail as Record<string, unknown>)['trigger'] === 'pointer'
58
- || (detail as Record<string, unknown>)['trigger'] === 'programmatic')
59
- && Object.keys(detail as object).every((key) => ['open', 'reason', 'trigger'].includes(key))
60
49
  const isDismissDetail = (detail: unknown): boolean =>
61
50
  detail !== null && typeof detail === 'object' && !Array.isArray(detail)
62
51
  && typeof (detail as Record<string, unknown>)['id'] === 'string'
@@ -68,17 +57,15 @@ const isDismissDetail = (detail: unknown): boolean =>
68
57
  && Object.keys(detail as object).every((key) => ['id', 'reason', 'trigger'].includes(key))
69
58
  const dispatch = createDispatch(root, emit as (name: string, detail: unknown) => void, {
70
59
  checks: {
71
- close: isCloseDetail,
72
60
  dismiss: isDismissDetail,
73
61
  },
74
- modeled: ['open'],
75
62
  })
76
63
 
77
64
  const { host, ready } = useComponentHost(controllerModule.default, {
78
65
  root,
79
66
  dispatch,
80
67
  props,
81
- state: { internalOpen, toasts },
68
+ state: { toasts },
82
69
  })
83
70
 
84
71
  defineExpose({
@@ -100,6 +87,7 @@ defineExpose({
100
87
  aria-live="polite"
101
88
  popover="manual"
102
89
  v-bind="$attrs"
90
+ :data-ui-toast-region-state="hostState || undefined"
103
91
  ref="root"
104
92
  >
105
93
  <slot />
@@ -109,6 +97,7 @@ defineExpose({
109
97
  class="toast"
110
98
  :id="toast.id"
111
99
  :role="toast.role"
100
+ :data-tone="toast.tone"
112
101
  :class="{ closing: toast.closing }"
113
102
  >
114
103
  <span class="message">{{ toast.message }}</span>
@@ -117,22 +106,29 @@ defineExpose({
117
106
  variant="ghost"
118
107
  :round="true"
119
108
  :label="`Dismiss ${toast.message}`"
120
- ><svg
121
- viewBox="0 0 24 24"
122
- fill="none"
123
- stroke="currentColor"
124
- stroke-width="2"
125
- stroke-linecap="round"
126
- aria-hidden="true"
127
- >
128
- <path d="M18 6 6 18M6 6l12 12"></path>
129
- </svg></UiIconButton></span>
109
+ ><UiIcon name="x" /></UiIconButton></span>
130
110
  </div>
131
111
  </div>
132
112
  </template>
133
113
 
134
114
  <style scoped>
135
115
  /* This component's hooks style the element they are set on, and never a nested one. */
116
+ @property --ui-toast-region-surface {
117
+ syntax: "*";
118
+ inherits: false;
119
+ }
120
+ @property --ui-toast-region-border {
121
+ syntax: "*";
122
+ inherits: false;
123
+ }
124
+ @property --ui-toast-region-radius {
125
+ syntax: "*";
126
+ inherits: false;
127
+ }
128
+ @property --ui-toast-region-shadow {
129
+ syntax: "*";
130
+ inherits: false;
131
+ }
136
132
  @property --ui-toast-region-enter-duration {
137
133
  syntax: "*";
138
134
  inherits: false;
@@ -144,6 +140,10 @@ defineExpose({
144
140
 
145
141
  [data-component~="ui-toast-region"] {
146
142
  /* Hooks do not inherit, so the parts below read them from the root. */
143
+ --_ui-toast-region-surface: var(--ui-toast-region-surface);
144
+ --_ui-toast-region-border: var(--ui-toast-region-border);
145
+ --_ui-toast-region-radius: var(--ui-toast-region-radius);
146
+ --_ui-toast-region-shadow: var(--ui-toast-region-shadow);
147
147
  --_ui-toast-region-enter-duration: var(--ui-toast-region-enter-duration);
148
148
  --_ui-toast-region-exit-duration: var(--ui-toast-region-exit-duration);
149
149
 
@@ -173,6 +173,29 @@ defineExpose({
173
173
  display: none;
174
174
  }
175
175
 
176
+ [data-component~="ui-toast-region"][data-ui-toast-region-state~="placement=top-start"],
177
+ [data-component~="ui-toast-region"][data-ui-toast-region-state~="placement=bottom-start"] {
178
+ left: auto;
179
+ right: auto;
180
+ inset-inline-start: calc(var(--ui-space-4) + env(safe-area-inset-left));
181
+ transform: none;
182
+ }
183
+
184
+ [data-component~="ui-toast-region"][data-ui-toast-region-state~="placement=top-end"],
185
+ [data-component~="ui-toast-region"][data-ui-toast-region-state~="placement=bottom-end"] {
186
+ left: auto;
187
+ right: auto;
188
+ inset-inline-end: calc(var(--ui-space-4) + env(safe-area-inset-right));
189
+ transform: none;
190
+ }
191
+
192
+ [data-component~="ui-toast-region"][data-ui-toast-region-state~="placement=bottom"],
193
+ [data-component~="ui-toast-region"][data-ui-toast-region-state~="placement=bottom-start"],
194
+ [data-component~="ui-toast-region"][data-ui-toast-region-state~="placement=bottom-end"] {
195
+ top: auto;
196
+ bottom: calc(var(--ui-space-4) + env(safe-area-inset-bottom));
197
+ }
198
+
176
199
  [data-component~="ui-toast-region"] > .toast,
177
200
  [data-component~="ui-toast-region"] > :slotted(*) {
178
201
  pointer-events: auto;
@@ -183,22 +206,52 @@ defineExpose({
183
206
  grid-template-columns: 1fr auto;
184
207
  gap: var(--ui-space-2);
185
208
  align-items: start;
186
- border: 1px solid var(--ui-border-default);
187
- border-radius: var(--ui-radius-lg);
209
+ border: 1px solid
210
+ var(--_ui-toast-region-border, var(--ui-overlay-border, var(--ui-border-default)));
211
+ border-radius: var(--_ui-toast-region-radius, var(--ui-overlay-radius, var(--ui-radius-lg)));
188
212
  padding: var(--ui-space-3) var(--ui-space-4);
189
- background: var(--ui-surface-elevated);
213
+ background: var(
214
+ --_ui-toast-region-surface,
215
+ var(--ui-overlay-surface, var(--ui-surface-elevated))
216
+ );
190
217
  color: var(--ui-text-primary);
191
- box-shadow: var(--ui-elevation-overlay, var(--ui-shadow-lg));
218
+ box-shadow: var(
219
+ --_ui-toast-region-shadow,
220
+ var(--ui-overlay-shadow, var(--ui-elevation-overlay, var(--ui-shadow-lg)))
221
+ );
192
222
  animation: ui-toast-enter var(--_ui-toast-region-enter-duration, 0.32s)
193
223
  var(--ui-motion-ease-out, cubic-bezier(0.16, 1, 0.3, 1)) both;
194
224
  }
195
225
 
226
+ .toast[data-tone="info"] {
227
+ border-inline-start: 3px solid var(--ui-info-solid);
228
+ }
229
+ .toast[data-tone="success"] {
230
+ border-inline-start: 3px solid var(--ui-success-solid);
231
+ }
232
+ .toast[data-tone="warning"] {
233
+ border-inline-start: 3px solid var(--ui-warning-solid);
234
+ }
235
+ .toast[data-tone="danger"] {
236
+ border-inline-start: 3px solid var(--ui-danger-solid);
237
+ }
238
+
196
239
  /* Leaving slides on down and fades; the controller removes the toast when this ends. */
197
240
  .toast.closing {
198
241
  animation: ui-toast-exit var(--_ui-toast-region-exit-duration, 0.22s) var(--ui-motion-ease) both;
199
242
  pointer-events: none;
200
243
  }
201
244
 
245
+ :is([data-component~="ui-toast-region"][data-ui-toast-region-state~="placement=bottom"], [data-component~="ui-toast-region"][data-ui-toast-region-state~="placement=bottom-start"], [data-component~="ui-toast-region"][data-ui-toast-region-state~="placement=bottom-end"])
246
+ .toast {
247
+ animation-name: ui-toast-enter-bottom;
248
+ }
249
+
250
+ :is([data-component~="ui-toast-region"][data-ui-toast-region-state~="placement=bottom"], [data-component~="ui-toast-region"][data-ui-toast-region-state~="placement=bottom-start"], [data-component~="ui-toast-region"][data-ui-toast-region-state~="placement=bottom-end"])
251
+ .toast.closing {
252
+ animation-name: ui-toast-exit-bottom;
253
+ }
254
+
202
255
  @keyframes ui-toast-enter {
203
256
  from {
204
257
  opacity: 0;
@@ -221,6 +274,28 @@ defineExpose({
221
274
  }
222
275
  }
223
276
 
277
+ @keyframes ui-toast-enter-bottom {
278
+ from {
279
+ opacity: 0;
280
+ transform: translateY(1rem);
281
+ }
282
+ to {
283
+ opacity: 1;
284
+ transform: translateY(0);
285
+ }
286
+ }
287
+
288
+ @keyframes ui-toast-exit-bottom {
289
+ from {
290
+ opacity: 1;
291
+ transform: translateY(0);
292
+ }
293
+ to {
294
+ opacity: 0;
295
+ transform: translateY(-0.75rem);
296
+ }
297
+ }
298
+
224
299
  @media (prefers-reduced-motion: reduce) {
225
300
  .toast, .toast.closing {
226
301
  animation: none;
@@ -3,7 +3,7 @@ type __VLS_Props = {
3
3
  hideDelay?: number;
4
4
  inverse?: boolean;
5
5
  open?: boolean;
6
- placement?: string;
6
+ placement?: 'top' | 'top-start' | 'top-end' | 'bottom' | 'bottom-start' | 'bottom-end' | 'left' | 'left-start' | 'left-end' | 'right' | 'right-start' | 'right-end';
7
7
  showDelay?: number;
8
8
  trigger?: 'hover' | 'click' | 'focus';
9
9
  };
@@ -43,7 +43,7 @@ declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {}, {}, {},
43
43
  hideDelay: number;
44
44
  inverse: boolean;
45
45
  open: boolean;
46
- placement: string;
46
+ placement: "top" | "top-start" | "top-end" | "bottom" | "bottom-start" | "bottom-end" | "left" | "left-start" | "left-end" | "right" | "right-start" | "right-end";
47
47
  showDelay: number;
48
48
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
49
49
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;