@torpor/ui 0.2.1 → 0.3.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 (290) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/dist/Accordion/Accordion.torp +29 -22
  3. package/dist/Accordion/AccordionContent.torp +7 -8
  4. package/dist/Accordion/AccordionHeader.torp +4 -6
  5. package/dist/Accordion/AccordionItem.torp +15 -12
  6. package/dist/Accordion/AccordionTrigger.torp +6 -7
  7. package/dist/Accordion/AccordionTypes.ts +4 -3
  8. package/dist/Accordion/index.d.ts +5 -5
  9. package/dist/Breadcrumb/Breadcrumb.torp +9 -10
  10. package/dist/Breadcrumb/BreadcrumbItem.torp +5 -7
  11. package/dist/Breadcrumb/BreadcrumbSeparator.torp +3 -5
  12. package/dist/Breadcrumb/index.d.ts +8 -7
  13. package/dist/Calendar/Calendar.torp +12 -13
  14. package/dist/Calendar/CalendarDay.torp +3 -3
  15. package/dist/Contextual/Contextual.torp +125 -0
  16. package/dist/{Popover/PopoverContentContextual.torp → Contextual/ContextualContent.torp} +15 -15
  17. package/dist/Contextual/ContextualTrigger.torp +66 -0
  18. package/dist/Contextual/ContextualTypes.ts +30 -0
  19. package/dist/Contextual/index.d.ts +90 -0
  20. package/dist/Contextual/index.js +14 -0
  21. package/dist/Contextual/index.js.map +1 -0
  22. package/dist/Dialog/Dialog.torp +38 -72
  23. package/dist/Dialog/DialogBody.torp +6 -8
  24. package/dist/Dialog/DialogButton.torp +14 -12
  25. package/dist/Dialog/DialogFooter.torp +3 -5
  26. package/dist/Dialog/DialogHeader.torp +6 -8
  27. package/dist/Dialog/DialogTypes.ts +3 -2
  28. package/dist/Dialog/index.d.ts +16 -11
  29. package/dist/Disclosure/Disclosure.torp +22 -23
  30. package/dist/Disclosure/DisclosureContent.torp +7 -8
  31. package/dist/Disclosure/DisclosureHeader.torp +5 -7
  32. package/dist/Disclosure/DisclosureTrigger.torp +7 -8
  33. package/dist/Disclosure/DisclosureTypes.ts +0 -1
  34. package/dist/Disclosure/index.d.ts +12 -12
  35. package/dist/Drawer/Drawer.torp +101 -70
  36. package/dist/Drawer/DrawerContent.torp +80 -0
  37. package/dist/Drawer/DrawerOverlay.torp +38 -0
  38. package/dist/Drawer/DrawerTrigger.torp +35 -0
  39. package/dist/Drawer/DrawerTypes.ts +24 -0
  40. package/dist/Drawer/index.d.ts +90 -3
  41. package/dist/Drawer/index.js +13 -1
  42. package/dist/Form/Field.torp +2 -4
  43. package/dist/Form/Form.torp +7 -9
  44. package/dist/Form/Input.torp +20 -17
  45. package/dist/Form/Label.torp +1 -1
  46. package/dist/Form/Message.torp +1 -1
  47. package/dist/Form/index.d.ts +18 -4
  48. package/dist/Menu/Menu.torp +16 -15
  49. package/dist/Menu/MenuButton.torp +19 -13
  50. package/dist/Menu/MenuCheck.torp +18 -14
  51. package/dist/Menu/MenuGroup.torp +4 -6
  52. package/dist/Menu/MenuIndicator.torp +5 -7
  53. package/dist/Menu/MenuPopout.torp +12 -15
  54. package/dist/Menu/MenuPopoutContent.torp +6 -8
  55. package/dist/Menu/MenuPopoutTrigger.torp +12 -14
  56. package/dist/Menu/MenuRadio.torp +14 -14
  57. package/dist/Menu/MenuRadioGroup.torp +22 -14
  58. package/dist/Menu/MenuSeparator.torp +3 -5
  59. package/dist/Menu/MenuTypes.ts +7 -5
  60. package/dist/Menu/index.d.ts +28 -22
  61. package/dist/MenuBar/MenuBar.torp +13 -14
  62. package/dist/MenuBar/MenuBarItem.torp +13 -16
  63. package/dist/MenuBar/MenuBarItemContent.torp +7 -9
  64. package/dist/MenuBar/MenuBarItemTrigger.torp +6 -9
  65. package/dist/MenuBar/index.d.ts +16 -16
  66. package/dist/Modal/Modal.torp +118 -0
  67. package/dist/Modal/ModalContent.torp +77 -0
  68. package/dist/Modal/ModalOverlay.torp +38 -0
  69. package/dist/Modal/ModalTrigger.torp +50 -0
  70. package/dist/Modal/ModalTypes.ts +22 -0
  71. package/dist/Modal/index.d.ts +108 -0
  72. package/dist/Modal/index.js +33 -0
  73. package/dist/Modal/index.js.map +1 -0
  74. package/dist/Modal/showModal.ts +19 -0
  75. package/dist/Modal/showPrompt.ts +23 -0
  76. package/dist/NavMenu/NavMenu.torp +7 -8
  77. package/dist/NavMenu/NavMenuButton.torp +6 -8
  78. package/dist/NavMenu/NavMenuElement.torp +8 -8
  79. package/dist/NavMenu/NavMenuGroup.torp +4 -6
  80. package/dist/NavMenu/NavMenuGroupHeader.torp +5 -6
  81. package/dist/NavMenu/NavMenuLink.torp +8 -11
  82. package/dist/NavMenu/NavMenuPopout.torp +25 -17
  83. package/dist/NavMenu/NavMenuPopoutButton.torp +12 -13
  84. package/dist/NavMenu/NavMenuPopoutContent.torp +12 -12
  85. package/dist/NavMenu/NavMenuSeparator.torp +3 -5
  86. package/dist/NavMenu/index.d.ts +17 -11
  87. package/dist/Notification/Notification.torp +22 -13
  88. package/dist/Notification/NotificationClose.torp +3 -5
  89. package/dist/Notification/NotificationContainer.torp +3 -5
  90. package/dist/Notification/NotificationContent.torp +3 -5
  91. package/dist/Notification/index.d.ts +4 -4
  92. package/dist/Popover/Popover.torp +31 -25
  93. package/dist/Popover/PopoverContent.torp +35 -10
  94. package/dist/Popover/PopoverTrigger.torp +24 -4
  95. package/dist/Popover/PopoverTypes.ts +1 -1
  96. package/dist/Popover/index.d.ts +16 -124
  97. package/dist/Popover/index.js +1 -163
  98. package/dist/Popover/index.js.map +1 -1
  99. package/dist/TabGroup/TabContent.torp +12 -9
  100. package/dist/TabGroup/TabGroup.torp +41 -35
  101. package/dist/TabGroup/TabGroupTypes.ts +10 -5
  102. package/dist/TabGroup/TabHeader.torp +15 -8
  103. package/dist/TabGroup/TabList.torp +4 -6
  104. package/dist/TabGroup/TabTrigger.torp +8 -9
  105. package/dist/TabGroup/index.d.ts +14 -6
  106. package/dist/icons/ArrowDown.torp +3 -1
  107. package/dist/icons/ArrowLeft.torp +3 -1
  108. package/dist/icons/ArrowRight.torp +3 -1
  109. package/dist/icons/ArrowUp.torp +3 -1
  110. package/dist/icons/Bars.torp +3 -1
  111. package/dist/icons/Check.torp +3 -1
  112. package/dist/icons/ChevronDown.torp +3 -1
  113. package/dist/icons/ChevronLeft.torp +3 -1
  114. package/dist/icons/ChevronRight.torp +3 -1
  115. package/dist/icons/ChevronUp.torp +3 -1
  116. package/dist/icons/Cross.torp +3 -1
  117. package/dist/icons/IconTypes.ts +6 -0
  118. package/dist/icons/Loading.torp +3 -1
  119. package/dist/icons/Minus.torp +3 -1
  120. package/dist/icons/Plus.torp +3 -1
  121. package/dist/icons/index.d.ts +271 -14
  122. package/dist/index.d.ts +17 -4
  123. package/dist/metafile-esm.json +1 -1
  124. package/dist/motion/fade.ts +15 -6
  125. package/dist/motion/grow.ts +23 -0
  126. package/dist/motion/index.d.ts +19 -2
  127. package/dist/motion/index.js +93 -3
  128. package/dist/motion/index.js.map +1 -1
  129. package/dist/motion/measure.ts +28 -0
  130. package/dist/motion/slide.ts +45 -0
  131. package/dist/mount/clickPopover.ts +51 -0
  132. package/dist/mount/contextPopover.ts +51 -0
  133. package/dist/mount/hoverPopover.ts +58 -0
  134. package/package.json +21 -14
  135. package/scripts/postbuild.ts +11 -1
  136. package/src/Accordion/Accordion.torp +29 -22
  137. package/src/Accordion/AccordionContent.torp +7 -8
  138. package/src/Accordion/AccordionHeader.torp +4 -6
  139. package/src/Accordion/AccordionItem.torp +15 -12
  140. package/src/Accordion/AccordionTrigger.torp +6 -7
  141. package/src/Accordion/AccordionTypes.ts +4 -3
  142. package/src/Breadcrumb/Breadcrumb.torp +9 -10
  143. package/src/Breadcrumb/BreadcrumbItem.torp +5 -7
  144. package/src/Breadcrumb/BreadcrumbSeparator.torp +3 -5
  145. package/src/Calendar/Calendar.torp +12 -13
  146. package/src/Calendar/CalendarDay.torp +3 -3
  147. package/src/Contextual/Contextual.torp +125 -0
  148. package/src/{Popover/PopoverContentContextual.torp → Contextual/ContextualContent.torp} +15 -15
  149. package/src/Contextual/ContextualTrigger.torp +66 -0
  150. package/src/Contextual/ContextualTypes.ts +30 -0
  151. package/src/Contextual/index.ts +5 -0
  152. package/src/Dialog/Dialog.torp +38 -72
  153. package/src/Dialog/DialogBody.torp +6 -8
  154. package/src/Dialog/DialogButton.torp +14 -12
  155. package/src/Dialog/DialogFooter.torp +3 -5
  156. package/src/Dialog/DialogHeader.torp +6 -8
  157. package/src/Dialog/DialogTypes.ts +3 -2
  158. package/src/Disclosure/Disclosure.torp +22 -23
  159. package/src/Disclosure/DisclosureContent.torp +7 -8
  160. package/src/Disclosure/DisclosureHeader.torp +5 -7
  161. package/src/Disclosure/DisclosureTrigger.torp +7 -8
  162. package/src/Disclosure/DisclosureTypes.ts +0 -1
  163. package/src/Drawer/Drawer.torp +101 -70
  164. package/src/Drawer/DrawerContent.torp +80 -0
  165. package/src/Drawer/DrawerOverlay.torp +38 -0
  166. package/src/Drawer/DrawerTrigger.torp +35 -0
  167. package/src/Drawer/DrawerTypes.ts +24 -0
  168. package/src/Drawer/index.ts +4 -1
  169. package/src/Form/Field.torp +2 -4
  170. package/src/Form/Form.torp +7 -9
  171. package/src/Form/Input.torp +20 -17
  172. package/src/Form/Label.torp +1 -1
  173. package/src/Form/Message.torp +1 -1
  174. package/src/Menu/Menu.torp +16 -15
  175. package/src/Menu/MenuButton.torp +19 -13
  176. package/src/Menu/MenuCheck.torp +18 -14
  177. package/src/Menu/MenuGroup.torp +4 -6
  178. package/src/Menu/MenuIndicator.torp +5 -7
  179. package/src/Menu/MenuPopout.torp +12 -15
  180. package/src/Menu/MenuPopoutContent.torp +6 -8
  181. package/src/Menu/MenuPopoutTrigger.torp +12 -14
  182. package/src/Menu/MenuRadio.torp +14 -14
  183. package/src/Menu/MenuRadioGroup.torp +22 -14
  184. package/src/Menu/MenuSeparator.torp +3 -5
  185. package/src/Menu/MenuTypes.ts +7 -5
  186. package/src/MenuBar/MenuBar.torp +13 -14
  187. package/src/MenuBar/MenuBarItem.torp +13 -16
  188. package/src/MenuBar/MenuBarItemContent.torp +7 -9
  189. package/src/MenuBar/MenuBarItemTrigger.torp +6 -9
  190. package/src/Modal/Modal.torp +118 -0
  191. package/src/Modal/ModalContent.torp +77 -0
  192. package/src/Modal/ModalOverlay.torp +38 -0
  193. package/src/Modal/ModalTrigger.torp +50 -0
  194. package/src/Modal/ModalTypes.ts +22 -0
  195. package/src/Modal/index.ts +10 -0
  196. package/src/Modal/showModal.ts +19 -0
  197. package/src/Modal/showPrompt.ts +23 -0
  198. package/src/NavMenu/NavMenu.torp +7 -8
  199. package/src/NavMenu/NavMenuButton.torp +6 -8
  200. package/src/NavMenu/NavMenuElement.torp +8 -8
  201. package/src/NavMenu/NavMenuGroup.torp +4 -6
  202. package/src/NavMenu/NavMenuGroupHeader.torp +5 -6
  203. package/src/NavMenu/NavMenuLink.torp +8 -11
  204. package/src/NavMenu/NavMenuPopout.torp +25 -17
  205. package/src/NavMenu/NavMenuPopoutButton.torp +12 -13
  206. package/src/NavMenu/NavMenuPopoutContent.torp +12 -12
  207. package/src/NavMenu/NavMenuSeparator.torp +3 -5
  208. package/src/Notification/Notification.torp +22 -13
  209. package/src/Notification/NotificationClose.torp +3 -5
  210. package/src/Notification/NotificationContainer.torp +3 -5
  211. package/src/Notification/NotificationContent.torp +3 -5
  212. package/src/Popover/Popover.torp +31 -25
  213. package/src/Popover/PopoverContent.torp +35 -10
  214. package/src/Popover/PopoverTrigger.torp +24 -4
  215. package/src/Popover/PopoverTypes.ts +1 -1
  216. package/src/Popover/index.ts +1 -24
  217. package/src/Slider/Slider.torp +3 -3
  218. package/src/TabGroup/TabContent.torp +12 -9
  219. package/src/TabGroup/TabGroup.torp +41 -35
  220. package/src/TabGroup/TabGroupTypes.ts +10 -5
  221. package/src/TabGroup/TabHeader.torp +15 -8
  222. package/src/TabGroup/TabList.torp +4 -6
  223. package/src/TabGroup/TabTrigger.torp +8 -9
  224. package/src/icons/ArrowDown.torp +3 -1
  225. package/src/icons/ArrowLeft.torp +3 -1
  226. package/src/icons/ArrowRight.torp +3 -1
  227. package/src/icons/ArrowUp.torp +3 -1
  228. package/src/icons/Bars.torp +3 -1
  229. package/src/icons/Check.torp +3 -1
  230. package/src/icons/ChevronDown.torp +3 -1
  231. package/src/icons/ChevronLeft.torp +3 -1
  232. package/src/icons/ChevronRight.torp +3 -1
  233. package/src/icons/ChevronUp.torp +3 -1
  234. package/src/icons/Cross.torp +3 -1
  235. package/src/icons/IconTypes.ts +6 -0
  236. package/src/icons/Loading.torp +3 -1
  237. package/src/icons/Minus.torp +3 -1
  238. package/src/icons/Plus.torp +3 -1
  239. package/src/motion/fade.ts +15 -6
  240. package/src/motion/grow.ts +23 -0
  241. package/src/motion/index.ts +4 -1
  242. package/src/motion/measure.ts +28 -0
  243. package/src/motion/slide.ts +45 -0
  244. package/src/mount/clickPopover.ts +51 -0
  245. package/src/mount/contextPopover.ts +51 -0
  246. package/src/mount/hoverPopover.ts +58 -0
  247. package/test/Accordion/components/AccordionAccessibility.torp +1 -3
  248. package/test/Accordion/components/AccordionKeyboard.torp +1 -3
  249. package/test/Accordion/components/AccordionList.torp +1 -3
  250. package/test/Accordion/components/AccordionMultiple.torp +2 -4
  251. package/test/Accordion/components/AccordionSingle.torp +2 -4
  252. package/test/Dialog/accessibility-modal.test.ts +2 -2
  253. package/test/Dialog/components/DialogAccessibility.torp +8 -14
  254. package/test/Dialog/components/DialogFunction.torp +20 -4
  255. package/test/Dialog/components/DialogModal.torp +30 -0
  256. package/test/Dialog/components/DialogVariable.torp +7 -7
  257. package/test/Disclosure/components/DisclosureTest.torp +1 -3
  258. package/test/Menu/components/MenuAccessibility.torp +5 -5
  259. package/test/Menu/components/MenuBasic.torp +5 -5
  260. package/test/Notification/components/NotificationFunction.torp +0 -3
  261. package/test/Notification/components/NotificationVariable.torp +1 -1
  262. package/test/Popover/components/PopoverFunction.torp +37 -0
  263. package/test/Popover/components/PopoverTrigger.torp +36 -0
  264. package/test/Popover/components/{PromptVariable.torp → PopoverVariable.torp} +5 -3
  265. package/test/Popover/function.test.ts +2 -7
  266. package/test/Popover/trigger.test.ts +27 -0
  267. package/test/Popover/variable.test.ts +2 -2
  268. package/test/TabGroup/components/TabGroupAccessibility.torp +1 -3
  269. package/test/TabGroup/components/TabGroupKeyboard.torp +1 -3
  270. package/test/TabGroup/components/TabGroupList.torp +1 -3
  271. package/test/TabGroup/components/TabGroupTrigger.torp +1 -3
  272. package/tsup.config.ts +2 -0
  273. package/dist/Popover/PopoverContentAnchored.torp +0 -113
  274. package/dist/Popover/PopoverOverlay.torp +0 -39
  275. package/dist/Popover/PopoverTriggerContextual.torp +0 -46
  276. package/dist/Popover/PopoverTriggerHover.torp +0 -47
  277. package/dist/Popover/mountClickPopover.ts +0 -50
  278. package/dist/Popover/mountContextPopover.ts +0 -50
  279. package/dist/Popover/mountHoverPopover.ts +0 -57
  280. package/dist/Popover/showPopoverPrompt.ts +0 -23
  281. package/src/Popover/PopoverContentAnchored.torp +0 -113
  282. package/src/Popover/PopoverOverlay.torp +0 -39
  283. package/src/Popover/PopoverTriggerContextual.torp +0 -46
  284. package/src/Popover/PopoverTriggerHover.torp +0 -47
  285. package/src/Popover/mountClickPopover.ts +0 -50
  286. package/src/Popover/mountContextPopover.ts +0 -50
  287. package/src/Popover/mountHoverPopover.ts +0 -57
  288. package/src/Popover/showPopoverPrompt.ts +0 -23
  289. package/test/Dialog/components/CustomDialog.torp +0 -20
  290. package/test/Popover/components/PromptFunction.torp +0 -19
package/CHANGELOG.md CHANGED
@@ -1,5 +1,28 @@
1
1
  # @torpor/ui
2
2
 
3
+ ## 0.3.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 92438fc: !Edit: split Popover into Contextual, Modal and Popover
8
+ - 42c6b60: !Fix: transitions
9
+
10
+ ### Patch Changes
11
+
12
+ - 4f17acb: Fix: handle undefined $props in UI components
13
+ - Updated dependencies [255aad3]
14
+ - Updated dependencies [8b377a2]
15
+ - Updated dependencies [450b739]
16
+ - Updated dependencies [168dff3]
17
+ - Updated dependencies [fc60fe0]
18
+ - Updated dependencies [42c6b60]
19
+ - Updated dependencies [2818679]
20
+ - Updated dependencies [38fd0a5]
21
+ - Updated dependencies [3e6f3f7]
22
+ - Updated dependencies [051998b]
23
+ - @torpor/view@0.4.0
24
+ - @torpor/unplugin@0.2.1
25
+
3
26
  ## 0.2.1
4
27
 
5
28
  ### Patch Changes
@@ -34,11 +34,18 @@ interface AccordionProps {
34
34
  * </Accordion>
35
35
  * ```
36
36
  */
37
- export default function Accordion($props: AccordionProps) {
38
- $props ??= $watch({ type: "single", value: "" });
37
+ export default function Accordion($props: AccordionProps | undefined) {
38
+ let type = $props?.type ?? "single";
39
39
 
40
- $props.type ||= "single";
41
- $props.value ||= $props.type === "single" ? "" : [];
40
+ let $state = $watch({
41
+ value: $props?.value ?? (type === "single" ? "" : [] as string[])
42
+ });
43
+
44
+ $run(() => {
45
+ if ($props !== undefined) {
46
+ $props.value = $state.value;
47
+ }
48
+ });
42
49
 
43
50
  let itemStates: ItemState[] = [];
44
51
 
@@ -56,13 +63,13 @@ export default function Accordion($props: AccordionProps) {
56
63
 
57
64
  $run(() => {
58
65
  // HACK: This should probably be done with setters?
59
- let newValue = $props.value!;
66
+ let newValue = $state.value;
60
67
 
61
68
  // Get the value
62
- switch ($props!.type) {
69
+ switch (type) {
63
70
  case "single": {
64
71
  // Ensure the value passed in was a string (in case e.g. the user has set values to ints)
65
- newValue = newValue?.toString();
72
+ newValue = newValue.toString();
66
73
  for (let item of itemStates) {
67
74
  item.expanded = item.value === newValue;
68
75
  }
@@ -81,22 +88,22 @@ export default function Accordion($props: AccordionProps) {
81
88
  }
82
89
 
83
90
  // Set the value
84
- $props.value = newValue;
91
+ $state.value = newValue;
85
92
  })
86
93
 
87
94
  $run(() => {
88
- itemStates.forEach((s) => s.parentDisabled = $props.disabled === true);
95
+ itemStates.forEach((s) => s.parentDisabled = $props?.disabled === true);
89
96
  });
90
97
 
91
98
  // Dispatch the change event when the value changes
92
99
  let firstChange = true;
93
100
  $run(() => {
94
- const ev = $props.onchange;
95
- const value = $props.value;
101
+ const ev = $props?.onchange;
102
+ const value = $state.value;
96
103
  if (firstChange) {
97
104
  firstChange = false;
98
105
  } else if (ev) {
99
- ev(value!);
106
+ ev(value);
100
107
  }
101
108
  });
102
109
 
@@ -112,21 +119,21 @@ export default function Accordion($props: AccordionProps) {
112
119
  }
113
120
 
114
121
  // If we have a value, set whether the item should be expanded
115
- if ($props.value) {
116
- switch ($props.type) {
122
+ if ($state.value) {
123
+ switch (type) {
117
124
  case "single": {
118
- itemState.expanded = $props.value === itemState.value;
125
+ itemState.expanded = $state.value === itemState.value;
119
126
  break;
120
127
  }
121
128
  case "multiple": {
122
- itemState.expanded = $props.value.includes(itemState.value);
129
+ itemState.expanded = $state.value.includes(itemState.value);
123
130
  break;
124
131
  }
125
132
  }
126
133
  }
127
134
 
128
135
  // Set whether the Accordion itself is disabled
129
- itemState.parentDisabled = $props.disabled === true
136
+ itemState.parentDisabled = $props?.disabled === true
130
137
 
131
138
  // Add the item's state to the array
132
139
  itemStates.splice(itemState.index, 0, itemState);
@@ -143,13 +150,13 @@ export default function Accordion($props: AccordionProps) {
143
150
  }
144
151
 
145
152
  function toggleItem(toggleValue: string) {
146
- switch ($props.type) {
153
+ switch (type) {
147
154
  case "single": {
148
155
  for (let item of itemStates) {
149
156
  // The item is expanded if it has the supplied value (i.e. if it was clicked) and if it
150
157
  // wasn't already expanded (i.e. we collapse it if it was expanded and clicked)
151
158
  if (item.value === toggleValue) {
152
- $props.value = item.expanded ? "" : item.value;
159
+ $state.value = item.expanded ? "" : item.value;
153
160
  break;
154
161
  }
155
162
  }
@@ -167,7 +174,7 @@ export default function Accordion($props: AccordionProps) {
167
174
  newValue.push(item.value);
168
175
  }
169
176
  }
170
- $props.value = newValue.sort();
177
+ $state.value = newValue.sort();
171
178
  break;
172
179
  }
173
180
  }
@@ -210,8 +217,8 @@ export default function Accordion($props: AccordionProps) {
210
217
 
211
218
  @render {
212
219
  <div
213
- {$props.id}
214
- class={`torp-accordion ${$props.class ?? ""}`.trim()}
220
+ {$props?.id}
221
+ class={`torp-accordion ${$props?.class ?? ""}`.trim()}
215
222
  >
216
223
  <slot />
217
224
  </div>
@@ -13,9 +13,8 @@ interface AccordionContentProps {
13
13
  /**
14
14
  * Content for an AccordionItem, which can be revealed or hidden by an associated AccordionTrigger.
15
15
  */
16
- export default function AccordionContent($props: AccordionContentProps) {
17
- $props ??= $watch({});
18
- $props.id ||= getId();
16
+ export default function AccordionContent($props: AccordionContentProps | undefined) {
17
+ let defaultId = getId();
19
18
 
20
19
  const context = $context[AccordionItemContextName] as AccordionItemContext;
21
20
  if (!context) {
@@ -24,15 +23,15 @@ export default function AccordionContent($props: AccordionContentProps) {
24
23
  let $state = context.state
25
24
 
26
25
  // Set the content ID so that it can be used with aria-controls in AccordionTrigger
27
- $state.contentId = $props.id;
26
+ $state.contentId = $props?.id ?? defaultId;
28
27
 
29
28
  @render {
30
29
  <div
31
- {$props.id}
32
- class={`torp-accordion-content ${$props.class ?? ""}`.trim()}
33
- role={$props.ariaRegion ? "region" : undefined}
30
+ id={$props?.id ?? defaultId}
31
+ class={`torp-accordion-content ${$props?.class ?? ""}`.trim()}
32
+ role={$props?.ariaRegion ? "region" : undefined}
34
33
  aria-labelledby={$state.headerId}
35
- data-state={$state.dataState}
34
+ data-state={$state.expanded ? "open" : "closed"}
36
35
  data-disabled={$state.disabled ? "true" : undefined}
37
36
  >
38
37
  @if ($state.expanded) {
@@ -20,9 +20,7 @@ interface AccordionHeaderProps {
20
20
  * </AccordionHeader>
21
21
  * ```
22
22
  */
23
- export default function AccordionHeader($props: AccordionHeaderProps) {
24
- $props ??= $watch({});
25
-
23
+ export default function AccordionHeader($props: AccordionHeaderProps | undefined) {
26
24
  const context = $context[AccordionItemContextName] as AccordionItemContext;
27
25
  if (!context) {
28
26
  throw new Error("AccordionHeader must be contained within an AccordionItem");
@@ -32,9 +30,9 @@ export default function AccordionHeader($props: AccordionHeaderProps) {
32
30
  @render {
33
31
  @// TODO: $props.as
34
32
  <h4
35
- {$props.id}
36
- class={`torp-accordion-header ${$props.class ?? ""}`.trim()}
37
- data-state={$state.dataState}
33
+ {$props?.id}
34
+ class={`torp-accordion-header ${$props?.class ?? ""}`.trim()}
35
+ data-state={$state.expanded ? "open" : "closed"}
38
36
  data-disabled={$state.disabled ? "true" : undefined}
39
37
  >
40
38
  <slot />
@@ -29,20 +29,16 @@ interface AccordionItemProps {
29
29
  * </AccordionItem>
30
30
  * ```
31
31
  */
32
- export default function AccordionItem($props: AccordionItemProps) {
33
- $props ??= $watch({});
34
-
32
+ export default function AccordionItem($props: AccordionItemProps | undefined) {
35
33
  let $state: ItemState = $watch({
36
34
  index: -1,
37
35
  value: "",
38
36
  expanded: false,
39
37
  headerId: "",
40
38
  contentId: "",
41
- disabled: $props.disabled,
39
+ disabled: $props?.disabled ?? false,
42
40
  parentDisabled: false,
43
- get dataState() {
44
- return this.expanded ? "open" : "closed";
45
- },
41
+ setFocused
46
42
  })
47
43
 
48
44
  // Get stuff out of the AccordionContext
@@ -60,7 +56,7 @@ export default function AccordionItem($props: AccordionItemProps) {
60
56
  $context[AccordionItemContextName] = itemContext;
61
57
 
62
58
  // Register this item with the parent Accordion, which will handle toggling expanded for all items
63
- context.registerItem($state);
59
+ context.registerItem($state, setFocused);
64
60
 
65
61
  // Remove the item from the parent Accordion when this item is destroyed
66
62
  $run(() => {
@@ -72,7 +68,7 @@ export default function AccordionItem($props: AccordionItemProps) {
72
68
  // Dispatch the toggle event when the value of expanded changes
73
69
  let firstToggle = true;
74
70
  $run(() => {
75
- const ev = $props.ontoggle;
71
+ const ev = $props?.ontoggle;
76
72
  const expanded = $state.expanded;
77
73
  if (firstToggle) {
78
74
  firstToggle = false;
@@ -81,11 +77,18 @@ export default function AccordionItem($props: AccordionItemProps) {
81
77
  }
82
78
  });
83
79
 
80
+ // Called from the parent Accordion; pass the focus command along to the AccordionButton
81
+ function setFocused() {
82
+ if (itemContext.setHeaderFocused) {
83
+ itemContext.setHeaderFocused();
84
+ }
85
+ }
86
+
84
87
  @render {
85
88
  <div
86
- {$props.id}
87
- class={`torp-accordion-item ${$props.class ?? ""}`.trim()}
88
- data-state={$state.dataState}
89
+ {$props?.id}
90
+ class={`torp-accordion-item ${$props?.class ?? ""}`.trim()}
91
+ data-state={$state.expanded ? "open" : "closed"}
89
92
  data-disabled={$state.disabled ? "true" : undefined}
90
93
  >
91
94
  <slot />
@@ -11,9 +11,8 @@ interface AccordionTriggerProps {
11
11
  /**
12
12
  * A header button for an AccordionItem, which can be used to reveal or hide an associated AccordionContent.
13
13
  */
14
- export default function AccordionTrigger($props: AccordionTriggerProps) {
15
- $props ??= $watch({});
16
- $props.id ||= getId();
14
+ export default function AccordionTrigger($props: AccordionTriggerProps | undefined) {
15
+ let defaultId = getId();
17
16
 
18
17
  let button: HTMLButtonElement;
19
18
 
@@ -25,7 +24,7 @@ export default function AccordionTrigger($props: AccordionTriggerProps) {
25
24
  let $state = context.state;
26
25
 
27
26
  // Set the header ID so that it can be used with aria-labelledby in AccordionContent
28
- $state.headerId = $props.id;
27
+ $state.headerId = $props?.id ?? defaultId;
29
28
 
30
29
  // Let the item know how to set the button's focus
31
30
  $state.setFocused = setFocused;
@@ -49,13 +48,13 @@ export default function AccordionTrigger($props: AccordionTriggerProps) {
49
48
  @render {
50
49
  <button
51
50
  type="button"
52
- {$props.id}
53
- class={`torp-accordion-trigger ${$props.class ?? ""}`.trim()}
51
+ id={$props?.id ?? defaultId}
52
+ class={`torp-accordion-trigger ${$props?.class ?? ""}`.trim()}
54
53
  disabled={$state.disabled || $state.parentDisabled}
55
54
  aria-expanded={$state.expanded.toString()}
56
55
  aria-disabled={$state.disabled ? "true" : undefined}
57
56
  aria-controls={$state.contentId}
58
- data-state={$state.dataState}
57
+ data-state={$state.expanded ? "open" : "closed"}
59
58
  data-disabled={$state.disabled ? "true" : undefined}
60
59
  &ref={button}
61
60
  onclick={handleClick}
@@ -13,12 +13,14 @@ export interface AccordionContext {
13
13
  }
14
14
 
15
15
  export interface AccordionItemContext {
16
- /** Called when an AccordionItem is toggled */
16
+ /** Raised when an AccordionItem is toggled */
17
17
  toggleItem: (value: string) => void;
18
- /** Called when an AccordionHeader receives a keyboard event */
18
+ /** Raised when an AccordionHeader receives a keyboard event */
19
19
  handleHeaderKey: (index: number, e: KeyboardEvent) => void;
20
20
  /** The reactive state for an AccordionItem */
21
21
  state: ItemState;
22
+ /** Called in an AccordionItem when its header needs to be focused */
23
+ setHeaderFocused?: () => void;
22
24
  }
23
25
 
24
26
  export interface ItemState {
@@ -29,7 +31,6 @@ export interface ItemState {
29
31
  contentId: string;
30
32
  disabled: boolean;
31
33
  parentDisabled: boolean;
32
- dataState: "open" | "closed";
33
34
  /** Called in the Accordion when a header needs to be focused */
34
35
  setFocused: () => void;
35
36
  }
@@ -38,7 +38,7 @@ interface AccordionProps {
38
38
  declare function Accordion(
39
39
  $parent: ParentNode,
40
40
  $anchor: Node | null,
41
- $props: AccordionProps,
41
+ $props: AccordionProps | undefined,
42
42
  $context?: Record<PropertyKey, any>,
43
43
  $slots?: Record<string, SlotRender>,
44
44
  ): void;
@@ -60,7 +60,7 @@ interface AccordionContentProps {
60
60
  declare function AccordionContent(
61
61
  $parent: ParentNode,
62
62
  $anchor: Node | null,
63
- $props: AccordionContentProps,
63
+ $props: AccordionContentProps | undefined,
64
64
  $context?: Record<PropertyKey, any>,
65
65
  $slots?: Record<string, SlotRender>,
66
66
  ): void;
@@ -90,7 +90,7 @@ interface AccordionHeaderProps {
90
90
  declare function AccordionHeader(
91
91
  $parent: ParentNode,
92
92
  $anchor: Node | null,
93
- $props: AccordionHeaderProps,
93
+ $props: AccordionHeaderProps | undefined,
94
94
  $context?: Record<PropertyKey, any>,
95
95
  $slots?: Record<string, SlotRender>,
96
96
  ): void;
@@ -129,7 +129,7 @@ interface AccordionItemProps {
129
129
  declare function AccordionItem(
130
130
  $parent: ParentNode,
131
131
  $anchor: Node | null,
132
- $props: AccordionItemProps,
132
+ $props: AccordionItemProps | undefined,
133
133
  $context?: Record<PropertyKey, any>,
134
134
  $slots?: Record<string, SlotRender>,
135
135
  ): void;
@@ -149,7 +149,7 @@ interface AccordionTriggerProps {
149
149
  declare function AccordionTrigger(
150
150
  $parent: ParentNode,
151
151
  $anchor: Node | null,
152
- $props: AccordionTriggerProps,
152
+ $props: AccordionTriggerProps | undefined,
153
153
  $context?: Record<PropertyKey, any>,
154
154
  $slots?: Record<string, SlotRender>,
155
155
  ): void;
@@ -18,23 +18,22 @@ interface BreadcrumbProps {
18
18
  *
19
19
  * ```
20
20
  * <Breadcrumb>
21
- * <BreadcrumbItem />
22
- * <BreadcrumbSeparator /> (optional)
23
- * <BreadcrumbItem />
24
- * ...
21
+ * <BreadcrumbItem />
22
+ * <BreadcrumbSeparator /> (optional)
23
+ * <BreadcrumbItem>
24
+ * ...
25
+ * </BreadcrumbItem>
25
26
  * </Breadcrumb>
26
27
  * ```
27
28
  *
28
29
  * You can separate BreadcrumbItems using BreadcrumbSeparators or by using CSS.
29
30
  */
30
- export default function Breadcrumb($props: BreadcrumbProps) {
31
- $props ??= $watch({});
32
-
31
+ export default function Breadcrumb($props: BreadcrumbProps | undefined) {
33
32
  @render {
34
33
  <nav
35
- {$props.id}
36
- class={`torp-breadcrumb ${$props.class ?? ""}`.trim()}
37
- aria-label={$props.ariaLabel}
34
+ {$props?.id}
35
+ class={`torp-breadcrumb ${$props?.class ?? ""}`.trim()}
36
+ aria-label={$props?.ariaLabel}
38
37
  >
39
38
  <slot />
40
39
  </nav>
@@ -12,15 +12,13 @@ interface BreadcrumbItemProps {
12
12
  * An item in a breadcrumb, containing a link to one of the parent pages of the
13
13
  * current page (or the current page).
14
14
  */
15
- export default function BreadcrumbItem($props: BreadcrumbItemProps) {
16
- $props ??= $watch({});
17
-
15
+ export default function BreadcrumbItem($props: BreadcrumbItemProps | undefined) {
18
16
  @render {
19
17
  <div
20
- {$props.id}
21
- class={`torp-breadcrumb ${$props.class ?? ""}`.trim()}
22
- aria-current={$props.current ? "page" : undefined}
23
- data-current={$props.current ? "current" : undefined}
18
+ {$props?.id}
19
+ class={`torp-breadcrumb ${$props?.class ?? ""}`.trim()}
20
+ aria-current={$props?.current ? "page" : undefined}
21
+ data-current={$props?.current ? "current" : undefined}
24
22
  >
25
23
  <slot />
26
24
  </div>
@@ -10,13 +10,11 @@ interface BreadcrumbSeparatorProps {
10
10
  * A separator between links in a Breadcrumb component. It is hidden from
11
11
  * screen readers.
12
12
  */
13
- export default function BreadcrumbSeparator($props: BreadcrumbSeparatorProps) {
14
- $props ??= $watch({});
15
-
13
+ export default function BreadcrumbSeparator($props: BreadcrumbSeparatorProps | undefined) {
16
14
  @render {
17
15
  <div
18
- {$props.id}
19
- class={`torp-breadcrumb-separator ${$props.class ?? ""}`.trim()}
16
+ {$props?.id}
17
+ class={`torp-breadcrumb-separator ${$props?.class ?? ""}`.trim()}
20
18
  aria-hidden="true"
21
19
  >
22
20
  <slot />
@@ -20,10 +20,11 @@ interface BreadcrumbProps {
20
20
  *
21
21
  * ```
22
22
  * <Breadcrumb>
23
- * <BreadcrumbItem />
24
- * <BreadcrumbSeparator /> (optional)
25
- * <BreadcrumbItem />
26
- * ...
23
+ * <BreadcrumbItem />
24
+ * <BreadcrumbSeparator /> (optional)
25
+ * <BreadcrumbItem>
26
+ * ...
27
+ * </BreadcrumbItem>
27
28
  * </Breadcrumb>
28
29
  * ```
29
30
  *
@@ -32,7 +33,7 @@ interface BreadcrumbProps {
32
33
  declare function Breadcrumb(
33
34
  $parent: ParentNode,
34
35
  $anchor: Node | null,
35
- $props: BreadcrumbProps,
36
+ $props: BreadcrumbProps | undefined,
36
37
  $context?: Record<PropertyKey, any>,
37
38
  $slots?: Record<string, SlotRender>,
38
39
  ): void;
@@ -55,7 +56,7 @@ interface BreadcrumbItemProps {
55
56
  declare function BreadcrumbItem(
56
57
  $parent: ParentNode,
57
58
  $anchor: Node | null,
58
- $props: BreadcrumbItemProps,
59
+ $props: BreadcrumbItemProps | undefined,
59
60
  $context?: Record<PropertyKey, any>,
60
61
  $slots?: Record<string, SlotRender>,
61
62
  ): void;
@@ -76,7 +77,7 @@ interface BreadcrumbSeparatorProps {
76
77
  declare function BreadcrumbSeparator(
77
78
  $parent: ParentNode,
78
79
  $anchor: Node | null,
79
- $props: BreadcrumbSeparatorProps,
80
+ $props: BreadcrumbSeparatorProps | undefined,
80
81
  $context?: Record<PropertyKey, any>,
81
82
  $slots?: Record<string, SlotRender>,
82
83
  ): void;
@@ -32,10 +32,11 @@ export default function Calendar($props: CalendarProps) {
32
32
  let $state = $watch({
33
33
  activeDate: $props.value,
34
34
  visibleDate: $props.value,
35
- //get days() {
36
- // // TODO: $cache
37
- // return buildDays($state.visibleDate, $props.startOfWeek)
38
- //},
35
+ get days() {
36
+ return $cache(() => {
37
+ return buildDays($state.visibleDate, $props.startOfWeek)
38
+ });
39
+ },
39
40
  });
40
41
 
41
42
  let visibleStartDate = $props.value;
@@ -49,8 +50,6 @@ export default function Calendar($props: CalendarProps) {
49
50
  $context[CalendarContextName] = context;
50
51
 
51
52
  $run(() => {
52
- $state.days = buildDays($state.visibleDate, $props.startOfWeek)
53
-
54
53
  // HACK: Shouldn't need this
55
54
  if (refocus) {
56
55
  refocus = false;
@@ -219,27 +218,27 @@ export default function Calendar($props: CalendarProps) {
219
218
 
220
219
  @render {
221
220
  <div
222
- {$props.id}
223
- class={`torp-calendar ${$props.class ?? ""}`.trim()}
221
+ {$props?.id}
222
+ class={`torp-calendar ${$props?.class ?? ""}`.trim()}
224
223
  &ref={container}
225
224
  >
226
- <div class={`torp-calendar-header ${$props.class ?? ""}`.trim()}>
227
- <button class={`torp-calendar-previous-trigger ${$props.class ?? ""}`.trim()} onclick={handlePrevMonth}>
225
+ <div class={`torp-calendar-header ${$props?.class ?? ""}`.trim()}>
226
+ <button class={`torp-calendar-previous-trigger ${$props?.class ?? ""}`.trim()} onclick={handlePrevMonth}>
228
227
  <slot name="prev-button">
229
228
  <ChevronLeft />
230
229
  </slot>
231
230
  </button>
232
- <span class={`torp-calendar-month-name ${$props.class ?? ""}`.trim()}>
231
+ <span class={`torp-calendar-month-name ${$props?.class ?? ""}`.trim()}>
233
232
  {monthNames[$state.visibleDate.getMonth()] + " " + $state.visibleDate.getFullYear()}
234
233
  </span>
235
- <button class={`torp-calendar-next-trigger ${$props.class ?? ""}`.trim()} onclick={handleNextMonth}>
234
+ <button class={`torp-calendar-next-trigger ${$props?.class ?? ""}`.trim()} onclick={handleNextMonth}>
236
235
  <slot name="next-button">
237
236
  <ChevronRight />
238
237
  </slot>
239
238
  </button>
240
239
  </div>
241
240
  <div
242
- class={`torp-calendar-grid ${$props.class ?? ""}`.trim()}
241
+ class={`torp-calendar-grid ${$props?.class ?? ""}`.trim()}
243
242
  tabindex={$props.selectable ? 0 : -1}
244
243
  onfocus={handleFocus}
245
244
  onkeydown={handleKey}
@@ -48,9 +48,9 @@ export default function CalendarDay($props: CalendarDayProps) {
48
48
 
49
49
  @render {
50
50
  <div
51
- {$props.id}
51
+ {$props?.id}
52
52
  class={[
53
- `torp-calendar-day ${$props.class ?? ""}`.trim(),
53
+ `torp-calendar-day ${$props?.class ?? ""}`.trim(),
54
54
  {
55
55
  muted: $props.muted,
56
56
  today: isToday(),
@@ -65,7 +65,7 @@ export default function CalendarDay($props: CalendarDayProps) {
65
65
  } else {
66
66
  <span>{date.getDate()}</span>
67
67
  }
68
- <ul class={`torp-calendar-day-events ${$props.class ?? ""}`.trim()}>
68
+ <ul class={`torp-calendar-day-events ${$props?.class ?? ""}`.trim()}>
69
69
  @for (ev of $props.events) {
70
70
  <li title={ev.content} />
71
71
  }