iryx-ui 0.11.0 → 0.13.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 (258) hide show
  1. package/README.md +35 -1235
  2. package/dist/component-names.d.ts +1 -1
  3. package/dist/component-names.js +1 -1
  4. package/dist/components/Accordion.js +5 -0
  5. package/dist/components/Accordion.vue.d.ts +80 -0
  6. package/dist/components/Accordion.vue_vue_type_script_setup_true_lang.js +87 -0
  7. package/dist/components/Alert.vue.d.ts +1 -1
  8. package/dist/components/Alert.vue_vue_type_script_setup_true_lang.js +43 -43
  9. package/dist/components/App.vue.d.ts +1 -1
  10. package/dist/components/AppShell.js +5 -0
  11. package/dist/components/AppShell.vue.d.ts +46 -0
  12. package/dist/components/AppShell.vue_vue_type_script_setup_true_lang.js +59 -0
  13. package/dist/components/AspectRatio.js +5 -0
  14. package/dist/components/AspectRatio.vue.d.ts +26 -0
  15. package/dist/components/AspectRatio.vue_vue_type_script_setup_true_lang.js +27 -0
  16. package/dist/components/Avatar.js +5 -0
  17. package/dist/components/Avatar.vue.d.ts +52 -0
  18. package/dist/components/Avatar.vue_vue_type_script_setup_true_lang.js +67 -0
  19. package/dist/components/AvatarGroup.js +5 -0
  20. package/dist/components/AvatarGroup.vue.d.ts +39 -0
  21. package/dist/components/AvatarGroup.vue_vue_type_script_setup_true_lang.js +45 -0
  22. package/dist/components/Badge.vue.d.ts +1 -1
  23. package/dist/components/Banner.vue.d.ts +2 -2
  24. package/dist/components/Banner.vue_vue_type_script_setup_true_lang.js +40 -40
  25. package/dist/components/BarChart.vue.d.ts +1 -1
  26. package/dist/components/BarChart.vue_vue_type_script_setup_true_lang.js +14 -14
  27. package/dist/components/Breadcrumb.vue_vue_type_script_setup_true_lang.js +28 -28
  28. package/dist/components/Button.vue.d.ts +2 -2
  29. package/dist/components/Button.vue_vue_type_script_setup_true_lang.js +14 -14
  30. package/dist/components/ButtonGroup.vue.d.ts +1 -1
  31. package/dist/components/Card.vue.d.ts +1 -1
  32. package/dist/components/Checkbox.vue_vue_type_script_setup_true_lang.js +37 -30
  33. package/dist/components/Collapsible.js +5 -0
  34. package/dist/components/Collapsible.vue.d.ts +58 -0
  35. package/dist/components/Collapsible.vue_vue_type_script_setup_true_lang.js +67 -0
  36. package/dist/components/ColorPicker.js +5 -0
  37. package/dist/components/ColorPicker.vue.d.ts +49 -0
  38. package/dist/components/ColorPicker.vue_vue_type_script_setup_true_lang.js +172 -0
  39. package/dist/components/Combobox.vue.d.ts +6 -6
  40. package/dist/components/Combobox.vue_vue_type_script_setup_true_lang.js +62 -60
  41. package/dist/components/CommandPalette.js +5 -0
  42. package/dist/components/CommandPalette.vue.d.ts +63 -0
  43. package/dist/components/CommandPalette.vue_vue_type_script_setup_true_lang.js +185 -0
  44. package/dist/components/Container.js +5 -0
  45. package/dist/components/Container.vue.d.ts +33 -0
  46. package/dist/components/Container.vue_vue_type_script_setup_true_lang.js +40 -0
  47. package/dist/components/ContextMenu.js +5 -0
  48. package/dist/components/ContextMenu.vue.d.ts +42 -0
  49. package/dist/components/ContextMenu.vue_vue_type_script_setup_true_lang.js +49 -0
  50. package/dist/components/DatePicker.vue_vue_type_script_setup_true_lang.js +65 -65
  51. package/dist/components/DateRangePicker.vue.d.ts +1 -1
  52. package/dist/components/DateRangePicker.vue_vue_type_script_setup_true_lang.js +74 -74
  53. package/dist/components/Dialog.vue.d.ts +1 -1
  54. package/dist/components/Dialog.vue_vue_type_script_setup_true_lang.js +34 -34
  55. package/dist/components/Drawer.js +5 -0
  56. package/dist/components/Drawer.vue.d.ts +94 -0
  57. package/dist/components/Drawer.vue_vue_type_script_setup_true_lang.js +144 -0
  58. package/dist/components/DropdownMenuItems.vue_vue_type_script_setup_true_lang.js +42 -42
  59. package/dist/components/EmptyState.vue.d.ts +1 -1
  60. package/dist/components/FileUpload.vue_vue_type_script_setup_true_lang.js +77 -77
  61. package/dist/components/Icon.vue_vue_type_script_setup_true_lang.js +11 -11
  62. package/dist/components/Input.vue.d.ts +1 -1
  63. package/dist/components/Input.vue_vue_type_script_setup_true_lang.js +33 -33
  64. package/dist/components/Kbd.js +5 -0
  65. package/dist/components/Kbd.vue.d.ts +46 -0
  66. package/dist/components/Kbd.vue_vue_type_script_setup_true_lang.js +41 -0
  67. package/dist/components/LineChart.vue_vue_type_script_setup_true_lang.js +19 -19
  68. package/dist/components/Menubar.js +5 -0
  69. package/dist/components/Menubar.vue.d.ts +62 -0
  70. package/dist/components/Menubar.vue_vue_type_script_setup_true_lang.js +79 -0
  71. package/dist/components/NavigationMenu.js +5 -0
  72. package/dist/components/NavigationMenu.vue.d.ts +75 -0
  73. package/dist/components/NavigationMenu.vue_vue_type_script_setup_true_lang.js +167 -0
  74. package/dist/components/NumberInput.vue_vue_type_script_setup_true_lang.js +68 -66
  75. package/dist/components/PageHeader.js +5 -0
  76. package/dist/components/PageHeader.vue.d.ts +52 -0
  77. package/dist/components/PageHeader.vue_vue_type_script_setup_true_lang.js +59 -0
  78. package/dist/components/Pagination.vue_vue_type_script_setup_true_lang.js +37 -37
  79. package/dist/components/PasswordInput.vue_vue_type_script_setup_true_lang.js +37 -37
  80. package/dist/components/PinInput.js +5 -0
  81. package/dist/components/PinInput.vue.d.ts +65 -0
  82. package/dist/components/PinInput.vue_vue_type_script_setup_true_lang.js +76 -0
  83. package/dist/components/Popover.js +5 -0
  84. package/dist/components/Popover.vue.d.ts +75 -0
  85. package/dist/components/Popover.vue_vue_type_script_setup_true_lang.js +99 -0
  86. package/dist/components/Progress.vue.d.ts +20 -1
  87. package/dist/components/Progress.vue_vue_type_script_setup_true_lang.js +85 -42
  88. package/dist/components/RadioGroup.vue_vue_type_script_setup_true_lang.js +4 -1
  89. package/dist/components/ScrollArea.js +5 -0
  90. package/dist/components/ScrollArea.vue.d.ts +41 -0
  91. package/dist/components/ScrollArea.vue_vue_type_script_setup_true_lang.js +68 -0
  92. package/dist/components/ScrollFade.js +5 -0
  93. package/dist/components/ScrollFade.vue.d.ts +36 -0
  94. package/dist/components/ScrollFade.vue_vue_type_script_setup_true_lang.js +59 -0
  95. package/dist/components/Select.vue.d.ts +2 -2
  96. package/dist/components/Select.vue_vue_type_script_setup_true_lang.js +47 -45
  97. package/dist/components/Sidebar.js +5 -0
  98. package/dist/components/Sidebar.vue.d.ts +72 -0
  99. package/dist/components/Sidebar.vue_vue_type_script_setup_true_lang.js +183 -0
  100. package/dist/components/SignaturePad.js +5 -0
  101. package/dist/components/SignaturePad.vue.d.ts +60 -0
  102. package/dist/components/SignaturePad.vue_vue_type_script_setup_true_lang.js +158 -0
  103. package/dist/components/Skeleton.vue.d.ts +1 -1
  104. package/dist/components/Skeleton.vue_vue_type_script_setup_true_lang.js +8 -8
  105. package/dist/components/Slider.js +5 -0
  106. package/dist/components/Slider.vue.d.ts +80 -0
  107. package/dist/components/Slider.vue_vue_type_script_setup_true_lang.js +115 -0
  108. package/dist/components/Splitter.js +5 -0
  109. package/dist/components/Splitter.vue.d.ts +59 -0
  110. package/dist/components/Splitter.vue_vue_type_script_setup_true_lang.js +69 -0
  111. package/dist/components/Stat.vue.d.ts +1 -1
  112. package/dist/components/Stat.vue_vue_type_script_setup_true_lang.js +27 -27
  113. package/dist/components/Stepper.vue_vue_type_script_setup_true_lang.js +38 -38
  114. package/dist/components/Switch.vue.d.ts +1 -0
  115. package/dist/components/Switch.vue_vue_type_script_setup_true_lang.js +16 -5
  116. package/dist/components/Table.vue.d.ts +7 -1
  117. package/dist/components/Table.vue_vue_type_script_setup_true_lang.js +120 -105
  118. package/dist/components/TagsInput.js +5 -0
  119. package/dist/components/TagsInput.vue.d.ts +71 -0
  120. package/dist/components/TagsInput.vue_vue_type_script_setup_true_lang.js +119 -0
  121. package/dist/components/Textarea.vue_vue_type_script_setup_true_lang.js +3 -3
  122. package/dist/components/TimeField.js +5 -0
  123. package/dist/components/TimeField.vue.d.ts +50 -0
  124. package/dist/components/TimeField.vue_vue_type_script_setup_true_lang.js +85 -0
  125. package/dist/components/Timeline.js +5 -0
  126. package/dist/components/Timeline.vue.d.ts +61 -0
  127. package/dist/components/Timeline.vue_vue_type_script_setup_true_lang.js +60 -0
  128. package/dist/components/Toaster.vue.d.ts +1 -1
  129. package/dist/components/Toaster.vue_vue_type_script_setup_true_lang.js +41 -41
  130. package/dist/components/Toggle.js +5 -0
  131. package/dist/components/Toggle.vue.d.ts +42 -0
  132. package/dist/components/Toggle.vue_vue_type_script_setup_true_lang.js +52 -0
  133. package/dist/components/ToggleGroup.js +5 -0
  134. package/dist/components/ToggleGroup.vue.d.ts +64 -0
  135. package/dist/components/ToggleGroup.vue_vue_type_script_setup_true_lang.js +78 -0
  136. package/dist/components/Toolbar.js +5 -0
  137. package/dist/components/Toolbar.vue.d.ts +52 -0
  138. package/dist/components/Toolbar.vue_vue_type_script_setup_true_lang.js +94 -0
  139. package/dist/components/Tree.js +5 -0
  140. package/dist/components/Tree.vue.d.ts +70 -0
  141. package/dist/components/Tree.vue_vue_type_script_setup_true_lang.js +112 -0
  142. package/dist/components/index.d.ts +30 -0
  143. package/dist/components/index.js +144 -84
  144. package/dist/composables/appearance.js +5 -1
  145. package/dist/composables/cartesian.d.ts +11 -0
  146. package/dist/composables/cartesian.js +18 -19
  147. package/dist/composables/command-palette.d.ts +42 -0
  148. package/dist/composables/command-palette.js +32 -0
  149. package/dist/composables/date.d.ts +18 -2
  150. package/dist/composables/date.js +23 -15
  151. package/dist/composables/kbd.d.ts +26 -0
  152. package/dist/composables/kbd.js +161 -0
  153. package/dist/composables/navigation-menu.d.ts +29 -0
  154. package/dist/composables/navigation-menu.js +6 -0
  155. package/dist/composables/scroll-fade.d.ts +35 -0
  156. package/dist/composables/scroll-fade.js +36 -0
  157. package/dist/composables/sidebar.d.ts +35 -0
  158. package/dist/composables/sidebar.js +23 -0
  159. package/dist/composables/signature.d.ts +22 -0
  160. package/dist/composables/signature.js +13 -0
  161. package/dist/index.d.ts +36 -0
  162. package/dist/index.js +153 -92
  163. package/dist/theme/accordion.d.ts +68 -0
  164. package/dist/theme/accordion.js +24 -0
  165. package/dist/theme/alert.d.ts +0 -3
  166. package/dist/theme/app-shell.d.ts +77 -0
  167. package/dist/theme/app-shell.js +35 -0
  168. package/dist/theme/avatar.d.ts +253 -0
  169. package/dist/theme/avatar.js +84 -0
  170. package/dist/theme/banner.d.ts +0 -9
  171. package/dist/theme/bar-chart.d.ts +0 -16
  172. package/dist/theme/breadcrumb.d.ts +3 -3
  173. package/dist/theme/button-group.d.ts +0 -3
  174. package/dist/theme/button.d.ts +0 -3
  175. package/dist/theme/card.js +2 -2
  176. package/dist/theme/chart-legend.d.ts +3 -11
  177. package/dist/theme/collapsible.d.ts +44 -0
  178. package/dist/theme/collapsible.js +17 -0
  179. package/dist/theme/color-picker.d.ts +98 -0
  180. package/dist/theme/color-picker.js +19 -0
  181. package/dist/theme/command-palette.d.ts +122 -0
  182. package/dist/theme/command-palette.js +22 -0
  183. package/dist/theme/container.d.ts +101 -0
  184. package/dist/theme/container.js +26 -0
  185. package/dist/theme/date-picker.d.ts +12 -0
  186. package/dist/theme/date-picker.js +1 -1
  187. package/dist/theme/drawer.d.ts +110 -0
  188. package/dist/theme/drawer.js +100 -0
  189. package/dist/theme/dropdown-menu.d.ts +0 -9
  190. package/dist/theme/file-upload.d.ts +0 -3
  191. package/dist/theme/form.d.ts +12 -12
  192. package/dist/theme/index.d.ts +26 -0
  193. package/dist/theme/kbd.d.ts +71 -0
  194. package/dist/theme/kbd.js +29 -0
  195. package/dist/theme/line-chart.d.ts +0 -9
  196. package/dist/theme/menubar.d.ts +29 -0
  197. package/dist/theme/menubar.js +11 -0
  198. package/dist/theme/navigation-menu.d.ts +161 -0
  199. package/dist/theme/navigation-menu.js +43 -0
  200. package/dist/theme/number-input.d.ts +0 -3
  201. package/dist/theme/page-header.d.ts +47 -0
  202. package/dist/theme/page-header.js +17 -0
  203. package/dist/theme/pagination.d.ts +0 -3
  204. package/dist/theme/pin-input.d.ts +86 -0
  205. package/dist/theme/pin-input.js +32 -0
  206. package/dist/theme/popover.d.ts +119 -0
  207. package/dist/theme/popover.js +31 -0
  208. package/dist/theme/presets.d.ts +0 -2
  209. package/dist/theme/progress.d.ts +93 -0
  210. package/dist/theme/progress.js +37 -7
  211. package/dist/theme/radio-group.d.ts +24 -0
  212. package/dist/theme/radio-group.js +23 -14
  213. package/dist/theme/scroll-area.d.ts +65 -0
  214. package/dist/theme/scroll-area.js +57 -0
  215. package/dist/theme/scroll-fade.d.ts +35 -0
  216. package/dist/theme/scroll-fade.js +12 -0
  217. package/dist/theme/sidebar.d.ts +167 -0
  218. package/dist/theme/sidebar.js +43 -0
  219. package/dist/theme/signature-pad.d.ts +50 -0
  220. package/dist/theme/signature-pad.js +17 -0
  221. package/dist/theme/slider.d.ts +128 -0
  222. package/dist/theme/slider.js +49 -0
  223. package/dist/theme/sparkline.d.ts +0 -6
  224. package/dist/theme/splitter.d.ts +59 -0
  225. package/dist/theme/splitter.js +25 -0
  226. package/dist/theme/stat.d.ts +0 -3
  227. package/dist/theme/stepper.js +2 -2
  228. package/dist/theme/switch.d.ts +53 -29
  229. package/dist/theme/switch.js +33 -8
  230. package/dist/theme/table.d.ts +51 -3
  231. package/dist/theme/table.js +8 -3
  232. package/dist/theme/tabs.d.ts +0 -3
  233. package/dist/theme/tags-input.d.ts +110 -0
  234. package/dist/theme/tags-input.js +42 -0
  235. package/dist/theme/time-field.d.ts +68 -0
  236. package/dist/theme/time-field.js +21 -0
  237. package/dist/theme/timeline.d.ts +182 -0
  238. package/dist/theme/timeline.js +83 -0
  239. package/dist/theme/toggle.d.ts +145 -0
  240. package/dist/theme/toggle.js +84 -0
  241. package/dist/theme/toolbar.d.ts +56 -0
  242. package/dist/theme/toolbar.js +21 -0
  243. package/dist/theme/tree.d.ts +68 -0
  244. package/dist/theme/tree.js +28 -0
  245. package/package.json +4 -3
  246. package/theme.css +335 -0
  247. package/dist/node_modules/.pnpm/@hugeicons_core-free-icons@4.2.3/node_modules/@hugeicons/core-free-icons/dist/esm/index.js +0 -377
  248. package/dist/node_modules/.pnpm/@hugeicons_vue@1.0.7_vue@3.5.35_typescript@6.0.3_/node_modules/@hugeicons/vue/dist/esm/_virtual/_plugin-vue_export-helper.js +0 -8
  249. package/dist/node_modules/.pnpm/@hugeicons_vue@1.0.7_vue@3.5.35_typescript@6.0.3_/node_modules/@hugeicons/vue/dist/esm/components/HugeiconsIcon.vue.js +0 -25
  250. package/dist/node_modules/.pnpm/@hugeicons_vue@1.0.7_vue@3.5.35_typescript@6.0.3_/node_modules/@hugeicons/vue/dist/esm/components/HugeiconsIcon.vue2.js +0 -63
  251. package/dist/node_modules/.pnpm/@internationalized_date@3.12.3/node_modules/@internationalized/date/dist/private/CalendarDate.js +0 -122
  252. package/dist/node_modules/.pnpm/@internationalized_date@3.12.3/node_modules/@internationalized/date/dist/private/DateFormatter.js +0 -84
  253. package/dist/node_modules/.pnpm/@internationalized_date@3.12.3/node_modules/@internationalized/date/dist/private/calendars/GregorianCalendar.js +0 -91
  254. package/dist/node_modules/.pnpm/@internationalized_date@3.12.3/node_modules/@internationalized/date/dist/private/conversion.js +0 -107
  255. package/dist/node_modules/.pnpm/@internationalized_date@3.12.3/node_modules/@internationalized/date/dist/private/manipulation.js +0 -159
  256. package/dist/node_modules/.pnpm/@internationalized_date@3.12.3/node_modules/@internationalized/date/dist/private/queries.js +0 -29
  257. package/dist/node_modules/.pnpm/@internationalized_date@3.12.3/node_modules/@internationalized/date/dist/private/string.js +0 -37
  258. package/dist/node_modules/.pnpm/@internationalized_date@3.12.3/node_modules/@internationalized/date/dist/private/utils.js +0 -6
package/theme.css CHANGED
@@ -200,6 +200,46 @@
200
200
  --animate-dialog-in: dialog-in 150ms ease-out;
201
201
  --animate-dialog-out: dialog-out 150ms ease-in;
202
202
  --animate-toast-in: toast-in 150ms ease-out;
203
+ /*
204
+ * One easing for every drawer transition, enter/exit and drag-release alike,
205
+ * so a panel that is let go mid-swipe finishes the way it would have opened.
206
+ */
207
+ --iryx-drawer-ease: cubic-bezier(0.32, 0.72, 0, 1);
208
+ --animate-drawer-in-right: drawer-in-right 300ms var(--iryx-drawer-ease);
209
+ --animate-drawer-out-right: drawer-out-right 300ms var(--iryx-drawer-ease);
210
+ --animate-drawer-in-left: drawer-in-left 300ms var(--iryx-drawer-ease);
211
+ --animate-drawer-out-left: drawer-out-left 300ms var(--iryx-drawer-ease);
212
+ --animate-drawer-in-top: drawer-in-top 300ms var(--iryx-drawer-ease);
213
+ --animate-drawer-out-top: drawer-out-top 300ms var(--iryx-drawer-ease);
214
+ --animate-drawer-in-bottom: drawer-in-bottom 300ms var(--iryx-drawer-ease);
215
+ --animate-drawer-out-bottom: drawer-out-bottom 300ms var(--iryx-drawer-ease);
216
+ /*
217
+ * Collapsible unroll. Same curve as the drawer, under its own name: it
218
+ * decelerates hard at the end, so the panel settles instead of stopping.
219
+ * Closing is quicker than opening — a slow exit reads as lag.
220
+ */
221
+ --iryx-collapsible-ease: cubic-bezier(0.32, 0.72, 0, 1);
222
+ --animate-collapsible-down: collapsible-down 240ms var(--iryx-collapsible-ease);
223
+ --animate-collapsible-up: collapsible-up 180ms var(--iryx-collapsible-ease);
224
+ /*
225
+ * The rows lift and fade as two animations, not one keyframe set, because
226
+ * they want different curves. On the shared emphasized ease the opacity is
227
+ * already at ~1 within a couple of frames — the fade is technically there and
228
+ * perceptually absent. Its own ease-out, held back briefly so the panel has
229
+ * started moving first, is what makes it read.
230
+ *
231
+ * The fade finishes well before the lift on purpose: the rows are legible for
232
+ * the back half of the unroll, so the motion settles rather than the content
233
+ * still arriving as it stops.
234
+ *
235
+ * `both` matters: the fade is delayed, and without it the rows would paint at
236
+ * full opacity for those first 40ms and then start fading in from visible.
237
+ */
238
+ --animate-collapsible-content-in:
239
+ collapsible-lift-in 260ms var(--iryx-collapsible-ease),
240
+ collapsible-fade-in 220ms 40ms ease-out both;
241
+ --animate-collapsible-content-out:
242
+ collapsible-fade-out 140ms ease-in both;
203
243
  }
204
244
 
205
245
  /* Indeterminate Progress: slide a short bar back and forth across the track. */
@@ -244,9 +284,304 @@
244
284
  }
245
285
  }
246
286
 
287
+ /*
288
+ * Collapsible open/close.
289
+ *
290
+ * `height: auto` is not tweenable, so Reka measures the panel and publishes it
291
+ * as --reka-collapsible-content-height; these keyframes animate to that.
292
+ *
293
+ * The height animation has to own the element Reka sets the variable on, and
294
+ * that element must carry no margin, padding or border of its own — margin is
295
+ * not part of the animated height, so it would survive the close as a visible
296
+ * gap under a panel that is supposedly shut. The indent, rule and row spacing
297
+ * live on an inner wrapper instead.
298
+ */
299
+ @keyframes collapsible-down {
300
+ from {
301
+ height: 0;
302
+ }
303
+ to {
304
+ height: var(--reka-collapsible-content-height);
305
+ }
306
+ }
307
+
308
+ @keyframes collapsible-up {
309
+ from {
310
+ height: var(--reka-collapsible-content-height);
311
+ }
312
+ to {
313
+ height: 0;
314
+ }
315
+ }
316
+
317
+ /*
318
+ * The rows lift into place while the panel unrolls, so they arrive under their
319
+ * own steam rather than being uncovered by a moving mask. This animates the
320
+ * independent `translate` property, not `transform`, so it cannot compose with
321
+ * a transform an app puts on the same element.
322
+ */
323
+ @keyframes collapsible-lift-in {
324
+ from {
325
+ translate: 0 -0.5rem;
326
+ }
327
+ }
328
+
329
+ @keyframes collapsible-fade-in {
330
+ from {
331
+ opacity: 0;
332
+ }
333
+ }
334
+
335
+ @keyframes collapsible-fade-out {
336
+ to {
337
+ opacity: 0;
338
+ }
339
+ }
340
+
247
341
  @keyframes toast-in {
248
342
  from {
249
343
  opacity: 0;
250
344
  transform: translateY(0.5rem);
251
345
  }
252
346
  }
347
+
348
+ /*
349
+ * Drawer enter/exit, one pair per edge.
350
+ *
351
+ * These animate the independent `translate` property, NOT `transform` — the
352
+ * exact opposite of the dialog's constraint, and for the same underlying
353
+ * reason. Reka's drawer follows the finger by writing `transform` from
354
+ * `--drawer-swipe-movement-*` (see `.iryx-drawer` below), so a keyframe on
355
+ * `transform` would clobber the drag offset and the panel would refuse to
356
+ * move under the pointer. `translate` composes with it instead.
357
+ *
358
+ * The slide is the whole animation — fading a panel that is already moving
359
+ * reads as two effects fighting.
360
+ */
361
+ @keyframes drawer-in-right {
362
+ from {
363
+ translate: 100% 0;
364
+ }
365
+ }
366
+
367
+ @keyframes drawer-out-right {
368
+ to {
369
+ translate: 100% 0;
370
+ }
371
+ }
372
+
373
+ @keyframes drawer-in-left {
374
+ from {
375
+ translate: -100% 0;
376
+ }
377
+ }
378
+
379
+ @keyframes drawer-out-left {
380
+ to {
381
+ translate: -100% 0;
382
+ }
383
+ }
384
+
385
+ @keyframes drawer-in-top {
386
+ from {
387
+ translate: 0 -100%;
388
+ }
389
+ }
390
+
391
+ @keyframes drawer-out-top {
392
+ to {
393
+ translate: 0 -100%;
394
+ }
395
+ }
396
+
397
+ @keyframes drawer-in-bottom {
398
+ from {
399
+ translate: 0 100%;
400
+ }
401
+ }
402
+
403
+ @keyframes drawer-out-bottom {
404
+ to {
405
+ translate: 0 100%;
406
+ }
407
+ }
408
+
409
+ /*
410
+ * Sidebar submenu indent.
411
+ *
412
+ * Two alignments have to hold at once, and both are derived from the parent
413
+ * row's icon column rather than chosen:
414
+ *
415
+ * - the rule sits on the centre of the parent's icon, so it reads as descending
416
+ * from that row instead of floating between columns;
417
+ * - a child's label lands in the same column as its parent's label, so the
418
+ * submenu reads as one list rather than a slightly shifted copy of one.
419
+ *
420
+ * Picked by hand these land a few pixels out, which is worse than either a
421
+ * clean alignment or an obvious indent — it just looks like a mistake. Doing
422
+ * it as arithmetic keeps the two in step if the row metrics ever change.
423
+ */
424
+ @layer components {
425
+ .iryx-sidebar-submenu {
426
+ /* Mirrors the row: `size-4` icon, `gap-3` to the label, `px-2` inset. */
427
+ --iryx-sidebar-icon: --spacing(4);
428
+ --iryx-sidebar-gap: --spacing(3);
429
+ --iryx-sidebar-inset: --spacing(2);
430
+
431
+ margin-left: calc(var(--iryx-sidebar-inset) + var(--iryx-sidebar-icon) / 2);
432
+ /* The child row contributes its own `px-2`, so that comes back off here. */
433
+ padding-left: calc(
434
+ var(--iryx-sidebar-icon) / 2 + var(--iryx-sidebar-gap) - 1px -
435
+ var(--iryx-sidebar-inset)
436
+ );
437
+ }
438
+ }
439
+
440
+ /*
441
+ * Drawer drag plumbing.
442
+ *
443
+ * This is plain CSS rather than Tailwind utilities because it is variable
444
+ * arithmetic keyed on an attribute Reka sets at runtime — there is no class
445
+ * name to generate. Reka writes the live drag offset into
446
+ * `--drawer-swipe-movement-x/y` and the resting snap position into
447
+ * `--drawer-snap-point-offset`; both act on the swipe axis, so they add.
448
+ *
449
+ * `[data-swiping]` kills the transition while a finger is down, or the panel
450
+ * lags behind the pointer by a whole easing curve.
451
+ */
452
+ @layer components {
453
+ .iryx-drawer {
454
+ transition: transform 300ms var(--iryx-drawer-ease);
455
+ }
456
+
457
+ .iryx-drawer[data-swipe-direction="up"],
458
+ .iryx-drawer[data-swipe-direction="down"] {
459
+ transform: translate3d(
460
+ 0,
461
+ calc(var(--drawer-swipe-movement-y, 0px) + var(--drawer-snap-point-offset, 0px)),
462
+ 0
463
+ );
464
+ }
465
+
466
+ .iryx-drawer[data-swipe-direction="left"],
467
+ .iryx-drawer[data-swipe-direction="right"] {
468
+ transform: translate3d(
469
+ calc(var(--drawer-swipe-movement-x, 0px) + var(--drawer-snap-point-offset, 0px)),
470
+ 0,
471
+ 0
472
+ );
473
+ }
474
+
475
+ .iryx-drawer[data-swiping] {
476
+ transition-duration: 0ms;
477
+ }
478
+ }
479
+
480
+
481
+ /*
482
+ * `ITable`'s refresh indicator — an indeterminate bar running along the rule
483
+ * between the header and the first row, which is where a table conventionally
484
+ * reports progress. Shown on every load after the first; the initial load has
485
+ * no rows yet and uses skeletons instead.
486
+ *
487
+ * Plain CSS rather than utilities for the same reason as the drawer's drag
488
+ * plumbing: it is a keyframed `background-position` on a pseudo-element, and
489
+ * there is no class name for Tailwind to generate.
490
+ *
491
+ * `position: relative` on `<thead>` is what anchors the bar to the header's own
492
+ * box, so it lands on the divider at any header height and follows the table
493
+ * when it scrolls sideways.
494
+ */
495
+ @layer components {
496
+ .iryx-table-loading {
497
+ position: relative;
498
+ }
499
+
500
+ .iryx-table-loading::after {
501
+ content: "";
502
+ position: absolute;
503
+ inset-inline: 0;
504
+ /* Sits on the header's 1px bottom rule rather than below it. */
505
+ bottom: -1px;
506
+ height: 2px;
507
+ background-image: linear-gradient(
508
+ 90deg,
509
+ transparent 0%,
510
+ var(--iryx-primary) 50%,
511
+ transparent 100%
512
+ );
513
+ background-repeat: no-repeat;
514
+ background-size: 40% 100%;
515
+ animation: iryx-table-loading 1.3s ease-in-out infinite;
516
+ pointer-events: none;
517
+ }
518
+
519
+ @keyframes iryx-table-loading {
520
+ from {
521
+ background-position: -40% 0;
522
+ }
523
+ to {
524
+ background-position: 140% 0;
525
+ }
526
+ }
527
+
528
+ /*
529
+ * `animation: none` is safe here, unlike on the dialog and drawer: nothing
530
+ * waits on `animationend`, so removing the animation cannot strand a Presence
531
+ * unmount. A steady rule still reports "busy" without the motion.
532
+ */
533
+ @media (prefers-reduced-motion: reduce) {
534
+ .iryx-table-loading::after {
535
+ animation: none !important;
536
+ background-image: none;
537
+ background-color: color-mix(in oklab, var(--iryx-primary) 50%, transparent);
538
+ }
539
+ }
540
+ }
541
+
542
+ /*
543
+ * Reduced motion.
544
+ *
545
+ * A reader who has asked their OS to reduce motion has asked for it once, for
546
+ * everything — so this is a blanket rule rather than a per-component prop.
547
+ * It lives in `theme.css`, which an app opts into by importing, and it takes
548
+ * effect only under that explicit preference.
549
+ *
550
+ * **Near-zero durations, never `animation: none`.** Reka's `Presence` unmounts
551
+ * a dialog, drawer, popover or toast when its exit animation raises
552
+ * `animationend`. Remove the animation outright and that event never fires, so
553
+ * the element stays mounted forever and the overlay can never be closed twice.
554
+ * `0.01ms` finishes imperceptibly *and* still fires the event.
555
+ *
556
+ * `animation-iteration-count: 1` stops an infinite loop from repainting
557
+ * forever at 0.01ms a cycle. The two loaders that rely on looping are handled
558
+ * below, because "run once instantly" would park them where their last
559
+ * keyframe leaves them — which for the indeterminate progress bar is off the
560
+ * end of its own track.
561
+ */
562
+ @media (prefers-reduced-motion: reduce) {
563
+ *,
564
+ *::before,
565
+ *::after {
566
+ animation-duration: 0.01ms !important;
567
+ animation-delay: 0.01ms !important;
568
+ animation-iteration-count: 1 !important;
569
+ transition-duration: 0.01ms !important;
570
+ transition-delay: 0s !important;
571
+ scroll-behavior: auto !important;
572
+ }
573
+
574
+ /*
575
+ * The indeterminate progress bar travels from -100% to 300%, so running it
576
+ * once and stopping leaves the indicator outside the track and the component
577
+ * reads as empty. Parked at the start instead: a short static bar still says
578
+ * "working, length unknown", which is the whole message.
579
+ *
580
+ * Safe to remove outright — unlike the overlays above, nothing is waiting on
581
+ * `animationend` here.
582
+ */
583
+ .iryx-progress-indeterminate {
584
+ animation: none !important;
585
+ transform: none !important;
586
+ }
587
+ }