@remix-run/ui 0.3.0 → 0.4.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 (308) hide show
  1. package/README.md +50 -164
  2. package/dist/accordion/index.d.ts +46 -0
  3. package/dist/accordion/index.js +142 -0
  4. package/dist/accordion/index.js.map +1 -0
  5. package/dist/accordion/primitives.d.ts +104 -0
  6. package/dist/accordion/primitives.js +312 -0
  7. package/dist/accordion/primitives.js.map +1 -0
  8. package/dist/{components/anchor/anchor.js → anchor/index.js} +1 -1
  9. package/dist/anchor/index.js.map +1 -0
  10. package/dist/animation/demos/reordering.js +9 -6
  11. package/dist/animation/demos/reordering.js.map +1 -1
  12. package/dist/{components/breadcrumbs/breadcrumbs.js → breadcrumbs/index.js} +19 -19
  13. package/dist/breadcrumbs/index.js.map +1 -0
  14. package/dist/button/index.d.ts +15 -0
  15. package/dist/button/index.js +128 -0
  16. package/dist/button/index.js.map +1 -0
  17. package/dist/checkbox/index.d.ts +14 -0
  18. package/dist/checkbox/index.js +125 -0
  19. package/dist/checkbox/index.js.map +1 -0
  20. package/dist/combobox/index.d.ts +21 -0
  21. package/dist/combobox/index.js +58 -0
  22. package/dist/combobox/index.js.map +1 -0
  23. package/dist/{components/combobox/combobox.d.ts → combobox/primitives.d.ts} +3 -7
  24. package/dist/{components/combobox/combobox.js → combobox/primitives.js} +8 -61
  25. package/dist/combobox/primitives.js.map +1 -0
  26. package/dist/input/index.d.ts +13 -0
  27. package/dist/input/index.js +121 -0
  28. package/dist/input/index.js.map +1 -0
  29. package/dist/listbox/flash-attribute.js.map +1 -0
  30. package/dist/{components/listbox/listbox.d.ts → listbox/index.d.ts} +2 -6
  31. package/dist/{components/listbox/listbox.js → listbox/index.js} +4 -82
  32. package/dist/listbox/index.js.map +1 -0
  33. package/dist/menu/hover-aim.js.map +1 -0
  34. package/dist/menu/index.d.ts +42 -0
  35. package/dist/menu/index.js +250 -0
  36. package/dist/menu/index.js.map +1 -0
  37. package/dist/{components/menu/menu.d.ts → menu/primitives.d.ts} +3 -32
  38. package/dist/{components/menu/menu.js → menu/primitives.js} +97 -314
  39. package/dist/menu/primitives.js.map +1 -0
  40. package/dist/{components/popover/popover.d.ts → popover/index.d.ts} +2 -4
  41. package/dist/{components/popover/popover.js → popover/index.js} +5 -48
  42. package/dist/popover/index.js.map +1 -0
  43. package/dist/{interactions/outside-click/outside-click-mixin.js → popover/outside-click.js} +1 -1
  44. package/dist/popover/outside-click.js.map +1 -0
  45. package/dist/popover/scroll-lock.d.ts +1 -0
  46. package/dist/{utils → popover}/scroll-lock.js +0 -18
  47. package/dist/popover/scroll-lock.js.map +1 -0
  48. package/dist/radio/index.d.ts +12 -0
  49. package/dist/radio/index.js +77 -0
  50. package/dist/radio/index.js.map +1 -0
  51. package/dist/runtime/reconcile.js +11 -5
  52. package/dist/runtime/reconcile.js.map +1 -1
  53. package/dist/runtime/vdom.js +3 -0
  54. package/dist/runtime/vdom.js.map +1 -1
  55. package/dist/select/index.d.ts +19 -0
  56. package/dist/select/index.js +95 -0
  57. package/dist/select/index.js.map +1 -0
  58. package/dist/select/keydown.js.map +1 -0
  59. package/dist/{components/select/select.d.ts → select/primitives.d.ts} +4 -6
  60. package/dist/{components/select/select.js → select/primitives.js} +11 -63
  61. package/dist/select/primitives.js.map +1 -0
  62. package/dist/server/stream.js +2 -2
  63. package/dist/server/stream.js.map +1 -1
  64. package/dist/shared/focus-styles.d.ts +1 -0
  65. package/dist/shared/focus-styles.js +2 -0
  66. package/dist/shared/focus-styles.js.map +1 -0
  67. package/dist/shared/icons.d.ts +9 -0
  68. package/dist/shared/icons.js +42 -0
  69. package/dist/shared/icons.js.map +1 -0
  70. package/dist/shared/listbox-popover-styles.d.ts +6 -0
  71. package/dist/shared/listbox-popover-styles.js +137 -0
  72. package/dist/shared/listbox-popover-styles.js.map +1 -0
  73. package/dist/shared/style-values.d.ts +78 -0
  74. package/dist/{theme/presets/rmx-01/index.js → shared/style-values.js} +3 -34
  75. package/dist/shared/style-values.js.map +1 -0
  76. package/dist/{interactions/typeahead/typeahead-mixin.js → shared/typeahead.js} +1 -1
  77. package/dist/shared/typeahead.js.map +1 -0
  78. package/dist/shared/wait-for-css-transition.js.map +1 -0
  79. package/dist/shared/wait.js.map +1 -0
  80. package/dist/tabs/index.d.ts +32 -0
  81. package/dist/tabs/index.js +157 -0
  82. package/dist/tabs/index.js.map +1 -0
  83. package/dist/tabs/primitives.d.ts +57 -0
  84. package/dist/tabs/primitives.js +238 -0
  85. package/dist/tabs/primitives.js.map +1 -0
  86. package/dist/toggle/index.d.ts +9 -0
  87. package/dist/toggle/index.js +108 -0
  88. package/dist/toggle/index.js.map +1 -0
  89. package/dist/toggle/primitives.d.ts +29 -0
  90. package/dist/toggle/primitives.js +127 -0
  91. package/dist/toggle/primitives.js.map +1 -0
  92. package/package.json +73 -44
  93. package/src/{components/accordion → accordion}/README.md +50 -14
  94. package/src/accordion/index.tsx +285 -0
  95. package/src/accordion/primitives.tsx +512 -0
  96. package/src/{components/anchor → anchor}/README.md +37 -2
  97. package/src/animation/demos/reordering.tsx +9 -6
  98. package/src/{components/breadcrumbs → breadcrumbs}/README.md +4 -4
  99. package/src/{components/breadcrumbs/breadcrumbs.tsx → breadcrumbs/index.tsx} +18 -18
  100. package/src/button/README.md +44 -0
  101. package/src/button/index.ts +168 -0
  102. package/src/checkbox/README.md +59 -0
  103. package/src/checkbox/index.ts +162 -0
  104. package/src/{components/combobox → combobox}/README.md +58 -9
  105. package/src/combobox/index.tsx +112 -0
  106. package/src/{components/combobox/combobox.tsx → combobox/primitives.tsx} +5 -91
  107. package/src/input/README.md +52 -0
  108. package/src/input/index.ts +147 -0
  109. package/src/{components/listbox → listbox}/README.md +9 -41
  110. package/src/{components/listbox/listbox.ts → listbox/index.ts} +2 -87
  111. package/src/{components/menu → menu}/README.md +55 -14
  112. package/src/menu/index.tsx +354 -0
  113. package/src/{components/menu/menu.tsx → menu/primitives.tsx} +99 -413
  114. package/src/{components/popover → popover}/README.md +20 -39
  115. package/src/{components/popover/popover.ts → popover/index.ts} +3 -57
  116. package/src/{utils → popover}/scroll-lock.ts +0 -28
  117. package/src/radio/README.md +53 -0
  118. package/src/radio/index.ts +100 -0
  119. package/src/runtime/demos/readme.demo.tsx +16 -14
  120. package/src/runtime/reconcile.ts +11 -5
  121. package/src/runtime/vdom.ts +3 -0
  122. package/src/{components/select → select}/README.md +29 -19
  123. package/src/select/index.tsx +159 -0
  124. package/src/{components/select/select.tsx → select/primitives.tsx} +10 -98
  125. package/src/server/stream.ts +3 -3
  126. package/src/shared/focus-styles.ts +2 -0
  127. package/src/shared/icons.tsx +62 -0
  128. package/src/shared/listbox-popover-styles.ts +146 -0
  129. package/src/shared/style-values.ts +165 -0
  130. package/src/tabs/README.md +141 -0
  131. package/src/tabs/index.tsx +244 -0
  132. package/src/tabs/primitives.ts +365 -0
  133. package/src/toggle/README.md +56 -0
  134. package/src/toggle/index.tsx +134 -0
  135. package/src/toggle/primitives.ts +192 -0
  136. package/dist/animation/demos/animation.demo.d.ts +0 -5
  137. package/dist/animation/demos/animation.demo.js +0 -92
  138. package/dist/animation/demos/animation.demo.js.map +0 -1
  139. package/dist/animation/demos/spring.demo.d.ts +0 -6
  140. package/dist/animation/demos/spring.demo.js +0 -304
  141. package/dist/animation/demos/spring.demo.js.map +0 -1
  142. package/dist/components/accordion/accordion.d.ts +0 -92
  143. package/dist/components/accordion/accordion.js +0 -335
  144. package/dist/components/accordion/accordion.js.map +0 -1
  145. package/dist/components/accordion/demos/card.demo.d.ts +0 -7
  146. package/dist/components/accordion/demos/card.demo.js +0 -59
  147. package/dist/components/accordion/demos/card.demo.js.map +0 -1
  148. package/dist/components/accordion/demos/multiple.demo.d.ts +0 -7
  149. package/dist/components/accordion/demos/multiple.demo.js +0 -20
  150. package/dist/components/accordion/demos/multiple.demo.js.map +0 -1
  151. package/dist/components/accordion/demos/overview.demo.d.ts +0 -7
  152. package/dist/components/accordion/demos/overview.demo.js +0 -20
  153. package/dist/components/accordion/demos/overview.demo.js.map +0 -1
  154. package/dist/components/anchor/anchor.js.map +0 -1
  155. package/dist/components/breadcrumbs/basic.demo.d.ts +0 -6
  156. package/dist/components/breadcrumbs/basic.demo.js +0 -15
  157. package/dist/components/breadcrumbs/basic.demo.js.map +0 -1
  158. package/dist/components/breadcrumbs/breadcrumbs.js.map +0 -1
  159. package/dist/components/breadcrumbs/separator.demo.d.ts +0 -6
  160. package/dist/components/breadcrumbs/separator.demo.js +0 -15
  161. package/dist/components/breadcrumbs/separator.demo.js.map +0 -1
  162. package/dist/components/button/button.d.ts +0 -105
  163. package/dist/components/button/button.js +0 -207
  164. package/dist/components/button/button.js.map +0 -1
  165. package/dist/components/button/demos/aliases.demo.d.ts +0 -7
  166. package/dist/components/button/demos/aliases.demo.js +0 -19
  167. package/dist/components/button/demos/aliases.demo.js.map +0 -1
  168. package/dist/components/button/demos/basic.demo.d.ts +0 -7
  169. package/dist/components/button/demos/basic.demo.js +0 -20
  170. package/dist/components/button/demos/basic.demo.js.map +0 -1
  171. package/dist/components/button/demos/states.demo.d.ts +0 -7
  172. package/dist/components/button/demos/states.demo.js +0 -30
  173. package/dist/components/button/demos/states.demo.js.map +0 -1
  174. package/dist/components/combobox/combobox.js.map +0 -1
  175. package/dist/components/combobox/overview.demo.d.ts +0 -7
  176. package/dist/components/combobox/overview.demo.js +0 -154
  177. package/dist/components/combobox/overview.demo.js.map +0 -1
  178. package/dist/components/glyph/glyph.d.ts +0 -14
  179. package/dist/components/glyph/glyph.js +0 -65
  180. package/dist/components/glyph/glyph.js.map +0 -1
  181. package/dist/components/listbox/listbox.js.map +0 -1
  182. package/dist/components/listbox/overview.demo.d.ts +0 -7
  183. package/dist/components/listbox/overview.demo.js +0 -65
  184. package/dist/components/listbox/overview.demo.js.map +0 -1
  185. package/dist/components/menu/demos/bubbling.demo.d.ts +0 -6
  186. package/dist/components/menu/demos/bubbling.demo.js +0 -16
  187. package/dist/components/menu/demos/bubbling.demo.js.map +0 -1
  188. package/dist/components/menu/demos/context-trigger.demo.d.ts +0 -7
  189. package/dist/components/menu/demos/context-trigger.demo.js +0 -87
  190. package/dist/components/menu/demos/context-trigger.demo.js.map +0 -1
  191. package/dist/components/menu/demos/overview.demo.d.ts +0 -7
  192. package/dist/components/menu/demos/overview.demo.js +0 -33
  193. package/dist/components/menu/demos/overview.demo.js.map +0 -1
  194. package/dist/components/menu/hover-aim.js.map +0 -1
  195. package/dist/components/menu/menu.js.map +0 -1
  196. package/dist/components/popover/overview.demo.d.ts +0 -7
  197. package/dist/components/popover/overview.demo.js +0 -65
  198. package/dist/components/popover/overview.demo.js.map +0 -1
  199. package/dist/components/popover/popover.js.map +0 -1
  200. package/dist/components/select/deconstructed.demo.d.ts +0 -7
  201. package/dist/components/select/deconstructed.demo.js +0 -54
  202. package/dist/components/select/deconstructed.demo.js.map +0 -1
  203. package/dist/components/select/overview.demo.d.ts +0 -6
  204. package/dist/components/select/overview.demo.js +0 -28
  205. package/dist/components/select/overview.demo.js.map +0 -1
  206. package/dist/components/select/select.js.map +0 -1
  207. package/dist/components/separator/separator.d.ts +0 -2
  208. package/dist/components/separator/separator.js +0 -15
  209. package/dist/components/separator/separator.js.map +0 -1
  210. package/dist/components/tabs/tabs.d.ts +0 -78
  211. package/dist/components/tabs/tabs.js +0 -339
  212. package/dist/components/tabs/tabs.js.map +0 -1
  213. package/dist/interactions/keydown/keydown.js.map +0 -1
  214. package/dist/interactions/outside-click/outside-click-mixin.js.map +0 -1
  215. package/dist/interactions/typeahead/typeahead-mixin.js.map +0 -1
  216. package/dist/runtime/demos/basic.demo.d.ts +0 -6
  217. package/dist/runtime/demos/basic.demo.js +0 -16
  218. package/dist/runtime/demos/basic.demo.js.map +0 -1
  219. package/dist/runtime/demos/controlled-uncontrolled-values.demo.d.ts +0 -6
  220. package/dist/runtime/demos/controlled-uncontrolled-values.demo.js +0 -77
  221. package/dist/runtime/demos/controlled-uncontrolled-values.demo.js.map +0 -1
  222. package/dist/runtime/demos/keyed-list.demo.d.ts +0 -6
  223. package/dist/runtime/demos/keyed-list.demo.js +0 -62
  224. package/dist/runtime/demos/keyed-list.demo.js.map +0 -1
  225. package/dist/runtime/demos/readme.demo.d.ts +0 -5
  226. package/dist/runtime/demos/readme.demo.js +0 -396
  227. package/dist/runtime/demos/readme.demo.js.map +0 -1
  228. package/dist/theme/contract.d.ts +0 -61
  229. package/dist/theme/contract.js +0 -131
  230. package/dist/theme/contract.js.map +0 -1
  231. package/dist/theme/glyph-contract.d.ts +0 -11
  232. package/dist/theme/glyph-contract.js +0 -34
  233. package/dist/theme/glyph-contract.js.map +0 -1
  234. package/dist/theme/presets/rmx-01/glyphs.d.ts +0 -2
  235. package/dist/theme/presets/rmx-01/glyphs.js +0 -252
  236. package/dist/theme/presets/rmx-01/glyphs.js.map +0 -1
  237. package/dist/theme/presets/rmx-01/index.d.ts +0 -4
  238. package/dist/theme/presets/rmx-01/index.js.map +0 -1
  239. package/dist/theme/runtime.d.ts +0 -2
  240. package/dist/theme/runtime.js +0 -84
  241. package/dist/theme/runtime.js.map +0 -1
  242. package/dist/theme/theme.d.ts +0 -6
  243. package/dist/theme/theme.js +0 -5
  244. package/dist/theme/theme.js.map +0 -1
  245. package/dist/utils/flash-attribute.js.map +0 -1
  246. package/dist/utils/scroll-lock.d.ts +0 -3
  247. package/dist/utils/scroll-lock.js.map +0 -1
  248. package/dist/utils/wait-for-css-transition.js.map +0 -1
  249. package/dist/utils/wait.js.map +0 -1
  250. package/src/animation/demos/animation.demo.tsx +0 -194
  251. package/src/animation/demos/spring.demo.tsx +0 -385
  252. package/src/components/accordion/accordion.tsx +0 -565
  253. package/src/components/accordion/demos/card.demo.tsx +0 -114
  254. package/src/components/accordion/demos/multiple.demo.tsx +0 -57
  255. package/src/components/accordion/demos/overview.demo.tsx +0 -57
  256. package/src/components/breadcrumbs/basic.demo.tsx +0 -18
  257. package/src/components/breadcrumbs/separator.demo.tsx +0 -19
  258. package/src/components/button/README.md +0 -44
  259. package/src/components/button/button.tsx +0 -286
  260. package/src/components/button/demos/aliases.demo.tsx +0 -28
  261. package/src/components/button/demos/basic.demo.tsx +0 -31
  262. package/src/components/button/demos/states.demo.tsx +0 -53
  263. package/src/components/combobox/overview.demo.tsx +0 -200
  264. package/src/components/glyph/README.md +0 -72
  265. package/src/components/glyph/glyph.tsx +0 -110
  266. package/src/components/listbox/overview.demo.tsx +0 -102
  267. package/src/components/menu/demos/bubbling.demo.tsx +0 -35
  268. package/src/components/menu/demos/context-trigger.demo.tsx +0 -133
  269. package/src/components/menu/demos/overview.demo.tsx +0 -77
  270. package/src/components/popover/overview.demo.tsx +0 -144
  271. package/src/components/select/deconstructed.demo.tsx +0 -96
  272. package/src/components/select/overview.demo.tsx +0 -52
  273. package/src/components/separator/separator.ts +0 -19
  274. package/src/components/tabs/README.md +0 -105
  275. package/src/components/tabs/tabs.tsx +0 -504
  276. package/src/runtime/demos/basic.demo.tsx +0 -21
  277. package/src/runtime/demos/controlled-uncontrolled-values.demo.tsx +0 -177
  278. package/src/runtime/demos/keyed-list.demo.tsx +0 -94
  279. package/src/theme/README.md +0 -103
  280. package/src/theme/contract.ts +0 -215
  281. package/src/theme/glyph-contract.ts +0 -59
  282. package/src/theme/presets/rmx-01/glyphs.tsx +0 -308
  283. package/src/theme/presets/rmx-01/index.ts +0 -123
  284. package/src/theme/runtime.ts +0 -119
  285. package/src/theme/theme.ts +0 -15
  286. package/src/utils/scroll-lock/README.md +0 -33
  287. /package/dist/{components/anchor/anchor.d.ts → anchor/index.d.ts} +0 -0
  288. /package/dist/{components/breadcrumbs/breadcrumbs.d.ts → breadcrumbs/index.d.ts} +0 -0
  289. /package/dist/{utils → listbox}/flash-attribute.d.ts +0 -0
  290. /package/dist/{utils → listbox}/flash-attribute.js +0 -0
  291. /package/dist/{components/menu → menu}/hover-aim.d.ts +0 -0
  292. /package/dist/{components/menu → menu}/hover-aim.js +0 -0
  293. /package/dist/{interactions/outside-click/outside-click-mixin.d.ts → popover/outside-click.d.ts} +0 -0
  294. /package/dist/{interactions/keydown → select}/keydown.d.ts +0 -0
  295. /package/dist/{interactions/keydown → select}/keydown.js +0 -0
  296. /package/dist/{interactions/typeahead/typeahead-mixin.d.ts → shared/typeahead.d.ts} +0 -0
  297. /package/dist/{utils → shared}/wait-for-css-transition.d.ts +0 -0
  298. /package/dist/{utils → shared}/wait-for-css-transition.js +0 -0
  299. /package/dist/{utils → shared}/wait.d.ts +0 -0
  300. /package/dist/{utils → shared}/wait.js +0 -0
  301. /package/src/{components/anchor/anchor.ts → anchor/index.ts} +0 -0
  302. /package/src/{utils → listbox}/flash-attribute.ts +0 -0
  303. /package/src/{components/menu → menu}/hover-aim.ts +0 -0
  304. /package/src/{interactions/outside-click/outside-click-mixin.ts → popover/outside-click.ts} +0 -0
  305. /package/src/{interactions/keydown → select}/keydown.ts +0 -0
  306. /package/src/{interactions/typeahead/typeahead-mixin.ts → shared/typeahead.ts} +0 -0
  307. /package/src/{utils → shared}/wait-for-css-transition.ts +0 -0
  308. /package/src/{utils → shared}/wait.ts +0 -0
@@ -0,0 +1,108 @@
1
+ import { createMixin, css } from '@remix-run/ui';
2
+ import { renderMixinElement } from "../runtime/mixins/mixin.js";
3
+ import { controlFocusShadow } from "../shared/focus-styles.js";
4
+ export { ToggleChangeEvent, onToggleChange } from '@remix-run/ui/toggle/primitives';
5
+ const checkedSelector = '&:checked, &[aria-checked="true"], &[data-state="checked"]';
6
+ const checkedThumbSelector = '&:checked::before, &[aria-checked="true"]::before, &[data-state="checked"]::before';
7
+ const uncheckedThumbBackground = 'linear-gradient(180deg, rgba(0, 0, 0, 0) 33%, rgba(0, 0, 0, 0.04) 100%), #FFFFFF';
8
+ const uncheckedThumbShadow = '0 0 0 0.5px rgba(0, 0, 0, 0.06), 0 1px 1px -0.5px rgba(0, 0, 0, 0.12), 0 2px 2px -1px rgba(0, 0, 0, 0.12), 0 4px 4px -2px rgba(0, 0, 0, 0.12), inset 0 0 2px 1px #FFFFFF';
9
+ const checkedThumbBackground = 'linear-gradient(180deg, rgba(112, 199, 84, 0) 25%, rgba(112, 199, 84, 0.25) 100%), #FFFFFF';
10
+ const checkedThumbShadow = '0 1px 2px -0.5px rgba(66, 134, 44, 0.6), 0 2px 4px -1px rgba(66, 134, 44, 0.6), 0 4px 6px -2px rgba(66, 134, 44, 0.6), 0 0 0 0.5px rgba(0, 0, 0, 0.28), inset 0 0 2px 1px #FFFFFF';
11
+ const toggleDefaultAttrs = createMixin((handle, hostType) => (props) => {
12
+ if (hostType !== 'input') {
13
+ return handle.element;
14
+ }
15
+ let type = props.type ?? 'checkbox';
16
+ if (type !== 'checkbox') {
17
+ return renderMixinElement(handle.element, {
18
+ ...props,
19
+ type,
20
+ });
21
+ }
22
+ return renderMixinElement(handle.element, {
23
+ ...props,
24
+ role: props.role ?? 'switch',
25
+ type,
26
+ });
27
+ })();
28
+ const baseStyles = {
29
+ appearance: 'none',
30
+ WebkitAppearance: 'none',
31
+ margin: 0,
32
+ boxSizing: 'border-box',
33
+ position: 'relative',
34
+ display: 'inline-block',
35
+ width: 'var(--rmx-toggle-width)',
36
+ height: 'var(--rmx-toggle-height)',
37
+ minWidth: 'var(--rmx-toggle-width)',
38
+ minHeight: 'var(--rmx-toggle-height)',
39
+ padding: 0,
40
+ border: 0,
41
+ borderRadius: '9999px',
42
+ background: 'linear-gradient(180deg, rgba(0, 0, 0, 0.06) 0%, rgba(0, 0, 0, 0) 100%), #EBEBEB',
43
+ boxShadow: 'inset 0 0 4px 1px rgba(0, 0, 0, 0.08), inset 0 1px 1px rgba(0, 0, 0, 0.02), inset 0 2px 2px rgba(0, 0, 0, 0.02)',
44
+ verticalAlign: 'middle',
45
+ flex: 'none',
46
+ '&::before': {
47
+ content: '""',
48
+ position: 'absolute',
49
+ left: 'var(--rmx-toggle-thumb-inset)',
50
+ top: 'calc((var(--rmx-toggle-height) - var(--rmx-toggle-thumb-height)) / 2)',
51
+ width: 'var(--rmx-toggle-thumb-width)',
52
+ height: 'var(--rmx-toggle-thumb-height)',
53
+ borderRadius: '99px',
54
+ background: uncheckedThumbBackground,
55
+ boxShadow: uncheckedThumbShadow,
56
+ transform: 'translateX(0)',
57
+ transition: 'transform 160ms ease, background 160ms ease, box-shadow 160ms ease',
58
+ pointerEvents: 'none',
59
+ },
60
+ '&:disabled, &[aria-disabled="true"]': {
61
+ opacity: 0.55,
62
+ },
63
+ [checkedSelector]: {
64
+ background: 'linear-gradient(180deg, #70C754 0%, #70C754 100%)',
65
+ boxShadow: '0 1px 0 rgba(255, 255, 255, 0.4), 0 0 0 1px rgba(255, 255, 255, 0.4), 0 -4px 8px 2px #FFFFFF, 0 4px 8px 2px rgba(0, 0, 0, 0.05), 0 0 12px 1px rgba(112, 199, 84, 0.25), inset 0 0 4px 1px rgba(0, 0, 0, 0.25), inset 0 1px 1px rgba(0, 0, 0, 0.1), inset 0 2px 2px rgba(0, 0, 0, 0.1)',
66
+ },
67
+ [checkedThumbSelector]: {
68
+ background: checkedThumbBackground,
69
+ boxShadow: checkedThumbShadow,
70
+ transform: 'translateX(var(--rmx-toggle-thumb-translate-x))',
71
+ },
72
+ '&:focus-visible': {
73
+ outline: 0,
74
+ boxShadow: controlFocusShadow,
75
+ },
76
+ '@media (prefers-reduced-motion: reduce)': {
77
+ '&::before': {
78
+ transition: 'none',
79
+ },
80
+ },
81
+ };
82
+ const thumbTranslate = 'calc(var(--rmx-toggle-width) - var(--rmx-toggle-thumb-width) - (var(--rmx-toggle-thumb-inset) * 2))';
83
+ const sizeStyles = {
84
+ md: css({
85
+ '--rmx-toggle-width': '30px',
86
+ '--rmx-toggle-height': '18px',
87
+ '--rmx-toggle-thumb-width': '18px',
88
+ '--rmx-toggle-thumb-height': '14px',
89
+ '--rmx-toggle-thumb-inset': '2px',
90
+ '--rmx-toggle-thumb-translate-x': thumbTranslate,
91
+ ...baseStyles,
92
+ }),
93
+ lg: css({
94
+ '--rmx-toggle-width': '36px',
95
+ '--rmx-toggle-height': '22px',
96
+ '--rmx-toggle-thumb-width': '22px',
97
+ '--rmx-toggle-thumb-height': '18px',
98
+ '--rmx-toggle-thumb-inset': '2px',
99
+ '--rmx-toggle-thumb-translate-x': thumbTranslate,
100
+ ...baseStyles,
101
+ }),
102
+ };
103
+ export function toggle(options = {}) {
104
+ let { size = 'md' } = options;
105
+ return [toggleDefaultAttrs, sizeStyles[size]];
106
+ }
107
+ export default toggle;
108
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/toggle/index.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import { on } from '@remix-run/ui';
2
+ import type { Dispatched, ElementProps, MixinFactory } from '@remix-run/ui';
3
+ export interface ToggleControlOptions {
4
+ checked?: boolean;
5
+ defaultChecked?: boolean;
6
+ disabled?: boolean;
7
+ form?: string;
8
+ inputRef?: (input: HTMLInputElement, signal: AbortSignal) => void;
9
+ name?: string;
10
+ onCheckedChange?: (checked: boolean) => void;
11
+ readOnly?: boolean;
12
+ required?: boolean;
13
+ tabIndex?: number;
14
+ value?: string;
15
+ }
16
+ type ToggleChangeHandler<target extends HTMLElement> = (event: Dispatched<ToggleChangeEvent, target>, signal: AbortSignal) => void | Promise<void>;
17
+ declare const TOGGLE_CHANGE_EVENT: "rmx:toggle-change";
18
+ declare global {
19
+ interface HTMLElementEventMap {
20
+ [TOGGLE_CHANGE_EVENT]: ToggleChangeEvent;
21
+ }
22
+ }
23
+ export declare class ToggleChangeEvent extends Event {
24
+ readonly checked: boolean;
25
+ constructor(checked: boolean);
26
+ }
27
+ export declare const control: MixinFactory<HTMLElement, [options?: ToggleControlOptions | undefined], ElementProps>;
28
+ export declare function onToggleChange<target extends HTMLElement>(handler: ToggleChangeHandler<target>, captureBoolean?: boolean): ReturnType<typeof on<target, typeof TOGGLE_CHANGE_EVENT>>;
29
+ export {};
@@ -0,0 +1,127 @@
1
+ import { createElement, createMixin, on, ref } from '@remix-run/ui';
2
+ const TOGGLE_CHANGE_EVENT = 'rmx:toggle-change';
3
+ export class ToggleChangeEvent extends Event {
4
+ checked;
5
+ constructor(checked) {
6
+ super(TOGGLE_CHANGE_EVENT, { bubbles: true });
7
+ this.checked = checked;
8
+ }
9
+ }
10
+ function getBooleanState(value) {
11
+ return value === true || value === false ? value : undefined;
12
+ }
13
+ function propIsTrue(value) {
14
+ return value === true || value === 'true' || value === '';
15
+ }
16
+ function isDisabled(options, props) {
17
+ return (options.disabled === true || propIsTrue(props.disabled) || propIsTrue(props['aria-disabled']));
18
+ }
19
+ function isReadOnly(options, props) {
20
+ return (options.readOnly === true || propIsTrue(props.readOnly) || propIsTrue(props['aria-readonly']));
21
+ }
22
+ const controlMixin = createMixin((handle, hostType) => {
23
+ let uncontrolledChecked = false;
24
+ let hasInitialized = false;
25
+ function getChecked(options, props) {
26
+ let optionChecked = getBooleanState(options.checked);
27
+ if (optionChecked !== undefined) {
28
+ return optionChecked;
29
+ }
30
+ let propChecked = getBooleanState(props.checked);
31
+ if (propChecked !== undefined) {
32
+ return propChecked;
33
+ }
34
+ if (!hasInitialized) {
35
+ uncontrolledChecked =
36
+ getBooleanState(options.defaultChecked) ?? getBooleanState(props.defaultChecked) ?? false;
37
+ hasInitialized = true;
38
+ }
39
+ return uncontrolledChecked;
40
+ }
41
+ function setChecked(node, options, props, nextChecked) {
42
+ if (isDisabled(options, props) || isReadOnly(options, props)) {
43
+ if (node instanceof HTMLInputElement) {
44
+ node.checked = getChecked(options, props);
45
+ }
46
+ return;
47
+ }
48
+ if (options.checked === undefined && props.checked === undefined) {
49
+ uncontrolledChecked = nextChecked;
50
+ void handle.update();
51
+ }
52
+ options.onCheckedChange?.(nextChecked);
53
+ node.dispatchEvent(new ToggleChangeEvent(nextChecked));
54
+ }
55
+ return (options = {}, props) => {
56
+ let checked = getChecked(options, props);
57
+ let disabled = isDisabled(options, props);
58
+ let readOnly = isReadOnly(options, props);
59
+ let required = options.required ?? props.required;
60
+ let nextProps = {
61
+ ...props,
62
+ 'aria-checked': hostType === 'input' ? undefined : checked,
63
+ 'aria-disabled': hostType === 'input' ? undefined : disabled || undefined,
64
+ 'aria-readonly': hostType === 'input' ? undefined : readOnly || undefined,
65
+ 'aria-required': hostType === 'input' ? undefined : required || undefined,
66
+ checked: hostType === 'input' ? checked : props.checked,
67
+ defaultChecked: hostType === 'input' ? undefined : props.defaultChecked,
68
+ disabled: hostType === 'input' ? disabled || undefined : props.disabled,
69
+ form: hostType === 'input' ? (options.form ?? props.form) : props.form,
70
+ name: hostType === 'input' ? (options.name ?? props.name) : props.name,
71
+ readOnly: hostType === 'input' ? readOnly || undefined : props.readOnly,
72
+ required: hostType === 'input' ? required : props.required,
73
+ role: 'switch',
74
+ tabIndex: hostType === 'input'
75
+ ? (options.tabIndex ?? props.tabIndex)
76
+ : disabled
77
+ ? undefined
78
+ : (options.tabIndex ?? props.tabIndex ?? 0),
79
+ type: hostType === 'input'
80
+ ? props.type === undefined
81
+ ? 'checkbox'
82
+ : props.type
83
+ : hostType === 'button' && props.type === undefined
84
+ ? 'button'
85
+ : props.type,
86
+ value: hostType === 'input' ? (options.value ?? props.value) : props.value,
87
+ 'data-state': checked ? 'checked' : 'unchecked',
88
+ };
89
+ return createElement(handle.element, {
90
+ ...nextProps,
91
+ mix: [
92
+ ref((node, signal) => {
93
+ if (node instanceof HTMLInputElement) {
94
+ options.inputRef?.(node, signal);
95
+ }
96
+ }),
97
+ on('click', (event) => {
98
+ if (hostType !== 'input') {
99
+ event.preventDefault();
100
+ }
101
+ if (disabled || readOnly) {
102
+ if (event.currentTarget instanceof HTMLInputElement) {
103
+ event.currentTarget.checked = checked;
104
+ }
105
+ return;
106
+ }
107
+ let nextChecked = event.currentTarget instanceof HTMLInputElement
108
+ ? event.currentTarget.checked
109
+ : !checked;
110
+ setChecked(event.currentTarget, options, props, nextChecked);
111
+ }),
112
+ on('keydown', (event) => {
113
+ if (hostType === 'input' || event.key !== ' ') {
114
+ return;
115
+ }
116
+ event.preventDefault();
117
+ setChecked(event.currentTarget, options, props, !checked);
118
+ }),
119
+ ],
120
+ });
121
+ };
122
+ });
123
+ export const control = controlMixin;
124
+ export function onToggleChange(handler, captureBoolean) {
125
+ return on(TOGGLE_CHANGE_EVENT, handler, captureBoolean);
126
+ }
127
+ //# sourceMappingURL=primitives.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"primitives.js","sourceRoot":"","sources":["../../src/toggle/primitives.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@remix-run/ui",
3
- "version": "0.3.0",
4
- "description": "UI tokens, mixins, and glyphs for Remix components",
3
+ "version": "0.4.0",
4
+ "description": "UI runtime, headless primitives, and styled components for Remix",
5
5
  "author": "Ryan Florence <rpflorence@gmail.com>",
6
6
  "license": "MIT",
7
7
  "repository": {
@@ -15,6 +15,8 @@
15
15
  "README.md",
16
16
  "dist",
17
17
  "src",
18
+ "!src/**/*.demo.ts",
19
+ "!src/**/*.demo.tsx",
18
20
  "!src/**/*.test.ts",
19
21
  "!src/**/*.test.tsx"
20
22
  ],
@@ -26,28 +28,44 @@
26
28
  "default": "./dist/index.js"
27
29
  },
28
30
  "./accordion": {
29
- "types": "./dist/components/accordion/accordion.d.ts",
30
- "default": "./dist/components/accordion/accordion.js"
31
+ "types": "./dist/accordion/index.d.ts",
32
+ "default": "./dist/accordion/index.js"
33
+ },
34
+ "./accordion/primitives": {
35
+ "types": "./dist/accordion/primitives.d.ts",
36
+ "default": "./dist/accordion/primitives.js"
37
+ },
38
+ "./anchor": {
39
+ "types": "./dist/anchor/index.d.ts",
40
+ "default": "./dist/anchor/index.js"
31
41
  },
32
42
  "./animation": {
33
43
  "types": "./dist/animation/index.d.ts",
34
44
  "default": "./dist/animation/index.js"
35
45
  },
36
- "./anchor": {
37
- "types": "./dist/components/anchor/anchor.d.ts",
38
- "default": "./dist/components/anchor/anchor.js"
39
- },
40
46
  "./breadcrumbs": {
41
- "types": "./dist/components/breadcrumbs/breadcrumbs.d.ts",
42
- "default": "./dist/components/breadcrumbs/breadcrumbs.js"
47
+ "types": "./dist/breadcrumbs/index.d.ts",
48
+ "default": "./dist/breadcrumbs/index.js"
43
49
  },
44
50
  "./button": {
45
- "types": "./dist/components/button/button.d.ts",
46
- "default": "./dist/components/button/button.js"
51
+ "types": "./dist/button/index.d.ts",
52
+ "default": "./dist/button/index.js"
53
+ },
54
+ "./checkbox": {
55
+ "types": "./dist/checkbox/index.d.ts",
56
+ "default": "./dist/checkbox/index.js"
47
57
  },
48
58
  "./combobox": {
49
- "types": "./dist/components/combobox/combobox.d.ts",
50
- "default": "./dist/components/combobox/combobox.js"
59
+ "types": "./dist/combobox/index.d.ts",
60
+ "default": "./dist/combobox/index.js"
61
+ },
62
+ "./combobox/primitives": {
63
+ "types": "./dist/combobox/primitives.d.ts",
64
+ "default": "./dist/combobox/primitives.js"
65
+ },
66
+ "./input": {
67
+ "types": "./dist/input/index.d.ts",
68
+ "default": "./dist/input/index.js"
51
69
  },
52
70
  "./jsx-dev-runtime": {
53
71
  "types": "./dist/jsx-runtime.d.ts",
@@ -57,45 +75,57 @@
57
75
  "types": "./dist/jsx-runtime.d.ts",
58
76
  "default": "./dist/jsx-runtime.js"
59
77
  },
60
- "./glyph": {
61
- "types": "./dist/components/glyph/glyph.d.ts",
62
- "default": "./dist/components/glyph/glyph.js"
63
- },
64
78
  "./listbox": {
65
- "types": "./dist/components/listbox/listbox.d.ts",
66
- "default": "./dist/components/listbox/listbox.js"
79
+ "types": "./dist/listbox/index.d.ts",
80
+ "default": "./dist/listbox/index.js"
67
81
  },
68
82
  "./menu": {
69
- "types": "./dist/components/menu/menu.d.ts",
70
- "default": "./dist/components/menu/menu.js"
83
+ "types": "./dist/menu/index.d.ts",
84
+ "default": "./dist/menu/index.js"
85
+ },
86
+ "./menu/primitives": {
87
+ "types": "./dist/menu/primitives.d.ts",
88
+ "default": "./dist/menu/primitives.js"
71
89
  },
72
90
  "./popover": {
73
- "types": "./dist/components/popover/popover.d.ts",
74
- "default": "./dist/components/popover/popover.js"
91
+ "types": "./dist/popover/index.d.ts",
92
+ "default": "./dist/popover/index.js"
93
+ },
94
+ "./radio": {
95
+ "types": "./dist/radio/index.d.ts",
96
+ "default": "./dist/radio/index.js"
75
97
  },
76
98
  "./select": {
77
- "types": "./dist/components/select/select.d.ts",
78
- "default": "./dist/components/select/select.js"
99
+ "types": "./dist/select/index.d.ts",
100
+ "default": "./dist/select/index.js"
79
101
  },
80
- "./separator": {
81
- "types": "./dist/components/separator/separator.d.ts",
82
- "default": "./dist/components/separator/separator.js"
102
+ "./select/primitives": {
103
+ "types": "./dist/select/primitives.d.ts",
104
+ "default": "./dist/select/primitives.js"
83
105
  },
84
106
  "./server": {
85
107
  "types": "./dist/server/stream.d.ts",
86
108
  "default": "./dist/server/stream.js"
87
109
  },
110
+ "./tabs": {
111
+ "types": "./dist/tabs/index.d.ts",
112
+ "default": "./dist/tabs/index.js"
113
+ },
114
+ "./tabs/primitives": {
115
+ "types": "./dist/tabs/primitives.d.ts",
116
+ "default": "./dist/tabs/primitives.js"
117
+ },
88
118
  "./test": {
89
119
  "types": "./dist/test.d.ts",
90
120
  "default": "./dist/test.js"
91
121
  },
92
- "./theme": {
93
- "types": "./dist/theme/theme.d.ts",
94
- "default": "./dist/theme/theme.js"
122
+ "./toggle": {
123
+ "types": "./dist/toggle/index.d.ts",
124
+ "default": "./dist/toggle/index.js"
95
125
  },
96
- "./scroll-lock": {
97
- "types": "./dist/utils/scroll-lock.d.ts",
98
- "default": "./dist/utils/scroll-lock.js"
126
+ "./toggle/primitives": {
127
+ "types": "./dist/toggle/primitives.d.ts",
128
+ "default": "./dist/toggle/primitives.js"
99
129
  },
100
130
  "./package.json": "./package.json"
101
131
  },
@@ -104,8 +134,8 @@
104
134
  "@typescript/native-preview": "7.0.0-dev.20251125.1",
105
135
  "playwright": "^1.60.0",
106
136
  "typescript": "^5.9.3",
107
- "@remix-run/assert": "0.2.1",
108
- "@remix-run/test": "0.4.2"
137
+ "@remix-run/assert": "0.3.0",
138
+ "@remix-run/test": "0.5.0"
109
139
  },
110
140
  "dependencies": {
111
141
  "@types/dom-navigation": "^1.0.7"
@@ -113,18 +143,17 @@
113
143
  "keywords": [
114
144
  "remix",
115
145
  "ui",
116
- "theming",
117
- "design-tokens",
118
- "css-variables",
146
+ "headless",
147
+ "components",
119
148
  "mixins",
120
- "glyphs",
121
- "component-styling"
149
+ "runtime",
150
+ "primitives"
122
151
  ],
123
152
  "scripts": {
124
153
  "build": "tsc -p tsconfig.build.json",
125
154
  "clean": "git clean -fdX",
126
- "lint": "pnpm -w exec oxlint packages/ui -A all --quiet",
127
- "lint:fix": "pnpm -w exec oxlint packages/ui -A all --fix --quiet",
155
+ "lint": "pnpm -w exec oxlint packages/ui --max-warnings=0",
156
+ "lint:fix": "pnpm -w exec oxlint packages/ui --fix --max-warnings=0",
128
157
  "test": "remix-test",
129
158
  "test:coverage": "remix-test --coverage",
130
159
  "test:watch": "remix-test --watch",
@@ -2,7 +2,7 @@
2
2
 
3
3
  `Accordion` renders a disclosure set with one or more expandable items. Use it for grouped settings, FAQ sections, and dense panels where each item owns a trigger and content region.
4
4
 
5
- ## Usage
5
+ ## Component Usage
6
6
 
7
7
  ```tsx
8
8
  import { Accordion, AccordionContent, AccordionItem, AccordionTrigger } from 'remix/ui/accordion'
@@ -82,16 +82,11 @@ export function ControlledAccordion(handle: Handle) {
82
82
  }
83
83
  ```
84
84
 
85
- Listen for bubbling `AccordionChangeEvent` events with `onAccordionChange`.
85
+ Listen for bubbling `AccordionChangeEvent` events with `onAccordionChange` from `remix/ui/accordion/primitives`.
86
86
 
87
87
  ```tsx
88
- import {
89
- Accordion,
90
- AccordionContent,
91
- AccordionItem,
92
- AccordionTrigger,
93
- onAccordionChange,
94
- } from 'remix/ui/accordion'
88
+ import { onAccordionChange } from 'remix/ui/accordion/primitives'
89
+ import { Accordion, AccordionContent, AccordionItem, AccordionTrigger } from 'remix/ui/accordion'
95
90
 
96
91
  export function TrackedAccordion() {
97
92
  return (
@@ -124,7 +119,7 @@ Set `collapsible={false}` in single mode when the open item must stay open. The
124
119
  </Accordion>
125
120
  ```
126
121
 
127
- Use `headingLevel` to choose the heading wrapper rendered around each trigger. The default level is `3`.
122
+ Use `headingLevel` to choose the heading element rendered around each trigger. The default level is `3`.
128
123
 
129
124
  ```tsx
130
125
  <Accordion defaultValue="shipping" headingLevel={2}>
@@ -142,16 +137,57 @@ Pass `indicator={null}` to remove the default chevron, or pass a custom node to
142
137
  <AccordionTrigger indicator={<span aria-hidden>+</span>}>Custom indicator</AccordionTrigger>
143
138
  ```
144
139
 
145
- ## `accordion.*`
140
+ ## Primitive Usage
141
+
142
+ Use the lower-level primitives when app code owns the accordion markup and styles:
143
+
144
+ ```tsx
145
+ import * as accordion from 'remix/ui/accordion/primitives'
146
+ import { contentStyle, headingStyle, itemStyle, rootStyle, triggerStyle } from './accordion.styles'
147
+
148
+ export function PrimitiveAccordion() {
149
+ return (
150
+ <accordion.Context defaultValue="shipping">
151
+ <div mix={[rootStyle, accordion.root()]}>
152
+ <accordion.ItemContext value="shipping">
153
+ <div mix={[itemStyle, accordion.item()]}>
154
+ <h3 mix={headingStyle}>
155
+ <button mix={[triggerStyle, accordion.trigger()]} type="button">
156
+ Shipping
157
+ </button>
158
+ </h3>
159
+ <div mix={[contentStyle, accordion.content()]}>
160
+ Delivery windows and carrier defaults.
161
+ </div>
162
+ </div>
163
+ </accordion.ItemContext>
164
+ </div>
165
+ </accordion.Context>
166
+ )
167
+ }
168
+ ```
169
+
170
+ ## `remix/ui/accordion`
146
171
 
147
172
  - `Accordion`: root component. Defaults to single-item mode and supports controlled `value`, uncontrolled `defaultValue`, `onValueChange`, `disabled`, `headingLevel`, `collapsible`, and `type="multiple"`.
148
173
  - `AccordionItem`: registers one accordion item by `value`. Pass `disabled` to prevent that item from opening or receiving keyboard focus.
149
174
  - `AccordionTrigger`: heading-wrapped button for an item. It wires `aria-expanded`, `aria-controls`, keyboard navigation, and the default chevron indicator.
150
175
  - `AccordionContent`: panel for an item. It wires the panel id, `aria-labelledby`, `aria-hidden`, inert state, and open/closed state attributes.
176
+ - `rootStyle`, `itemStyle`, `headingStyle`, `triggerStyle`, `indicatorStyle`, `panelStyle`, and `bodyStyle`: flat style mixins used by the component markup.
177
+ - `AccordionProps`, `AccordionSingleProps`, `AccordionMultipleProps`, `AccordionItemProps`, `AccordionTriggerProps`, and `AccordionContentProps`: public TypeScript props for the composed APIs.
178
+
179
+ ## `remix/ui/accordion/primitives`
180
+
181
+ - `Context`: lower-level provider for custom accordion composition.
182
+ - `ItemContext`: lower-level provider for one item value.
183
+ - `root()`: wires the root element and bubbling change events.
184
+ - `item()`: wires one item wrapper.
185
+ - `trigger()`: wires the item trigger, keyboard navigation, and trigger ARIA attributes.
186
+ - `content()`: wires the item panel id, hidden state, inert state, and open/closed state attributes.
151
187
  - `onAccordionChange(...)`: event mixin for the bubbling `AccordionChangeEvent`.
152
- - `AccordionChangeEvent`: bubbling event class with `value`, `itemValue`, and `accordionType`.
153
- - `AccordionProps`, `AccordionSingleProps`, `AccordionMultipleProps`, `AccordionItemProps`, `AccordionTriggerProps`, and `AccordionContentProps`: public TypeScript props.
154
- - `rootStyle`, `itemStyle`, `triggerStyle`, `indicatorStyle`, `panelStyle`, and `bodyStyle`: flat style mixins used by the component wrappers.
188
+ - `AccordionChangeEvent`: bubbling event with `value`, `itemValue`, and `accordionType`.
189
+ - `AccordionType`, `AccordionValue`, `AccordionSingleValue`, `AccordionMultipleValue`, and `AccordionHeadingLevel`: public TypeScript state and configuration types.
190
+ - `AccordionBaseContextProps`, `AccordionSingleContextProps`, `AccordionMultipleContextProps`, `AccordionContextProps`, `AccordionRootOptions`, `AccordionItemOptions`, `AccordionTriggerOptions`, and `AccordionContentOptions`: primitive prop and option types for custom composition.
155
191
 
156
192
  ## Behavior Notes
157
193