@ctrl-ui/react 0.8.4 → 0.8.6

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 (134) hide show
  1. package/dist/audio-visualizer.js +1 -1
  2. package/dist/chat-composer-editor/extensions/mention.js +4 -0
  3. package/dist/chat-layout.d.ts +5 -0
  4. package/dist/chat-layout.js +61 -20
  5. package/dist/chat-message.d.ts +5 -0
  6. package/dist/chat-message.js +19 -2
  7. package/dist/context.js +0 -2
  8. package/dist/email/email-brand.d.ts +60 -0
  9. package/dist/email/email-brand.js +101 -0
  10. package/dist/email/email-code.d.ts +18 -0
  11. package/dist/email/email-code.js +172 -0
  12. package/dist/email/email-footer.d.ts +63 -0
  13. package/dist/email/email-footer.js +98 -0
  14. package/dist/email/email.d.ts +60 -11
  15. package/dist/email/email.js +155 -24
  16. package/dist/email/templates.d.ts +54 -9
  17. package/dist/email/templates.js +314 -116
  18. package/dist/email/theme.d.ts +13 -5
  19. package/dist/email/theme.js +30 -8
  20. package/dist/hooks/use-chat-message.d.ts +1 -0
  21. package/dist/hooks/use-chat-message.js +1 -0
  22. package/dist/hooks/use-chat-thread-scroll.d.ts +8 -0
  23. package/dist/hooks/use-chat-thread-scroll.js +66 -0
  24. package/dist/hooks/use-user-ask.d.ts +6 -4
  25. package/dist/hooks/use-user-ask.js +56 -17
  26. package/dist/inline-attachment.js +1 -1
  27. package/dist/knob-contracts/action-bar-knobs.d.ts +1 -1
  28. package/dist/knob-contracts/action-bar-knobs.js +1 -1
  29. package/dist/knob-contracts/activity-knobs.d.ts +1 -1
  30. package/dist/knob-contracts/activity-knobs.js +2 -1
  31. package/dist/knob-contracts/audio-visualizer-knobs.d.ts +1 -1
  32. package/dist/knob-contracts/audio-visualizer-knobs.js +1 -0
  33. package/dist/knob-contracts/chat-composer-attachment-knobs.d.ts +1 -1
  34. package/dist/knob-contracts/chat-composer-attachment-knobs.js +2 -0
  35. package/dist/knob-contracts/chat-composer-knobs.d.ts +1 -1
  36. package/dist/knob-contracts/chat-composer-knobs.js +1 -0
  37. package/dist/knob-contracts/chat-layout-knobs.d.ts +1 -1
  38. package/dist/knob-contracts/chat-layout-knobs.js +2 -1
  39. package/dist/knob-contracts/chat-message-knobs.d.ts +1 -1
  40. package/dist/knob-contracts/chat-message-knobs.js +3 -1
  41. package/dist/knob-contracts/context-knobs.d.ts +1 -1
  42. package/dist/knob-contracts/context-knobs.js +3 -0
  43. package/dist/knob-contracts/inline-attachment-knobs.d.ts +1 -1
  44. package/dist/knob-contracts/inline-attachment-knobs.js +4 -0
  45. package/dist/knob-contracts/inline-citation-knobs.d.ts +1 -1
  46. package/dist/knob-contracts/inline-citation-knobs.js +3 -1
  47. package/dist/knob-contracts/page-layout-knobs.d.ts +4 -0
  48. package/dist/knob-contracts/page-layout-knobs.js +16 -0
  49. package/dist/knob-contracts/table-of-contents-knobs.d.ts +1 -1
  50. package/dist/knob-contracts/table-of-contents-knobs.js +3 -3
  51. package/dist/knob-contracts/task-list-knobs.d.ts +1 -1
  52. package/dist/knob-contracts/task-list-knobs.js +4 -0
  53. package/dist/knob-contracts/user-ask-knobs.d.ts +1 -1
  54. package/dist/knob-contracts/user-ask-knobs.js +4 -0
  55. package/dist/lib/phone-input-format.js +1 -1
  56. package/dist/markdown-block.js +1 -1
  57. package/dist/styles/index.css +2 -1
  58. package/dist/styles/recipes/action-bar.css +37 -5
  59. package/dist/styles/recipes/activity.css +36 -3
  60. package/dist/styles/recipes/alert.css +2 -0
  61. package/dist/styles/recipes/audio-visualizer.css +8 -1
  62. package/dist/styles/recipes/button-group.css +8 -0
  63. package/dist/styles/recipes/button.css +15 -0
  64. package/dist/styles/recipes/calendar.css +21 -0
  65. package/dist/styles/recipes/card.css +2 -0
  66. package/dist/styles/recipes/chat-composer-attachment.css +33 -2
  67. package/dist/styles/recipes/chat-composer.css +16 -2
  68. package/dist/styles/recipes/chat-layout.css +25 -1
  69. package/dist/styles/recipes/chat-message.css +69 -2
  70. package/dist/styles/recipes/choice.css +12 -0
  71. package/dist/styles/recipes/code-diff.css +1 -0
  72. package/dist/styles/recipes/code.css +25 -0
  73. package/dist/styles/recipes/context.css +30 -18
  74. package/dist/styles/recipes/dynamic-notification-input.css +6 -0
  75. package/dist/styles/recipes/dynamic-notification.css +1 -0
  76. package/dist/styles/recipes/environment-variables.css +1 -0
  77. package/dist/styles/recipes/field-parts.css +2 -0
  78. package/dist/styles/recipes/field.css +6 -0
  79. package/dist/styles/recipes/gradient-editor.css +17 -0
  80. package/dist/styles/recipes/inline-attachment.css +57 -14
  81. package/dist/styles/recipes/inline-citation.css +44 -6
  82. package/dist/styles/recipes/item.css +3 -1
  83. package/dist/styles/recipes/markdown-block.css +1 -0
  84. package/dist/styles/recipes/markdown.css +7 -0
  85. package/dist/styles/recipes/page-layout.css +219 -0
  86. package/dist/styles/recipes/pagination.css +16 -0
  87. package/dist/styles/recipes/popup-drawer.css +3 -1
  88. package/dist/styles/recipes/popup-toast.css +2 -0
  89. package/dist/styles/recipes/popup.css +8 -12
  90. package/dist/styles/recipes/range.css +24 -2
  91. package/dist/styles/recipes/rich-tooltip.css +1 -0
  92. package/dist/styles/recipes/source-badge.css +20 -0
  93. package/dist/styles/recipes/table-of-contents.css +10 -10
  94. package/dist/styles/recipes/tabs.css +16 -0
  95. package/dist/styles/recipes/task-list.css +61 -8
  96. package/dist/styles/recipes/thread-rail.css +19 -13
  97. package/dist/styles/recipes/toolbar.css +21 -0
  98. package/dist/styles/recipes/transcript-divider.css +1 -0
  99. package/dist/styles/recipes/user-ask.css +59 -16
  100. package/dist/styles/theme.css +34 -0
  101. package/dist/thread-rail.js +1 -1
  102. package/dist/ui/alert-dialog.js +2 -2
  103. package/dist/ui/autocomplete.js +1 -1
  104. package/dist/ui/color-picker.js +3 -3
  105. package/dist/ui/combobox.js +1 -1
  106. package/dist/ui/command.d.ts +5 -3
  107. package/dist/ui/command.js +27 -3
  108. package/dist/ui/context-menu.js +2 -2
  109. package/dist/ui/dialog.js +2 -2
  110. package/dist/ui/drawer.js +2 -2
  111. package/dist/ui/dropdown-menu.js +1 -1
  112. package/dist/ui/dropzone.js +4 -1
  113. package/dist/ui/gradient-editor.js +2 -2
  114. package/dist/ui/hover-card.js +1 -1
  115. package/dist/ui/infinite-canvas.js +1 -0
  116. package/dist/ui/menubar.js +2 -2
  117. package/dist/ui/navigation-menu.js +1 -1
  118. package/dist/ui/number-field.js +1 -1
  119. package/dist/ui/page-layout.d.ts +44 -0
  120. package/dist/ui/page-layout.js +108 -0
  121. package/dist/ui/phone-input.js +4 -4
  122. package/dist/ui/popover.js +1 -1
  123. package/dist/ui/resizable.js +1 -1
  124. package/dist/ui/rich-tooltip.js +1 -1
  125. package/dist/ui/select.js +1 -1
  126. package/dist/ui/sheet.js +2 -2
  127. package/dist/ui/sidebar-resize-rail.js +1 -1
  128. package/dist/ui/slider.js +1 -1
  129. package/dist/ui/toast.js +2 -2
  130. package/dist/ui/tooltip.js +1 -1
  131. package/dist/ui/trigger-menu.js +1 -1
  132. package/dist/user-ask.d.ts +5 -3
  133. package/dist/user-ask.js +38 -13
  134. package/package.json +3 -2
package/dist/user-ask.js CHANGED
@@ -126,30 +126,37 @@ function UserAskPagination({ className, ...props }) {
126
126
  ]
127
127
  });
128
128
  }
129
- function UserAskQuestion({ id, title, defaultValue, className, children, ...props }) {
129
+ function UserAskQuestion({ id, title, multiple = false, defaultValue, className, children, ...props }) {
130
130
  const ask = useUserAskContext();
131
131
  const key = useId();
132
132
  const active = ask.activeQuestion?.key === key;
133
- useEffect(() => ask.registerQuestion({
134
- key,
135
- id,
136
- title,
137
- defaultValue
138
- }), [
133
+ const defaultKey = Array.isArray(defaultValue) ? defaultValue.join("\0") : defaultValue;
134
+ useEffect(() => {
135
+ const defaultValues = defaultKey === void 0 ? void 0 : defaultKey.split("\0");
136
+ return ask.registerQuestion({
137
+ key,
138
+ id,
139
+ title,
140
+ multiple,
141
+ defaultValues
142
+ });
143
+ }, [
139
144
  ask.registerQuestion,
140
145
  key,
141
146
  id,
142
147
  title,
143
- defaultValue
148
+ multiple,
149
+ defaultKey
144
150
  ]);
145
151
  useEffect(() => () => ask.unregisterQuestion(key), [ask.unregisterQuestion, key]);
146
152
  return /* @__PURE__ */ jsx(UserAskQuestionContext.Provider, {
147
153
  value: {
148
154
  id,
149
- active
155
+ active,
156
+ multiple
150
157
  },
151
158
  children: /* @__PURE__ */ jsx("div", {
152
- role: "radiogroup",
159
+ role: multiple ? "group" : "radiogroup",
153
160
  "aria-labelledby": active ? ask.titleId : void 0,
154
161
  hidden: !active,
155
162
  "data-control-ui": "user-ask",
@@ -202,12 +209,13 @@ function UserAskOption({ value, recommended = false, disabled = false, className
202
209
  },
203
210
  children: /* @__PURE__ */ jsxs("button", {
204
211
  type: "button",
205
- role: "radio",
212
+ role: question.multiple ? "checkbox" : "radio",
206
213
  "aria-checked": selected,
207
214
  disabled,
208
215
  "data-control-ui": "user-ask",
209
216
  "data-control-family": "user-ask",
210
217
  "data-slot": "option",
218
+ "data-multiple": question.multiple ? "" : void 0,
211
219
  "data-selected": selected ? "" : void 0,
212
220
  "data-recommended": recommended ? "" : void 0,
213
221
  onClick: handleClick,
@@ -218,6 +226,7 @@ function UserAskOption({ value, recommended = false, disabled = false, className
218
226
  "data-control-ui": "user-ask",
219
227
  "data-control-family": "user-ask",
220
228
  "data-slot": "option-indicator",
229
+ "data-multiple": question.multiple ? "" : void 0,
221
230
  "data-selected": selected ? "" : void 0,
222
231
  className: "inline-flex shrink-0 items-center justify-center",
223
232
  children: selected ? /* @__PURE__ */ jsx(Check, { className: "size-3" }) : index + 1
@@ -285,12 +294,13 @@ function UserAskOptionInput({ label = "Other", placeholder = "Type your own answ
285
294
  }
286
295
  if (!selected) return /* @__PURE__ */ jsxs("button", {
287
296
  type: "button",
288
- role: "radio",
297
+ role: question.multiple ? "checkbox" : "radio",
289
298
  "aria-checked": false,
290
299
  disabled,
291
300
  "data-control-ui": "user-ask",
292
301
  "data-control-family": "user-ask",
293
302
  "data-slot": "option",
303
+ "data-multiple": question.multiple ? "" : void 0,
294
304
  "data-freeform": "",
295
305
  onClick: () => ask.select(question.id, key),
296
306
  className: cn(optionRowClasses, "disabled:cursor-not-allowed", className),
@@ -300,6 +310,7 @@ function UserAskOptionInput({ label = "Other", placeholder = "Type your own answ
300
310
  "data-control-ui": "user-ask",
301
311
  "data-control-family": "user-ask",
302
312
  "data-slot": "option-indicator",
313
+ "data-multiple": question.multiple ? "" : void 0,
303
314
  className: "inline-flex shrink-0 items-center justify-center",
304
315
  children: index + 1
305
316
  }), /* @__PURE__ */ jsx("span", {
@@ -314,11 +325,25 @@ function UserAskOptionInput({ label = "Other", placeholder = "Type your own answ
314
325
  "data-control-ui": "user-ask",
315
326
  "data-control-family": "user-ask",
316
327
  "data-slot": "option",
328
+ "data-multiple": question.multiple ? "" : void 0,
317
329
  "data-selected": "",
318
330
  "data-freeform": "",
319
331
  className: cn(optionRowClasses, className),
320
332
  style,
321
- children: [/* @__PURE__ */ jsx("span", {
333
+ children: [question.multiple ? /* @__PURE__ */ jsx("button", {
334
+ type: "button",
335
+ role: "checkbox",
336
+ "aria-checked": true,
337
+ "aria-label": `Clear ${label}`,
338
+ "data-control-ui": "user-ask",
339
+ "data-control-family": "user-ask",
340
+ "data-slot": "option-indicator",
341
+ "data-multiple": "",
342
+ "data-selected": "",
343
+ onClick: () => ask.select(question.id, key),
344
+ className: "inline-flex shrink-0 items-center justify-center",
345
+ children: /* @__PURE__ */ jsx(Check, { className: "size-3" })
346
+ }) : /* @__PURE__ */ jsx("span", {
322
347
  "aria-hidden": "true",
323
348
  "data-control-ui": "user-ask",
324
349
  "data-control-family": "user-ask",
package/package.json CHANGED
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "name": "@ctrl-ui/react",
3
- "version": "0.8.4",
3
+ "version": "0.8.6",
4
4
  "description": "Control UI components, blocks, and primitives with neutral defaults and consumer-owned themes.",
5
5
  "license": "MIT",
6
6
  "repository": {
7
7
  "type": "git",
8
- "url": "https://github.com/damien-schneider/control-ui.git",
8
+ "url": "git+https://github.com/damien-schneider/control-ui.git",
9
9
  "directory": "packages/components"
10
10
  },
11
11
  "homepage": "https://control-ui.dev",
@@ -50,6 +50,7 @@
50
50
  "prosemirror-view": "^1.42.3",
51
51
  "react": "^19.2.8",
52
52
  "react-day-picker": "^10.0.1",
53
+ "react-dom": "^19.2.8",
53
54
  "react-email": "^6.9.5",
54
55
  "react-phone-number-input": "^3.4.18",
55
56
  "react-resizable-panels": "^4.12.4",